From 41c848bcddcdf4a7c6b099b65e7ef4465dbb5f58 Mon Sep 17 00:00:00 2001 From: Saumya Mishra Date: Mon, 5 Oct 2020 18:18:58 +0530 Subject: [PATCH 1/2] Detection of cycle using DFS algorithm in case of directed graph --- .../DFS/DFS_CycleDetectionDirectedGraph.cpp | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 Graph Theory/DFS/DFS_CycleDetectionDirectedGraph.cpp diff --git a/Graph Theory/DFS/DFS_CycleDetectionDirectedGraph.cpp b/Graph Theory/DFS/DFS_CycleDetectionDirectedGraph.cpp new file mode 100644 index 0000000..518df2f --- /dev/null +++ b/Graph Theory/DFS/DFS_CycleDetectionDirectedGraph.cpp @@ -0,0 +1,58 @@ +#include +using namespace std; + +//if verices adjacent is already visited and present in dfs recursion call stack it means there is a cycle in +//case of a directed graph +void DFS(int V, vector adj[], vector &visited, int src, bool *flag, +vector &stk){ + visited[src] = true; + stk[src] = true; + for(int x:adj[src]){ + if(visited[x]==false){ + DFS(V,adj,visited,x,flag,stk); + } + else{ + if(stk[x]==true){ + *flag = true; + } + + } + } + stk[src] = false; +} + +bool directedGraphCycle(int V, vector adj[]) +{ + vector visited(V,false); + vector rec_stack(V,false); + bool flag = false; + for(int i=0;i>t; + while(t--){ + //v is number of vertices and e is number of edges; + int v,e; + cin>>v>>e; + //Create an adjacency list of v vertices + vector adj_list[v]; + for(int i=0;i>u>>v; + } + cout< Date: Mon, 5 Oct 2020 18:23:21 +0530 Subject: [PATCH 2/2] Detection of cycle using DFS algorithm in case of directed graph --- .github/ISSUE_TEMPLATE/bug_report.md | 38 ++ .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/PULL_REQUEST_TEMPLATE.md | 35 + CONTRIBUTING.md | 19 +- Graph Theory/A Star/A_Star.cpp | 663 +++++++++++++++++++ Graph Theory/A Star/README.md | 65 ++ Graph Theory/Bellman Ford/bellmanford.cpp | 54 ++ Graph Theory/DFS/DFS.cpp | 65 ++ Graph Theory/DFS/DFS_1.cpp | 57 ++ Graph Theory/DFS/README.md | 5 + Graph Theory/Dijkstra Algorithm/Dijkstra.cpp | 89 +++ Graph Theory/Dijkstra Algorithm/README.md | 5 +- Graph Theory/Kruskals MST/Kruskal_MST.cpp | 191 ++++++ Graph Theory/Kruskals MST/README.md | 1 + Graph Theory/Prims MST/README.md | 1 + Graph Theory/Prims MST/code.cpp | 103 +++ LICENSE | 201 ++++++ README.md | 3 + Searching/Binary Search/BinarySearch-1.jpg | Bin 0 -> 94624 bytes Searching/Binary Search/README.md | 24 +- Searching/Linear Search/test | 1 - Sorting/Bucket Sort/bucketsort.cpp | 41 ++ 22 files changed, 1673 insertions(+), 8 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 Graph Theory/A Star/A_Star.cpp create mode 100644 Graph Theory/Bellman Ford/bellmanford.cpp create mode 100644 Graph Theory/DFS/DFS.cpp create mode 100644 Graph Theory/DFS/DFS_1.cpp create mode 100644 Graph Theory/Dijkstra Algorithm/Dijkstra.cpp create mode 100644 Graph Theory/Kruskals MST/Kruskal_MST.cpp create mode 100644 Graph Theory/Kruskals MST/README.md create mode 100644 Graph Theory/Prims MST/README.md create mode 100644 Graph Theory/Prims MST/code.cpp create mode 100644 LICENSE create mode 100644 Searching/Binary Search/BinarySearch-1.jpg delete mode 100644 Searching/Linear Search/test create mode 100644 Sorting/Bucket Sort/bucketsort.cpp diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..0214585 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..9bfc240 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,35 @@ +## Description ## +(Brief description on what this PR is about) + +## If it is solving an issue, mention the issue number + +## Language ## +(enter x where it is correct for you) +- [] C +- [] C++ +- [] Java +- [] Python + +## Language - Branch mapping +| Lang | The branch to which you are making the PR| +| ----------- | ----------- | +| C | C | +| C++ | master | +| Java | Java | +| Python | Python | + +## Does your PR satisfy this mapping? +- [] Yes +- [] No + +## Checklist ## +### Essentials ### +- [ ] Changes are complete (i.e. I finished coding on this PR) +- [ ] Code is well-documented + +### Changes ### +- [ ] Feature1 +- [ ] Feature2 + +## Comments ## +- Interesting edge cases to note here diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 16e356d..4a495b7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,16 @@ -# How to Collaborate: +# Contributions + +## Making a PR ## + +Make sure that you fill out the relevant details in the PR. + +## Guidelines for Merging + +The PR which will be having the specific file name as given in the issue, the one whose commit descriptions are relevant, and the code is readable, would be merged. + +For docs, make sure that you use markdown syntax. Checkout these links: [Markdown Guide](https://www.markdownguide.org/), [Markdown Cheat-Sheet](https://www.markdownguide.org/cheat-sheet/). + +## How to Collaborate: 1. Fork the repository to your own GitHub account. @@ -21,9 +33,6 @@ $ git add ``` 5. Commit you changes with a commit message containing your name, file(s) worked upon, changes added. -``` -$ git commit -m "Name| files| Changes" -``` 6. Push changes to your forked repository ``` @@ -31,7 +40,7 @@ $ git push -u origin branchname ``` 7. Create a pull request to the upstream repository. -# Synchronize forked repository with Upstream repository +## Synchronize forked repository with Upstream repository 1. Create upstream as our repository ``` diff --git a/Graph Theory/A Star/A_Star.cpp b/Graph Theory/A Star/A_Star.cpp new file mode 100644 index 0000000..c6ed5a3 --- /dev/null +++ b/Graph Theory/A Star/A_Star.cpp @@ -0,0 +1,663 @@ +// A C++ Program to implement A* Search Algorithm +#include +using namespace std; + +#define ROW 9 +#define COL 10 + +// Creating a shortcut for int, int pair type +typedef pair Pair; + +// Creating a shortcut for pair> type +typedef pair> pPair; + +// A structure to hold the neccesary parameters +struct cell +{ + // Row and Column index of its parent + // Note that 0 <= i <= ROW-1 & 0 <= j <= COL-1 + int parent_i, parent_j; + // f = g + h + double f, g, h; +}; + +// A Utility Function to check whether given cell (row, col) +// is a valid cell or not. +bool isValid(int row, int col) +{ + // Returns true if row number and column number + // is in range + return (row >= 0) && (row < ROW) && + (col >= 0) && (col < COL); +} + +// A Utility Function to check whether the given cell is +// blocked or not +bool isUnBlocked(int grid[][COL], int row, int col) +{ + // Returns true if the cell is not blocked else false + if (grid[row][col] == 1) + return (true); + else + return (false); +} + +// A Utility Function to check whether destination cell has +// been reached or not +bool isDestination(int row, int col, Pair dest) +{ + if (row == dest.first && col == dest.second) + return (true); + else + return (false); +} + +// A Utility Function to calculate the 'h' heuristics. +double calculateHValue(int row, int col, Pair dest) +{ + // Return using the distance formula + return ((double)sqrt ((row-dest.first)*(row-dest.first) + + (col-dest.second)*(col-dest.second))); +} + +// A Utility Function to trace the path from the source +// to destination +void tracePath(cell cellDetails[][COL], Pair dest) +{ + printf ("\nThe Path is "); + int row = dest.first; + int col = dest.second; + + stack Path; + + while (!(cellDetails[row][col].parent_i == row + && cellDetails[row][col].parent_j == col )) + { + Path.push (make_pair (row, col)); + int temp_row = cellDetails[row][col].parent_i; + int temp_col = cellDetails[row][col].parent_j; + row = temp_row; + col = temp_col; + } + + Path.push (make_pair (row, col)); + while (!Path.empty()) + { + pair p = Path.top(); + Path.pop(); + printf("-> (%d,%d) ",p.first,p.second); + } + + return; +} + +// A Function to find the shortest path between +// a given source cell to a destination cell according +// to A* Search Algorithm +void aStarSearch(int grid[][COL], Pair src, Pair dest) +{ + // If the source is out of range + if (isValid (src.first, src.second) == false) + { + printf ("Source is invalid\n"); + return; + } + + // If the destination is out of range + if (isValid (dest.first, dest.second) == false) + { + printf ("Destination is invalid\n"); + return; + } + + // Either the source or the destination is blocked + if (isUnBlocked(grid, src.first, src.second) == false || + isUnBlocked(grid, dest.first, dest.second) == false) + { + printf ("Source or the destination is blocked\n"); + return; + } + + // If the destination cell is the same as source cell + if (isDestination(src.first, src.second, dest) == true) + { + printf ("We are already at the destination\n"); + return; + } + + // Create a closed list and initialise it to false which means + // that no cell has been included yet + // This closed list is implemented as a boolean 2D array + bool closedList[ROW][COL]; + memset(closedList, false, sizeof (closedList)); + + // Declare a 2D array of structure to hold the details + //of that cell + cell cellDetails[ROW][COL]; + + int i, j; + + for (i=0; i> + where f = g + h, + and i, j are the row and column index of that cell + Note that 0 <= i <= ROW-1 & 0 <= j <= COL-1 + This open list is implenented as a set of pair of pair.*/ + set openList; + + // Put the starting cell on the open list and set its + // 'f' as 0 + openList.insert(make_pair (0.0, make_pair (i, j))); + + // We set this boolean value as false as initially + // the destination is not reached. + bool foundDest = false; + + while (!openList.empty()) + { + pPair p = *openList.begin(); + + // Remove this vertex from the open list + openList.erase(openList.begin()); + + // Add this vertex to the closed list + i = p.second.first; + j = p.second.second; + closedList[i][j] = true; + + /* + Generating all the 8 successor of this cell + + N.W N N.E + \ | / + \ | / + W----Cell----E + / | \ + / | \ + S.W S S.E + + Cell-->Popped Cell (i, j) + N --> North (i-1, j) + S --> South (i+1, j) + E --> East (i, j+1) + W --> West (i, j-1) + N.E--> North-East (i-1, j+1) + N.W--> North-West (i-1, j-1) + S.E--> South-East (i+1, j+1) + S.W--> South-West (i+1, j-1)*/ + + // To store the 'g', 'h' and 'f' of the 8 successors + double gNew, hNew, fNew; + + //----------- 1st Successor (North) ------------ + + // Only process this cell if this is a valid one + if (isValid(i-1, j) == true) + { + // If the destination cell is the same as the + // current successor + if (isDestination(i-1, j, dest) == true) + { + // Set the Parent of the destination cell + cellDetails[i-1][j].parent_i = i; + cellDetails[i-1][j].parent_j = j; + printf ("The destination cell is found\n"); + tracePath (cellDetails, dest); + foundDest = true; + return; + } + // If the successor is already on the closed + // list or if it is blocked, then ignore it. + // Else do the following + else if (closedList[i-1][j] == false && + isUnBlocked(grid, i-1, j) == true) + { + gNew = cellDetails[i][j].g + 1.0; + hNew = calculateHValue (i-1, j, dest); + fNew = gNew + hNew; + + // If it isn’t on the open list, add it to + // the open list. Make the current square + // the parent of this square. Record the + // f, g, and h costs of the square cell + // OR + // If it is on the open list already, check + // to see if this path to that square is better, + // using 'f' cost as the measure. + if (cellDetails[i-1][j].f == FLT_MAX || + cellDetails[i-1][j].f > fNew) + { + openList.insert( make_pair(fNew, + make_pair(i-1, j))); + + // Update the details of this cell + cellDetails[i-1][j].f = fNew; + cellDetails[i-1][j].g = gNew; + cellDetails[i-1][j].h = hNew; + cellDetails[i-1][j].parent_i = i; + cellDetails[i-1][j].parent_j = j; + } + } + } + + //----------- 2nd Successor (South) ------------ + + // Only process this cell if this is a valid one + if (isValid(i+1, j) == true) + { + // If the destination cell is the same as the + // current successor + if (isDestination(i+1, j, dest) == true) + { + // Set the Parent of the destination cell + cellDetails[i+1][j].parent_i = i; + cellDetails[i+1][j].parent_j = j; + printf("The destination cell is found\n"); + tracePath(cellDetails, dest); + foundDest = true; + return; + } + // If the successor is already on the closed + // list or if it is blocked, then ignore it. + // Else do the following + else if (closedList[i+1][j] == false && + isUnBlocked(grid, i+1, j) == true) + { + gNew = cellDetails[i][j].g + 1.0; + hNew = calculateHValue(i+1, j, dest); + fNew = gNew + hNew; + + // If it isn’t on the open list, add it to + // the open list. Make the current square + // the parent of this square. Record the + // f, g, and h costs of the square cell + // OR + // If it is on the open list already, check + // to see if this path to that square is better, + // using 'f' cost as the measure. + if (cellDetails[i+1][j].f == FLT_MAX || + cellDetails[i+1][j].f > fNew) + { + openList.insert( make_pair (fNew, make_pair (i+1, j))); + // Update the details of this cell + cellDetails[i+1][j].f = fNew; + cellDetails[i+1][j].g = gNew; + cellDetails[i+1][j].h = hNew; + cellDetails[i+1][j].parent_i = i; + cellDetails[i+1][j].parent_j = j; + } + } + } + + //----------- 3rd Successor (East) ------------ + + // Only process this cell if this is a valid one + if (isValid (i, j+1) == true) + { + // If the destination cell is the same as the + // current successor + if (isDestination(i, j+1, dest) == true) + { + // Set the Parent of the destination cell + cellDetails[i][j+1].parent_i = i; + cellDetails[i][j+1].parent_j = j; + printf("The destination cell is found\n"); + tracePath(cellDetails, dest); + foundDest = true; + return; + } + + // If the successor is already on the closed + // list or if it is blocked, then ignore it. + // Else do the following + else if (closedList[i][j+1] == false && + isUnBlocked (grid, i, j+1) == true) + { + gNew = cellDetails[i][j].g + 1.0; + hNew = calculateHValue (i, j+1, dest); + fNew = gNew + hNew; + + // If it isn’t on the open list, add it to + // the open list. Make the current square + // the parent of this square. Record the + // f, g, and h costs of the square cell + // OR + // If it is on the open list already, check + // to see if this path to that square is better, + // using 'f' cost as the measure. + if (cellDetails[i][j+1].f == FLT_MAX || + cellDetails[i][j+1].f > fNew) + { + openList.insert( make_pair(fNew, + make_pair (i, j+1))); + + // Update the details of this cell + cellDetails[i][j+1].f = fNew; + cellDetails[i][j+1].g = gNew; + cellDetails[i][j+1].h = hNew; + cellDetails[i][j+1].parent_i = i; + cellDetails[i][j+1].parent_j = j; + } + } + } + + //----------- 4th Successor (West) ------------ + + // Only process this cell if this is a valid one + if (isValid(i, j-1) == true) + { + // If the destination cell is the same as the + // current successor + if (isDestination(i, j-1, dest) == true) + { + // Set the Parent of the destination cell + cellDetails[i][j-1].parent_i = i; + cellDetails[i][j-1].parent_j = j; + printf("The destination cell is found\n"); + tracePath(cellDetails, dest); + foundDest = true; + return; + } + + // If the successor is already on the closed + // list or if it is blocked, then ignore it. + // Else do the following + else if (closedList[i][j-1] == false && + isUnBlocked(grid, i, j-1) == true) + { + gNew = cellDetails[i][j].g + 1.0; + hNew = calculateHValue(i, j-1, dest); + fNew = gNew + hNew; + + // If it isn’t on the open list, add it to + // the open list. Make the current square + // the parent of this square. Record the + // f, g, and h costs of the square cell + // OR + // If it is on the open list already, check + // to see if this path to that square is better, + // using 'f' cost as the measure. + if (cellDetails[i][j-1].f == FLT_MAX || + cellDetails[i][j-1].f > fNew) + { + openList.insert( make_pair (fNew, + make_pair (i, j-1))); + + // Update the details of this cell + cellDetails[i][j-1].f = fNew; + cellDetails[i][j-1].g = gNew; + cellDetails[i][j-1].h = hNew; + cellDetails[i][j-1].parent_i = i; + cellDetails[i][j-1].parent_j = j; + } + } + } + + //----------- 5th Successor (North-East) ------------ + + // Only process this cell if this is a valid one + if (isValid(i-1, j+1) == true) + { + // If the destination cell is the same as the + // current successor + if (isDestination(i-1, j+1, dest) == true) + { + // Set the Parent of the destination cell + cellDetails[i-1][j+1].parent_i = i; + cellDetails[i-1][j+1].parent_j = j; + printf ("The destination cell is found\n"); + tracePath (cellDetails, dest); + foundDest = true; + return; + } + + // If the successor is already on the closed + // list or if it is blocked, then ignore it. + // Else do the following + else if (closedList[i-1][j+1] == false && + isUnBlocked(grid, i-1, j+1) == true) + { + gNew = cellDetails[i][j].g + 1.414; + hNew = calculateHValue(i-1, j+1, dest); + fNew = gNew + hNew; + + // If it isn’t on the open list, add it to + // the open list. Make the current square + // the parent of this square. Record the + // f, g, and h costs of the square cell + // OR + // If it is on the open list already, check + // to see if this path to that square is better, + // using 'f' cost as the measure. + if (cellDetails[i-1][j+1].f == FLT_MAX || + cellDetails[i-1][j+1].f > fNew) + { + openList.insert( make_pair (fNew, + make_pair(i-1, j+1))); + + // Update the details of this cell + cellDetails[i-1][j+1].f = fNew; + cellDetails[i-1][j+1].g = gNew; + cellDetails[i-1][j+1].h = hNew; + cellDetails[i-1][j+1].parent_i = i; + cellDetails[i-1][j+1].parent_j = j; + } + } + } + + //----------- 6th Successor (North-West) ------------ + + // Only process this cell if this is a valid one + if (isValid (i-1, j-1) == true) + { + // If the destination cell is the same as the + // current successor + if (isDestination (i-1, j-1, dest) == true) + { + // Set the Parent of the destination cell + cellDetails[i-1][j-1].parent_i = i; + cellDetails[i-1][j-1].parent_j = j; + printf ("The destination cell is found\n"); + tracePath (cellDetails, dest); + foundDest = true; + return; + } + + // If the successor is already on the closed + // list or if it is blocked, then ignore it. + // Else do the following + else if (closedList[i-1][j-1] == false && + isUnBlocked(grid, i-1, j-1) == true) + { + gNew = cellDetails[i][j].g + 1.414; + hNew = calculateHValue(i-1, j-1, dest); + fNew = gNew + hNew; + + // If it isn’t on the open list, add it to + // the open list. Make the current square + // the parent of this square. Record the + // f, g, and h costs of the square cell + // OR + // If it is on the open list already, check + // to see if this path to that square is better, + // using 'f' cost as the measure. + if (cellDetails[i-1][j-1].f == FLT_MAX || + cellDetails[i-1][j-1].f > fNew) + { + openList.insert( make_pair (fNew, make_pair (i-1, j-1))); + // Update the details of this cell + cellDetails[i-1][j-1].f = fNew; + cellDetails[i-1][j-1].g = gNew; + cellDetails[i-1][j-1].h = hNew; + cellDetails[i-1][j-1].parent_i = i; + cellDetails[i-1][j-1].parent_j = j; + } + } + } + + //----------- 7th Successor (South-East) ------------ + + // Only process this cell if this is a valid one + if (isValid(i+1, j+1) == true) + { + // If the destination cell is the same as the + // current successor + if (isDestination(i+1, j+1, dest) == true) + { + // Set the Parent of the destination cell + cellDetails[i+1][j+1].parent_i = i; + cellDetails[i+1][j+1].parent_j = j; + printf ("The destination cell is found\n"); + tracePath (cellDetails, dest); + foundDest = true; + return; + } + + // If the successor is already on the closed + // list or if it is blocked, then ignore it. + // Else do the following + else if (closedList[i+1][j+1] == false && + isUnBlocked(grid, i+1, j+1) == true) + { + gNew = cellDetails[i][j].g + 1.414; + hNew = calculateHValue(i+1, j+1, dest); + fNew = gNew + hNew; + + // If it isn’t on the open list, add it to + // the open list. Make the current square + // the parent of this square. Record the + // f, g, and h costs of the square cell + // OR + // If it is on the open list already, check + // to see if this path to that square is better, + // using 'f' cost as the measure. + if (cellDetails[i+1][j+1].f == FLT_MAX || + cellDetails[i+1][j+1].f > fNew) + { + openList.insert(make_pair(fNew, + make_pair (i+1, j+1))); + + // Update the details of this cell + cellDetails[i+1][j+1].f = fNew; + cellDetails[i+1][j+1].g = gNew; + cellDetails[i+1][j+1].h = hNew; + cellDetails[i+1][j+1].parent_i = i; + cellDetails[i+1][j+1].parent_j = j; + } + } + } + + //----------- 8th Successor (South-West) ------------ + + // Only process this cell if this is a valid one + if (isValid (i+1, j-1) == true) + { + // If the destination cell is the same as the + // current successor + if (isDestination(i+1, j-1, dest) == true) + { + // Set the Parent of the destination cell + cellDetails[i+1][j-1].parent_i = i; + cellDetails[i+1][j-1].parent_j = j; + printf("The destination cell is found\n"); + tracePath(cellDetails, dest); + foundDest = true; + return; + } + + // If the successor is already on the closed + // list or if it is blocked, then ignore it. + // Else do the following + else if (closedList[i+1][j-1] == false && + isUnBlocked(grid, i+1, j-1) == true) + { + gNew = cellDetails[i][j].g + 1.414; + hNew = calculateHValue(i+1, j-1, dest); + fNew = gNew + hNew; + + // If it isn’t on the open list, add it to + // the open list. Make the current square + // the parent of this square. Record the + // f, g, and h costs of the square cell + // OR + // If it is on the open list already, check + // to see if this path to that square is better, + // using 'f' cost as the measure. + if (cellDetails[i+1][j-1].f == FLT_MAX || + cellDetails[i+1][j-1].f > fNew) + { + openList.insert(make_pair(fNew, + make_pair(i+1, j-1))); + + // Update the details of this cell + cellDetails[i+1][j-1].f = fNew; + cellDetails[i+1][j-1].g = gNew; + cellDetails[i+1][j-1].h = hNew; + cellDetails[i+1][j-1].parent_i = i; + cellDetails[i+1][j-1].parent_j = j; + } + } + } + } + + // When the destination cell is not found and the open + // list is empty, then we conclude that we failed to + // reach the destiantion cell. This may happen when the + // there is no way to destination cell (due to blockages) + if (foundDest == false) + printf("Failed to find the Destination Cell\n"); + + return; +} + + +// Driver program to test above function +int main() +{ + /* Description of the Grid- + 1--> The cell is not blocked + 0--> The cell is blocked */ + int grid[ROW][COL] = + { + { 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 }, + { 1, 1, 1, 0, 1, 1, 1, 0, 1, 1 }, + { 1, 1, 1, 0, 1, 1, 0, 1, 0, 1 }, + { 0, 0, 1, 0, 1, 0, 0, 0, 0, 1 }, + { 1, 1, 1, 0, 1, 1, 1, 0, 1, 0 }, + { 1, 0, 1, 1, 1, 1, 0, 1, 0, 0 }, + { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, + { 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 }, + { 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 } + }; + + // Source is the left-most bottom-most corner + Pair src = make_pair(8, 0); + + // Destination is the left-most top-most corner + Pair dest = make_pair(0, 0); + + aStarSearch(grid, src, dest); + + return(0); +} diff --git a/Graph Theory/A Star/README.md b/Graph Theory/A Star/README.md index e69de29..ad0250b 100644 --- a/Graph Theory/A Star/README.md +++ b/Graph Theory/A Star/README.md @@ -0,0 +1,65 @@ +# A* algorithm + +## What is A* Search Algorithm? +A* Search algorithm is one of the best and popular technique used in path-finding and graph traversals. + +## Why A* Search Algorithm ? # +Informally speaking, A* Search algorithms, unlike other traversal techniques, it has “brains”. What it means is that it is really a smart algorithm which separates it from the other conventional algorithms. This fact is cleared in detail in below sections. +And it is also worth mentioning that many games and web-based maps use this algorithm to find the shortest path very efficiently (approximation). + +### Explanation:- ## +Consider a square grid having many obstacles and we are given a starting cell and a target cell. We want to reach the target cell (if possible) from the starting cell as quickly as possible. Here A* Search Algorithm comes to the rescue. + +What A* Search Algorithm does is that at each step it picks the node according to a value-‘f’ which is a parameter equal to the sum of two other parameters – ‘g’ and ‘h’. At each step it picks the node/cell having the lowest ‘f’, and process that node/cell. + +We define ‘g’ and ‘h’ as simply as possible below + +g = the movement cost to move from the starting point to a given square on the grid, following the path generated to get there. +h = the estimated movement cost to move from that given square on the grid to the final destination. This is often referred to as the heuristic, which is nothing but a kind of smart guess. We really don’t know the actual distance until we find the path, because all sorts of things can be in the way (walls, water, etc.). There can be many ways to calculate this ‘h’ which are discussed in the later sections. + + +## Algorithm +We create two lists – Open List and Closed List (just like Dijkstra Algorithm) + +``` +A* Search Algorithm +1. Initialize the open list +2. Initialize the closed list + put the starting node on the open + list (you can leave its f at zero) + +3. while the open list is not empty + a) find the node with the least f on + the open list, call it "q" + + b) pop q off the open list + + c) generate q's 8 successors and set their + parents to q + + d) for each successor + + i) if successor is the goal, stop search + successor.g = q.g + distance between + successor and q + successor.h = distance from goal to + successor (This can be done using many + ways, we will discuss three heuristics- + Manhattan, Diagonal and Euclidean + Heuristics) + + successor.f = successor.g + successor.h + + ii) if a node with the same position as + successor is in the OPEN list which has a + lower f than successor, skip this successor + + iii) if a node with the same position as + successor is in the CLOSED list which has + a lower f than successor, skip this successor + otherwise, add the node to the open list + end (for loop) + + e) push q on the closed list + end (while loop +``` diff --git a/Graph Theory/Bellman Ford/bellmanford.cpp b/Graph Theory/Bellman Ford/bellmanford.cpp new file mode 100644 index 0000000..d7c97a1 --- /dev/null +++ b/Graph Theory/Bellman Ford/bellmanford.cpp @@ -0,0 +1,54 @@ +#include +#include +using namespace std; + +vector bellman_ford(int n, int src,vector > edges){ +// Create vector + vector dist(V+1, INT_MAX); + dist[src]=0; +//relax all edges v-1 times +for( int i=0; i>n>>m; + + +//Edge list +vector > edges; // (a,b,3) (c,d,5)....... + for(int i=0; i>u>>v>>wt; + edges.push_back({u,v,wt}); + } + //bellman ford + vector distances = bellman_ford(n,1,edges); + for(int i=1; i<=n; i++){ + cout<<"Node "< +#include +using namespace std; +vector getPath(int **adjmatrix,int v,int v1,int v2,bool *visited) +{ + if(v1==v2) + { vector v; + v.push_back(v1); + return v; + } + //Explore paths from all unvisited neighbours of v1 + + for(int vertex=0;vertex pathfromneigh= getPath(adjmatrix,v,vertex,v2,visited); + if(pathfromneigh.size() > 0){ + pathfromneigh.push_back(v1); + return pathfromneigh;} + } + } + vector path; + return path; +} + +vector getPath(int **adjmatrix,int v,int v1,int v2) +{ + bool *visited=new bool[v](); + visited[v1]=true; + return getPath(adjmatrix,v,v1,v2,visited); +} +int main() { + int V, E; + cin >> V >> E; + + int **adjmatrix=new int*[V]; + + for(int i=0;i>v1>>v2; + adjmatrix[v1][v2]=1; + adjmatrix[v2][v1]=1; + } + //find path from vi to v2 + int v1,v2; + cin>>v1>>v2; + + vector path=getPath(adjmatrix,V,v1,v2); + int i=0; + while(i +using namespace std; + + + +/* Function to do DFS of graph +* g[]: array of vectors to represent graph +* vis[]: array to keep track of visited vertex +*/ +void dfs(int s, vector g[], bool vis[]) +{ + + //Mark current node as visited + vis[s]=true; + cout<>T; + while(T--) + { + //N is no of nodes + //E is no of edges + int N, E; + cin>>N>>E; + + //Create vector to store graph + vector g[N]; + bool vis[N]; + + //memset is used to mark all nodes unvisited initially (It initialises all the values of vis[]=false) + memset(vis, false, sizeof(vis)); + + for(int i=0;i>u>>v; + g[u].push_back(v); + g[v].push_back(u); + } + + //Call DFS with starting node 0 and graph g + dfs(0,g,vis); + + cout< +#include +using namespace std; + +template + +class Graph +{ + unordered_map > >m; +public: + void addEdge(T u,T v,int dist,bool bidir=true) + { + m[u].push_back(make_pair(v,dist)); + if(bidir) + { + m[v].push_back(make_pair(u,dist)); + } + } + void printAdj() + { + for(auto j:m){ + cout<"; + for(auto l:j.second){ + cout<<"("<dist; + //set all the distance to infinity + for(auto j:m){ + dist[j.first]=INT_MAX; + } + //make a set to find a out node with minimum distance + set>s; + dist[src]=0; + s.insert(make_pair(0,src)); + while(!s.empty()){ + //find the pair at front + auto p=*(s.begin()); + T node=p.second; + int nodeDist=p.first; + s.erase(s.begin()); + //iterate over neighbours/children of the current node + for(auto childPair:m[node]){ + if(nodeDist+childPair.secondg; + //number of edges + int n; + cin>>n; + //u and v are the vertex and there is an edge connecting them whose weight/distance is dist + int u,v,dist; + + for(int i=0;i>u>>v>>dist; + g.addEdge(u,v,dist); + } + //print adjacency list + g.printAdj(); + //source from which we want to find distances to all other nodes + int src; + cin>>src; + g.dijsktraSSSP(src); + + return 0; +} diff --git a/Graph Theory/Dijkstra Algorithm/README.md b/Graph Theory/Dijkstra Algorithm/README.md index 1415246..40d901d 100644 --- a/Graph Theory/Dijkstra Algorithm/README.md +++ b/Graph Theory/Dijkstra Algorithm/README.md @@ -36,4 +36,7 @@ Building this array of predecessors is very simple: for each successful relaxati ``` p[to]=v -``` +``` +**Time Complexity of Dijkstra Algorithm** + +Time complexity of Dijkstra's Algorithm changes with the method of implementation of the priority queue. Using Min Heap time complexity of O(V + E log V) can be acheived. Using array implementation of priority queue time complexity of O(V^2) can be acheived. Most efficient implemenatation of priority queue in terms of time complexity is using Fibonacci Heap which yeilds results in O(E + V log V). diff --git a/Graph Theory/Kruskals MST/Kruskal_MST.cpp b/Graph Theory/Kruskals MST/Kruskal_MST.cpp new file mode 100644 index 0000000..88a2259 --- /dev/null +++ b/Graph Theory/Kruskals MST/Kruskal_MST.cpp @@ -0,0 +1,191 @@ +// C++ program for Kruskal's algorithm to find Minimum Spanning Tree +// of a given connected, undirected and weighted graph +#include +using namespace std; + +// a structure to represent a weighted edge in graph +class Edge +{ + public: + int src, dest, weight; +}; + +// a structure to represent a connected, undirected +// and weighted graph +class Graph +{ + public: + // V-> Number of vertices, E-> Number of edges + int V, E; + + // graph is represented as an array of edges. + // Since the graph is undirected, the edge + // from src to dest is also edge from dest + // to src. Both are counted as 1 edge here. + Edge* edge; +}; + +// Creates a graph with V vertices and E edges +Graph* createGraph(int V, int E) +{ + Graph* graph = new Graph; + graph->V = V; + graph->E = E; + + graph->edge = new Edge[E]; + + return graph; +} + +// A structure to represent a subset for union-find +class subset +{ + public: + int parent; + int rank; +}; + +// A utility function to find set of an element i +// (uses path compression technique) +int find(subset subsets[], int i) +{ + // find root and make root as parent of i + // (path compression) + if (subsets[i].parent != i) + subsets[i].parent = find(subsets, subsets[i].parent); + + return subsets[i].parent; +} + +// A function that does union of two sets of x and y +// (uses union by rank) +void Union(subset subsets[], int x, int y) +{ + int xroot = find(subsets, x); + int yroot = find(subsets, y); + + // Attach smaller rank tree under root of high + // rank tree (Union by Rank) + if (subsets[xroot].rank < subsets[yroot].rank) + subsets[xroot].parent = yroot; + else if (subsets[xroot].rank > subsets[yroot].rank) + subsets[yroot].parent = xroot; + + // If ranks are same, then make one as root and + // increment its rank by one + else + { + subsets[yroot].parent = xroot; + subsets[xroot].rank++; + } +} + +// Compare two edges according to their weights. +// Used in qsort() for sorting an array of edges +int myComp(const void* a, const void* b) +{ + Edge* a1 = (Edge*)a; + Edge* b1 = (Edge*)b; + return a1->weight > b1->weight; +} + +// The main function to construct MST using Kruskal's algorithm +void KruskalMST(Graph* graph) +{ + int V = graph->V; + Edge result[V]; // Tnis will store the resultant MST + int e = 0; // An index variable, used for result[] + int i = 0; // An index variable, used for sorted edges + + // Step 1: Sort all the edges in non-decreasing + // order of their weight. If we are not allowed to + // change the given graph, we can create a copy of + // array of edges + qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp); + + // Allocate memory for creating V ssubsets + subset *subsets = new subset[( V * sizeof(subset) )]; + + // Create V subsets with single elements + for (int v = 0; v < V; ++v) + { + subsets[v].parent = v; + subsets[v].rank = 0; + } + + // Number of edges to be taken is equal to V-1 + while (e < V - 1 && i < graph->E) + { + // Step 2: Pick the smallest edge. And increment + // the index for next iteration + Edge next_edge = graph->edge[i++]; + + int x = find(subsets, next_edge.src); + int y = find(subsets, next_edge.dest); + + // If including this edge does't cause cycle, + // include it in result and increment the index + // of result for next edge + if (x != y) + { + result[e++] = next_edge; + Union(subsets, x, y); + } + // Else discard the next_edge + } + + // print the contents of result[] to display the + // built MST + cout<<"Following are the edges in the constructed MST\n"; + for (i = 0; i < e; ++i) + cout<edge[0].src = 0; + graph->edge[0].dest = 1; + graph->edge[0].weight = 10; + + // add edge 0-2 + graph->edge[1].src = 0; + graph->edge[1].dest = 2; + graph->edge[1].weight = 6; + + // add edge 0-3 + graph->edge[2].src = 0; + graph->edge[2].dest = 3; + graph->edge[2].weight = 5; + + // add edge 1-3 + graph->edge[3].src = 1; + graph->edge[3].dest = 3; + graph->edge[3].weight = 15; + + // add edge 2-3 + graph->edge[4].src = 2; + graph->edge[4].dest = 3; + graph->edge[4].weight = 4; + + KruskalMST(graph); + + return 0; +} + +// This code is contributed by rathbhupendra diff --git a/Graph Theory/Kruskals MST/README.md b/Graph Theory/Kruskals MST/README.md new file mode 100644 index 0000000..a82d6b2 --- /dev/null +++ b/Graph Theory/Kruskals MST/README.md @@ -0,0 +1 @@ +# Kruskal’s Minimum Spanning Tree \ No newline at end of file diff --git a/Graph Theory/Prims MST/README.md b/Graph Theory/Prims MST/README.md new file mode 100644 index 0000000..e6db5a7 --- /dev/null +++ b/Graph Theory/Prims MST/README.md @@ -0,0 +1 @@ +# Prim’s Minimum Spanning Tree (MST) \ No newline at end of file diff --git a/Graph Theory/Prims MST/code.cpp b/Graph Theory/Prims MST/code.cpp new file mode 100644 index 0000000..47fc76d --- /dev/null +++ b/Graph Theory/Prims MST/code.cpp @@ -0,0 +1,103 @@ +#include +using namespace std; + +// Number of vertices in the graph +#define V 5 + +// A utility function to find the vertex with +// minimum key value, from the set of vertices +// not yet included in MST +int minKey(int key[], bool mstSet[]) +{ + // Initialize min value + int min = INT_MAX, min_index; + + for (int v = 0; v < V; v++) + if (mstSet[v] == false && key[v] < min) + min = key[v], min_index = v; + + return min_index; +} + +// A utility function to print the +// constructed MST stored in parent[] +void printMST(int parent[], int graph[V][V]) +{ + cout<<"Edge \tWeight\n"; + for (int i = 1; i < V; i++) + cout<_=JyF)2ZtUz%mP$;DocMmP@rATmhifeHQPLZGi z0=((>XZN|!^T+!i^g`P&LGC1 zrK-)x%_qt$#w*Cp%ge`Lz{khU%PoM+TJp;3%0}u8?zZo3tvqbGoNWC(004eoeqM1t zUU6Ol27W$qei3nAegJ^>W9EOXLXG^G^Isev`TXD7BOe~g`Y()ffy7__u@GHJNe>YJ zFYlrA^7He?qy5Kn)bx1t|Kf@Slz%*oj)IB?NJIfV`IkMYor$Rbeb!(i+JEU2iCF*h zY$DFT@lyaG@yUPr7ZT(DsUO*LsOyOd|HXTWiT}l?dH>OkkC!(O<=^!nJ(-94AMX?9 z<)Qrt<2L4D{0F1Lzmxw@hx~u(kL)-AKmqE%>3=cW|A8_7jgft;0P}xzB-`KgSCkT& zmyy}#|EU%JpJ)I8F%z

>*{Kf8`z@ACLc*006<}U%HqOKffp+0Pug8NDrX=;{|jb zF;S$0{^fmMq!*CV|4KOj=0Mf>`~Sb%0omixqLG^a9TBMVf9dFezdipiy#R^++VD36 z0GR*Kkr=HNS@(Zvynuk;QvM~ zI`jWVEjs7_Icopm{J+N6{ha{+osa_!9Rm}o(i2=HLp^e0LqS7BMJkJdj_jT& zL4OA#IuQmjBcCkhGi@uZ=WZnYp$XrxnO@a&k?KsIG7G$Q|A_O1jGTg!>IDnyOEz{v zAz=|wF>$%q@(PMd$||~g`UZwZ#wOM_w(soh9UMJ8y}W&V{rtniKSg|w{1TOzl$?^9 zmY$LMJ-?u^sJNuG>}PFVeFLPiskytSx37O-aA!ZYTK0e0MTE2q71;*pSbyz8LG?jqG$M2iMm|hpS#2yUw`b4! zL$OI-C48&t!eJ87IVFATKKX=0uPWJ=*b5MsfaX*Qb)RCSLpzaCu-9@%{2XsO&XOuypcsa+8F#EgFwKN4Xh+ zh(+MN-g+bbRAw0Pp*bE6f|WF*#RhoQLqAriztC8c#=iE+2x~j<>EL{TPbn5=IEAH( zA@#uYRH!2cgy*b?u%jWR+5c^3$*V^IdkuljV#kqPru6>Z+PxzV;&!4ub)el*CWD-B z%fqOhd#0MJeZaaneePN(d4PJb$w=SOqltD9Ep$1-6qhlMzAyKC=2gOqI$j(Fzg!X} zQ}SR}c}zTwb6SMw73}q*^ZcS0N0%c+SJQ(-c>R~2l}Ejw&Ic^i{HgbG5$(?vi}%mf z7M(|v#@$^0*q9oVCNt^;@4YeI9zWgrQQ6Mi;{glkOKmt;#Jd`IF8)$1Vg1!6U?EPo zStH|UvE_ttFZK2{KgI9j-2K*}Vvp2}X1o0bl!;)kHq}0-ST(W&YYb3m6s0@!@t}1jf;OZtqV9z7kpTD|Jlu*0!eXO?n9$ z5}B4}J*e~wDD-t1b6{+R;U!`v2sE!w@#0O{c#7J}fLftbk<%_c;#xBM2t6eOpGuUxg{=aXJ;0?g1!fl_yco56|J?-q8|sb(XZe zHRb$8qu+zC=S8riY~L;V5L1SrHQ)$oe_#3`Fo(-VcQG!oy)ya+Zl^H&zMZtk$&Jz3 z&GYJ2@A31uF_7FX8ob-6^=2karZ zgto{IjJimtgl0lOUjD(9Rbd0tw2kw1cMcU>Mwj@)Za$9V*SI0F29E&Sl=NWfnOq{6 zU@+^nP11g^ci$GTuoCzg2%+hvq4+Q>2K zdMn|L+I>o0tr}UyFI?LeWU94y{u*wANmki3=%$ zv75!aKFCO+=~xw&(lp+*Dp)_p6lbXbvo$Im(EG*Gu{2&C>z&qcMLv1rBLLr|8y@-OGH5F-*6M zinXV{V*@?6S7}Ad%B)NEsa_2+Pix+UaSqUu*tq)+kunD})jE4!)Hg*Q5Sdo~ipRW} zdfrDmc)?kK8W5(M66$27J0F#U>3{2?-NE+=F!9~G)j?U}703pXmz^~ ze|rh(h$8J!8KNJnfN#b>JhJ`$r-x9(KC#|J0Y2&u6iezVFRW-nb(%fK1$*_aM|r8z z6~>DtCz2`y`eK)OiFhe0$U8lcej>4T+AoNas_Q`@*U&PXU3#C^e>`c;>MJ<1-ll$vcy81 z>nJVFW9HNIL2o9MpPliFjw(h&fGQd7+Dl79xLfr8n2NmPD+qR+d@LWSgXyAi4=v5J z-T9k|=cN{T=Y9Ga3Q$N?9aJK&+Og`COzg7w0D~h5JX|Vv({b2mS%Mm(6rQImJp92}!WnN)hK zi^WW@lKi@`t?VOII~@}Ewm|=;qsn10%VPi{$TRG5qw@p1d^=2oXJEQeDjzR-*-BwU zIoc7A$}cI?8c=7=gkZzf>E;~=f-A*h$!Tt9c&jDB5A`ZNamn|`b^S`8LEnl`&>tjc za8nTb`%_<^isIFaP0Bn1(A4ppYT&vll$j-%p%KfN7#I{o(XiF*@-KvQY3)*FGBP3b zStLv4C4aa~9CCC-XKG$FqiAqJAnoe<^O90_o0a^k5^#gfRW+AaO5@w3qKmgl0W{#A zdjZw<)7NQfYj2aC(nQG5Zt?=VjVVebIu>y5*?BMrJwcKD`~L6GEcWp2?IgZfS@FI> zcU+kbWp&tg+mrWf022tBQlyIhu{N50#hz&N5-l3lNoBQP0!f3$3R;Bf0k9?vYRl>m zB+|*HsT$kh#dMYY)e9A#4fPE-?XKd=J}OF&0Cz#Od#G7e^=Xl2X1d(M;P5Ymv0rM?f>_z8`vEn?oTc&OL{acCn|xC_-T4N6@4n7l&O4Fo>Oy@zk|8!k z-Q5`{gVkC%!w;UD>r~b6Pdu@*;e_4pz5!5?7?*-LtxVy%>0aVrsyN-ug&(u6C9)_; zyAY^wp$cEuE*N~QH&Rl4)8W`lN>{Vx5unSLYGZsN=Q#%xKXiNYfTj_?0Rz^ycf~eG zGg)L8C8+{%&q@*sP@!I}Rt#9BFynYIEYasA?q0FE>ZeorAvH$*lyTJuCE*iv=>}Qt?LFMDO?RGDib8t#8~% z(CzFZ#<|%3Nt938neAu)S>+c_C{Sr?c#vNK&Y$DDpjXF6)yG@PIvz9v6%a!9rY*dU zkX%26VFXrjejlWAA?M5@%lrveyQ1U<(^ehqSv;|@4;aqr}+aut~lxPO4 z*Dk!Aw5AI_-3c)fiMr4va`-Uh=JtJQEhBK~D;fTKwKu4K_nXydmA)r`KfPZXW^ZPS&Hr42RzS#c{2qFM3zsh0$CK3^DN>tMA1GkG6u3j}s#N zd9i*}P3`u2`blyNZJ5oezFz=hbGL!jgK#>Xp-{ z7_xv*dWmX*$K(>S(qXJ$}dg6Eb2DQ2$kQIZZmU~L<6%0oxCUHhSoZbQYd zP@|IGZ46jkK3}>XH2nd;OK&+|YFuohy&3;J10|#s$X3sXr z##yj|?U*1Y1?W!PMua_;)S{N-`#PLXtuP453C|nK@oJLvTO!Wj`sX!fK85}60eZIX z{#TpvWs~i)4>?=$jDdh+FzsntJ^gL3fZ6Gjh)23CZvzGMt>Jxv8)2H-i zwS55^TlZ1m5ipncW(0EASP*v&_Rq~{nqEwOF)%NPr%gVj&Szs+sf2i;$Wcd-PMs1< zab+Ps!Eqp1Bx3gnnAcKwqfO`G{6clxfT`a+L%%=K7ScX z+6x!xq5}2068v_engK77Q$=%dDExU%wiT;wO@m*|a6Ghr&z?`})b??}xClP3GINRM zg!#=*XyTAqqeyc^tP<1=G=U0%L!`-PS*MQ;6>ERCP95jBG&I#m%L%>@r*W|;bNfgj zi`lHY5P9jwp1#aWpJHTa zI6m4!mm>a0nHj`3zN?{(^9Z1db#H(jzgx_o4^?kye5QC7-!r52yhk}H>fQaocK?Z^ zGBxgep`i4bf53z?dzFGfRH7tGXNmE3p%jhtKwz+^8P*p$pWW3Yi5N_-U1Yy7ZfAo@ zb%c9v2rd=aS<&z@{7MqrE0ai48Es)qqxFWY-s+3h2LymRBvlX7P=6T8%p#1s%}tKY z#eYZ0=aiy!tUDk65rFHR1+q@q*80YPM;QjvrzCjCXD-XPqgF!8$?|DO-ieW^=fh2f zm_1yj{EjTFHwk}#2jX^lmBCd_W(6zXE|Mj_NCk;6z9m6age7&0L=tAx5_H0o5aYXoo(hR{g{3CVtnIhF8MWk-qQGV zAv?DX(_FY29gxbsNI)&b_moeaqjUUFSEZwQ9OhGk=m1{~3WmtEC;)S)y}^#gBysy1 zIA@oL(ok{(S_i%d%2M=zEO7T1tdS#G<@g`>4qbADDxS(Y%U7d3)Zw zczT5&?{t~pgVSm*^0@m;(29Xm1^Q^&J6SZobSrITuj4R7mtEGf*78W0&84K+U%i4# zxhXZ7pl%8Vn}y>!7lnl^^od4Kp+65H7QE>&;TDgn+mgXr-QAb#i5r*;VKTZVyl$RO z@wVz9EW~8l_~}0ben-s@dV=PLvvRbr#-8^GP$BXmQuji?yq#eD4V7prfjy8kG46Ns zJqPd03}U{Dt7J!n9csSrgaTFGw>|>I(cU&mtig(SmmUF!#rfgO0Xtd1aY!bh>ab@2sEFVvXE8Qhr;BogvoEwgK@tmcYsyM9XW7us|looTED;^AlRy zt1p)W;&f%dat09|D)26QO4pq=nUpLnygTZ-oeCW=gSI>9(d|T-xsAi850v&|=k9(V zX?RTEH6co)!eP4AgIMZyoiPe0j!AC@pt6fM510JPeh7P%4PG}5zN%G!U2A9Pjb2o^ z_6L(Eq^|-z56ys)fvkS(IT}GuJvBF98Tl<8{JPEkTZ2+HU1BZ|Tl_ZK9M5hY80Q|w zaYc?d@18ewT`mh~D{sURv22?=PRRq;eh!>DPO-0O8}h)ddxdj(Cf>|&+VIP{H|Z!) zDy^3j{31lBI-@5XE%L4IU1gcC@B8B8c)p+M0*6#5Ip3u+zlqD#_c)B@m})2U#e4*G zd1qE%#eT!z?k_Eox?+gzBa!$R4NyLWuu@R6Mn%wv&s$Kow1XYsOd6o{r zOn0>XU_XlJ9v2Fi9?T)ul)z@82kqOuO8KGl}D^=BI`nrw;784kCo&=UzjYq7Sq9>r5F)23oK74smVv zBY>O&S}$81DA0K7Qi*GSn>@LXx7PNf>DLg&BcMo4WBZmSidHE=h~mVxRimHlIKRaA zWb>#$%*jV6Hf!V1zRGnwJoH8Hw9DCd^a~Wd8m9Y%e&3e6S5DWfXmIi>$5e8B(#vq7 zIuHH`s|;;i>mr%Ajyt8NXSXB$iN0T7HAYa6EF`XJ)n^AEz^unpJ7e|dneE~gu&mT! zyB{wtBRlZDj_7Wj8G;mM`bg~iB2K$PStn9Zzqy~wUrayX2#Y-e=n6xID?7Xj$gCO$_B497sUEO$&r~EG@3Mz82>)5%yI=syTYUdPW>(Fg3*8%pL)M z79V`NcnAj<&TS$TvhBcv!`tU4ErR*>Mc2PUmTq#+53E5+Mzu9_f-R$T>Kd}7wWATS z%Gk^-8=cl+A^!8){4I;WCZWF;R515jXx_C}o5I5g;~p4ImE9bI2)=HVcht#9ejEk4 z=asl#ld~SkRE?{^Ki_}juWU~$|0#l~yA#8OPwM1UOc9Hnkotb^%_T`vT=TK^@+(>C zad}V1)Rd6!7cLC?=!dR>!jVDkjSp?NpqMS)N1=6-(G zwtWP@oWC{JX`!|;TlIbng(aXqXKeZ{cuYXdf9}e(`sikr{oSk+QImjTV`nlo=Xd%mT&;btB z&y63xBv#7ML$HYxUgn2Itec$>D)IoB&ik&1y6JwtxN(xrU`v0%ldX#)WrDTSi{gAl z(|+7k7CS7rD1>4%T8n8MYntQ{FtVD7C0&O?Qv-{NK~4zxYFbS_Zu@c!XpewO+1I|7 z5A_;RjabsVt9iC2?x^Lfp?OR@N4eeESW*}OVvhk6Hw{qwW!`Hm;d&ucZgzz@v106> zJyMFy6X3@?QDGl%~+-Sa4vHx-Fh{L$(5vha5qj?1~0?= zJLEc+P{_i78M<0&#zy2acu{sjUknYC>6Kr55Mqoj^WImBKHAq9+s#YlMG&2+B|BUA zN?-D+WyU~P+uLUdww@^9Ja|!>&kE#4uLrS}eVVx#Je09lFk^5L16C?_I(l}z+%3Il zd+mtpy%Vw=VfJPk56nWivY(l_{!+6|OTgCc5E+;n%&X*;Z-O87DM6WXS9A8u&%o!S zXa|Pbey+E=^u<^Z!JCQNdksgXo;xk>d`h%9-CV^=zA&4>S;;TkG0VB^^zOwTU*p?x633lB$(#w2mdJ>!x7@ArBJn;S{Zcd|lr3wP1 zLM4ng4=c*Ii#VFf6vof;Ewrlh*X=&R9~CTGT`B9u4z|2@fQG^+LPRt!(qB9R3Q=jO zvA~Z2a}*!?eO1N>IJ$-OlpU0)T6w{nJeTApMr0G8$S+~y}JUHvGayU7?p)zLHUkQ=w_xnDwxn=n_ z=Hw#BS}jpFC&`pP4Mu7)rf!Z|{Gm|x-d>78-W`T8okR_sSEnOX_|nl`WrTP=>Baw@ zR%JFldcA%6cIHmZ^^Nd!rv8oQzFr69kM-_R>T1U!7JO=a6ZeJssFw?Q(>aD+sbt|V z;bYPFmza&_PxRob$Z!Jp;k7tf{fBG+pdR`aQ;l8E)Ia{*rkriO(&8397ez zTNW#FGVl*>DN?lyOuZ(n#glZ0It6>VrPKwGXgnDP5?a(@&nmc`2XRD(b>4P_69{to zjMZv~*Ubp9=Uo_Mjo$1OQau8`=HJ*%Uw{PY{amPB)vk;GtSMmcRU<^KO9dq741OxD zsJ<$A@U7C_3?D5s?%N1@fyk;fy%tak`zqmjW54VPWe7+x=(S*)$6TsZ=ur=krmyA6 zU__h(!Bf@tCS*Aq_De&y4$NYSerAG+_nH?p`aE7M2N*{@>YtUSkB*$7M$SjpMsMZU zpT7hU4nC=m8NHohxguL>Fmj9i^)mKYn2DH){`!-3d!EG?wP55z(;csaK1G;vf_0S! zHmZ(eR%@e$_AzJnIUcLv!V*Z$WnZIz@<9-rd!;o`VE?ZUy-AqW5sFnj7TEgvS zJY*O&#zr1j$bbhq)KKWW&JW26m{O*|o$*jYXU(*hhTc2)SbGPtg>QUzwB@5_y}2m0 zc4-=*WkbPs7?yqyo1Tk#FG%^;x40spRF21WTk~sZt~&VyreuHu$ix$L@1K(9c6(Js z5v&p97$3RpViGRbT*Ma7R{2SH1}4MU@`1$PP0pHLZd4Heet)>7qitVScGtzc-u$zr z#>1@OWHQY&xOYj&AaXT5!C0f%m@DzFKz~tqTI7u#Q=E!B|6o9{Aa-Cl;qW)>#@*Ny z&UA(#KCPBOq$AK?u^E22C>dOA+duPy=IvzeiuR$r6`>yGmu=k1b$?hx&ba5<6X-93 zf{)o-ihuc)6XV@QMYe0sg?{G@tm|F^br<-oUy)L5{{Y>4;+70a`-jf6R3IwEXNVgp zF7qhn)UJ!3k~S6pz!PyssyCwnNDO%`!1N3}P{=p$X*pMXF7hNwq5EzEy98k-x)#oDv)+I6_!+k0w%42bQHN36XpZp2VrMKo*Kvy2fslKQx* zl#ls82o`S(89t59iaJN`)r&a;JrMiDQ8MrECKT||s39IfFZY6iN(je6vadsH;aX@k zR{ow+4twrEljmmiC53uJd2%U0@U9LCtG&hY^ivm0$0TOY2P*U@Ss?LXpIA^1U#z|U z!WvW|JkgWh#Cy5g#8rDPE0M5XBhOuYCF%e~Q)k{u|0jogXJ2-ACt-^7LAL33-o_d~ z&Q%49kfJ&OQ%Wj(U8nXBPxWc$)1Ecn>qhNKT5Zz9jTrB>z-o@xA#W!z3AXf$N8&PqP)3!S))@A(+x$Hz`MWhHN)P@vK_(zO-L?9$=i=A^%{%94TIy_XwsxEK*dQv^Z#0<-MFr&m6WDD`Ua z623}O?>HhnJ5mrkTq6B)3f?Hn;prhH81f-WBiC_gI2#cdXOgTKq)1c^m^XzrT;GYT zuSFHDY{&g6PhOUAiAe^Dw`{b%bZDoYKJq>yYl!a)eHdm(&OFn(7Gu{3m^2+vJn6vJ zwughcYL9?Dy@bH$6ElA zW(JG7^ci(T1A|gou+6wyY@>8NSnw!F#y#-mq;XV*5ANF6zm`L=x?^};F=3#ijgJ0$ zXXf){gTh7(tTxU1v=7^ohZ`NAHej5&jO5QOc&;pJy^4A#mx-E~7Ez=T^E$!gOOa_q zGeSyN7pS0zdOHLSB-Rc zuBtER5u2sP#Z?`h^Y$di>FA zP@SYiiRrU@C~047*oAjl(M(mQDaO~4fX(mJ!c?km{oE9K&ZY40%wkg)SL4?%pd7DA zey}e}X6);g&bxZB_@9ph+|6rWP!>Ivs8?L(ZzowJ>o>Y4B0NIB7W8>Wc{fN}>#Mvd9L7op`@Ep-~MYi~&%=v*`; znP_@I^xH{zZ&%tdy&5m7ed!w(UFC_1ynNBoj~L$vhM1-#<++5GxY}ph9lcAh)9`J} z;ymnUr~8+%PVXInham4k?0xVf!PHf>`b;q@MzW?t z!9ooI`lWApgf-*RvulyvZuhIwDLT=9dSM1{K;6G4w>07KM9yp9bdZWip!}pw|H>=6 zwzH032D|YsH%su@fKiq?@0Ay=#B>?mnpxf^4B9 z#mt(L<>Y4v)GGI5b6cqeH-mJ6sOY!LEL#_DtCfk5(8_mUfPM8NfOmwirHVMW9euL% ziRYoKYij-q>4>2POKrXRw1r7OUv^y?u<{*!B$YIB9p`9lb3tccI^F3{gWsQF} zpMmF!=!mD*!ipU3`9^J6K8^FgAmnLVHWC+1Ymky_K+?z~|+_|}jXET{E!=Eq_3$5gF>wVCe ztb3MiGoJ_Q&OhzV3;X7PNYp&8nXhyZeI-15ShaR4r<)h+>EeUuA2#=R~!+X96tg+V#!>e76fFz)(7^Q zl$jqGOwwm=lDhcvqZrGrpL{yXUu>ogHQRm?UtcoCp75TKqyhD5Wx|#rJK$ zO#G{wD)p64R@~5}I*&aJfAMpb0zLDzcrQFY2FSMRb1ch4CHlOFX(snTI@Ld#-* zHII3)3c#Dc&9@J27Y*@J_6)f|yhSd;%48fqzriXlWa1mJ&b?%Ee|grf>0i(pO%v={ z9*+#>c_K!M1|EW5)(F$qf1C*O5=9ixM+rb`5X}=x*7R!AH3=H{owvFv!Cx1VNL*{edIm+%(`PsO3L@T=HX*W9 zFX_ExkV|btMp)b{m~fk&o$bc&_s$y`<4XlOQINFQFR{C;}o%dKpBstS7Q6sYSVi! zV5OG@Nsxl-+uM{@vT6GDC`$qQSPW9h28^0|YCBjJ4-~gzap2>T>4T{gY@}-|ax>)- zaHVbDt5VU3Zb%M$$$?OXgQ&gkg0|9cO++67zdx}9$=7aB=8iC=M8}1;Ehy(MKv5PV z;g22D0GH_@%%vlVTPZvKk2B4;nZ5`DKR<*mqeWv;GKhP#EYke@EYP)#LiUcvUq$ z={EB)v`6_`UoRJVOA0)&@cNb@)CRP}xG5#f8Nk`Cd#h-k+)(P}%Ius|iyCwIk=Mzt zP_T7v4=d$xp8OF&=2-Zy#7qb@+7meu4Z3_QR^ z@CcB%Tv^(?PBsr-+7j#tl8%G}Cd-Z=KPkjmbxyTu?!MUT-UPt@8|M#=tpGIDl-l_R}p@MIy{ zur}}!UzJJSueYtIvoXtVcH4MqB7C(d2RNi+ zA>zrQ2`Iy=sYhSf!A7a4;&vDws z{mS;|{Y9mCfP{XwbE-kEQpQ5;FuDw3Y3X(x&j<{yIvQ2LOtaT1sDt8xZrR)QNL5Gk z&H%YLyVGbXF~l_k_M^_N^1*#XWZD^gahU2-4LJ~S8(bZaq#cd`|1^VI%W(TE zazz6~AirX6v?+=yLFO{~P*9}B^ZCoWO8PEuZ-Jq=S*~6Z{lIq(X}|+L0uvcACJI2T zU$HM?Psh{BOJAFLp?iYk8Bu;YSDRs#>#lLjK>Zk|jr!{l&rfxyYmr=A^@@JPtCwW* zoPW$~8N{}73*JGb$>C$bNIKFuEu&xj%;&$y$=18YtUPE!h-O@L!wfkTq&E#tW>P&T zS!q038pla{?vr30JwCn?Uh3lK>h2OhNpgUi0+&@&^vUzAuw2{etZwlLffv=0l~(Av zUqyW>Kv3veMG3;-3=~f;sadt`Ky2FOP_*nQV#v6nBgxKQ#cv#kmI@%aOtOMu?(jS_ z**ED=5>9a|aV3kkHMVZF)%g{ge1DXe?E}a>daIu(J3Zkx)f!+9|3d#&noH5mulSHG zQzYzN+8^+qhN*V54IgFj3DNV~Pr%;M+>d2B(l%43D0?Ok`99XJRKJbye{Q~8C~tkv zTFxg0K#W?$CHm(x)1thbsUGH5sgGDV{I+W!@}q zuFjDeU8}q7*}Ov!38QrFZf%~|N!n;Abo1K~niJZ)tdzHF{?XLnooN?eMs93`iW>b! z1c0aCohE4Fq&0C-9pnAe0zn63O%xCmes{nvE+}tnIg8;vCo)vBr07Av+$f*ow%5sf zk8ii^FjBHG?zqms+wZ%bY^E(nq=>pTJJJfqC6vQu4MmO5@W@6@!lf< z2)D{gv*4eqs5Zf=r+&F(urO$AJ{UwO87$=Y+l9zP7_WjKdr$sDFt;UPAlvC5f7_}g zC$AEx#1Yy8;(?a&jG=dawvuHZ-Ic}mupIXUgSa)(5qyxEAX({Y+c#WuurZXhcM}NY zB27WyNb`3=l8l4U^1F@vbCSVuTRHcRPalGx;qwfP(~6uH#wL)@{Aqd%Vj&&$)#v;Z z{2Wf$vl!?hx5*{-t_{YrPnm5x@P6_nzD7*ITv9&ByNL!ZcCGt_6x`24rz|i)qV;>< zeTY$%sH{)yMSIAz3sOk!md?e!R%~asTOSYZT7%P=U>3e9^hH}$+kI21FG!^|?$`8t z&IZnET=yi6UpT9W=jb#HR*4!;Wj}vH;C>tBhm~?hEt&meA}viV9mygI#N4}YWhk^r zaxpxH$-LX!qJ*34tpk-|8I1H-QHE+RC*#y z_4}lvwK)E9d3#_Gehp=;^70vrTf|EMHnwgm=C}L8j!nDMdQaXZ%ihH*@b_pt36_>f zY{@&fIhOELR)5bAq>+6;wsUhdy+^xB|uYt1~IP^8tY6VfOZJAfmT3(Kd#;5qFNG0kVDuDj=?Rodr<@7Rkvi6Q*wg%uuOZHT{6w}`%(irJZaa0Thul15w9!xY#{sA*~x&HG^P#~V{`Wn7t z=4#<4m`JW@-(cF2ob`yWgs8u82`;)PgEphvj$2e(grJ#lkyQ4P%99pD^ttGSh5#}M;0VW z2Yo!&16#D^&9OO#WfyWyjFxF}W0_d2vB5cxubM2cKdU%#`|WY?GI<|##L*t$P)mu= z{7E-^@FF9)@43-Jqhr9=_jErR+M7Z2u3*`q`?xoW)R2pebJSJ9xa_6Nz1Z$zQ< zi514Xom~{_LvQHnPFn`7WYP3xg`RVdk5>vYElSs|FF$1D;h^5+P=i&rF4qVSuO0zU z4UHhGTnfXu*63t?h*E2=k4KHC%Kcb1RX<;xrAgO23J?4Hltnjrp(Vy`Vr(ZJwVxi> zxQul1DX{9Eq!e}Z2T`qpxc63#j`y#=8b*WI4;M<1*MK=W_^oD5qu-oiUwnrJaw$H!R1=JJ8$Qi@2<AL_HSi=S8_cZqk*sK^H;J;lzIH+!*gHy(Y5fhy~aFHX1UqER0-4 z$CZNMW!`b1o(Jr)L^f#rhvA+k-OTiy;!{L<0ubXuIQoz3VA~UO<%F9|cLa4k{lO)d zBX4U6_t3x&zO<1K0*3=({rSj(;S|r0{)~?^{8?O+(}%UG=8f^o9b`yz{iDT-(KvEr z{YCKi!?dG`K8S6YpIG$akjMbIVdkiMPDtW}@%cS+E1an9rYse55XYAp@!CLT#}@8W zigE_eHyC#dKfKY!3K9AQeISleLZ0KPrPgl8fqoHyj}uyMrt{f_@2IxNdyb4yHKXcz z(jL+ap9V_KY-^_VQT@Eutrs2NP~;4Fcw=zNbbS9!G8nnDPUE6PUIn&M{NQm@?{D_L z#jt35-7tM0gy|JS-tS*j@3i?ProR%S^%>_}6k%=P?HhCEu<^ITx@m;#Xw9ac;9btujQ$VoUc{nW!X#pUnuV ztH$wD<3Qt=!X}!SF=)keFY*;!l^*N~qFlossP*;DxnBT0jcGwi2K`_2e#7llB8I!M zkDRSoZM37=w^D%_%t_0c=f=`v@a_rq7xO*p9z!vw!Q(!7Q*`Ow1ezAJ0ssH0PAA)!R$^$vxN^?OYZ4s53BZ+zTn9(TL=+I6TOe- zTwO~sa9OYYGwT^kg)w~BtOXy^BcfvX;BVGn9|QA7{)#fejW=;c1I2Sa8+0hXw7u$^ z-!&uHb&uAYEP@IJxUS$VUx->s3_k2%7B_zgI*gt2I-zi+vaKAkZ?-sS5_3kt}qj5Rhz{{=wo?#2Kr?CCo`bB4P{2vrQjIYGc6b@x8)C;uXHcgf_*_c zU2%du7Z}9$kiscq!L5f)eNGve;NHgoT-DcA}F7qveiEbkusq zC`?2Ltw7v~Zh0$T%pmk)@9IX`WyDEat-!wwIZkVJVDz7NU^NXo~L9 zKMTGREjR5_uE2NdVnl{s6l;`^Bf4l6TD(dvzf|s?F8hBf=fiE-m-fQ?C})jDs;LHd zDs@^T+?u|0iri>4g#}nsb!0cFl0=;uzx+4Qcc%}-hzN54+1aDGqVNNzn{4#Pj-4qi9)NN*TqRhS2YKhWTi;T7s185=U~pz8Ns^| zeJjekSP-u$4Z3#DZ_#xE4`VR7;P^9Nc7YQX`e{GB%S)p^3J_-H(80m*oq`$ZMPQPb;2%uBm^vX}?MI z6hSPl)p#^NlX<}brnX;n48Aj%hFS)ELY@?igEzsSnMP>e4p0m-o`Z|n**xU`NMwL; zD-bfzbipQ>y3Q{;AAUt_kh(C16J``FbuO=vm*6HvuiGvLGRz9bA@6f_^VwDQ+2y^r zC;eVO`bSHE&wg@fv7ns)gk1?MG{Kx4!BvT|bSs5d+inc{&a3^js#NsS$VdSYg6qg68os3Wc*D+!l6YR z4RxB>^(OM=siIH`@S#uUbumMmOS~ za)b7h?a)pgIdrqMFYb-T0tuE!*&va-i`)xvay#v}9>_pprBG0ymg@p+)E_H%XC&yotvTKYD^GRb2i zDCc(B1UYVMu3sj?&K>9&ZWQm))^h75fBsZ(}+zRYWy6y zdQLLEnQMm_*Ij+yd3U05egJe9BO79@AsI9%&>IBYBjIzENO+ zvq3RR1cYr27XG@OgU6x;s0>}p;(F~ahJ}2JBPS}N|myx<|l< zW?UMw+XLd>a9xxNBih?9=FHsLmA>n=x4Nk%L^dM7OV9+)&n1NFo=qnRT%0H+be>r7 z&A0u%V4{JBt{d)m6a|oX17}^7>Jm;*f5Z&ZcY@aWr5CEDd`l4LROpC zKCMzVo`OT)|Ec2rInaj4Tl&=8Qp@?~mVqIdbSfMjxi4fhEr$D)ml_WlaSzUlpp2_% zwFUuA+${KkCN3TW#s0lm>|rxrM;1Y+!Vl-#ldW=O-#*NfQ-QvCNvQvF*C$&~p9w&> z?enKte_InMwLSvEGe0<6x&gyPJAz)>TF1Ze(ptEZkga5TF+6>SrXhI0%C-^0bn8<% z99}4SuP6xM-OT7AY&%j-TuV{<+K8v6ybB}=RNdr3b37_n@cfOCqDlP`lw2NEW|yi> zO(MnL5(>Bk%sW;`NUtIcIiPW2BDsRFoT^IJ$P=!-AB;!u!`UZ#*FhCxKmo6QUm73M z%8f?=wxvCUUuw15r__Z4m)S9@Bjm(XSusWM@+S1>Gk5=)1jTHSxW0N(0Zx4*+WEdw zC_77^8Av)ss`)~Q7#U@}+$=I&xR=_a97QO6l%Qr4k~n&Itvb!QA^ir@jaZ7H$bNPd zss=aY{^plABy~Q-?7loW=gf1v1A$tBuD+}c(7dfYoWGqRpRVvXZ_h7k1`yezS`RRk z;}Ol3AQ&fvcnJ4Q!VM>aV#U00c7N9Mv{gDUVQ3``tS-APiB{HKy%q18%gq+K*-3n{ z%x=F~A+sa>{{tIA4e5w@vyBwBu)9Aq1r#h(`UvMMpZFf% z#=BW9qrA3gri~_z#u*)VD}6<6q+q9xVMe5 z=*tG->_M+UjX0^VrA8}|$q@YOnD~|B7VvhF7_@+D8rG!WXVUCL?Kg8{JfGo>N6hWf zRCJwapgRMjtvsVA87l24)%h;=5>L#@zGAt#V%l{{XgUwADYfqq}W3E0CI0 z*Qg`9xr89x?xUdJxGr!=86%~3tq4)mv7)8?iV^_nyd@~OiJ zONA$<_QiFd3jAd^kNhkBp*5VAdoHH78P3VXZ?sDpJ!5QS9^$u@Iccf){0G$O4x0?P z^DW_%1Ne|1=~-7l47@vWt4XLyq3LaTEMg{@+b-guk_K_pEO_^=)EQAjRxzn1vjYb6 z;h%@+jhFiyP6~RIfG_gJQ(uJs9wYuicB*=0ZU^a{)~|?s6KCSLR=Se(d1DG8xp+YT z0KQ1){437B5%_-I=i`TtudG`0`!mCzXYkdqp5^6PZbA#2$p+#^N11OHf7pLhTSd1Q zE@z;ub)WF2d_Ef~YjGYrY`d9p`88p9NA^?jZ-l&W;$IT3p8AHd;;A5exvyqxjj04) zR8gQ}aG`e|{IRb|i2C5sg1P3i_SG$9*cdSQFGsRp-06CJcpPoFPCrV{)VyKg{Toqh zIW-L~8?1yed59fPPzdTj8h^x3h%npTsN9+0f_-EtGPl^5n(fmQD z?rSY(*>0fRIoe4d)30&ON#fsv+E0kA^)3GZZb)x~J;kIqEgiknVB>nPB}v9tARJ(W zT>k*EXOp#h5PzL8D}>3< zrAIC|Rf4q)vF<-X>p+GSP`u#OQ*b)_aZ<3ssE;f4{U{j>tJbRE{{WFzrr|lxD!E+$ z020s#UWv5zq-M#ZKmBSDe7^mtG$h-AIiXGf%`^fBtr^V#Op12%ig%Z}Y9&9)o|1F# zKn5}X%{4u7^)(|YW$Dc{ALT(ih*;vE8NvN&q=It4N&x

    ;5r)XFv=m##C-Kopvt z22z1o0Nj5XkRSfFF-P;K0uSJSDg|NZ?|jtwzG1~MAD0y9&p*n6#F-awUep)=0BVzQ zDbkv!1oq~E5BY$hOECWc8WH%;J%uTh}m3!6)=z! zf%QG9zcFfgZZY~&j064#q>-55Q}|_9nA*Z;9~P6|wOrm7;3UfFu%~w)Y31c%(cP zZn(}xbjsTwzH`!~y3?)oTT>Op5Zp%HQdADVk*kc8T(S{~aq%z1a75BJxutx)cHF5y zmTQ{TJX5KBQ4e9^#< z)%EN6)Po0_I3)dRJGZMEu+bLt^yZl|VS5}NJ*sHsr7^5ZULYLQMBjrry~CV!qvT)HG~(F;rLYp>);pEkG*QT%cDn9g%AbYlfG{us z905!Xo=$zar6jg!0l;}}`1YqcP^(Y}BmV%eO7i)KJm=bgCC+O*K=8GXh3&4Rv4ldG zmy=)5-_4#@-6NlJYVckMDX)`eUL^igb zOqWOqK3h3swN3_hjFFL%U4u=NiWTyetZGSYB9E1^z53#Sfd}2@rIdX9b9ia>x8?3D*tZfmU2#el-JtSk(ao1|XKG$=%YdNIAgbpk>)W5jtme zLdoTxD$_3I_wP|kyGOfspbFDfIU`;D{{T9Nn&sS?^3GevB%b#J(}FW(a5=07$DF}IraF9p`hF~ zjW~{+T&e!F=zb$;v&*(US5IdrXaaS~Kb>&D1il~Xei!j)k2JV!Z5GbgR*CK5F{uzF zmeIb|1a#b3*MD{3%_{Xjd8cXb+vc}Z{VSrSI7QoDpNb2b@w+d-)}&dp^44C7bv?zO z`bD!^%8tlTuwj6BU`Jv(tq6xTg@Wav!H3tsr8!$~8>%zLE1mG)#En11o;laNKMP2@ zr-xb}wZ!8YS)<<@ud0#8dl8BhTi8cXI29}?cGL(mgTK8`7$gsuwkZa~pPuy@Zbd#( zu}d#*xvVb;`0q>c)vd(ZRrEKJ+f2|%(VXpd>OY+pY%XoY*&h9IihAX$B1OC{BOI!! zVts(gu6Mw{6mI$j~Z;4;H(u3dGm-0>0J?*59r)&+0|9~fR8Th`{d$>KiWm{fxNQ4Xc?ggEYHRzb z?CsuJnPZMHS)I<+1Js)4ZvG(Y2gCQ;w0ecK);fAK&m>YSg~vGH^*sRZk?TZa-oS50 ze8%V2twuK2Bkc+QYRmI=70BIq!(8z!^MArKrrF$C+p{6MzPM;o<&=;_VN{Yb2;6WpR=fk_ zSo~|G$uh$=rPZwOX?bZk5?W52GB@Z!91ub8P1BNB70#Q@$?L^9IR`aeNkLL9m|_oa zYRF`Tz5f6@kX&t1^KqVP0{Jx8m4W{Nd-SUjVW-1qG{%3M``lDJxv1rv2k&6_rZRIU z9mnHJlJix>yS|kq2Pga4Gyz~>eBY%#BEaj*8bwU1(}&%`KY^eK-+}(^Mt)zJO4KFo_p*#5E6%Detx zbWbh^T58L=tDOG;gacgYzAn@~K6@w`zdQ<${t*upTA$tcqS{V#`|T|c{({1vBK~Fg z{{WC3TDc4TX`)OM{&QT+mVPpXs>gldyQRR-nQJUZKZ6=0J~Z8ihr+y!5+%3*ej90f zKQt?yD>mU#Gai|5#<50|<1487zVOwr`x@bIz@{hl5%5JVmlT! z*=Gs*)XFl9oL@na$lTO!-!C;IjmDvWzt`mkfFs;N=bBG5?(@%YYDrEB+HsFsh|BWx z*QeH`WuG&SdQin&e@bHf>yEV|NAj8&6{nB_Y6m&|u}txPzo+;w!?&8Yt9fsy>AG|+ zJ%u-8zD+Mu)|%ul`>nxdNFvAY5(3JyNJs(qB7#+j^r&Urp@-p~^-`xOd_Y;x z&Brwpp-@M!=}*rC9AcPc=eN?50gN`9uRlAO@G5p0&lx^~vNX+h-^4<8v6Ng#1ONB>ZL!oI`&<<`?xc361(t2SDBYjw?O8q;@nwgMG>G*bGV%-UKH;20a|7>+V2;tT zRvZu+SY&qwwLGxHu6?PsZ5RxGPvO*5UQlo1QT3@M8D4*f^`?c$qz6TkriojF-xL-Y z)+8A~G4F-b7a5?p<17waf^{C_EQ`LFgezXBTMmke^8jpXk;ZiBiKb-(L9P^KQ zo2^6B+NOl@%H!UGPad)OZ+WZ!(VjNG)Aif!9^hMPlzlMdkO5G-#(ct=lNEqh2V*_e~Fs@xYtW08qKw=OKuaGnh@ZUefNJl>Y{I# z+WZQzdvj|Tq$Yg@+ZZ0|J*Z=j5S%O5uk z>;C|K?mzGfD>cF!173}lbM}K7{yudV5qeS5M3^0E~T%W;x zD^=0F3u$AkMdeMV#w=4OCPa%Uum1o702=70Q#nei@o8%~M{8 z#cIpS+bQ9tar_|$cs%C z034C3snm`6BeVX$05+s;KF`E9a!k<2s9nVN_S=rul|~)Zdh`b#)uVZPZ>7NVTu%+W zC^F9@g-|}Gxj&1R4F;#+%gD-~?Ee4}!m?y_Nuin(&->25l{dzA7Sa4hvAEZ*+T%p~ z5L;Jh%#cBJ9F{Tx#!7A4ThP`~rk$7`W8(m}{{Xk2fjmX0T-)7g-X`$%?uRt+NF+s; z4c7rl9Atn99ez_?@9jU}$vz=|&Hg&kW8LQJS}npR21#X2>M`zA55~Dqh(8K{;V1Z^ zq4?XvcFk)SgITX;iWr1&>r6q7)mMzN!1Cd-$=W%iPKLwdKf|p{#rl@9d2b}rTrQlj zTr_{#NgJ}py8#=dYz@JOJF$UYjI7-%iTo)qJKeOt;Lz6aXTOC>+Jm9~$xQ0b-jIGmhs{mBsg0)}3zYs0_b+70;ZnVQs zx$t}W&m`l?hgG=<(8n#gY;TMyX5*n?4>cUFGnv5GYx`SUdpJ_sAuOOX z1W=>p>Q5a7aa5tp6#Bo&S33v?nbZFO*H^6}^JG~5Y%u`-HJPW}E!C<>56d772^c?> zXxhxt$gT5bNWt{3VV)1Gct$@Or-giFtXy9u4<9#x^>OIw{K@{XCjX^ zAQ8^*GeiL+e1$Q`@GW~dS#wm@_DR~`hu!)LN2+`x)1-K{jc#b?PP^x zNMXq82}r{c{?&J}Mdrn~95BXxtAV!o%c0!Nsb>0x^YMWOpK$s7b^-aC?{xNQB39bU zSZ5458Lu|4H#Ov}DBEL#@XhVMpYg}UT58-w1+I^x>9)4;G^)I@xRJ<{ z*L2T@zZYzEZ|yBU-%s&S8g`_H;S@)A8kT}`GyF;#Hb3syM4txqpA>vY@jjugXtp=d z-WwrnB=9R_M*$Ddvy=K%e-nNH_-=oPnv5E6h4hBH0x4n;*+=F%Nm1}P&ml<1a7}b6 zQgT;sRFnIcpKu+kc!yNgtr~9&+-Q2ULZJB#am435k1=u+j)a4g`PFR~<5q)l;Tbi3 zPVyZMZD%%jaNo+YNoR1U1|}KhxddaVAdV}i()&ZBtUe(x;DEYs)Y6JuZ0e5iMeadhPQJA80h zef_-K;eUxVy#qz?KZtej5NnL9VQW4t%)yBPwvb&%1pLZ41oY;+KZw5uHNO^q(|#54 z0Mp~R(>ytKhHpuf**?#u{AqcDm(_ zw3b`$;4{P{a0c~I%0z%<1Dp^@^{r#|Sjjmnrmt)4`#WkloJYWqjGij-&%}=v_;1Bp z4xOT3cxKkd<;A7TP6@g5N}(r!LdTz8dQyBw_}h7+e$_q!@CKg>NglhWYC5K@?uRhL z3IPdI+cIPysP(P=6W|5+!jBPZI_80S9;vB#i_3j)`%*?klA%z1y{g3mV2z-6 z9OYbo&$_kW#K-aV#=UQ8;-hNXWKgZI+AM9X*_DiHtX0bvP)p=z7{)2`;oV6~MH^_f z-q!Pb>LT~WkB(Y*!eL@BA-K3}{YuA5i6R4Y++EDEM!5FLbLgr~cb0FL#(G!He-WUH z585~3&YR*5QMJpBK3ne-!DV4!=4tMrNbTTvRV+%Wo!Dmp6zg8);olVM+LW>X0L3?b zX$v+Cmsb$Rz-`XeQ4~RS!-ulR>rd zifhr>BI*!3%MM+PFiPVODo35GAsiP2IM1ogzDq}$bo=!K&Hn&rE1wh1<1dIX__FC{ z)#BByX8SZUZ@1GUn#LJc)<0E`Bo_W7mhWD-84xr z`q!aerrR0VLiY?1;v^t6oOBr=bM8e>BU+bA+kQw4`;AuG)g7gt2-Yx5mXIhx>T-DL zReVpXNvHTjRMafC&o#Y_*B0AG@b0lQCI@_wKDn+3{t>MUN-?zm00?y`*>U9<>@9Bo zVaVwr1D{&-4+&4I>X5wpmX{Wj41@PJ%{ZEHJDCdnihtQs*!862E9R`VxAC zQXjkRRD5l%#o=ECYdWlq7A+>i;_=IL3lvQu&)~J87~{2h-|cyOC70~e<0zs30AHzT z{{Y!gfI7){B3iHOHDgLV(~9#zP5U@#5_os^fAB?|z^t(7HeO(3$aaBQv-K=b*1Jg} zWf<#Ex6_kOL2nq_6{rxPAKhP+WAGKs>c0@L?7T&FV-JMkZJ2VH}eASk>Xn)5iP^mU0dD9X>j(FG)@>tG-qp}KA`YLX8cd_#h=3uhq}jz zwH@DM(QO{;V3^$?QNoPzxtN6>>?_KARpJZpf_^oV#MatuHo9MlH7iRC%?&S7d&}F) zi9}J&0w>BGvkl9f5xKIVNv@Cf*0Wo$*=xnyzJIbq17_AVYK}v zSTg;l5pNr$&QEC>ivl_!U#aW7Mf*P3YTCW@w%Vq(qv`sq6RFr~^Qzfe~_f5O+7lW8{Xe;jb$Z2j`aa)G^%p{{4(&aJ3k{ABp0V|jHo#hs1zoh6KN zId8M1wqUxbKXrE@b@z}HBSzB4@0xmrqgb`Q3P_|YLS3$A-9UzWuMC22wA0K zh!}zpJGKc>4rlDmaUX_%Xpf7QqVG|>u>(ziKK9}6E-od81``16c@c?YPhv26%{b9~ zlb4tN+>u99`*!Ja>ff=)#K z<~lx={{R><;cX_>gI{=x+Qz{fcQW2yT!xv+=c7FGG4w_?>6)j-&kR_2^mudoYfk>$ zk-+}XNkh*L@L2?kx$?^akQ)T{73O0}@u$P<8?8}1EvnvWJ{+~ax$uRWM+;nA+)EpU zmhLjcU_~WSPD-rrxNg7_dD(F~0kmh$N!< zvOKRO&E_)&K&pYWwR$mea&N1DH`DN6k70E^s!PahZ6vsvmN;Qj&gVP;GoN3;R~bFKu58Xzj{bWTSjdeZ|*DU;3rN@1y+(mh1GZ78UV3?->;IcPIT!I5G zRN&x|&0%Vv2DLpx_DhL8d*c}V(pblD_9&x|pSq*$S4-rx;zS{=ekPH}pM5 zOl1e^o$?rkn~5Zn zQ7p1EjkqpJ7$oBW5=DAfgnS?W00@P&kx8p-8pM(iOxldeBd!NQu@OM(dS{-b00yk~ z>pin8467~($5BKkqV2l5H+MXf_E6Ge(Z6P20NX~zmOTp8yAguU$QjN%WtfxiUXZKx zt`GKW&A-B1O*eMwbSs;kF@Xo=5l-QLqh`))x`HVpi)@m4vSa3KZO`FKzwssN${Qfs z%s(28WDmPjN~OM@{puF$SqSNvarC3g&(f5FF-wz*4Mur*r>YS24r$Bxd;3rWT{Dby z%{fmW%7QY#N`Bmo_r@qD;5aoZu1;z-PHIIvSGH&ilVfi^y=X$f{xup&h41T5$=UuC z6i5!?)O}4hF^1&*DBHDqcF3l$%zl*7HZ8_^{{R|$HvazrpL(tv<;O$bq)9$qw1JLX z1pI168DH+xNXexQkH&#?CSFJX0A8HUmG`KlY@Mg`sXpP}iuBxR4O^*;S;QQtZ1O&>Q(YE5hdj1j-e%B(#IqU%n#xQq!QhE2SH$Qu-> zb}wFi=~c-euhN$>MpnDvT^Gc5@kf28+1#urF>Z`zGsbqFqc|DITBW6YGSGAz-?drj z_AuP%CSeFNXZ_>NZ%D+Rd7vH2Kb1deD_Z1)cv1#2-mTjG?caq{3xoXXds0Uojb~sl zLQ21WYtR1xXdj1mJ}HaC*ZY3Qs#_z*4KVg{pl4X1%i&}Zb%;0z8<56MAHMC@FusZe`{(Q4!7jVsp*Q7Ebwt1 z?Yr&?Cg0&~s|H?xjyN^hTOEsB?}Kz(tw&$fJV$+PHI2rl6jqk@vM^~a?c!%EzZ`FN zc47e_4Wq7Wq(Srl06JBy<)J0ZSvdpl`}$Ra-z`9ZYzK~%`1;mCVA+Px z*FS|QOf4~uWXH?-QYQ!3ntOfk=|;`Mn8cNQz4Sk@Z?Dg#d^Y&UeW+^JQ0dm5F0{0Q8>!!9 z0(*ZoOibtHT&#hH;sN=)*G3-Kci!56Ux_j}kA}Ywbl(ep(fY`-ftpJ{3)?Nt+|FgV zxt8YgcP%81%M!3J{{UEVUbh4!f1Z`ad>OW166@YD@pMejW8zIhC^WYqfi;b!UQBW* zKf@%3;lb$2>UtXQSLLG>Cn@XMenAn?9fY5laaN*#nyQbLm-MR^?agzPX8cDO_-o=; z>9WBViaWU>sv<79JlHtwp}{h z-~Fq}gxz_5Pn)oLfit^i?zqo5^{YT&FZ8Yt!*F~~x4F9h)L#KzM$W%x7Lwh;<*zvn zxm>Y4bR(y|X?gxOP~Y(_@Vj~usL%ajsdV3U_kp=@qFUHr-dsa(3^U(4z08WZY1vdL zEPLTV1K3rhiz~qO&2r;a@pMo7&kyMmul+IA+n-Jv5mJA`MdGAhd?Oy-q^7e8Kao*K zvv0TFzsz?!Xxl$~ie!olap_#o{3X63kB0Dd<8#(MO4+gbu%wsAdbPLu?+18;Z%xt5 zZ6N$HE`LfroWG`k>MhTd%Gl1<2Omn}{tJ9Qo8f1|?JGjMnj4FYFFoawAa*lLaV*Cf z=Z`ZVQC1(~-JQ06)us57%~WNKx*1;*ub^73t(i|&QF@Y*j{gAax>rjN#-9jJyKjm# z1;->k{AvFHp%GjUjr@P1d|>#;@ZUu6-npi0$4AyD@fN0Z>!|Ldvxe5vXyY=n5)`$? z#7en5m2X2=Mlw^oTWj|#i1oOckIn1c_pHAV{5jFQX?YadrJvgx71*Jtky9S(tQ7tt zwNZ8f$4Z(u!u2(TWY(w=<31hmPK)D@+6H^gCr#7r{5SB$p32Z~RSoqt+S6WV|0^Mo%@fdC)B&d~6G6@{>TGrZqzMT<{-WYA; zXJ;uI1PttQ%yHb3Nj*uWE4ROD(xq1^Cc16?dg>aCQMcs-1ExJOT)dwQblZOr>)NO9 zq?5#vLlxvq`G|35m6k{CcrIr3s^r$CdfBkiwWY)vj;rv1HgG<$P9Y0Ql z-08pBD5+sRq?;$R3cE(eIsP6w%{Rl}1T=pPTWRrW?R93_d{agCfhU_i$DYOJX&u2X z@;NS8^ShqHyC+YZbv3v?m44QCwZ?P$7s3rUL%p$)ZnaCxZ6(aQb(Hf1YhvdkdME(1 z07wPPZOOnLYo>SFF`j9rLKB9lT20UXH8PWvyC1W%ut&-Pr;0GR@Q(uEogU^4Z09Liptu$nrZ0%vUS>u) z6V_z0)V1pyJF9X$U`%MfD6gKZQ3I zwP;MgA0Nvel;Sh=?V4a19XY5q4Nl)jw=-Q$6}&6eC&6K zY41iu3Ixk2Xyr7C0*{uF?)2v1+7 zNUw|!Q&4%oFTFV&v8B`pvH5+eRd;$YBzi4Z^V@eGl`=VF+v}PDcHP8w{m}~z0@$=!65mgmN6nX)E*5bj>eL(|*uHOZH1tht4CRZJ=()IM1zV%K3kkt{{Xc~vuMew3j~jY>-}mrbv@{iWy$pPpa`TH zKTfq1^53V@rXvr#*P4cIPp9*s1|CoF(;6S1q+^BY`1(|4Pc5*1v;fy!;k_yr89Dc> z60j}DewAIhE$u-phC_;to4D(WmT|cBrf|9SGyx2p@_6;8Z25Ciy5+O^bJC-A+P{xn z&;)LGcE_bfA=&;psa)Vxb1vaP4F^A7l+tt7fHt>UR`>Mp#RDro;(v#Z)frMvOh#MN z+pPsy9yb1T2^!nB{{W3QZVx9k;vH%9q@z{-`#12sqCK8YTa<8KrH0At3s-Wz9x zLj-3KCD`6)F)u|^l*nE;9)RYb@e9D7J@J;TvFY0PhVPcu7+i({wZR6J2@ zr9F&uYTsiPwz3J7+_H$(hHy^qKRVL2Rxz&SP}t-TTIYOkWp%2CwV%T_diIvX?nyj* ziN|>47(bn31$H!Gd@s}1Ump06P|@R9d^M;n1|?6D3GRmPHfYzT3hWF(0Fj80$JWaLJpF_nb zjQn+^d_U6`^H|g^^!s)=R+YJP=%8ei>?@l6oP0Moh5iR=vrlgAf2oP}nd1wI8cUfT zeYpPi91eXkSRM)ZgQDGPzuTTJTkR)UoS!BwQ%|1W-%L!9sIKX=aU7PKZSHjFH=p_wQZ~cx3P>%J7nV_Ng2m}b6O}c z{{Yw4r-?pq!l$jk;B?=M*Lv-roo(RX7%HAIacd2`gV6l1C^+};T>k*V?~eNS#SIGY zQis6$q&9zVp4!ewyth$v6mPT4<+#fR9Asc;HQ)SO@gMvk{{Rg2&0$w`+I^IgLI?57 zw-JxU%8$mP_-o+7@c#he-ixE|{{WCpj8I6~`_8I2woj{WIrpxM!;<{E-%b91pmizu zZ(i564PB$Y(Bac8!V)EG^_oU*Fg7aV>UUR295Ro{n(^H~;%>F#3(W_{*0*fF57#wV z^s8Mtpj^#wA!y^gEsfjSU$y=#Eeyd~oa!c5*cUQS9ThX7E0KJhsGb6wS(F1Dz%IGROJ9m4Gldz^O3?L?xN zTY+LY^V*TVMdQ~TRLI!lKb3J`73GlYIu4(AeRZbze^Ys4yt%iK#Lq4l$$_OD#E+ND z0tqS<5uQj#nb-?nD)_JAe+1tBpIGr0ho#(c`@5^?;c@j=IUkL0K{uR%m4hPyRe{JL z^O03_p95(6CYaV%dR>jJvnfZ3AXQfcVD95BpHq@+8{%KYjW^*Qo2843JyP;*Qsh`z zSm~CA;^KGOSnWVY5maTEkg73~GgZsX`C)s3)2|Cu zbo~77d8i}Z5$zly)AN(?tuGn)+e`R+qy4{FypGP@q!6JhUFDIwA|is$#{}(AP60it zc^&zB{orlnm8T9<{PR_`y+R#VPKN3R-wnbEBPB}ZPfiab@u#)yPcuTYM$;(E$GmP) z>PJyh1pB$EN7wMGcJr*;wz9XD+gK^i525$=_o#J05ZUP3hM#M7aU3@~ti}sC*!WNdbuKf&QHH z@qbj+ziIyf2KY}!oWr5n-(5$p+#v*A+$DswEucJ{N0{DBV+|rHsxH4r= zsHlnpf7z~k;lGb#@&1J+$Ju7n@2zeg%Kpk`4JD1lXAco0gVZo#!z(H8TXy=jwa%w; zX15Tv)vBY-3a~E{zU_sFVB1>+_1bF(7M++9yjWk>qu;TBtRITLJ|7Q!H4VgY!*{A` zmyl^%Riv|dOL=)aZH)_c3ORNl5)~U9;dfty9yPy9n)3n1NF+?9)+janNr5vfjQ}e??C1H?GXTDnho*h% zG8wzj1cQ$F_7xkp(Z(~=nsS~gj;BA*+JG8ZbNTeBrI7CYY2iyAl^lZ~h@c3Fz^1V* z$MmTlJ-uod&i??fGyoHy&zgv?MruhNdH!_^oz0BU0}1PbKA5Hf^f=?1e23GfYBo7J z$4USQ$>TK)nFgdSkUhUzhF8P?0G=olu-21n9QX97+=gD1F=y%6(*elm{{YujVh1vB zAFV|x$Rj;JT5v5P5#Ba_B?01oE5hDnvgz6=~Wq7 z-K&Ald^Grd4}i2!ERQnw>Ac&!mTmJ~$?DDD*bWD3*YR(J?fh@yO-o0+X;#})w|i+! zZH5ZUK_L3o;@E7|i1-=lM5f%ip5d{Rcj5g;*TaizrQX1ok%d&6@((p|202wL`Vm+c zULEnqt*1+AbA91^c&AS;NuafwN5L4#M>})uax1kG;C$V?(}bB{^TkwZHK-Wg3h;bB z2JoJnquR8xTj{pxZjUL;FaxRW&!FIDwZ{Xo^rIN13z37`vu(F_0;6utS%h))s>)SB zsg=r}IiLEY+V-so)2-Z%!rWXih2|q8{aQOeQTJ=Jjqr!xkF7|pg#xNI8n=)hE8>5ISKbux zr-AgDwdkrWx(8ppp>dp;8@2e-52% zsD-w*URf9c^B$NS)kUSN1J6DIYS%iihxIFWYun8)OVl3ENz^XkXr$C_LaA260L`(B zN523+myw>e%=n!=MX&zU+Jk8}+ANXyU&EHLK_;U-sv&F1rFo=8jR|b55TVO10^_}V zIlwvQusmn*pTqt=)a>u|D>7I7BKqTWCHN85~Q*vu{ z{dNa)144Vn@oHP@n(TUpqZiHnou=CP7WU%@=a($+^xohT(MhO$6>8rQJ|SwpC74Li z=ywz7nmhy?Tlr)y&Bi-PBZ7eS5yn5hYqrsRH)G+QI9loUcGgzPcL?B&B9eNOj->Y| zlUVw{!EX!eder)r#*-i0ZwNOM#Wb+}pn-tW1Z7t^7|Q}`eWY%}$2t2$d`g$${{X`+ zRrIO9;&^PbGcqj)<@(DbP^`#TF;TRE~Ng(4ef$id&o&5_5= znmje&O&7u%bk3TMpv;P2REyc`@ZFr0Q*y8fzlOMnXe+jQq@oEnj{?Y#c z57y3av_awhFI3j2cw90doguZiIT;yk(-qH9jb4+Z_;Sa?It{j$VQUSpon;E!L2irt zxS|7SKs^BC2eoJEpA9r^0j}Rivx7spzC}qTu!$nhGqjY!LPkytDeFpDh{|quv)Ar= zeh7UJGx0ZrZLK_g@bAFVL-x-Orje`N-&@FlN2oH3XjI6nfLOJ}j!#|09=z7~?Axha zU3g1Z)25m4Bk;z%eW6?3GZ!~7z~CV)e)A|{89&~P)$K?2ej4YBt@VvV#r`w8xwN#J z${`Kay_%#_vNV7gAV(XFNyuPE-VJrW7VwUn;I9wb=~_*k78-4eY=#Jd+JiYKo=GH< zNhFdet#Vm)eb%o-XZ@Hkd_i zW`V?JMP*WCnnAy5BOG(c?;%Zx(x!o9fU#8@obF-%BEE&Trg&fs~SkHgy? z597y%blon@L8bUV!&lb|23>{4?aVRncRaL?uujE^EXA0fwU6+U?^@J6Q}Jr&MYGc7 zxnCboX5&z}mIN@vr&z`cl#R(dfxyNvNzHpCHZeteHNr-#J;I{M;C#{q&d`3Fn;w}o zTWR+CdrocPhTX2EGt5x}`LYlJcE?sAD9Pu6TKj9OKHsgt@sETWez_m*FY!7ZTl*py z=CskT1R8&s@%getIu|bZC5l3Tjia|X6`}CNE$7C6irSRSkdd=}a!M_Rk<5rJS z*8DHw{aa9k1xt&)J}KqeIs(k3kUImMRZ6sE+kH}Bb-&0DB>k?mxc(#j9@BN74eE9` z8jpuONu^v^T_G11(adk{<6=tZI1E85cnsf4?&0v~kItgMY}ULN4Z6rY)V0y>o<;!j z6`te(amGpQ3epb`%@7A5Sc&Q~$d7(x*^x)PP0t{e}uS#}v{{ZTxZavLL{Qm$dVjsIS zq42dDPt&zFMCEbE^{FwG{{RYT82*$D zjQoe_dkSgK-ldaT9`2Pp@_ni! zll+ZP5J?spy{V!;YGy)BM$Naa07U8r@1;cQ7p)({%0D#X2_OAxY3bLW=R%x!{3tdh&IKPa=}3NUzNVFU097JK zr_0i&A9sV-ij4w+nvyZOeg6QJCIAitWvW2g9-Z?|+m7F*I4{f7@uUNk@(oO%jYG;0 zmI2j!%R;EUC{Jxa@Z6AA%lmK)YrC0R-03wmP&(nz3G5A56w6((fxgCp}fpfvHt+q z_Mi!4g9m~!{OZhTLK>|Ugnyp3GE5ug6ag~Fxc>lJHee5@N@tn!?ewP!cMqC?AF~JQ zaZ9&7dgs@rBECn>OA}!B^vwVU9zP0jO{4ly8z1jfi^t1kEeqsL5rj|LR1IOP*mkuCk)O=c0bKK%VUwC+ZL)s2q~DHt>C%7(T>QS7 z=}@zk6*m0;0QI}nCxiH8RRGZYTi-MjyiHJE6yG=LR0B!aagog~bNJF9y+}zT+Z3IJTa#ZK$44jv z3P?#0Y3XhlsB{SkDyeh`NH-&-V}yXxNVml3u7OB*OG|I$fU)2Eynn#1>$$eG^PF>k z`xqz?IRw7o`nB&*Y`Sm#XZQuRp&2#~38PnOxi0|@EI=s~j2|2}-v6-hQ+}qLO z7v`0YH2Q58dou3Fd?jt=qOGLJHInUwAUY)7=E(?h-Im$!N|I6pe1#wmTjQ$1Ln@zOoXP~9>K zrd{A-yTDtS=PbZLk@C%K;yHrIQAFzV_+AHHXJvv1@12L3QDIt2BUS`<@ky5jL3Ax` zIx(Fztv8=goRQm{d8X>*P`+8e`N0giwSX#PjYJ^*=1p&TCVB(@DBeCM7$|2y*`W;xM~61+ym67b&jMk9=9T|9Jd#bb41Q&K1=mrJ=kJKZuL!n*+247 z*t#g82DVGqHUw*To)UNSzxtAdtO`k4E-xP<=f`4%BVdtUw%Ph%=0KnhQ_Lcn!S<`Q~FGVkLUkT8F`(CO6 z9>u8A*_P{LRg%fWb*bX+Z`KK}>c%7cnrl^B{6It))Q0`+KjrdRbsR57`{i}9ExT(5 zDAm}t_!l5rFU+U|`PqD8a(hplF?TJ)9#Pe0C6#2g@?BgVKC_4$73<=?Cz{F1tN;K| zZMgd~ua>c1wGIa(n(zgi9bNE-F{iJH%VMj>&ysO}{!r^&yc1d_iXSI)TrB&;QvEn} z@U*vpa~D9%r~QSubQVQU4XNeL0DV=FUCUA>7U?nw#Q z=29?s=gMV?%T~1m3+DQIxEN<*`okAF`&BBv8w24ERZuy< zoe;v=TA5~S#=IC1xwZ#l)7kiO&biZbKivoA{AZ@P^c=_~h=`s;_jPlG{eq}06tjTW zY4{*ic7liOeiugECgzPQaFuYQiIN;2-p_HO17 zx~_$)Q6w#8X{(e}2{JrA)qo`$e(dHyMU`-eTtbS(lnET%PGt9xdC69^*EB^VHkssq z0TvBMp~3G7g5;pN99nbgg#h__$JnTMSc)nRWwIelTcVSG+X+j_)0m4p2(i7c8e8pt zBQe{Ul{fVe?eKvbLJDx^F)TF2%F`{^@JYm^nfV1B{5~E(yLX(}1oJ~m)R*)eo;Ky~ zvKglLE}29}OnY2kK5=4#@EXX#BF(^U1b-$x)TG8oKM@WC-5QRL^y7D?hY7QA7X}A; zp&8zbK+e9aTkV`A-**|=071Ekm4EmBoZw5A?H4xVQd_vi{5rPixXyKg09KI*fP?4l z^AB2|PjJ4hC(#2X0K(h7os7=wXHOzw7_T2dsb(|^=zm_S17J+7YJ44|m60B4^#iO* zyjIss|N7**AGZ2vZyc%{a4Rh~U5D0g29cm&Z2+C4<_NlgrHAQkkVPY{<3hgAotlr< z?Gm)g;$GOo*e)e&l)(5H7NR<|t#Vv~2xEE4*?^@38PqChc1|Rq9AJwV{%Wd_%U%LJ zyIW08W^u6yh|l@4kztL#iZ^ik7nmSd;aJBDVC5G65A<;{?-Pdi5H?(9iRRo`2)z+J zNV|LZYeF}DWp~ZG6=CRtoe)DZq5m_#oeh=&Vwz4Y;a6**|s>*H-Q>Ef)IHud|%z;SybCgczJ%fJiC z!=z)g0h_vxb|>L-_20zhjXU}Y3X-(9f8P6#e#DuyGo*v6 zQ|0l>JGMYp<4DaZfPK@h`wU~r>Irmm#xpJHl&maHD|3H6i#lUgxTBNt*_^Z->%ZK81;Nd@( zmu0Nz_zLIyy%3CHn~p)cc4APv?>$e^li}4@3|;#%h$WSqcU#zxANx@12OK&gJ!|4H z*FmM!_S~G|Q7v~=1U;j?V+8UvK01aok@Jf3$ZCnOo14aJ3lGENMkwQ&gE34<9^u8_WEL9Pb~mN+aGa6DDKD%!1}EHSVx-L z9{Vv^G*p%;7sTi&&jHRL9Fq;mhBx{(V^}@(c>1vwsgX(8OqUZz1z1? zM`NJMAb#b_6;gxjmzM|{@J5wq;Wp7u7W7STa(f-Vv&aRo%xvE=z6;D^t_OS(^LED+(QP55tcFqSw$t70RNTCgfuZ{fLlzKKNdm@FS8tew8n z0f{ac#JdAL_~^m;xidn1UC~T;Hqs{Gw_p6{X8^{rySHL9Fx^R^$HK(su8^J2Gf#N$rGg69ieWUIJRXym^&71Q~-42H!9^cgP1a zP5cL9hG^<pP;?JR3b2DB2E1{ z^htqM$cyF3`*S~neKXfPU0Bo_9op4eJa&tbRINF;pH3+&W!X-c=aEfk1SkHmJM+@3 z;BGEQm-Zl`}8lI3Gng0Vsy*8K!uM%ozCx8zTY9}`^ssn z>2?di=<}TP(J_$AWj@T$#U!}u9$_XD!ofKuhw4_4V##Wc1#~wTz`H{FyN@}Y%ma-# zbm8-ZZ-)9@zS^20##*DW#^9Ujt02cy+NpHzRp{+Zs1_h$qiO`E<+;!!dgzWCA1x07 zq6#}{&$OTOE)^!FEyl&!28NLOWbsTd{FE_enR%@}^gtu9n9+*bz!e;P9SAuccvqV| zxqSMvBO$Lv6vjU#=a?nz)1C7i83QwKSe3v|Q7%F@gw5N)UybA9r%kJ&Y+~{Q*XBMg z3CU_rMDax%wKsnA=@>a2@;8Eop~oAF9PvaL6$kUU{{*KB?||E zDJPwmSgUgfk04hzi_pc38X(F1K5Z)+P5&H~`R_%+4ceE>7RN(W4mjsqF2AkhtG^6+dme z)z3UU)f$@x5ZrGjrHDyzL%a>1>_zhPz~n@-^*7o22bZI zH6^Y~mmnFTT942S_uQ(ZqDTnI%r+C;m@YxLEyM3}Kv3}2Wr@J(Wga1=73oz=3C{y5 z?Aw{gEBc{MMh|6VEjwg_RG1pZ2={de#Mu7PjDzE)S%D!16rrb*2CT|M;F$K8`noJq zJ)8g>uSNIq_Kpa2o*OeIh8XM$M{=J$T|0Q^gzYT~D~3wF4Pxn_-iKeb{2xPJAhg;I;m=w~b!L;J zH)tQWfaAc7vNA}GSIOreIwNFic!wQ7mUs>v+7gu(Bocoy*?4P}GT`+TCu_DMuvEC~ z#a#=dt1i>q`yHT0B$ptFA5GDX#jX9-ikkmw{N~4Qdq?7d?qIy9Y>n)~ipp=cq~P(7 zJae*gm5XSYYE##A4c}>{b4q{&^%)^cs*dNUKGH9a%064U_ZB>Nzn&nr)EFFTZi00G zy_orCb<%`w4?Z7{<63$*kQ?6mGqK>#=v?jFR{6@p?{4V2*FJi)gN3yNLUi7>WJVp< zogrTO466jFtM<~sBzVYG^mwd56kq}$V7*2(B|U{0k|@qYb7acSmZrPJfe+s?L3U1~Z@6^prj4^~L_Np-HgN)0jE9xAB ztEcXMy>qNN-J)%_@5`LQ3gvqfqx4q2^HoF&o^-QfF?4zR-w=J(Wb~TCsL!yPxUkD zI?~$lt|dJ3DNso2b`K4kOA~txCi(G429c*R7dnwaB(QFI{7F%oZTo_Wi#vb(#LGk_ zIz$_4Id`zm(};x4HE@m7Tbwn(gi5Asp@>g9?Lg zGB5LuIlIJ)>`NFWI#$2><_`Gl7Y4Wk5w>urCem^{3PHx=M&s}2|AFutAko#gt5T3` zS7^h~9YKUFPq~LFcu-pQsN1cKZFjcov5EV!=?wACufs%FUH$ipw>5+Rfl8Bh<%uS@ zr=a$yQU8JVo8p-YtP2ia*cji_O1$EI!V+gCWRyw9PZ zDVnO`G$lH-ll>R!8_t#>@c<{Vt$9a>rbo^R5kjpK^Aw#d6)Lh1UVJBby!)p9W>Orw zxX#scbUE@5ONO%TTc`91_t1boS>Knwst~WIoNv0Oo?g%rG#8^2jqV@r(7a(R6GiHObFDe)zAmNq*Ri{b?sz8&2Kz}D%%P;r+YEGTb-BNj zr68?6k$WcIy)F^87=EPNeud}N@J>r}XY2RZ&lA-4Qi~E1WNa!lHqZ4rL2hcpa_U`d z&=eCm<=c#eQZXs>#iW6fK8<)0+q5O>j*9&vk?eedJ!{P51XgS+zyJmGI*y00aiAVf zKA-T2?NE9POI@O2QX*JL#cctHl8a}f1U4Hpmc9BmCBtj6_ z%p9a?xRHJFF z><&&~SltO{%%%WVZr$Owf6_;%yOSFgk?A}rF?(z_H?EV~(?cfLU+RpT75Y!y>dUC< zX}`dOuDAe-3cJL0`R|^@hVVOerCm|(FQg->Lp-UnVG)wd=O(b|0L!WXHfdg?h9Jh7 z%1e!9C+^=*_+NakF)jQ=L$)lU&h{Shr^ocAa-1I@WdW`DQRZ>e<#pUqyBO59%nrF? z_I|wBRJFz5z9>QMxh&F1+)BQk!US^cFR<8Us}OYYDE#EXH2PnnsMqovOmraCLg2+)uDdp#1S4>|1@qX zw2$*LZ+hg?>%x zAfha?{+@zpVf1pfPUE|5nEZ(cGe`^20ltIt6kau?+a|q?u zd3aUO#p3&gK564nJ&80mwp8r`R$Pt#YL&GpSw@D9!q$2Qt* zD{D0gU$?=-vtf$kk2D{5XvhjJ$^x94BKy6Km|(=_0x|s6Yd~Rt&gh%YjES04=fbs~ zfZ)2QRW*6rEV9R0ap14iw}_}tVRXrR6jf?MQl&jLbq-jA-af;s`KxRb2Sy0*+Fdr> zQa3r27LTz%IF+kab`{Ead>vFEX9SR;QD)wEMy-n&+&TWjI91-0hUF}%M|F{dcMzld zu~{_f2v%&jt1-$2ZLLG^1QzxBGNg0In(5GD;al=d$N(lOl!+_)xcx&3y7zV337?$UU4@g-ang(v z-1x&+;hzs-zF*kcn*>2|TG9c-P1C1%b47;n>27r=3|3E*R3EC;6#3qF`~*`UWRQkE zhfluKSrE(qlydCy_)q>;W3-j!uIAIQdR2Ah>M%!Q2TY!bXwNDO>M%>C zK*myi4n>kqO`+rNAq4Z@QdU`MMbp{geL(l-#hpkAcD|F}jF>3ybD{UTfN<3^xLQh2(>iGfj$}zQ-Ti8gV%BK#!9N#Ks*H8_eN=6(dyx z+CSct5l1tQ-&gv+bq|Q@LH0gCi8@))(7{fz_BoE(Ds#ix6X%N#^3^)oSRVTv@%Llm zKRA3cYRwgE2-4+2B`57X&Zjt&`PqtoV?rG4z9` zjFd@R+BH=1Ve6xJqZwjY@^1H~=JlA{tEvq-y0LXdCy6`Dw=Eis!b=AaeNH$(j%m~l z6|tyJZhPTGy_LjIml${l;(4pMFowBc}^fBBzny1(gRcgrftn_|_s*D@^%9}^U z`$a`RN92kRk?n+zEK9n3fw;;IHhOZ`rsi5Bw_ESZ8o1Ba){*l!_qPJUFRFjZHqVxR zA137}?whzAb(GM%ELLosxj{C6Oy}lwi8XwNGCAg=bh=&e0~nEzn06%=$NxZ|>ftSO z&RgmI8L_X8Br}vhb_U@|>E`MwnH12@CA-u(US7Vwkc0gBcrV{_{5o=HtK_^!7%8#T zW!trA**98dyyEaKgDKKsDf!3M2zwt3EhY7^t%%ecndFC#KXsxx`ue@3wOb0;|4C$| zG#KiLsEAdq#7NN0*)0U4@x#A_2TP8tM=Beg9l$Z59jKkSaZOa$Bi_YKt4?7Fb`{ij zk1A!Q@yTGw8=lFZlGyLncw3YjuBeI)lE3fy;bnhtj@~J^gRt;_cI_51UHEbkL%cAC z>H4!RumJp_yb|+`miv(%k0;h5!`K~Kug#fZFViKR&m#Un2WXSyyc~VJ0=+CNJl?~^ zB*nXD-M%HLp^^=g2`&xVdGi$f?R>eWLlo08s=CLCIoDM!jElQGRd^(Yd66Oxxi{dH z1Vmh`SS&{{bC3>t#@~3Y7!TI_qYd1r@QiTy7W)mWq%3c#!&HK--~z31e@a8_=nAlc zr;13r_BwDZ3?#tJF_YRWllozsi%lTy_VYLl!3h<{}Nq1D3v7*tG%7m*}Eh!Qm z+Csyj+n{fG=cfu3FM}Lv2}j?B07BQ{+ggSUP|ap8k$sT#1ixsuMen@cwDaJi(+MjH zY)pkQN;Xtbaog}S^fCE>>!)gT^6m&)(4-1#CVExbacV6?1ujiK&EG}J~9{Fwj}ZE}~^f;g*=_o2PF@23XT9+SzjHfE{sRwxVMQ&{hrZFyxn&uuE? zcTvRMfL4pS2J-0Ox8icypSJoQ8bKzZxAU9$%>l4ZW}!S3N7nIF5&&5* zV3NWd;|>!Yx`T<~#=Ty;&GYN3>d$-Tb5@Wd4^-U5Z%SyqfL%^i5Oi1MJ1{3JaB*&F zpKLcM`G^@bWwQU~eK+A7c3D`DMr>&8e>F!Y*&#>Q=rfZX1@2M&bN4)!{kQRRsYTAy zM{~EgYSc8(?c2YP2pycl8-KLRXT(Y=$s2~%S%RM2 z|J)u~8{#vBiWp5B57P%s4pn5GksfCB071#{OG09;jV{um)#W>BGQ`2l-DH8VAlgW* z+{Ik|YJ!u1vr{eXc8__$=7tWw4ooZYtF-F*r{|{%d_^!fl|MS4Ey6DSN@6~OKH|?; zXM)4ph;}fR1*T}P+qn_#*`VhKbm5z_wXf{uvZA8GUx_BKGRG^MfF!78H?*HTEufWA zekl_suG4iYwYqYb-B2&11Jemh7Hi7{3D^F5vV1i{CM^^~o6M5WfXld-}~(7f?Gx3+*q^ zbK*2ZVv~GYtGjvU{JmO2@>aApi;TpV@-`INVCnLiuC^p4mSXTff-A-=WeIjg3aFuy z&>|gtGC#V#=aaGqbV*EI`D*)ncES%abN@)EDitla9!*0&BU1+<9oC+NkZUwDT&R|SAu4|H8zy58rktf(q}jH+^8 z{vK}GK>npH*2ZX5N3xc08R)4Dtqk@a{lMm<}@t)!%!YOIW& zfkbGn#TlOLF6>J39DF5!bGE$M?^VuQNSwzgUL8iV7~%cGaf( zRb>40A3kb!e&sFiyEU`Ib5_tfnlCY5+qvE7}##gqy2A zC#zWa1JdYej9$f`{MqMOYGTq~wab!tP!CcTeALZZHkV~f*1_%6Bj%8<8|rUNd^M{zn;~%!fJ2$PA3k-YJO|fX5ph4DMo2 z*61at#t35QeOPS+TfA(%1XzVQX=p&6?9&(wlnsuMJ#LB|T>X zBb)1w#kFzhD!~|2>$}~`>AOx#X#s)c*${WN)l%Rv74RoWY!AzJ--e~Kd!~l~$864~EjDV2r`XEpJ3R#orzcsJS5;PR zeu`F%tbR2ghIZpLf{A36{^pW9Vy)+6;cblG`ss!-ffR2Wrm-VzF*z1$_z{pzeR!WL z(O)Wjt6Pb_LjVQUBmFsuIb$u*-U9sD=aJAUTcR)sKfId_M2H`ZQ|+>meyoJN-jXYv zMmr9gfoC#i!kdFvV*M-J{9Hm!ldJv7o8>PTRW>^WFJ~Io^IPMfMm%rJ1iW19FX~B3 z@U|X0nlBx0^at}V%F1kle5Kf}r)i+9=!|jXULRi&qF0(U)LC@da}py{{>q){m&?;M zV>|w!NwNg8fPw5^rOUwz#EGMcJU>yS;U|~lOT@sRzTu8<5LWmvV>ESp#4Y@1^2U)7 z*)u7pwO417G*SmVjfUr)Th4m~E|OQ}skSr&DorbZ)uX@$-;aN^O- zphZvN?6HU1vmiFR78yNJTFFr_h;1h1U{|hlqg0@Zk+;Mq;dQ))+jjnq@^rEz*KF!H z+`U}vNb-Hnl?~dR^UWI7R1aq-9}9R2khC2QOf@!?aw7RJ;V9cE(JJ!eB;vYdHLqlo zPYP@&5ig#Bk7sKZ>eS${1t4G+Kcy&hbTg!cym8pn ziO=Ce-tK>9M<#^(Gr_&fxbD|V+)1?H@D{A-hev5@DkFCdO1!3xe$n6h?~)puEF?=g zTh877>}1NR9qZGr)YchQU?HVOdno~*n9LEdFw|BEw6a->c4*25Jl8=;-E1B!qk;h1 zkgWjjr$&_n`&L{w-}v6yd|stlS2$HCjUV**&rgx&)Z>BY0f6G5s15xFZPPtj@jV{3 zc;rPAXkT@9H=(?hG);>eO?tyvuFSb6iDj5lZ87gV%kwB6`a)3Ssxau(Gb(h$fMw8c zB5Ug+`PK{U6Nlxvf-RJh`w4#f!F!j*_4g}5KD)tm4pLHovxt&)byI-zwFhYN*~oFu zEUopppF0>K#`NBA;z75t+<%~KNq4P5E$;I%9nH<)<~%C!R5o~ZH$^6LE|I}2&zl1; z#?2k=Svry2Tqei$lv@IHQSxBx_APMSN7w6-$o<1v99q?0JcGH+WoY~BZ~lemaN)e$ zfxwt%S)4@I!j>V~;DG->WFE2V0{Gq;&eBACU0%VVvae5l1EtFh`OLsBFLBf1Q;w2g zEPtIMIUp$PxgLJ26Mab>8ygbv^M*>`W5k)N)9I}81cwr{Buxfd#qJ)PJ4YS%iNHs1wH0LP5ZuJ-ErWg%|Z=~7XAr@2wh zm^4=OA69qfVt_Ar8y=5)s*S$1tWtTL{Qe+=V*ed~)abUxgPt6gg}d?*(LT<&QpN#K zlvT?8i!~di=YSY9e{8^=HFp;rV7s$fIEGp)F#qm4{fmmFlREhMj8(?8PIDTunoDs! zF~Wr*ntp6y!4NZhKp=Am*hhkZtX!yACU!lXLzcLfogU&|obUt6Qt2YAT?FU%eS&KOj0P-TD zz@fSmRT=ZhsfuAtxKMD2RdV1YxF-A>qs2|QRY5MuCJ9q=k`dC&a_I_!P9Fsbr zOLZq;a3O^9#V~t<(9zRIX}Y}t*S~i)atC~_d|*zhjfMM=Z_zM z`hfi>AM;S_i{Y(O47%oJGm_w|rxWfzoF<}7a)NWhWA4}9I0b^&m3PXiJJv!ZT0E=# zMC{N(uH$wN9j(T1mR*^c#GKS~2UJ<&|3!xK_Gs{#mS`JA@xEOK^xT(<9Cw7#$GT*hg&i6S$_ ze?G$RYdRCaiH`K&BBefD^2jKT-1KJ@=kbpcTV=v~Qh6+t;@L(j{Q5kRrFLQ4Db9;@a5L*UDTbGQKCY%v6z}nXuhWX|UZc=I7`?w^_D4l5TxsB~oPb}B3X$OOT?6&xR zA7@8B3vDou2a}z$&3hd4pZBgk$Q;%%9D0L1!I`=P^r&>GXMj%8lV%PtP`lM)uTjRCYS%V0djPTn!XOnYydX3RZ zCnK61DB~k(06*#D%mha^j5vt_ufUufO*L958t5IO+r~a(X-eqihPNKq1KY1ucekL;TZ3HXY!XjjDt& zV8qe>8+_EJ8gG!c5sU^?lnGBBuBn|^C(W|Ph(02gY2(71xy0k>AQWm~IREE3hGltg z0%Y2&u0wa4Bef=uJnpo#Z!pQ%tx3uDFZtR|aB(OUDy`p)cWmJ~6Mp_TlbPPZ>D*eI z^~dZ9lD)CQ*0CypYZ@b-k=?trxUy>R7tnaFd9z5N=6vR>Cxj2WQ@Q5ac(@_f1?%JO9+_Q4EajnxmyW|VAgn_TL0DM*pb zu6gxM{iB=U$`|MW3Bx|!fCI8awPTQY*^}G*#GB{(Dv_>bDUu;hQ2WcYXgf?ZQoIeu6_iG z9=>->MvIj=8g_v@IjRff+No>d;r)J2@qbc`dfYu3lC_@mSF|d>-(U-WBOy-kNA0ro ztRQ!zBr0n|-puiMuT|4a_FCos2S(;6Mxz$xZ;nP7&WjGDIo6#8{kv55T5MHS{?&4a7V8$qfm)`1-{idPMVIf2U3GsIJr04V>OO4$&7Rcwf1vVu z#^5-KsiYgo)>OI|DO}lH7Mh}JA#3ApU8n+7%*1<+23g-{q28eU_oU2 zFw`Y)@gV`);Ddxn772G>r)24S+?5l|Kdz*mW>aP63S#5WGQ*rc&O#w^mesx&Ws}jz zqe4m$`57F}SL&ovSD3PLG#(5=nP0!2yQ4sA0^HxKbROFWTifrS#bv$0uazggyetuU z>t6>M7h@5$z6R0^3}C){2L<1I2Qe8P(F@rLJOoQd`GS1T#eHW7VB>G_yUZhCrZsE7 zDx+!=*a~}dGPo8zJzKXLu1Yb$KRKU~YSnXz&^35v9a#Pra1u~~J}BQnQ)M9#0r^=| zbNjNV-(tv!#?zUwv)r8zUd1)~`OieT=9cUz;5AC_X4AXs=5`#v%pz^K!&R7NVVJR7 z?!KLhWOL8DD#v}BLYgy^k6fE2XYA|R(PoJA$RkXun>kY;-q&SyUCTmbC`fjy_+ZBXQVZYe;UzHsWSMInB*dEjVtV ziDH{rNGl3_bhyw^>7>l7Aq6JuU<#WrrF||1iQp0j$-(^MR24Ai$|o{2 zzxY0k!>?@}Ng|7cPn5scjAr45>|d1XY31tZ80kpRUhNj*b1Rz6lm}T4l1wM%q|!RA z=h(%VMg+?)zn*z_<$5kEXUJ28G|y#QlCPm^8>Rl9Eah(P!K!ERelc_8dwjTH<=fI# zZ~|5s!-t|OP7yCc;q|&1+xvZ!t`syr^g6r$Y3EJTG#EFwVNwx}cRCme_scM)VOyzw zyA@gjt`e8Yt<#)RX{0R#i$>*t=qz+|ELa*C$x&MejNaW8XR_S^CNrIEzF*J;8abPU z(H~@0Di=m=ixxvLx=PGyHEb8J4dQY;xc>R+M4FTGVrhNU89AmLE9&Y-y*<6%6mzh< z_H_0qY)hbZwgdzSR6qm*5&b)HHuAj|vZuM^bvM{f;n@$lnNcsA=cP)&Y)=0{V-f_- zwnb<5+}g&DwmDE2s~yGCJ4TfxukFq>J=qzh;Em0C9K0a8P1ib}6A2gm?b=i#mSr{F z$~BI>4g)p~f{y7AMKdX8!eXPNtK0MG6i23|bZQ^Imxq37>0bFFCFbwVg#Cud%`G|9 zr4OybyxrmC^u_sPb-J&|<4mQ*FX*=ylPnV#qDPR45pIpp0R~>rsxaO2Z_Mq^hM9a{ z2MWtYqPWnvbQgrrvaU+Erg)FVh(|{JjeP{fC}`U-G0n2gk!yQwBs4PgV`@&`HCH5-4wRsq~d9#&4j{r2#K-twG)vlaXZd7Pu5+LzSs z`oi0`wfFuroRM2#^{20_KEJrMyqR%9Xxi@U@O9K8(E27Qw7bG%8>w4;nwse@(Hr0z zAon6p&<^(nt!s#GO4r$CiTqz_OUf9zwpp^6d7?U@l>#Qr^xtUbpmX`j9-MJV6;JVf zPq;9TnDSBkgszJ#(K9eN@Ofwk7%#~Gf9_n+`@~DDD{L_L=QFS|K3i2 zv%18{Imj(XZe>XLUEkZ`Dw*ZY6wvidLC_FQyQrDuaQ_-5{+&?mOm~w-Ehdh8J`N1m`CRUMU{jK0Np=1gJseInGPQq&JZ=rh&nxI*8w% zq@;_QeFvY&Y|ki33DCW}hUDlo$^34_0!GY<;m7H@`WdWbgZV0L zQR92s=`T^$Y2L<%YxHxCuuF+s%|_n;KvzqICIa_2V)DP`*t)=Hv@;D^cena#N= zKQ3|EGZAYFZ#Ukw{?M+tsWh?W46P3k#r6HTx8uJE*u-F`uM=UKm-#_BXknFe0a=J` z)e2J+-SlvUCgT1sEfJR2eN~W5tfq1D4#>jvZc0?QJN{hwJ?vU(H+M!tGz=wrdILA9 zZG{M3uMIqPqH;tg zb%ElQ`SfMiv7}9Uo}A85m*@Y1Q0s>Vm%e7hH60Je6-3g3qw1VX4930$BZr(T*nDDP z-8AJPV=qQOO!_*4o&P_Oen_xPGJ(FyA9D)$N)4K# zA51Uck&2SbhDBmHOV$QTNAs&DI@{;0!@s5-y0etVNa`7Upkotuv74bLPIRF0mznW0 zt3XoSJ;e^mKb~vHyOThhA^M5gq-Q2g93%{t{d3T1>(TSDtI{2O()GPEwUgCol%2gGuh zihb&cNrSiv=`*aNm%(G1TsMlCfBJ)VUTbYo?oSh6vm;UCQ{Ve7Vcq&GC*UGw6YBlt zDxBYnt^!FzN4~djlhzO-L8rUpCM4ggL&kZsu6}Y|F>$daMaeys!tA$<-|Xw?wgBWq z=H4u?fd^zG<3Y2uaVh#DA8qkarQUn!+T*tkY>Dzam)LJS)J&^oE&CVwu5lLwYDUp~ zy)QEhKT`TnJ9&adzr?wp<2p3vmlSQ6Tk*b30LjvQPFMR}p6dw%5fy!U#s}xf*eI}D zk}HWzcyv44Tyjo;az$(zu(%}pU009|n`tSM5%SRCr@bjB0$Lp; z#F*c|iU9A42?n?t6a*Hmc$O6SVLcVze~>r7jt6buU6#JOo1VNGP$iEjOReh=GUyBH zs#5<7RsT#7aRVKvd?*^T43#!4#*gyf6TNWy1H?q%N_As=OCk_wKmV!%iNmR^s_FC6 z{#>r(m@ll54Fz&rzO__E`L%BoZuW}6InJ+?;6Vva%6X8-KZNd5hB50rDi1I3R{!eq zr%UzDb0+%>@b%>bF~EjPZ<57RQ)%lHyt3!q_#o?Px7>fmu+ zijiN6B9~##4LHI`I|955rkUBmhMoVPJ?uaPu*{OFaA!yrfee)4{sqyF9nP!&j~(pu z8*^(86`k^?y{&FhbBPb-T@cJM?yiF;H^sQd2@6GxP&x%wV-}bQ0Bo8okR_cyeA&5m z^5jYIK3lJM>4@`xpy27>5u$^PL8;8{>*PV4|GFLp@Q8QRn9C*P;!he^s60*?6`dNY z9iY@5ByLYQDlac!%jx52&zS#vJg|2xM>-JyY~yIjtjcxcE}jGh_aD)c*XR-J*Y`d1 z<#Xj8`pNfQ=!CnU;p01{JNtdZ){^cQowF{Cy-SC;4`%!$Z(Asg>iWWZ@NrjeDa@+e zM`vOWjxmSjSsmH(*6r1uhUU9WDo@3ew&LGPEQy&D`2>k{YY-E{KOpYm+4*rnf?^8m zPxzhHfxdE|X~eUfiU+HW+4Mowji_H>q;TM2CCa%nhY{IXRyvx?sa2nIeD8&zkV14) zcY5E)ciE3OU`K+Uw4t-hz@+G;b{VJgVc%+PR_tPZGJ6`&(6+4RpoCJ=GhyD~ogmMV z;&OG8FB;0J$@Av@CMDI--hx_}n*{Vt2PuZVH4=RD3|u4{z|r(t-aNY9mlpAR9ho@t z0(^}W#PrmNpkHmlXndBhx>0OP1D!<$Xzjh8tN9$JDgIa$mVv7q776!W=UJn-ml&?Tp38;2=8N@ zL~kK}Zx zt5gH+6{5m5niXZwBix5Li`@Nc5N$ui*R}3A+@Ck_XT6i*Zcbq-f2<8R>Xp zY1o=#j`=w49(NiKKYwYZ_D~|}3}rgjR^0~}`pyknT`o-d2?aRhqse~&#d(bSX7+b1 zK0#ZG_utzouEx>-fo3iytIYiFf8MHerl0wzfy3WPh;ec{uCo6;@9e4FfBIOUOPwu1 zfHJ`=0UPW$CHWgxvt?35oIpC4RNI;^DMl+P7cWSeMFL=iKTA{}7_v#+&A>)MuZ^u= zoAdgXu`_sGmeQQh{a{gF08jn2w?CbaiO?p7M*0zfAIz~Wt@nQ+Es`r1Vk|F!8I5OK zC2m3lm~KX;*T+)djU|0ZFP5GN2`={gGzUI3`9x)s~fq--~0Rg2(NT<>bl9G}m1SF($6ObM~VB7ck{GLC6 z0oz{p=eo~z&ie!xhJ)C2nZW9^{R9x&oF2c2O#zgqqL$;P zT}%NR+R>fMmhJaNHhIVkrkJc}` zEGY{+Bus2@LrWd+d-VkXip(yuKmaAvLJ3o$v9*RU4`!x_^p-yRyLj-hNg!x~_(3)e zrLR`>Zee9K_okUfZ1`zV zLg%NENy&t`-EH?JvVSuMoj0=?*1Khbk+D~wPWa!kC={}%Ld&0r$TPxB3 zGvAbJooaB~-7ti{XSpjMXcI6%CWJR*6YeN>Edg`=d?o481>y&zihxzNOlvgKWf2-O zU|vJgV6XtO!;+}b)Doq!nk51WIvzb@433*na^;f`^N|K{!t#AhBs8SjC?;lw%45^m6 zab96Bq5U;O#_=GXiFW32AaPA{q_ScB`5iC^lO`$eSAx80f2px5}m-hcywX;l%e^2N=cZPc%3_w;0JV{ zz(+;_JYQt2;y_;V9#Bfxz=Qc>l7cUXXD;|pS2Rfu^mW9<(I$bT@NNBJim=-pP%>sC zpQZKkn7`;X%wSs|EOrgI1SMt>+@9*}cwCn=qEre?wIbC@-_wT1eCbsJvVfBB%78ik zzzE+R4bfsR$M4qs=iZx(&9(?H>k7d=VEJl$u+eBY$TeGHAyQLw)B={ej8oKI z38`cXyz7^pHm8TlO6vUtws1?2@!7B3D~Ux_*}7x3 z>jRsT-x^^M?(V^tQ-uGf$7w&Yahm~}q|!qzLUsy0CE7S?(+8ib@T)$2Row)UsFHvl zOf6foR(B5vJzGw1&A;>9uv#5&J+VXyr!HxwPVmJVbwNI{wcb?daQU%~luTO+KhdqO z1#gD`@Pv8^j(SP?D+qZ{4oywY>i8x;_F$1$4qm9fS1kMF4J*`T@$I=krKFR(``Uts zs@z^Oh2(QPp4MA<=Cigi<@+u>p+Mw#`Dbx`C!ODo%4l(1%DK>GS&Bt26)7zyS2_-JVVvN+)ClN`sa~?T$d}< z_u#lFAP!;Q_aEp!$p?T62F(T>E>foj@uk{vk{$PsqmSU5kDJn@_o+t~sGAe7OWfh7 zJFOXC-gW|iDL3xz{!^=M;HbKzPLE}}E(@Kw@p<*k{_`%N720U(lgr7>U+wAf9-xi) z3BAP#%9WgQg6z&G6yCruD#qV_U^ZaAswmt!TDUCN_JYqBJFScqsk6vcES{rhSFaD^ z?AgKWbEK7|sK9crMb9j+g`~M9L!bcT?256h*`aMBO*I=}A%{EeL8?IkrrknUwvD`*l58->bmGqou-)sw}Cn5&u6)CzZw%|1(m$0$kf6lXzgcOVV$J4 z8{63MuRls_4(4syT6J1j4%ig6geo5`i~DRRqG*-EVA}Qk9&%zC73*Vgt zcHRYSUeE{6t@F+)X_R#zb(ejGR4gwKk2H-X*Cb0(X_{1bU=rIO21iQRpK4U?fm_U@ zPCz!xtx=VG-vOtNQo;I`!Dav@nyRit?0c&IUOC$Bmh{&}#Z+yOCp=$TBwPr<)swn0 zULG9z4sc(zHtI=PI?$h6uRTo|dw!qkv31>jAqlS(+mfx~&)MceRr+|tfqOY9jwom| zQ9XQWx#?9yn9RA_To0Q|%r>(F#Q&_e^TB>*-8BY_5{j2|(&?9;P1#<-V?;ikJA3^+kI6~a?+ z^o1Q|pc9zZwScQ&YbVY|&llZ%$4B*|P55!*d29yl0|p_7t7_iCaFuLuKvAHyMWm{G z_}-7BRG}f)iqVpbg^35dz8nNSBnQuV`*0km(!+uN=Wt^;aWMV zc{q|KBp~7az2Qg7KYZ()MjHCdmA!)WQM8r%sZ2_(z`nv{VJ+nQ)1i$!B};1!8FQDH zNiPRAF)`!#3_D85+K)umcNdlE8J}0b{bG=Ks`854&RU#~91E~csgiEz=Wk`VGIofv z4d%q8}%ozWP%j32DWh+&}a4<{px; z8XwOL6cvfrN74T&axu>%J$#n~$n@!>zoZC?SU z(C0+&xY`A=ZZyMo)EIfxKfo5yuZ9pNQM+@}>)5yaC{z0$uaA%GwS{v#;?rEkTKWcp z`4JRjrn1q({liMXD&6+YEW$J>#0Z~_)a#M*Kj4P++f?vEYr>B z!6@zLC)xypg2d)Va*vXVk`Oi3URtf;|4V~B&XXO0G956V#D`iHAINls%Ca-{w6!F; z@uZD)>D1b{o3HTxD!DJFsg10xLoi9Gr1xV)6Fs}!PM=^kpY`zG2{f>UPn0iNwQWDq zRw-KWdie8t$kgG>VW;S*-6^4E%=0V{MeQLqD#KOZ%HlL|v;)E1>3W_W?fipc@OoL= zkQl20crrSa^0Z?8g*4y0`cOY9(4`aad>-H*^sP8AJT3PyW2>~TrVh6be#rv1Ow_l# zF`oXhFR7hs;+fk6O_wip=^N6FQiN#l6x@EmoK9In(xhg*DQ)@dFznr61yI`LuDiIy zIF!=B(ti9LYUw(PqXq4}W|_%>?_5rB${5fR=oV2cdXW zE|2nz^0g5;8OX71@hXE{UHRCmBVIG_AwF|LEOg!3nc|Kg(Ttwh;Bb<9L46oOi@D|? zOFhqp3l|EFP(wt&iYI;#t)BtatGq&eZOlFxt>2~gZZU1^B#tFvhg?hN3junaA1l~! zt~@oLv&*|WJw>@~2fO+7Hx1!b7T;k2LhpqO1-jLJCKlW>~u|1EhZi!JDMZj&1^>dXB`f_Wr&;dD^ zkvJC*Bi(OwzfE(Guu1m(XZciHK{iE^gfgH^8b>gGlq?Qon{wK2d13MDkt zltNcw^JN#E;BIKLE1*3fz@HQ-ho_cdTeSemrTb+|Y_S#4L5AyYI1tXF!y%A6Cm%p0QqN>D-QB~dzQYICpj&$G5FrK#wpL4f4 zew#R=FGr8oGo1PW2>&A0a+5mk`3)jjW*Tke+3$m%?sNgBYg5uJO%QDFMOp>UxAVKg zPSuy`C~VpyXvID259-$H^w5!IRR-@ZyDTu zYZ4uZ73gd?gI^YDQ6VEI?w(g{S{xPER{v)*I@Q&7_yGel}e@@dMxGKI3|H1YV5y zeG)i#X1#_z1&yc3mEBc`qvMuJ3zaZMkp{*bfT;r!GafTgPrdh&$7!C% z7o2p)R}k-h%V1BeKe>LLN)}c?$9()#gHhn*AJ!a?!q@YyURqoeUR_Rx@th+ShFNrm)6>HlG=0ap57hn9N z{hFc3JXTgS=VT1Yu0RNGxX=Mh@z;k~xZ_oU4Xyq*t#>Ge+o zj=*NeGvv1W{^w?nb8zlR(f2juFtp%BU>gpnb2s<3D*^3myG8vI z1Wz&Q_?41fSWt~iRWkI=eojl)_dkBm#CKj5P>rn|KYHpkIQhfbFxjBH!Z9IPR<;bH zzbns`3g;@QfwWzZms;p}aRpFoQ6D=-lH{0OnY?@jYoJ3eR3Ev@m%3eO2vZ?i3xT=| z-lO}-Q9m%%UTdZ$p??o!>xae+-PiF~xs|MZDzm@d-X*uC@je6Lr-Z_bF=Q^mity?I-X2pfxBi`^vI)WZrv=E1M_yguJI1x*>Bn#=%m zYgs{We#feebDdRU{*RNX=WUE5I8*vR-V@hqyaaUuYRO=V^xZE$I7PIV8&WIgO0hbT z!D{wTbX~2>SlUWCcgl5Ss`^^0s(At`sLtTZ1zlJdYK1y3t=iy858ArulDVb-;Y^#c zflB$Ar@YwqcHNr$tg*qH`+>DUrOhAQBMs4`$4DF9pZ+sC3=tPh^c+lUgWFc-c~v7F ztojsB-#LV|vVL^<_|PHEv-;KIki8ojJ!-(y(<7eNP@OSJE=Bc0RWY6k2n2eK7q^$$ zX^;`p+XwB#bgjqxsvaK+x`2_VHF3(xJ@(5Zr%)$A z6if62b3pq!ivqO}L}if;H65_e7x8?|kO9Be#-I{y#5;}xg!-30s>hz|z-Zw1ql>9{ zuZN=nZI6JF|MM4k-1_VG-E==G^#pHb;2FKptNcaDCVD6C&(c-pd^6Vt2O56gy8i=} zh?Ivghqm;&`l}FN3#4tJLpf>c6pe_3M&ZGk`V~JtoBrsev3V7TFL=>O>yMi~xFS;j zth$-Yc7$ilKyIN|={u%x+hj>S5_CWrDG|$65`)q9!}zIQ)+B?Xq-*HWt<1qfvXz%V zX8S_ej0cw2nmdvT;N4wKVHqwf*cp?HM@fQ8N`8Nq{QmHwzbAs1X8Uh5qr%DmwK8{C z?X`{Zw!157b1_@$c?nHh60>qVk*5|)0{eTVMA=+^0Yf@sz&HQ;!n38}n1`8z3*ZMA zWv9_48McpB1Xi^KpU%=!cl4j#2u&W{;iDYf0$ zL3Z8VyG@0X-YKD*bY~GQ3q2AT)l-dm%zgXj+2*E4N<=CqWUK6VO_oo^U5|Cb{sVm@ zm>$F+Z;bl{*^g@5dv2(6&whnVZ*y8J2vonOv-z6(_@*F}(K60$jNt?|1k0;5}#Z)8=7)~a=O zJiC_uRW~DU^S#S3*@*6(@homdmlV?B72r00=^h;XFDmPDN)k{iw;lm-xikcfdJ)Y# z(6-!K=|^6cTQ<1BU@n}YUCd^+O_*{)=e={LEFL{eYk?Zf()?4bs0A>vp^{l`qt(e2C=ENwMq_iFXl&c0aSed4claORC z%PGw!%Ij(iMmc*F@9gRCgV%r!T!D-yjV_n_H+1}Ss-k3>atGnTD7l+(e|cmvk=&8h zSb#9U23(V%=|`13F-2II;%wIIt2&0OB=lApZgS(EpD4X+xOKeispV4tc4I(*QY7CK zMa`qqMS9NUxZM^7-)(t5b+ZeCfFZyftVH^{ZF#-AY>(bsW+?S+>+vg=yXyAHiNhb# z&YJVW(pZ7@+kOP;xM2HWvH@vql8G{t_GXkt4-@)r55DC7eWBpCB<@cGJ_yqGYXh#X z|3KA*xSb`d^hn_-pVA3hBj6ejtZYEk#2&gE9pH7$tVEi8zw(+12T;KAuHfd_v& zpseY~NEcSa6f~?Dmt>Z{NZs7-Y3ubo_4VnHMknbdV+m#6CGw*5p|D^R$8i3RPfj9* zR(UYvjq|0H@Xs&0DSL)eAM@_cC!|KxPF_fQus7rJ=8*H|&sTRXfw95la9TX^Oim0x z8JeTi4D$c!r(Ybfh51C)?@h-XGbxT&w|{)oT(A|1g~T9(jc9=PrA12(yM?K&{UCl5@{+*vt7G3(x5Y4W zxj4{g7FG1%`$a`Qz51l`xv{m##^kp|b&hw450Ayp(^oEOzsezt${9n;2z`&qwI3?{ zHZW>ROeiO*w@l9O9z9W$$0!535MKM*q7+TkOw9EKvY@%Y6Sj`!BV{aP45j29UZMrdb+uoo0X zStXN|dav`N-QI_)E?>uba?bdT(h84_L?2#CbNK2<x9N64a;lU zo$()t5GyR)>!of`y{&h#$UIfZA*Er)Ve zMghl(INJD%PC>NO(1&f#^VYYTs%Kzj_Q0As)H-K(y8&pu_q1xuF4HQn#CVj(-;h!0!Wt?&gJaoS&~?13u0DG1+3aeWe%KRsRVgFB zqsK%1Ud8k!9hK^XBD0(K`ih1|-?sn8Y!qJpe$vszg2;?H#5kkI2QBrk3$7Gma=nQ9 z2NZvvY1+Gwu-$W9l~dH_qE=i0-$`;u!wxSuLu{mL&1R-l8zbx^{$xB6o)v^YrSPVd zpYR{n>+&PNT@bCr+y@qf?-v+=)I?1i_1Rf#Iw%EJ`MM~FlY4Yj6W4+L6p@k20 z`>vf%srjzA6L-)0IKx)v2q5^nYR}P6ZeRjxy{JM7Q5ao7eP;&@aQ#iDfLET!H4sPa zBAkECE|7-(4@A4~e0ito8U(q924JZ6{YP12S&Z}*w)Cj2UhE3f!VCTd)yb>iqYYfn zYy4P>7grC0KLRP#o^q+`JC#5o3SY(*@ZiG2GuYR2XgYoQ8g>JvQ8`Zv0Y17k+>Nx9 zVMn^6)qCL1R_fJ=n_4FyLu$3#IsQ4B3%3miwt>!5_r1*qjG}nKKY;({bTV+|J@9qg z{{Pp}s+;s#OxvFaclrAyCRwMKfWvS zC-g6?cI@!GsB^~ADL1D`$bJg-U;Rsiuu6Y}t|YlE0TWBbr1|E=Ce)Goi6YjFfil^4 z{3J{01RB~$t{+2s7m~3;i_*U7Gx;J;@{imyo$C|8vgkfDi94ULyV6EO5t5v)%qoD= z$l5efyD>6|wR{WdU^w(bT@R!M<@jeJ$d!|wu?#~wL%shpRm}<}qkDLvsCt~Xb1;Qn z{lc6%<(;8TODq6!dt&<7CRDsqAVZF@rRJ0TZ393?ymDzm2i`^nIuGHLX3S06?@R~H zEfXw%d5R3_t<-}QuRCueCkQDjNa{UQ{ZW+bgSkDI*QiUk7_ah zmet7`^o@U={h1^F#4jYFTCVxf^vO+nU0d%ZIyE>tDX+t?L}u^WJ>~67MIt;^tU!N) z*Nvgly8GOBcX-xzBX)JV6LJ6mQ^JVIR+*88k>w!+9)%?`AfZR`%zqm)EVV)-8W^ za>oRIOc_zwN{=8ZIxyGQ(UBo347?k{F<@iBP8r>EU+2nD@PS$$Qck+)yi5iLQZhGY zOcli}CtjvEEyK91()mVHenzQiUq;I*@5j(L6>jTNlKbntx}9?GzJ^q9v-@@AX1`T= zVfZCNPEOl=&$bj%7;DLp*u^0md#NWfgH&&Kv9x+vU@Z}3tR;a@!@-xz#pV0x^v4^>uL zY{RL|C9%5H)e05o7(BVRSJ=DWVHZ7b-rIZ~(+s0Q*PFDZJ#X$xLgJ{x6ee{QLu@qH z255VO*vj%Zzu-4g(Q2eS@FCx@VPQYrfpy(RAlS?*(MRh~-La=1QD<0f==plfVFae3 zh(GO7g`MArENA^|dlR0ULzW z33JjeF9`92W3lYIzXuPS6H2uOBOI>_Ow(>@h-Ln0NjFg<`+f9$!bj-)0NJzVghL(f z5#)|X_rfsrV;j35Dm=~e8{C&h&={$;A|Zw4AJX51?g zQ8GuU(x0uvRg*LZn?#D16E`oZVEj+i|NZR&x4ZF;vBNVvJLgy2%TDV0=XZ6OZh#Rx zo4XGayjyDi6u-W$o)>dBmqKMtM2|PcYCgq*GE`RAoel+~T6YJjg~Hi9KQUV~95pw* zw3{IOaQ{&W&11mSo>A~IO2IExo*AkZ`xB~niKT{sDJr}wI1Yc zDeg}m6Lu2i{7r0MUeS3(5h5mSsxanR`X5jy@yKxlZK-bedFQuOt+BNcvw9$^JEj0M zD&(B4=G6!Op+o)>t#-;SXv&f`d2(i-RIn;MbtUy!KrGUYVq_Xz1+C- z2f4Z{4XfI9|2?H4fx9GKe6gTOM zX!8E6U^ z;ge7F2c>p6=0=n0?AiLD(yrKBuz5;?Tb(EPQ)DWV)4pG3{Yd8WS~9w+Odz$Z-!j?; z<1FQi%^Wwixs6nhagSV=J>zgh=t?Eil7k$PoLk4Cx>`5kwn8tDME3c>1gq57xluJK zsl>nXOSRbovyIZ972SM=YVCQ8fLpTOC7*@GU~XzENVQZB*a3a~-whj7wU;)?Gg)zvOn3k(VW>>)gh1fx-rgdZ6| zS6;fCV8S(*UYedq2MfBaUg+GHjr1uoWW%IZ_i8c2@TW6Di?&~%7D&bou64?8Fvh* z>?0cBbPx=Bx7C^|C)YP*iv6neO7;T|gg&ro%h3%qsj~Ij#X7O9@y%fC*TT@LzXF+Nc5J^lz_P<-ds+( zsy<^$g4CI}`Rr-Rnmhdv| zF6TZ8GV+;~`h&#I0;N4-xjf0EZK#W*m&Zu#dh?IfjmZx@=DP>_!bxia?YT}f!E*)S zTPtlyRr2<>^WzV2nVhL47yRbN^MjW`U={y1^q=9~<2f=0C~|^u zUrfZjRCA*FqFfw_D*G{c(xuEt`Ba`I;7+dWCZV}z(W86s0qjI{S50HY&V_WL!1eti zM{pIVyK9Prhsqbc_u3_}GXDM-A__ZIHJu@|m=jA-dLG{@0vTjAm5*pV#SM+tQV73Ch)LX{u}P|R$Xx&b-kCQJyFi9B+u`Tbd6id>8Xa$8 zlq$W_MrNtz46$W`%vRxfj^3hj$4mSRj@>wzlh(p|`sB_(emqR4Qx^VT-&+%)nrdJ2 zEa|44Gjs{pd`#Hcpwc4b^AP$x+L|B2YFf^ls#ldrhDf+pV#E0N~81gg^hbz-?A@?kAj z;}`MRt)mlD=GmlmXi`Ex(>9o0g$5mkU^tvQB~UB4WwWw7C5aXFy>k)Tykq+|hHB7w z7U0j-O1$d>2Z_ob9ECFi4L$P?b2XuoTb;_95HeVhXQ|bY7iU3@g9&B(C9k~n^vH(j z4W_Clv7-{fJ3dxWULAL;BJ&f1IytTl%3pR_BPP_y1$RhF5(F zU9gwh|I(6eQoAN%%s0V-rx_r#3 zbT{Wzg2D2CmpSf@#((l!F+2~E#jt49I|ix3_!lXwIRa+2gSk;27K}iS48uyPw!@9Z zZsGF>!XyWUb^JgnnJDsQNuCe-_xI2_ytlFffSJOG6SG)_b8;a+yWBg{!E^g10@NSS zPb#}ghXz9v@v>vLZjA9;%42HYwS*)-71TDn-S*e@YPwG9@+xTG3cO-Z|5i?NSr)Um z_m6+_<_KP2O0g-|MvLC?437THDb?9DTR&g+(?Uo5IwUwJh5I1Q)D+c&$ZJYn|MHIL ztH^9#Qu>qeGpu}-n+Q0cJ>Z2&gzpP&+|xW5&c~Gc1=;RSdG`A`JO|zL+qb1UO(tC% zr{$l2-u?$t0Cn)d(I)Yt;6PKpoxa^#UDh}ke8hNPrR)iv2^hR(Ecn-J= z>Bbb=7~k(*!CHv%0AL8d-0zTCHI600R;j+y+QmTBo!eYL${3WpddqQ4N#V&2@jcK` z-eOrK88&GZ8Kj&;VR{|AOI!WB3?35mi&_$!g%X{ zRRo%d!H64XcZXb*E)UeBE=o;a29w?WCe*+TtfwqU?I^NbOh}jXAyei*FdMrbBjXZU z6@X~-b1#pc=J_|kj-Gf-LV!2TGd!I?IMTj7#q>SnjMtQsZ^cprWD-4P36mRoL>x92 zwl7aawjy~RP&TsaTZJ!s6a44Z-vQ_OTKz@aAUZSSJQ?r<5G0hcR!(NC0J~R%$L2!f zW{fw8%rmxpL1}y8xw7bY@M2Y5O(?XD{N8GH?~0-;PiJ=QSS15VqHn+>~sZWd?>Up`NrUuQa3(@WCTo&hNN3&8x z&_OJ~RDJ#gtyKpX1Y?9efyBAYGUR1=p(A|TAQk)z2$b^ddT@hxyGdmMC|~p=3`7sXMe$Po4q(?I zJ5*X*4Kay)Aq!|njA(u& z=6eMno04GB!ADDgu9)`oEch7pXL+Gkyw3%$%dh!Cozjd7(tgyP)4~hplr}F3e$@oaa}u_CcFg`y_h{#zwBd z2co-BPtF1EKEnhY5FP180%Z}IgD_f*_vzHfXW{sfQ++ZW)@7K*bxGUt5VEv)RM_&r zR8?fD`nng@No>u_ZU$)2IdkO}{n?}Sys4%Yx)C^K(rV~(Y^2HcaAqLXpc&xGCtC(? z!7$NE^gTr`3yDCoIx_RS-Tyusy2*0IA7zSv3xAtS%!kWtob9iZ3Ml&u{wl=em$hUj z8t57K)lR9G*d%VimM7TZcjLD=6uU1Rc5kN(p<`V>h|FP8woo~AE^1>yd=af^(vFU< zv|TLuD*D)pu;qJ5B{wwttXH7k!?M#ia~L?ss!{SI2fMZ~Z1QY6am{hdIca`mE6H>3 z@w3~)UF+<^;c1WmKx(KL>sfOrZ^5@OHquF6o;JS&Bh)v6l8k`CHaE=0EzIGrzMC}b zQ1-8nS{lK@g7j$HCydQ~>~6GFwx&e*6haRWVtX?xtqX@>%e>}jl^zy%^{wOX&;s6t zBPIEFK;t{xi8b@J)(L9ieq#A&F&U%VkMN{a34)r#Jq&hw08o0@DNGf zh|m}9th7Bd4*!8xrp>m{p983I=Y2Ra7-vz^nBBm2fF7XRZ(rA+Q`pz;OX@2V`G|!+ zhXtG{fsq!GKoAN)2-xL>5A34K!9!s@LPGOBd~GUefp#Va3x{Yd5b{vqQOqYxgmgIY3dPzcK^5&crZ72HGdtj;bc4kd z5TNEdTCS6nB)vT98U~1xiiy^?|JJ-uQGXyG;IH%=1R8x?b)UB3Pp*!}!QX*w_N1B3 z;M-Yd&rEQ1P*`swjw|p~Wx5E`OYW=qiu3%Do}Fc;X_vQG1ed=>9B0C=!>s*6t*sr} zI>)`lKqVeEWs+Od*jKSHLkhckwVA7u7h!t&N_hG1_taC#NQK|uy}_kH+#5$$C1{2r z|6qPQ@F3L$Ydn`EXu3np zAqD90>0?JURcgLRXWoPs{IsL?kbcrSjSH%Z=ha7)f4(+*{lbo*et|X{J~2tIX$6F% zFG?hxZ(b5sEwMpwFXFIJh1iLkMogtTV6m%JrMd5|fQ6L8YPEJ8!oZfExk-AU7j|^4 zsSW{0deqLqd!ee;0#eQr+xZ%Rq?J4Z!k&qLv5LP56UO5b3xSqp2uP)SufTZ%Q-QBT zv4wTzJm)ZmS?aJJVIaBZ1@A+cK|1%z(Iz7Dh`e(j%)W#-OTBem#fOEP3j5pOSqIPD z-d<@I6&87n>jxbeoz0XJhe2?L2MNdISEs4jS`Y!jjj^3Pt~qJxHlU1JA6yFJmm{C0 z{qQ&7N~$E9^|Fk3bSJ_h97B2fZRUiim{<6Z8rGHP9kYcaY{F=xKNwkx@0cP|S8`yEGiB+`*LfziYQjJs8DetAcWYvF_CxAJ{o}!)>mgaWquUwT zF|WdmlpcEkz)0)9HebkeWC-uuUFd$^%PY0`Ky^91`NEb@3vQd=U3v5K_U<>q7l)m^ zSWfJQ>pN#p&#^Dby@_Jnu;bab-2=mN&ee0x!{Awb)xZ<9al~qveA%!p+1#i0BUMV$ zoO4(_by)S)2eg(8m5tfKt2uq`8>L$LuOw{2Yxev7-Tc81&OPZZ>%QK-LQ6>^? zCT95LxJx@`zwWNMfD2pP)e)YfxEGXK>S^#d^CfEqy|(GB?omcGDQH9kUd`QGf84zr zC*EzteFImQG$HVEAN%G40TLW(kBA)_>^*(v&%6+Iu_hvSvBvJ?pD0b7qptkxH*!4d zCj9wV&mS!~BP&kDExi(3QuG=U=v>^N&dv zV_*kT$EZ!^gz4jz3fGPylu*zUce7(vz;#`3WCX(5cLx<7`g#7vjrHKIu5_)j%U=iI zB+Nh$FV_PL2dU7;1C|-pQVap__x#grm1G)k(k3~dZgbimue>Lzr0aQd+}v%qLu&tw zUbLC4t*A0%{T;L-cj2QnLWL1EpLu5(=qF9?3=deY$(@1t*53>KW<^TQ#gSzt-;%y`>oBby21LT6DOtpmRC$#8w{V zHqg;KY!J;H@X3#o34q(5ntk0N{r5Qgb=$Nj-IDE`g;cnOMH0iiDw_{vRz6Oh1`$0{ zb1IKQ731#Al7{?rtqzWOjty?L-J zd+PqG*L5RGh*qMs{_~Vza`9nC6zA_V;;{SmFVtf8j%))?ZA`%sSkz3|f=ibcBWJse z|3n**nkB&z*km*zg=GN;e`2wXjgUg-C!*2WEoBdt$+$Bl_Ro9Bd}p+xKlIk*V`6$( zuciMXt21z-8Co6tFB89t0ntTmoy4=#pL$f%WuyQOr~QT5XR}&F8I?r8QZ>uT#wrGr z%j*;Z>ip<0HQ1z7W$)GmC!nq~tvz_Cv(_q$Hka2JOz;CX1rK~iTf9{)ljx_UIeYd&sNR)g1ZyFw zk}_&z@b}`X>unMYiB(`BWh}QS>(1Fn&aA03Q+T!4D6A1hAlq>AmMP-J*F4 zj{n=VfP1u|`nqdQsrxr%nx?SPqS|?^&6*+{QzJWKk<0*$3Lg1RdiGZh*c=R)%t_Z> zbeJB;Ij79vJMQRq)3io~+q$SPH|^WKUHEEdR32NFxoj}MuyV<>oDEE=6rr-!t)5Df zTh+stg*vTYU_;3{-@+fDm8iDSZdxsGMr7V&6QT~^@Wc8$w9!k_BM@=P$N(TYJuG^zwSk>dm<0%}qu=c?FSSF*G&HBBeP{%tF%K_A^RmUtw z5?M%N1;Npyi#8}i)#-D+IIcWu+5|Z*)&|IbdDj>Z@MaR0N#oljtz^+j-{QlXck?c% zN<%wOtARn;vG6LkWAcMEs=WN9A*a z^cAhDKcx%vKpx>0`?e=gUibK}p2h7~jbwZ-xy-w8es?CU>kK+%=%xMWsTqv#q64)e z4o2~v&;V0etrbhVC=hCxH;`H0Cj8wa7r07n4D);R=bts6Z9sGCn&=N`@}bX}8j^7? zg*U2R`BP`p)b_6ZWlf?wg5;Bwvd6e?&vdAWAGwZGh;9g!7Kht=i&p|r(dM7@sq??% z$W+QXK0UZuhz*}xr?A?9^)_vMCQyPd_K0@RmIM~MHFV90v_8H}ENOc=z5xrKhY4+u zbG3%u^4y9m!!%m~>V4q_jObwc^jwPJ)?puf2C)DN)1}T&L7KhYzm@DLW(e$`<@}|* zLvfLyCf=>Ib7Df~R@(Qw?#z^?4>*4GqB-Y&dd69@RW){Wbj)JI*UD`y@zCScaX@Zr zgM9z6+6_TYyahwSE1v#>k}uUo3VwbJ=1SFsF1>A`sCK6R;kms&;2D}AX0|V#uYD`` zq&%mvaN|D^$TIqetoU(a=-@#X?#)eHoRj!yb0tPo5dV6M_v5kSITxxe))bgoiSucx z?U#_IZ_vzV;3f5~kN&_mMKd=DLCL%?+rg1=Su5=+qNEkJ`^mmT7=KfDd+Tkgm{``& zJxk3zR_pqHx{Eq zX!oy&XV&4h977IOC{Em33pS3b{0lo5g<~QQ|Gntcdz>X{F55dyZ-klec{um&-z(AM zn!lV&%=fi+E?EN0ZN7V66q4*4X{DSmy2_Yy;%-tc@^BCI*heqg)?09GQ5a_eH*I`|S6*PJo$X>8C$9T@2t4{CZKVPi*dNj`Y-feR} zTCs+U!RyELEYlrG$Kn-e)bh-ym`8f$nAt4e_@Irr_=*GALLPwpnpYgmKQ|SW_&%v48M{4Qu6_)< zB*|k=mf0lIJ;Xo8xH4H4ZX3M@_KE7edhJE`Y`mev5j0{W;N&7qmve6^zjryyrxF5L zhs$z`o)%^?0sg*r+?PX{7hQOlh=OcZobO1kw1UXo1j{`QedTkbbdoly2ygH*n}7z$ zXKMcAPuDUnsV(A@@*m|%g?2LqdG-2VjtQN&NfTx>ljg*CqWgup2&Nlz&d0yp865er z#+55TBSw7wInTvx%q;Z^Tv!aBZUEP16np#f?h*3TXlgQT>^DYyYeg#F>0wjL(Lmlc zKwT_8znJhfTsHWQHNvW1X~^IDR~l-lvbdff7~==tnmu~I!4a-#g&{+ANs8oF90X5R ziY_&;sZ5R`{wb#7rFuSQn;{e`9U+>0`mKp7figx#z>ehK0@V`Q7!mvFQqO4nlHAHP zcYwSs-{?$Lb~L^%_AQY~k`$8#B1wwyX!J@@$MTVXYB`Gz2@~z%(OpYbH4%laO>pP2 zew%#neRP`1!tR@(tuQOK2=m7$$A@ccouG_!-J4XwqEs(8nsNAXa!;7peO&sJBzd5T z$ko5rr)*6#>i;M@>#(NZHj0Ckw6x?zK%}KZU@A(8FzE)RVT5!u0qGJDkVfg27~S2S zBSs_OU?T^N{ocLTwLkaAzSp+rdhTqB$KLX}__T1Gv$g6wrbf1Q0O+59r z(zFVjlNyFpdFBeCQ%lg~It?0HB7*;1lJf38^czo-P~at~nEtRO{BB6peYYZ0ZFlvK z3>T1q_qkVn?|eM>1GQ$NOnoFUm+wLQW!0l+ABrmn6?Qp2=W+6NMTk`TnrI;xYN7&P z2K_P*R1Q7Dq4=Mr%j-DG{XmHEH9mc6ZfGnOv~?EM;?d*+hV8~%W?Y?>_fvTc`j$$Z zQaSjuuMZ3)WEC&3nOTD*p@m;Yq^qy=h`Q)>qy>W;%ICG;^WXXim=`3Wa3})F14W9w zJMk+hI^K2ePUjU8TUe0$hV{-?F~^GGZ-{r;gx|!uaL%2zLrnuU0)oHxZV1I{rpd^B zOWugVLJfob(o--jko=6JX;9v=IRxc>MNJiGiMHEjH!6tiyETR7WT)%AF!a1TuJA2@ zW-KGWmap})At?vNqzyc9twNj8eM#bp(e!P&UnJOuwxyLS=$ zcy1?Q<6WkJ759`KUD@cLM!Ode3LgM{dYIXk?9W`>SDSpeuO+J-M?Y$TTm}4nI>P7A zrV>c6ED|jUaZ>nYkmXp3j&PEA2#(m`D3aJ%VTA&2PW~Bd`WGyery+7b-#%Mog*$d1 zB+Eo9pbWa~J?#U{kp7>fC4v<^DuF0sO^9)N^oc|>#%RY`ryr)77(`XX@O@6`;2;J67R)kvIhsn--Zw%7P&6!`TT5cz(m%Rzw)ODnR{v@H}<3IrpoD;|-| zuV^IXUak`I)aRDSURL5Nf*f$%IV|boKQvB!oO8+V`Rmhrd=Jk3Q6+(yzU2tofkdb0 zK0=#pYS?MqNlYKhbwxJZrDc%YF5aqswl$@RB-VYBozQMzu><5VL6fL8<$?n$?#AwZ z)XrVpnH3*vwS0L$z_CpqSbj3u&;RsgExv|t{9-K!^o}l&sWVgcSH$*d_xXfib?p!> z&p=9Bn=~F?WQsX-Mu=k);;)LW4Bu0PJxNe~@ejC2-JwBZHa+@9{{|;#|m`mBv zj^f_npOLq!5)NbUEVCmtu4YjT(?v!0CC?$O`njhwokqY@+WmK0RB4GG1k^< zObbfJAik)KS+H<1L7Fqf$KOc5B#kkaRVa|N`Of8{#W zO<)AU8sS6`JBqyDxa1p#-7n}j+Ep9nUBUz)%3W1H)MmS zrCyNr{QBbK#SsbdZPm|m^F*zEXhb#Sn$p}PtA*s0b}U~Iv|QBiq3yBU$o|#@XgNj! zwOG4D{pjI;cnvk#hm4E3J6L;`x>wMvpH-F{cLr&;K0bo~+>VU(D|nM^TMMOHU4Ho` zH(DZWtr}cxC?1?}`dQ|Oj z-aZVd@{0GP!#ihw$zta#zIRgBUzkwX7}Wi3VZf>3-`t2qdtXY zM>nqeTUO%InH0tn1?_C?2fpZeb`xhlYII zeOI8)BBl$~oN{l~if>}U`ES_G)#=q9jMg(hkf`G4PS6&ulhiZb+0zcI;J%*2R4RDO zQ8NVUC-!xUm^~PKjiQd0bo~Qym?BPPZ@T4a`QD$%1(Hxt_xjFXW~*qzh9`RthtX{d z}Ij-e+)$Fj&-&vSA$fettiR z+Va@hGik8@JcNbf0`HRnYoE+euD?)YXP3&!GKugp?&gNl505#rUpJLdtVS7_R z8AeSWROc%=Emm%#?8Dh&sXiK4Tc&3xTOK%Z_OG>r;OFHVG3q<>b?|VPox4yV1eH7F zGF9h`b?AmM#m0+hB4L1*N{i`cfhE19gp<91Jg*Y3L){$?8 z1G5wV*+e%7beDr>=>ia+D-xt*yl@dP_V|*ts$F#J@Wc}T8?A%}gr|*tPJ_FQGuAyd zLGsPlm-YIdhv#M;Nh$?si$Q;pgp0-Y>C1Rt(|YCQxx?#PGv)Zd#!^oJmX7CAi+|m8 zEqXI8Fx+{o1nPeh4GiO3I@CSYBja|SpWxYQg@jwadSb;exgO|&>?j$C3Z%U)$Jy7_ z#HxkTVEWPQ1rFLw*_`3L_DO|?X8mztU$h^NjEw(>=bd%LQ6he)BK{7=yBQY~H`*yL zTD$h98o{bVz|~c{)8w>NO8I6}sc9<9ih^dJjpm|8^uEvp%kLU?9@u7y4!3Q;7AbL5 z8`|z|kO$wX`jTud;VfGI*Rc&|yyoC{os3N43_rWaN2`gc2`k)|;&#{;XXA<9(B;y0;@Rf+Gg$cBqG=bAJXhZOU#Uhx_&~{oRIbY0zf*Sc zt?NNJDaNpKUMNs}n_a}TdG?#L4|_pcfZMZE!9P#fq|?v}SD8mVt|Aeew^j^!4HcBE z;8PA96)SKWSF0cr3fW>>3REkGgM-CqB^;OpQ9yBGp%yPDagDdWC;ito<%8lqGxpEZS&(DT;ki8Zo?U$x;<4kymo`|?>DgI9AkeTraFj^2#${<#Q`xL(;@kmC+b^Nj*smiR02XEdps~#NLb7xC! zVf{*?_1+nfJpIAGd2)<^eHAR&FO04~Jk^`IDm^{TbXN;Me#K}}^8R(7mrQYG3%f(H zR<2xtZis`dBMQ!7wC+oHHQR*ZnG;I?<^>__%<=Npt>n^*x#y0Z_#~P_z@Q)8$BZ!V zplDxcwz**~CG?nZ*8ClhS@^npswjvCfk0wA1Ln-(qS>7lcsnS^yuLiTcIoXKV+8?= z87LnYmKD6b`}qV<7N}*$P!(QPkRGwP!RTUC5UrKCP3%|=-E^kwpB=tUi!VG9d7UW88f0QWrJ_25q+gMHUPy1;{jt1OSukQq&&Hui zz-{J_V@I5y-w6VzT@z;2&vV(>VD%K@qMF>&_LRzG|0;uH!?xtLxCG6)Q3I{HZ>n3k z5Vy<>iTfIwaB|*H%<>L9!&m>|&E3~iWBix%7VEFRU|oBDxOLS|Ab}75c|s$$f#`Rx zm(^*=>Py>anu&7W-JD!P^g4Ko~&~ZBzCAOLeDP z&qfA2?4vG*cg%(uKd%V+n@sjB;)}^?Xc5oDQOuZa>!tobwFRSwxEO1)nuJ%fJr@&Z zYFGJ~R)a^Kw5XUboig>V*BB9+q5JbM4I+^kF!K=RSthf2o^&`B1lWk13#L|vZqj$K z@7OQ2;~*(I?|2!y2Y#VfnD$UU5$kO($ilC|>6eahWz;k?ZpmNYTe*z;5+7!dw%{zX z3HDcRSR34Q@tvuYKkzve-9i#s&^iw_6ADzQ>Z__aoO@{7Z2vnG_Ptr@ZDx3VBM9{OqgWeB5zM=6^&(wqr{PH$IB4wja~?_;m+s24nW-@&tnj>vI?@~JSw8OUd0ZBnP*^Fv3`q3|8_X4Y zeU7G5IfCHog>5moJvK-<9n0v_f_H=E@NG*#nIBT$Sl;E0M$IJq%$-{7Gs)I0Uu(~K zovx^Ct?5%qk_!MS4jbde-wcu#B`orM=lmS~V7So5w0iFeTUf%>Ko_+{7wejmu$+Rkk-wpU%^Bj*V zr<@K2f7N8R^wGC&Kt;a|nN~%X=#=FY3@!YnH!(?iv^r;YPgrGT(FY*I1?`3GkM!lt z5k|l5feo(0cJm_oQiFdN10s|4ltNPV$=rsk>+lS{Yh*w$t8Og-9G4HSKgDM48{x_^ z_uenecG*uwF7e%Uarm-F;5PG|cdtC=ex*p#6&baS05h%Ter*C8aqs;ma+NvLKj$Z9 zuGoTf9?bwa*#?R9+b3^cJtZH;Da&=FhslbKx@U$7{z+3><|236Xz{)-0EQ{w5ypcf zU8rr>L}t!&JfC*jT@We^(@LYua9TTgLRv7)ys4Tbx&@w9qz_b?#Y*_{kM)~#WU3>i zZq$Gxr&ZP@w6Dc36YN*{|1NWeTvca(XhB}=IalXZr(u}(d0J*`#sh8_4PxXOO3+>Z zx||YrCTl%}swSZGjZIShaZ)3eHeM7mHj|I7o^0x;^hl^Eei)St>ND(=M<@Nph|Hva zL@|~)7r=(Gy3gD{G`VvmDba>;&vJyyEM%v2SF;4JZR}&;F*E@2(XLyCt&J@#RoU12 zN4Jf&WsY=aA3jBT5J*n+CydbtWFyvS+%?5KEPxoEW!>-h@NRyPzUOdpht%+P~3R1kjs{4C!M~euyQRSCl;xJ=&0)JD9^rQ~WmL>bd?D zxTmRouKVi!i0GgdlzWJpsBi3A?sy8{a2=zaILJi1rcrM4_w=_(#f!75t+XwdXP-oq z&m_Ktsy%tAizf!gUHcVngskVx5XEDc!TN8PhnFNR=+Qprt@fU;x1CwO)VMS<>0dQ1 zYJ6ppR?px{(B<8y6%2`Z|3il2OFI`5ZrF*sj+fV}2ugpQH*o7*oz5Pg-Meq%72-l~ zw)P%RO;|PiIce(KaHfDujwFHe)#HzK?gBab4o2KvHEsD*oXFw|zb%VUQ8e`coH|g; z6BhhUf|Tj)T$b+a<=}a z_-X9GC2!p`4FUxcNsioZ|2Cb^XTJ9;j-KTUu z@55yq)VIVO^;@Bxxq+gD0NB;lltNW~_Xh#`T>V2Xo{tQIAyf}33~9`8arQxAy!j&( zaZ=$Cqjx8BT0qt*?S|3FXQ>kM)iJWeKb7V6rf<$vQ&j(TzQ50rN^>WxzoO0?yZ;`{ z(V!hPAv$Bk`llsB1^5ccav6A&*wQ2}y}_HT;c3bLd@(1jDH*N-2ce%d%FkW(E_u~Z zVkgY`vih#459O+M^>0m$zeSBp%(u5j%&LE<4{LpX;DA4jm(LrM*q2#ch7=jhB}aRd zIrww^y-m%A1xNc7aHnn0{rgCKR@|7no=TyfB=%AmBYUE zKZYYts$49MJ~u~4Ftb1Y{3G-=p+2r5o6gr_Yke)9)yCc_$kNyhxhruN&Yj{ga7axeOceOP5N08 zVM|Cc-^y`M4uv>fZMP@vrCF>_+OXCG`ea6cz2a4h_}4ck041GB7%uMrf!jZ)_H0id zdrU039ZZ3w%EOU-rEz7_TF5)y#fD+w8bT(2mk3E#Gh0#@?leC2LDHrc@+bP@egWnR zqkCV#uv*-(^5Av0Rc5AMw!}qH<-qB@fHM z=Um23$_d+~Ba@)-zGJ<{gLz2T?UHZleTuxTC|hWaVRR6wAL_Die%65wM=B3wP|k12 znT&)A8!*BYiv$a;;)uI%Y0UHN!0c&-OVa~v(o=X%0YB#jryg65h7XPFigNSG5JeND zn7g5frlNr0(}-5bnvt!00&^5wRa<+W^;`iv@NnA-O?I)1$DynOCeuHsSsG{PlrpMwg~E`zc~HZkfIU~(^_>=!Q?4|MwQ{NJkR7+hF{!%F`3>_8%o z_4Bs#7|<0U6k|ou@8d}0t~(HndPUe}yY21f8&pT*xblOag|HP)mJX6`IHCSnkGUA~ zI;LR8Yh7fJWwN5wZ0ONX*5(=)?i8m&1phHjjA;GI&6A3h_|{w&v`B%kPXCKzp#2iG z%6Ma;vZ}_bO5gbn_&HnH)3??@;WMUy&Ec(Ac26u@_hLdd6{Ie&wawGkR2YK0V8F(N z%&K$YSS0r317H)}p+EEbV%JFKa&xJeBH{jcy!{Dr{hei?YP)IbbfE0kJ@t}Pvf{6x zC%6AH*RmnL21TKwxtAkR8>0Wxw`*?W{O;Blf8sd&2+U=nt*OVYKA!TP!II(vb1>g* zwxnc~P010V=4;#)=h@F$Y{Ma*3yy@rUwz>4>tR;#EBx9aQ{7mn+2SpU97uRAS`T0N zQ0k1H0tJG0-Ur$h&saxrZfd8R;Y2)@rhUDf>*H#laC9(Ii>;0?u+%Uf5X8{4a zoH#Qhe)nUUtCD8MZyEHvFC+LLuhPtizQTEGBM3vTc=(eY+Ctb5DKdu6CsY|}CN$_V z)R|>BxOR3}p_)`KJYM_3g%3N9f?8dvB6R{x)lwcR(xBm5EZ+1}K~N*7UZdMkLtD0~ z+gXpjD5*7A8f%E!PxJ-il_j7FD<*_4{K=-O6}iSQzIZQAH0Uou8cK2s1>OBv=+m&A z$!q)cKh&w0e}Avx@C7w|FWEOlYT|#mR(yhU-t4gRReFKR*|kTOMMF=BGR69S!MfuT z{EoF9STqtNB}ywLj$bM$j>7NtIw}PyL=UQIUJ)pO*p>_ynVu$EFQs)rYMwe7y>38( z3~)Y5{xY8M;HI!OaQ!HAVa(#Y_Y@ttutG_9`vambW~8sYJFFP)YqEb?(+r3FctIGqc_mXF z0n@0MZSHzd5`7WXa4)sf8_Y0$0e;K~lbmaREi~N_BeBY<5CTim#_^`pJL0jptITTV^~v=|Icu!XmTM zueB3c_~1>oDr@5FWMUAv{wF_@IE>!TDN#uz(Na{qs28q?b7Qs7c`H_gy6bdDEWh=$ zxLJMFr>Nmm_t8gAA9cmc0Ty`56HWW(UqEiK_E?R!IUN1ZQA7G8axuKp_=u%3!;3oZ zq}nqp)^PSAt+-|K*wd)-UR#^D@jrhEgUBfTPfLxD`d8c!?Z61v z6A}u-*vrue440KT0t4PGlO^TGh8rphgR!21r}{V=Lcs@1wZJ;J&<)etTD)u*yiFX_ zWy*N_q?7uH#Uj=#$Er{9nHf#{JGu2EDQTGYk+-{Pr5a7{i~85x+F~k?Kkti4O?!tW zJCX?>X|8`glt^S(Dm{kfW`WDqc(8GwP5x>dP&(NrPQ*#SKIa{O0qT<1Z=CONnrL)N z@QGi+9QWc9w{U8Uzg;v~8R4o*sg4RruV<{}VUvk7DjuL|Utl=@Jt~&-V_Smg2zPQ& z?^5{TG*aOG{CzfVf(hmmvplIbXh-{Ob$I@VSK{m1XRy&_KPyy>!?S;1B0wo!(c=CR zwns19a6o5=OqU{3B9V(1o>{3wK+!NqRfQrIwxv=o1h!o_X)LYBiBCRh@_EFw2KKFI zomO><5ZqiD>W+Tai=YU8j!va)Ww33kUv$1W+w~TMt-gCs5*O~pyVx2peZ_^g`-RSs zTvZ@3fG*KcfGbqC<3GU>3Mw#`zavw>T)-J-1lmjO&H-*HpdpULZUoiPLNr8qy3$Qq zZ8bCr)xqd9aUCAf^n6xcd-Y?Sx`fUQM;s(*k$jBeJmp>@hTDg!yfPvPw{puZ?dB+O zp6HJP5)D@$Etemf>zN_uTstJ){q%dNdxWIu2Rb`YWUC2fJ3^YEdsguok)9R$Jb@ty z?dC2Ur7g1?dc@`6{8<~3lT{}3*+SoCOb!l$Sox(skY|ym%LgUC{h;O}ccStS$PUaK zVqE5dJQ#RX7!Mc#&<@dCxt(7)GxsKB|AD^0;3M9|V;1VZmfXpuMyA#vL@OP!+$e^; ztAlV)g!!o&@+#WH<=LE(^E0qt%|UowI-Q!l$3sl_7`=Uw?n`m~A4h8IZAK6;$oED$ zUkv$a7}bmlVNWF3jNm3eU~tSEt1X&(c)8AR!!2a|jb@ z6%8UmpQ|^i3I>8UAAU-V+Oi;8>x~l6#>-5bf#);OHv(u8yEk4_ksiW+LR)v}NyX5c zt{k7dfy*Os(tJB;J4?-aWiz^ZXQNlDajCM)Hy^2*TEMT`GbA&`8&f*}<5r|aaN>pM>taGZE%~$M>GhP35v$4?-7Z>NG~AuI$G=q zHi|SeTQwzpmWls`#+bxwba0059B^3yf7*5_i~Vu*{$pTWOxMLN{_p^A|2JD9E983m zs_wiFFmgo`C~j15&mmTi@*3=5`qs&=R&8!LPy+Im*DEbhbEQvKV>8jr9mVrA-FwBI ztJXdA%P;HYMRD5+Q0PsSYh4%MoJuDOyN-^_SjVj<3I7ZseFt|v;MEx)rDGI1xiDBF z_Gb9SYjKg;k`&MWoF>=8zHNKI$;U~Z6Bx3b4eGy5a(Ecf| zA$n04P9?RcX-?r3ulv5WtQQdBl$M_~)U3WpK-SiJJ@u{C_Lu<>jd8f$&dmj)+&y^v z6x=%Uml}Mg?yo<F}Z~jL^6i0-NX@s|35oT;|`R8ej=KrzF+LR4)aUHxHkrKFJAB z=a;#iZ{hy8S%XVhh$V8P*t22R0~$<&25@pk9!juMU6y7@6?C2TUln~accD71xlh!NIrT|v?~5pEAaPf(~BqJgQ~K4F>^4F!;t`g#C6zoA)KW#5AG|zZPQx2 z*R}OHcN4Npz*E1n|@Y zgq0K5AJ?2!-W+PpZ`p(aFG=aeB)_BXLCSYZ7d4y$Sfi3v zulQpr_$BI8!?LpZV51(tZY1#(5-#Zr7|(pDb?@-22~d{*aLwbMzj8eP{4leL^LRqL zgE=nlYV%ePZ`G*T_GPfuF)VraYkUJoPTPX-FEH4~LNv>jc|iCvpcDRqjF#Zd>?>r2 z^u~^CSrK61G;YzDnVQ26;=(^}AQ*eD)&?wMWD!}O3Z2Q#Q4a8*vkNS{r{Zt0^Ee%p z>Aos6JUITKWU~Js9!nx8B$j?>GB}lV5OO;o@gzkiU!(4~&N+m-+ClwmzV!o$@f*RL z_RC{Uqd$--$&YGrXQc8$d`jn+$Ep=f`Z$0M=hNdOiXPZ@pocyX8Iprzc;EKAA)E- z7JqMe;2dg&B13aApN!PRu?!OKxHLh$wo1=2=)5l9lVcv=zA>nFBZPNi;7#2LyDvSd z7=#S3o-GSBJ&ziTxH#3-{?N2@qx&0@wHO+!@lxKgEn#NbE<{TdP{Y77Ho&Ez#0H=5Qh(6p&)8LX>%iAq&C1S(?#)y?ktIVN^n%+(J#Q)|KrQ87;CI4P&lIhd+lz}o znJuFj9wfG93pcu&B}RJ@El5^)LK;9_<2)bYW(w3o_QjO7SUynx3$LBqr1x!PEp<7Ox7i5_(8*Z{dmL&mS@eEo#e&6WPYczsL%Lv>l2+&=~8NO-b|2Ge-TGn3}+p5&VajXB=LHI6U0Q z1EUJ$E3 zvQ=V>HXv4j#k9dpNz0Oabrg&Aa%{g6i*?X8h^BP_(xqt{w!kvj(T zsyd3dZ(XUMNng&TrVO0uapfRUWvgwMa|+WEzS1r-#QSXxD}9hk81yvJ-0SZ1@<=&$ zxQn4`$HwRx(&Z1sPb6r$`1o>AAdp?ts1#ZNzQw%0A^CSu1kMHA=LOQ)Z96-<()fn5 zQ_Uf6v&W)ExJ4^mT=qii%B;>sH71hPs;AZBAWBA^6dj3%Nc~7Z>KEn?Y4t;4*#+Hk zUB4LemkE%^rkCvd@Cr#x(j5?5|+=fxL9rt)4(DY0b2g3QIKR(dx(Qo&)?6Od|P zdwXxsomAArcCOU`mv#Y?x%>+o;Od+ksxi)ISoM)VKmGXrYr+L)&!K8+>lMTLYsAuG z!D`6VR*23>-kIFIQ+GaZ?Zm@}aRHI6O?HPmZ?ZRS5<8S%e{Z_(gi1i39Ny^Rb6Y>h zHkUEfbzYJL24|E+OFsujGDzdu4&mnZ0`9QIoHqY!_9H2NlPY}o7Uz-sBl6%x@IhGAl}b(?QcN@>$2n&~R&^eJI zP$)&a8P^L7C$VqLOud<9F>zKmOWRW(^J&*+dFbc;ls#@+tSHJV(F_^+?|c&&d8NUa zvmI1Rb{01Md6sWH=5;KVpE|MG?d4CBc2A1VYq_O|g&;0VNM-L9 zbU)-@;#ka2Tkmuee_3ljyqCKyauAcYJJxHXfwdo--xqtb)Ajr3=C(p&ajGMWcSF~L z#649&mE7VMv31nw*Ax3Qf*;!D?&LOxWF?v&!P_m;wMV2cR^de=*=j@Ql^`owD5)GcEhc5&E~fXiy7ZKi$*TB-V<=PElu zAN8!GoIAzDq17RT`$hjpHHl;px0?z}2A65t+W01a?IbVS8AUv_Z4vJ5mGg4yPGR!G zw*({%cF>AZqmNygS@@CQM_jWqqLNdEcbpt}zai$Z;j(+Xz>rdco*!LdLv0jRFg76w zVA(ZLN5XVp4BuU}-c8g5_tP&ux6Ze-;+uf;%+E3;nEe*&XbXk{Bu7cXp+3w8+qEt7 zNWS88vC#Iro20-GFqK_40uXj6y?6v zZswYgPVZalWLSVQBwe6*#tqW^zrSu-WZu~vt~h_ZjI)(mKLEEH$V~FR&;I?dyJ&TVD6k>JvRW=6pl z*e+xDsdJ9(1#5^VFsY;hh3lGD4)(Zzu7)pvd0CpZ_bju-|JMH_;oVZ+Xra>79MnMh z;G*PoXs+l9uK~BecG$pc=Aq!rXMUI3NKG%5&3`d~yK+YKXrs zuG~|{BqXn6s@i{UV0dWbcz_+RoqJ7X<0@Z@(!i+GJXONx{S}UJ!}$d`_5Sl0;O+dk zU9WqGxEHbqPruS6Tw(aCc()xQn2T8p5{#H$x<{FiAWN$=DkD!*f0^zGOW}AH9|A@F;x zgNuTH9(8vAmH^lP&Tl_HU?wN~)FFxd?_kl2z^QT&-tXgK?PQD%WFK@_S-&tJ-hhqsB3LpMB9{2}gk8aMCc zLzg>`w&MwQiWrT(x#*x8u-2-@(Uta+E!HQc6a@#pvZgALd1yG59J~68w;-WNq>|nOg zK`IedI>mlF`$`%eiA>byJG__aF4R`Bn!v}J27jVz7@ba%0cu{1m0=pzh~3`W5uE=< z+A^Nr^U;dBqz)?h7H8lqOlYm2dtn@ozjQ+`4=H~g4&5B;l=WcviGY$Hx;$zW66AE_ z&H$w7TsV&D!4&-5OgO93u?ZGY|JgAOW|Nfbz{oDgCSEJR=1BgBSVe1zEn9ynK3K{T zPK5!KqEif!iZu=ehhLZryYbNOq?nYgXGKI!15?q)CTgwd zqiIJCmS2jdVn#h|Hd(C7#d`rM~@@~yD3Nh_9f(h zRcWpsO%Bc6H{%Mrd+PPqP0nBd0oG`pi;QjO;tjW2c&tP*bCh%>+QWB9KOXa23X#;J zwj)`!4UaO&wCIPEp{+D)o0^-K7*B4mw*8FsdncEb*}v+&-1B=D&7g+&VBF&?l|^(g z1v+IL7&)heB8hHTm?7`J=F*&v^I6*FH6XK1wo?tGXN^%djN2@G5)X>*q+LjimjE!> zdnY+c!^GB%C#;vA!V&uC|AZM<_w*@QXmY9Lr|;u$z2;1uadOnYf`2+LAzr-D`OG)A z@07yfKGxOFJ(-VtI3-%vrH_&hPl3n^7X?q5krzSD!n=Lk)|Gsua$Eylv#IO2(`hHz zr1siWu}Xg?@gEbU7<4kAl?)q}0(Efbn91_;k@>UMuS!+P_pX zO6t^W%tVgobNtyw2H?>K7SwsYzc)6R3s59c2nlfH_ofrBpK9mN0Rt_%9z(pH0--2g zgv$2wKtG$}zZTRkUK0Wz+qxPW+OW$B8%NjwWK7DeLQ+@>Gv2O0u@lIC{$v3XJ+Vy* zR71kQU8=KN7|vH>bPCoETcK42V+;!o(ryiPreYLtQGH!*mIUn0+uLqJHx8P8G5vMB+f7qS8)1{AJE!&#`RtG$r6ab`NkswZj8Fqa2Z^^8b}y=+tJXT zZj5YLf?=d)qlqeByAgWVt2c%F$*&~&xc5Hedctz~H-hehVaS+FNV0zZ_dKZSF*}uC zB`~s+C=o~7h%``#X72x$+*@CEpt81WX-V6PW4Bs+;@dR_sWmCN6P!oFfEjJsNTY^ zYAx8-kBA0y^O`e`yaizV*dO|IO=s^2ac`Eqo1(yb1&Lr+AM6A!d79Otf%*%aiRz+F zC$80;@yWMmG;uO~&@^U1FnVxEsZYKu8YP!YQ0Q|K7# zeR#5XG`pj{02R15Fi3z0kC7i&l)3OW^nKkKc95_6`5>_UyLimT0>)vxhU#cZYicuV z-3}zIQFzO9*-$-mb*{ayN(QW+9s3Iw$1UTbV~`jQQIu_2anDv8h)&6hs4+o!_UIs} z`G=aH`wSh~*z;rwQr3}gUm4vs7iPH2Brv(h76O4o>{D+(@Bo8Bz;JOFWrgD;oKA(Z z4kSfOZ&Nc#rTbJ>hd=n>mm3LY%h)OD0MRA4 zFFeoq?rd|m9JI^J11feLSK$KQ`+pY{;kvywh{r&XAGEPE5EAHMys-oH^xw=At9`;m z%>@@S{5i1Hpi8iG%)@Sme@Pq*dq8MS-zqRV9YXfcHS1&Odb=~NuHe|Sd4 zhA>mXbc1RY(LqatCd$F*e-=Uv9ZimUh!FGc!-pH&gV-x_xW&SkT zSzmM6!Ecx4r}7l>?d3`kfBk~Zdyj4la!IhogEir*?Wa}3+45!;8|JGwB>=(XG>7&-`I`hwWq2v( zz&nAJBmMvI>fw=|>F8f}TdR4LE4V$<(e0Nxi7mgvHRTf?HIB{BMWOUHRQBocjhp!m z@}S?}H5wxVb}KweK28%&tS|nJ{#;6rCsBS>p8UY$d{By(YD1uadAt|_=B?A*Fe745 zBw3W4f^qd>pCdU^%fN7A=Su*q8OUk+-PXOb{RRB##7Pm)!1m2I!j+J(>UJ_Ufk=+% z8bgO%{f=@6|HUGS7K6EllDVySoUdN9u4#^Yq%=2Ax`o8$>TFMDigekFgjKp%fZb{| zniHz-Gare}M_S>?Hj1hBxcpXsQ|?1F!A=zzBqsc;2<`K+73z66!f&Fg6@q~NS-Gk_ zQir)K^9j3*P2>yn_G<{AZ|!2A&lP4F&VFvpJd&=BE&&&QYxbZ`u-;>Re7C&wB<{#J zzygZWjI=8=TvPEWIeNr10qwWrlh7pKqPBck8qAK?p4!R_@f2d5CwL`Op6uG1s%R5! z;8-)kHAoh582mW!O+C776U^>CC{ST|N>G@##LpNYyOZ=glN67elq-pyij-N$LKHg= zfhMH-pdz=i;hzgPEPU_!^Jt*2iyRO?1y7$sBgpj}T!vRz2Ga&|h!4N)jKz=C_%^-$*OuE)ns`qXu@?7#FZCK zIg2&3cft8t3J(<*`F**XiaffQ6`!wQ7|`n5u1rUd)=Ul2cA#{v%!jH*ybs%zi<&7W z!kKq6Z-%ZYQ9e;v8eD|}c}=?!PMN@xqr*yG^W;|eaH+X%btv09r=<-0fsN2KszZEy z&o!4!{dqC;2`A1XS4`-rT1>L(>dK0u3g@$VAuGs`l_d3pofuu#R(I%IJJ+Hb#JOCJ0%XiIyk?q{28h(K&9rx{s) zs_l;<7q91dP)eBWkEanhu{lMId3*myUdeA~rIW{ZYzub=t-Lj-oo;_wx3Qx=w_{0M z;Kv4WD?~LX1%>*yR>$2W6sb)?+flNJi{`H;Lxk4=4)A8un^FhjWKEL9B zod;c)ErL^k`kYw&ec!R|{JefEt-*vUu%k7oEm#EKio3Ci4|(RSU=Z$GgNU1aepK0ZQ-n zDqgR24GX#bQQ1|lXeop}IB_wmT}y&5#bj6?pdEg_zzsh9aX0~4;OB2mQVeKI6_aSC z$|@gli}Rv%&3=_9S3+}cfubRgJD(Y%`_y6wmTeazNtaEeY=aVusH zhPip{_XQBz<}^a!I+zX3{t9s)?b>vFIQOAB z%PuWlnknrHb+SRWneoM4hA>w&a}jwuXhv;{=5s|o@XH+PLljBXdbML656sQZ-sZ;BBt{xTD?CBy}05e5BlXBu|0Y+tX%43nMNM4YELzd zZ@<;1IwGIK%$s@n8&gxI;h!?)^X`u|JV< zaQ)T11mfuxu%9QJO69%*U>svX7Wk?G(1wZ(bB(!RQhd}Bl65q5WKDHXhpgUZJ19~f za*!#znmu;KAsaYA+cnYVVrYjQ3*zPDTi0){4PB4HN^kCLQ*c4jD{*N1`5=ODI@Q{h z^T+nb*Pjr{THP=Nr|Ko|eM^Qeb_G04 ziB`b{=8Hi&&oaGhnwaW3ySyxb z@t#*6jJjL#F^Y0Ou@t@2a~oV$lFH<5z%tQbz*zL-1y$VEkMFO0@Xi$M{|}{kDU+W- zoRq2;I7o4)EdA#(;oVM5s>J2lKp-%Jo1)K0f|A?UTL6?S?)uZ^9DQ*QMr z$|JL^t)1oz0_rUKLWO}K&$3_OWjUpsb1G%>I4)R5uIT3YYv0N0EB z`#E=NfxrdpGeo=F7IWUT<23btZ?Uc;MBpwg!}H~U^F|)uCXUki3VZE;;Ed(;4Zd(r zG@s$Q@%T2+=>jCKV8n{dRJtJ6%VN=cf!s;;{sN(ng9rLI$(nwBL#V0gh2a*9cX zhmY2PSrXoiTE>;t#L_R~bwvmLQZ=~Szd>54d#2h2{85geUI14GhAwhgx~vD&jpt3 z5Ax;N58thQ)N&101`gNA-Pc_BL8n&0LyV1!XX~btp%P#E+cM449}T|(oRsmhhg6>k zbgC%cJFZEa1Rpavp~8&k^0?=hRKC>No0Kt}*rxc5amRJQngU0DHDnJFnP30ZZ_UUHvp2&O*yqC|XDT`4UfO!ocZt`3Gdf6dpRPs%@NvCI#54nB^r zap@&JAo%6{m12iLK~qePJF|(c<)A~Ad-dM2B~L`;_44Er&iwB)U>s+VSrQrevfQFC zgni;9)zwYTs+ikTP;`|fW`Wn6)Yht-`GQ^agP4mfyPH}YrFsU`R@MA)v9-1dTwxLr z=I|nyK=3mr1Mi94ZeS%o7gsjjv9^W7;_YOfhn*jVw7yT0JY66EiCTdd|KGl5epRmN zxxn%Gm9nQl{@2pE$20ZEe|#vUP@>$I$Tf1mGkq(!a?K@#O76GZ?;DjwnERa(bHC&k zav7l|mz8UXVVFyp`!?J9o!{^A`+qy<@i@27`~CjBUeDK!@51S%@lGATU|6&DyPFfs zpSl3@$0FQ^>-l()H+1*Z_`y?e-5A8nN?FzplHqsf{AK+aRI&4296pJLSJWSGcuiF*QWOgf` z`|)Gr$9C#Os=Z7SVQb_z`RWQ|6|u(sYTJ({%Cs`f(&q(5U}P>bkmaznai@ ze7p7cV~WH>@6(mmEJ^?L^sT+k4HHRK41nkb9ht;on~RbN-}bE?2)nr@^|9&;dTSqu z^qJm2F3cC4c)g}$y1~2BBTV~|2bAydci|PUgCN}fu;tLdBjNY6t-Q$T#w_{4sQh5j zYs*lpL}7h>clpQbCzirP?^cK;fNhI~H}L`c9j3JLiHHRi_p z85!H84h#8sYUB#MVn&Cfwbk}x zv#fB-J#~I!Mr4<6B!+3pN31O!{A4iX3XW5*_a7*5y0MD0b_IbY%L%%ch3X9yDHA8k zh@Ey5F9Rt$<_F2BB5tMAY5 zXZl^|2x(qg*wsR>vJ_k{^^%rROA=@v&l&CVMsM0A!WJQMf=86sT5ReTjv?De6>KJ? z^=M7hAakC{PRVlausC4Hc+>l(F!d3*u=e<(T6R%^^kf&<_UPqP-a|<8synRZPA~PI zr%%4+bc>5{xlCZL3m{AEt(`e&cyzCAL(B7HPve^dsx60R#mVOshdW=Rq_YFVF#|h{ zYK)9L-Xo{K@r#pC%kb?J$BA9dK;P2oR#ioTcwMlWu0>&iy$QK283B8tqG@~{1bdE7~`@{d{wpTEB^!n*iq-r%{Mm}bhf9KbGm zQ5E^${-dl#>8X+~V#D$t^Tu4H8Q**9ztT=Ujcmnlly?3!-Q`2wdi;0!^HL%ew=vfc zBh*byM-p>=kngrlCS+Q2g_vuzUya_r$~th+DR`+~os=|DfJF8Cvf2<803YPDj4Tw zl?KlEYRgvq(72+B%3ix7o>-7tu-+B-HSZ*DU(Bj)KYM`v9C7c-v9AEu9d-#gA{CslZW*?km; z%CKHa7x^}Pq@8eAP}x$q2QEWjy}+D4;Pj9h>gfrF=EG8W!R*@7?yxJGiauQ$br*NE z=UiH{#BG*6dD8iovKUziKRS4l?_2Tk@F$GFP$+oOVe$@kQKsu^H8IY1>KML*PlM!N8N19}xOFosx; zio9r#6%PGieOt?~*bzrUjCBj~{R0VZ+H;}eOn&_XZ9d9SeHCFoG!YzH#w~CP6>x7# z8pbB;J_yJVcB0m|ptbD{Q1FxZ9kUJ$&f=WEY~RU_S?7yFp|7jq7TyQpR3i`*a57B` z*DP|#@kf*V$$$jrA+&8VukQ6W++0qmvHMy832HH8R^-M#t;YQibhA_%-R2{)7Jx14 zc7sR)qMgY<_ixLe0XX^t@PT+L)c0%b<_z3chG908W`i92wGDup=d?6jr}KIn!I*CT z!7KJO0=UjX@-EPXOm*akZYF!wNG#mFl{4vQanx|mEnI71ZLmJ6Y~J2OzGWr=?aVP6 zxD#!wcd=uLPH)77h3UDKa3p*8W2wm55@osRxuBNYnw@q*^Aj%(+sV(Y-iEMs#fw<+ zC#qFTC^HE}L`HV_~eXwFX1kdr@%!wO3mtQjJjG z5VW8D^n>2CqK0RD){NfxjA?RkA`b*6U7P>zZ?rMDlSsO~1y1emWI$_SD{9kU@o#wH z%-=NvPP}dj!TjGLeWla*(mP$WDbhkvV-`% zkH=7Y`V(@E8s1f`YlN|aoAqLTc&F=iePMvyCQp}07Mw~>q>>+}pSTdj{eQWITsv^u zo8P`pP^U?#R-u;l?d2B!fi7NLQIOsB^@63epqIqcmp+$0l#kTkCu_^flRfE<88M7$ zHFrqBjPx=II0NjRS^xa#%9$Dj<-0<)e{vS!??<#qjbvzjZSp6ybLHtp%nwa7%^dRe zKiGN?6QX62xPIgH0nFtpv`tHrvhNzpWL&R<>f4<-G&wS%l*Ok@im#EJ(XImnNgO_; zK>y6a)v{}kuag*1!F=tqgo?CZ(M8^RfV?6E6T=|E7Ai&lTPvZd7lP?j& z_uT)1hDKw4w;&snsP@!M#e>bCuO`di-tq5*D0*yd(aU`zQcX zp}Sd@z|HtgcZppUz?N4T$hfvu!&0Bls1uF#x%xvfX2hEE?KY!gqU$oPyR_@QbQXS~ zE!_FYonj>Fg^Z8?%k@snwlnk=37YA@2!(zumtPAnqr%DzdIwi9?}34>61v~*rP-uS z=;t5iu!Tb_@C@hjzRF-DV99@sQ--JJwA!=I6COj^i8IBuor9{%|4kQ-L%sttRaO(t zH#phkO@66!ZPKwY*nEOjt(%;dI5nhToSqkkt4O6gh%EZ20dGgs)Rg z(PcR*EkYd7Zrc_xQSR_P0oqZbW!DZJ9+3z{gbA*WtQ-3^dZUd|CoP8FeGi_ABgo>Oyc?g zn4#svl%0KRQryxQ`=;GBM}7)B)Q>$Wl20LsUMqMCzIiJU6M1Ux62|L;8`1a&D!dm} z?EaxGT_wc9X!|7hdIqs!{& zDG~?2c4=!gHzke1Ka4hZU_-N;@P6bg6k*KaB3OP?J<%J10>5v4@(0$NwE>O8=lI;AQrZZCr$hMQm2a5lJ zd?R&90f14PT+dF^!>qcS^irjRcV@JOb$g?hao#o<+?Qa^2zAH*3lTIiNDk7@ypbWd z()A0 zNo@$q2eS+k&;!>`WoKx?~?cB^P6g~vj=Sm5!McVb#((i zsZuF%p^P`^lAB#^{SboDUaa<|$(`L=Z;JPgR_}ixmyZ3c3hCM+47h-S-3e{@_d}_= zfw7SiG zV7?=J7Q*(PvQwlS`Ru9=pb}W+a3yqX;3hW=OD{*Z@Ln?c-*3ql?Us95kXi@fkqMC0 zx+lyT@&9+wIx2a8txpxOELmu6$LIIMu1fzPY0DG1@Rc0|=T%55+yX*oeE?55@jTV$ z+PW|J5pOY}t6gM?acscrHQEC%Uppqbc_8Mb;AazCA$8F2LJh_A{yg9^1&=I@2r6~) zP{4-VlucL*P1K+u6w)h~`VXWP=^GpYFgVNdv=TcTx?wp1{FohPJncHBH^?y;kbAl_ z^ZdCI$f_epcFwRaXKsRJY0O;oCgcwaN)b`Z*z2L4ri2l>P~%0CVx8CnyAQE8J~;id zJkQ*>4}N?@T3T^|HC`UolV;qGj#jE$GD|s69BW{ecjOX(Yec+q?`&g-X2AQS7S$i$ zgMTMmtLYp(Z{CWS5b?%hwhe@p!xMv7awv#85C@x9RpRf>?Zq_Rl{`Dp(I80pbLh9I z(8?k7bK`|h6mHuHo4!Yyie6b8)CESCNEcEkp#7O_1xX(|Rg9-VAhvp%^?N0!m2=v9 zObEl2YbGv~&d1sZsqi|E&syD8@8?l6EvNLl{DDYeV5?-?D8VFOZRzI@$tC4dO4<|y zKVrG63^%i-VR0)1@x=(F8~tXwob}-BxcWPZ3~iNc-^Pv?Mt^F$bi6})oU)p%?dTEv z@=(JfVOG1~xXfzxSI@YXq+4>tl;!ihGzEA`aoR8V&VBT|n@6$y(5Cx3rCjUw>sK z?sO=8E;dA3QnHl8FLwzWPoBhHM!%yxEScRP#}2;PvPye`ZQbeGN8c2w=_pNlBa|lZ z-`)=o-{^95U0&dt8MMWpcxO|DQw*&wy1Z*D21TdR*LP6N%Fz!6is=U!Frn;sd-nC< zK3#sbPZr$ejh-nMGClkPAO6z#$cBWNuNAoo|5O-$w@bdevX8vd5s|9Swc&I3GaHWAEG?19@Ka znnLGWGYGWOz|Mc*tn^<|JNK*yO@JQ-m$iJ;#z*=6^sONCZ>APsC-A|oXFbD|GnPlE zwcM-DzFif-yqr``Fga;GJonmBcJ~rnh-(2Jt2XM7x}qtuvd8I>2RmW^utccO_TgU? z3Fo(so!UlxIhWS+JyTCpcf??eiR-OXNKK<{VH4!R&bA4Ae?aWr?wlgd5D~Jq(vs2D zrv$S7y*f|qeD%0QOXgo(Tkd1Gg)UvL3kwC$UV&Ee^u7X-D!+Pe^||`4Tm;l8^J`)Ss<)HhdKeEr{UNWnQ|1K#u^4Gpp?;JRmcH3QDCc7pyYkMUm zQB(g*#mPx&m4k@7Wpuk;{F1KAwXu&2MlH&zjKT7Z&*+=2$IZTXHr2HGedpP_^o! z*eLd(G#J7Q`sA_*thqPeh+1=5=Irbkv$sC5*16?+4m_UoatZo62ZJ_^I4XY!$lNq7 zqW^(3z~W;OKW~jioKy~deG!vR3fa@)kUBiBn)bc3Mhh}yhs3HH#LWNxdA?Lg_|r-0 z=%pyN>J1V_Vz3d&hUiUyQ}A;L@E zK}I5pMJR-!rwJB$f3*7x?H*EL6c5gn1(b+b-xmfAEkL?sUDy-16ggW>crL8>l zMXI9t>l}b#dwS_~n`G&Qer``|DS8gZBhT$UJv0i)Dh}2e_^Y^R0h9DCL@(gCbyDOJ z4jCN4^kLh=IU`~}f!Anwh!nx=2Fr2vHTIX(N#%WahS~v#!;`Qfb*epUJ3Bi%EMwM5 z{akFlFsj9gR|C$-r4Lsz9W5TO49r)=vw=FVwt#HWXb>}0O+OxmahfiAxzPm-=q%)y z+8hcczB+_kB(IfagYV!5ZQj}UYg#hf;b}o0*Kod^%qRg$uyGqlWR=hT#DJe{Mqw&{ z)jDZBV!Z(d>7u3OpUVcwe~fOEFsR&u)B53+-NNc^7;~46Q}G_}+DUwbX9cJ5tB$nA z`|sD@GqC;e*XIuyd<9|f3EF$(c&-b)EJ|Qcyi-mX``}(as@gFT{Ahom`tOC#F`hS< zWnanJE8<2U4EhF51)5L>KZX}(59~z)o7O|Mn<_;&@*Q*BzIVJe9XK{%E(8i_C5c0Z-1sJ z1HNx(8xvwgI2-H>PrW+(2%CaX#1I`m2Y13+6d~8$!!)BR?zKCMQ8zMYjt3#wgM&J2 zZ|?eJoayx|n-kO|Z`!o56B8oqy*Aqdu}`YtB|V$MYpIx-NIjhNy|3B476^8`CzJKw zyt74n7AUhqgMO8HV!OMCNKfE}b2_AZYX#>y!=I9d4oh z_r>VW3S)d->WP-8LFdB6P*>6+iFZuWbPBzPqR_WVQf?CNV=rl64-M&WvrXSRwUsG6 zUpTlAA67~G2s$`FG*>$-WFT^h-eA3oh*`?Y1bU+@h32Pb`_8Su+U&gCX+qtNAD)TC zto7flT#FY08EofmWj4v97(AS3O0?L0x@Cy8cx=|5)g`L}7c0-w*RF9N& zx4meGee_fRmW9DuN2buQIO|PaNB3te@02#>{YM5QcSTapYw@=kjTXtCm&eNvU~aZ} zFs?lH=BBu18W`RB9l_rGVduIZntIBhdaSexZj`gb#Ee$?EKoaE9ItpdHzqCmG>7Za z)X#f{;!f%buKiV!`SuPogMwoHQE~lHaAuH^ooVh}Dc-&dE;{<4u6#45+r5^E*|_Dp z)4qmTY#)?+%22tnY*S9O>{rjRO0unIqU>4!Seg#=7HG%zp#4|moPABW6!u6=7o(H( zN$qTM=M1H3@t|iDuUI9jhe8H$KH-SMel3${6p*ZeFpyc!75W{Mf1d9X^Pz6o_=i)q zsu6`ThyzIz4InO$&imz<`=$(=#!6+p+V&#yPAfzX|eqybj>TpQ)~rFEA$|9#h>uUDF(?6Lb~cwjAipuUJ4r6rhUHIjTHmnA{2O z%F}=`Eo#+AW80i-+=tVzLm1}wEAO}CfoPeLTip-zIo@Er9>)t)s}uR@bkZU4O&vC? z-*R~&1$tb328eydsr0n&W^60y341zCv6iG2L9=Aa-6a1)G4K>$=o*1Z@;(LcSN4^6 z6_8JgFPs8&h?sH(j$_`>%(RSaeS11=(r5sdjn7Tn?xd%s-4VU@j zlk%+j>D+b7B&aD8MTH)X|F%3^Jm%}MBb1Kd|JSO>p|G?4uoJ$o#O!rc+_QH$9W7|0 zbn!dg=5|6zZo28vDMk@APP_r_nYG)=ZXET`vy2u{YH?EX;&*D1RWoopMq2OsauW#?LRYU`Q& z$o&~WG>t0?7cBUd*mfGQX}sJ%3$=1M=A$f@3RD|d^HUZPwuve}a^}}`eyxQAU0tPY zQ)*|ifQQbX@cm8W_!#5xT1&DMp$_xfsqhA~$A>NM02 zb&=?^Eu1cs%|Js+naUlnmnR!*G2OM~QECQD47L4TTQWZ@B`hR0yYATzNmnub{+bS|wydUULE)7^a^LKXAly1PX8s;r%E;1H=VoQM%h-PBj%6XKU zWKh5Qn|~m0Gt9b&3lS387fd`ur&i-*{GI`m{hm7Z!}|Wv=R`llCb}J}_z9qP;Yv1y zyj59r9o@gU!j!#W6{QtG{GbV7TKJX{%|E;BhYYB-e}lC}_C&!#c%2BnJWDLwS>EmB ziLO6_e~KolU1X^K?PP7p>}h|q(DiIV$;sb|;8tR(d8*0O{UvDOX3d!_Mb)5dD3W#g z!=^&Y%(PTEHXacMN%m|u_;SbbYsP5euj2&N2yNg0qcor1C&J(dJNIB^Ui+>$p7)$Q z1#0iJ4LX6G<~a`l=g**0+4(Q~i+L}Z@`gSy%<88@8U0OgI2Q=rOmqP-R%6NbNZ#~dCXdS; zwf&lpDa&n0YyKigA>*UhTB;>6P9r$dgykm>IniazL2;)zEvM{U-vRI}C-`~sPhJ$= z^DsYy`+kcSJ(Tq`9y0Bsv_4fi1h|$AguxrPY=ZL`l7B-Cqm>O0joD);8}#P$aKKKq zJ(2bFj&GeV-zDr$5Ds~6tr2h!S!DYGVP~x9LoVjcQ7P3wtN=>=m7G2X__@;M$ldjf zo<1FptJ&p>Z;&bla6*~u5N^D%H!xWXBKbVMTmspS*6t|p+}obddvwTGcv!YTQiQsfLbTpx**YW0EQcuyxQZd1t zji}8HhLA(5djn>?OvJ*!ei_YKt3T~k#I#sB+Xh}6mGENgWo!Al)xZC}B+<(IkL!G$ zuJLjk;%gozhWHER?wfNsDzqU|QAAZ8ypL(W(_s8S->~DDqCP3Ms=0&?3yfC-Q!|6iKu81fN)4OiU6EnwE!l{l#c&nwnw}8j9kV{9jK+uZ35jTc_$5Ik> zy;Ry}IIodSnM4vTV8>f#qI%1tR#tdOk`W)Jr)Tx&`AS3ukcKFlneVryke9%aPE{}# z^L*xXGx}DvljeG@NTD3M+bZ!up&+D&8QQ@~_d*$W45Zl|R40Uh0SQxSj$H31&~c0x z;MVty7ek^XJEYoSX2$G9Q`M}8yJDN8TKWPI^;+EtV$i6XDE>(ErC=YeSTXcN|Fn{Z1Hf`+t#c2~JN85?xWjXx+K;-JCAv9?{ zwqPatwliu;6}MR6GH7kkM%8%yHWw8B^ITCd*$Rl}loauW1{f{Ux6+F!9CZCu6|6HI zlH8$0NtEnwCxAZb3j^CoP0vm%-*&R^o4!0pRU2fuwa6Wa_R0A8h#&f231jqpGNYc7 z75&SUrBv*AQ92A_8^h*z+F0OHz;AlKEazCWz$Fv;6h1Rob2|t8qo64OQwKnvdOSi3 z(ST*HCSD$P>2YS8YbBS?6OJ@ggcf-mjyRj*(4IhV8eE=HT~{pS62Rh2bnI6_KQ5+d?bAcEMuF< z=DFN<1}xk*nBIm@5{u`${Ipdlk}7dwmShP+1;W(tztZ#d^>9zQYGgh19Ao_8#x00s z#F>T9?9UP`vXUN<+6FrA6%=w1I6?i(Q980H!UwzPv&bnq}} zO0x;!^m7H7U=-&~e|wJ)m5|Yn5j&~`CVNVvQ@;N|_8|X1^LQt};7G zX69e7(*5mn0*viRhl_bSc1h$w9K23H4Zi^G_Grf+axMiYm#2J?Lot;rkbbo*yvSi= zIjeVz9|~s?m4EhJ7gTJ3A)F;7L7gyliUsUHqHouhki*BbSs=FWgtIG#X0{aWiVTaI zOlLGQ0dxltqV7RK zEb?9^kP*E#-+Ww5ogfE{ml~IseKXc>0R^AhUdl1sg4w!(mAHr5ks!5vVDDcvmRrC> zm1G+L&iD0lsa^nOf*D8%Tci0T7CF8MV8&Y=0{#ZSA!F!d zWX&LaZP{uq&;8|b^op2A17Fu5O22rQ`g!BPJT7OTLW_3HauPRzp*8&vcmO*Ni zBn`iVN=eDpzBcelgj1`GF7yyHwglC zWTr;)!dc`)%BB-|EDcaclsCTw0<;6WyeU;>z-wO2mwb065C3WlrXGmc)&VvVXw3(- zz`Du{Lh~43+y8!h!7CIWwflZ8wbIb;_J|H|e@=1Cly^c8!@m{IA5`L3+i+BIf$y`Y zeyM*Y)Q^ET?H4>3#*%~?B~3Ex$WnV+Agn~1h3cG#!Z1`(sICtzR-rg8)h3{RiTAnc zIe;Z=vZi1ED2X^OZljz@iFo`F*4sRn`EFJ4Xolo=-PCms#_KWE9>fiZXpL8;vD2wx zlqCACORpfjdYVOQMVmjZV74C|jn{f&B{l=0kyhkexIT`T0@?Ee6Fxp1KX literal 0 HcmV?d00001 diff --git a/Searching/Binary Search/README.md b/Searching/Binary Search/README.md index eaa7e49..88a33ec 100644 --- a/Searching/Binary Search/README.md +++ b/Searching/Binary Search/README.md @@ -1,3 +1,25 @@ # Binary Search -- Aditya Mandke +- Binary Search works on the principle of divide and conquer. +- For this algorithm to work properly, the data collection should be in the sorted form. +- The time complexity is O(Log n). + + +## Algorithm +Let the searched element be x. +Find the middle of the array, divide the array in half. +Search a sorted array by repeatedly dividing the search interval in half. +Begin with an interval covering the whole array.If the value of the search +key is less than the item in the middle of the interval, narrow the interval to the first lower half. +Otherwise narrow it to the second upper half + + 1.Compare x with the middle element. + 2.If x matches with middle element, we return the mid index. + 3.Else If x is greater than the mid element, then x can only lie in right half subarray after the mid element. So we recur for right half. + 4.Else (x is smaller) recur for the left half + + +## High Level Flow Of The Algorithm + +![BinarySearch](BinarySearch-1.jpg) + diff --git a/Searching/Linear Search/test b/Searching/Linear Search/test deleted file mode 100644 index 9daeafb..0000000 --- a/Searching/Linear Search/test +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Sorting/Bucket Sort/bucketsort.cpp b/Sorting/Bucket Sort/bucketsort.cpp new file mode 100644 index 0000000..e3d9324 --- /dev/null +++ b/Sorting/Bucket Sort/bucketsort.cpp @@ -0,0 +1,41 @@ +#include +#include +#include +using namespace std; +void display(float *array, int size) { + for(int i = 0; i bucket[size]; + for(int i = 0; i> n; + float arr[n]; //create an array with given number of elements + cout << "Enter elements:" << endl; + for(int i = 0; i> arr[i]; + } + cout << "Array before Sorting: "; + display(arr, n); + bucketSort(arr, n); + cout << "Array after Sorting: "; + display(arr, n); +} +