From e8ffbd31518776de996b7bb1afd73bc85027ef3e Mon Sep 17 00:00:00 2001 From: Brady Bodily Date: Wed, 16 Dec 2020 04:50:21 -0700 Subject: [PATCH] Hex is done and working --- .../.idea/contentModel.xml | 12 +- .../.idea.RobotIntelFinal/.idea/workspace.xml | 38 +- ConsoleApp/ConsoleApp.csproj | 2 +- ConsoleApp/CoreModule.cs | 1 + ConsoleApp/{plot.py => HexPlot.py} | 8 +- ConsoleApp/ISimulationResults.cs | 19 + ConsoleApp/Maps/IMineMap.cs | 3 + ConsoleApp/Maps/MineMap.cs | 12 +- ConsoleApp/Output/Data.txt | 7 + ConsoleApp/Output/DetectedMines.txt | 7 - ConsoleApp/Output/HexDetectedMines.txt | 0 ConsoleApp/Output/HexPath.txt | 927 ++++++++++++++++++ ConsoleApp/Output/HexTest.png | Bin 0 -> 34618 bytes ConsoleApp/Output/Mines.txt | 8 - ConsoleApp/Output/SavedList.txt | 150 --- ConsoleApp/Output/test.png | Bin 31871 -> 0 bytes ConsoleApp/Program.cs | 26 +- ConsoleApp/SimRunner.cs | 81 +- ConsoleApp/SimulationResults.cs | 104 ++ 19 files changed, 1123 insertions(+), 282 deletions(-) rename ConsoleApp/{plot.py => HexPlot.py} (85%) create mode 100644 ConsoleApp/ISimulationResults.cs create mode 100644 ConsoleApp/Output/Data.txt delete mode 100644 ConsoleApp/Output/DetectedMines.txt create mode 100644 ConsoleApp/Output/HexDetectedMines.txt create mode 100644 ConsoleApp/Output/HexPath.txt create mode 100644 ConsoleApp/Output/HexTest.png delete mode 100644 ConsoleApp/Output/Mines.txt delete mode 100644 ConsoleApp/Output/SavedList.txt delete mode 100644 ConsoleApp/Output/test.png create mode 100644 ConsoleApp/SimulationResults.cs diff --git a/.idea/.idea.RobotIntelFinal/.idea/contentModel.xml b/.idea/.idea.RobotIntelFinal/.idea/contentModel.xml index 94ec944..8bae461 100644 --- a/.idea/.idea.RobotIntelFinal/.idea/contentModel.xml +++ b/.idea/.idea.RobotIntelFinal/.idea/contentModel.xml @@ -7,9 +7,11 @@ + + @@ -35,10 +37,10 @@ - - - - + + + + @@ -46,7 +48,6 @@ - @@ -56,6 +57,7 @@ + diff --git a/.idea/.idea.RobotIntelFinal/.idea/workspace.xml b/.idea/.idea.RobotIntelFinal/.idea/workspace.xml index 8de59d7..9ff8581 100644 --- a/.idea/.idea.RobotIntelFinal/.idea/workspace.xml +++ b/.idea/.idea.RobotIntelFinal/.idea/workspace.xml @@ -18,29 +18,21 @@ - + + - - - + - - - - - - + + + + - - - - - - + @@ -228,7 +222,7 @@ - + diff --git a/ConsoleApp/ConsoleApp.csproj b/ConsoleApp/ConsoleApp.csproj index 3bc0189..f73aec2 100644 --- a/ConsoleApp/ConsoleApp.csproj +++ b/ConsoleApp/ConsoleApp.csproj @@ -22,7 +22,7 @@ PreserveNewest - + PreserveNewest diff --git a/ConsoleApp/CoreModule.cs b/ConsoleApp/CoreModule.cs index e0e2585..0db5b04 100644 --- a/ConsoleApp/CoreModule.cs +++ b/ConsoleApp/CoreModule.cs @@ -15,6 +15,7 @@ namespace ConsoleApp container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); container.Register(Reuse.Singleton); + container.Register(Reuse.Singleton); } diff --git a/ConsoleApp/plot.py b/ConsoleApp/HexPlot.py similarity index 85% rename from ConsoleApp/plot.py rename to ConsoleApp/HexPlot.py index bf2fd78..a10fbe8 100644 --- a/ConsoleApp/plot.py +++ b/ConsoleApp/HexPlot.py @@ -10,7 +10,7 @@ if __name__ == "__main__": ym = [] xf = [] yf = [] - with open("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/SavedList.txt") as c: + with open("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/HexPath.txt") as c: for line in c: x, y = line.split() xc.append(int(x)) @@ -22,7 +22,7 @@ if __name__ == "__main__": xm.append(int(x)) ym.append(int(y)) - with open("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/DetectedMines.txt") as f: + with open("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/HexDetectedMines.txt") as f: for line in f: x, y = line.split() xf.append(int(x)) @@ -32,8 +32,8 @@ if __name__ == "__main__": plt.plot(xc, yc, 'o', label='vehicle', color='blue') plt.plot(xm, ym, 'o', label='all mines', color='red') plt.plot(xf, yf, 'o', label='detected mines', color='orange') - plt.title('test 9') + plt.title('Hex Simulation') plt.legend(loc='lower left', fontsize='xx-small') - matplotlib.pyplot.savefig('/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/test.png') + matplotlib.pyplot.savefig('/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/HexTest.png') plt.close(fig) \ No newline at end of file diff --git a/ConsoleApp/ISimulationResults.cs b/ConsoleApp/ISimulationResults.cs new file mode 100644 index 0000000..e8f930a --- /dev/null +++ b/ConsoleApp/ISimulationResults.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using ConsoleApp.Maps; +using HexCore; + +namespace ConsoleApp +{ + public interface ISimulationResults + { + void WriteResults(); + int HexTotalMoves { get; set; } + int HexBombsFound { get; set; } + int TotalBombs { get; set; } + List HexPath { get; set; } + List HexMappedBombs { get; set; } + List Mines { get; set; } + int HexClearedCells { get; set; } + int HexUnClearedCells { get; set; } + } +} \ No newline at end of file diff --git a/ConsoleApp/Maps/IMineMap.cs b/ConsoleApp/Maps/IMineMap.cs index 5e66fff..5a13a56 100644 --- a/ConsoleApp/Maps/IMineMap.cs +++ b/ConsoleApp/Maps/IMineMap.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace ConsoleApp.Maps { public interface IMineMap @@ -6,5 +8,6 @@ namespace ConsoleApp.Maps int TotalBombs { get; } bool GetCell(int x, int y); + List PlacedMines { get; } } } \ No newline at end of file diff --git a/ConsoleApp/Maps/MineMap.cs b/ConsoleApp/Maps/MineMap.cs index c157a45..7b0fa6d 100644 --- a/ConsoleApp/Maps/MineMap.cs +++ b/ConsoleApp/Maps/MineMap.cs @@ -12,23 +12,19 @@ namespace ConsoleApp.Maps private int _y; public bool[,] Map { get; } public int TotalBombs { get; } - private List _placedMines; + public List PlacedMines { get; } public MineMap(int x, int y, double minePercentage) { _x = x; _y = y; - _placedMines = new List(); + PlacedMines = new List(); _mineCount = (int)(x*y*(minePercentage/100)); TotalBombs = _mineCount; Map = new bool[x, y]; Map.Fill2DArray(false); PlaceMines(); - using(TextWriter tw = new StreamWriter("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/Mines.txt")) - { - foreach (var s in _placedMines) - tw.WriteLine($"{s.X} {s.Y}"); - } + } public bool GetCell(int x, int y) => Map[x,y]; @@ -47,7 +43,7 @@ namespace ConsoleApp.Maps else { Map[x, y] = true; - _placedMines.Add(new Cell(x,y)); + PlacedMines.Add(new Cell(x,y)); } } } diff --git a/ConsoleApp/Output/Data.txt b/ConsoleApp/Output/Data.txt new file mode 100644 index 0000000..a3ad04a --- /dev/null +++ b/ConsoleApp/Output/Data.txt @@ -0,0 +1,7 @@ +General: + Total Mines: 23 +Hex: + Total Moves: 927 + Bombs Found: 23 + Cleared Cell Count: 2295 + Uncleared Cell Count: 9 diff --git a/ConsoleApp/Output/DetectedMines.txt b/ConsoleApp/Output/DetectedMines.txt deleted file mode 100644 index cc278b8..0000000 --- a/ConsoleApp/Output/DetectedMines.txt +++ /dev/null @@ -1,7 +0,0 @@ -8 5 -8 6 -5 11 -9 10 -13 9 -13 14 -10 13 diff --git a/ConsoleApp/Output/HexDetectedMines.txt b/ConsoleApp/Output/HexDetectedMines.txt new file mode 100644 index 0000000..e69de29 diff --git a/ConsoleApp/Output/HexPath.txt b/ConsoleApp/Output/HexPath.txt new file mode 100644 index 0000000..032288e --- /dev/null +++ b/ConsoleApp/Output/HexPath.txt @@ -0,0 +1,927 @@ +0 0 +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +7 0 +8 0 +9 0 +10 0 +11 0 +12 0 +13 0 +14 0 +15 0 +16 0 +17 0 +18 0 +19 0 +20 0 +21 0 +22 0 +23 0 +24 0 +25 0 +26 0 +27 0 +28 0 +29 0 +30 0 +31 0 +32 0 +33 0 +34 0 +35 0 +36 0 +37 0 +38 0 +39 0 +40 0 +41 0 +42 0 +43 0 +44 0 +45 0 +46 0 +47 0 +47 1 +47 2 +47 3 +46 3 +45 3 +44 3 +43 3 +42 3 +41 3 +40 3 +39 3 +38 3 +37 3 +36 3 +35 3 +34 3 +33 3 +32 3 +31 3 +30 3 +29 3 +28 3 +27 3 +26 3 +25 3 +24 3 +23 3 +22 3 +21 3 +20 3 +19 3 +18 3 +17 3 +16 3 +15 3 +14 3 +13 3 +12 3 +11 3 +10 3 +9 3 +8 3 +7 3 +6 3 +5 3 +4 3 +3 3 +2 3 +1 3 +0 3 +1 4 +0 5 +0 6 +1 6 +2 6 +3 6 +4 6 +5 6 +6 6 +7 6 +6 5 +7 4 +8 4 +9 4 +10 4 +10 5 +11 6 +12 6 +13 6 +14 6 +15 6 +16 6 +17 6 +18 6 +19 6 +20 6 +21 6 +20 5 +21 4 +22 4 +23 4 +24 4 +24 5 +25 6 +26 6 +27 6 +28 6 +29 6 +30 6 +31 6 +32 6 +33 6 +34 6 +35 6 +36 6 +37 6 +38 6 +39 6 +40 6 +41 6 +42 6 +43 6 +44 6 +45 6 +46 6 +47 6 +47 7 +47 8 +47 9 +46 9 +45 9 +44 9 +43 9 +42 9 +41 9 +40 9 +39 9 +38 9 +37 9 +36 9 +35 9 +34 9 +33 9 +32 9 +31 9 +30 9 +29 9 +28 9 +27 9 +27 8 +26 8 +25 8 +24 9 +24 9 +24 10 +23 10 +23 11 +23 12 +22 12 +21 12 +20 12 +19 11 +19 10 +18 9 +17 9 +16 9 +15 9 +14 9 +13 9 +12 9 +12 9 +13 10 +12 11 +12 12 +13 12 +13 13 +13 14 +12 15 +12 16 +11 16 +10 16 +9 16 +8 15 +8 14 +7 13 +7 12 +6 11 +6 10 +5 9 +4 9 +3 9 +2 9 +1 9 +0 9 +1 10 +0 11 +0 12 +1 12 +2 12 +3 12 +4 12 +5 12 +6 12 +7 12 +8 12 +8 12 +7 13 +8 14 +8 15 +9 16 +10 16 +11 16 +12 16 +12 15 +13 14 +13 13 +13 12 +14 12 +15 12 +16 12 +17 12 +18 12 +19 12 +20 12 +21 12 +22 12 +22 12 +21 13 +21 14 +20 13 +19 13 +19 14 +18 15 +18 16 +18 17 +19 18 +19 19 +20 19 +21 19 +22 19 +23 18 +23 17 +23 18 +23 19 +24 19 +25 19 +26 19 +27 18 +27 17 +28 16 +28 15 +29 14 +29 13 +30 12 +31 12 +32 12 +33 12 +34 12 +35 12 +36 12 +37 12 +38 12 +39 12 +40 12 +41 12 +42 12 +43 12 +44 12 +45 12 +46 12 +47 12 +47 13 +47 14 +47 15 +46 15 +45 15 +44 15 +43 15 +42 15 +41 15 +41 14 +40 14 +39 14 +38 15 +37 15 +36 15 +35 15 +34 15 +33 15 +32 15 +31 15 +30 15 +29 15 +28 15 +27 15 +27 15 +28 16 +27 17 +27 18 +26 19 +25 19 +24 19 +23 19 +22 19 +21 19 +20 19 +19 19 +19 18 +18 17 +18 16 +18 15 +17 15 +16 15 +15 15 +14 15 +13 15 +12 15 +12 15 +12 16 +11 16 +10 16 +9 16 +8 15 +7 15 +6 15 +5 15 +4 15 +3 15 +2 15 +1 15 +0 15 +1 16 +0 17 +0 18 +1 18 +2 18 +3 18 +4 18 +5 18 +6 18 +5 17 +6 16 +7 16 +8 16 +9 16 +9 17 +10 16 +11 16 +12 16 +12 17 +13 18 +14 18 +15 18 +16 18 +17 18 +18 18 +19 18 +19 18 +19 19 +20 19 +21 19 +22 19 +23 18 +23 18 +23 19 +24 19 +25 19 +26 19 +27 18 +28 18 +29 18 +30 18 +31 18 +32 18 +33 18 +34 18 +35 18 +36 18 +37 18 +38 18 +38 18 +38 19 +39 20 +40 20 +41 20 +42 20 +42 19 +43 18 +44 18 +45 18 +46 18 +47 18 +47 19 +47 20 +47 21 +46 21 +45 21 +44 21 +43 21 +42 21 +41 21 +40 21 +39 21 +38 21 +37 21 +36 21 +36 20 +35 20 +34 20 +33 21 +32 21 +31 21 +30 21 +29 21 +28 21 +27 21 +26 21 +25 21 +24 21 +23 21 +22 21 +21 21 +20 21 +19 21 +18 21 +17 21 +16 21 +15 21 +14 21 +13 21 +12 21 +12 21 +12 22 +11 22 +10 22 +9 22 +8 22 +7 22 +6 22 +5 21 +4 21 +3 21 +2 21 +1 21 +0 21 +1 22 +0 23 +0 24 +1 24 +2 24 +3 24 +4 24 +5 24 +6 24 +7 24 +6 23 +7 22 +8 22 +9 22 +10 22 +10 23 +11 24 +12 24 +13 24 +14 24 +15 24 +16 24 +17 24 +18 24 +19 24 +20 24 +21 24 +22 24 +23 24 +24 24 +25 24 +26 24 +27 24 +28 24 +29 24 +30 24 +31 24 +32 24 +31 24 +30 25 +30 26 +30 27 +31 28 +31 29 +32 29 +33 29 +34 29 +35 28 +35 27 +36 26 +37 26 +37 25 +38 24 +39 24 +40 24 +41 24 +42 24 +43 24 +44 24 +45 24 +46 24 +47 24 +47 25 +47 26 +47 27 +46 27 +45 27 +44 27 +43 27 +42 27 +41 27 +40 27 +39 27 +38 27 +37 27 +36 27 +35 27 +35 27 +35 28 +34 29 +33 29 +32 29 +31 29 +31 28 +30 27 +29 27 +28 27 +27 27 +26 27 +25 27 +24 27 +23 27 +22 27 +21 27 +20 27 +19 27 +18 27 +17 27 +16 27 +15 27 +14 27 +13 27 +12 27 +11 27 +12 27 +13 28 +12 29 +12 30 +11 31 +10 31 +9 31 +8 31 +8 30 +7 29 +7 28 +6 27 +5 27 +4 27 +3 27 +2 27 +1 27 +0 27 +1 28 +0 29 +0 30 +1 30 +2 30 +3 30 +4 30 +5 30 +5 29 +6 29 +7 29 +8 30 +8 30 +8 31 +9 31 +10 31 +11 31 +12 30 +13 30 +14 30 +15 30 +16 30 +17 30 +18 30 +18 30 +17 31 +18 32 +18 33 +19 33 +20 33 +21 33 +22 32 +22 31 +23 30 +24 30 +25 30 +26 30 +27 30 +28 30 +29 30 +30 30 +31 30 +32 30 +33 30 +34 30 +35 30 +36 30 +37 30 +38 30 +39 30 +40 30 +41 30 +42 30 +43 30 +44 30 +45 30 +46 30 +47 30 +47 31 +47 32 +47 33 +46 33 +45 33 +44 33 +43 33 +42 33 +41 33 +40 33 +39 33 +40 32 +39 31 +38 31 +37 31 +36 31 +36 32 +35 33 +34 33 +33 33 +32 33 +31 33 +30 33 +29 33 +28 33 +27 33 +26 33 +25 33 +24 33 +23 33 +22 33 +21 33 +20 33 +19 33 +18 33 +17 33 +16 33 +15 33 +14 33 +13 33 +12 33 +11 33 +10 33 +9 33 +8 33 +8 33 +8 34 +7 35 +6 35 +5 35 +4 35 +4 34 +3 33 +2 33 +1 33 +0 33 +1 34 +0 35 +0 36 +1 36 +2 36 +3 36 +4 36 +5 36 +6 36 +7 36 +8 36 +9 36 +10 36 +11 36 +12 36 +13 36 +14 36 +15 36 +16 36 +17 36 +18 36 +18 35 +19 35 +19 34 +19 33 +20 33 +21 33 +22 33 +23 34 +23 35 +24 36 +25 36 +26 36 +27 36 +28 36 +29 36 +29 35 +30 35 +31 35 +32 36 +33 36 +34 36 +35 36 +36 36 +36 36 +36 37 +37 37 +38 37 +39 37 +40 36 +41 36 +42 36 +43 36 +44 36 +45 36 +46 36 +47 36 +47 37 +47 38 +47 39 +46 39 +45 39 +44 39 +43 39 +42 39 +41 39 +40 39 +39 39 +38 39 +38 39 +38 39 +38 40 +37 41 +37 42 +36 42 +35 42 +34 42 +33 41 +33 40 +32 39 +32 39 +32 40 +31 41 +30 41 +29 41 +28 41 +28 40 +27 39 +26 39 +25 39 +24 39 +23 39 +22 39 +21 39 +21 39 +21 40 +20 41 +19 41 +18 41 +17 41 +17 40 +16 39 +15 39 +14 39 +13 39 +12 39 +11 39 +10 39 +9 39 +8 39 +7 39 +6 39 +5 39 +4 39 +3 39 +2 39 +1 39 +0 39 +1 40 +0 41 +0 42 +1 42 +2 42 +3 42 +4 42 +5 42 +6 42 +7 42 +8 42 +9 42 +10 42 +11 42 +12 42 +13 42 +14 42 +15 42 +16 42 +17 42 +18 42 +19 42 +20 42 +21 42 +22 42 +23 42 +24 42 +25 42 +26 42 +27 42 +28 42 +29 42 +30 42 +31 42 +32 42 +33 42 +34 42 +35 42 +36 42 +37 42 +38 42 +39 42 +40 42 +41 42 +42 42 +43 42 +44 42 +45 42 +46 42 +47 42 +47 43 +47 44 +47 45 +46 45 +45 45 +44 45 +43 45 +42 45 +41 45 +40 45 +39 45 +38 45 +37 45 +36 45 +35 45 +34 45 +33 45 +32 45 +31 45 +30 45 +29 45 +28 45 +27 45 +26 45 +25 45 +24 45 +23 45 +22 45 +21 45 +20 45 +19 45 +18 45 +17 45 +16 45 +15 45 +14 45 +13 45 +12 45 +11 45 +10 45 +9 45 +8 45 +7 45 +6 45 +5 45 +4 45 +3 45 +2 45 +1 45 +0 45 diff --git a/ConsoleApp/Output/HexTest.png b/ConsoleApp/Output/HexTest.png new file mode 100644 index 0000000000000000000000000000000000000000..0dccbf7c90fc24b519017559dd6975d6d5535028 GIT binary patch literal 34618 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

b?I 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 H)${y6q(r+h literal 0 HcmV?d00001 diff --git a/ConsoleApp/Output/Mines.txt b/ConsoleApp/Output/Mines.txt deleted file mode 100644 index a2cd0e2..0000000 --- a/ConsoleApp/Output/Mines.txt +++ /dev/null @@ -1,8 +0,0 @@ -5 11 -8 6 -13 14 -9 10 -13 9 -10 13 -10 6 -8 5 diff --git a/ConsoleApp/Output/SavedList.txt b/ConsoleApp/Output/SavedList.txt deleted file mode 100644 index 1c83a93..0000000 --- a/ConsoleApp/Output/SavedList.txt +++ /dev/null @@ -1,150 +0,0 @@ -0 0 -1 0 -2 0 -3 0 -4 0 -5 0 -6 0 -7 0 -8 0 -9 0 -10 0 -11 0 -12 0 -13 0 -14 0 -15 0 -16 0 -17 0 -18 0 -19 0 -19 1 -19 2 -19 3 -18 3 -17 3 -16 3 -15 3 -14 3 -13 3 -12 3 -11 3 -10 3 -9 3 -9 2 -8 2 -7 2 -6 3 -5 3 -4 3 -3 3 -2 3 -1 3 -0 3 -1 4 -0 5 -0 6 -1 6 -2 6 -3 6 -4 6 -5 6 -6 6 -5 7 -6 8 -6 9 -7 9 -14 6 -15 6 -16 6 -17 6 -18 6 -19 6 -19 7 -19 8 -19 9 -18 9 -17 9 -16 9 -15 9 -16 10 -15 11 -15 12 -14 12 -15 12 -15 13 -16 14 -15 15 -15 16 -14 17 -13 17 -12 17 -11 17 -11 16 -10 15 -10 16 -9 16 -8 15 -8 14 -7 13 -6 14 -5 14 -4 14 -3 13 -3 12 -2 11 -3 10 -3 9 -1 9 -0 9 -1 10 -0 11 -0 12 -1 12 -2 12 -3 12 -3 13 -4 14 -4 15 -5 16 -5 17 -6 17 -7 17 -8 17 -9 17 -10 17 -11 17 -12 17 -13 17 -14 17 -15 16 -15 15 -16 14 -15 13 -15 12 -17 12 -18 12 -19 12 -19 13 -19 14 -19 15 -18 15 -17 15 -16 15 -15 15 -15 16 -14 17 -13 17 -12 17 -11 17 -11 16 -10 16 -9 16 -8 15 -6 15 -5 15 -4 15 -3 15 -2 15 -1 15 -0 15 diff --git a/ConsoleApp/Output/test.png b/ConsoleApp/Output/test.png deleted file mode 100644 index 5b5e68aec8ddebfb3b32271779f504a43ce6c8b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31871 zcmd?RgyDvI)Nq0Ahw9*aIARtJ0Bi)^%(y4^Bg3{gHol19uNDfHXUE^=>ea}7T z-oN0EA4O)~cfD&ptDbMHiBMCK!$c=Thd>~h3i8tG5D0uQ1Om5)iVWW2{kgOSeh9kD z=(uY*S-E?ex>`bBnYugMJGtAxHKXygbai{{>V*J*I3eg6D8!M*Tt+bstjJ$;O0c5?E^ z{Omw7OfsI}urL%MucPP~a{gztl5}+VusCThwg-t5vFllApqXfC5m9-s!P&30kdBMp zvWeZDyqqf1#K@J4>-&gFPH@PKo4}n>x(r80=XW-5oxQ%%8#UMH#(Z;mj1BQVYTTX3 zmBVhi+K3_%bY(CwG%Q_GqI0!aLXej(s&!tM8p#wUhDsPT2_limu(h>i zvfSix)6V_&SDx!_t=F;9)z#JSPvQ_~SJ$rJKXVh((jrCuE>e$Q(a;saAAv?rlX06N zK3wlo`(G}5U0rR)y>1T-fCR_IVMEq3y;eHOomxVE=E|85eP(I!JR}pl|EnQ#wH6v4 z8!LObQ2SaWC~@YvvJmFRrUe$*yBT&(X0g9Znb zxzg&Ft6Ob#we?B0!hKI2A~BlAI|{{%2rr6ugG3B)?70icC%#_|yu~Do*~#ixVlt%; z_>0T*D(!u#e*H$A_(KNsQN8j^Ff5PZJt8drq&eR+^(gOx8L=nEL7Ho-;m&EG$>6 zR4+U#symropUYu^r{(W2rMX%=Vym%?h}XHYUuB|*o<4il1qL5RjBIE>bJV@q=W>7jNdW(Xt_CMv3#af-+Zdzwar`w?Z(DNh3)jSsZxF7V(oIRJ5gG?qG$%i zM;<0R^)H|#a`3LKq9VGx5GA-22M-Tkq73-~Oc-2BN=yhU7FJ&{9KuN#24@aln@LIds% z>G+I{=(RNyJFif%YZTFNbK^=%O3oa8)Z~II`KVWG3m30V!^z3XdifE29-WYs^Z{Ib z@419qNC$U!HZBhBM4?`rt2CEaQ0N4GghNGD7Sz(xU4GpDD7G_}slQ{6LCn$fO(yC| za;^P5-tJiDizegVpxNQ!C|HXUh6GOkvTIUYjSUV;hG9`wnDs_Jr&d)^;BF|@twv5{ zScmpgmvcF$^Eo`px|}r*V)+>W+vd{0MT!Q${P?6Zp7!NXz|#2m_}T;L;-BTl;yhqQ z>}nVr8@m)qf$fAVg=W|}EWdvJIvM6{H#yxJOsZ>jUWW&-i97}TXlijPG&D4#-?Xss zdi=W<6ch%UZrT%$OIWwR(keVtW*7w;N5{yB6h*`?l`R(F{Aa4rmHETY?k>H!xN(p; zE9-Dc05dGch|Nln*%IAQ=w^TS@^WjJCnGjXz0)eyaB zIN+g$F@}`zE6rYcYqI}QJ&0Q(9%m{l1db1*= z{pJrVY}=p|a_72koS&Z$kBRxv-X7HGu(Y)FH{XA~&=|B{zVuB3#LC*5o{0&Wo0}UF z+|VG<)6+vj;9y~CX}Z}Lvwd_=&Se5g<}@yAfBdDyX*!-I8Xgzd50*mcoOzrinB_|i zE|G0Su&CQ<^ip(yh4Pzmd*IEj+s+6aL^(qM*KW293F7~Fe~BaYIlZH|uW#e#eE;TF zyUd`o!DTZ(D+`O7np)(f13|$1gvQ_B|Fa+M)u#S}Og|*U!O|nQ!|J>v0lsq;$Nf^L#BWEjt$%$-jL0!iM_w`P*6vc~s|Z z#rZfTJRAbVo?gwv_^)Z3#f`_w;X${2YkRsr%}WN8*gnrl7pXQr-EUs#GlErp%Jz8W z6dzGyMLQuCHCoplPO`N6Rcz3<@+*VJUj|9g=_N0vp4C<+REcf3MDo9}FI&ULQwfCc z<7Oaatayvb8{?T6p9}8kzu|$|&hnJ8x53lTtm<_x&HUDtpf&s(a^ul}dg;3w3`yBq z)+XJ_t+_t2{AZO8EDs+rG|^SJaA3C;yqi=cOXZm$W*7EJr+D-a78bk97Wz-!A6L)H z!XwLDGTkUAFFAx}2az{eSDST`=IRLAeXfOVA}FYKAzBE#IBJ%WyAh0xgJFnDFJ?t} zc>Df^JKGIXjBmUY!RdlUlN7P&l$3#*CSS@!W-|Z$`Z3YsN(XxXU8y*5On~=4-Lu+_ zfQrG|rhRezx1yqmQSD>pu-5e4OdMysHr42_le;*%q6?I8iV%;e_~{tSEsK(>F+yUB zl7q(IQ+WTH>VNIdEF`1i_U+>AZxW?3vq;+aa9PgBl6KsrzC(Uh1P%7356V9#Y(pH! z`)SrAJHA!EIyoS5(lm^Drww0ebXSJqwXvl7O3l5Ri3$6BJxStOM0Qq66v{*OV$Sk) zJxcfJd^9zBAzA%u27(T|LCC-xgp`BM-s1VIKt1fgHtORG%d|a$JEdJ#Tw16%GB zmdSsOQ3tgyjhpBWu(s2btJ!_0!qp{)?G&!4k{%*1&`et7VZGK$OyY8_!$<~c+ddc= zppez=rG+&lPELnHDi)R&;0k73U4Gnvj!E9!p7A}#C>T@MnZ<>({acd-^WtQ^I{q*> z|2~$>Z13B^aU}sDf=#*@$XRg_q`3>+?YjC|?Hkvwg$chb*Ik>2TN4S9nw&Y;p484j@; zg)cK`Y-W3ks#EubguBc4-WBm|2Tm!ugJylkCRord_;OWS?hadwAUK{NLba-@jN;cp zPxoBo=yq0}si}lT-UlJs$hC`fKS%@tF)my*#oN?7I0^N{77@BGp?`%9&VFQXt=BA0 zN*PbjkG*<&{$kkxx>xqAmsXqKt8>g@tYLQ)rNV<1hsv?B4VNXv4^kY`PE+t)j~xfk z)#+4QIdMxg#Kq;*i1K;%JNS;tvz4t9h8X05Q6vLHN=~sPrh7mrm%c;8*F#3qUEK=j?-;)uaEMy zpkoL=Cz`EzTC~jRY%UO5P8F#8n`ftFZJ;NZ`fhi`5NvwxlimsqdJ}V`)>9_1o59QH z(F6sZ)zNSAI@lUCn__#LI_vcMoeotU))Dhjl(#Hb$K7lUvedqcZ6BLPq9(^(otstY zvjgk#Cidn6ZXw}+FA1I*ZIQICEoz^)KUVGFxnSkE{_qcYV*KjJJ>R$Pz{j9YNRCrf zn0j)C>SYgxD8asX((#4Eb#>{JT}Tme{b~t3llprcc;lni_iy*(a#S8CArOVz-NwRln$a#6(6Bq6@eSW`qcZ9C{IdDuRA*n% zIXn$@nPHQN#+p2Kd(sk9o^oTOM-p-kW^3 zje?t>n1#L?4IFTK+i>bqfM4;h z;bl5cyd=TLWr;wedCiMTdope8;=MatjRXICrGZ0B+~;zFl0~ix4mV=M@!Bfru~h?b)-Zzt+zOK3zd=pkJF!*vM9r z!;aW!z@rUUR!l1nx`bb@eS6*S*M4SCW^~0tCWxfRQ?wgV&g3amjm%rR%ueS@114P& z?2hqL@z`#tYi0lbOa0Bg6%lu9w0?X?GwBGkILDa%jecuCy-K-0e5tiFanAKt2TNi< z99&&kVvkQs(d6dVm#^wB^)yP9?VEdLe@iDjx9F5>FV%E{abB;TzKZE&rdb?w({L}9 z?Yy0W^aWV96VMci{072~j^wJ5*)A&Hv+T#3_0Qw=QfV~jYHN59_!*3k^}8`fimv#B z*j3GihL?ncyKuKy{d(4ySI15#GCvfy&TSgl5;2vFM&>Vcm)zyivdh(p=?9~bw>5e+&(N=qgs)d4 zIryBEDyOO1b0pe0j?c!2ABhMC&;~vkQ+4&3Yp*fDVSKFZYmTceRzJ<(xs-it*?QT} zvC1R=(8OOB1$M3li_`pRcpo$mmrW;QX&E>f8TjnOh~6ouIJ$g^sH|6iXkBHUn1Y_= zu|s}6+QigQH<|7zuU$C2=+nAR&Dn7vgu{7uvR~dFIcwzi3g9VJh#3I<$Z@I}0e>@=L^9JO(1wkuj_Uq>$V9YDsP{Kg2L#A<`T3a~L|ebJ;h zw|b>oh=_>cfIuLp>|SD>0ENpZHdt3AFkEY8CK(UT*~W=`9kse_r>j7OaHsf<4CIHa z2HW)M+7h4n9k(_a65Mhc)qC;}dtA11W-<)iXJ4zN0faeo#H1OLahH?{(c(vYa|;Wu zCO1>CRKby6MJ_AF;Q&s#h|#jXGO6Dj2JCnxCf!Ta{G{&l%g>vMAg0)mdo zNqhkDo`=71*^sudurS%5DV06%&6vfTvJHvHSsO~KqE2CedxV69GM|3^nM&2{=f|JN zpaeN86)I7&ukGi23Q4;1_L;ZLB`XR9f{awM%XM62<-H|5dV^Ik+!QfA+lIC!SiTj|_V zh3l(`TwQ;;*gX3q>fe_)XG@L$IojCA{zTYP)-wSTODU}N_~?1K@HOD}!Uj-5-@bk0 zGU9;0mtU% zgh%p(q_>&8b(Hh57{t+b`J)Ac(79-6Ow8!<=Px?9BsGO zA7pbInaAFv;rE=ZcMr#WNl9S_VD7vg@SN47v~#V^Esbg)>zA7ySnC!xgYGI_D#ah> zE^Ztnt`ya8TD8;CRzX)qllBGFG5$y(e+9ZItzMH6WE>T7bn(CN@bNz|D42mEvt740 zQ<|PC==S5GO{U(P{{f_FXlda9_D&V{ z;=rO32?w0j!BQi>si~>WObID6CRtt_H;6QwahpL<&{&2b;DtFW9G8VMME!`yMK38_ zU0qN9PO9qPY{SJf*Kp`FJ+}Xy{u+7AX{c8lQLfmh<>#-hZ8DY-xj6DA^cgX2!FB8F zwEwB9h)8fn#VHk`Yr552Z|6ZQR9fZ8(hF|M(Zy%adKX9wxIK?o*lB|HpEv@Fkf5=# zabrD!B164xt!XBS$P-FgAbu^(*J$ZNGd|*_{85d+B!fC!0)A z>=1xuY>wN6X%w&t1$s-$89N8(nFwYy`|F};gW{y(40Ux#P*9F4_1XOf0N@Lo!~~G; zY^BbJRR8xY$04t>Z_+%DKc%gbeV83d7_j^)?MG8@zri<&!(R=#T!&WHi zwZ|fuPdfgQ1M}G*#54OA?xCsk<)lVrQ@<9LU7l9A$H`hKKR2TGrT+2vt=Zubj^>}z z$IQ;O0GFHF?CAaX>y+>%bM&{TzFP_<;;F&&2WSSDChl8kSVfp))zkrWO)-5)cqB4>9KCFmsUFYA6zRSBbzM`sdmDg zS#8hCjO#lKlJN{oAoP=Y1J+frS50rN7fCK{$W7!uEVC}v7@i0}C^TF48sR3z{bSTf z0gr6R`N3=mA?AFT>fuV&K1QL+tUP?^U+DwUMnN^aVt#)dT?R^y&AG(i_0n4C!{80UDNdKyL6t5%iNfMXO<;UuUU0l$+#!ojfEMi{91t5x zXEt7~7IE9va*~J*hsef$=6q|E=x)8VT2ts7n)VBtl(*BS!N@m;fPUm(nTI#*;dRtJ z<}tuP1I~U}M8&Vm-YbO_;r0GI;ZL6$-&(dZ;u#$!9XJ^!@PW?=&8O5*)XPhvz&!d*-+R4_F?U`r~Yo|K3)edLBnR z#ZFA@MD||tx9&&2s8g+*^D2^V{UOnma7dvnACA?R5!^jjIhf_FT)~!w{E9RWShl^FDIBFY?{^|Mhs*P|e!mrI^QDe8 z;#7#U!2ol#IR)B~8 zwV^cUDS&T&Gt*x+-)TjO-*9gQ599x)EW6UWug9`ZT6N0?#tV_LcR|`s7??UTr~<`|3L`*2wD1~6A;-@)bgfjw~~yXB(~F+W4fnqVM8)9 z7+QD=7?WcTQMIj^4+PRbCKO+64!yFBdI^ecq4L3VaumfZRWXs?m9S4;$Q-1eudOL* z@k?x<^P)CAmE!}@alW>={&b>bO2Qv-gjngp?>(OMU{CsX^Xf=MLzFcW2W$g+_a3aWdVDYr_$j`jv9h+nW(NgB(d57v7scXHxGZ%vmo6 z>JX z#8#l#V#^-5*@unq=Zfcbgz7YsB4578(Ww`wdVJVs16_PeKHd2zzbQv-S2Tgryb`4_ z$($O4zFFPi;Pvxs;nM{PrXWIR*Tj>JZpNsWWoBDN_wp^KdM@%`wZdlUR87}26<7O( zQP$fvnqOSgH}{!gtG{3hwjkCycr9v5i2&WK7CrB!U1yEv#A^Ja5sYR`+4u1!h}j)& z>B)M*1=|HpvnS0=#hkesIgwv{(+Lh&p`tFcN{m8N$j@xbiTb_SUns`n%cGI4Z}MY1 zYoU`PE2&jSPgR($*CRNw)|YV)xvG?Kf~!<#C{nUw2KQsvTzxrg8*D4w?U_ZU7G{Ua zd(bKFEc!1>O1O82?}?!gb!Rtxk63o0`Mw`@%0GF^7b9_G7lmZJfNS`@3Fjc5MX|Ev zP50Y&ErNmFZbigo5YNZtDU%@DRMR8gpTEK=5bv{}Gu|Ho!;z@3mdA+&7i>*!|8A$T z^d#t!d0jEW%#>Q3eTn*xTqWicuFfKY@vA24(mRS1zX}&BX9qO3=AOteUlYnb_9aq; ztK}?X1mh7~npP;?=&b+B_OC5y?Pa(AW0T)?dgBu?7&Ffqq`cd_NJlfNbw;Yn@Hq>{ z7JIsn>vMko#}lnNuq2ctMqqWE!d)ojyYNFNb2A6sWeatgjAz@K{9w2Kso$#kAD=rX z1@r!l<9Zh=HD~Kyw(FVSM@wE6b}I|`=6x9rhMfiap?hg%Ls`$hP1=0&<{$~B9*Ru;l4SYenlaD;uQk z1hJ*ovYl55qDy9C%Yltj{G^{^AIKT;INhQ_j0%Y@%v>C0H({ZT_g1*5g&jjlgqS@L z8p-0M3fJ%7eYXVuSRm#6PDU9TbB0KCC9&dN9MxKs+xL_uotmzmu8=Vg#2s%$7V=TJ zm6!u%>XW#{3TtXAYCnY&K?h>Iy^(#1&td{pU43M6tSpbbv5Ryu)*czuV9nbcxQqsO z0AUP>W)T>BT+MnOZLl8gAjcPK9_!)UQpq+3SAsl7TM<39ySX;zPvI;U`-O0PP(iWD zOP$YTMNqIvLj+|)N&iCi?HJq}_E^Cg(?RIRMJM1)A$0aY+8JSi=|V|@ZUQ*0lDP@0 zt&pYCE>;)ENi=9CmpFv+5@>-HGIZ5Lj> zkXI`=A*Fr%g~L;;9@Oh83_$V@hrS!}Qbe96J8$zZN-0s-&tt<>h0AsAHOFEAUMcg~ zDuERpENnP!1TR|sl_lzjKJ9Efwa>2+oJ0xV?M+^@E~yVS;h_datah@7%$0uRynlD_ z8z)wf=*KktCnDpny6!I|ll5ZBqgZ_V-rXSizkvL2>=-@$c^n}T(FQPx$O7|)TCOZ6 zpkhqA-lG9|zKm<9>jMU@LSkpBX0aA}J6;ioHE~C=oyZ?Ccd}}0H<~&iG@xQ4^~HR8 zv^>>*7sbkD!*|k?f7-76aPaZdi+&2b37cS92RF4`kLPI~4Wm$5xFUIoo2%=@*Ow?I zI+Yt){jP3qE_YWhEzmx4fxtTfAmlnf-1$7A7Hj#{;IL35si+wFaPhxr>l^lmSS02H z@w6n*E#$w%`S|&n-(DOd4+D`n7GOd^?7?A@^Re-lRad_NMxc=eZJ0Q$pARJYAAk{i z&!A8MEF>QeISd+tf!6>C@`#)LadJ{pQXdY_&dz{|z|xr>+@VemwDPml)05L-PII6# z6RI2>{FmD9uvlk0U8D)z6)$0GJHYm?+0{S}2i~21r_Rn!#TG=^GiByA;dOL$!hvt; zC29x=pyr$>tlqq~1Pk>}alo*&4%#InD~lX>2km#wei8KGZ((Ki$0;HrVkZy{pegA{ zplM5(6EFv*a2ofO88$0(?1O*#^lEHEqKG+@7yCv>F&!Nprw^aO3<8?-y;L0=TgRZ! zfaw9{&vdc1YxKc^eNSIsS2i&z%yK83ABo5%EKCmM_V9=ZI7m-#FD+2tfyv-08(R z?oWZHAI_#o7#18yB^n9rMtjG=8JN%)fzNEV-u2;XFFzXsp%nJy@m>MG7hE#niG(p$ zFb`CmVWTS&Q2bv4uMQC5fgF#$2E0TkQ0VK6UJ}VcR*t6uyeQu{i3#C#<+iF%InNQs zhg7%L2&gB~ga1oScu^gKEd~)086h@Su%$Y#)mu9)BpVRK4~`O}nz+~;+#OX>OR}`G zLWj`3crj_u&HukqqU^XZN|b>)Q_>$02rAOCa(mp&Y|5w|&LePJ+jT0Vo2|bBh^4+9 z)-M4639?(cL^?m192;4kvWZ*z9$JBn=K6FGOO3tU$CS}$@87b=(BS}dGvuY0o8YBki(9m#<{as#D?5mT$gDuY* z55n6&ZGx8!sIZt^5f$SE>z#(pRe&Yb;n=w%t>5qatx=+2{i^NvNWtJ(6R>J(`${}u zeojUGo8bZPk#3nraN8&21oV8#gt_E!>UL&`oUS*c*<%Fhr<#ld@V`_VJH&1GB@XU3GemeQiGQZt_GKdrLQ(hX=2@W^t4<{ zJvrmOUSuz*FF9IY>5s}fUM&0ssc1^h+W8~RNMrZvAFmI~7#lYXiuTOY5~oB~$jKMy z##or1yBIXx5|c?>@MUT=3& zwZBT+gCRq(ck<_l#?|kLy5M+-yk*@c5WoAs{!O*Qc7sd{tgtR$CJLaaF*3jNL?pwk zu-Ao(cJmrHeL7%BCE+ zq*dt9Qvb&OdC$v^>6|H!Eyni8(97BHx%ojfR+x6bowecT10J3k&Edr8U(2AD?T5f5 zA`D|6S7*r(gF|w1*757jB#Cf}^k3!+%?Z1eSM1t6IOp7XUhGC_JyOu5BVlZ~YSbPk z!M6}V22cEudsUs%WXCgW~hXA%0S@j&fvuoYq^X*IYif!mhTBQP@dF-Vm6R@15v%0Y5@ZlilN7#Ms-HTn* zU#bbf>M;_7Mx(nNlL3Ecch5}`+YHBy=6#-U%XJ;n7q2)DY<_ff)qwTUI#*p_SJw3+ zK;w6PJvmC6E%p=bUXQQBvmTUjK!z_-mA1TFwsC#@Ex}N>5(O-dEMcJF3~rzi0mg^| zF%M9$w@C!KAwWxH0}Caa)w6XCN-w%z2MC{;`~! z9NWcHHi%~_;xF?M-&Y|IlW@diehgKXy_?WMI!@d3boT0%B?QL zY|C6)cKOu)4jbZBy6(zZ+Ty<{vi~FHJAoAv4?B!U=w4-FdY)^hw$zKB1M${W{jL2(4PMJ175>E$GY zMnHoYpZc`Enm6g3G9LVI-eQ%o-tN2qTz!j_H7p_2dpl@^`xE!w-$Uz|hDiH@eA98s-LRM47O% z;W;ftg800vr1e2e^zAe0P8cRSOyQ2+YnIFYTn#O~EF_%|?mt;y@YhFTl*^q$Z~9XLplPGaEc}{( z?~ycnxn_d)_`rkFMp?Ewx1Elv--d0iQB^XjU`Ki`wkD*#GO4YeENe7&2Em)pi0s>> zt=@)u2lgnmoVUN=;|Ea+4GS)oEHoUjGIwAMG!}TT3=EL?;xBM`FKlHaxGVC7?6(H+YRVQQ|`c!M!&amY#3V3kV4}7y|1GcH-j7}?$c}KQM1swp@0T= z_QeIm7mE1VY2g_w>P%CcP%^TwnkxutMU=UGR<$Z`+F{!;F(%@!1pL zX$f!7GCwTCT@FRd$t0QT!%lyg9?lWiD#!Tq6bpLc-no$9yk1BZLxXq%P`Nj>AAf+= z!UYw#a6I1gVeT(yqX5H&9#)t3QTKz6M|A&|0GPfBGjK+8LT7O9Z5kBMp>`gGVRynU z><@+p6nL5MncGZYw`(kR2=~%<)+QwAhyRCgV8fza>_nUxyP9(C{#Yo=^-bDkfIJ~z ztsrr5K=u4dXH$OjUewF39vphkG&#a zPE7<=Nq#`;I93Y5gn0~zbeiS1XcURVN|rf^!z@;`K<8a35u%x>s9*`X{|+W()%tvW zb$i?%rz&=h2yEbeUtfm7@Y)kH9#kJ6pY6UoprCPCk5RDcR6zRUsO5lVnagH^#-P<# zvoOWonJ2+HPpz>;JgyLm2%t z3~N&Nlne_h8g9{V@%eZlS8$4i{Cz~IFnGAcQ1uZ^K>Eyv1$F+pHXc;A4o4W%Z;}1R zi$y>ovBGkg2-xEh;x8YN5E0jUiH&=dI9m}R0|0-Omvh1#%a!K+$)x#ymq))BYFPnx z!-4?49%f$$w(U4=BcI-awt{W-=hlhUTxKhl8IMkj!b(R*zNJ^s?9=%MiN))AKj=|D z+@Fz_7^TPAC1f76X{tUB4#D&evG_;h)5y>!;Y-6^_}rCxss4f2nTkU_;XWxYrZ1a? zl?1YML-p!b71aS;ii9B`US2{36s#%Evx^H^m?Z>==g+e>z@ZXwsD)Ide{c{De9U$! zXgl+37Ng#CH62*^TyDhu>Kv#7oqr0LcIG;KU0z)u!}B=LE-9#hG}K8y1nmvK5{AQx zr`}yRsmi&%Ye}H=a5_bC7NH+j4}ecidp3@Fc7D#QbF{x-98^-XKU@B?cslJb1q2*T zkkisi?tFy_bdAJMj7!agpV9uA^Xz}Fw06W4kEz)`4l06V!q#qB-(l-#d7YM{oCPh& z(OI5R#SI1)h{4t50r9+haZx`A0}HFpGbK6^X2VPVaq;jeDX$;wj|rrpBKlu%5GTgR zu_5uv$yOC2?Ch@|b>0Fr7ABj^y(b9a`d{$q^g*lT)io*q=;W&LdhDBo%KNHmP}Y zams;-0VHb6pOS$skM2qrkrX;cUy1b9&EAMoeY#hZfltlMj7d!;0WNY#JchWLnOS^% zJebv7ei!yF_ZN#W2K2yWD0pm z<*Q^u1_t%PkCUBrCwR!tXnNRgb`aI%k5?~e%M24hvjFSRxx8#hP0zRk_MbQe<0ShMd%%k&0QJ2v|nMP<(hErK|@#X zXF&l9%dKvE$a=B?JBTakf74HsF#72wk=rvCeAD4eS|)CU6)KMKE7e@#%}P_@SZfP~ zB4O+t_R8rqR0r`-A9Yvd=<6k-VD2kdGi@F_HT+YJ`?%#^0V1j(zAD7$zSm$Z9#o;@ZSWP!V=@_p?wP#|RSgB}mG@E=y$yy1lu z1c_+9&|ePJPpqyLme`?x-|cXbmj-d7_^oIO#VTp7=&|E(9x@u9Dc^t+ju>QT zCvODFPNDZ7>uNl`zlPt71py*V z9_H{i%%@Q`u)P?!{}TiPl8bPp?u8DS+{oNJX=zXTaPY7?mxHpZ}EV?k#JMp<=_wX_)YoC{F_Kw)U?Yvts>2pNkDus-q6;+FX}ABN(f+P`?VW)dOjcG*m8Qg05qGfaSe z3-G*JYAW=8JGpEY2TSajG}$iHZoll->d|n1qc$bg+`A&S7cVp*IN-p8RaB!-HIAgD6vWFZ zO|P+w`L2NEu~#x7LBnKbPEzvJm3I!Dy|`(UDLQOV{QO`)-F6h8bSI!4PDn=k5Y=2y zNaoXs{)UH29H=V^33kn!m1&#$W-YJHZcF);A;q2lZ9ZF9d0bG1 z*wL;XYP{EOi~aB^qPf#UZ>?3~Rf5klX|To2T(X+(BO@A&b>E;k#tBK>$LzSwDgyh- zRTuurOtR?KZ-~X);KD{e9|4`we>Hb);oiN_FBL$UkUdz||7n5%!FyibXtEdN)CJ`6 zPiDJ}Q!+c}kz)#)=l@Fo0KvoGzMS~UQBt<$i*VAK|7@Waub`Cu(d8f7LVJ?tP-sN@ z>R;h*fH!9f=A(n1>-WlX62nb%^G-P6vKAs-F#< zAe*bVlqsB><&69j924X~Vd83e2_f@tOn*Qb6q~X`&m*57LoW0Y(Q@;TJx>NG?SJ8U zroY_gSlBD6`8_7({q@uE@elFEtRcB^;$2wrAA8b0r=If1AA>hF3Ri{F^}Xw6jMs&mk;=ouk(WYfq2P_+-Zk z57+d!DGrM)!&ZOW4e zr2gV;!W^n1Ags`EbwodNG$tBZBXkh=O3p$VFHk%wGUHuyKH6LI-ycq5L)fTj=~`#$ zRn6`@5l5)zD5_EFxa{oz*|MdHHcDK&LfQRKOfaaIux8C}=Xva7RJyW2hWSRFNQKdI zec5>YoA%@l>M=pMq=WzK;nr_wF}S#|HDM=IqRyPBO}tUA-MRT)(NBg~2j>8O0PEM) z{)We$2UN&tapQeRX#f-q29dcgl(MlBU3$9b#K5{_q3L1Quu+&r>s@4xiucQ{l9vfh z-z?F2PY)~bS{SMQF7w?&7Ke9Dt9X|%@;9Yip?JjU;)&Ac8I#Jsss>JPJD0l^yQjT{FR+A%?}6{f9j^RTpZQ4cu%Vjs((U_-nW<0-iU zSS~FAXBJBRZ`&IQto%;q*GEx0ZMSp_h~Dd!Dj_5@w2(Gf+@1q+i>~VJ7#Z{5w@0C3 zqu^>v>q#7+eD5uHS0b2zn)xq2zNqbP+qgt=;Cyg2a9$OD3@b+N7D6=9ae)pD5=hH3 zuLF8v4nP3_&^ONqG)U$ah}S6*ex~%&OG{gVgBTXf0L6e6TRK+w+qZ*9hWUT-p^7;H zo5syX!ayoRPx3P=(uFbV^-TDm-%Tk61S`GY%VXC3KWX>sW9SIke<`nnTGG;x7um$} z3T^3Yh)9F8(-hoYk(AY3w1_Iq!@cz4nekC_kx0`}37vk(d#@+bZpNSi^F`sPCNpfn zX4^bGBAVs$Und0;*u($Xo<32pIl}As|M>hWoq`pO?Z-44MR==*h^r9c{I$$Y{{rGt z2WC86}tK0=4A} z6#VkeSY@b}KCb4h-yC#y6-lghaxY@MeDB@;=;GK<#M$$nk%v+4T;mrRDq~VxnHvef zI8nK-2G2*KC}DCa+)EF-;vINW;z zT5##qz*x41EN!ycvzz( zPI}tqL|rILKj;a+8^-$n_D4>prML^p+VeO&9+By&@38)g4jknYtziKZ)6`BGudZ*P zmwuH}rNb)>OkB{i6Ot&oaOEFAAu$U(IkKKWBrWKqu12p&M?3*y+=OlI%`LzLT`#dk z--8q7Nw*Z>xO0YhkWr9v;+0*d{Uo*=-pN9;#?xPDHQ1+pz_KzlnD?s$QKs>_RB)FC8{(tKSB{3jT3V7`Xihc7b(1J^C`<*MJYDC~$k@L{uG z3MMjij*qMEmEmfB(PBP1Dz}D$^DU6zuZQ>0^#QCC=k0M*{alyCiDumZkY!RoVmU=+ zT9=zCx#L~jxe)^R;mpT~5fvmHMisLU7BJY-wO^HvSdsVc9ejy#I~6#eTj*SF38ENPU& zA90X9aX5|x)p2=|4{6U*l(eWZ5OG~o7s4`7?BCZ{HC+q9#F^p7`N|#uEJAr%;cWdJ z_#FcS@-PEGI1aL1_jbODaR!`)zBpW@fAIpJI`E3t_x#U?$$VAtbruC9yKF`+B;Y`` zdcmx;m!ZmdCpeS@o24)!>}NqN$wHR3xMr>puK{YJSCnX5sKhK#U!VByZXc0cE}~xLotI?HE;7S{(=CkLvAWp3u*^g!Z03cw2IT7) z;3GEy-zvZ)s#-j~u{HR~dn-YX;1B8RYv4li3KWduz1=d4lUuyqL?H4LK#ckH-e~ks z?krfk40pFS5(>_=T{zB(h#oz$jvYQl$#n@MnKm=*Px;Yom@QQrPQ22A4b ztE<rj$jomc!HQqKRFC`> zNJbDO5}WRL=R(i9_x|ty_kMUkz8~-$W$(4uUh7%UoO8@E#w45k@o<|= zRmfqy6;w8eg9)M)QBLGRd@2ko?d`gFVzD?DlxXz$pcb;oTbd7LdneRNK1My&{h_9f z>G-w9bfs3#&XP7Kpu)UJA|ZZp=FO?5|VAqOacqb@nM*?W4uWA zCWf66PuIbuS@gEOCxaeD&ma~_O#;2N9zCC&%&99*%#LUwRTIbKAI>`-ig$sfr3g3d z#sjxPaVI{?%C)eKsPeVEpcP0x#u-o;<*)_+(inHw7iY5k%(~9}=<0#>wlU@Y*UgdrN6*Y{XL%A4m z)n;!w)&AHT`4}n{Y^#byQ&OEbFQ=mIvb0K;U@KTt5UX~7?RA$b>Y3f7yES4&MDfGH z{CZKzQm_iCb_es22J&QMjfGv8i-6^V{wp4w*$!CP_dfS~Q3uSE}^lPhdu zK=qq}qXk0qGG>-|ol}@7%rqB*XYRxJE;dfSR2=GAg!9VY)V zYwXkIqM7Az`EPqnwd7&)3i|&YPt!QV{!rF~-?RL0FiQS|+#ks@-J&TmnGI_SO0#2J zQ9E8Wcio>t0(iRB=jh^b=YdI-cnIXsSG>%epP<;gtjK$lhNcpgqF|?_+p(U5pWOs-xF0BTUP~{;fq;aJifettM0NQpy?_>ku z_h23($>&V4I+8KE|v}|`*J))$;Go* zsE8Z_*u08`18u`9vk2Nwh@@cD zK%DE8JLynmZ8mbH9G{3rqQrv;tSeXAUll+POOPX@0{3X3k^}kqm}$wtCwdZVVv?WI zMY2vkeHF5@?gX_n3gP7X9F@~6s^Em=KLX(S7rg>@l57ZuXzQamqhMrhnvb5BOA2D*W6BPmY#u~U9_tUo+ps;%hC@tD!w*X1lVut*f;q01H2qv zknPs=8s9K~sF~cx1bNY_f|%r&t%v1zE_dk`mBA&cVG{CUX z61oat99+*V&#RiX$Dy46qccyrgsr)m;^4!PycRECG0H*9p$l#Q8{c*rU}JqJl!L2! zzK!Yr?zn*{9CKZXo{Ik8>^~}!fD}YZ!5rv)-gcLYg86dg45$~2D(WYA*vU%k#dr{* zB%-yv^P?wG_U1FSk|VBP9o5qLeR!*;qjd#+ojn6m^YI-`smfhs=tEcC4R5!nzK8aR zI&)u4tW~Tbl{71cFHkLuTsj-=Ws?I(cL*tpBO7rjzl{mqd6P#cZX#!Z3S`2nIAFLN z9}ZHv`%5+OjvhB-5{d8f*cmm>{C>xjo6|-NgE#8qRZtCerSAu0r84zsao-I5YHj+u zFctrSO{NBWh(o>&}EKq`j1=5@FZ#1KSB{h ztlvVBAwgnXy{*jhc_C9{KxTtQFQ1KC6nCTC#TI2QSSDWLcFSJ!vLU`3Sw2qf?3?M1 zmjrGfZK+&0wJG|FOlOw7J81m9TBupuJ_0?X4DHED2D&IPDci(4)O%Wt^R&je2(1n}6LQ+wgiRP4o+r2Et!L=~26R4V z#d(DPl*i@KQt4Z-Sn`>yF8a+)(0GF9h-!$#;+}=Ze95exm34c4j^OTWUSj1_0s{}d zv;&Na-MaF4-X^N)JWp{grUlwZxqwe&f_!u z;TNLn6WAUjTcwDrrs+EJ@WJ61pc?g?)ft@UlC4?cRL5)GPEmP^LZ z?!WosfvQ_Ldv0-=h)8#NRB0B3e!nejxVmY3v9g~FnT~xqr~}$Yd?c(@3Sx|P6324( zasrPo^zr1O%lyxIx?ug53v2J!sY3sJ3wIWhT*kk@G}o9LE#|DXS*~mj<-Pexzv71- z*y6*l7{-YltSYL2(bIa0WD>D7VPt&z|7I~5Zp`ctUQoae#i;~SFP)uK@Zft1oJ~X} z4!l@Ik8O}$8UNY(QElKm;kqGe4UM(){UM76w=q`sHO*Sq*BXMb2bX~}WLz3{iUjqo z%sL=0j^c0$l2^{kC2%a_wI3B$NfSTc-`@|aV|jOXVYL^c7EQE?+`#u)=xSHkFJxm( zyeiY+3mU50)J`6|R9x@x_^*%Y{Abo0fKJmB60AV#`hcSfEXx@A_{f06DOXO%Z+Qk0 zYC_v|A#w9(KNj#STY>o*aa1!~AE$DX>CyW!$M{x1oNEC336q@melN*zBs6m$6aP3? zW=U88+V~5CaLW!{hvoZ1-3*ry~`G*BJ%>MjAalEQ|TI z&dV*|xQ1$^!mcG(Cy(Up*{2dddz0X3Wl^E7sv1;ORMf<0YHA9qPu(3ikmjC{arqPL zydD8V($5Hwo>v1poo7#4pJ>&i(BJYdXafd!G6);iV9j1J?<6@q24}n|Xwbicig^bd zx_CX-%>SpH7}CYz+KpS_G{VUE3Zcz@x<6DH0WOP^V3}wku{<~Tw5;rEfQ7ZS^~(Bs z-j(Hp-F0wx%4uL>Wqn@Idvr8wCvU#~OF+Ou3=HU=8?*ZVF}d;+8P)`ssuJfpwEzn^ z5qbCvSNH-HUQoFQq*QOrW1Yetjd%SeOPXCI26+i*p9e!hxw zTpksmnS8@m)c5hO4~S)FCMlPp+Nc@ktQXdtn~wz z+xA--espy7y^)H7auZC{F2&`)sZIebwKa^?7%x6Om{MYWa(UvZmSXbYJae?jZ*f*a zyQ2sAU-~mJYCbbg#qBeQ6ODSN%cZyf=5?p@(cVV%Hi^l96yL?>59P%_MaE)w5m8We z4%E+=fKSQM=jyqrV2YM?6dxdaHu+Ne9zpKkYwiJvhlAQ_c*MQZ>~Hz3J6#;{r(*#Y zYwV52$kv`QY$UtuBEE`)@~)kxt6lLqvvwM?B6v|dLKwQhhVLN$?E*UD9IbAPGgq=_8m} z{z8HBO2tze+SZEE(6*ij#S5HQRM8!c(<1$1Qqo~|XbS`MUAsM^ z?_DB9rqlFGaeg*M$hSFF!S1X9Bi}R|!-j#wvs?W%D@j86EHZ8n2?pazG z#{?oybJWH?1A;Ml*ZB}&j>Yk8?c8ZT{MiU?W!UL3$fYQER}~md!s5cNeZ%&g4#VGW z=^YvSHiiV>_}iHG0?G_p@?184aYLuxYIVjGRAGItM{wAuoRnU1k#@^mkFrJTpYMZz z!u>Z}+i44RK8Rskd}QzHd(2Zh`j(b&Q1oEH@PW#C-IC$)<3QB%xcI^k{PdMqFZ+8W z!&v-M&l(hbv@HpE{9{IG)0q3WQ=J}vdBe65dWjznUHH&jIowLgwqf82zL`Lh7xuSW zeLO`zqxlp65Z>cg4@)}|z*=PNa>5^$5;#?>tE4zI( z#cQtHVxpdV0T4;bJd{ zhfWBug~nTiXYm>sp_@DEsBsCYW2(__T7_H>-?Ayeav#~Xtsc+g`u)A3VZegV5Lhnu zm#)6PK3Lz%fhTWmZEY?k7w74pLy+$tk2z6a^R!V7^>IwcnWoD-_||x0rU90N9II|< z*ILu}|8-R5NUPaV-@JtKsOx#jWX`A_9!%ce+S4p|@~$CwQpH<}?blUylAs`+yo-AL zHVxYq7vT!&A(D)tJo4;2G=qGY0Y^*ZwTjs2zaB#WY>{*=KPOfC#!Hy{J z^b76&o%r+E(!=x-U`l?qtnSwoR<} z3cMe6yjZywN}}Cyf)gb8mcQSAsw0($ZJ;jpgn9^&;@4E?=yY3nBn%CsKI{yJL1O&h zAj#GXXVlVbJoA;wCd6*`o$FHQ%a@F`d%yC8U4Bu3Ge-bmiz|~7(?c#^j>jV>1eFoX?dx2UzNR6z zV++x2B}ZnMNc&|N%P>hmuyVrH=|U0^ht7{8J&p@k?;*6e?_iyJY1`vZ8(^7K-xwUG zNJZ*|()Q83pjgGysuu~>!>Md8!v$Ke+Zx#R4U5!V!t8qg{uBz_Yb%>wAtM6o4${W~ z0i;w^PXJdpeCZ{ltC97D3s~kf>JJ@&!3z#yEu*TDdPvN5O+x*8DEdC_8g-r5wj881 zJ$6HHEtK=YY89M<+Q7E+ug~+yT{6m<{DiT)yW0uPfhy9Rkg#@qbYNv$^X-D~%or(= z#!Wk*A@y_xzKk5iCvyO*!_V`BDJlnI0}7_8!=-GjDoOqT@V<1IsE7R-@tKy`Uo8Dk z8Q1KxMD!H1V)N_qh?1>&`)q)^UL`s(+U`oED$fvKfVgrSU}DI#Rw4Pm3%o&aKIWUR z=HcP_`6Y)O7S}ENl->0?Xf9~^DXXaD+b4$P&o)s>eC4YXlK$nv2tXRGX*HeL$JhD@ zb;le7>~KyqTydUNu^oPk4Mm4E2%=OY{~Eae04Qra`}>I}dM^_b6C5E%0h_@LRzzLe z%ewhYD+6(ty0e*f>uXaNMsRR8CLHQx5-%383Om5#`DUIjHzd`Jz;gt**TKqU0MWs@ zwW#5E&=8;_@NdpkPILqnp7`#M*edT`zBek#cOnv{%mvD?8Lxi$VSmmqOZZ3K#K-TM z5lA-j)(VbaXi$C{7&&-^gy8JjaJ1DzEctT;Ne@|AWc`kTz?LNH!ns_7mJna-WP)4O z3^h>yI~N-pP{-vt^$P>vy5iQ=TEbLjv-JnyFiAShUn5LfR=y$=V;*&MFn7Tck`x6q zJ7RB7-{PSWHgmY~={JIKnQN-a+WQ0g+X79r?Me|HdvOM#=Va*TekxHEt~#3(kQ@421J&~}z& zxGd*afD=+Wy#_yknD?Y3WUC>awU;(u%=}T$GI}NIW!wnxXB>rOrt3#h5;OkJ9>Jn` z>fN>P0EnOKE635)VlM3vNq#p2>9 zI?!;wa7KbBFz|~x{^4BO<9{I+acQBgf;t@*ePz|NCh-FH* z&P&I7Y1$wGjY_!+#S#aKLG4Qw9IFvN5i+kY-E9av`1l;sBSua=>^WJXmCbNhJVHAw z&Bbi?j0skYJ1JxnUxyTAy7{(hI??$ajznexjzk#4HB%xYii+E6-8i{IZ1PGO#l(iKi{C*|)xq1#eH$&A=4^KxiBBf+e+ACm?l;;*41 zVj&?R8#l;_6$Fw{oQ*v_1k20IGZG)20U%{oR8UvPRkwgF*!%*tYi`K|dKa|#9{RJT zJv%1Ek4{V(0ophaorwZ0z=gOC{;%7X?!txc>M-~oM8KBAhPBBg54plQ9(ARdM6T#l z34+$2n87(&c2^Qf&1C<>Xr}Le!5Gti%c(wT@P!z>l#%}`zOBcy_enq3ZkhFG$E`(u zR3l6h2!&QAM$1!T`3B#^D?WPGqk(}cQ!L=U*Wt?xK1P06jDQg-!}Nm z^Gbkev-sB6yTVRC@Y1~36b}#TVbP?DdwiPIzRHqkVOU{{SV~Rx%hLs^W$`Ou!asPZ zBgbP&c6xp3>X$oXZw=vcyjG{9XIB`HFdi%dg#;b?bH`2+Y@)(Qtqhot_(tCiWXb>} zvEP6E2)x{I@V0r5h)&|-@&3f|3K(9#wEXaVXLHDOGpY_^{C4YUe0<*eyKui*`L?6^ za+8?d$;vr_KK;0|QV2Q7%uG;itvC?X{{oLUi!|I~cY7?eq*GMr*CS>4U`mTgQ%N3Q zHvw0Z7Er02e$G-ax6N%-!nm&(Bc!7lq)b1UF9Y}2<0eV0B-ruVw#j#Q*90dZWz-uQ zj#q1|B*j4y=P&|;R+Z@CG+0i^%xlqnik$lj!=ExoO`a2wOL6tx6MhsA!KG}9$)eQq zJXIi2c)IAK;*yDpG05R@`*4mIGdK!2?O>bb3msL&c{)}`p2)8B>IcLb0{6>^Gx|C!Yr1+a?FPulr>3W)Q&WxR zo&SC|AfJgkI)+wt;G5PnBe2?lI8FnGb4ZgMiS$#g_#0dgLbsq{PU5w-h(LV2?ki^E zn_slr>m=Z7y%lBkPk={f(3M)yRtlg>WYz;>8lS|qr^upKWU_XgnQpjO0(}2ha2>yv zS(BqOii=6WY0#l=lM3Z=L=RDbk#W-u^BzarP?e$*rx$Gob5|6#M??zb0e8V)AUHhy zs)J6=Y>EL2WiAIe&lI3JO$VA&jt?F{SR;hQRaCo1WO(`oXP69q+09#$M?0?o z8q0Kab|#0knX=(vElknx^4}C?X*>q|iF$5G+nM0M#z(P#tT#mxqrn_t&55Bkf?7IN zn4vYA$<2XHt+OXjx$Em-h@T;t0GuyzvB5@HMtASsdi;2Uj$oSW+&_iXNdqHu8nAGN zG10S+)zZYRHzx8mG1&u2WM!on$GKad5Uw@A|Kf=>aU_e!*XyuFLru0hH9^&I=qeW& zI9fQ^SPWFu7<1vTs5L&t+@p+^ovmTFldi|V3aiUV`CB7$Y7}7JhfCimfr^2P`uR}w z6fW*GSh99-71cVa@AKYmrw3gHtn*S|eeenBE4eEVUX0(e8?4tDCQsvGq>Af%-z&9+ zTUg`zhE7w5ufk<|?)%=Ru=uvo-FxNB!D0M|D*?J(rooxD{2LVNAM%xK+bd1}`GK=~ zhh~8-?FGdnaPLIsKO{-|)%zyL#**U@T?~c@1+^6X3D$)oCt$YrZ4KFfbHvOYS|wZl zXv1ZC9mA1BgqVj`H1^KfaaZZ<*W2)|b?%Nxdo%pdVvqb|nIG!&$1*?qYq&$*KR?iw zvt0z>y6chd9Q|!~Ie;!! zBQP2v7*)d%Kfp+rU}wLwJomo9h$dBrCHc<0q}zy230UC!sjCRyr_lD5XpM3Dc#56s z@Adp=O-Dr7En36C2*}e7x&gZ;+`3?CVZk6Q{I!fegtW0lU&=njXEg2lif!E)shJ^+ z!nv6S0+piW&~csOt9V0%Fzmn0sZV4J>DtSP3^|d(_6|+Ag_DG}6!=sVDz)Wss|c zTpioH>UqkPrC}oe*x1-B8yl@}R8x=%9i|fhvRU00&jOS=iQkIIvNx^3w8E?jQ$|j1 zsx^dM?$9`P4#g^m@{-47KTJ?2LGj=^G`mEt#Wt?Z_7^~x0d)mtZFr@TgHZ+WlxWsx z3xqr)#~~wI1#^jWF1`)WMuGb8=9j#)xxYmG<6oqeyj!<8H&MS=c+$N(!6cMU7896x zzAz&AicFt*_pk|e@y#BXzv8+)8Uh(j!fq=3d7%u~AGZI*k@{~B4Lo`$t|17g0_uWE z3L&0dHN)coH0w?Ho_GWVEdZsjLQt3=sofkjgz`xi_B>KJOVA-+gpNVS#{6GZ9_tqv znHqp;*~E7Ism;rb4jFwv(h}3 zYS+5C_O`&zg&Z=rDJUo@ta{TZ38*gJ+`4)trzU9UGH0EI@mISq)f>J$-*H#BMjQwj z0-?^#-GPLm4SYtBg9egFAJam%6aoPYeqH7G{rS%kw-Prx50++( zmxd#U$FOKgGzt1I$E9xqwY#$^3aYBIAOS0}8xi#R3(RaVQ&X3hR~85I&I;Oo^+(n} zq)?pCg&ZP*0$FA^qMJ-KE@(e^pL>p?%tmi_;3|mo0-+y?fqM6F9utK?VvvTBcxH)r zH++!^p%&s{;8{L3`+gqx1(Bl@rnvZ2UxA_3p?7TzniPc?#=?iUSf%?sf!G{QEku;a zW8C~IO5!x?=V*0lz1<5@siklJS!`F#qzu1ge}61!XYiMW@-9DIj@fHPl{<$-CkZ_( zB=BJ%{=|-9W&o2Km?72z!+BOfiq{0s9%L2{@a8G8hA$@weI0!G|4XKTEoSRSCEmHTM0x$=}5 zqx`lRaMo`^v{4;!EhxM)B{yVA~5Nx307qvz#eeiyL}ng_k0y& z4p<6IO&^!?)5muj$)1lDRgxTscOlrz-s_6&Y`mbLpj&{%A$QJYVGyxq!a@C*N#5pj zz7X*?i^|M-6HmOWRXGYWk^EGGHLR!|#8{%0Nrj!X`d&_9(2BkW1g zK|@i-boDC5`dn`Zyzq+KvJqJHQbMl~1|@(SQ9D$ZD=>&^I>n*>QA$e6?l=<)S#+?i zKYzCbF`QhWs{^*W?!%AVLl?as)TM= zv<0-vaM%bZsqZhDz!0P8fIFDk{`vWrAkF7A>Z%PSsd8DMLaiVPJRd1Q0AN8CkeGP( z)9268X=(OL%fhDsCjgIOgBof$xm;+lg#$I#%#0p_w}!U1`O@;&YgSfP!eY*p$RQ{z z(@vY+L7IjY;rdDf6zS5uFmb6HCU-G1-lcS?q}kQ(1hnd}Dm*0q{{D9@Sla~S6I1h}{efCsFgqEfbB8n<5l?XtXQop-@jPqazVtJ=XSenkK= z8oRo9i$a>9`8EkfW=00R?D3Pt#6)91eB~*da?{8S&s~G1M5a0udG~_IcXLHaci+^( zDasHbauDRAK(FQ%Y{$j0_f=I_>(_9FPXFioJPRTtWs!Oi27JNz62M9SFLN9V%z-73 zhmZfLrbg_Y8#)s32feSp0ASu5$fX<|8|#OuZU?YQQ~k2uM3~j!!6ggBzhG%%fl_=L zQWQ!FD~JY&P5YR?lO7?k2?RQ%#(_8&o|>9^I(-fb{S(f}+Ds4CuLqkD%i1$0{0=wus_h02 zsxcekVLoHB0EBf66l`UjAV}Xe`j?s7%l91O2LAXhZ{{Z(s(O7~~3E zLT_>=yp(f(me0=4PC>!vJ{=*1oI2dzNx1qDMyg_0<^!| z+o&L&3snMs0*5{?)Y!n#trd#a4AX?@Xa*#g0RFt5{Y9;Y?ZKOS8H%Jy4FI{^7T6k-1_(@Pu2vnbXU*)*dxpgAFP~7<$87L%lL7lnT12^G{ zg9$Xf55iJJH zqO9}W1W!i2OJ5B?yP(Hu5NxEvZUmV`h`>&OfWVfio4m9%;3B zhRY0j@Qqjf^xWJZ%sdPXF2I89_KpO(3S8#?|4S<<`zAV0qsG+^nSTiiqn5eTD8$ka zU@HWPjZMoM>@D9}=bb6d>)swu_+$774?5TAzFtCiJwZjjVk~PmOt!1`(c8BoK!I^a z8}yb`kBG2-9of>*kV_FbyST_g+Eold=^-DeCSHiSU09^y$bl3ZX9>d$Hk+A>N)~Cn z_o*V}0Bklv9)rw!jfI-p05DLpqobqK8#hIM^O(57Rqn`0c@Lh_e%PYV(1?C{J(siT zYzHtZeCIO~H4sk`IApZ9kaNPzP$Tug7zX136ek5sNhMNa*sUo6@${RYpP$(>{*Z20 zg4_%!pRR)|iHdLGb4kOeR!f`|@*9WS69j;=m$)t&JeYldo)-pbB3B9&7My`3Q#n~_ zWB>t&)*nJb4GNIbos|~iHZW*tgRM6(EG$eIhOw5LJnm2PS{C`fw8RZ*s|?~9nUIo_ z=b*K>$zxEaaB#GbW)u|Eg%PhR;V^Kbs-`9k=|@hpoLhqOi2{&8Mjjru#gR(&GZ%$# zBI6+t(-gehrs+1k1-e`p1Z~+(e0OKOXtmaX5IM*V!#25JzIug?DuL7<{!&on?E{cD zQqHsiovjV_VeaPUW*LZoZLlymd0_(YWn^gW;bC|E_Mm3J4L3VG3B<^=Fwl~bm9>3R zEHyp7C`x0mTzAX3_)Vw@8d|7`X$mvZMPYiF^w|naMFt)q+4b2Eve1r}cyi6Vq7BgD zpscK{Tad&i^M2VFj z{2J6&tpHHp`A(}x=+Eb1>UUUPuR1>@27VcbUegN;Tu4fc_;dESjmto3NeZi^d0;^2 z6b?=(JfFdk_x+-)%<3)w3Ntl%P{EKKPOK+AmmGqLl8M#hR1LJSYmd866MlzdAsaRz zuFD?85SN&#F5NOK&VPxnE7#sIn4X&IJ|seq*BR2i+OR2DtT9uitQ#L4HClz+O#l-b z5#$Pa7eHK|>Wo&zu%KW9vWmOAJK%`ne0Q_wAu=mS)B(B{zxGbb?j@jFbo`}D61w@C~fxm{{Z`Vp>O~I diff --git a/ConsoleApp/Program.cs b/ConsoleApp/Program.cs index 625b13b..d90d0e7 100644 --- a/ConsoleApp/Program.cs +++ b/ConsoleApp/Program.cs @@ -15,34 +15,14 @@ namespace ConsoleApp static void Main(string[] args) { _bootstrapper = BootStrapper.BootstrapSystem(new CoreModule()); + var simResults = _bootstrapper.Resolve(); _userConsole = new UserConsole(); Initialization(); - GenerateImages(); + simResults.WriteResults(); Console.WriteLine("Program Completed"); } - private static void GenerateImages() - { - // var generateMap= "python3 ConsoleApp/plot.py"; - // System.Diagnostics.Process.Start("CMD.exe",generateMap); - // - var file = Path.Combine("./",Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"plot.py"); - ProcessStartInfo startInfo = new ProcessStartInfo() - { - FileName = "python3", - Arguments = file, - UseShellExecute = true - }; - Process proc = new Process() - { - StartInfo = startInfo, - }; - proc.Start(); - while (!proc.HasExited) - { - Thread.Sleep(500); - } - } + private static void Initialization() { diff --git a/ConsoleApp/SimRunner.cs b/ConsoleApp/SimRunner.cs index 647a15c..66a089d 100644 --- a/ConsoleApp/SimRunner.cs +++ b/ConsoleApp/SimRunner.cs @@ -24,19 +24,23 @@ namespace ConsoleApp private IReactivePathPlanner _reactivePathPlanner; private HashSet hexBombsFound = new HashSet(); private List testingPath = new List(); + private ISimulationResults _simulationResults; - public SimRunner(IMapFactory mapFactory, IVehicle vehicle, IPathPlanner pathPlanner, IReactivePathPlanner reactivePathPlanner) + public SimRunner(IMapFactory mapFactory, IVehicle vehicle, IPathPlanner pathPlanner, IReactivePathPlanner reactivePathPlanner, ISimulationResults simulationResults) { _mapFactory = mapFactory; _vehicle = vehicle; _pathPlanner = pathPlanner; _reactivePathPlanner = reactivePathPlanner; + _simulationResults = simulationResults; } public void Run() { _mineMap = _mapFactory.GetMineMap(); + _simulationResults.Mines = _mineMap.PlacedMines; + _simulationResults.TotalBombs = _mineMap.TotalBombs; SquareSimulation(); HexSimulation(); // while(!squareTask.IsCompleted && !hexTask.IsCompleted){Thread.Sleep(500);} @@ -48,13 +52,12 @@ namespace ConsoleApp var hexMap = _mapFactory.GetHexMap(); _vehicle.CurrentHexCell = new Coordinate2D(0, 0, OffsetTypes.OddRowsRight); var optimalPath = _pathPlanner.GenerateOptimalHexPath(hexMap, _vehicle); - var minimumMoves = optimalPath.Count; var finished = false; var totalMoves = 0; while (!finished) { totalMoves += 1; - testingPath.Add(_vehicle.CurrentHexCell); + _simulationResults.HexPath.Add(_vehicle.CurrentHexCell); var detectionCells = DetectionHead.GetCoveredCells(hexMap.Graph, _vehicle.CurrentHexCell, _vehicle.DetectorRadius, _vehicle.TurnRadius); //Check Cells for mine @@ -80,63 +83,38 @@ namespace ConsoleApp break; } - var replan = false; - //if the next optimal cell is blocked then we need to replan around it. - while (hexMap.Graph.IsCellBlocked(nextOptimal)) + if (hexMap.Graph.IsCellBlocked(nextOptimal)) { - replan = true; - if (optimalPath.TryDequeue(out nextOptimal)) continue; - finished = true; - break; + _reactivePathPlanner.GenerateReactiveHexPath(hexMap, optimalPath, _vehicle.CurrentHexCell); } - if(replan) - { - var tmpPath = - hexMap.Graph.GetShortestPath(_vehicle.CurrentHexCell, nextOptimal, hexMap.DefaultMovement); - if (Math.Abs(_vehicle.CurrentHexCell.X - nextOptimal.X) > 1 || Math.Abs(_vehicle.CurrentHexCell.Y - nextOptimal.Y) > 1) - optimalPath.Dequeue(); - tmpPath.AddRange(optimalPath); - - optimalPath.Clear(); - foreach (var cell in tmpPath) - { - optimalPath.Enqueue(cell); - } - optimalPath.TryDequeue(out nextOptimal); - } - - var last = testingPath[testingPath.Count-1]; - if (Math.Abs(last.X - nextOptimal.X) > 1 || Math.Abs(last.Y - nextOptimal.Y) > 1) - Console.WriteLine("To big of a gap"); - - _vehicle.CurrentHexCell = nextOptimal; + else + _vehicle.CurrentHexCell = nextOptimal; } } //Debugging information - using(TextWriter tw = new StreamWriter("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/SavedList.txt")) - { - foreach (Coordinate2D s in testingPath) - tw.WriteLine($"{s.X} {s.Y}"); - } - using(TextWriter tw = new StreamWriter("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/DetectedMines.txt")) - { - foreach (Coordinate2D s in hexBombsFound) - tw.WriteLine($"{s.X} {s.Y}"); - } - var covered = CoveredCells(); - Console.WriteLine($"Total cells traversed: {totalMoves} \n" + - $"Minimum required: {minimumMoves}"); - Console.WriteLine($"Total bombs found: {hexBombsFound.Count}/{_mineMap.TotalBombs}"); - + var (cleared, uncleared) = CoveredCells(); + _simulationResults.HexClearedCells = cleared; + _simulationResults.HexUnClearedCells = uncleared; + _simulationResults.HexTotalMoves = totalMoves; + _simulationResults.HexBombsFound = hexBombsFound.Count; } - private int CoveredCells() + private (int, int) CoveredCells() { + var cleared = 0; + var uncleared = 0; var hexMap = _mapFactory.GetHexMap(); - //for() - return 0; + foreach (var cellState in hexMap.Graph.GetAllCells()) + { + if (cellState.TerrainType.Id == hexMap.ClearedTerrain.Id) + cleared++; + if (cellState.TerrainType.Id == hexMap.UnclearedTerrain.Id) + uncleared++; + } + + return (cleared, uncleared); } @@ -158,11 +136,6 @@ namespace ConsoleApp var cellsToBlock = hexMap.Graph.GetRange(cell, _vehicle.Width / 2); hexMap.Graph.BlockCells(cellsToBlock); - // //debugging - // foreach (var celllll in cellsToBlock) - // { - // Console.WriteLine($"({celllll.X}, {celllll.Y}) Blocked: {hexMap.Graph.GetCellState(celllll).IsBlocked}"); - // } } diff --git a/ConsoleApp/SimulationResults.cs b/ConsoleApp/SimulationResults.cs new file mode 100644 index 0000000..c2a2ca8 --- /dev/null +++ b/ConsoleApp/SimulationResults.cs @@ -0,0 +1,104 @@ +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Threading; +using ConsoleApp.Maps; +using HexCore; + +namespace ConsoleApp +{ + public class SimulationResults : ISimulationResults + { + public int HexTotalMoves { get; set; } + public int HexBombsFound { get; set; } + public int TotalBombs { get; set; } + public List HexPath { get; set; } + public List HexMappedBombs { get; set; } + public List Mines { get; set; } + public int HexClearedCells { get; set; } + public int HexUnClearedCells { get; set; } + + public SimulationResults() + { + HexTotalMoves = 0; + HexBombsFound = 0; + TotalBombs = 0; + HexPath = new List(); + HexMappedBombs = new List(); + Mines = new List(); + HexClearedCells = 0; + HexUnClearedCells = 0; + } + + public void WriteResults() + { + WriteData(); + WriteMines(); + WritePaths(); + WriteDetectedMines(); + GenerateImages(); + } + + private static void GenerateImages() + { + var file = Path.Combine("./",Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"HexPlot.py"); + ProcessStartInfo startInfo = new ProcessStartInfo() + { + FileName = "python3", + Arguments = file, + UseShellExecute = true + }; + Process proc = new Process() + { + StartInfo = startInfo, + }; + proc.Start(); + while (!proc.HasExited) + { + Thread.Sleep(500); + } + } + + private void WriteData() + { + using(TextWriter tw = new StreamWriter("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/Data.txt")) + { + tw.WriteLine($"General:"); + tw.WriteLine($"\t Total Mines: {TotalBombs}"); + tw.WriteLine($"Hex: "); + tw.WriteLine($"\t Total Moves: {HexTotalMoves}"); + tw.WriteLine($"\t Bombs Found: {HexBombsFound}"); + tw.WriteLine($"\t Cleared Cell Count: {HexClearedCells}"); + tw.WriteLine($"\t Uncleared Cell Count: {HexUnClearedCells}"); + } + } + + private void WriteMines() + { + using(TextWriter tw = new StreamWriter("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/Mines.txt")) + { + foreach (var s in Mines) + tw.WriteLine($"{s.X} {s.Y}"); + } + } + + private void WriteDetectedMines() + { + using(TextWriter tw = new StreamWriter("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/HexDetectedMines.txt")) + { + foreach (Coordinate2D s in HexMappedBombs) + tw.WriteLine($"{s.X} {s.Y}"); + } + } + + private void WritePaths() + { + using(TextWriter tw = new StreamWriter("/Users/brady.bodily/Documents/Repositories/CS5890_Robot_Intelligence/RobotIntelFinal/ConsoleApp/Output/HexPath.txt")) + { + foreach (Coordinate2D s in HexPath) + tw.WriteLine($"{s.X} {s.Y}"); + } + } + } +} \ No newline at end of file