From 323e6299d0bffb73080ea298a5e14da6e73d9046 Mon Sep 17 00:00:00 2001 From: Hankai Zhang Date: Sun, 28 Jun 2020 21:30:55 -0400 Subject: [PATCH 1/8] Minor additions to languages page. --- content/1_Intro/Languages.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/1_Intro/Languages.md b/content/1_Intro/Languages.md index 0ed7efb..f846b6a 100644 --- a/content/1_Intro/Languages.md +++ b/content/1_Intro/Languages.md @@ -4,15 +4,15 @@ title: Languages author: Nathan Wang, Benjamin Qi description: What languages you can use for programming contests and what you're expected to know before continuing. --- - + ## Choosing a Language -The most popular languages that USACO supports are [C++11](https://en.wikipedia.org/wiki/C%2B%2B), [Java](https://en.wikipedia.org/wiki/Java_(programming_language)), and [Python 3](https://en.wikipedia.org/wiki/Python_(programming_language)). In general, we recommend the following: +The most popular languages that USACO supports are [C++11](https://en.wikipedia.org/wiki/C%2B%2B), [Java](https://en.wikipedia.org/wiki/Java_(programming_language)), and [Python 3](https://en.wikipedia.org/wiki/Python_(programming_language)). Pascal used to be popular in the past, but its use is rare now, and many programming contests have removed or are planning to remove support for it in the near future (in short: don't use it now). In general, we recommend the following: - - If you already know one of these languages, just use it. + - If you already know one of these languages, just use it. - If you know multiple languages, we recommend you pick C++ over Java, and Java over Python. - For Bronze, any language will do. - - For Silver, Gold, and Platinum, Python is not recommended. + - For Silver, Gold, and Platinum, Python is not recommended, because it is a slow language. Some upper-division problems are nearly impossible to solve in Python because the large amount of computation needed cannot be performed in Python without exceeding the time limit. Keep in mind that it's easy to switch languages down the road. Don't get caught up on which language to choose. Just pick the one you feel most comfortable with! @@ -41,7 +41,7 @@ The remainder of this guide assumes that you know the basics of how to code in o - Arrays - Multidimensional Arrays -In particular, contestants using Java should be familiar with roughly the first half of AP Computer Science A. +In particular, contestants using Java should be familiar with roughly the first half of AP Computer Science A. - If you do not meet these prerequisites, see the links below to get started. - Familiarity with [competition math](https://github.com/bqi343/USACO/blob/master/Resources/Competition%20Math.md) (ex. AIME qualification) is helpful but not required. @@ -81,4 +81,4 @@ Let us know what works (or doesn't) for you. - \ No newline at end of file + From b728c62e7a17cb05294047a4d7e83bb286ffe2ba Mon Sep 17 00:00:00 2001 From: Benjamin Qi Date: Sun, 28 Jun 2020 21:31:37 -0400 Subject: [PATCH 2/8] convert to mdx --- .../1_Intro/{Data_Types.md => Data_Types.mdx} | 0 .../{Example_Problem.mdx => Ex_Prob.mdx} | 21 +++++++------------ .../{Input_Output.md => Input_Output.mdx} | 13 +++++------- content/1_Intro/{Intro.md => Intro.mdx} | 0 .../1_Intro/{Languages.md => Languages.mdx} | 0 ...ntest_Strategy.md => Contest_Strategy.mdx} | 0 .../2_General/{Contests.md => Contests.mdx} | 0 .../2_General/{Debugging.md => Debugging.mdx} | 0 content/2_General/IO_Speed.mdx | 18 ++++++++++++++++ content/2_General/{Macros.md => Macros.mdx} | 0 .../{Practicing.md => Practicing.mdx} | 0 .../2_General/{Proposing.md => Proposing.mdx} | 0 .../2_General/{Resources.md => Resources.mdx} | 0 content/2_General/{Why_Cpp.md => Why_Cpp.mdx} | 0 content/ordering.ts | 1 + 15 files changed, 31 insertions(+), 22 deletions(-) rename content/1_Intro/{Data_Types.md => Data_Types.mdx} (100%) rename content/1_Intro/{Example_Problem.mdx => Ex_Prob.mdx} (85%) rename content/1_Intro/{Input_Output.md => Input_Output.mdx} (97%) rename content/1_Intro/{Intro.md => Intro.mdx} (100%) rename content/1_Intro/{Languages.md => Languages.mdx} (100%) rename content/2_General/{Contest_Strategy.md => Contest_Strategy.mdx} (100%) rename content/2_General/{Contests.md => Contests.mdx} (100%) rename content/2_General/{Debugging.md => Debugging.mdx} (100%) create mode 100644 content/2_General/IO_Speed.mdx rename content/2_General/{Macros.md => Macros.mdx} (100%) rename content/2_General/{Practicing.md => Practicing.mdx} (100%) rename content/2_General/{Proposing.md => Proposing.mdx} (100%) rename content/2_General/{Resources.md => Resources.mdx} (100%) rename content/2_General/{Why_Cpp.md => Why_Cpp.mdx} (100%) diff --git a/content/1_Intro/Data_Types.md b/content/1_Intro/Data_Types.mdx similarity index 100% rename from content/1_Intro/Data_Types.md rename to content/1_Intro/Data_Types.mdx diff --git a/content/1_Intro/Example_Problem.mdx b/content/1_Intro/Ex_Prob.mdx similarity index 85% rename from content/1_Intro/Example_Problem.mdx rename to content/1_Intro/Ex_Prob.mdx index 57b1e37..f6c939d 100644 --- a/content/1_Intro/Example_Problem.mdx +++ b/content/1_Intro/Ex_Prob.mdx @@ -12,6 +12,9 @@ import { Problem } from "../models"; export const metadata = { problems: { + fence: [ + new Problem("Bronze", "Fence Painting", "567", "Intro"), + ], general: [ new Problem("Bronze", "Promotion Counting", "591", "Intro"), new Problem("Bronze", "Word Processor", "987", "Intro"), @@ -23,9 +26,11 @@ export const metadata = { [Technical Specifications for USACO Contests](http://www.usaco.org/index.php?page=instructions) -## Example: [Fence Painting](http://usaco.org/index.php?page=viewproblem2&cpid=567) +## Example: Fence Painting -USACO will automatically add a newline to the end of your file if it does not end with one. Make sure not to output trailing spaces! + + +Importantly, USACO will automatically add a newline to the end of your file if it does not end with one. **Make sure not to output trailing spaces!** ### C++ @@ -56,17 +61,6 @@ int main() { } ``` - -(using scanf, printf instead?) - -(not using endl?) - -Including `ios_base::sync_with_stdio(0); cin.tie(0);` in the main function can speed up input & output significantly on some tasks. See [here](https://codeforces.com/blog/entry/5217) and [StackOverflow](https://stackoverflow.com/questions/31162367/significance-of-ios-basesync-with-stdiofalse-cin-tienull) for more information. - - - Actually, the former link says that it is supposedly prohibited to use `freopen` to redirect `cin` and `cout` if `ios_base::sync_with_stdio(0); cin.tie(0);` is included, but it works properly as far as I know. - - - #### Method 2 Use [ifstream & ofstream](http://www.cplusplus.com/doc/tutorial/files/). @@ -202,5 +196,4 @@ The following require relatively little programming experience and no algorithmi - Also check the [CSES Introductory Problems](https://cses.fi/problemset/list/) up to and including "Palindrome Reorder." \ No newline at end of file diff --git a/content/1_Intro/Input_Output.md b/content/1_Intro/Input_Output.mdx similarity index 97% rename from content/1_Intro/Input_Output.md rename to content/1_Intro/Input_Output.mdx index 298d47d..d137e87 100644 --- a/content/1_Intro/Input_Output.md +++ b/content/1_Intro/Input_Output.mdx @@ -5,15 +5,12 @@ author: Darren Yao description: Demonstrates how to read input and print output for USACO contests. --- -## Additional Reading +## Brief Descriptions - - CSES 1.2 - -cin, getline, files - - - [PAPC 2.4](http://www.csc.kth.se/~jsannemo/slask/main.pdf) - -cin, getline + + cin, getline, files + cin, getline + ## Standard I/O diff --git a/content/1_Intro/Intro.md b/content/1_Intro/Intro.mdx similarity index 100% rename from content/1_Intro/Intro.md rename to content/1_Intro/Intro.mdx diff --git a/content/1_Intro/Languages.md b/content/1_Intro/Languages.mdx similarity index 100% rename from content/1_Intro/Languages.md rename to content/1_Intro/Languages.mdx diff --git a/content/2_General/Contest_Strategy.md b/content/2_General/Contest_Strategy.mdx similarity index 100% rename from content/2_General/Contest_Strategy.md rename to content/2_General/Contest_Strategy.mdx diff --git a/content/2_General/Contests.md b/content/2_General/Contests.mdx similarity index 100% rename from content/2_General/Contests.md rename to content/2_General/Contests.mdx diff --git a/content/2_General/Debugging.md b/content/2_General/Debugging.mdx similarity index 100% rename from content/2_General/Debugging.md rename to content/2_General/Debugging.mdx diff --git a/content/2_General/IO_Speed.mdx b/content/2_General/IO_Speed.mdx new file mode 100644 index 0000000..733af71 --- /dev/null +++ b/content/2_General/IO_Speed.mdx @@ -0,0 +1,18 @@ +--- +id: io-speed +title: Input / Output Speed +author: ? +description: "" +--- + +(actually figure out what makes a dif on USACO lol) + +## C++ + +(using scanf, printf instead?) + +(not using endl?) + +Including `ios_base::sync_with_stdio(0); cin.tie(0);` in the main function can speed up input & output significantly on some tasks. See [here](https://codeforces.com/blog/entry/5217) and [StackOverflow](https://stackoverflow.com/questions/31162367/significance-of-ios-basesync-with-stdiofalse-cin-tienull) for more information. + + - Actually, the former link says that it is supposedly prohibited to use `freopen` to redirect `cin` and `cout` if `ios_base::sync_with_stdio(0); cin.tie(0);` is included, but it works properly as far as I know. diff --git a/content/2_General/Macros.md b/content/2_General/Macros.mdx similarity index 100% rename from content/2_General/Macros.md rename to content/2_General/Macros.mdx diff --git a/content/2_General/Practicing.md b/content/2_General/Practicing.mdx similarity index 100% rename from content/2_General/Practicing.md rename to content/2_General/Practicing.mdx diff --git a/content/2_General/Proposing.md b/content/2_General/Proposing.mdx similarity index 100% rename from content/2_General/Proposing.md rename to content/2_General/Proposing.mdx diff --git a/content/2_General/Resources.md b/content/2_General/Resources.mdx similarity index 100% rename from content/2_General/Resources.md rename to content/2_General/Resources.mdx diff --git a/content/2_General/Why_Cpp.md b/content/2_General/Why_Cpp.mdx similarity index 100% rename from content/2_General/Why_Cpp.md rename to content/2_General/Why_Cpp.mdx diff --git a/content/ordering.ts b/content/ordering.ts index 36b2aba..0ee0e9e 100644 --- a/content/ordering.ts +++ b/content/ordering.ts @@ -24,6 +24,7 @@ const ModuleOrdering: {[key: string]: ModuleOrderingItem[]} = { { name: "Language-Specific", items: [ + "io-speed", "why-cpp", "macros", "debugging", From 130adc9c4b6e19468157c9d7c1a48161c8699060 Mon Sep 17 00:00:00 2001 From: Hankai Zhang Date: Sun, 28 Jun 2020 21:43:47 -0400 Subject: [PATCH 3/8] Add link to CF tutorial on some advanced DP techniques. --- content/6_Plat/DP_More.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/6_Plat/DP_More.mdx b/content/6_Plat/DP_More.mdx index 28b57e4..b0224d9 100644 --- a/content/6_Plat/DP_More.mdx +++ b/content/6_Plat/DP_More.mdx @@ -10,6 +10,8 @@ D&C: Mowing: http://www.usaco.org/index.php?page=viewproblem2&cpid=926 +Miscellaneous Techniques: https://codeforces.com/blog/entry/47764 + There are [plenty](https://github.com/bqi343/USACO/blob/master/Contests/USACO%20Links/Division-Specific/Platinum.md) of Platinum DP problems that are not covered by this guide; we recommend that you work through these on your own. @@ -20,4 +22,4 @@ There are [plenty](https://github.com/bqi343/USACO/blob/master/Contests/USACO%20 Queue w/ Two Stacks is used to remove a factor of $O(\log N)$ in [USACO Plat - Mowing Mischief](http://www.usaco.org/index.php?page=viewproblem2&cpid=926). - \ No newline at end of file + From 9260294d44ebb07529b2e1063d318a93471ad271 Mon Sep 17 00:00:00 2001 From: Benjamin Qi Date: Sun, 28 Jun 2020 23:13:00 -0400 Subject: [PATCH 4/8] bronze maybe useful --- content/1_Intro/Languages.mdx | 38 +++++++++---------- content/2_General/Contests.mdx | 49 +++++++++++------------- content/2_General/Practicing.mdx | 2 +- content/3_Bronze/Complete_Search.mdx | 56 +++++++++++++--------------- content/3_Bronze/Cpp_Containers.mdx | 8 ++-- content/3_Bronze/Intro_Sorting.mdx | 14 ++++--- content/3_Bronze/Rect_Geo.mdx | 8 +++- content/3_Bronze/Simulation.mdx | 46 +++++++++++++---------- src/components/ModuleLayout.tsx | 2 +- 9 files changed, 114 insertions(+), 109 deletions(-) diff --git a/content/1_Intro/Languages.mdx b/content/1_Intro/Languages.mdx index f846b6a..5c9091f 100644 --- a/content/1_Intro/Languages.mdx +++ b/content/1_Intro/Languages.mdx @@ -12,7 +12,7 @@ The most popular languages that USACO supports are [C++11](https://en.wikipedia. - If you already know one of these languages, just use it. - If you know multiple languages, we recommend you pick C++ over Java, and Java over Python. - For Bronze, any language will do. - - For Silver, Gold, and Platinum, Python is not recommended, because it is a slow language. Some upper-division problems are nearly impossible to solve in Python because the large amount of computation needed cannot be performed in Python without exceeding the time limit. + - For Silver, Gold, and Platinum, Python is not recommended, because it is a slow language. See "Why C++?" for more information about this. Keep in mind that it's easy to switch languages down the road. Don't get caught up on which language to choose. Just pick the one you feel most comfortable with! @@ -48,37 +48,35 @@ In particular, contestants using Java should be familiar with roughly the first ## Resources for Learning How to Code +Let us know what works (or doesn't) for you. + +### General + + + courses for C++, Java, Python + basic problems, mostly loops + + ### C++ -Use one of these resources (or find your own) to learn C++. +Use one of the resources above or below (or find your own) to learn C++. If you use Sololearn, you don't have to complete the full course; we recommend you finish everything up to (but not including) "More on Classes." - - also courses for Java, Python - + + lots of examples, Kattis exercises -If you use Sololearn, we recommend you finish everything up to (but not including) "More on Classes." You don't have to complete the full course. - You do not need to learn pointers (for now). Knowledge of structs and classes is useful but not required. - ## Resources for Getting Started - - -Let us know what works (or doesn't) for you. - - - can practice basics with "Arcade," "Interview Practice" - lots of links! - not so up to date - generally good, although CSES (see resources) is definitely a better place to start than USACO Training or Codechef + + can practice basics with "Arcade," "Interview Practice" + lots of links! + not up to date + generally good, although CSES problemset (see "Resources") is definitely a better place to start than USACO Training or Codechef - - - diff --git a/content/2_General/Contests.mdx b/content/2_General/Contests.mdx index 109684c..e4293b4 100644 --- a/content/2_General/Contests.mdx +++ b/content/2_General/Contests.mdx @@ -9,6 +9,8 @@ See [clist.by](https://clist.by/coder/bqi343/) for an extensive list of contests Make sure to [upsolve](https://en.wiktionary.org/wiki/upsolve) after the contest ends! +## Contests that I regularly participate in + - [AtCoder](https://beta.atcoder.jp/contests/archive) - probably the highest quality, although difficulty isn't always reasonable - Contests @@ -27,6 +29,9 @@ Make sure to [upsolve](https://en.wiktionary.org/wiki/upsolve) after the contest - Solutions only tested after contest! - [Don Mills OJ](http://dmoj.ca/) - at least one contest every month during school year + +## Other Websites + - [Google Kickstart](https://codingcompetitions.withgoogle.com/kickstart) - Feb - Nov - [Kattis](https://open.kattis.com/) @@ -46,42 +51,32 @@ The following websites do not hold regular contests anymore, but they're still w - Open: 7 problems, 2 hrs - no more? D: - Archive - - short statements, editorials + - short statements, good editorials - solve statistics - ability to view best solutions - - I've done nearly all of the problems. :D + - I've done nearly all of the problems. - [HackerRank](https://www.hackerrank.com/dashboard) + - hack the interview!! ## Annual Contests - - [Google Code Jam](https://code.google.com/codejam/): Apr - - 25 from R3 - - [Facebook Hacker Cup](https://www.facebook.com/hackercup/): Jun-Jul -> Oct?? - - 25 from R3 - - [Topcoder Open](https://tco19.topcoder.com/): Apr-Aug -> Nov - - 4 from SRMs - - 10 from R4 - - 2 from Wildcard - - [AtCoder World Tour Finals](https://codeforces.com/blog/entry/56623) - - 8 from AGC - - [Bubble Cup](http://bubblecup.org/): Apr + + 25 from R3 + 25 from R3 + 4 from SRMs, 10 from R4, 2 from wildcard + 8 from AGC + ## US High School - - [VT HSPC](https://icpc.cs.vt.edu/#/hscontest2017) - - Online - - 5 hours - - [Kattis](https://open.kattis.com/problem-sources/2016%20Virginia%20Tech%20High%20School%20Programming%20Contest) - - December - - [UCF HSPT](https://hspt.ucfprogrammingteam.org/index.php/hspt-online-edition) - - Online - - 4 hours - - December - - [Cornell HSPC](https://www.cs.cornell.edu/events/cornell-high-school-programming-contest) - - [2019](https://cornell-hspc19.kattis.com/problems) - - [PClassic (Philadelphia)](https://pclassic.org/) - - Java only :(( - - [mBIT (Montgomery Blair HS)](https://mbit.mbhs.edu/) +Only considering contests which allow C++ since the others aren't legit. (add more?) + + + December, online, teams of 3, 5 hours, past problems on Kattis + Decmeber, online, individual, 4 hours + April, teams of 3, 3 hours, 2019 problems + online, teams of 4, 4 hours + ## Codeforces Tools diff --git a/content/2_General/Practicing.mdx b/content/2_General/Practicing.mdx index 8f7fe22..9dc8b85 100644 --- a/content/2_General/Practicing.mdx +++ b/content/2_General/Practicing.mdx @@ -21,7 +21,7 @@ In general, I think it’s fine to read the solution relatively early on, as lon Problems that you practice with should be of the appropriate difficulty. You don't necessarily need to complete all the exercises at the end of each module, just do what you think is right for you. A problem at the right level of difficulty should be one of two types: either you struggle with the problem for a while before coming up with a working solution, or you miss it slightly and need to consult the solution for some small part. If you instantly come up with the solution, a problem is likely too easy, and if you're missing multiple steps, it might be too hard. -[This](https://web.evanchen.cc/FAQs/raqs.html) and [this](https://usamo.wordpress.com/2019/01/31/math-contest-platitudes-v3/) are two blog posts by Evan Chen that I find quite insightful. They discuss such things as time management, the problem-solving process, and other tips that you may find useful. +[This](https://web.evanchen.cc/FAQs/raqs.html) and [this](https://usamo.wordpress.com/2019/01/31/math-contest-platitudes-v3/) are two blog posts by Evan Chen that I find quite insightful. They discuss such things as time management, the problem-solving process, and other tips that you may find useful. See [my website](https://darrenyao.com/beginner) for more information. ## Nathan Wang diff --git a/content/3_Bronze/Complete_Search.mdx b/content/3_Bronze/Complete_Search.mdx index 631cb61..080b852 100644 --- a/content/3_Bronze/Complete_Search.mdx +++ b/content/3_Bronze/Complete_Search.mdx @@ -10,30 +10,32 @@ import { Problem } from "../models"; export const metadata = { problems: { - cses: [ - new Problem("CSES", "Creating Strings I", "1622", "Intro", false, []), - new Problem("CSES", "Apple Division", "1623", "Intro", false, []), - new Problem("CSES", "Chessboard and Queens", "1624", "Easy", false, []), + easier: [ + new Problem("CSES", "Creating Strings I", "1622", "Intro", false, [], "all perms of string"), + new Problem("CSES", "Apple Division", "1623", "Intro", false, [], "all $2^n$ subsets"), + new Problem("Bronze", "Diamond Collector", "639", "Easy", false, [], "fix the min"), // 99.9 + new Problem("Bronze", "Milk Pails", "615", "Easy", false, [], "Hint: Fix the number of first-type operations you perform."), // 99.71 + new Problem("Bronze", "Bovine Genomics", "736", "Easy", false, [], ""), // 99.73 + new Problem("Bronze", "Cow Gymnastics", "963", "Easy", false, [], "Hint: Brute force over all possible pairs."), // 99.93 + new Problem("Bronze", "Where Am I?", "964", "Easy", false, [], "Hint: Brute force over all possible substrings."), // 99.48 + new Problem("Bronze", "Triangles", "1011", "Easy", false, [], "loop over the possible right angles"), // 98.02 ], - bronze: [ - new Problem("Bronze", "Milk Pails", "615", "Intro", false, [], "Hint: Fix the number of first-type operations you perform."), - new Problem("Bronze", "Triangles", "1011", "Easy", false, [], ""), - new Problem("Bronze", "Cow Gymnastics", "963", "Easy", false, [], "Hint: Brute force over all possible pairs."), - new Problem("Bronze", "Lifeguards", "784", "Easy", false, [], "Hint: Try removing each lifeguard one at a time."), - new Problem("Bronze", "Where Am I?", "964", "Easy", false, [], "Hint: Brute force over all possible substrings."), - new Problem("Bronze", "Photoshoot", "988", "Normal", false, [], "Hint: Figure out what exactly you're complete searching."), - new Problem("Bronze", "Field Reduction", "641", "Normal", false, [], "Hint: For this problem, you can't do a full complete search; you have to do a reduced search."), - new Problem("Bronze", "Back & Forth", "857", "Hard", false, [], ""), - new Problem("Bronze", "Livestock Lineup", "965", "Hard", false, ["permutations"], ""), + harder: [ + new Problem("CSES", "Chessboard and Queens", "1624", "Normal", false, [], "backtracking"), + new Problem("Bronze", "Lifeguards", "784", "Normal", false, [], "Hint: Try removing each lifeguard one at a time."), // 98.76 + new Problem("Bronze", "Photoshoot", "988", "Normal", false, [], "Hint: Figure out what exactly you're complete searching."), // 98.45 + new Problem("Bronze", "Back & Forth", "857", "Hard", false, [], "exponential time going through all possibilities"), // 99.63 + new Problem("Bronze", "Livestock Lineup", "965", "Hard", false, ["permutations"], ""), // 91.95 + new Problem("Bronze", "Field Reduction", "641", "Hard", false, [], "Hint: For this problem, you can't do a full complete search; you have to do a reduced search."), // 91.75 + new Problem("Bronze", "Circle Cross", "712", "Hard", false, [], ""), // 89.6 + new Problem("Silver", "Bovine Genomics", "739", "Hard", false, [], ""), + new Problem("Bronze", "Load Balancing", "617", "Very Hard", false, [], ""), // 82.79 + new Problem("Bronze", "Bull in a China Shop", "640", "Very Hard", false, [], "lots of WA on this one"), // 47.38 + new Problem("Silver", "Field Reduction", "642", "Very Hard", false, [], ""), ], - silver: [ - new Problem("Silver", "Bovine Genomics", "739", "Normal", false, [], ""), - new Problem("Silver", "Field Reduction", "642", "Normal", false, [], ""), - ] } }; - ## Additional Reading - CPH 5.1 - 5.3 (Complete Search) @@ -109,7 +111,7 @@ A **permutation** is a reordering of a list of elements. Some problems will ask In Java, we'll have to implement this ourselves, which is called [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm) (no relation to the heap data structure). What's going to be in the check function depends on the problem, but it should verify whether the current permutation satisfies the constraints given in the problem. -As an example, here are the permutations generated by Heap's Algorithm for \([1, 2, 3]\): +As an example, here are the permutations generated by Heap's Algorithm for $[1, 2, 3]$: $$ [1, 2, 3], [2, 1, 3], [3, 1, 2], [1, 3, 2], [2, 3, 1], [3, 2, 1] @@ -145,16 +147,10 @@ do { Note that this generates the permutations in **lexicographical order** (explanation) -## Problems +## Easier Problems - + - +## Harder Problems -Load Balancing: 617 -Bull in a China Shop: 640 -Bovine Genomics: 736 -Diamond Collector: 639 -Circle Cross: 712 - - \ No newline at end of file + diff --git a/content/3_Bronze/Cpp_Containers.mdx b/content/3_Bronze/Cpp_Containers.mdx index b966312..d1f349c 100644 --- a/content/3_Bronze/Cpp_Containers.mdx +++ b/content/3_Bronze/Cpp_Containers.mdx @@ -8,9 +8,11 @@ frequency: 4 ## Additional Resources - - CPH 4 (Data Structures) - - [PAPS 3.1, 3.5, 6.1](https://www.csc.kth.se/~jsannemo/slask/main.pdf) - - [CPC.2](https://github.com/SuprDewd/T-414-AFLV/tree/master/02_data_structures) + + structures mentioned in 4.5 are covered later + vectors, sets, maps + assumes prior experience + # Data Structures diff --git a/content/3_Bronze/Intro_Sorting.mdx b/content/3_Bronze/Intro_Sorting.mdx index 1c2207b..c9a2f3a 100644 --- a/content/3_Bronze/Intro_Sorting.mdx +++ b/content/3_Bronze/Intro_Sorting.mdx @@ -26,7 +26,7 @@ export const metadata = { **Sorting** is exactly what it sounds like: arranging items in some particular order. -No bronze problem requires sorting, but it can be an alternate solution that is sometimes much easier to implement. +No bronze problem should require sorting, but it can be an alternate solution that is sometimes much easier to implement. ## Additional Resources @@ -78,11 +78,13 @@ Other variations are similar, such as the following: ### Tutorial - - CSES 3.3 - - [CSAcademy Binary Search](https://csacademy.com/lesson/binary_search) - - [Topcoder Binary Search](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-search/) - - [KhanAcademy Binary Search](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search) - - [GeeksForGeeks](https://www.geeksforgeeks.org/binary-search/) + + animations! + animation! + + + + ### Library Functions to do Binary Search diff --git a/content/3_Bronze/Rect_Geo.mdx b/content/3_Bronze/Rect_Geo.mdx index 9427260..552c294 100644 --- a/content/3_Bronze/Rect_Geo.mdx +++ b/content/3_Bronze/Rect_Geo.mdx @@ -9,6 +9,9 @@ import { Problem } from "../models"; export const metadata = { problems: { + blocked: [ + new Problem("Bronze", "Blocked Billboard", "759", "Easy", false, ["rect"]), + ], general: [ new Problem("Bronze", "Square Pasture", "663", "Intro", false, ["rect"]), new Problem("Bronze", "Blocked Billboard II", "783", "Easy", false, ["rect"]), @@ -17,10 +20,11 @@ export const metadata = { } }; - Most only include two or three squares or rectangles, in which case you can simply draw out cases on paper. This should logically lead to a solution. -## Example: [Blocked Billboard](http://usaco.org/index.php?page=viewproblem2&cpid=759) +## Example: Bronze - Blocked Billboard + + ### Naive Solution diff --git a/content/3_Bronze/Simulation.mdx b/content/3_Bronze/Simulation.mdx index 06fac0a..9ca69db 100644 --- a/content/3_Bronze/Simulation.mdx +++ b/content/3_Bronze/Simulation.mdx @@ -10,19 +10,21 @@ import { Problem } from "../models" export const metadata = { problems: { - bronze: [ - new Problem("Bronze", "Mixing Milk", "855", "Intro"), - new Problem("Bronze", "Speeding", "568", "Intro"), - new Problem("Bronze", "Angry Cows", "592", "Intro"), - new Problem("Bronze", "Milk Measurement", "761", "Intro"), - new Problem("Bronze", "Block Game", "664", "Intro"), - new Problem("Bronze", "Shell Game", "891", "Intro"), - new Problem("Bronze", "Team Tic Tac Toe", "831", "Intro"), - new Problem("Bronze", "The Lost Cow", "735", "Intro", false, [], ""), - new Problem("Bronze", "Why Did the Cow Cross the Road III", "713", "Intro", false, []), - new Problem("Bronze", "Mowing the Field", "593", "Intro", false, []), - new Problem("Bronze", "The Bovine Shuffle", "760", "Normal", false, []), - new Problem("Bronze", "Circular Barn", "616", "Normal", false, []), + easier: [ + new Problem("Bronze", "Shell Game", "891", "Easy"), // 99.93 + new Problem("Bronze", "Mixing Milk", "855", "Easy", false, [], "just pour 100 times"), // 99.87 + new Problem("Bronze", "Speeding", "568", "Easy", false, [], "store speed for each mile"), // 99.05 + new Problem("Bronze", "The Lost Cow", "735", "Easy", false, [], ""), // 99.46 + new Problem("Bronze", "The Bovine Shuffle", "760", "Easy", false, []), // 100 + ], + harder: [ + new Problem("Bronze", "Circular Barn", "616", "Normal", false, []), // 99.25 + new Problem("Bronze", "Block Game", "664", "Normal"), // 97.41 + new Problem("Bronze", "Team Tic Tac Toe", "831", "Normal"), // 97.41 + new Problem("Bronze", "Cow Queue", "713", "Normal", false, []), // 97.59 + new Problem("Bronze", "Mowing the Field", "593", "Normal", false, []), // 97.16 + new Problem("Bronze", "Milk Measurement", "761", "Hard"), // 95.97 + new Problem("Bronze", "Angry Cows", "592", "Hard", false, [], ""), // 94.15 ] } }; @@ -47,11 +49,11 @@ Please output a single integer containing the number of seconds after the start ### Solution -We can simulate the process. After inputting the values of $R$, $S$, $M$, $N$, $P$, and $Q$, we can keep track of Alice's and Bob's $x$- and $y$-coordinates. To start, we initialize variables for their respective positions. Alice's coordinates are initially \((0, 0)\), and Bob's coordinates are $(R, S)$ respectively. Every second, we increase Alice's $x$-coordinate by $M$ and her $y$-coordinate by $N$, and decrease Bob's $x$-coordinate by $P$ and his $y$-coordinate by $Q$. +We can simulate the process. After inputting the values of $R$, $S$, $M$, $N$, $P$, and $Q$, we can keep track of Alice's and Bob's $x$- and $y$-coordinates. To start, we initialize variables for their respective positions. Alice's coordinates are initially $(0, 0)$, and Bob's coordinates are $(R, S)$ respectively. Every second, we increase Alice's $x$-coordinate by $M$ and her $y$-coordinate by $N$, and decrease Bob's $x$-coordinate by $P$ and his $y$-coordinate by $Q$. Now, when do we stop? First, if Alice and Bob ever have the same coordinates, then we are done. Also, since Alice strictly moves up and to the right and Bob strictly moves down and to the left, if Alice's $x$- or $y$-coordinates are ever greater than Bob's, then it is impossible for them to meet. -Example Java code is displayed below. Here, as in other examples, input processing will be omitted). +Example Java code is displayed below. Here, as in other examples, input processing will be omitted. ```java int ax = 0; int ay = 0; // alice's x and y coordinates @@ -71,14 +73,14 @@ if(ax == bx && ay == by){ // if they are in the same location out.close(); // flush the output ``` -For C++, replaces lines such as `out.println(t)` with `cout << t << endl`. +For C++, replace lines such as `out.println(t)` with `cout << t << endl`. ## Example 2 ### Statement -There are $N$ buckets ($5 \leq N \leq 10^5$), each with a certain capacity $C_i$ ($1 \leq C_i \leq 100$). One day, after a rainstorm, each bucket is filled with $A_i$ units of water ($1\leq A_i \leq C_i$). Charlie then performs the following process: he pours bucket 1 into bucket 2, then bucket 2 into bucket 3, and so on, up until pouring bucket $N-1$ into bucket $N$. When Charlie pours bucket $B$ into bucket $B+1$, he pours as much as possible until bucket $B$ is empty or bucket $B+1$ is full. Find out how much water is in each bucket once Charlie is done pouring. +There are $N$ buckets ($5 \leq N \leq 10^5$), each with a certain capacity $C_i$ ($1 \leq C_i \leq 100$). One day, after a rainstorm, each bucket is filled with $A_i$ units of water ($1\leq A_i \leq C_i$). Charlie then performs the following process: he pours bucket $1$ into bucket $2$, then bucket $2$ into bucket $3$, and so on, up until pouring bucket $N-1$ into bucket $N$. When Charlie pours bucket $B$ into bucket $B+1$, he pours as much as possible until bucket $B$ is empty or bucket $B+1$ is full. Find out how much water is in each bucket once Charlie is done pouring. #### Input Format @@ -94,7 +96,7 @@ Please print one line of output, containing $N$ space-separated integers: the fi ### Solution -Once again, we can simulate the process of pouring one bucket into the next. The amount of milk poured from bucket $B$ to bucket $B+1$ is the smaller of the amount of water in bucket $B$ (after all previous operations have been completed) and the remaining space in bucket $B+1$, which is $C_{B+1} - A_{B+1}$. We can just handle all of these operations in order, using an array C to store the maximum capacities of each bucket, and an array A to store the current water level in each bucket, which we update during the process. Example code is below (note that arrays are zero-indexed, so the indices of our buckets go from $0$ to $N-1$ rather than from $1$ to $N$). +Once again, we can simulate the process of pouring one bucket into the next. The amount of milk poured from bucket $B$ to bucket $B+1$ is the smaller of the amount of water in bucket $B$ (after all previous operations have been completed) and the remaining space in bucket $B+1$, which is $C_{B+1} - A_{B+1}$. We can just handle all of these operations in order, using an array $C$ to store the maximum capacities of each bucket, and an array $A$ to store the current water level in each bucket, which we update during the process. Example code is below (note that arrays are zero-indexed, so the indices of our buckets go from $0$ to $N-1$ rather than from $1$ to $N$). Java: @@ -135,4 +137,10 @@ for(int i = 0; i < n; i++){ cout << endl; ``` - +## Easier Problems + + + +## Harder Problems + + \ No newline at end of file diff --git a/src/components/ModuleLayout.tsx b/src/components/ModuleLayout.tsx index a211532..6ad4059 100644 --- a/src/components/ModuleLayout.tsx +++ b/src/components/ModuleLayout.tsx @@ -33,7 +33,7 @@ const Frequency = ({ frequency }: { frequency: ModuleFrequency }) => { 'Rare (1-2 times)', 'Not Frequent (3-4 times)', 'Somewhat Frequent', - 'Very Frequent (historically ~ once per contest)', + 'Very Frequent (historically at least once per contest)', ]; return ( From c83f150a73fd8e60a8fc5145f0909b5f485cc58b Mon Sep 17 00:00:00 2001 From: Hankai Zhang Date: Sun, 28 Jun 2020 23:23:54 -0400 Subject: [PATCH 5/8] Most Codeforces and ABC/ARC contests are 6 problems nowdays --- content/2_General/Contests.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/2_General/Contests.mdx b/content/2_General/Contests.mdx index e4293b4..62b5852 100644 --- a/content/2_General/Contests.mdx +++ b/content/2_General/Contests.mdx @@ -14,13 +14,13 @@ Make sure to [upsolve](https://en.wiktionary.org/wiki/upsolve) after the contest - [AtCoder](https://beta.atcoder.jp/contests/archive) - probably the highest quality, although difficulty isn't always reasonable - Contests - - Beginner / Regular: 4 problems, 100 min + - Beginner / Regular: 4 or 6 problems, ~100 min - Grand: 6 problems, ~110 min - [Visualizer](https://kenkoooo.com/atcoder/#/table/Benq) - I've done nearly all of the AGC problems. - [Codeforces](http://codeforces.com/problemset) - Contests - - Div 2, Div 1: 5 problems, 2 hrs + - Div 1/2/3/(4?): 5-6 problems (with some variations), 2 to 2.5 hrs - Archive - problem quality, difficulty ratings are ok but not always great - [Topcoder](https://www.topcoder.com/my-dashboard/) From b4fc1f73ceed8f275421df2e68132a67d3838508 Mon Sep 17 00:00:00 2001 From: Darren Yao Date: Sun, 28 Jun 2020 21:36:53 -0700 Subject: [PATCH 6/8] Update Complete_Search.mdx --- content/3_Bronze/Complete_Search.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/content/3_Bronze/Complete_Search.mdx b/content/3_Bronze/Complete_Search.mdx index 080b852..637b0f6 100644 --- a/content/3_Bronze/Complete_Search.mdx +++ b/content/3_Bronze/Complete_Search.mdx @@ -134,6 +134,7 @@ static void generate(int[] arr, int k){ swap(arr, 0, k-1); // swap indices 0 and k-1 of arr } + generate(arr, k-1); } } } From f1077205248fb4d86bcbc7c0ccf0ff3a69052786 Mon Sep 17 00:00:00 2001 From: Benjamin Qi Date: Mon, 29 Jun 2020 15:42:49 -0400 Subject: [PATCH 7/8] range queries --- content/5_Gold/PURQ.mdx | 15 +++--- content/6_Plat/Merging.mdx | 43 ++++++++-------- content/6_Plat/RURQ.mdx | 7 ++- content/7_Advanced/Treaps.mdx | 93 +++++++++++++++++++++++++++++++++-- 4 files changed, 126 insertions(+), 32 deletions(-) diff --git a/content/5_Gold/PURQ.mdx b/content/5_Gold/PURQ.mdx index 47299d0..4a7d590 100644 --- a/content/5_Gold/PURQ.mdx +++ b/content/5_Gold/PURQ.mdx @@ -29,21 +29,22 @@ export const metadata = { A **segment tree** allows you to do point update and range query in $O(\log N)$ time each for any associative operation. - - -For gold, you only need to know the basics (ex. sum, min queries). More advanced applications (such as *lazy propagation*) are restricted to platinum. - - ### Tutorials + + +For gold, you only need to know the basics (ex. sum, min queries). You can skip more advanced applications such as **lazy propagation** for now. + + + interactive simple implementation same implementation as above - + see slides after union-find + - ### Problems diff --git a/content/6_Plat/Merging.mdx b/content/6_Plat/Merging.mdx index 56221c2..706c471 100644 --- a/content/6_Plat/Merging.mdx +++ b/content/6_Plat/Merging.mdx @@ -23,9 +23,6 @@ export const metadata = { new Problem("POI", "Tree Rotations", "https://szkopul.edu.pl/problemset/problem/sUe3qzxBtasek-RAWmZaxY_p/site/?key=statement", "Normal", false, ["Merging", "Indexed Set"], ""), new Problem("Gold", "Favorite Colors", "1042", "Hard", false, ["DSU"], "Small to large merging is mentioned in the editorial, but we were unable to break solutions that just merged naively. Alternatively, just merge linked lists in $O(1)$ time."), ], - treeRot: [ - new Problem("POI", "Tree Rotations 2", "https://szkopul.edu.pl/problemset/problem/b0BM0al2crQBt6zovEtJfOc6/site/?key=statement", "Very Hard", false, [], ""), - ] } }; @@ -43,21 +40,32 @@ export const metadata = { Let's consider a tree rooted at node $1$, where each node has a color. -For each node, let's store a set containing only that node, and we want to merge the sets in the nodes subtree together such that each node has a set consisting of all colors in the nodes subtree. Doing this allows us to solve a variety of problems, such as query the number of distinct colors in each subtree. Doing this naively, however, yields a runtime complexity of $O(N^2)$. +For each node, let's store a set containing only that node, and we want to merge the sets in the nodes subtree together such that each node has a set consisting of all colors in the nodes subtree. Doing this allows us to solve a variety of problems, such as query the number of distinct colors in each subtree. -However, with just a few lines of code, we can significantly speed this up. Note that [swap](http://www.cplusplus.com/reference/utility/swap/) exchanges two sets in $O(1)$ time. +### Naive Solution + +Suppose that we want merge two sets $a$ and $b$ of sizes $n$ and $m$, respectively. One possiblility is the following: ```cpp -if(a.size() < b.size()){ //for two sets a and b - swap(a,b); -} +for (int x: b) a.insert(x); +``` + +which runs in $O(m\log (n+m))$ time, yielding a runtime of $O(N^2\log N)$ in the worst case. If we instead maintain $a$ and $b$ as sorted vectors, we can merge them in $O(n+m)$ time, but $O(N^2)$ is also too slow. + +### Better Solution + +With just one additional line of code, we can significantly speed this up. + +```cpp +if (a.size() < b.size()) swap(a,b); +for (int x: b) a.insert(x); ``` -By merging the smaller set into the larger one, the runtime complexity becomes $O(N\log^2N)$. +Note that [swap](http://www.cplusplus.com/reference/utility/swap/) exchanges two sets in $O(1)$ time. Thus, merging a smaller set of size $m$ into the larger one of size $n$ takes $O(m\log n)$ time. -### Proof +**Claim:** The solution runs in $O(N\log^2N)$ time. -When merging two sets, you move from the smaller set to the larger set. If the size of the smaller set is $X$, then the size of the resulting set is at least $2X$. Thus, an element that has been moved $Y$ times will be in a set of size $2^Y$, and since the maximum size of a set is $N$ (the root), each element will be moved at most $O(\log N$) times leading to a total complexity of $O(N\log N)$. +**Proof:** When merging two sets, you move from the smaller set to the larger set. If the size of the smaller set is $X$, then the size of the resulting set is at least $2X$. Thus, an element that has been moved $Y$ times will be in a set of size at least $2^Y$, and since the maximum size of a set is $N$ (the root), each element will be moved at most $O(\log N$) times. @@ -165,15 +173,8 @@ int main() { (also: same solution w/o indexed set) -## Faster Merging (Optional) + -It's easy to merge two sets of sizes $n\ge m$ in $O(n+m)$ or $(m\log n)$ time, but sometimes $O\left(m\log 1+\frac{n}{m}\right)$ can be significantly better than both of these. +It's easy to merge two sets of sizes $n\ge m$ in $O(n+m)$ or $(m\log n)$ time, but sometimes $O\left(m\log \left(1+\frac{n}{m}\right)\right)$ can be significantly better than both of these. Check "Advanced - Treaps" for more details. Also see [this link](https://codeforces.com/blog/entry/49446) regarding merging segment trees. - - - - - -Requires knowledge of BSTs such as treaps or splay trees. - - + \ No newline at end of file diff --git a/content/6_Plat/RURQ.mdx b/content/6_Plat/RURQ.mdx index 8132b90..315c014 100644 --- a/content/6_Plat/RURQ.mdx +++ b/content/6_Plat/RURQ.mdx @@ -62,7 +62,12 @@ Binary Indexed Trees can support range increments in addition to range sum queri ### Tutorial - - CPH 28.1 (Segment Trees Revisited) + + short description + interactive + adding on segments, assigning + code is more confusing than recursive version + ### Problems diff --git a/content/7_Advanced/Treaps.mdx b/content/7_Advanced/Treaps.mdx index 90c7cee..96a066b 100644 --- a/content/7_Advanced/Treaps.mdx +++ b/content/7_Advanced/Treaps.mdx @@ -8,9 +8,96 @@ prerequisites: frequency: 2 --- - -Historically restricted to USACO Camp (aside from the exception below). - +import { Problem } from "../models"; + +export const metadata = { + problems: { + treeRot: [ + new Problem("POI", "Tree Rotations 2", "https://szkopul.edu.pl/problemset/problem/b0BM0al2crQBt6zovEtJfOc6/site/?key=statement", "Normal", false, [], ""), + ] + } +}; + +## Merging + +## Splitting + +## Merging (Arbitrary Keys) + + + + + + +Apparently [this paper](https://www.cs.cmu.edu/~scandal/papers/treaps-spaa98.pdf) proves that this runs in $O(n\log n)$. + +```cpp +int n; +ll ans, inv; + +typedef struct tnode* pt; +struct tnode { + int pri, val; pt c[2]; // essential + int sz; // for range queries + tnode (int _val) { + pri = rng(); val = _val; + sz = 1; c[0] = c[1] = NULL; + } +}; +int getsz(pt x) { return x?x->sz:0; } +pt calc(pt x) { + x->sz = 1+getsz(x->c[0])+getsz(x->c[1]); + return x; +} +pair split(pt t, int v) { // >= v goes to the right + if (!t) return {t,t}; + if (t->val >= v) { + auto p = split(t->c[0], v); t->c[0] = p.s; + return {p.f,calc(t)}; + } else { + auto p = split(t->c[1], v); t->c[1] = p.f; + return {calc(t),p.s}; + } +} + +pt merge(pt a, pt b) { + if (!a || !b) return a?:b; + if (a->pri > b->pri) { + auto B = split(b,a->val); + inv += (ll)(1+getsz(a->c[0]))*getsz(B.s); + a->c[0] = merge(a->c[0],B.f); a->c[1] = merge(a->c[1],B.s); + return calc(a); + } else { + auto A = split(a,b->val); + inv += (ll)getsz(A.f)*(1+getsz(b->c[1])); + b->c[0] = merge(A.f,b->c[0]); b->c[1] = merge(A.s,b->c[1]); + return calc(b); + } +} + +pt go() { + int x; re(x); + if (x) return new tnode(x); + pt L = go(); pt R = go(); + ll tot = (ll)L->sz*R->sz; inv = 0; + pt cur = merge(L,R); assert(inv <= tot); // dbg("HUH",tot,inv); + ans += min(inv,tot-inv); + return cur; +} + +int main() { + setIO(); re(n); go(); + ps(ans); +} +``` + + + + + +[This](https://codeforces.com/blog/entry/67980) CF post describes a more general version of the problem above. + + ## Tutorial From 4a81683f4ad62e04d0c1729d70e93e0c5e69de8f Mon Sep 17 00:00:00 2001 From: Benjamin Qi Date: Mon, 29 Jun 2020 16:20:17 -0400 Subject: [PATCH 8/8] push image, intro, silver --- content/1_Intro/Error.png | Bin 0 -> 75834 bytes content/1_Intro/Ex_Prob.mdx | 10 +++++-- content/1_Intro/Intro.mdx | 44 ++++++++++++++++------------- content/4_Silver/BFS.mdx | 6 ++-- content/4_Silver/Binary_Search.mdx | 8 ++++-- content/4_Silver/DFS.mdx | 14 ++++----- content/4_Silver/Flood_Fill.mdx | 6 ++-- content/4_Silver/Func_Graphs.mdx | 12 +++++--- content/4_Silver/Greedy.mdx | 4 +-- 9 files changed, 59 insertions(+), 45 deletions(-) create mode 100644 content/1_Intro/Error.png diff --git a/content/1_Intro/Error.png b/content/1_Intro/Error.png new file mode 100644 index 0000000000000000000000000000000000000000..92ee9632dca94cb9788d242302621df4e8522d7a GIT binary patch literal 75834 zcma%i1z1(hy8kAW?v@kiQ4)169ey0&z8><#=E z-?{gm@7(|MoOAcH7HgO_wPxO#dEejrn@Dw4c|7b#*dP!HPvMoU1_<=94Fp2D#C!r()=7_Sdy-q-aUw$x111s*o0=d<_|6 z#C%02%k(rTgxErwuquD>dA&PPcXeI~V^n#0VCe%Q3Y=(j4~{!Mb$xvb-KyMU<_A-5 zCRdBTOY>K2L!Ws!GKc0x(E_0fEXm|w9)d^}qbws|n+>sUQ7QknkU|&w68NhvzBg5A z1`DeSl(KT3vo?$u_-(di|GB~4{+&s5ywtM|v_MPg5%RvP&`$;^ZG)E@`b3~Er)PB; zMo+b?FsrL@MKHaxqaggvZ@On5Ef!2EsQ!_1co?V*KeB89ZT^%Iu1U+m+1nHk+kH$F z!35f*mcd_-_C)RL|I|xLKB9HR*f*kXg6##i)H$aRfZUl$`gBRerHXc>*H47faHc5X zctUP-imzIg%!154@#Xd2G3vYKJ@-%RG`Qlm&{7VbXX%fP)?IsaELtU%=mApy{)#9o z@0UEsr3?NLy{XhW;bDgbgMn0R5@}cW`?VS2)mNOB^>4!xw?`;k*O}! zjuWiqe^uYBITGtpz@a%Ijt~P4R}kuy9T&+T6lYx%O?qU( zRwTL@16qR==KRlu6{2_BbXdO3K^lh`Pal7Zi^0*nz<$A<6!0kiefB+U)23NVsdl{?)+x$Jv-TSaOV?^qvwa$X9
PARlUE<{S7QBWJ2`g-x4yVO?mv7kbX#%` zPY6C4{{jC&i^}Djp!_LI`^)(mj#WPQTOJX-;g>eK1)CbKOm99;v~DtPyspu%y4zD**}qyU5UO$If;w>}EMo@Wbn{`~JYF7z zO1xZpky9pV)T-60co%WYbR&Tl6_k(C8)#G6_N8Yztz9J;MW%7Zv(vLvx|1vnfjdeq z!OKV`{OBbmR!qvHJw6eO(}>t#dz&;OInWSjw13K?g)*Nz&-$YcD&0r)T>Cuxg4{eu z0t)=B+{N6&W_gyTxbhEEU$^OX3k}t`Uvdq&koqJ!O&q_*%P)`dwiTJ>o6vgu#>{){ zv~dfAw@^PsA3F1>hPlRPy}qI3%JO7peQszp{on5# z_cyL@aP{8k%jqj}2P*Epgbt5_+(r-=9Rq}an z$e$V~<1KaQFn$JS#tQ?MInp_vx!~H1-EZ#fO*Bns?)L6C=Tqm2yBjmGxw~~KXH($_ z8UYbkp=LK%7i9=?s;d9!b7CO#4zv5*_LO)SS5H8UrSe`{#y+1%txuIt3nI8GrmD(fut(sdANPpAVNX3j zT%^bE{P5`6;q;obP4lnINcdn+UCiC!_+;XNKHO_q3C8x@HdnU>rsOE-n0p~`U?Aa| zqad+#{o~5_`0OP4O5pPRdIn*2Wq;Jv&tuJ0sZ%*}MS|=^Qe4wt1kf*2tCKnjEssiF zv?1I4f<~EzR0vh4`Bz?lvL^(;mH)((MwLm1^sD6QVh*9upg!iB;M5{)6g_2~3(e|X z9Q7w!Ct}7CeRQ5e()M}u9bRuoeg|7e6Jrdc2BU!deB6(ZLmx}ycH@pC)2SyPsYJv^ z8k6`X+V-zOcIt0PZkR`Mrs-s&6{2QnPPnG{b;##W<4z-d;WI;$KpWK*|t z-Wq?<>?jS%VIg5*Q7-?CeCq7G+T0cU)cbeLS3d>Egw6zArX>Yu)z@Et6l@n+7fuyG zRdCb{G72+!90riA6yw9=-CM&{Ut=a>7O2oPpASuddq>ukdc(+lMp$1O# zHxIkTU5t66A5!|G)K8z@>!|t7qLhH3kCMA&PUliz04F9{Da9#vaENWF8svk^)VkOp z-hff+92+)~cI0&z&5`xdVDo14o|oeZ{N&;f0ohkF8uq6Y)?{>vlnTd8d%R`VDMPy{ zjS7PW1Nta60z=!W-F@zZL|1%Xka%vfW{>BYWJ|!Vfk6QyZOzCMLA;7Ii~RZ(61$VR z2FXs5OS$Eu$QjI;6BxB#T=gPYuh}@z3uNyz9;+R5Sos|)9-T+NXQXVD*?I}%iL3r; zRgwCYBNIoVpT?3e52Qdb7M1{+g+IF^1OA)#MZr3>V(wAXsc zkYp54>N}$|4;eOyj(gd$(NBAR=bx5mANe2Ko|p3*8Z@5&YE;;H1mlJ2mIkz#^@N>h zFKW*TY6w0TcwS;rk|8+b_@-qGZvAV0hu@4JqfXCGAG)@u(>}#ECtb&HS2u6maMO9Q zdf>PhG5bqzN6+AAVttM0Mxs%1lZe0Rje6ajugBWHn$J_8Bp;HCTG-X(1aFtE{#?z1qK9t^%KVBTYLf3W zez|W9CGo;$S?WBpJ_`Hnr}mkQxK@g)X5ol4^6&qQhQZ4{mR>bD?^v&^tZ}rL+0@}Uv?9wc z>)J)5_lfs)=6UON-IiAU_W}%WA?jNtVn+>Ab!^?9~9@YovP@9&6%TMPkTg$s~U*jfo3?+X0#$Ne)d~M_a}nGIMltq(A~zJw}Nn?5f2VcGjjpMBg#ro!CFNH^c)Cd zg3wVOfgS)M6yTOXq5hw+9Lh5g+F$XgAW--_5c+?mQ3am&zfZt@pXVP>w1hAa2Jjy- zaC?41{qNKd+rFUvcNpaocn5l+DWjkOJT)y`tgIX$ZyjA77*oZ82rQ>p`VbI^oaz2X zQP6mL2$T}ecI_s^OfApiAQzz2fw-+;L}xxoKZHjq{9K2}8i zou`$Zp6ok&pwEChB)A26gv9>J@c+H~XO;iRstvJnk#V#Ka=J?Vv)BJC^WR_o?~H%d zssGP9`MLQ1Ugh83{8vsf@cpO%tt;JOnilW` zr0lOB68QTJxbL69-MmHfaThR(r9cX@FSI;ScC)bN?KN-iU@t>>Qdu>hlZUV*U@Q1JSuYq7V`O z$16zTr4;J)*Tzf{s{cc36fDz6X#crq8Bi0W0?{iK+=ShD{x7MC+xQ;-y8$p2VR9N* z5o|EIyN2xtVbD2&p_i+!iZ6;dP#L+(u!i`?l^x<=k~^1_)utPmg_4E+ro}RqY5%79 zZwoais=r)~UYOK15w8*{TZ{_CRQ5)7^qHHRm!r0yxE5my{3-Vh`#%)XcCs_XJIXH7 za(lhgw3ceJI4pKDM6&aA!hnb{NI_F&0!>1@hi!79~ACv%+K!0y*9i89dRRCFRl z|E|a1$}NYGs5)KDL*itR-s2gI6Q!SAA^|CBi@=)qgntahtnDIJs;70I&egUhZhNz$ zY4-1mOY=lOU-UUJAE{VypHs;;AvriM?q%e9hqa95-bExYw2q!3;`YAeBndQyor4|y zZ=|uU>&am#*f)3c)YxZ_|45{Q4oI#19uDNu>q z3RBt2PDuZayaqic0cMrum+z{;410_IG!PH3;5qTX%diy<2;tU__m165Q^xx#8DE}q z{rump4DbjbhqEj91Q{@T*nqT?(aiq)IrLW1R1bAJQB7itvuU?_*4if1S?=OEwRL`& zA7;2eS>gXP!x4J*{$ywQ2h(8}iCR5dc|GGCR{4gK@iDRBLGwxDUqU0ikvY?xFLKy{ z1FnzeZ0u_RBy<0)BA~^=0kuNf9F$mi_9d&r(@;LxyYlK;UXNda}5GDwH_-%UiW8BAOyP}A`M+X9B< zWjplH^qb^L2+90z&FG?TgYjn~IP`k5qH$8kV7O&N{9r5DuY>09YBa$3P~>EYxA*I) zY-L&#)pxguCL{Nm0_Tqbm!0(U z>9*zie|yo0o`aW1aRKv2PVEm~);YAC>C^$;A-KJ2a(kRAE%fw60ZSy#*0MhK}0Z49rDEXUjoVKGD#BJV;@3U8O?vOUQ=g`vvu-iA-xXfy%P5L`# zL7lTxN%%3}5-NPx*!KIL z#JPffW(Mcc2*kMZbiPlXvjx6RzkNKhvLZ+h49eZJI0}^A<3X?oX71OW@}}~ix(gvh zZAi3@fYkhJNs6K^y!OD`sXC~3+45bj`=Xc4#ego9$BTVF^71%i30dgWf77q#zv}ty z7_96FED`hAY^Cboa!N|8qYNxQ@^^HWO$A&uEj7?1mofT9oNDI1cghlbXLq|ko)l&{ zxMYIM`#k2I<<~Nu#n+jFS6j|!ZJRy{%=Qh7U(DO5vkx9iSudM-Zx!s1h#t7!FGN1q zTSbF#!y4U|ZS8#yN3UoD$Ck7CxyAEZZjaP%?ep~vN6u^aivq8+HAi1oE)cP5*tIvr0ze%=&W?pe@n138Hidy$g>X!{XMMQVoB%?7LO4 z%~!&kXUT&il>-qcx~G&?s1?W@D(0S2T&i~jjBlT(=nM) zsSkA{yrW{8e`WyTTv!RGUrY}8M2j@4o_b?T_A*ZVT(52|#Qo=GV#n*3h{C}vN!ZmZQlMKuwnPzngjv2XBunwC=fYk(>;#mD~dy-XxYnkez zD$dW&l&DpgT7(ld8${1)53G9rHIoT(@t*zxn=!u-!j-gl+2ig=mp0^-_vr0~`E4592WC`dcC} z21ImPAnNn8cu)$12stWcm<%q@($$CuvG`kPG)2ebaGKxEQb{EFYsiyP`n@s-#%f?) z!=KDTvscyVVh0tI%PKJ=Mib$Hy%}l(RZf0qUU;LhRL<7^=YSyUb-_ z0`K%t(+LerupJ;|59IY^m+H9QZjdjg}muA635my2R+KHO}YX04^%{SDjLd7j;|_lD9eK-ZC}QtW7oxr+0}6p$5fPKik2*~o;5jX8rbTO$=n&)7_@@ zqs3HiWz?^GC2wC3*{?}DwF1*ADi4`O>Z2c@`brC#Ppe1dXaA{B=LXZ%6;n-u{tEYT z2*D!-*>pzfDH_PoYuVdCj2js)rJFL?sPI>Gt{$8bhRP?`mAV?EzrJHFHQTAp^YhMv5(OqX9gZf@|4h1r33 zZL(;u=N+I?jMu2}Ory0}m=BK47SNyPZBKuk{&rLNd9z6T5@Wx}3*FsrB+CwR3Nyze z(7FqyFitD0+YgKkojI>(zImEK!)Kr?CZI8QF120MV7Yid|I4mFZBw|-#wA<&%(9}w zlLNhex$lNwtM6kVf)=ajjo@cmlNAb5%M+Svv;%q{b5@W7)sj*yD37x~{ENuMNTQw- zLBa!=_kUd5jO!-_5Ts$~1-ol{j*Jqmz_g3Puwtz&c0x$e}ihyTNq=i8}w?}F$H0to;=dH zQ*Pi8?pGJLGwAKt)L@k*K2w;Iq+FR40tP}I~Y!N zO;l&TB>bKf%yALBLCI<64d@lAS9_h4mJ$PcUmJK#5+PV8mm8XMEJd~kFDj15H9+te zgvOa>rMwZ>DwxdVauu&lJeLX5vwe^IbyiiQ;)*9}5sJAssmha%uKvXW+vj_=a}MHj z4(TY)1M5Pz3!{K?xHH4NhZ7#O6V4B-%prxwXwV?Y+BRjrXBQ%RN0@;QPKo9j2iWj#wnc>j)5KrNq94cs2=osMa0Ja%+e zBYTM5O>lCqc;21*?)itw87gP?+|i4rfPjRLj)UM~>T=7q&yyT785SfcLwWJZ8+O@J zRtBubP_+nm`;o__ZN6FT?|2sE*TuQ}*R$s#$0tzt)RI zAGVvaCY?^gHg<2FnQSj#?H-`nC`9J zT(cQ%hDBbdN{r%AFheqUKAfmPky1XA^P0F@AH!MLxJ}g+_4!$^PJRc@_gTw zRt9tT=Y_&N(nIO(*fBN2z-(dhL)!J{zDKw+eVv0Psj$!nKX*5*qwnQ3z1~>4Vs`0I zaRg^xd_L%IqDP5=Y-^iTz~TC!{DYAs)*U@=U<=b3&}aqQXeMgKPGZsB z8p=@HZ1R(O2fmife&-p#2h6q54YDzg_T2AeZzIK1 z@ijT8bN1NIyGdlvodL>Ri zkGdY($^1CV4hYVcVGsO8{`!v)24iFvih+@s!A=NO}D`p)3;@==x8 zs}0SjBEurycMrJeBIrDuyVTQ8eypyHvDulo=1z2A7|y3o2n0iyx@3g4b?f6WD8eSW zoH?H@yLI5XEfarMblTS@&)pMjy;A92-PHMBNm)dj@w6r$_J#!fLvbw<&tdwLd_6u| zwC&kw~j6wFE-xu!tIG9~BE9@Nl08+4G|qG)_{ZRegGUu)*>J5_J@! zw+akMZhA?j>Gi7@p0Xi_Tt{NHUQZJ*sw%>5VgkrRt$uQ%+G9;%nff;9q+;F$_SVrC z6|ZrLckEo}S^SICaETKgK3r$+*=!Wc1*Kez=gfth1{<-I`T#2HvpWGPBzD}Dn=G%% z#??lS$vPDd3NBGptC_C}l802XuXAbhmQtyZNs8<6Ms<>Cod5tL#a9zB{_#bYN^8pcndq=E}~v;aKPfb8xCG9A-L3 z7?F#ixA`=LfwFF|_X%8B3V4yxlga`?xuzJL*toO+fJ{fU}#XtaEvsooZ`;!UPk7#o(vf*kyg6gA2ajQ$pdIBsRWX*P9I<6jMuF9G*DnoQ|qWjgoF>H7Vbj3Fd; zkR#_>$NH79uvRN9_p=K%LnKi1wvbC;Yi}sPaM+ahu&IFDHLtMU>JJYK+l%xkyz&%Yct`5AuyFR??`L0wrhou{8C%VbK{*N2k7^{ z$zd2uLsG_^9iSJNkp`)h`y1-OLsE4epd1~}g&LdzW zpcB6~IHy>+Q%huOR)tNHQnLzxwTxt=9z8>RY3!v(5u@rndQ^Uri$+h!r{K28*U~ZD za|Ulg0J=y41W>I#uFnEvcha-#?f|RR6_dgV03OIBNm;0)%`i>523mHe0Nd9&Soxx> zzJYW*;%};uloDz_VH+l*r&$sylNnWHr|-3v94%ZU9o%TbVwZI%N{JG4TpW;tnBN%i zosRdtsv>N2$=#AZ3MSC>%jsYekPPr2${?jHF&M=%%`H+j@(T$*-OKhnpZPeuCl9h1 z;gyD)?L>`s`UG~bW{twuX{1qN#?ql9p8c5yw@4}r8Z|6a`(6{FhhxmE{)CT*FM_KG z>22odb5c+#N2s9m{*iB0x)}2U3dHcX5T0ahg@>6xNT~FAUM_ydP_FhTX`63ay4n9z zwiE$#E^IfO;FMRM|^M*HAAF3&CUh;k!S$-i^eBj5ufr&e_$FDNU(h zy4>TZQ5G{D?Lpc)`rSqWH)rkHcV+2ZD?`JunYK-l9(Y97KdA5PWNB${H53(KlyUX6J1{{w)n|b}_ z+47r{QOQ+>44}1Lk&pkM?b{oOA;$KNmFk*f!;A92W8Qj5pJvgeX^AXbzL!40SAWQOXvQWSi+g4x(~D3zL$s=t z#c(Bi#-V9%z(~OPTMhW#z~1}-fJg5dU;j=OLA>~*yy<+7HgiPN&y;%M4{7ZV zatAO-^UtHu<@c@?V`__7IP8^y1^_A%eStFC2iT9fr6t1yjM3}~v~@Slyn7|zIsFB| z)<#pq|}O z0T*UyYLgcy53@oH_aeeR!Eat2+8QRF(&6u%O}<@Mf8a$C5_y5&ispHK=#ar>dUMJ~jZQHV;V4OJT7a^hXU$}E<+x%2yu5leT_A0?)U z?%HJ%0Va}-D3x8(;?}xL#5CBG4Dc0=} z*s`~peoQajfX_V1|p{9UmgcI&A@q(9D2v#j)1?R%9d7Hs6@BOjKFjj<%1s z)0s8hgByo`_M=O5>U=I;! zSQ$21e&VGdpV1w_(PEwo^z}Kno7XgrT(ww#*U~0=Xh~)KmGmab?dJ~*)>{Rs=iv|E zbVMYLt3A@4J(dZ|?p8s*FjcyxF2JBPDc+d1k~BkkU5)ix=)2a& zq2XJ}k#X6A!b#FA09kBa#ldU#S8v%NhWM;e1^}j130u0jT=Or(tgd&oa;rEHLw;xe z^}$b#AsE`1QDhz|tjd+_&EY68`bcieTD6G@>rnL8j`|A2=T6pVg zVzpo79D|OF!-!}PKpn}kCz0~4i?Z7MO#`z4S1T?$1xxf?-MG_~^9c(0-8M3Dw?H7P zlgYL&Lm?}NNg@YcqdwIe6D1NInXAJv0U~S$n2zM436#ETs+JzBTUX@{xgmM8Kg$HK zcQEX_=@d<&{11vRjrLPtab7n>E#)FLI^^ywx_&u zdMqNmcLw;x!(cOdU(GxNkI3{nPq|D;3V(k)Scr5|YYVlJ9p{c8==B*ZnmF=5FWAR2 zsZ060+6RwrdnVR)h*b2dfw1s}?_q*u5=UTmoaG}={^VNjlf zmn43*BfUb*t~E}S4D#Y4`4t`_N*ZVj7^|M zyL|ou3p|!)^e+UTCw?FG3AC?lf7mZFn<=x2(vxXfd_F_r{rQS3hLxbQ7G43P#1wCf zFizgCXjNqnWQr>qz!gQ$a}2&}p#&fJZio&Z!4bU)PVr`aN_OhEp5y8n(6Wi&k~y;y z{6=%w-pM&SsFXMF-{Vd@b>c-wd%-^nx)aKWB};o41{~caL@R#Zc>)eH#*%5M;59ZU zeWcAp&|ueu$uFGmR&je+89UnPctQQBTGyZ@)*|NAzE{cE(#%}7QYdZ-|0Hy0CAw?l zY*4GdR}U17L13++YWengU?_pI(KAdlC7%aXTwO5%6K+jvu&yLc0~83XZ-z_MXDvIr~OdE>g&;RMgYx~2zj5ovzhe#qi8a}$9Ql34g z3vHFZa^kha5RH;_h*x^v+u_@ACIVRCE=g_{y-JfWJY|+{WeM9P5Hq7GH{JLtA}r^j z?w#XmlHwU)cKTTkdDcKcM;tr9cfweXMptGU!nklP6hXG4x6BzJ@>q;ayZTXhoS(2w zjv8tj9?u=)PeD=mi<%l1bErZ{yk(P|MHk zT1TX6Pew#9*d^bFi8z1T6QdP&aO!v^pu>t3VSvg}c6TIYII^%Xs;3;$!*=R4SHmf2 z5Bv-j^O#@^7NVv#VA&vur&8Y(ndllizl_MAyskvAZ1kEj=L7(cZLtCk_D(;~ z5WR?2?7=G1woM#}M0dYomu>Gr#30#|;noz!$a>4w>AHfjOXCUTe7Azr!%T+PM4Ci-CzA6oy*m1GMu=vZ+0 zRaS>Z!`WE51faMN3x}XmW?L3Ru*e>`Uhysixf)xa_IFobV;53gm^+;=j zJCMjhtAG93V73Y6oA;m2cVdEt34&kD7PBRiBvHyZQwndlN2ES7q4b2X-flCoJ3=(v z$l#AV21SxxZa#))Yw4exMc~fSTV@@8?tIlr+_o7_fd@Y^iwR|A3iR7jGI=hYaFn-u zM&Pj|RIvS(UQ81+AgVqzDA_iP1hc-iGl{s3v-z+i`{v{(uG9G(+pQOeLlyIcd(^2Z z5)`&UFe-8Tiv`_E`Z1v**zN8_hE3Hhqx4BL;>4~xMn%zlcrD*{BmR53DJ z(r1yidtM<)KN~yvgI1}yvJ1IF>faWWsyCpN$^A$C7gc^Sv<6K6q(QZzSK?tAVL!^K9DC@aEukl)bx{%tOk2!l!&cArADP!7x02YZK z6mZ2Qx2g~^b*M)O1n7AUtqVN=xU<+d@_T*u`HAV=VXrh8TzGtl&?g=lzMEnqeL}~v za&-Bm>*#4<=;QrMpQ(!suBhA0LkC5yuoaBUkYrqagtx|E6>%G|wm%DONAY>-%PG2F zZ_yvIDRS$n3bN(B?Pz_XX~xxwX$TiaH>dngs+#@Tgy$@t-a{b3)Qbiz)+*`7;d@o6 zbm#kMckBF4NoAWbB9nO~#3f85;6*w+0`DxWia{GJS2A7l#OAQb7o5)mp(>a)GpX>> zzrEwy48S7-!yFb;XI0)*W8u`eS#(jkiR_ftRPRAXFm;^=yrL%~(^i57tovc$o3FK~ zdJDb|&Py(H5h`MBvxW0F>b*QL>j6TQyDi%^4RbORLcDY?Q(myvP}EM6BBh6>xj3D$ znIe{H-MouZT0zB`F)HPSd8P}jH^-I)C5B$G!IH$u-5Kunh-E3;x^4u-qcX2LxwEl?nhs+G#NK}~AQYmFNRrG?rB)<}0_`R2?N!qY7lpw#z@ZTkb z@eb|1#xxD5ae2jxxqdAY<>OI3Px83tl0ZgM!b`2^z#(7=JU35bM*oBJZ`22_+k41R zGuV~WWSlSpii`tXI|ECqo+wuq(+>zC9ZUJh?6m`X+0aYJ*C8Ax0;HORGZCJy?GGrD zdheZ6DQ7&blxIg(!i(nq<4G(kq0>%$>kGOkj zH0j{Ym!1nX+dpa8P-6UXz44Ehgbii#8pQ#mGHcGEsVq&W(_|C|J^xADoPqQTch}#w z_YVLT96EHaeFAzvraCdecOQMyUATEgNY%|NHF1n+u))NODns@6eM*ZxJ#FOMaESa| zhcBw4D0On>!*K)Py@`dDn&ZM2}c?1qo_jGt(tB)Xt3Jup|pCdcrM*Wj`5yKgsK~ zYRZ|A19h_H?q?F&bNf3REgq-TO{{k(mf8vbYAc)uPV zTVL|A?x^E%g9L05_p>Kipf3$ODC**Ug}_zYQ*!f7!GNbB#i^hku}tSx?=aksv36(U zR&hG?$_eogb<2Qj8s4O@e~j^9^kH_HQy>|n=vV~h5uTth+{!vKP^4Fk(pm@j(FJa`_4bW!Ry{BLL(N} zxTc3~`WFDaHj>31=tPq3s0w;A`UMUq4J=H?(2IRhzvN@ThR%gP!EAQ^%RoA=<5RKY zK`=eiG}Olv&$|q9??~BjeH`fZYRG6@2NS*;o;ZPM>|FCl?4|l`e#JHLHKV8Yy zoN<{Yph+NQLay8SnyGovSM;d53?#QZRc@}miz5woHnMNVXLy3=4^n%9s}F!HA^Inu*dsx^XOLt*j(pSP_Rf_XwhZI z4OOq=LbZH^8KH^luSu|)s47ytbJcEWZMMx6*v^p+x68ve&Gb;DT%(N>B$4EV+r01l zzU3`;&RhfPxm*?|33oaxm2*B&P4PjM!<;GR#)2tvHgs8(vI~>n+9G_*w94`RY5Wof zIlpY9PV=G4^P#1e1vT9}PqK}DUFm9r8B%J9?$veLT?{k-)>v`AQwDh5o_M>Vxo2z0 z<3%A=e+lWH!nFV#A28LnIKUAaxDk#^87uc(OV(vZgbjDW;_A{5AQeon-==xYrCMEm z9`!9`SJRWte7btVOkca}FV^a70w7lJ+>y8bsm7m%hJUT?Q2)6Hu_BC>2T6F$v#v&^ zohR!kqWE($(j+DNE_e7JcHEw02SrHjB7WOO_L1gzEC|3qi9k>(d+RA8aFf1c5O8%t zwOT79uWeQJ#ria^(sxfri)smmS+z{FsPwNF4*WNE<&>rz-+$+QB6E)(tR{;zyhy ziSz5nUdI9u?jLRludBdvLhsPpq`uhvA8sFY(P*L!u_^ZrAjhsUI1MLsyaG#AHnvqSNc{Jp?wcEZqgqb>I0e)w*XkpYlgx3F=%?;-7KAnm& zBHhFkH-pCQv-A~P57)rvq~Dd6C;uDoivrt#=1$|UBkNVqZ$C4v@5)Ea0oS*g0Q8E?qTm-5pcs5cGij+wP7>r~i;p^h-llYt8|O zs&4XPSc`$od`0>UZWh}+Xa&7a$-It9koPMsi#7%u|pM z=K}#;>gBtG_J=VmVx3)xP!H)emkN2_XQGHVJGuAu${P0=x2;Jk)bt$|kW%D*Y5F3+`Rtwe9z|{BmX^4J^7_)g|6}*~c`Jyg@U1_Y-E^biCV_9C^_TE8VJ*D7Q(Q zTMyb8vK7~7x;V;&jOf$VsK<|VnO~fatED2m%bWrhfMMBZ0(&Vi?L6CGNCV@kcKLkp zH)!_h{kIT&WJ~1DC+8aE@nBObK$|NYar$%w``+%X zGtIalMDmGN;7WKstOi zRnCcm(^!-GEsj(*zt?zCO|;STnYr@DWk`Q&1I-RHSmfqLVLT;B5Ype|wb`#e+Bc_0 zv)>OjPvjFh$y7`!;YDWjzS8+qec3P~{hMjWu8AZF`-#i*8QAp5>Tn@G|7`DYQq#kA zD!6ry-?`iw-*AX}JPD;A?YVX&uZMZ-%uiV{8QEwO7!v5ISPww@;?je)pF1z<+09Pm z{(&a-N%g#@ddY2g3{o;GD%LC#LA+<48D$m?XANBI(eO3WK-EixUW*CXWEi|FNJd(l zP4pbnG5fm~WK)@C8}G29l^I>-;sm?H@u)*sZv(hK#zP)*iA-v#vPvIHKzewn2{N-v09 ziS(qz`DI2w1Rt}nTX0_~Uxk0GSI+Pe>s2o`x8Lf+P&{#Ifks5|-~wY;iyq-EYZypbZpcL+7kHqpwopcjZ*5m-Cx zNhSAnPEcH@Gxnq^hW#@XZ}lkWbMy737W<_6Z{%TB`ug6LF=O=@!1}% z7k>B3x6$)ogglFJTr4Ae^3-gZi}Ue$ z=tH6ytq@*CFVL@w7cFFm&#KaDwSFbfdZ%=gofEeb&ez|vRW!R8{;(Cr$D^>0XmLPR z&8N=L+-*qSeRdr^w}P($=Bdld>~@Dl&yA`*ffA?$hr6FZtm|P;7)M~}1-8BNQ{J2svmgqHuqlov!s8yw3+p%}+2`t*ht>?dd=TRDv68%O*8!Tr0 zRi)D^CF@n`#7F&REv)c4wGOsl0ewN6gDo#NXVnci@;`9#(VmgupU&D=*w1SL5C^T| zw2B7cReh=^F8Gf67p9tsG%12F5F~KdKN;{hC4Xn60-bp%%8ky&Ns(OWw?l| z^!GA|zaK8>!2tN?aJa}f3IMNNKxd8th2?(WvMeU0R@C%DNgKP*%Mi!@uUVr^I)uv;C9k@ zhRhwNTWLwLgXvCYu@nQA(rgv!&vrRHo~^jiU~_XCIo4f@l~}IE-V^jtuMW5M7IV69 zT8x%&w&|ATABK$x6+oThPP*pCrGdFJ3sv*XU?3z&4`T|P3{8Aus3R0^qzJOW-DqZm zL*~rFX|aFx9oWnx0Y>*}Mt1^&jVz-fp}1FW04-)i{Srm09J?z*2;KHMIwPtcy8~m) zC~$^jzYUFmy`;z}I~XvZB4!pv2`mK7u>k7)43T%@RZl&@$?k}wFh}FKz&n}ZR}j!I zH*lNOX4A*u&V!pNW!S?N5U~?2U~WSa=8yd8rNGY`N5TjaGkuY`8X9Q|w?vJ9xsPxxW6e*<5E z(-A)R2OMtr)d_$B|9wBSau*gdA0!JJ8_Im?T8F5*h3R~z57%r*7?jhVH^-zuMJHTu zRw%gV1o;7!OEAGNjF^vAk1K|_Ldc-EYQx$u(<%W+lH?33B${CaaA1F+fA~ULCF~*6 zn334{NpA0}3JDs3@O;nX9k$+)9~#s#$Jky6=hK+eL;RgbR7m7}LISlIajA@7I}cFp zT{l=mM+8tQdt}Qwj1veXE=`Z(d@v7&8VL(>Jt7Y1I8y9C3`_EQpZIB>#W@0(J@sPa(Mbi5)f3T~%JqBnkm3+nVe_rnXi zf;Z5Wocn?dewt$7Ap8mB4mkC#4k*@LWw|0B$VzZw<`7f`rSOC}((o1R%j5PV^T9(@ z>n+8;)P_ZX7giFHeRy@PU*52uK2zy6MA86{6&3jI04RtfBW(Tk*1m|O_cg^7?*|5b z?)?A&M?a`SVh2U;p>$RE30sF-D4EW;5ItHY!0}*FEOs=6ZHL9J(5EbI&{NzmYFdqB ziiEBTCn+9fM*m}k<4Fh*k&Rrt8@Agb?{ogCo<+1>0;j?3d<`+qq|s%+WVBVHb9Lp% zvz+8@PP0C}yFaNRK3C^eoM2Tv9<$niOnwVC=z+4Ur9^t9hs)IBBR(`GEW~)uG&evF zJOcI&InXWb=dAh4PWgYDWmC}didgRmpHEvfMd@F5&+;%!xel4mYjge#w$*?^{f0B2 zPhCimJQiV=wj52A=&V_?Tx6RO8MZAf5jpYg%dYSebzeL9+1V9jiBPHkT%=iDN>x=e zoGz8Z-kBy)k!IJxj4|~8*n8`!s%z4I>`CxpC)p}5BcdoN; zlruMZ37$;NM5)*(CeN=*H8H|VsA>Y%)LzW(&3gyy^ghqKGI${e1vZY~2^;cM7Cp$k z#$T}L0<1-H5daU9?|s~eXE0p`aB|fzop!07_Xoe5c{S|Iz}@pZ%OL8>RuPkdk93#k z5_W|OUzXw#m2N*-E9)PL`GSn1huvuo>iiReVYgn?^PV~Gb@Luc7F9Ut`~tu+n7DZi zYI!rWslEPr-bSA|KXGytw)uFAmV3%5q@kUnJ7;v_JPc=7wC}``>ceU1Y<7`<&2o5k zC&BYRUBhOa+^3X1@!54i|7fU-Uv62(i}Pb@CS&BgCgci#uL%ZFw~-%uGc!v}AMn_v z_M{P|9ye02OLW*SNofLdhsTJW=21CMLcBzeWd1_NvY+sL$n0I?uH`0n3V`vm-mX8Q zm*t%;_gU6Dd(3&|XRYX~DLWHi#YE5^UeO z_m-7{N0i{*9w_Ri&g8SK*BLXBz6IJ627ZS7`ezu=iSt|-Gn!DgO1s%wUEb}L^}29T z(>dl0Kpu%Sx=oWex9PUx<|n56D7X&dnl)iuFuyUt^RBSl|)Q&!fi8SYv%Z%!#?4?Cwz|-Dk?lG zUevVXaiZxBZ@oQzQQHx|NT)cMbd;sbXNjo(1{%c`-->ni+G|xt)7dcUTSS!YiawTFsk@-DNVtYUv zp}&}?yv%V)kC=lc2OUXT<38GQrMbg%Bem-aSQg6dBFm|Nb)yTh42I^nm9p-xF7wS- z30`vqd{Kiz0)q*h3*L6N2aapQYRh~8(P>0zA3jXCH2KXS)YlK8%Headrruz;1Xoh; zNd}>MXLTG0#-ii{{WQ;*Ev)AOB?Qe-+6ZA~KMoA*zGLxmmkXj$PJ5_GWl=?G3&%Tn zUSE&~qXAh@m{TJvW=m~|)zZ?p4kCuVw)^7mzLVl}a@_oQ-4?A6@ObnMIl8YoLvCR7 z07KhnqZUgtm=l3;UAyTD$Snml?6Zv9An*~t{|JBO7Vihd8~jkCw{p7fxyHBkJ#0;3 z*{T$w8}c`eecoFde&N2Le#jL;E+xD4qcNV0Y#=wpqD5HxJc}1?te_I6MRK5G#pT7B zW4|dK6x4&>N+O?$c4}}zV~gJzd5)pQ zdkQ?CGKQZA+1@7LRe0SR)J<}OP<$SlcHX)pi<+;X`ous0-a;7S6()`{pN`t}J%Ew; z;oR~!4J?Cwh9lAW^O(f4`@#|Q>wb9maP$CLP(Da6rJ$~XJq-K2(MAy&jj+%rS z;W6`5%YL0W5;G@u9`~D)?BGIoeBU_B9xH6n`8+eb>oin39|u1;0$GGFxJ#3}&>{|- zD$$;j7SBh=V;o3Y+&JD<{3@_u!8mFqJWOyaYj|={Di%J-($9>VrMSMZ>X@v792+}s zKTILr7myP^B6)I_vsj5StJBPpXQydB5uaYOOr*8x2ttX`I+DAgV~xq%Zs-iV!<4=L+vzg=h0nV>t{C z$h}5sEe0k8?m^iCp1WV%xLK-*CJt>h-yl6VPE}NqWpnj61;N#OmFI_(3>M90S#i!P zI{3Ec00|QA95*RolTR--RQe%+*~N_tci6LDkMHt%^NZ4P^VAaw<5#@)5$L%BB5p*T z6fjV!p9Y*QWr1+~nw8HXPNbih65K4QOgKlC8gj!>q_i3F{EG2@vUvd+5PRNaW0PQM ze%6nmQ2q;Ho>sgOUiD7AeyTa3|BE%`C+*RRK!-sZmlY{T->=@C7P3T+FuB7>22W7_JTky?z zl$8nComg9KmXA7lRHw*P@2D@db_cN^21au5>N-z5hKZy7#2(KY#b5h|hQ3a9Hs_Ur z5zenDHpvJui;nt@M_*ElE)Zy5?%7lsoeG{Xu zCoq1&(S|unfhV8Ju`-`&ycdGdjiG}|)KTJ(%k$a(TMOWZ%F8HuUPfV^W@AQF7GanP z7+E>c{Q`9Bh73H99#Ip}7e6@#)RLL!EaLNus8;}J%&jOh)&xt)v>-wMMArWG!A zhsKiLYq{A|cHOL_x3ciRrFcO$Oxc+yNgb}F^XeJ6+`y&fgzeyVAKb8!@lwhNUHJ;# zBS}jV3pcVIJc@va#}n!&0we24b-dfI#uS!`68oybT0g2p(iN8LA=ijW&O2&yIPMd- zqdjvnQbS)W9?k1HqR5O_JQ4NM*iu!qA$2sT&(whurK=ZgS5{lQ`E{B3n@#dD)wBbESmNm`(l4}{*q&B6BqouGv2VO;ITxld@sd251Q zoxYNi^Qz7DCOTYNa<`QPx{ z@58Z75J${xJ*TutG-(A&Kqbl?5niv(od6W6F(3YYQhgQWzVkQTYz7&LO6FL zR{>?-Wy7=y!Y{WBj3{FTsA<64an4BwW_>tC_c2~jGT!>U>HXy7k`i5bc5lLs%f7b| zknhA>zN}v{Vwrb*Z^m!+<5q|?ads9O$zqTgbn1ic9VnWHa4d!Q8GO$9QNxkQa!>8) zLX={-VuOVcgpZ*XB_R78NfmDOB~Pz&W@r-O1i+iS?af{gdiJEhrcasCJT`)KBM^|_ zh0J@%C3olz%CnGu^kX0X?CSk#_C#|}xhU5Mjy*$}#^mHHsn@QMCz@pziB5VLktfQU zeLD0IvtomISNmvmgTshLkOOX(buO_fXfQqUEeOip&c-0|2xByP#E zpVP3Y;$rGi;qTFKQ{qesn4V(YIjn&o&SH1b3d5JVx?_82eApy+Ns%#( zcl_kzU4wiC#9x;C9WSHa66b88aSBCeO_N)*W8Zg-rPA;U=Fo=Xi$|lqR5JqS`$IxY zf|F&khqOhGiS&c_CQA^Fg2XoqZO`ew9D6<`(4 zYw|(5E6vf5T9@Smcl{GcBecnq*Ltc+>F^vUJ8bxLfbZ3wl^VZhkeGLl#Z!@`r|O;1 z>Uflq7(SSxxU;%|m;Js>%J)y*E-V8nuJuRf+U?@k8$g4wMa`k9uuJoL&NDBbNq-s)oef{O;S~^EDpw;r@=_^@PcP#lZXv$>~c# z_?os*OtaqKY3(i;IUpgcnGL7hB++D5RmYTQ`P8{Ic^_whMD^nts!fU-`QDwiF%O1u zdX)e{{YuaCWY*CIpI+{$O@@GVy-x9B$DZ{uWq#0Pwcc?d1aUgIf^H< zld%(&;Zxh6AD;HE=NZE_=I073Im1tRKeAP4b8cvj72~!Y1C&$ITl{ezO_vtPWa#M& zJ+kuNgg{-)7uCynb3>1B>kiLCdNV7GZhBVW2bmrqd7q1Qq(z3Mh$NyQoIkZXlXn*6=9p)J_PZ$W-dFi-l}X-OZ^8o%pGeo zCvlQDnf|1fEkjHA>pPE{Kws6cz{qp=-aa@=bagm7BYAr`?|$b|6Erai=y{AC`NT#*r)tgF>c62Ao23>wbx{|6LH- zmo<=+pqikB>UM^bwIBT&!d)%5 z>W}o0q-Fjk?DTqIP%DosL8hk$up;?cxY9-qW$sh%1u!>h6Wp`|xCSIt+fN%%l|vkL zaGpd`0PAU_N6J0OU&w6*1^Nuu5X6#wkxMJ{I|09VLeo-uLM2dEJQ6a~e|g(DamU^- zOxrxozwLmLux|iorBz3X-du2tl#t<_dt~wFeC8WcKK#Q(X0?*$fq+hM$MxGk@u zekRo{&$aHnpEmo?pZ%MW7!?NeIXaylJBt2!44@%czny9Nka-OVRw->r^4H zGi8yT^5@e2&=?KSn9FN{Gd=|fOIu5zMQw}G&wla3|MMCiV$jooY%d}FOD^=!mi)Vw z|NV_7$RC!PJN)wdUo*#l`D{RQ6BGdmiawsO{1R&Z)1}|jQK7PgNMZiv68~_U|0^Ha zHxk}w|FPa)4L!gFn*Aln@*1q6&!v6M!Py6RCo`kT;Vw{395($ z=6sg&f4@KEH}7eD3Kr)=*quPutP%;im=0lwtic=;6gi*+0?qhMXz_fq z*U9SaR-vOP&J1!sGJ`7@8V|X(BY{X+3dw6~x{l9}AV>8!TF%+#mwFaxHfwJoqz+`AdznptGq`ugdbZ@7X-D`l{W9M5d=NPSI*z*%mQ`q30dfoh4AW6_^ z;$?OupNJs_hawvF#yjT1*GT!3naoVA&}bAqI8w0&NkY=yltx(>|4c4H&%uJ)<17nR zQWTf{ySeSV>W^}`famc8eG9PutR1?FTzf61fJW5j5f#Mo=J@%JV;M^M8yqs3JIH;G3xdrG(u&{ev&+ z0$GC83n>vihdZEhh^!PKg*!||Khx?0y8ZkMtrYt{fp)8!)vU*tZ6PR!{StW9VCAb? zA$*gBQEYb{I(Z9dWI=e+xnR4WXcU;?j{rlQ2*WK{|0^S^CDFojGwFxW{`UdD)E9rX z3!el~g&}GhhF6Y26|egK{$XXqw64Rz<1JHmcg@ld8Y}ydXQ@ZD}jM4<_9bG z9RkrNL``^?i!7g_z#>s4SOjsZ+kv2y&a6z2hdsb-c(H~fk!b{TT-_`x?puQVycqj9 zF*;{6dtGsUZcUcWK;gboB9nmh=#9|~J4cu4E|CgwGO($( zMA&{-=^0X=COnv%-0}i;*d@>iOqEUF^8rrZ>@t9+b%LEO@x?8AxSsHVL@KUh_8>@1 zXugIc&Og-PiXQ)Hs`$t>YBEDLYS_@prSfm!TXYbzwSlnW6j)N(?@$q=J3y zDK!j#w`g?;OR)^)TZLyTd6AtpH+cajzz|}?OibHd zZ`Lv7N-;yKN9kLY#~o~X%UU|1b^+<^+66Skd{(jwR@9Ble%k@%wE|2ix`7sheeTBD zBD*(Zw7aBGX7H0wTaV}3wO#=OVWevTQJuAjMNUz|ta&R84h1_JVF`wwR+2#SR{M{X zxuF*I-fgp2l;i%}Tgf8zRg!Dm5e?lhOFhpw`hmQNzK7~1l480ubv<1MDO;AyLweXg zNlH)yvX~i77NIp~Ua>CS?~f-hk#bP8{)-Xw!Oak*prF=3ke{uVNQ~2U(lnd#JSrHL zhj9$x>GM&jM}H$*McR~BLlkzJR4+g_bqE*U?I^v=>v7W3kfp$!h9Y&kGYR0QLNlkZ zqw5iA9J|l&9}Zwjb}1<#`U6E(cOGU)Of|VfQwe2H775R>BY;SQm;VzOQr7KJ63%)n zA;6q23E~J!d0g(;;XtvW{A~oDO~&lPZEh?+v#ZN{uUV@uklH>%I_nxFwII&-ENkVe zDB`{V17K=S%kSXiq+JFjQG7dpATqNCVbSCMZM<<~{1BejNcNbrfa=VCueFvoKqVzruO+Tde0QwHqsFOlI5AEip4Y%r1WwPgh`d)Ynb}@ zsEIMiO*+$)@N|CcF}7~71~LdN;R%C!#k}br>M$Ux)<52yYtb+R?{kI>jmO>bD${9d zqv-evp{p*Mxn+dF}wGxz2vo3ikq2hppe1ZP-}sxhI;m$gM!}n z#Ee6GxX{+vtHP!duYjz+kobCGn;wzy9P>J*iT_d5`3hr-P-p`O5@Z$g^z~+-4|m)NM@Si^G#lIP7l7lBeHV(K z>O!gOg;@0BuD<8AheV8S1j^cli^D9sSu2yuDCxG0DNi-5Hg-(Vfi%y5dzDdsKEbG& z@>gr6iW;ijlX;zbL9*cMS9Z-D@gt-{qcV>6FaWmbPJ|%!_K2NyxDxPZVF!iIF^Cdp znKn;FX#uF1n*3Bq8a^|6OlFx!(QzJ^sf4@M^&;I8+@s&-VVt4iK6}g{hIr}> z62Zjn2q;GJpmoIgFh=Jb$syh8{f4?eh>xq7AfZ}_JfS7|AxA0*zso+$SIB!fwBNOt zGi56WIqX(L#l7I_!w$Y()yP$;;(-x&U$#sladefO$eeY<-BV1>35m?*+xt~AZSP!l zweM$^e5N>zJE+-pY*+d$Q8`qsCpFmwr`}o^WH6J%x$LU37zGNYFa6RP~m5u>MY5$!!hi ztjo!_d7S#t7ORDdO}Yd}vo=!^^}@~zB>rO(N{`ugLi%w{rH}5ewfxQ5$HrS1V4w1RLQC07fcmjck z*$h9={i{UCA5kL^3FU~3z0^hwrCvC!@6`dB!0r>Q+}nLax757aNX?=V@lQIl`)e_6 zviR>&B7iPTtchkg=dA!SN@33?qKR*ElGu39M-q&?M`uMoW8GLi;=GK#rWeCysRJCw zWDrQz>=a**;HHdbpBz>oQloJ5XlEcC}1&_yc0R?+R2@xm;H2EV&v{J@4dcA!z4-ZPPtZ5r`oi1 zC*aFHrbxxK(JA0S%{r^c8fG+rIyBj+z0V`e9BN^2f-|lZ6zDdkLvS9WRn|>D2N#vY zp{oZ=b3KPDib=Q8myx;vgj8TbkG=oS@w)G3@FUXdL=PFz9LXn^*!p;WxRrfIC_H913@ zYv(od2~8uBlM^srNRS-1U6PtuplOB$g!vm}y^0zCCMsy$m!e9_!=AL9bU2<3jPp)R zZ%tK`anqgy(Qry|r%9E;hhVKQj@HAFjhYJK!S8xZG*MU5YTr}$ z=>ttNd$V0Unug`_(dJ#JF+Jir=sBMsh$2 zynsl9ATe*A-`uR9to_@3osgZePwTmX80cc5{vW?gij66^kHxtcFYfY9Q?}_HaL|82 z3AnAtWCc=hNNZh(=D}k*Tn|Pg>62kM(8!KJCm^jh;md8lPtsTd1Tn`T~HA z8?<~9H3`KFaq%h+X7RbPi*uu0WPKJdfvA#xuIrCZ*2CcF^QF|u9acq|Z(eUMnJAM-8sU~d2HAHSTJ0-k~M11k~OmQBmxwLYQ zXk$P+ST!Y&ea7M?HEQ=7tEzE@umYM($hZT&saM0ziLkW|H&O389DhFS5)w+bispzn z%>q!57nZJA#*&6}cV?601do(Z()0a`AxDx1;l4^4oyyOISI2ppVms&>U#M4V{?fIi!%T|Fj%7T zB^i^#<B)8ebP>7Urc*n zo?n!z#u7e5=`Q&)xlQR76IB@o@Wq@Drybke5^b2RA!Fg)06i`Krp?oo>^2POBOm!! z`NxNi-eccZ)x&7!$iyh7pNB0!J?F<--!6yQV6{|0`>Vv{oD$|1j^K{cMSymdp8Tk- zr5R5w$wR@P-PIe{m5hh)cI*DD{=)s`v-(&#daWI&u)%l7GnVQRXxiTXJ;rx5v z4W}!*X;qJoAv(K@Cj^aHx+~oebb)pZ{JA>b;k9kRRu`26x;>=q>lhr83R#~zlI_h^ zg0FB)JZikQ*K%Mm-vB(ec{bC^_2X8@)6E^hucWkwSj}YCRn(JD64CP)7OlR`I_{sp zD%~eoj&EyOZjWM%YvKqS@<+K!bT$5RnfigQn?EPUow&_K*vF5P^t>xH4_gmP!Jboz z_c$yeI#1psl}Ky5o;hzA-W;9IgYpXKsMiD0qj6qld7O$EvyvdSglBlL?V}6L<+v5^U#ak#H$I>rna|Y3HBGnaqB@ zxv+EjzSM{YMB>L?7rn@)>KwOm@g~;~__w94T5fcWy83Y5j;%yBu%WUk@-B&gOg7g2 zg9ikG3T!nB=7G5WQ56&hUsGj(rC3;nCW~$(p-fY{W5Z1XMapO-o16*;Kzi2w-j#=K z4|Sy*i=kFU5-tko?=ns|$`l2z&Y9~NQcBcDHZX`M)>H1)x8b!T{g%(Kk`m4yG!nAL zb!_j+^P$Cy&3eUQJ!OP57G}rA?@!r7WBNTcr|vdKfAnVJduFH+?i=;7VFS=cu9Z2K z&*VWFZN6%Jw=ya&aQOV9*&g1_JNLwe8*wsc>S3RLr`>f9u==0-GA#``Op5K#&Em(| za9_<4I)f98_VVgIv3=Lwf;I*s(TN8N$1=2M$_$0vp?Pw(XZ(g-{TyM=s4T5ToscPR z9${zUqPZGTc(9_w=K2A8HsHWfUL_@*tv)_@N#_G+!(s@|6a$KLqOsET5^GaqxpAD( z2tn`7Dm;Am^N5?f_y2YkdT0P#R+dZA3lJ1eu0#j7EM8{4c)EYwSIk5 z0~RnXHT8)T19L|7FpR^W(lrq6d3^S$;Gy4GcmOMUt-`S{k9edakVM25^J~}hpB7L^ zyG=Exk>sJ8{Q458_>O)P-PA0r1DKH}mhpp%(X?KYYs)C7Ao-NMNjnNn)i%e*60}1hL`!Sr|2~U-eTcUmrnG1hc|as=j-ZQ?ltMQn$9H}0-)$tSJcVJ znImeQ6o!4Qq9!NP&h{6NljW0+qI=bq2v_H8k# zk1WlBdM-ESO49)hWgFB`U``C)60Z7wFMg&aerPnIeK>sklJ7zHSTL2SK1O8!A&CNGWEeoEt%FU$kBW?l#zQE7JV`2@0d-rsG6!gOPCPKE@xPu z&+QV=AMWk38i7s!HWgp{q7A3}2aF^esWaiTFgvh7S(s%gR1 z2ZLetlx}I*Ldavqf0UJN^aYL*J6=;&p9|TnfShfD1`76czo%{w`gdM`F*lET`8H8k z<-&#Y!)$dd$(ih|Zat{dj2K2im4cCO6d)`YIg&Sf3dR8_{DBa?@_7Q#*%EH1oB;1H zI*07CQ9e2S@NXuK57wDCnnwru1b=Z^)=jC?{)dVQ9NWOD)D0ePI#aO~kN;-9G%2+3 zUZRTyST&|=SNQ#6IXKM{Y@$q=Bxxxh1kPa^kuZj$_?@#leWk*qj5s|ZchwR3b&Wv3sUyJNXodo&B)ULtuqF%>OrM$)% z?FmZl26ZirDNVFrugvevL*v|zs{|Fs$~`DzU1U%EP}U;+_1;|YQ@%Q#XE8>_A@?~s zZa*Mb>ypircx9;3rhWDPZR+f$ldS-JO|$phLFZx^?8C6=_Y2)zN}f%dL)%BPS04^V zGeIRdoRCtCn0E>^d?<{3pAjy&sTNXkL-AT6LW7m#K*iiGe zQGjcvw6?6@wHb#^u(xFt;FIvMfM)Z_53iU+Zy_Yu4^(`AmQ%G7Jq?)o%mDg}SU3H<;;#Xb7na zz1-QSP=P%|zn>7DKWEt=srZNXXk$;CcdX9}!qCyKx@>$HODZX8tH=hb$W?if{n#OH z_X7!#NYso?=FZHfvY~$l?SnKHJ62#Agq8QzESOEQo*nZ~* zv%CswDCP~SCT|y8gZ)WR*bxe(^m3VMw z&2PGi<}awbe*;QZ15lczEZ29uEwW>=1akeP8+D9wxn@O0hYxvK^%b>k(Ib+IZ!~O8 zK02em^Km9s+em^|M=!px;o>A^F(*RWBuzI_5G$CZ@;eWcG8vHO3$v|-^H!AgJGot+ zAH`*p2dIU1`%fY_iqOpJlu2CgcM9zn!{{!)gu9u)1u;|?m#%78?5)vn#|i=&R8;{7 z?Tg~4n@Em3pX?7@=2oRd>vXs5&`*k@2$NBtYx7CGtIjeg*bE;mCfapGAv{4M>>o)i z6ZeyatDO=zB3kh%P;3P-ipTD6lG5@9AR6|Px1~`+*mREZ@igUmP(z2V8~2{r&#q%A zpY4QR;Ygif&&C85AgGcCZN7WB7inMs9dWVPQk+N6dzrV_4TitJkjpr^DQ2AJ=C;r1$1_zW$Dw~#*ne6blx}CVy%|9WXtnB|2us}!|@DD7^sku zTZRPDR5zp|w1tl!^sg-jG4K?@zvKQzD$Ce$zPlpK@j&bLrJ)M5pR=WHc4fH0mpPr$I!3fY6&g_ z8I)%~KK%?}IikXd0{MpJ`KBc+dj2`D3r=e7BkM;`K7nU}i4zzkE0~+FZWxYAa2m_EG$?8oc8}u9r1p zF-~#BhA*s)eJZN`>a>7qS2QH#}8~f?#_TC%c6F#r8;1-l&e&lv;+KtyQ3CxutALZxzMd^MMPg*_P{frkQ5t=BG)Y?E@`?0#}7r9>a3DQ6$5 zr`P&mN2r&q2cCaDHS8|;ZD(Y){n)Z~7qrTW_sGzcQqEQMnCBhm>^g4T6d^K0)2!PE zZV&Rh&ky~{K#;MdwJi#=<#DYWn7(E4V-2%i zC4{ialqk&TmX`3^j&f!w+2m2|b+GCFE>MJB8`IIm?%F9k1tORA zAA^c>I;^UnxNT~TSXj!3l|3W;b==?T1?qUpA2nam&bt=fTHbyED@xu68vcxJXjXRK zpZIv{pMbKdXdr7UXC+XbtkQgukoj^nFwsUsMyoIdR1NID*cKMjpN1*q5|t{%vk^V5 zMGfK5$%(e5AbMq_xum?|FNuf_(f=a6*|wQb^}O>AW&867aY3DT6b6^O?ex-iCt8fD zN2Tg!Dre)Y>abSQfq+fDT?E(mQAsF6vScp+i<_`^pE;@c`Zrj@ zKL9?y!4D0J4cGmN^*TXjytwp90!pwT>P|YnuAxejnia)-ZoWblM1V4 zu?f*g{~1N<`0H^}la*LW3P$l-P`o7?iFHM8aoVhgfe0}g1k}8o!ziZ$-0A4=Ws3T( zB9n*Beqn|mVHg~9ciQt$$CoBrsWm5o97=fbj^N3`OKP71r!`%C`>-p;{hQOvrgd32 zZ5uc9l6F%)4~8Ad>3lLfUj9l+`voZw)M!G-F@4QIrvsTt*9~|S8nRwcsTVgJduEuV zWaHP;5yGdY+hm@2lR-h`U|5DzKU<%dppj)*ZB&2*o~j7aH?pKzB80JCP2Ym)eK=>x zN)!{Y@1Hq?O6_s?_g4vbjCVffP#82;f!aq+n=?PLM#Pok=+{w%*ut;vBeq^)642CD zX7izj9=CC>dsVu&1>}M_Q}=CXa50{j$Uze6;#~uXuH?7jKy2zs4U|)`5kd0)T??*A zmhIGH>k&F1L|)qe*pcEt&1>9$Xi!7cSXInRsTOC8k3QSUkUHf!ts-T&J7;TTkK?## zhDo@A+&o6t%HW3wnCDEUMzp5vs5la@WcG`z-*mY#d`58s6bvW$_3LWD?H@SnY$s06K(&g5SF~y&8eY4a(0keJLdn`t= zpphW`-xPF^Yb4l;Nv;xY43Hi5d(5J^q-ZEwSHVs~8(j3t#OO7*Uw9+{m`Cjnz3g{+ zl6?MF1Q7Ex>I5s9YL5kR+_%?v-r0h;_g0okm~Q!9$9xpP#msqk155?M2Oc_eLCxEGJ7})`!tCLI0!o|04{ixT7 zRZd+MN*sx6T{Ac}JUu;p?wGzO$N(;?WJu57i)@Qqzrx!Eo#2xvwS&hR2IkN^+SJSABFa#r!pH}1c-x&yz+>&#_>fv2;}^L06pvGE8BtG=Fd!%!ZGOx0C9)jP!pDNg z!L;El7oB|E5c87N2ae-$kf%T0itPo+6V}{(x;=bTUd?2%enZQ^Q|0xWjdKH^to~+Q zLHeP-opJ^>Kpv_XfX}=K&0Pi_-*(hJ0(G>?r|7m_{UqDXKc2djsJ`1ftnKwMvDIh= zx@P>T8V%>cdx27;dT1Jb{qD$(G*<5U#N2-u6HMiUY%kxfM*Oe%;q#oWPC!#~3n=*0 zk<#!ye^P~qIt#!~S?^?k0^y=$m<;U$GGjU)B#Tuy3I4(219EG#!cyTltWlXeStvk% z3JYqeg>A4;*BVly!KVgrsi|yjv&Wm|eL^b$gMs_ZT=(zbIzKb%^bdSj^-yS8?&w3? z+a!dkmD_fZyUHXZmtbaZ9nmQmaLom=#6ax7>74Av<*b$jssK{Q9Yk+mL&&Zfe9sd} zxWds#lqohty2%%vSCn(NXAhKLx)C(O_EL@<;MYYSsaT$gHkD=7wR<7D z^@%kD7=512QW-ZLISK>X7v16mpo{S=z)YWoBD>ALD&ovz1wO2z_{{%r!@i&9M~)9e zip__*&#$fOwa7l#9b$N~*N8DRN>!*Q?^c|#``U1B?nWyF$SZ#?gSU~HiO3&Mq`ZCw z_Gpu@!1bp3?qp5bCbtFy*;yemM5m%4Ns7uU@E>GSR0?4(-XyUcq9cC*wVgN@QHh~f zh{y&7W;g~atMF!p`3+%)1<2iv)?P)4B1hKdxMZJ(B4X-bUGwF8R8da63W8UGG0F!= zWk5H7pOJTtR%SR8sl=wc>;llzqqi8tlK~_w8JN0;JdqjaChED(RgoCwTUmb8`jE~K z_Eu4CbENNzDO0h}=~;}1zRq}^I({z!c%s{_33*I~smto|ZLj2jBJ0fRS~n=lh7>dF zuIDZ@+PnI%f}QR1hr8|b*+hJO*t=l}oh=)a7a|LtfnDts^7VabitO6PcYFJ-VayAD+{K9t@& zy+iOpnekaEbHA$oMs#oaAn*5?VGs;=Biw#P-oqVhpO!@8G_f?8}M%shMz6$Aev%0K<1dWDK+ z@N6iO;Ga(T`AaI&D_A~s^O|W2e_Z_M9scIuGi-d6kdNV^zdx(<{zDWNQs{L@@qc_Q z8qn#YmP7cjhX2iDfya3`jE2$pIg6I|_h)fk$48NED-%!t zO_zbk`AkfOLi~W7l;EE`7M%6r8E61k%B?j&@ILKK(VH$1RVIem`#{u}#KNG%{`} z^02f^{N66*`*43S$gs`GSVbj%*-F^mJ@9**auYe%2IlVK{oWE60y8kzB|H0+kT@f$g+i%zXWSYBVs4U-|zJ4Gzi!W~^#gng2KT1lZxv$dyDZ zY5w3yZqWi|84hd zZvoS4~;_QL<8XD8|iQczHYlb=dHQvK^8-zu>5gfO%F)Bg88e|e&N z$VKrpP|x~(FYAC_ZjFg+`uzg+zeDbqp8bDy$o+npJ>>V@R%3~pIoz_1A`(8m%jh=y zcuNrbXTOwSZy-Fv?w%czReowR?e1P(jI;E4tm|n3uph`BXUz@qOzAel~Sc<(htX ztm1n?_siwjSeiw4hf%_k*TUNg!7ko+(SJ^QU&5z8C}Y766|O~pyrp{yjSEhr-Qlgd zH>6_(9ir$J>))G{X9&(>;95@8giv^E+z}PzFubugyVfjak?dB(wtE_O@454 z7^hW#Qne1(89Q!(bFCL{ZBh4qanJplatx`xxOALd_un%`ykE}j9Ui~bpP9RM4&iyo zU1Rtl^_xg7E@Fh+m`-n|L~Q#^ORu5oL(w}=r;B@cI)+9;Q`kt4HANoT6sI=VhJQ6B5}1d3f}{j$iyhxmO~-#Mn;dk+Z6=W~ zdon%ldLC3v^nuprAq_^jnei6fQd-fkz%?`#0%HrI@RWvV@pr>+MSKc!l^Y>s$KOWL zsB193=HuV+B79kd+oN|Zhk5@}FWL-+qR#^1jL#*!e%llwBMR~MC+Pr1{%iAW_}lj6+uIsw2D9vu^R7@FeeT15d4Ufzz=ddT z(Te=b1etsUjgd>2b9uxb-LWl1kIF%b$&7U`rV(!0b8fpwKQ7AdNYaRA7W1K$Rf|4G z@x}8O(3*0t!!B8m)&caMcKGEBIv8rPi+B44qMN;RsrT6yqQhzMsq)^T9?f{^_++@* zkB`*&(?d;Y|GwiJB$;mq%L?CFzBoB|Mx3{MR;U!dxk5LZi=YwZ!!5<7JUEJ^wfo}eX|kWW zeOc-0zBnUx8J&dK>t;k?SM8;ld=0J25OPz+)f}}b^g!H;d!B8scj7u=aes!?>>aOz z)TwfMb9-N;m3w{(&&00R^xoSfk1j?#8Q(Vp#F6x=DMw&tmdu#3tqV)NI&5bTTsS%x z(>my~TJDWxQ2c0YV)E8ggmR1>0c9cJs)k%9xhlpaWvATXlCL7~^W*?G>3GVpjFrGM zhoV8RV^7UYI2*1}6d8Kwu|`4T0vyL@Rb(^bEhgsZ1fBK#I2C-D|wIlZ;AQzQwd-IU!mRg6Y(EIIO#pw>Xk4cy~jmOy(inGcl%rny= zs(Uf&cFKpM+r7@~aeKpOBZtfx-)I$OV4ojP@AthqCpue++(k^L=c5d;nU$UMDb5-x zZ%vFSZ=H~3YP8C1L3&jfx=X2{)$7ZA4GL>8`-a*=><}Q&S)+ElYLcnELG#Ph)U@uX ze}c19R6SY4>&gdiXQTpodg#u&MF-D|a3iNJ)M|Lwbn0Ho=h{2#GwM{-C5~un?6qMb zJT}PszVMLpOGC~ba`WA+f^-8Q*?S-L7!O#7La!!&eRj}&l-*I|42#xfj;%4xvns*P zlTKI~m0k?z!@PKUO8no>Y3E*x#k+P3VRy2?bNW5s zqnj*q%M&mAqi78l9~cVwEMV9KP> zJYI;9z%=btiRf0}GppXd6pQ&HyV_m&UQ6UO!#3&iA!WBnCJSrv!7*Nb+Y$Tb>A+~n zQuU}*@W+D;we8b|jjM4J?FSc818r00g#z2QZ(iu!KbMI)QMX7&LWYmU`MDmMs#PY8u052h{?vMKcs{bqYC^ob z7hWU@U9aqptvMJuZ6*Ews`K$?tu$EcxytS>o6UXo^d zY^b$Huln{Um{+8hMH~Es+f+$sFB#K7B<8`V8%y%z|W8ALmf2O9?o_2j|g%SN74Z;e{17l&)~u(n{H;QSj8tk;dNXrE+{mwTNFaV^94$=Jw5 zPeN78-`pK9HFNGhcAND`802)UVz(0JMt}XWYUpgyspxBH7OPH0()VuDqMkL+ybYZX zcg$_^JS-oP85VjSurfZYEv%OPY@0BcR_<{=o5W)(K=$>~m-(|{s^Bt_mF)|5zV0ew zd5>lO`^k{NSY!I9B_T|;wWIaiQcKg`*|mE0?(EE;N_qO#2w%=y)RKmHJd)YG!ha}} zH!#5+m!SQrpp_?lQ=Zm+krTGddusRtnGcrxU(?HJf8m-tdQYn1{OE zZKjQ_Lsp3AYzIv0O4&|Ijq&UHSjmd(Wt*y0vQ7X+0j4|NiV+l7V)HB$NwI}w+w03F$x3oUl# zU~_ke)%aqDrrNH%RaKniv?0(3*S_Q^*x)dYg*0nYSZ|MSjZ-e2$PC$A%K{KfQYv8% zcN14f6$naUXBov(*19!{Hv(7&fkk_mOsm+%{OV-)mO#DBd$MTrPx^xBYdN&uz?IUGDg}+xr`|s62IlDyp3v2pt(O+kL?p##SB4UdMoS#Cl-taIxJ?rx%ZFXVw?l9eh+U~EZ85?g^;X$&m8&X9(Xgf>&u~0UHXFP{c`*>!yx1Q47I?bC&Gx!` zj$Z=zo_VYQC)mCET_lZE;wfeYaho-7Svm(yg2Xu%tDtu-;!J)f8S!hFgbU|t3S_v_ z>`V->0{V!M&u4G@t6D0eVEUX-hnxc@QYX-ZiekT$*`^raR-T6SWg4M6`dAC}n3z{?98~T|^bXlr_ zKpK%7B&p=J_Ld_-l&tsW&GK(`+07eaq1^C}8G-j$vQT0<7MA2x^e@mU^t9!tAF z@RGo)%sFi@0aoxXw(@ltx(Yjn!W;@NOtY$ejZ& z^ZZx-!1Pz1BiHZe+zCM>pZ7U-H;dEnmwia%K{fgfd^env3tMq7pP>Z4=HDiSG&p;t zbB19n1F;ONFDh%BLZ!FgM<*^|ndr)1SNON-b13b^Wh+~;F`ho!!<)}s2t1-0h?Wa% zTuT>nr=NXesb&)pn0VRa+B#I0M?ysik|jmG!~1X z1533onPmGQY}zbwVNFqv>3|fU0XOY)3?%7EjlLX~^Uj+5kS>BLl`Nd^Is*PNAkg zUd*2|MakL(A2(|ki+HzQJC3mpX{=KV+_5Z1ZM*t|TDH4H<>KDA8NBtk+t*i+iTT`a zjQIUVVCN}-uw}mZc3XjJ$2QJ{TF&{B#i}XYB`OvY^5TTU9H7`cpJ7$Sv|<)Y=zw}l zFO!C?2c~PG8)+B49nnMXyQ;)M?@Le>8|T$&Qp_G#1nKh?QeEdX=K#(_$+2B=FMFdn z0C2c+&baYQ^vr@LLly2j9G=p1#!T@W{bHfNmWfijprxO{FvbspJ^Hya*>jAmZ8u}u zJ}`4xaL50|byOh2AT|fV6(A!Y&06>Y^Ii+60o>`~ob@4^>GrJixNi%!g&A}jP4(B8 z9DLV|$7kUlEBV~XqB5#*Etjj`IB2Y8_vJ|;s03-G_S_9ad)LRc?04@Kzb^5^$Co8t z(hDMNpbme6c+<9K!qTl>!{4nT*7sH>y~{wO3p%4tnZmWnH)bRy>^aga~X8{;iSJ^ z>%{gCPBgH{hp4AC(^@Is5F=<;^A@9vrJ!UWI!A}w=4j%E77{3-zY=B;AaB=stEu%HYqT+ zkF#uy8;Ssyv3|v?h|g})T;^DWJgjhtwAi!)V07Ib0cy7QU;SMvC#8=t+fd_ z<)$djk)260$bl?7OB#8qKQ}>_g3sUtZ+`)Fh-Bj5x9t#D_uPRn18AAHJ*GKPdI6A!n>qEhl*c z6NGFa>TidcWOcp6jM1!qBPzKue2lRTZpLP9GNE$DGT{o zkC#Dqy7}yUgZAMwmQBaa`J^O88)s_1y14hyjHad{yLao`(l#UN=Gjjla7fYh^hi`S#s+@BEu=<~uCf&m_U zMslH`SUbxrA(tFA{BQXzO~{L`4Ekj_N^)9NhW8@#J!swyJvLEua=9KT$4*0nZ?PA4a&->2FWD7O9G zHP#of-i}DCVFH>Nvf8xCwy!f5o4vV+97V7W0{KPx7L;(YP5J$b<}!_m%ZJO9?ecm5 z@agj0x&4^S)1$lF_F>K{85e4i7YxAre@L-%>Tzc*YVo)79C`AbItLA4@9Q};!xC?p z)d=KR%#t|5iID}*LC2q`o(l2Hqt~AT3^FI*FyxVgig{+;dt@MLXLI)bZQ+nNSDq0w z8E>uD0)@>xQUk;De^UuKUL7y4Ne!mb(nm%#TQS;F+j$0<$OO@+($yn(WY()*z_xPN z#2cal5%Df+rIU2G&DfMQLgW1qq3ZQjw4ZsE?E%A5vW7Ep;os7y=V`89p+Vz@N0YaU zQWoxUfEgvmxWbOEMKC|8Q;dQBW2pBL z;;hSB>St8Z$i>y+Qa`PxT-nh)xu**<@e8&JSW^i5x$OX{V3$$c^p1;MwHTF@fXj_O z&V}$Kw-c2eO3!%Q?eLovYoVPtH_CYb0q|+?=jg=HPBG)>8vygY;ljY#N%8skHLDJG znn}TxT6XFu7}`QMpW2Jx+LrOfX;yxj5(`M5eYL(det%j%UAAfThou?NPzl8zZmD#k zDG23VnS>i83Jx~6O)gX+Mw`8*=^WNBRH)`R5u{jkKk1Y!{W62?)=wAm7pK2V3-K-# zUTMEmjw{LhoKO#MOk3-=hZmKLSB?N>YnIW^mKaaR{uTe#>c5POXzSc+l7=L7sKg+H ztzzHIEEbaC(%p`^TNm(lYq1q^c0Da+QYSqSbkLR=7v0Ikn+D~Cy#uC+HG@imQA&G+ zELrZ{C(^gPke92;A5Yab#Ws?xly+Gx_r6mwYajA*T<(9Lj~W`j`a~5CBR5Q6BfR1M zN=A*URN3X1)5=Ocd#%7Wm?`6tnGHsBT;N4Y2Anot+~9`IXnVr!7cnQhhQQ+%>SXTh zaX)Td8WAy~EyK(KAUtta4IUbEKQMU&+EN;J=Sb9b8r;e^gVeHeXa%iZ0wj#EbQ{N7 zPsKKPlb(8IjXI7QWf_P!1yf>t?pXZMUCp1F4o0EuEEIrUSg#C3uH&vsR&d0Sov&)}fwl;n)tbRjX!$6n&6Xy!X4g!iSgd z8p0UpFTLQHls43uJf%dc!iu_LI;`Tzk|=NAyuHNfhs+nemUFDzoX#mMED=b4PkTSo z*8{!@Ms|Ob5BWmh)uGBS2p#d0Z4A?Poj#fef4d1N>q)hXoCNtNiI*A@w&lzl9V<6Q zTOi#>A;j#@=HLgmAe&%R*Er7C2NfuneX3BI6JG(mC9&=NXt_BrFzXSU`A#wXxo+eo zR|qNK$5IV9EYDKmaAj4z=seCnoacp2Sah_-_>YHd_i_}{a~1sU+wMrF4&StxDY%yMbJrP*l5LU;Y9X~4HHK*JbNwXwbTl8C7eiZ zd6}moaVuk8R4rZZ2>4>CT^O&LZS*-kSC@5=%G1oHFP?es9P?14)2Z-Z+p{DZhVI5y zWgwkYp?753}IRZC#}9J+B;tq-~5yPRu=ys;eszxi_SsLAnyiM zYucH{q@eQC3>ldHTSDj@DmBliKTIs$iyJ?wkYhuheY?>3gSGL|#*G{Ik%jBB)Cb3Rmx=%AGV8;ASO zr|m9Q7)pnHPnVr)&ThWHn|^Ol-!-pxfEzMcek|WD$2%!=qqm=7ajrc?`W1Pnfi8@3 z!eCS=SI)(#d~%_Y-S!t#r<*KSR`-T;;}A=?U9x~71+LE{_RfU|M`aHC@z|o1tW;6} z3QM$7vpqm*PUdl^%oWM3!FaG z%Zkq)K_UA0sQlduKJ;dnOWflv)7CAfEBnX=Y~Lc=QJ$o5YMy zD!gnb(&I7yCmb>z9qkwp4EMRREk**ynigD9h8UmB4Y0Qp6sv%}wq8rhHKvjqAUA8N zYWbm0myP1_a>+b`Q%WYpOcY#k?<0l?>yZVllVP1J1+>P?gj5C|NwVBaVynpC^7{RX z`;E`|PdJpvi2PlNa6k2g%Z&%cOp8VRCgQEd#qKtFgn}!zKe75d8y{R(QdAAwL#XdM zS1;V9)_MVKu>1;gEtej*j}Q!kT1Igsx7RL+kly4c-K1fyVRCWODr;0=9?XshgjVt? zc-oBBJw~Xr05|!k+ZSE%Gp~mq4i0H8=McZI`HpdMWNFY{5fHBtr{W!VrGDfL8y9-_ zhft8#11TDpQ;dyO9~_yWv=aJ-kt5rFF8w7$LDE{uICyQ4(`^E*aER1Ju>_=SkQ68j zl4gd@#ROT#R)n-y4Nyy+8|IB;D2IZEejE(}4Cus2Bfl8T7wLGcZ-s@+2N~RM_)+%& z%`~y~&Cw;zAFdJsY8;BFYsns|Dur}gNpPNp=BrB4%zQxJFGnmJ00T*D%ZX1X;?3LU zsf3Zc2IB*C0F(sP-Z&+VUOdj2+RU7Q4Cf4L3>xE%)1{M>o6y>bC&xSZ>-yp}F4Rud zS7;!p`6!tDck120QJ|cC-i)RFnvDnhHZ3b!Cf#>$?6?H}E{`4lik;?dPajpDGAa{A z1oskq2td+AR#1Hm(AtHeOJnL57A-LCIaX=>BW8-P9lO-?h7bxK<((_A(G zb3k*+{odfVOT_C@ygO!hZD>4+S<{l3OW9yW%Ypd9C# z$%r#Bygdv&)io57BCW4+!Xe9`Dw6Stf&!9IwVkW6GL`BmIZ|kWj5$1OmEet4alz)Y zw;+F>a|@ZAX~!v-6T2e5F4WKZtTSpv54vLJm4njspd<~X zi|dgzR)dibHe1$=C(Zu!CNPz!-E6%m5tcvujte98lZW3y75&k#ixTe88P*wEymjDT z?wKt&C|6YEf+Mg_wPTUV3XO#$xKcIC+#KO_@X1_&`(E+%VxfQWDrnTc=i(y)G$d2*`j;~hy*PiXCB6osA#z z)a+i{596H@0&F*6HNW$yG3KqjHoZ{xyqZ-AK7Cp5qtxa#x1Z zN7KEAId44uaf5i!EKgfERHubi44lu&ypxL_I{kbjJ8=z$Ry${Lr?YqON3ylKmk#dT zXl&v=zI^DN1<}v!LU;a7E=y*0jp>Gd%Q4wej|Wd@#ZGPYr_Xj?+iU%!$99R|ry0V2 z=J<<6KFx2$N0sf75ej_W!g<>uO*SO))f6Uo&MhDqsT@+Q<8IGUTADt4y6|;}>Q!5K zOxm4vI8mk^1Uj3kTJ59ceq9@&Y`O(jutW!}ER9MYwY&K09KA4Z&0+Zt`H+({zvA0( z|FP(IkY>mGseabhXWMi>#lxX=)bY5j4U&Ct{S3xOsf)Umcx4{J))!33EuP6#_~gv! zm8syFZ*nGA1qB^Bl1F;m;)`X59G?lkc9WkB_4k28&s8IGZx(OLz58INVW1%8<0ji4 zQY#>sIHIyUN$@f*qS9X>qT&MR89%!2H5qIC+WhK7Z+>9C%RV+KKO)(YEp4~BCAJ{c z`&BJ*qWu%l5@(LzD~7mlhCvwey`?$lqt zE}wo6-&%E*&;h}O)n+iWW<+*zV=pQ?)a*U|CN5^&u2}7@Hp-uKy;j0b@H8@vs{7ol3Wp2NV&) zsyI!VziHbRk2ycoZ%n_}==W#W6hT=bwM1y^EHDtUCmHlOkX}lb(zU4Y-l;aSV>xJ) z64?LgP-Ei6&}cg`&;7`3a*xV1TwAp+9#JVpDmD0r50zi`Zy|3&!TIFp(cVK_$P1Xr z{~hZfsN1uOsv-P0v%_-ULrBF+?MzJw#nfJ0+^dnQeaXs`QcYHRhqG6zZ#IRAw0Ej@ z3Km-w5BRRn1E2O!CXzxs-F^m6vRTu<77A2uC{T}mx!K{9S*zzNkla{l$1U`h;oi#A zrehB}y;*?u>r>*&q4k}f8GFsZPPt&Vw{KZJ2qP2Mo{zXsJ^o#M0#MF0fGwY@&cHoM zEwePN0pn~TpG-kqLz^L$*bX=LZCBBxCoICV-@eV!iL7r>dgxARx1oV`vA794^|=%W z(%@+OH2l;KPo*5huV|f#JI2F}lBcUL__et%&wvJ>273I+ zWL_+FG1k4BhG@r%TaVQyX4|oKFh;p_JC@nKg`Id%mC=3AT{73af-1DmkOze4T}Cee z9khwrjF=s!=g776F8olC%Wqhc_C>douZda6y65TST?NkpKbJVp_)OE_YD!h-T$m-Q4T>~WX@Qi(sm)nU zDibP4da`iUo>>qj3ZipR&By=NBdMCa0B9t~*PGgCz4={4#6rjT0it|+zLvJ;)G;?- zo58T){Myhvszz}@P*i)n365A5j#>bFj5&^6f@tDuLE-NN=*ZS;oC(y2`ch2Ee_vq> z(lYvG0D86o)r>mgxHs>J?>hJZQnWuBIcNTcaDP&s#lAWe2JBN;f~Q-n)vYz`0!Ay& zRM-Amtsbj@N^|DSMfJAe?$&g`cQi;IKSb;qrCY-hEW@jbQL$A#L(B)E)(U5GL251* z8AMi`qHLO9H9lT|hAQL0Kb(v2m!4sDE`iLO~fMpSq-Q>zCwHq}AlDL)=7#Oz!@DGfy<2f@tc}Y_xfh6*27Q!JC~@xQNCmat0X1sR zOlsa3z+*dr_X8tAx&Ym}H$xMWAEnXI@ zM${?{AFJYE*<>zIkcZEd|aDt6Sg(fwo+t$XG_3xH}%vz zDMGvRhSlw0LL0koPS<1A$e}nc#F^*ra~7f#w~&p(DnN7PPW|73KMypgM09 zBMp^-+<#RZE{i(IwwrB^>1W-0ukbjNbkcuJ0`y~z#t(s|icHuTzuJ-}0GP4Z5kfFS z*WTT1Wd3z2%=#9WY1|;z}S3Ui~9vM2$0tmrPu;-A0jV) zH8US<8Dxc!bEBmy;qPTlToo%Fk2gtUc6Bby$shC(@~}NJwU&b!=xTv`vwNmro$f*tMapWUTJz}Fw?BgPYpQimZ z_2>@(#-}fovh5bXUX?Qrr3y`Bp_Q719MB<>0z1oPJ&t4^w&TKp?taY{Ylu(_9&};< zTT$}wdhaRQ{RsVe>c6oww77C}+!;GRCI+BdzR5S|sC=AEbEfm%jYhe_FX3Qk^cFE! zA7k%D)6qH_<*WKOEz%I>@g;Z0$Bo+GB+tcyf00W6$*vP$rk44AsyVQ8p|-_KLp(b& zw&(bL?gr(9h7DqP`xVj$8ZpC}^KofZn)0nWqY88b7rj(NVhXI6Jo&ofs*mJ^fFP zWumOJOAXT4g94vTuD9KZHSrI!IyV>G?z?}%QstSa!}A86^!cKmZ74W?Gz+=)$)eiY z(0zYB1@ZBQ-HgW0^bNbD(Oy{I8pos`mCG2AaF^d*(>EbhA(X<@YUmkho6wVqV6{Sd z9DDI?k)cz$oo@J7j_zyL)L!)$vhh5@>LXPfyjBK8^jHv%w?k3?ogwNyz>|KZv+;x{ zFXI;KionQ)H|?L#KhMM&Y+Q&d6od5*SDr&?_}U^Rp5+W-Ce_%s(?dkFyU80yrSiDd z^bjJEkjt#Z#>g9@Bhpd#4;uym%XAE6i?Ok^#(@iYxG*`a#~yvbp1FwDb(GP&r=M^0;l) z4Ag32ui9(YJen;!cuEB@TI+^^qag%aVjGS%i=5&PhVL3WW57yaqC-H{LV31Q`g)%g z+di;671b0olL4Va^@SQuyMM3e(?{6Cbj?MwDHk_d6Kh6}`j$y&x)BAzQ zV@fIZi{M7I82(nI41~dUeKF}it6!b+N35G72Gh-S36J`NdNPx-LsE1g5qfS#D>kp^ zllNz|1@lFs#cpxdt4gnDjL1@j^T-ok&&6$OIs)v@DnKp~%s~cjO8!hz+zQ&G)f_yD z?HNET6ylK+l(35q5q&g~JKwLzIU0cCAO#S;(U-{P1}fMS{nm|c_n6tA&3fR`%*c7v z&U$CBGJ_d2O9QdcvM%q~9yTwa5|QF-f6G7I(%z_BFTW2@)iOzDURy%zsI^jVd#b@8 zE$vW%g3J77-21d`P4a-}r(@CQ9g1~}R)HiccB}1TefW&h{<{Ei(njTWa;ecZbc1nE z7M+NB-^#}J7~fu`m-TjA^d2nrc<9oGU4CfiT{l}!O(yR8MC^9?d&JHbWd^iAe2_;D zAO`scABR^44Q~*X9`SnjxeRM&B&CPfOx;(prV4vWhcnPYc4g@sq!fYSAH2j_r5Hoe z@DhsU;5wEbNGWXU>kIN6Ld{u^-%2ZlVl|%Kf~0>ug`j2z9`^8q`5T3`7U4IFgW@_9 zxjseo9(pKUNSO@1T4a=Yu8M(Ww>UkX@+Tdmp}LOF++Vx!_uqe+f9^}4`0+w=-`ev8e?)0m>sH;)c9ivE!6)bjWxb*j@d@OoYVLh5hW z{x7rV(=)U$6gTp3#!bjwr~k(ff**gEhV4}0^8U^q|K)Px(>;A*LHk(RF%@?4_CLH< zcP~;$lKaXvml*d?Yn9~#2i#QuE^efDu{|${^xnADGbAXN{$d=};`EQ9@o7;L(|2d* z|M|cFX{xHPqK-%ev|09l@s+)!UdG4L{NHV5Pc5mlZAqAV^z7eVF@K+Te?}6?N4-o{ z$n(ED{QBytT5|nXdEw80dlCPfiGTf|O1C5Z>)O`FI@xMO+-yqfcF<4)k@aDgp$xfcRKy%L6k@Ft`@Xs;*9gAsH$6K1S zAveo^x4fOcL^Z}0eUbg|Gb{Gu{P$>SbEdUjK7A|C~ijGin5-DFrEE8}AFunjSu1((tC8r*`t~l~POfCCp@@Ys=jmvY$u6t#&EJX@Wg-fZce}pAA?TSGg{dIpG$@tOkf!zN&HEFRhh!ph_vdUWge=s&!LOemF>A}* zROh{wEs2e^i-d6Qao(B+EwHyH#&4Y4vLd|JbDJL04_?(RELywdMURlVMfn7Dz1gF*ERgt%<%Y)j24Wv9PO-&%V9B+ie^@v@ zOxbqVv#n@&H(s*s2zRL?yx0(&c?=d3K!%T&=Db)JsB4Y@TH=R~H{Ncx3S0aXF!)I1 zO^=_CI2NV&6^*A`e_RF`6S@uYFgRy=0{45z;$4z|wyeElTOg*BdbebTKEay`Vi-=f{KwOgCzf{kL3nZfZ6WXN+~FX$mn z$!(s{<)tt5zND|uw3DRL@0nH=eU0NL7mVWh7LYUcqIPxQVO`g*Xje_T8!{a;;!=E1p_|z6QyL37xw>Vy&l>;^pg;uu}ikVj* z^k}^|~C5~`wAFiY@bDjS_$}&4o?Q@^f0146=uxS%et(Zyz zhvwrJrOr<=Z*FQXzI30^`7+g`RT80rCrKx)yeK=}_1GuWdsOT-i+CRYXqws+PV6Jf z8*i0Yz^jr*X%VvzBerf%vTDU#D&B*cbC!l9uP=L;jx8#A(gbb~vA6jjW_&eFGETln z-Os+hDIVQe?OB{}Sv@=g`=SqIa9G_|x`$5hFvUwwzLZ*=?{fW}kJI1HdrJm#1*a|s zKO)Ue5!ETVuP>`a?kM%Mt_7&~(&$;*DTgoY`?07cyNq1_lplOusDH1maGq#uf0gq; z<~Zsmv?uCl+C5(;bD^Lgn% z4ddY>SvSsXPxrJzK`SjpWb!hnIofv`i2eo;@c#L={#hU2tc=qeCw1$C2LeUosg^y7 zQ#<%ONll-C7*9*Ny2PA0*eohFQ^#Dg^p~!EYgwUzezn|ju3Vf`^Ex>R>LD8PY)ZXh zu}ulG+QN(o4C}ckE}Mj6VD!t;r0mz6=)*^m`$ya_``dQEZoo459H)MbyR4b)+P`@@ zcqAwm&lx9eSJ{AU%`7&KL0PrAOV=MB3V!YRGO$x-PL;&lvsdipmN_R(4BuzK9L5&O2DG@$Cg7Z8!gAl~?fq zoIvh5?FFmLS|{FApAyTsuCkggH%~sK!C*Ut?v@_} z*ekv9K$rcfUr!lHDB09RHCHxgIBzl#r@@{6Q>7!h_Ew@c<%3M(mi&`eGm~UTukUoS zmD?}bD*F3H(N&8+P{o-#$p_KO?BG(mDy87Yd$y%{cfRxCJ{gX)B$r|S@rGouSEx^y$QMwo|`lf5IIfc zXitpi?|SJ;#&F@{HTv8A5Va`x;6)8;?iE9Re;8x8;BLYbLvN)V-o9=EIibI0eN3SV{*=Z1u$}mWe%9NMmUe}lf!*+ z8kt6=^-&W?Di(KzzN`LEL`vlt?obipIqELi9yrWJ@4_2D=|Xa0e*~*Lde*#R&8wYB zRNj>zEMERB*{-9#I8qv!|3abrrq)PS({R=_IFv&*TWabPgM%(4TqHY&**E8#Jxz1O z=X;qX4--wuudSCd12^uW>gE>O0!+d^9`_2?HEdF#^KcWzcHhjysXcm4DG*IFHeFt_ za#1%SG>B$xbn@Br{M->u@w*x&)XAlrmGpg;pH{#&O?j5QQg+la+h-r_Oz%(;*@<7> zqP6(&{92>1QK9FXfMBV{o6NQ-to(WZ`qDRPX(bv6*hvtK2W(pqinPJapn9FM8ybYejks9^V*C;8)P zj@*~?LWx)69JvegGR-<`l8Z7Wv-JznM6gTtT8~@vY(iq;i4Fp15C>KQlEI>5gMb`{ET9_W|=}EAP(q`SQm`JBMAoL*?K0`ft>I`d9WA@Aou| z6xzig;(W z^sel&g8%)QJ(5)odtu-R7FpQIS-~I!E@-kd{pfGVF^UzYRXZ!gJ--tGSQ)9duAjN; z=$?NdRY6zh1TY&&)gaR81S}3zeQw?8DQo+parJ_=w@tg79{v8?J6Sjx(`tJ!bFXuE ziwnK?XgD#h7Tgszt0dZPev`I0J{jM3L|q*5Wd>kogc)=;4Q7?P?UC$ z@hU&$V#gd@VBua^naIWg%-edWp|-dWP>TkWdmcKq8wKbS zDmJ^)Zl1D_z!BL3#nTHHpO-%fI2`*T?+@*y8LD_Zd1ns()_B#U;^EF7e(oYBbqVu2zRn*-fH^ zNlp`PrcYs6qn1KvCQBLuqS4fF(6;c z<#{J4vq;pZQzUp;D088##2d)m^|$~e{Z5fa>e89E(6vT(h4^waoqRzsD3@N>-o(U@C4_Z7>POq4mn3r`d z5^ISt4{$sw7n6Q_W#4+4r=VEFB%#XU%lOSP66$XVr}a;{j9jeP zp7Deq)2aF&!XU>zWz4B9pLLBJj*WUS}&_Tayt{oZ;{ z!IUt$mF=qMO0eqlcj<3fO_m*$o6BC`Hid@v&C%MUDc83Vsc-U;`3Dk0bP`fF2QK%E zYMhExUV1IhWlBjF83kIu)`}Hn;8*oP@>Vm8TVJ2df=_!bUNcjtlR$sPY+$wu4Xb1$ z5sTDKo;QBc0`d5(QoAvSct3ShAty8qk#FRS1H9DnfL174~?!(xORj&GDG5b|3%gO9>4O9OKKtl~kyg|M{*r zRQHNd*v#S%X=>!K#Xg5 zMd6f#-wV4WCBKplKx0H~05w|o(nEY%Ae#_m0>VJSS{(98e3M;r}K$}4kzSm{I$&+|6)0_Egc=EujFiw@f}+o}A9&PJw= zu!S34^^ePLGWNtCYI)~6=uOur1XOXv<=?gxdQ8npR9=~5rPOz2&amHE$5q82XxE!o zd*@npLNuR8%MFbQ{uOq9iHJvq5|@hulpB~TuHNAf-(5*A)DVUCWELu)P^2DFxog#w zQg8{sErKF7Dm?YwDu$!YK#Q)HL`fE-c$R*iEqVa9P|4{;1dPb%G&r$1C&j@H3zV|fE!+{z>USiW_ zM;RMbm|?0(Mx#die@)PH6&fx$zM{mU{*_xvt)cz?WM_!P1lo-DyTmJg-|QpI2f$qQ zX75R~aRJrg9=ji@fJQxnCum8o(o1(%E~2Cc+lVSEv*)lvjaha zhY2|e?R|(48#)Ohu@6efS=83&4ho)q(gs4OJ*_oUqY?+swF$qP6={Si7(wIBTp~Wi z^tnujUN{xiR2i)=Ae1C4eDBz@$vwIh;zV|Q&92xiX2MD6ygjZ&<7fER3e$a@@{=1G z7?uZc9lcuU*P?as;30qbn|Csox#Q!w@r${~feiBXPm(N)OG>H_zsV_N1hxbn>p#k? z6`6N?S$GXiU*YruUK9B8O-0r48&QSFZxWC}ove$YI%ztlQ>(cD*n4-${u(t`9PoPl z9ygavyDd216Q9On53ZQ6h?m5IZ$6w4+G9Uc^d$q>P~_8S z3QuaYc_<&@kS{;|6Gm#-lbWEWZ+`smmY=`ET>ZRCqL5d9ek!a796Y5GEA`4w?=fHj z_Y#q{@WU&&`E4T~gu`=8B6l)v6;}|siZ1h}(DuRd?QDF=<6uu{o`i;7IqvH#_DP{j zt3IJ*-j64o@d_=#L=p1O8@9DCrWOJ?v&ceqIw^AbPK*jceIGf}z{h@mQ??ZgA;Yk# zvTIE)6KhFG&cZUL4Afa^uY60=yW>_miGZvyeJkw}NtU6}mWrStu!?DJ=!m@~wS45o z==Q8=Va463g*2SGPF5I^PHMHo(MP2>NGrNzlzIR2kAe}C$_Tk&hk%UT=M)XX}2$|U+7#tDiN^x z<*hlZEYE*$2lS!x7aqy1bC_B_G_lhpgqG-?9&&BjuJHO8K9sNp&&`&5`XqNV!Kiyv zjpF8Yyz^ZsqCJqVT*<$v2>`?9C|HJvKynL3s<1B2ewsxN-R~kb>c#|YO3TKB%I;0> z3uw+$SyK+c*Z2OZ(M`)d0vmP_x2u+?l^EwbdM|!#(~O)Qy|~WqCGFmP=Rw^IsQb$n z3cW)??v!%S&h+;X09@eL;6OtowQbYAmbeC4BYY>=&O zudpthA&ek(MO;|FWYo`pnJJO$eR!aqEgr%@m@{n{uk``@hSC6G_D?+F2PeBjH!oI45Snx4E0yw~%q7jS!^`JVc$d~x8TyR>IY8QT=>6IOg4z7Ik*{oLk zJrA_n_RO9W%zMeTu$$G1yM3xWAfDs4eC;Hl9*8(^%Q~kq!V$0<&8wmKpmA(2wneOi zHskDS9$IE>$Fo9t!K5js#hx65RGN^aGA0^;7`&V&y-2st3S;m{Eggk|HZcxbS=PXFG3Pu6BYmt_ur;0-6HpV3iK)kDbGRT|Gn1zRW&FREllaJ@x$!bekzAIOydau3peub7BjHvRGWVdubt+}zy+bBeOcy5{U2g>Uv4 z?Fp_@uwUfuMSpO5nCSigwfEHlQElDZh$3DU6aEI?O4zAthFVymZs{9 z0s~k$6b8sfm<{2nMeU6P+LA%LJa+?lAia7pne4DqP}A*Yd9)UaXd0?oEXX=ZDIc5; zbG?e&F&n>p4)?Nbns{J(2*#SZEH>g;7OR*0EXKli`Pn-OCyU2765IpRzBIp4D&Xv) z#m*CC*RqN;+a$|6xK1$&m%Bvv2;6?hSnn=-eXPgy3f9Xm?tQmL$94{bSPc(libYDg zadw;SGZmW~S~Qs`y;s+1*mj$COVy3%84LAMXa9V@%77h9b4MT24>eO5(b}$z|Uz8Y2%JFbA z`M?WZ9Gig2b7!7mLzz(v3Z`qHj3)p5+V>bm_hD|zf-&1cedisq>#a019=AnZ^Z^8} z&@N_B<5@(Wro7M*x*24B0~MZFBS%!gBH}ENzQDn#MUCk~MQ#i*2oJ_3+=%}+8lgHa zPGb8xJLt{w$W1p!b5J)!cWtLP&a_RUKuf$1C1A}0cq)L+J4XyPkht6`&*JK>3N^0e zL-OzUI0u}_y;^70z!`H$jteqO$P3M%Zt5|hx>j> zpNQFj*~4&v$2cbyVW!q>(l%l-sP28Wc!7WW}d9?^oM%M2@+Lk*DWnIopG3Q&3mt&P`>s+N3=X9|hfV(P&D%J8&)!I@g_-~&=Y7Djc*RRdp`=;?c^nwqwLWmN% z_(m$}^W+z`bdS(f601pNnlpBp<~O+#g={1`nhH$OhtM+d+%dGNU2a;5ie9#7QhBQo z=I!g*)#tm?vKF4lTwQu@(o|-W|NI%3? z$-l4N?&<#J9{)la7}M8_MQgFLmOhQ7HOW}Nv0<@u&p=qQeB!mtFVUXUQWs+IcNNmq zj>)R~IC?lYI~ZG3NETanX*EFgveHum=p=o@+;NASw5mgNT0{xIlHW){o`rQngKTe^ z1&D}#5t0)(;2Eh8rA1rBbP$WM_xuuo#s`1Lz@ZXngP$Hha_vZMVML6+aVB7pFB0cJ zkrFyWy0z)w@}PscC1Or+E?m~U<4I4@(O>!vem=7pgX5Ix2KXX$+=KN_jyxh39hPpT z4=Ot4@%5_^MD_GHvTl)0d1&VtU7~}BbUmChb+NN&m9dEInAVq;Tsq!#{Y>t@%F>yV z_o{J1EzbPEj8gHhe1TwuO6tNb!eZP0U>Sc{cs19pZ+#N57ZmU$6LU94s6#cDg7I`r zO`A^h*l=44BW$Po&u(?Gi|S{uTvg<|PdZ1@xv$)<`v|@B1xltGt7qV-`Cq}pd%wvt z0Kj0>*io>pu2|u537;=x(rBC`VH?G-Ft4A# zU0?@hsZDa97$<=a;4Gn%CF(U@s_CtfCs~wyV{dT; zU~z@@>s7;K6WDb>(qh9)J@31fsfo*riyqwjmvW%@6l>+hw#_BflyqP9@Pw|?nj!p> z5$rh`hwf#0ttbC(t-rPQ?K0@ZHI1Pk&Ob0b)k`wEAzjC8I@?_qKytAAOtOIC`2_|x zS#mH=0|gtyQj?+^TJ%M?3sr|%)ycjbdvWlmNcJT-bn{Vpp7qxGjXB?-vZ5A`M8%+K z1@Zl?`lao}=|@B*#DF*qQLQ^V-P>8ZEZRj_ z$ZoMh$ByEMHT8~t&!XA40kXduIMiVv0GClddnCi@tRBw&(Wq@(FSPOC%KSA*T3QbC=D238DUcof;3|?*!vsyv+8UsV(7p z)T%M&xu66}hn%@6%v+o=aN$HOltWJze?n`}F?T5ZeoWk=yB(eK`Xc6?siMajb&2VShNW&uqs* zrj_Eq8e=7Xt#tS~kNoAJk8s24gOOKKo=*4b`^qWJpQD-FrqjCAxYa7{UOj0UpIU1+ z@V~Z%4;zgoxZ4Sw+S)t)Mb~#kO7tRG)e@!kxeQtD&#-pgxBA(mzYQV$Oe{tXKHiOf z{BYKa?FwmT^_4MaXm@(>{;TsPwZLZw@>U@;_&ht-4`TCs?}M)7k9_cNG#5JibKCWE&+{XU@$n8MI24s=Q0mgEB3$U` z$KyT|k*L3WoyWK#

5oRgBhDe1$B`|gNM2@+p{g-9S(T@TZGR8x0+Yjwwd`Z)sjlJn8(FiNMh= z?~Jt1cOmrSBU#^}(JlTz&BhKm;EUe-5Fs~4T&&z9G9XvKR)>0Lz{QsJ%5%=X4P8t>-BYTM4S1zHJK3lUkY{#FyN;C|-n%-lbi4Kd6cb~@!$)b2O^VB~nc5_`A6t#{nGz(ZzsJHWenz#8Pz)UP#BIB1>4Dds|ypkJ3CsqZ^QOVkkgIcJX zXE=9x_9^SGP30P3XvB32blh5_#=kw@y1`j|)!T9HkLR(MLrND&Yb;2p*_6v*lgHZ0 zU!yKSaNb;0%8?xtcD5PZcbD@n7FZ8IV0tL>B|{f;Gf&5Wtv4z3{d0yPjdMMs>?H;O zZ*;I*BrJ6s+ffiiyu@R$n~Wb!wp}VeCI0})q3BJoq5hr%n>!4`NUy@Hg#x_cxh85~ zCv52u003)@dnMrT5X(E@(l4u++M2frFTF*iF;iqswO9!@<>v9N$3zR1;}_(WV>~xL z6*zjVJ=5o#S+7Tz1uj`uy5>-gTGR3>IDd*_#IxSmsT1MBfa=@mma7+k{%it>vd0Sr zGYuhLIi(ipNX-S$S8M18G^CsT9K&3oz z>SJK4>guQ1ku@s4iB^ruqA=W~qhi?A%8@M#R^9~r#87G?eC~pb@;Sv>*F|QWBV-If zc-xSall#mO>v~{TE47*UdSBT@f4K}~%-G|QBx`lSQir+$!g=4$$7+-Fjjd?vVPZgq z(`@v(x_uSFqweaT7D;9TGAVp%CEIcQyvI9{U35Gec(t^V)8po%KpK{6uWq*f3AXm4 z6z$nwnPNRAH<(*tCE1-TZTEcy63ja_vtR?5t#^YKXDUp?Rcy37deI9y)ze(~0FX{H z5Pg3&@OucjHq*6=lheiS)EZjb2yRTBgZAe558Y6M+(=SM((9cXVH`=2eec-r523x7 zP?bkO^J#)J^dZp+qKv?si|x4#&FNo#YsH=)_wMB!G6`BOq%N=4(sg^~LaAG1P&}}B zE2GFF6)jsgIvU~RL+TV(49)*=vK?rrD86}MyL|Y9U}`o!%s>`1D)bT=3gk+1&%`^= zyE$vZrYIA^p5#iH<23D#A&|a@W_~jKrbn4K z+mp`K>{v-0gLSbP2uq|!yS@5cPxtCJUwR0Q=C^mR`L&t+04-`^*sw#iY%-2eJ#6Us z>cu@e5#^1mw?9pTX^d>~p`@)(ZjYg1Rdb|fc3tdhvO*udUP>~PkhZj5YmC#_e0*OJ zc0t?kyB=e!blzjAqK9_|IqohgMg!R-4L75%9(^!PdIr6=+GEN^(_xVwafSxdyfE@q zwAbKJ_v~uU{e}LiAQ7bT?w~<9W>!Nkg}$h&MM1(xtR#p3KFHDvwv9b&GXU zO2O8F#s17CI8Y;gOf)DypNNRqxRpU>$Y*4oi`mjDBB@sulw2wM{ zz#79I9E#E>R@@FwtdD|yt|E;DDlormSq5v9(Z#3Y@p94_y-|9SWH~S7t-M-fUH~X`MD7u z4I@(O!II?wq-mR_8aQMX4NK`vmtJf# zVckMPDT73om-oe9E?XjeCXO}|Hs-l=y-B;Qg1I^7w&sLe{mDQywcQ_@>0#^jPEan0 z*S(>Zi+VThVB;|EYwyWKEqJhLBFf*zcfuSA3dry#RdP9JZwHA|y*K&~RzV zX>pRQhr6U2#qYb5`)=s6Ji3+ckyF2$$}o#!mO2l&%Te(_BY?b*ru9@$i6HZVA~JeN zxKU$#P{Yd%p|AC#VzsPvC$e%-A`5jKIqqb!5LKIB``U<#>Fm&H95T#x*^3SLj@98u z?6Mv9bubq?I!QxLa@q>Dsif<=GwZS{Zdd7qyuuQGpk>9n})#qvD6}e8X~SN z{5mLlR8tL(+vJRM;o~LD19ImDb)$9l#Q6}8Rf5?y9#CGg!PakiI_}f#gngIT`d~lC zD14w0)=nIO`?j0v+VIT?(=$*W;MAftIfAY)e-}xM>uLq8YvVJAC*UIw40O?virp^v z>7*BFw^z9-3P|;7z3nuqX1!Vw75uW_*#QfADFRXn7#g}RFPv{Psg_uCb|vKYwuW7f z&;tREfcgYJ(_r{4Y{jPJnvfIxyQ=o0^vVnR0h8@765|`_w@+=YBsqu1nv-P&bwZL{ zp_zQ1*$MPI;ph!m1zvp+H&EH(TCbdyObmmZm()^kGpD1a0v5YExZm2coAsCPRbUQ9 zdGLoJ>vbMP(r_4xDO#%3t(&wBCqX=3mF>xujgP;5V3}*3dZM&TSF+DO)Lt}JuKa90ckfKI147;S|2}>n(zG&`bt{E=&>#6VYE|p4%Xd6 zCX&fU>i^cGE>491ZrO?hwllHdm7}~kP?*>$$73W2Ta04459fJboo~-iS;BRP6qwDQ zEOi}yRIMz~+;3?+2eRi{+{8^j<+-Q4{)pld8tb7VVF-Xr|u=?5ZmMsZ zAjzH@bc`9kvopR^q32Uv_vD`E#;m`A;7w9{0TI}EjF?`4!2hpV@a!{D*ZlN_!f7-P zAF#cz$JY1SspCoYIUTaWB6Z>nwXW%6$oSjH)idgrgHohi<&yXD215ouAaJ(&qy%VN zZ+NNIb++xn268TY@=~vnr}^{!Ho{dlfwOTUifYzFR@IztKjI~*Gf=isL6h=wQQBp2 z80lP6N4Y+ju^OoGgyKo&dle}c7Nb*; z*Ie#SA_0Nt$W>p2^J|$R{@8yEYJxEs)|d5X9Ef|)XEuv3%ddDXn@xAIzvuC;5ak~yrY!k1*u-1!Kcf31#I$&TYg|qmh-;FBiGO}_gM}kJY?IWO{P8FvRoCnQ#OC( zu&pfOvnGKqor6j#9As%+3iWWAZ_Gy`OmL%%?v=@Vnp|VXvZQN?WMd~p(|xs4?qzvx z=h)|@;YmJx?rD#>aST46HzBK4pFt73K#xuRs8odwp&)UuJIRr|<)#_oynS=EB|1H8 zW#&neF^k?@*?84vwppN*Ob(xEV5=+lu(!5d^%1qNn^RkpXGY% zt+Kvl-0H_sIb?v@WEeEPmp@uWy?wOVc0REODFal9xu_<Qmct$3AFC!quQCkl}8T z9?CoCB2!BZYFbu2QRcV^CdtDQV~3C6*oEs#FUhaY9gaS!^w`s1}{1?uX^kU1j)!kSCqxr$}urS?hmFb z=k~r6lXn`P5bblf`%1V`>Xbr&topEut<+wJqy{e&yUaYpr%u#b_crHgZe%kylpp6- zs$8yuIs=YyBVXl^d?hj^o%rpw!w8j1d1r$3)+yUgIJ+JfR%Z7TN0p^}Pu*z4 zImP)h?AVuNBf7ikl}X1Xb!r5QQ+AO()aub30HNSJ6+KXeoQ)S9fR#{K&@pE^NE$zF z0t&hiUw`j5EI#S%>~iF^7jjW+q|CiDQb%K~*%q(jdQrVxF3{5r_EY@isH}Kz zp~4xdVsldl(<9hPVe&!LIRYqP`~0!at69j=4;p8%I{*L-#6H)@Z7<#u+%%JUqJfoD z6OeyaI>T62Z6jp_?Lk7jKU0Q?6Yw7%}wiLakKWYpFgL7~{E^(EwTkC_$38oum(nISx zZ$L7xab-TKX?*pgj|1{W`DeCTzeimu*OlHg3%oR$T224Z@O6`+6}4{@T8d#S0@e)>c*$Y4PAuizTzQC zo*CmBwS(}u@I_=_aFP!Qbyb9KA_SVhui|AwmL%CgAfkVLQ(XCp1^l(4@ksU4@y^&X zMz}zy7j$WZ*nL`g<}G``6%g!=T6VSbpv|WHH`00qw*xad{Lgpr&qrpe&aBfSdO?;^ zw;1~ESrX3#O3HEcrcDVzJ3m>S8N_A%sROy4UhPy2vJzRDIL_u@HFEf#WDHqDKMXQX z;6PyVwT6oIBCNSzUqlmc72cH?sqcJ=z^!~MwL#?Q_vLc1tYG%8obxy8v zz0}a}ic7ql>3S5ms{TK$QnNheIUr%2S5Au#P7}$c_$Sal?~+S~OTVER|InZzxnv|k z&v`D0o~K+nN(9NQw3|94b>TC%zvQ6?$ji8_7l@69pT{KfJL-Z$39wh=ZDnG~Ys|c2 zl%I1DdVwAeH|Gb-SQg=z!U1OPcF%on^-8JT=(AhLB`yJ29#2;*GE(NPL;bF>+oZZj z1mzf-XP;Poo7xyLz+d99l$zmyRSFY`XNK|mGIJ+%d^VikM9mMfP2ymGQmHp%MssH8>{u9otQ3kLs7jo*vfByVmH(mHh1VmPGQKSby z^7o7VwBrAR#rz+wR+hW4$hAa~2_5$P2kl%D!J+QM&k}lzbnqE0X3jeoU+;9Y17Mo} zrCPjbbti+Q4tbjD8i82~+kvtSDQ&RGJdwe+exfNTTf=}Hl*C6lpq>L4l~M%hP4$CS zaz7*?iIRCn<8N)Rm^s@zz72@I{2UZ;2@{^?aNPK~^f2B%$bG-~`iGV10hx94^1O@f zP=q~%U8MHS$`d7p@cBw+)v7IWCf)2CLFvbT8uY(B@~?k>(ZF{ixyotfWkE)>XxWDj zBuyh&))ZU1^PQ;vLHyIE48}*zc8T+9z}C&8;Qk7SCaa`$F{^UZSRl7$tRbT~xRjkN zF^v6r(QX*wh_8@N3khfP)oJ z*qw@So?!&bekU^1al$2=$W*8Euk6t+II{VFQQ6oXPA|4%_KV;=c4LM!cNI&}G?a`i z3>M!9r}}PEA9;M%$)jz*dv1Z5q`qDjp=Ql2-gNylm-S|RE6W`GnH9o&HCjmz?7*Wn z{7Tw_Gf^1MPz0w`^2hLZ+*+Qg4UyqZyL&}mN;hZXLeo%1_{jNx@QDh%A?`?2s9eMc zmbp%Eut*yz2C!#|&E@*R2P_mGtO)(~0H_8DOTGtVI8{v1kJPX=b(_JPRii)|tn zksQ;#CqFbRZ7+5(t8J}2OmwM6_l{ow!?0QtgW0qR8_hK^`k(rE%|3CkAcR)GK&n_F zMz~xInvtP^oD{|#bW)XG4#LGOoe|IWgGu+? zj}y3GD~%n%4}}Yj%WnyLDS;V`6)45|hU(meKK=5Qe|AWW9IS=MVr&k+ssczLm+PYq z55DSmTYHo2Z+q=o;m@(>{;TsPwZLZw@>U@;m@(>{;TsPwZLZw@>U@ z;pc>pKzT$%xxPrNpvudVSlE?Wnu8}ZHMp4pFU~~&c+<2C(2o_92~Li_!FL@ zHWObWn5}jVU2oZkX#bI8r@;yWEvKTmy|Z?H-SihSfT@TRJ}i^n`%u5U?wJTcKQao( z{^6M~r9eI-*{hC&Q;eiK@#^aMD`vkeF!l32T#o>d;Uz)*)qSY*A2v=_1HjI-mGFNY zKk+l6XwOD9Od!3~$&D^2TIb@US3&S22O^ z9U?q(?DU2I{^JNC;mt?$@O}OlT>pjj!lP}gD`)<8=g+o&H}NmK9w9s|P!o}X(HW-z QUw}aIx|(e6wL5?QAIw`rJOBUy literal 0 HcmV?d00001 diff --git a/content/1_Intro/Ex_Prob.mdx b/content/1_Intro/Ex_Prob.mdx index f6c939d..56f4885 100644 --- a/content/1_Intro/Ex_Prob.mdx +++ b/content/1_Intro/Ex_Prob.mdx @@ -24,7 +24,9 @@ export const metadata = { } }; -[Technical Specifications for USACO Contests](http://www.usaco.org/index.php?page=instructions) + + Make sure to read this. + ## Example: Fence Painting @@ -32,9 +34,11 @@ export const metadata = { Importantly, USACO will automatically add a newline to the end of your file if it does not end with one. **Make sure not to output trailing spaces!** +![bad](Error.png) + ### C++ -[Here](https://www.geeksforgeeks.org/bitsstdc-h-c/) is some info about `` if you are not familiar with it. +[Here](https://www.geeksforgeeks.org/bitsstdc-h-c/) is some info about `` if you are not familiar with it. #### Method 1 @@ -110,7 +114,7 @@ public class paintSol { // must be declared in paintSol.java Alternatively, we can use the InputReader given in the previous module. - + ```java import java.util.*; diff --git a/content/1_Intro/Intro.mdx b/content/1_Intro/Intro.mdx index 44cb6e6..62d052a 100644 --- a/content/1_Intro/Intro.mdx +++ b/content/1_Intro/Intro.mdx @@ -20,23 +20,21 @@ For those of you with experience in software development, note that competitive - [William Lin - What is Competitive Programming?](https://www.youtube.com/watch?time_continue=1&v=ueNT-w7Oluw) - [Kamil Debowski - Interview with a Competitive Programmer](https://www.youtube.com/watch?v=F4rykKLcduI) - [Task](https://open.kattis.com/contests/mcpc19open/problems/basketballoneonone) that was mentioned in video. - - Reading - - [PAPC Ch 1](http://www.csc.kth.se/~jsannemo/slask/main.pdf) - + + + algorithms & programming contests + examples of algorithms + + + ## USACO Contest Format The [USA Computing Olympiad](http://www.usaco.org/index.php?page=contests) is a national programming competition that occurs four times a year, with December, January, February, and US Open (March) contests. The regular contests are four hours long, and the US Open is five hours long. Each contest contains three problems. Solutions are evaluated and scored against a set of predetermined test cases that are not visible to the student. Scoring is out of 1000 points, with each problem being weighted equally (\~333 points). There are four divisions of contests: Bronze, Silver, Gold, and Platinum. After each contest, students who meet the contest-dependent cutoff for promotion will compete in the next division for future contests. ## About This Guide -### Languages - -- For Bronze and Silver, we will provide code snippets in C++, Java, and Python. -- For Gold, we will provide code snippets in C++ and Java and (sometimes) Python. -- For Platinum, code snippets may only be provided in one language (typically either C++ or Java). - ### Guidelines - For Bronze, Silver, and Gold contestants, we aim to be a "**one stop shop**," meaning that this is the only site you have to use to be exposed to most (if not all) of the topics required for Bronze - Gold. @@ -62,21 +60,29 @@ Hopefully these are helpful. #### Lesson - - Consists of text, videos, and simple problems. - - Goal is to introduce you to the concept. - - Everything should be completed in order. - - Any problems here will generally be pure implementation. + - Goal is to introduce you to the concept. + - Everything is meant to be completed in order. + - Usually begins with at least one standard problem. + - External resources (text, possibly videos) will generally be placed in tables like the one above. Generally, we'll star those that are most useful for a beginner. -It's okay to skip over these. Some material might not be useful for competitive programming. +It's okay to skip over these. Some material in these boxes might not be useful for competitive programming. +#### Example Code + +With examples of usage if not already provided in one of the resources above. + + - For Bronze and Silver, we will provide code snippets in C++, Java, and Python. + - For Gold, we will provide code snippets in C++ and Java and (sometimes) Python. + - For Platinum, code snippets may only be provided in one language (typically either C++ or Java). + #### Practice - - Link the relevant past USACO problems (and other recommended problems). - - Problems should be sorted in order of how they are recommended be completed. - - Add comments regarding solution sketches. - - Possibly include additional problems. - - Difficulty is relative to division. (?) \ No newline at end of file + - Link the relevant past USACO problems (and other recommended problems). + - Problems should be sorted in order of how they are recommended be completed. + - Add comments regarding solution sketches. + - Possibly include additional problems. + - Difficulty is **not** comparable across different modules. \ No newline at end of file diff --git a/content/4_Silver/BFS.mdx b/content/4_Silver/BFS.mdx index ef90589..e0a5ff9 100644 --- a/content/4_Silver/BFS.mdx +++ b/content/4_Silver/BFS.mdx @@ -36,9 +36,9 @@ No silver problem should require BFS rather than DFS, but it's still good to kno ## Resources - - - + interactive + + diff --git a/content/4_Silver/Binary_Search.mdx b/content/4_Silver/Binary_Search.mdx index 0008a31..5df55cc 100644 --- a/content/4_Silver/Binary_Search.mdx +++ b/content/4_Silver/Binary_Search.mdx @@ -57,13 +57,15 @@ The binary search function for this is very similar. Find the maximum value of $ ## Example: [CF 577 Div. 2 C](https://codeforces.com/contest/1201/problem/C) -Given an array `arr` of $n$ integers, where $n$ is odd, we can perform the following operation on it $k$ times: take any element of the array and increase it by $1$. We want to make the median of the array as large as possible, after $k$ operations. +Given an array $\texttt{arr}$ of $n$ integers, where $n$ is odd, we can perform the following operation on it $k$ times: take any element of the array and increase it by $1$. We want to make the median of the array as large as possible after $k$ operations. -Constraints: $1 \leq n \leq 2 \cdot 10^5, 1 \leq k \leq 10^9$ and $n$ is odd. +**Constraints:** $1 \leq n \leq 2 \cdot 10^5, 1 \leq k \leq 10^9$ and $n$ is odd. The solution is as follows: we first sort the array in ascending order. Then, we binary search for the maximum possible median. We know that the number of operations required to raise the median to $x$ increases monotonically as $x$ increases, so we can use binary search. For a given median value $x$, the number of operations required to raise the median to $x$ is -$$\sum_{i=(n+1)/2}^{n} \max(0, x - \text{arr[i]})$$ +$$ +\sum_{i=(n+1)/2}^{n} \max(0, x - \texttt{arr}[i]) +$$ If this value is less than or equal to $k$, then $x$ can be the median, so our check function returns true. Otherwise, $x$ cannot be the median, so our check function returns false. diff --git a/content/4_Silver/DFS.mdx b/content/4_Silver/DFS.mdx index 1c4f3d8..152141a 100644 --- a/content/4_Silver/DFS.mdx +++ b/content/4_Silver/DFS.mdx @@ -56,12 +56,12 @@ export const metadata = { - - - + interactive + + with an example problem + fast-paced hard to parse for a beginner - ### Problems @@ -76,7 +76,7 @@ export const metadata = { ## Graph Two-Coloring -*Graph two-coloring* refers to assigning a boolean value to each node of the graph, dictated by the edge configuration +*Graph two-coloring* refers to assigning a boolean value to each node of the graph, dictated by the edge configuration. The most common example of a two-colored graph is a *bipartite graph*, in which each edge connects two nodes of opposite colors. @@ -84,8 +84,8 @@ The most common example of a two-colored graph is a *bipartite graph*, in which ### Tutorial - - + + Uses BFS, but DFS accomplishes the same task. diff --git a/content/4_Silver/Flood_Fill.mdx b/content/4_Silver/Flood_Fill.mdx index 9a7f7f6..a0dfa7b 100644 --- a/content/4_Silver/Flood_Fill.mdx +++ b/content/4_Silver/Flood_Fill.mdx @@ -4,7 +4,7 @@ title: Flood Fill author: Siyong Huang prerequisites: - Silver - Depth First Search -description: "[Flood Fill](https://en.wikipedia.org/wiki/Flood_fill) refers to finding connected components in a graph that is respresented by a grid." +description: "Flood Fill refers to finding connected components in a graph that is respresented by a grid." frequency: 3 --- @@ -33,9 +33,7 @@ export const metadata = { -## [Flood Fill](https://en.wikipedia.org/wiki/Flood_fill) - -### Tutorial +## Lesson diff --git a/content/4_Silver/Func_Graphs.mdx b/content/4_Silver/Func_Graphs.mdx index 5ca649f..237d0e6 100644 --- a/content/4_Silver/Func_Graphs.mdx +++ b/content/4_Silver/Func_Graphs.mdx @@ -4,7 +4,7 @@ title: Functional Graphs author: Siyong Huang prerequisites: - Silver - Depth First Search -description: A functional graph is a digraph in which every vertex has exactly one outgoing edge. +description: A functional graph is a digraph (directed graph) in which every vertex has exactly one outgoing edge. frequency: 1 --- @@ -27,17 +27,22 @@ export const metadata = { } }; -Consider graphs like the one presented in this problem: +We'll consider graphs like the one presented in this problem: -### Tutorial +## Lesson Aka **successor graph**. + +(floyd's algo?) + +## Implementation + The following sample code counts the number of cycles in such a graph. The "stack" contains nodes that can reach the current node. If the current node points to a node `v` on the stack (`on_stack[v]` is true), then we know that a cycle has been created. However, if the current node points to a node `v` that has been previously visited but is not on the stack, then we know that the current chain of nodes points into a cycle that has already been considered. ```cpp @@ -66,7 +71,6 @@ int main() } ``` -(floyd's algo?) ### Problems diff --git a/content/4_Silver/Greedy.mdx b/content/4_Silver/Greedy.mdx index de82b98..dfd265e 100644 --- a/content/4_Silver/Greedy.mdx +++ b/content/4_Silver/Greedy.mdx @@ -21,8 +21,8 @@ export const metadata = { ## Additional Reading - - + +