diff --git a/ipynb/Advent 2017.ipynb b/ipynb/Advent 2017.ipynb index d400560..125b1ff 100644 --- a/ipynb/Advent 2017.ipynb +++ b/ipynb/Advent 2017.ipynb @@ -15,13 +15,11 @@ "* I'll clean up the code a bit: adding docstrings, making variable names longer and more descriptive, adding `assert` statements.\n", "* I will discuss any errors I made along the way; usually I won't show the erroneous code, just a description of what I did wrong.\n", "* The way Advent of Code works is that you read the puzzle descriotion for Part One, but only when you correctly solve it do you get to see Part Two. This is typical in software development: you deploy some code, and then some new requirements arise. So it makes sense to program by creating small functions and data types that form a *vocabulary* for the domain at hand, and can be recombined to solve new problems in the domain.\n", - "* Each day's code should run in a few seconds; certainly less than a minute.\n", + "* Each day's code should run in a few seconds; certainly less than a minute. (As it turns out, the total run time for all my solutions was just under a minute.)\n", "* There is a contest to see who can solve each day's puzzle fastest; I do not expect to be competitive.\n", "\n", "\n", "\n", - "\n", - "\n", "# Day 0: Imports and Utility Functions\n", "\n", "I might need these:" @@ -1013,14 +1011,6 @@ "execution_count": 21, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 5.09 s, sys: 19.4 ms, total: 5.11 s\n", - "Wall time: 5.11 s\n" - ] - }, { "data": { "text/plain": [ @@ -1033,7 +1023,7 @@ } ], "source": [ - "%time run2(program)" + "run2(program)" ] }, { @@ -1221,11 +1211,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "First I'll read the data into two dicts as follows: the input line:\n", + "First I'll read the data into two dicts as follows: the input line\n", "\n", " tcmdaji (40) -> wjbdxln, amtqhf\n", " \n", - "creates:\n", + "creates the two entries:\n", "\n", " weight['tcmdaji'] = 40\n", " above['tcmdaji'] = ['wjbdxln', 'amtqhf']" @@ -1750,14 +1740,6 @@ "execution_count": 46, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 13.7 ms, sys: 346 µs, total: 14 ms\n", - "Wall time: 13.7 ms\n" - ] - }, { "data": { "text/plain": [ @@ -1806,7 +1788,7 @@ "\n", "assert knothash2('') == 'a2582a3a0e66e6e86e3812dcb672a272'\n", "\n", - "%time knothash2(stream2)" + "knothash2(stream2)" ] }, { @@ -2175,14 +2157,6 @@ "execution_count": 60, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 488 ms, sys: 1.32 ms, total: 490 ms\n", - "Wall time: 489 ms\n" - ] - }, { "data": { "text/plain": [ @@ -2200,7 +2174,7 @@ " hash = knothash2(key + '-' + str(i))\n", " return format(int(hash, base=16), '0128b')\n", "\n", - "%time sum(bits(key, i).count('1') for i in range(128))" + "sum(bits(key, i).count('1') for i in range(128))" ] }, { @@ -2279,14 +2253,6 @@ "execution_count": 64, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 509 ms, sys: 1.64 ms, total: 511 ms\n", - "Wall time: 510 ms\n" - ] - }, { "data": { "text/plain": [ @@ -2299,7 +2265,7 @@ } ], "source": [ - "%time flood_all(Grid(key))" + "flood_all(Grid(key))" ] }, { @@ -2320,8 +2286,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 15.3 s, sys: 66.6 ms, total: 15.4 s\n", - "Wall time: 15.5 s\n" + "CPU times: user 15 s, sys: 30.7 ms, total: 15 s\n", + "Wall time: 15.1 s\n" ] }, { @@ -2375,8 +2341,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 9.87 s, sys: 26.7 ms, total: 9.9 s\n", - "Wall time: 9.92 s\n" + "CPU times: user 9.71 s, sys: 7.49 ms, total: 9.72 s\n", + "Wall time: 9.72 s\n" ] }, { @@ -2398,6 +2364,58 @@ "%time judge(criteria(4, A()), criteria(8, B()), 5*10**6)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When I got this solution on Day 15, I was happy to end there. But looking back, after Day 25, I noticed this day's run time was the slowest of all, so I wondered if I could speed things up, using `@jit`. Unfortunately, `@jit` doesn't work with generators, so I'll have to rewrite the code:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 645 ms, sys: 2.26 ms, total: 648 ms\n", + "Wall time: 646 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "597" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@jit\n", + "def duelgen(prev1=516, factor1=16807, prev2=190, factor2=48271, \n", + " m=2147483647, mask=2**16-1, N=40*10**6):\n", + " matches = 0\n", + " for _ in range(N):\n", + " prev1 = (prev1 * factor1) % m\n", + " prev2 = (prev2 * factor2) % m\n", + " matches += (prev1 & mask == prev2 & mask)\n", + " return matches\n", + "\n", + "%time duelgen()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That was an excellent speedup (and the same answer); I'll leave optimizing Part Two as an exercise for the reader." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -2409,7 +2427,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 68, "metadata": {}, "outputs": [ { @@ -2427,7 +2445,7 @@ " 's15')" ] }, - "execution_count": 67, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" } @@ -2439,7 +2457,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 69, "metadata": {}, "outputs": [ { @@ -2448,7 +2466,7 @@ "10000" ] }, - "execution_count": 68, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -2466,7 +2484,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 70, "metadata": {}, "outputs": [ { @@ -2475,7 +2493,7 @@ "'lbdiomkhgcjanefp'" ] }, - "execution_count": 69, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -2511,7 +2529,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 71, "metadata": {}, "outputs": [ { @@ -2542,7 +2560,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 72, "metadata": {}, "outputs": [ { @@ -2551,7 +2569,7 @@ "48" ] }, - "execution_count": 71, + "execution_count": 72, "metadata": {}, "output_type": "execute_result" } @@ -2569,7 +2587,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 73, "metadata": {}, "outputs": [ { @@ -2578,7 +2596,7 @@ "'ejkflpgnamhdcboi'" ] }, - "execution_count": 72, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -2605,7 +2623,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 74, "metadata": {}, "outputs": [ { @@ -2614,7 +2632,7 @@ "355" ] }, - "execution_count": 73, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -2649,7 +2667,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 75, "metadata": { "collapsed": true }, @@ -2691,7 +2709,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 76, "metadata": { "collapsed": true }, @@ -2714,7 +2732,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 77, "metadata": {}, "outputs": [ { @@ -2723,7 +2741,7 @@ "355" ] }, - "execution_count": 76, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } @@ -2741,24 +2759,24 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.42 s, sys: 6.51 ms, total: 1.42 s\n", - "Wall time: 1.42 s\n" + "CPU times: user 1.33 s, sys: 4.04 ms, total: 1.33 s\n", + "Wall time: 1.33 s\n" ] }, { "data": { "text/plain": [ - "<__main__.Node at 0x11859e0b8>" + "<__main__.Node at 0x10daae390>" ] }, - "execution_count": 77, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" } @@ -2781,15 +2799,15 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 5.51 s, sys: 6.74 ms, total: 5.52 s\n", - "Wall time: 5.52 s\n" + "CPU times: user 5.53 s, sys: 4.42 ms, total: 5.53 s\n", + "Wall time: 5.53 s\n" ] }, { @@ -2798,7 +2816,7 @@ "6154117" ] }, - "execution_count": 78, + "execution_count": 79, "metadata": {}, "output_type": "execute_result" } @@ -2835,7 +2853,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 80, "metadata": {}, "outputs": [ { @@ -2853,7 +2871,7 @@ " ('set', 'p', 826))" ] }, - "execution_count": 79, + "execution_count": 80, "metadata": {}, "output_type": "execute_result" } @@ -2872,7 +2890,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 81, "metadata": {}, "outputs": [ { @@ -2881,7 +2899,7 @@ "7071" ] }, - "execution_count": 80, + "execution_count": 81, "metadata": {}, "output_type": "execute_result" } @@ -2933,7 +2951,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 82, "metadata": { "collapsed": true }, @@ -2963,7 +2981,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 83, "metadata": {}, "outputs": [ { @@ -2972,7 +2990,7 @@ "8001" ] }, - "execution_count": 82, + "execution_count": 83, "metadata": {}, "output_type": "execute_result" } @@ -3020,7 +3038,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 84, "metadata": { "collapsed": true }, @@ -3049,7 +3067,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 85, "metadata": {}, "outputs": [ { @@ -3058,7 +3076,7 @@ "'VEBTPXCHLI'" ] }, - "execution_count": 84, + "execution_count": 85, "metadata": {}, "output_type": "execute_result" } @@ -3080,7 +3098,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 86, "metadata": {}, "outputs": [ { @@ -3089,7 +3107,7 @@ "18702" ] }, - "execution_count": 85, + "execution_count": 86, "metadata": {}, "output_type": "execute_result" } @@ -3109,7 +3127,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 87, "metadata": {}, "outputs": [ { @@ -3122,7 +3140,7 @@ " Struct(a=(7, -12, -1), id=4, p=(-1425, 4298, 617), v=(32, -166, -32))]" ] }, - "execution_count": 86, + "execution_count": 87, "metadata": {}, "output_type": "execute_result" } @@ -3147,7 +3165,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 88, "metadata": {}, "outputs": [ { @@ -3156,7 +3174,7 @@ "243" ] }, - "execution_count": 87, + "execution_count": 88, "metadata": {}, "output_type": "execute_result" } @@ -3188,7 +3206,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 89, "metadata": {}, "outputs": [ { @@ -3197,7 +3215,7 @@ "648" ] }, - "execution_count": 88, + "execution_count": 89, "metadata": {}, "output_type": "execute_result" } @@ -3235,7 +3253,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 90, "metadata": { "collapsed": true }, @@ -3275,7 +3293,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 91, "metadata": {}, "outputs": [ { @@ -3299,7 +3317,7 @@ " ((1, 1), (1, 1)): ((0, 1, 1), (1, 0, 0), (1, 1, 0))}" ] }, - "execution_count": 90, + "execution_count": 91, "metadata": {}, "output_type": "execute_result" } @@ -3321,7 +3339,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 92, "metadata": { "collapsed": true }, @@ -3339,7 +3357,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 93, "metadata": { "collapsed": true }, @@ -3359,18 +3377,18 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 94, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def enhance(grid): \n", - " \"Expand small pieces into bigger ones and stitch them together.\"\n", + " \"Divide the drid into pieces, enhance each piece, and stitch them together.\"\n", " return stitch_grid(map2d(enhancements.get, divide_grid(grid)))\n", "\n", "def divide_grid(grid):\n", - " \"Slice the grid into d x d pieces and enhance each piece.\"\n", + " \"Divide the grid into d x d pieces and enhance each piece.\"\n", " N = len(grid[0])\n", " d = (2 if N % 2 == 0 else 3 if N % 3 == 0 else error())\n", " return [[tuple(row[c:c+d] for row in grid[r:r+d])\n", @@ -3394,7 +3412,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 95, "metadata": { "collapsed": true }, @@ -3415,7 +3433,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 96, "metadata": {}, "outputs": [ { @@ -3424,7 +3442,7 @@ "((0, 1, 0), (0, 0, 1), (1, 1, 1))" ] }, - "execution_count": 95, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } @@ -3437,7 +3455,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 97, "metadata": {}, "outputs": [ { @@ -3446,33 +3464,13 @@ "[[((0, 1, 0), (0, 0, 1), (1, 1, 1))]]" ] }, - "execution_count": 96, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "divide_grid(_)" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "((((1, 0, 1, 0), (0, 0, 1, 0), (0, 1, 0, 1), (0, 1, 0, 0)),),)" - ] - }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "map2d(enhancements.get, _)" + "divide_grid(_)" ] }, { @@ -3483,7 +3481,7 @@ { "data": { "text/plain": [ - "((1, 0, 1, 0), (0, 0, 1, 0), (0, 1, 0, 1), (0, 1, 0, 0))" + "((((1, 0, 1, 0), (0, 0, 1, 0), (0, 1, 0, 1), (0, 1, 0, 0)),),)" ] }, "execution_count": 98, @@ -3491,55 +3489,75 @@ "output_type": "execute_result" } ], - "source": [ - "stitch_grid(_)" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[((1, 0), (0, 0)), ((1, 0), (1, 0))], [((0, 1), (0, 1)), ((0, 1), (0, 0))]]" - ] - }, - "execution_count": 99, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "divide_grid(_)" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "((((0, 0, 0), (1, 0, 0), (1, 0, 0)), ((1, 0, 1), (0, 1, 0), (0, 1, 0))),\n", - " (((1, 0, 1), (0, 1, 0), (0, 1, 0)), ((0, 0, 0), (1, 0, 0), (1, 0, 0))))" - ] - }, - "execution_count": 100, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ "map2d(enhancements.get, _)" ] }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((1, 0, 1, 0), (0, 0, 1, 0), (0, 1, 0, 1), (0, 1, 0, 0))" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stitch_grid(_)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[((1, 0), (0, 0)), ((1, 0), (1, 0))], [((0, 1), (0, 1)), ((0, 1), (0, 0))]]" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "divide_grid(_)" + ] + }, { "cell_type": "code", "execution_count": 101, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((((0, 0, 0), (1, 0, 0), (1, 0, 0)), ((1, 0, 1), (0, 1, 0), (0, 1, 0))),\n", + " (((1, 0, 1), (0, 1, 0), (0, 1, 0)), ((0, 0, 0), (1, 0, 0), (1, 0, 0))))" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "map2d(enhancements.get, _)" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, "outputs": [ { "data": { @@ -3552,7 +3570,7 @@ " (0, 1, 0, 1, 0, 0))" ] }, - "execution_count": 101, + "execution_count": 102, "metadata": {}, "output_type": "execute_result" } @@ -3563,7 +3581,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 103, "metadata": {}, "outputs": [ { @@ -3572,7 +3590,7 @@ "12" ] }, - "execution_count": 102, + "execution_count": 103, "metadata": {}, "output_type": "execute_result" } @@ -3590,7 +3608,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 104, "metadata": {}, "outputs": [ { @@ -3599,7 +3617,7 @@ "147" ] }, - "execution_count": 103, + "execution_count": 104, "metadata": {}, "output_type": "execute_result" } @@ -3623,15 +3641,15 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 105, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 5.35 s, sys: 108 ms, total: 5.45 s\n", - "Wall time: 5.47 s\n" + "CPU times: user 5.2 s, sys: 80.6 ms, total: 5.28 s\n", + "Wall time: 5.28 s\n" ] }, { @@ -3640,7 +3658,7 @@ "1936582" ] }, - "execution_count": 104, + "execution_count": 105, "metadata": {}, "output_type": "execute_result" } @@ -3660,7 +3678,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 106, "metadata": { "collapsed": true }, @@ -3671,8 +3689,8 @@ "def parse_net(lines):\n", " \"Read the initial state of the network.\"\n", " lines = list(lines)\n", - " current = (len(lines) // 2, len(lines[0].strip()) // 2)\n", - " return Net(current, UP, 0,\n", + " center = (len(lines) // 2, len(lines[0].strip()) // 2)\n", + " return Net(center, UP, 0,\n", " {(x, y) \n", " for (y, row) in enumerate(lines) \n", " for (x, node) in enumerate(row)\n", @@ -3681,7 +3699,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 107, "metadata": {}, "outputs": [ { @@ -3690,7 +3708,7 @@ "Net(current=(1, 1), heading=(0, -1), caused=0, infected={(0, 1), (2, 0)})" ] }, - "execution_count": 106, + "execution_count": 107, "metadata": {}, "output_type": "execute_result" } @@ -3714,7 +3732,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 108, "metadata": { "collapsed": true }, @@ -3734,7 +3752,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 109, "metadata": {}, "outputs": [ { @@ -3743,7 +3761,7 @@ "Net(current=(1, 0), heading=(1, 0), caused=5, infected={(0, 1), (-1, 1), (-1, 0), (2, 0), (1, 1)})" ] }, - "execution_count": 108, + "execution_count": 109, "metadata": {}, "output_type": "execute_result" } @@ -3755,7 +3773,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 110, "metadata": {}, "outputs": [ { @@ -3764,7 +3782,7 @@ "Net(current=(2, 0), heading=(0, -1), caused=41, infected={(5, -1), (3, 2), (-1, 0), (3, -3), (1, 0), (1, -2), (4, -2), (-1, 1), (2, -3), (5, 0), (2, 2), (0, -1), (4, 1), (1, 1)})" ] }, - "execution_count": 109, + "execution_count": 110, "metadata": {}, "output_type": "execute_result" } @@ -3778,13 +3796,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This testing revealed a problem: I had (yet again) messed up the order of (x, y). (I think it is confusing that we have two traditional orders: (x, y) and (row, col), and they are not the same.) After fixing that, I was\n", + "This testing revealed a problem: I had (yet again) messed up the order of (x, y). (I find it confusing that there are two traditional orders: (x, y) and (row, col), and this is yet another reminder that I have to pay extra attention to keep them straight.) After fixing that, I was\n", "ready to solve the problem:" ] }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 111, "metadata": {}, "outputs": [ { @@ -3793,7 +3811,7 @@ "5460" ] }, - "execution_count": 110, + "execution_count": 111, "metadata": {}, "output_type": "execute_result" } @@ -3808,116 +3826,103 @@ "source": [ "**Part Two**\n", "\n", - "It looks like I can't re-use any of my code from Part One (except by copy-and-paste), because I want to replace my `set` of `infected` nodes with a `dict` of node `status`, which can be `I`, `F`, `C`, or `W`:" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "Net2 = namedtuple('Net2', 'current, heading, caused, status')\n", - "\n", - "def parse_net2(lines):\n", - " \"Read the initial state of the network.\"\n", - " lines = list(lines)\n", - " current = (len(lines) // 2, len(lines[0].strip()) // 2)\n", - " return Net2(current, UP, 0,\n", - " {(x, y): 'I'\n", - " for (y, row) in enumerate(lines) \n", - " for (x, node) in enumerate(row)\n", - " if node == '#'})\n", - "\n", - "def burst2(net):\n", - " \"Simulate the evolved virus through one step and return the new state of the network.\"\n", - " (current, heading, caused, status) = net\n", - " cur = status.get(current, 'C')\n", - " if cur == 'C':\n", - " heading = turn_left(heading)\n", - " status[current] = 'W'\n", - " elif cur == 'W':\n", - " # heading unchanged\n", - " status[current] = 'I'\n", - " caused += 1\n", - " elif cur == 'I':\n", - " heading = turn_right(heading)\n", - " status[current] = 'F'\n", - " elif cur == 'F':\n", - " heading = turn_around(heading)\n", - " status[current] = 'C'\n", - " return Net2(add(current, heading), heading, caused, status)" + "It looks like I can't re-use any of my code from Part One (except by copy-and-paste). I have the following concerns:\n", + "- I want to replace the `set` of `infected` nodes with a `dict`, `status[node]`, which can be `I`, `F`, `C`, or `W` (default `C` for clean).\n", + "- I need to run 10,000,000 steps, so I want it to be efficient.\n", + "- I have some confidence from doing Part One successfully, so I'm comfortable stressing efficiency over simplicity.\n", + "I'll use variables inside a function, `bursts`, that does `N` repetitions; I'll avoid creating a new `Net` object each iteration." ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "26" - ] - }, - "execution_count": 112, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "# Of the first 100 bursts, 26 will result in infection\n", - "repeat(100, burst2, parse_net2(test)).caused" + "def bursts(N, net):\n", + " \"Run N steps of bursts on the network depicted by `lines`.\"\n", + " (current, heading, caused, infected) = net\n", + " status = defaultdict(lambda: 'C', {pos: 'I' for pos in infected})\n", + " for _ in range(N):\n", + " S = status[current]\n", + " if S == 'C':\n", + " heading = turn_left(heading)\n", + " status[current] = 'W'\n", + " elif S == 'W':\n", + " # heading unchanged\n", + " status[current] = 'I'\n", + " caused += 1\n", + " elif S == 'I':\n", + " heading = turn_right(heading)\n", + " status[current] = 'F'\n", + " elif S == 'F':\n", + " heading = turn_around(heading)\n", + " status[current] = 'C' \n", + " current = add(current, heading)\n", + " return caused" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 21.2 s, sys: 62 ms, total: 21.2 s\n", - "Wall time: 21.3 s\n" - ] - }, - { - "data": { - "text/plain": [ - "2511702" - ] - }, - "execution_count": 113, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "# Ready to answer Part Two\n", - "# (A little nervous about 10,000,000 repetitions, but I think it will be under a minute.)\n", - "%time repeat(10000000, burst2, parse_net2(Input(22))).caused" + "# Of the first 100 bursts of the test network, 26 will result in infection\n", + "assert bursts(100, parse_net(test)) == 26" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "I had another bug here that gave me the wrong answer the first time: I had put the \"`caused += 1`\" line under the condition where the status *was* `'I'`, whereas it actually belongs under the condition where the status *becomes* `'I'`.\n", - "\n", - "# [Day 23](https://adventofcode.com/2017/day/23): Coprocessor Conflagration\n", - "\n", - "Part One looks straightforward. I won't make the \"X might be an integer\" mistake again:\n", - "\n" + "I had another bug here that gave me the wrong answer the first time: I had put the \"`caused += 1`\" line under the condition where the status *was* `'I'`, whereas it actually belongs under the condition where the status *becomes* `'I'`. With that fix, I get the right answer:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 13.5 s, sys: 9.95 ms, total: 13.5 s\n", + "Wall time: 13.5 s\n" + ] + }, + { + "data": { + "text/plain": [ + "2511702" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%time bursts(10000000, parse_net(Input(22)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# [Day 23](https://adventofcode.com/2017/day/23): Coprocessor Conflagration\n", + "\n", + "Part One looks straightforward. I won't make the \"register X might be an integer\" mistake again:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, "outputs": [ { "data": { @@ -3925,7 +3930,7 @@ "9409" ] }, - "execution_count": 114, + "execution_count": 115, "metadata": {}, "output_type": "execute_result" } @@ -3958,15 +3963,15 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 116, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 944 ms, sys: 3.78 ms, total: 948 ms\n", - "Wall time: 947 ms\n" + "CPU times: user 939 ms, sys: 2.89 ms, total: 942 ms\n", + "Wall time: 940 ms\n" ] }, { @@ -3975,7 +3980,7 @@ "913" ] }, - "execution_count": 115, + "execution_count": 116, "metadata": {}, "output_type": "execute_result" } @@ -4017,17 +4022,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `numba.jit` decorator really helps here, speeding up execution from 13 seconds to 1 second. It also helped on Day 15, but not as dramatically, and was not able to help on Day 15 or Day 22.\n", - "\n", + "The `numba.jit` decorator really helps here, speeding up execution from 13 seconds to 1 second.\n", "\n", "# [Day 24](https://adventofcode.com/2017/day/24): Electromagnetic Moat\n", "\n", - "First I will read the data and store it as a table of `{port_number: [all_components_with_that_number_on_either_side]}`. I also define two simple utility functions:" + "First I will read the data and store it as a table of `{port_number: [components_with_that_port]}`. I also define two simple utility functions:" ] }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 117, "metadata": {}, "outputs": [], "source": [ @@ -4057,7 +4061,7 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 118, "metadata": {}, "outputs": [], "source": [ @@ -4079,15 +4083,15 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 119, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2.33 s, sys: 6.18 ms, total: 2.34 s\n", - "Wall time: 2.34 s\n" + "CPU times: user 2.32 s, sys: 2.56 ms, total: 2.32 s\n", + "Wall time: 2.32 s\n" ] }, { @@ -4096,7 +4100,7 @@ "1695" ] }, - "execution_count": 118, + "execution_count": 119, "metadata": {}, "output_type": "execute_result" } @@ -4118,15 +4122,15 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 120, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2.4 s, sys: 3.9 ms, total: 2.4 s\n", - "Wall time: 2.4 s\n" + "CPU times: user 2.39 s, sys: 1.44 ms, total: 2.39 s\n", + "Wall time: 2.39 s\n" ] }, { @@ -4135,7 +4139,7 @@ "1673" ] }, - "execution_count": 119, + "execution_count": 120, "metadata": {}, "output_type": "execute_result" } @@ -4161,15 +4165,15 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 121, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 612 ms, sys: 1.7 ms, total: 613 ms\n", - "Wall time: 614 ms\n" + "CPU times: user 638 ms, sys: 3.98 ms, total: 642 ms\n", + "Wall time: 642 ms\n" ] }, { @@ -4178,7 +4182,7 @@ "1695" ] }, - "execution_count": 120, + "execution_count": 121, "metadata": {}, "output_type": "execute_result" } @@ -4226,7 +4230,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 122, "metadata": { "collapsed": true }, @@ -4236,12 +4240,12 @@ " \"machine()[state][value] == (new_value, move, new_state)}\"\n", " L, R = -1, +1\n", " A, B, C, D, E, F = 'ABCDEF'\n", - " return {A: ((1, R, B), (0, L, C)),\n", - " B: ((1, L, A), (1, R, D)),\n", - " C: ((0, L, B), (0, L, E)),\n", - " D: ((1, R, A), (0, R, B)),\n", - " E: ((1, L, F), (1, L, C)),\n", - " F: ((1, R, D), (1, R, A))}" + " return {A: [(1, R, B), (0, L, C)],\n", + " B: [(1, L, A), (1, R, D)],\n", + " C: [(0, L, B), (0, L, E)],\n", + " D: [(1, R, A), (0, R, B)],\n", + " E: [(1, L, F), (1, L, C)],\n", + " F: [(1, R, D), (1, R, A)]}" ] }, { @@ -4253,7 +4257,7 @@ }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 123, "metadata": {}, "outputs": [ { @@ -4262,7 +4266,7 @@ "4769" ] }, - "execution_count": 127, + "execution_count": 123, "metadata": {}, "output_type": "execute_result" } @@ -4284,6 +4288,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "There is no **Part Two** today; we're done!\n", + "\n", "# A Note on Reuse\n", "\n", "One interesting question: for what days did my Part Two code reuse the Part One code? How so?\n", @@ -4312,27 +4318,26 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Verification and Timing\n", + "# Verification and Run Times\n", "\n", "A little test harness and a report on run times:" ] }, { "cell_type": "code", - "execution_count": 129, + "execution_count": 124, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Day 5: 5.1 sec\n", - "Day 15: 26.1 sec\n", - "Day 17: 6.1 sec\n", - "Day 21: 6.0 sec\n", - "Day 22: 24.1 sec\n", - "CPU times: user 1min 21s, sys: 3.5 s, total: 1min 25s\n", - "Wall time: 1min 26s\n" + "Day 15: 10.3 sec\n", + "Day 17: 5.5 sec\n", + "Day 21: 5.3 sec\n", + "Day 22: 13.9 sec\n", + "CPU times: user 56.3 s, sys: 193 ms, total: 56.5 s\n", + "Wall time: 56.6 s\n" ] } ], @@ -4377,7 +4382,7 @@ " safe_delay(scanners) == 3823370,\n", " 14: lambda: sum(bits(key, i).count('1') for i in range(128)) == 8316 and\n", " flood_all(Grid(key)) == 1074,\n", - " 15: lambda: judge(A(), B(), 40*10**6) == 597 and\n", + " 15: lambda: duelgen() == 597 and\n", " judge(criteria(4, A()), criteria(8, B()), 5*10**6) == 303,\n", " 16: lambda: perform(dance) == 'lbdiomkhgcjanefp' and\n", " whole(48, dance) == 'ejkflpgnamhdcboi',\n", @@ -4392,7 +4397,7 @@ " 21: lambda: sum(flatten(repeat(5, enhance, grid))) == 147 and\n", " sum(flatten(repeat(18, enhance, grid))) == 1936582,\n", " 22: lambda: repeat(10000, burst, parse_net(Input(22))).caused == 5460 and\n", - " repeat(10000000, burst2, parse_net2(Input(22))).caused == 2511702,\n", + " bursts(10000000, parse_net(Input(22))) == 2511702,\n", " 23: lambda: run23(Array(Input(23))) == 9409 and\n", " run23_2() == 913,\n", " 24: lambda: strongest_chain() == 1695 and\n", @@ -4407,7 +4412,7 @@ "source": [ "# Development Time\n", "\n", - "Here is a plot of the time taken to program solutions to both parts of each puzzle each day, for me, the first person to finish, and the hundredth person. I'm usually about triple the time of the first solver, and a little slower than the 100th." + "Here is a plot of the time taken to program solutions each day, for me, the first person to finish, and the hundredth person. I'm usually about triple the time of the first solver, and a little slower than the 100th." ] }, { @@ -4417,9 +4422,9 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAENCAYAAAAG6bK5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXdcU1cbx383LFnuioKIgANb7VDc1onVOltRUQGlWtta\nq9atbRER916tVl+rdddWrFatA1FxoDjqHigEBAKoCBgII5Dz/nElrITcJPcmQc7XTz5yxznnuSc3\n5znjOc/DEEIIKBQKhVLlEBlbAAqFQqEYB6oAKBQKpYpCFQCFQqFUUagCoFAolCoKVQAUCoVSRaEK\ngEKhUKoo5kJlXFBQgNmzZyMpKQnm5uYICQmBmZkZ5syZA5FIhKZNmyIoKEio4ikUCoWiAcEUwPnz\n56FQKLB//35cvnwZa9asgVwux7Rp0+Dp6YmgoCCEhYXBy8tLKBEoFAqFUgGCTQE1btwYhYWFIIRA\nKpXC3NwcDx48gKenJwCga9euiIyMFKp4CoVCoWhAsBGAra0tEhMT0bdvX2RkZGDz5s24fv16qetS\nqVSo4ikUCoWiAcEUwI4dO/Dxxx9j6tSpSE1Nhb+/P+RyufJ6dnY2qlevLlTxFAqFQtGAYAqgRo0a\nMDdns7e3t0dBQQHeffddREVFoV27doiIiECHDh3Kpbtx44ZQIlEoFMpbTZs2bbS6nxHKGZxMJsMP\nP/yAFy9eoKCgAGPGjMF7772Hn376CXK5HO7u7li4cCEYhimV7saNG1o/xNuKRCKBo6OjscUwCWhd\nFEProhhaF8Xo0nYKNgKwsbHB2rVry53ftWuXUEVSKBQKRQvoRjAKhUKpolAFQKFQKFUUqgAoFAql\nikIVAIVCoVRRqAKgUCiUKgpVABQKhVJFoQqAQqFQqihUAVAoFEoVhSoAnkhKSoKHhwf8/f3LXZs7\ndy48PDyQkZFhBMkoFApFNVVCAYjF8fDzC0aPHkHw8wuGWBwvSDlWVlYQi8VITk5WnsvJycHNmzfL\nubygUCgUY/PWKwCxOB69e2/Anj0zcO5cMPbsmYHevTcIogREIhH69euHI0eOKM+dOnUKPXv2VB6H\nh4dj+PDhGDJkCEaNGoVbt27xLgeFYiwM1dmi8AQxMa5fv85rfr6+8wmQRQBS4pNFfH3n81pOYmIi\n+eijj8j9+/dJv379lOcDAgLIkydPiIeHB7lz5w4ZMGAAycjIIIQQ8uTJE9K5c2eSk5OjMs+kpCRe\nZazM0LooxlTrIjY2jri7Ty/xe8si7u7TSWxsnGBlmmpdGANd2k7BnMEZgvnzNf9/6ZICgG2ZlLaQ\nSBQa0+vCu+++C5FIhAcPHqB27dqQyWRo0qQJCCGIiIjAixcvEBAQAPLGCau5uTni4+PRvHlz3Qul\nUEyAwMAdiIkJRvHvzRYxMcEIDFyJ3btp/G9T5K1QABUdP30qQlxcNkorgWw4Ooo0pteVQYMG4fDh\nw6hduzYGDRqkPC8SidCpUyesXr1aeS4lJQUODg78FEyhGJGkJPWdLYpp8tavAYSEBMDdPQhA9psz\n2XB3D0JISADvZRX16gcNGoQTJ07g33//xcCBA5XX27Zti0uXLiE2NhYAcP78eQwePBh5eXm8y0Kh\nGBonJxGKf2dFsJ0timlSqUcAXHB1dcHp05MQGLgSEokCjo4ihIRMgqurC+9lFVn6ODg4oEmTJrC3\nt1eGvWQYBk2aNMGCBQswbdo0AICZmRk2bdqEatWq8S4LhWJoQkICcPJkEF6+LJoGKupsTTKyZBR1\nCBYRTFdoRLBiaLSjYmhdFGPKdXH0aDy2bt0BqbSosxUgSGerCFOuC0NjUhHBKBRK1WPAABcMGEAX\nfCsLdHKOQqHwCiFAhw7A69fGloSiCaoAKBQKL2zYAOzcCTAMsGMHYGNjbIkomhBsCujQoUMIDQ0F\nwzDIy8vDo0ePsGfPHixevBgikQhNmzZFUBAdKlIobwtDhrC9fwDw8DCuLBRuCDYC+Pzzz7Fr1y7s\n3LkT7733Hn766Sf8/PPPmDZtGnbv3g2FQoGwsDChiqdQKAbGyQlo2NDYUlC0QfApoLt37+Lp06cY\nNmwY7t+/D09PTwBA165dERkZKXTxFArFCIjFQLt2xpaCognBFcCWLVswaVJ5O2BbW1tIpVKhi6dQ\nKAZg3TpgyZLi40aNgOPHjScPhRuCKgCpVIq4uDi0bduWLUxUXFx2drZyk9TbxNy5c7F9+3YAgEKh\nwKJFi/Dpp5+iT58+2L9/v/K++Ph4+Pr6on///hg+fLhyd3BWVhbGjBmjvI/GEaBUBr7+Gvjqq+Jj\nMzOgbl3jyUPhhqD7AK5du4YOHTooj1u0aIFr166hbdu2iIiIKHWtJBKJhDcZglYG4V7yvXLnWzZo\nieAZwbyV8+zZM6xduxYPHz6Eg4MDJBIJ/v77b0RHR+N///sfsrOzMXHiRDg4OKB58+aYPHkyhg0b\nhp49eyIqKgoTJkzA9u3bkZKSgjt37kAikUAqlYJhGKSkpEAmk/Ema2VEKpXy+l5UZky5LsqKVVAA\nmAvYyphyXVQGBFUAYrEYzs7OyuPZs2cjMDAQcrkc7u7u6Nu3r8p0fO7s69O9D/b+vRcyl+IG1CbO\nBjN6zOC1nG3btmHUqFGIjIxEjRo14OjoiOvXr2PUqFFwcnICAAwePBiXL1/Gu+++i6SkJPj5+QEA\nPvvsM2zYsAGZmZlYu3Yt8vLyMHHiRGzYsAGEEBw4cAC3bt1CZmYmxo4dC19fX97krizQHZ/FmFpd\n5OcDFhas+WdJDhxgp4F27BCubFOrC2NSMhAVVwRVAOPGjSt13LhxY+zatUvIIsvhPdAbK3etxFVy\nFWAAEKBVVisMGTCE13ICAwMBoNTCdnJyMho0aKA8dnBwQHR0NFJSUlCvXr1S6R0cHJCSkoIlS5Zg\n4MCBOHTokLJn06hRI8ybNw8PHz6Ej48PRowYATMzM17lp1B0Zd8+4OpV4JdfSp//7DNg6FDjyETh\nRqV2BTH/3Hz2/+7zKzye4T8DY/4eA5mLDBZiC8wcPRMMw2hMry8KRXk3uCKRSOX5omuqGDBgAAB2\nCk0ulyMrKws1atTgRUYKRV/GjAFGjix/3tLS8LJQtKNyK4AyDbW6Y0KIchTQWtZa2fvXlF5fHB0d\n8fz5c+Vxamoq6tevD0dHR7x48aLUvUXXVGFeZhLVxPz3UShqG3u5nJ0isi0bJoBiElQJVxAMw2CG\n/wzYn7VX9v4NQa9evXDw4EEUFhbi9evXOH78OLy8vODg4IBGjRrh+Bs7uQsXLsDMzAzNmzeHubm5\n2hECQBt/immRlQVkZqq/PmsWUML4jWJiVOoRgDZ4D/TG9f+u8z73XxEjR45EQkICBg8eDLlcjpEj\nRyo3wq1ZswY//vgjNm3aBCsrK6xbtw4A8M4776BFixbo168fVq9eXU5ZGUp5UShcuHgR+OMP4I3l\nczlWry6/OEwxHWg8ABOGWjgUQ+uiGFoXxdC6KEaXtrNKTAFRKBTjkZQE0KinpglVABQKRSdevwYe\nPNB834QJQHS08PJQtIcqAAqFohPR0cDGjZrvO3IEaNVKeHko2lNlFoEpFAq/eHqyH0rlhY4AKBSK\noBQWAtevG1sKiiqoAqBQ3nLE4nj4+QWjR48g+PkFQyyO1ztPqRQ4cYLbvYQA06axm8IopgWdAqJQ\n3mLE4nj07r0BMTHBAGwBZOPKlSCcPj0Jrq4uOuf7/DkQHg6o8edYCnNzICJC56IoAkJHABTKW0xg\n4I4SjT8A2CImJhiBgTv0ytfdHVi+XF/pKMamyigAQgiWz5kjuCuFkgFh1HH37l0EBQUJKgeFAgBJ\nSQoUN/5F2EIiUe9uRAjS04FLlwxaJIUDVUYBnDx4EMm//IJToaGC5B8TE4MxY8bgBIeJ0SdPniA1\nNVUQOSiUkjg5iQBklzmbDUdH3X/6OTnA5s3apXn+HPjrL52LpAhElVAAhBCcXLkSq6VSnFixQpBR\nwN69e+Ht7V0qyM3169cxbNgweHt7Y+jQoTh9+jRSUlKwYcMG3LhxAz/88APvclAoJQkJCYCbWxCK\nlUA23N2DEBISoHOeUinw6pV2aZo3B9as0blIikBU7kXg+fM5/X+yZUv0vXsXDIA+N2/iVGgo+nh7\na06vBaoCwmzcuBFffPEF+vXrh8ePH+PAgQPo3bs3Jk+ejJMnT2Lx4sVal0OhaIOrqwvCwibhp59W\nIjlZAUdHEUJC9FsArlcPoH2Xt4O3QwFUcEwIwcmOHbH6TUzdPnI5pq1YgU+GDAGjKb2efPrpp1iw\nYAHCw8PRqVMnTJ06ldf8KRQuuLq6YM8eds2JECAjwzhyPHzIjh7atTNO+ZTyvPVTQCcPHlT2/gE2\nKmSfu3cFWwsoiY+PD/755x906dIFFy9exKBBg5CVlSV4uRRKSXJz2Q8AnD0LfPWV7nnJ5cDs2UAF\nISvU8uwZ8OSJ7mVT+EfjCCA1NRVSqRRmZmbYunUr/P390aJFC0PIxgt3L11ClqcnIks4JSeEwO7i\nRXYaSEBGjBiBCRMm4LPPPoOXlxd69OiB169fw8zMDAUFBYKWTaEUceQIcPIksG0b0L070K2b7nnl\n5QFuboCa6KUV0qeP7uVShEGjApg+fTq+++477N27F3369MHixYs5B3bfsmULwsPDIZfLMWrUKLRt\n2xZz5syBSCRC06ZNDWIKOdOIK0+zZs3CwoULsW7dOjAMg++++w6Ojo746KOPsHbtWkyaNAkbNmww\nmnyUqsHw4ewH0K3hLomdHfD11/rLRDENNCoAhmHQtm1bbN68Gf3798eBAwc4ZRwVFYX//vsP+/fv\nh0wmw2+//YYlS5Zg2rRp8PT0RFBQEMLCwuDl5aX3Q5gSS5YsUf7dunVrhKqYanJ2dkZ4eLghxaJQ\nSnHuHGBvDxg69tLRo0CTJoCHh2HLpahGY3+goKAAK1asgKenJ65cuQI5R4ceFy9eRLNmzfDtt99i\nwoQJ6N69Ox48eKAMidi1a9dSFjMUCkUYMjKAsjOOmZlsPF9tUCgAPz/9grtkZABv7DEoJoDGEcCS\nJUtw6dIlDBs2DGFhYVi2bBmnjNPT0yGRSPDrr78iISEBEyZMKBXs3NbWFlKpVHfJKRQKJ8aNAyZN\nYuf/ixg8WPt8CguBIUMAKyvdZfHz0z0thX80KoCdO3di3rx5AIB+/fph1qxZWM7BCUjNmjXh7u4O\nc3NzuLq6wsrKqtTu1+zsbFSvXl1lWolEwlX+txqpVErr4g20LorRti6KlplUJSFEu6DtHTqozsdY\n0PdCP9QqgD179mDTpk3IyMjAqVOnlOfd3d05ZdymTRvs2rULAQEBSE1NRU5ODjp06ICoqCi0a9cO\nERER6NChg8q0NMgzCw14XQyti2L4rIu+fYF169iduoZi8WLgu+8ANf0/raDvRTHJyclap1GrAHx9\nfeHr64vNmzfjm2++0Trj7t274/r16xg6dCgIIZg/fz6cnJzw008/QS6Xw93dvZTbBAqFwj+Fhazb\nhnfeUX190yagcWPN+RACfPopsHcvULu2fjLVqUNjA5gKGqeAzp8/r5MCAIAZM2aUO8fVhJRCoehP\nSgowYADw33+qr7u6cs8rOBioVUt/magZqemgUQHUqFEDv//+O1xdXSF6Y0TcpUsXwQWjUCj64+Sk\nvvEvorCQvaei+L4MA7Rvz69sFOOj0Qy0Vq1aePToEf79918cO3YMx44dM4RcFArFQGRksG6wdHHv\noAvp6cDMmYYpi1IxnMxAS/L8+XPBhKFQKPySkQGYmbGbvtRRpw67QasiOnYE9u8HXHR3IqrE3h5o\n0UJ7CyQK/2hUAOvWrcO+ffsgl8uRm5uLxo0b01EAhVJJ2LmTDeAye7Z++YSGAg4O/Mhkbg6MHctP\nXhT90DgFFB4ejoiICAwcOBDHjx+HA19vAYVCEZzJk7k3/pcvAxs3qr7WoIH+foQopofGr/Sdd96B\npaUlsrOz4eLiwtkVBIVCqVw0bAh88EH58/n5/Jd17RqwcCH/+VK0Q6MCqF+/Pv766y9YW1tj1apV\neP36tSHkolAoPJCQwN3mvlEj4OOPy5/v0QO4dYtfuZydgZ49+c2Toj0a1wAWLFiA5ORk9O3bF4cO\nHcKqVasMIReFQuEBPz/g99+5bfYqIj+ftQiqVo09PneO/+mf+vXZD8W4qFUAL168wG+//QYbGxuM\nGzcONjY28Pf3N6RsFApFT86f1z7NpEmAlxcwbBh7bGHBr0wU00GtXp8zZw4aNWoECwsLrFixwpAy\nUSgUI7J+fXHj//w5u1FMCP73P2D7dmHypnBD7QhALpdj5MiRAICAgABDyUOhUHhCJgPS0tj5dm2w\nsgLE4ngEBu7A6dMKtGolwtatAXB15WETQAl69Xo7RxdT503FzfibYMqEoW3t0hprFhgvQqEq1CqA\nksIrDLVFkEKh8MaDB8DKlewGLm0Qi+Ph5bUBsbHBAGxx5kw2evcOwunTk3hVAtr4IapMdPbsjC2J\nWyBzKY58YxNng8ltJxtRKtWonQLKyclBXFwcYmNjkZubi7i4OIjFYojFYkPKR6FQdMTTU/vGHwAC\nA3coG38WW8TEBCMwcAeP0r29eA/0RitpK4C8OUGAVlmtMGTAEKPKpQq1IwArKysEBgaW+5thGOzc\nudMw0lEoFIOTlKRAceNfhC0kEv5nAsaNA774Anib/EsyDIMZ/jMw5u8xkLnIYBNvg5mjZ5aaVTEV\n1CoA6raZQqncJCUBdnZAjRrapXNyEgHIRmklkA1HR/63AgcG8udiwpTwHuiNlbtW4iq5ihaZLUyy\n9w9w2AhGoVAqJ7/+CpQI5seZkJAAuLsHgVUCAJANd/cghIQE8CZbEY0bA9bWvGdrdBiGwYhBI2Ab\nbou5X8w1yd4/wGEjGIVCqZwsWKBbOldXF5w+PQmBgSshkSjg6ChCSAi/C8AleVu9grq2dUWPKz1M\ntvcPcFQAr169Qm5urvKYxuCkUN5uXF1dsHt3kODlEAK4u7OuJviIEWxKDPYYDI9gDxx+fBifeXxm\nbHFUolEBBAYGIjIyEnXr1gUhBAzDYL8upgUUCsWg3L0LvPeeaXvxZBggKqrieAWVGblCjtd5pus/\nTaMCePz4MU6fPm2yc1gUCqU8CgUwZgzrddPUqVvX2BLwDyEEv9/+HaM/GI2W9VoaWxy1aFQA9erV\nQ3Z2Nuzs7LTOfMiQIcp0DRs2xDfffIM5c+ZAJBKhadOmCAoSfohJoVRFRCLg5k1jS8Edufzt2hWc\nX5iPyIRIBHwYYGxRKkStAvDx8QHDMEhLS8Mnn3wC5zf7yblOAeW/cSJecs/AhAkTMG3aNHh6eiIo\nKAhhYWHw8vLS9xkoFEolJiwsHsOG7cCHHyrg5CRCSAj/bicMjSQhBdl/OKLH6iDktriF5RNm4uNW\nprfZQa0CWL16NQDWJ5BFCdWcmZnJKeNHjx5BJpNh3LhxKCwsxNSpU/HgwQN4enoCALp27YrLly9T\nBUChCMDLl0BWlnZuoI2BWByPr7/egIyMYJw7ZwsgG1eu8O92wpCIxfHo3XsDYmLe7KZO3wq/y7/j\n3CFnk3smtctDlpaWyM/Px6xZsyCXy5Gfn4/c3FzMmzePU8bVqlXDuHHjsG3bNsyfPx8zZswAIUR5\n3dbWFlKpVP8noFAo5YiKArZuNbYUmnkb3U4EBu5ATIEXUC+WPXF7PJ7dXmuSz6R2BHD79m38/vvv\nEIvFSjcQIpEIXTju2W7cuDFcXFyUf9esWRMPHjxQXs/OzkZ1NXZfEomE8wO8zUilUloXb6B1UQyX\nuvjwQ/Zj6lUWG5sDVW4nxOIcTt+3Kb4XsbE5gF0mgJI73Lg/kyFRqwC8vLzg5eWF8+fPo1u3blpn\nfPDgQURHRyMoKAipqanIyspC586dERUVhXbt2iEiIgIdOnRQmZbuM2CRSCS0Lt5A66KYt6ku3Nys\nERlZ3u2Eq6s1p2c0xbpwc7NG5J4BUD6TvQRo+TvnZ9KV5ORkrdNotBB2cHCAt7c3unTpgs8++6xU\nL74ihg4dCqlUilGjRmH69OlYunQpfvzxR2zYsAEjRoxAQUEB+vbtq7XAFApFMw8eAByX64yKId1O\nGIpyz1RQiHeqnzPJZ9JoBrpo0SIsWrQIHh4eePjwIYKDgzlZAVlYWGDlypXlzlMncxSK8PzyC7sP\noG1bY0tSMYZ2O2EI6jjWQsDGWjg6fyVycxVo2VKEkJAtJvlMGhUAIQQeHh4AgBYtWsDcnLoPolBM\nnY0bjS0Bd4rcTjx/DtSqVfn3A+QW5MLCzhxXrvyIzEwgJweoX9/YUqlG4xSQmZkZzp49C6lUivDw\ncFhaWhpCLgqFUsXw9gbi4owthf7Us62H2V1mAwAOHQK2bQP23t2LC/EXjCxZeTR25xcvXoxly5Zh\n1apVcHd3R0hIiCHkolAoOpKfD/z3H9C+vbEl0Y4Lptc+6kxMDPspCqd+Ps4Jta1rG1UmVWhUAE5O\nTli/fj0kEgkKCwvh5ORkCLkoFIqOpKcDy5YBoaHGlqRqsu/uPliktUbGs+bKc90aa29JaQjUTgFd\nvnwZAwcOREBAAEJDQzF8+HCMHTsWWyvD7hIKpQrj4FA5G//cXCA+3thS6I+CKPB+KwZffsm6u75z\nh/3fFFGrAFavXo0NGzZg6tSpCAkJweHDh3Hs2DGEhYUZUj4KhVJFuH0b+PFHY0uhP77v+6JZnWYA\nWHfXX38NvMrMw/gj40t5QzAF1E4BWVtbo/EbRyItWrRAnTp1ALAuHigUiukiFrP/u7oaVw5tad++\n8q1bqCIvD1i/Hpg5kz2OjAQIsURXl64gIGBgOq711SqAkv7/S5p+mpoGo1Aopbl4kW2EvvzS2JKY\nFlPnTcXN+Jul2jZCCFq7tMaaBWt4KSM2PRZ/3z0FQr4pdZ5hGPh/4M9LGXyiVgHcv38fI0aMACEE\nT58+Vf4dExNjSPkoFIqW+JteO8OZ+HjAzg54M+HAK509O2NL4hbIXGTKczZxNpjcdjJvZYgYERxr\n18SIWcXnUlJYy6xGjXgrhjfUKoAjR44YUg4KhULBL78APXsCffrwn7f3QG+s3LUSV8lVgAFAgFZZ\nrXgN2t64ZmM0rtm41Lnjx9kFbude/+Cl7CW++OgL3srTF7UKgJp7UiiVk0uXWE+gtmWdbFYCli0T\nLm+GYTDDfwaG/TkMaALYxNtg5uiZvIe7Xb4cGD26ePfv2LHs/9FpzdFIblrDABMOF02hUHTh11+B\n16Ybh9yoeA/0Rvuc9oL0/gFg6cWlINUTYGNT/lqzOs3wQf0PeC1PX6gCoFDeMnbuBBo0MLYUuiGX\nA1evCpc/wzCYMXoG7M/aC9L7d67ujPFjbFEy1ElhITsqM0U0KoDo6GiMGjUKAwYMwJYtW3D27FlD\nyEWhUKogBQXATz8Jt3HqRfYLdO7RGR81/Yj33j/A7gEo6/KBYdhnKigARh8ajdSsVN7L1RWNCmDR\nokVYsmQJatWqhaFDh2LDhg2GkItCoehAejprd15ZsbYGTp9mG00hCIkIQVhsGIaOH8p77x8AfvsN\nOHeu9DmRCDh7FjA3B8Z9NA52lna8l6srnHw7u7i4gGEY1K5dG7aVcWWJQqkiSCTAwYNAx47GlsQ0\nWf/pesHyvvjsIqLtHqGLo/oNGKbmE0ijAqhRowb279+PnJwcHDt2TG0cXwqFYnzeew9QEYepUiEW\nsxvZ3oQhqTQ42DqgX3sFmqmI+xITw45q3NwML1dFaJwCWrx4MRITE1GrVi3cu3cPixYtMoRcFAql\nihIVBVy+zH++qVmpSMlKAQBcSbyCX6//ymv+Tes0RVeXriqvnTsHXLkCRCZEYtbpWSrvMQYaRwDr\n16/H8OHD0aRJE0PIQ6FUCcTieAQG7kBSkgJOTiKEhATwEjLw1i2gdm3j7Drly9WCj48Q0gHh4nDE\npsfix64/op5tPTSv21xzIi04exa4cQOYMaP8tXHj2P/TZM0w+oPRvJarDxoVQJs2bbBixQpkZ2dj\nyJAh6NevH3UIR6HogVgcj969NyAmJhiALYBsXLkShNOn9Y+Fe+EC0KyZcRSAIVwt6MPIViOVf7vV\ncoNbLX7nY7amjsfXXVYBUD9NXsemDurYCODnQkc0TgH16dMHv/76K1avXo0LFy6gS5cunDNPS0tD\n9+7dIRaL8ezZM4waNQp+fn4IDg7WS2gKpTITGLijROMPALaIiQlGYOAOvfOeNEkYNwpc8B7ojVbS\nVkCRCacem62OHmVj6VYmBrf0Qpd2qo1k8vOBU6cMLBAHNCoAiUSCn3/+GePHj0e1atU4B4QpKChA\nUFCQcrSwZMkSTJs2Dbt374ZCoaBxBSicEIvj4ecXjKFD18PPLxhiceWPGJKUpEBx41+ELSQShTHE\n4Y0iVws2z9htsPq4Wjh+HMjI4E82aZ4UUUlRyvepR48gtJvYHzsu/s5bGT4tfWAmMlN7fdMmdn/D\npOOTcOmZiewMIxoYMmQI2bdvH5FKpZpuLcXChQvJxYsXib+/P4mJiSFdu3ZVXgsLCyMLFixQme76\n9etalfM2k5SUZGwRjEpsbBxxd59OgCzC/nSyiLv7dBIbG2ds0fTC13d+iWciymfz9Z3PKX1F78Wh\nQ4TI5XxJqj0KhYI49nYkCAJpP7Q9USgUgpbH9Tdy//l94rfPv/T7VP8SafT+eF7epxcvCBkwgNu9\nj18+Jpm5mXqXWRZd2k61IwCxWAyxWIwVK1agffv2ePHihfKcJkJDQ1GnTh107txZGT9AoSju3dja\n2kIqlfKgvihvM0JOlRiTkJAAuLsHAch+cyYb7u5BCAkJ0CtfhQLYs4fdeGQszojP4OMeH8PurJ0g\nrhZ05d133gU56l76fUrphGd31vDyPh1P2IcO4/dyurdZnWaobmUa5vRqF4HnzZsHgB3WkRL7shmG\nwc6dOyvMNDQ0FAzD4NKlS3j8+DFmz56N9PR05fXs7OwK9xNIJBLOD/A2I5VKq3RdxMbmQNVUiVic\nU6nrRaGwRECAP27eXIDYWBFcXRWYPXs4rKwsOD1XRe/FunWs/3ljIcuUYXjv4aj7qi46tO6g8/eU\nnCzCkycyDqhJAAAgAElEQVTm6No1v8L7tPmNCPk+uVo1hIu7osJ87t83h40NgatroV5l8YlaBbBr\n1y7l3+np6UhISEDDhg1Ru3ZtdUmU7N69W/n36NGjERwcjOXLl+PatWto27YtIiIi0KFDB7XpHR0d\nucr/ViORSKp0Xbi5WSMyMhulf7TZcHW1rtT1EhcH5OU1QGjoB+jbF9i8mQ3kzhVTfi8GOQ4CAAzx\n1M/PTloa8OwZoOkxudZF6MNQNHazLP8+DR2KerbOetcnl/THj7NO+uQ28fjq6Fc46XdSrzLLkpyc\nrH0iTXNEx48fJ5988gmZMGEC8fLyIn///bdWc0z+/v4kNjaWiMVi4ufnR3x8fMgPP/ygdm6QrgEU\nQ9cA3s41AH1R916IxYRERhpWFnX03tmbPM96Lng5XH4jeQV5xPegL3kaE1vufXJq60vuRz/UW45e\nvQiJj+d2b35BPnmS9kTvMsuiS9upUQEMHz6cZGVlEUIIkUqlZMiQIdpLpgVUARRT1RUAIYRER8eR\nESPmkyZN5pL27edX+cafEPXvRUQEIevWGViYEjxJe0IWnl9ICCHkTsodkleQJ3iZ2v5G/ve/ODJg\nwHzy4YfzSL9+/LxPOfIc0m1LP5KfL+yCtyZ0aTs1bgRjGEbpAM7Ozg5WVlbaDzMoFB3JynJBYmIQ\ndu1KhZOTA5ydjS2RfkyeDEyYALRowR6/fg08eQK0aaN/3h9/zH6Mha2FLT6s/yEAoJVDK73zO36c\nrSdXV72zUmJm5oKQkCA8fcpOx/CRt4gRIbj3LFhYVLzgnZ3Nejr97DP9y+QLjfYCzs7OWLp0KcLC\nwrB06VI0MsXIxpS3lo8+Yv2oNGpUWOkbfwAYNgxo3Lj4ODER2LbNaOLwSgP7BujfrD9v+SUkAJmZ\n+udz8MFBJEvZ+fGAADZc5tChQOfObHyAj7frpzUtzSw5efksLGSVGgCEnA/Blhtb9CqXDzQqgCVL\nlsDZ2RmXL1+Gs7MzQkJCDCEXhaLETP3emkrHxx+zPu+LePddNhA6H5w5A+iyDigEr3JeodWmVqUs\nCLXl66/Zxlpfnrx6ArlCrvJaXZu62DJAv4b422+BAwc031e9OrDlTVET2k6AbytfvcrlgwoVwKNH\nj2Bubo5hw4bBzc0NlpaWMHubfo0UkyY/n7WYKcLHB7h/32ji6EVODvs8QhIVxVrPGANCCIb/ORz5\nhexD1qpWC//6/mscYcowp8scNKrRCCdPskqyiIsXgc2bGbR4p4Ve+dfzXgSm+VGt0tS1qQtbS+PH\nVlGrALZv347AwEAUFBRg+fLluHz5Mh4/fozFixcbUj5KFSYmBvjuu+LjkBDA3d148ujDkSPAlCmq\nr927x64D6MvcuUDLlvrnowuFpBCjPxgNSzNLAOzaYcPqDfXaCPb6Nes+gS+srUuPvpycgFb6L1XA\n/6MR+Njdk9O9Fy7w813zhdpF4BMnTmD//v1gGAZHjx7FqVOnUL16dYwYMcKQ8lGqMC1asE7BimjW\nzHiy6IuPDzBEjWl8VBTrwrlpU8PKxCfmInMMaDag3PlCRWGF/nEqzNNc/ymtf5/8i9rWtdG+YXt0\nLeOq39WV/RyNPoqDDw9i++DtWudfWAi41XLnHMIyOpr93829EM5rnBH/fTwszCy0Lpcv1I4AbG1t\nYWZmhocPH8LZ2Vm5c1efOT0KpSpjoeZ3Pnas/pYhOTnA/v365cE3F+IvoN/efjqnt7EBFizQTwby\n5l9F9GjcA+v76hYqct8+dq2CK+PGsetAZiIz3J1wF+YiTlF5BUOtAmAYBmKxGIcOHULPnj0BAHFx\ncXQNgGIQcnOBiIjS51JS+DGXNDT797MhDoUkO5sdSRiLSccn4WbyzVLnOjTsgH9G/mMkiVj6Ne2H\nDg074NIl4FcVAcDi4oAhA21hb2WvU/4d+8UgtYduu57r2NQxuq8ktQpgypQpmDVrFpKSkjB69GhE\nRUVhzJgxmDXLdMKZUd5ekpOBEt5IAAD16gGHDxtHHl3JywPOn9dsyXTgACCTVXxPRdStC6xerXt6\nffmy9Zdwr1V6gcbCzEK5JqArZ8+yH32pX5+1uCpLo0as/ySAna7SFqfqTljWm/u6aHo6O2oowtgz\nKmrHH++//z7+/PNP5fGHH36IsLAwWKgbx1IoPOLqCpQNPSESAQ0bGkceXbGy4raQee0a0LUrO+1R\nGfmg/gcqzyuIAjK5DHaWdjrlq08H+brkOu49v4eADwPg7q7agEAkYoPPTzs5Dc3qNMM3nt9wzl+h\nAOQ51eBRl3v0+sJCdtEfALbd3IZbKbewod8Gzun5hvMElKWlfpqcQuELQvRrGEyRFSv0S//ff2zj\n4snNGMVgbIzaiOfZz7Gw50Kd0nfvrnvZ9pb2aGDXgNO9P3VcjFr22nk5SEwEPv1UO9PkunWBRYvY\nv33f90XAhwFalck3RvQcTqGoRiYDSjiULcXOnaVNQ02ZtWtLWzEJiUTC7pw1BuuurMOma6qHOZPa\nTdK58deX5nWbo0+TPnj0iHXBoQ6FAmjzQTWkp2vXq2jUCGizcDQuJ1zWSb5q5tV0tpDiC04jgIyM\nDDx79oyzO2gKRR8yMtTbSg8dCowcqfqaqdG3L/cpndRUdq5bVyvr/vx5YNAav/f91O605WORMzCQ\n3eOg6/RY/frAqFHqr4tEwOPHQAEjQ6HCSqtGeUmvJahZraZW8hw7xpr8NmvGrjswDAMRY5y+uMZS\njx8/Dh8fH2zevBk+Pj44XNlW4SgVUjJGqqnE3HV0BIKDVV+zsVFvTmlqeHiwvUQuFBQAHILtmSR1\nbOqgvl19tddf5bxCZq7uTn2cndn60YaXspf47jg7VKxZE6gg/AgAwNIS6LajG5684r5LKyEBqG/r\npPWO3hcvWKstAGi9pTWi06K1Ss8rmtyFUnfQxkNod9CVyd9+ybooLDRu3FtNKBSEZGQIl7+q92Lv\nXkJevRKuTH2YemIqCX0QKkje6n4jmbmZ5Ojjo1rlFf2kkGRqEaq3QwdCEhO1KqIc8kL+XmReYwIX\nQd1Bv72YYszdrKziRTJ1eHuzbnVNlUePgH6673/Sifv32UVgQxMRH4Fhfw6r8J7VfVbj8xafG0gi\nlupW1dG/WX+8fg106cJ2bzSxZrUId+9yL2PB7tP44doY3YUEjL4RTGPpRe6gPT09cf36deoO+i3i\n0SMFVMVIlUgUxhAHAGs3r2mZ6cAB054GatGCdWGtLWfPsu4PdPHpv9A466zo7NwZLerq50xNE7du\nAZGRbBwFbbGxYUNuclmK2PizAhKpBAA3W+NujbupNX+tiJQU4MQJ1jU1IQTZ8mydzWT1RWt30AuN\n9aZReIdhRACyy5zNhqOj8YzD6tTR/EM35ca/CF1kLCw0Ti9eH8xEZnjH9h2N991OuY0ceY5OZdSs\nWTqGAheGHhiK9Jx0mJtzd5CXmZuJT/d8ymlzVmwsIJNaop5tPe0Ee8OrV+z/Z+POYuRBI1o1aJoj\nCg4OLnU8c+ZMreeZtIGuARQjxBrAzZvFf1fWNQBCCElPN5IgGjh6lJDnAofCLVsXEgkhf/whbJnq\nKCgs4HSff6g/efhC/9i7ZVH1G1EoFCQsJkxt3PGKuHmTkGvXNN8XGEjIkSNaZ18OXWRUB69rAHv2\n7EGXLl1w4MABdOnSRflJTU01pH6i8EhODjBrFiCVsseuri44fXoSfH1XokePIPj6rsTp05Pg6upi\nFPmkUm6OteRydppFrtry0KhERrL1bEhkMnYfgKHJK8hD/VX1IS/U/EXs/HynVjtm9YFhGPRy6wWA\nQYsW2sVISEhgN3hpYsECIDjZE09fPdVZToAfM1m90KQhNm3apJM2KiwsJHPnziUjRowgo0aNIk+e\nPCHx8fFk5MiRxNfXl8yfP19lOjoCKIaPEUBBASEpKZrvi4khZPVqvYvTC6mUkMOHVV8rWxc8dpxM\nisWLCXnxouJ7hLYO0wZZvswg5SxbRsjt2+XPa6qL5GTtynmd+5o8TXvK6d6MnAzOI6Cy7N5NyJMn\nxWXyUY+CWAF98w133xglCQ8PB8Mw2LdvH6ZMmYLVq1djyZIlmDZtGnbv3g2FQoGwsDCd8qaoRpVN\n/8GDAJcYPnZ2bJBsY2JnBwwaxO1eY3ecSsLnXooGDbhZrJgK1hbWmm8CUKAowLHoYzqX06YNuz7E\nhYnHJuLis4sA2E1g2nA16Sp+uVZxjM7ERODBA6BGtRo67+QlpHi955tj3+B8/Hmd8tEbvdVOBRQW\nFhJCCDl06BCZM2cO6dq1q/JaWFgYWbBgQbk0dARQjDY9PXXz+U+fxr0VveWydZGby859GxtjrKOU\nrYuTJwm5c0ew4tQizZNynsNWKBRk6IGhJEeew6sMqn4jMa9iSEZOBsnP1y3P+/cJWbdO/fXjxwlZ\nvtz0flSCjAD0QSQSYc6cOVi4cCEGDBhQanXd1tYW0qLJaIreqLPpDwraYVK9ZXVkZrKuE7j2fs+f\nZ10EGBtT2EuRnl68s9SQDPljCGc/OAzD4M9hf6KaeTWBpQLcarmhRrUa6N2b9bKqLbVqsbuP1fHp\np0D1Hlvw/YnvdRfSRNC4D+Dy5csoKCgAIQQhISGYMmUKBg4cyLmApUuXIi0tDUOHDkVeiagY2dnZ\nyihjZZEYY0XLBJFKpZzrIjY2B6ps+sXiHM55RERY4tkzc/j56eGYXkfy84HJky2QnKx6QbFsXbRs\nyX6M/arwUe8lkUhE2LfPFtOnq+8cla2Lon0Dhq6L7T23g4AY5Pf6/LkIq1bZY9my0i4lKvqN7NzJ\nThVqK15sZiwavmcFicRJ7T0DGgyAVz0vnZ/92TMzRERYwc9PhkJFIVJkKXCyU1+eUGhUAGvWrMGq\nVasQHByMffv24fvvv+ekAA4fPozU1FR89dVXsLKygkgkQsuWLREVFYV27dohIiICHdQ46HB0dNT+\nSd5CJBIJ57pwc7NGZGQ2SjdG2XB1teach6cn6zPd0VE751Z8UZGttzZ1YUj4qPeS2NkBbdsCjo7q\nI1SZal1oIk2Whoj4CJ12BdeuzToBdHQsrWzL1sXKyythxphhasepOst5MOEgGlZviLaObctdy8kB\nTp0CBg/WOXsArAdSBwf2t5YsTcakE5Nw5csreuWZrEsAZU1zRH5+fiQrK4t89dVXhBBCfH19Oc0t\nyWQyMmXKFOLr60t8fHxIeHg4iYuLI35+fsTHx4f88MMPKucP6RpAMdquATRoUDls+nVBVV0kJgpv\nc6+J2Ng4Ur26cdcAVq4kOs9360qaLI1k52drlSZZmkx+CPuBVznK1kV2fjZ5mf2SpKWxFnC6kpFB\niJcX63eqdHmEfP89IfkFBq5wDujSdmocAdjZ2eHLL7+Ej48P9uzZw9kdtLW1NdauXVvu/K6ycf4o\nvODq6oJt2yZh7dqVkMsVcHQUISTEeDb92pCRAXTuzEZK0ma9YutW4P33gSG6hWTlBVdXF1y9Ognz\n56/E8+eGr3eFgvUuaW5glzLb/9sOhmEwreM0zmnq29XHol4aHD3piY2FDWwsbDBlLjuS8vPTLZ8a\nNVRbzzk6AqtXE9ReXg9J05JgY1FJQ7i9gSGk4mW3/Px8PHv2DE2aNEF0dDQaN24saHSwGzduoE1l\njPwtAMYY6q9dy07FfPaZ4cokhJ2ndapgCrSyTnvowsGD7CY3dbEBqlJdlOS33wBr69LxIErWhYIo\nwIBRbq7SJ3Lciacn0Mm5E6pbqV6nLFAU6O3IbcMGYMAANvzp8+znIITAwc5B5/x0aTs1PkF6ejo2\nb96MV69eoW/fvsjJycEHH2jvAIlSOejbF1CzNi8YDFNx42/KZGay9cWnpZWHB397AabOm4qb8TdL\n7TglhKC1S2usWbCGn0K04N7ze4h5FYPBHtpPonfpwvrtV8eZ2DP4+drP+HvE3wD0+07CxeFoVqcZ\nbMyqw8ysOK9du9j5/+rV9R9yOTgUj9x23t6J2ta1MfajsXrnqw0azUADAwPh7e0NuVwOT09PLNLk\nq5diFHbtArZt0z8fDw92mGtIcnN1T3vhgnEdqM2cyXon5ZP33uPuwOzePeDvv9Vf7+zZGdfNruO8\n63nl57roOrq07aKzfNI8KWLTY3VKW6gohEyum5VZs2YVGwp4uXlhz5A9SEkBXr7UqQgly3svh1st\nN3TsCESXiNdy+zaQp2Atd/Rl+PBic9MZnWYYvPEHOCiA3NxcdOzYEQzDwM3NjcYDMFG6dwe6djW2\nFNojlbKWR7o24uvWFXtWNAa//goMq9gdvqAUFLAmtOrwHuiNVtJWQNGIggCtslphyADdF07uv7iP\npReX6pT2g/ofYGQrYbxfMgwDW0tbHD3Kdoj44OxZoHnz4uOVK4HNt1dh5eWV/BRgZDQqACsrK1y4\ncAEKhQK3bt0SdP6fojvOzmycUT7w8wNu3uQnL03Y27OhEM10jI3911/AO5q9EQsGw7AxZfnmm29Y\nl8Oa+PBDtiepDoZhMMN/BmyesYuVNvE2mDl6pl5OyDo07IAtA7fonF5XCAG8vNRvesvOZy98+SUw\nVXcrUACATC7Dzts7YafCTX9gt0DM6jxLvwLABvH5+Wf2b0IIopKiOLmi5hONr25ISAhCQ0ORnp6O\n3377DcHqgrVS3hrmzwfefddw5VXWPkVMDBvBTAj8/YG6dfnJa8CnA9DydUteev988M/jf3Am9ozW\n6RiGtcxRFWshMzcTzTY2460BtRBZKBvkly/Z3dahoeyUGyuL/os+9vZAwxKxZ2adnqXz9JiuaFQA\nFy5cwJo1a3Ds2DGsX78e4eHhhpCLogVLlwIbN/KXX5MmQDXhd+wDAOLj9VvwTE/XLfoWH/zyC3CZ\nmycErencmdti/M6drCKqiH+f/guzpmYwO22GKb5T9G68zsWdg4LoHjWuZrWaqFGthk5p27VT3WGo\nUa0GEqYm4PlzRquwjuqwMLPAxn4bwTAMli5l3zG5HCgsJHiR/UL/AgA0alS8oYxhGJwLOKd1gHl9\nUbuUffToUYSHh+Pq1au4coXdoaZQKBAdHY3Ro0cbTECKZiZN0m0h1dgWIjIZGzv39m3Vduwl5cvL\ny4OVlVU5+dLT2UXQ7t0FF7ccq1bplo7Peudi6vh5i8/RP6Q/5i2ahxGD1diWciRHnoPll5ajm0s3\nnfP42EWHmJccEDEiPHrENtatWvGX78SJ8QgM3IGkJAXqOOfgVutQPP1evzgApoJaBfDxxx/jnXfe\nQUZGBnx8fACwzt2cK/KSRDEKtrbsR1s6e3bGlsQtkLkUDztt4mwwqc1kuLmxDbO9eo8EemNjw86D\naivf5LaTlcdubuzehcoEl+dKSGDnsf/6q+K8xnCMSW5pbomlQbot3JbE2sIax32P652Prpw8CYSF\nAStWlD4vkUrgYOuAbt3M0E133VSK6LRonL4ThjXjY0s4/MuG+2UFxIPjednsFxwMjB3LruGlZKUg\nPScdLd4RNsZySdROAdWoUQPt27fHwoUL0bBhQzRs2BCOjo4orGxBS99ycnN1n0JRZyHiPWgIrlyB\nygUwQyKEBQtfXLrEBvfWBS7P5eAAzJmjv5zPs5+XmrI4Kz6L32/9rn/GerLkwhLcSb2jdbq2bdkR\nb1lGHhwJcYaYB8mKURAFdh84Jai31w8+KJ5uvSG5gaPRR3nJlysa1wCmTp2KadOm4fvvv8fQoUMx\nffp0Q8hF4ciiRbr3gCuyEKlXT/igKxcvVmz+ydWC5dYt9mNIzp7V3fsmwzDo26cvzGJZ0ydVz2Vp\nyTrnqwiplF3/qYiw2DBsur5JedzAvgGa1tHdXCxcHI40mRYxFtXQvmF71LXRfpW7dm127rws5wPO\no555Exw5ordoSjzqeqDaow9QytGfbSpgLoJEovsaSEk++6zYiq1/s/6Y2XkmL/lyRaMC+OOPP7B/\n/34cOHAAJ06cQL169QwhF4UjCxYAEyfqnt57oLfSQqRFZotSvVAhY+7m5QELF3KTr6i3rK73Lxaz\nH0Py009A69bapVEQhdJKJXBsIFpnt9ZrVFNYyE6jVcSoVqMwr9s85bFHXQ90cu6kdVlFnIo5hfTc\ndJ3TF9HTtScc7fndcZiWBly9ymuWcHISAShhd9plKdA0FI6OgoZSMRhaPYW9vT0SEhKEkoWiAwyj\nnxmlNF+Kp7Wfwv6sPeZ+MVfZCxWL2eGpUFhZASdOaLb/LxoF2IXbqbVf//xz9mPqjD8yHqdiTgEA\nzERmmDVmFqzDrTFs0DCVz7V9O7B8ufr8atYEJk9Wf70iChQFOqVb6rUUTWo30a1Qnhg1CrhSwnOy\nOF2MjNwMuLqyI2I+6faVExw7jYVSCZxcCPf8/xASEsBL/lFRwPr1xcfn487jdd5rXvLmgkaHFj4+\nPmAYBoQQvHr1Ch07djSEXCaHsS1mVJGSwpoKauoFVkR1q+pI2JiABUsWlOqFNm5s+GkVVWy9sRUW\nzhYY034M7trdRfPnzdGyHkc/CQLxxx9A+/YVuyVQxYIeC1DfrjhIrfdAb+w+vRudu3dWeX///vpN\nw917fg+WZpZoVqdZuWvdd3THloFb8O47BtzwUQbvA97YNmgbalbTLv7EsmVAyYmI7be2o02DNjr5\nF9JE00ZN8MtaB/y5biUkEv69vTo4lO5oHXx4EE7VndQ6oeMdTf6iExMTlZ8XL15o7W9aW0w1HsCf\nh/8kNl/YEMyH8mMTYEP+OvKXYGVqigewcCEhW7bwV94NyQ2SV5DHX4YVsHcvIXkcikrITCAxr2JI\nUlISCY8NJynSFJX37dpFiAFeT0IIIT//TEhMjOb7nmc9JwP2DiDyQjmv5Re9F2FhhJw4of6+PXf2\nkAP3Dqi89kr2SutyIxMiyX/J/2mdTh0RcRFEli/TK4+iuigsJGT16vL++/lEli8jMa84fPFGQpB4\nACKRCEePHi0VzvG7774TVCmZIt4DvbFy10pcJVcBBiZhkfLjj/qlzy/Mh0QqQeOajQEAKy6vwMIe\nC+Fe2x0A62s+M5ONkconcjlw5gzwxrq4QhpWZ7dKSnIk6OHaQ+19qamsiwC+ds9WxLffFv9d0chw\ndfBqBHYN1NttsDqsrVlfQOoY1WqU2mu1rLX/UpNeJ/G6UYnP/QA5OaxPKCHcchQRkx6D+efm46/h\nGmxzKxEaq2vKlCnIyspC3bp1lZ+qiBA+VYxNzKsYTPq32KZun/c+ZeMPAEeOANO4x/vgjIUF8L//\naf6x5hXkqTxPVNi9Tp8OuBgh9o0qb5tXmavo0rYLGIZBO6d2GvM4Kz6LTdc2qbw2cCBw44bqdJ06\n6ecAMCs/C1cSuYch9H7XG32b9NW9QJ54+pR1DQ0ASVlJePTyEWxtgZAQYcoLOhuE+Ix4tKzXUpDG\nf9KkYpPiF9kvEC42nLcFjQrA1tYWU6dOxYgRI5Sfqsrrhq9BnhKT6P3fuwckJemXR4t3WuCfkf+o\nvT54MLsQaQwIIfjo14+Q9Lr0Qx6LPoZxR8YZRyiwG5CePCk+VmXT3yy9mVbvhktNF7RxVB3IY+tW\n3Rbjjz85jlspFS/iSKQSbP/PSF8wgJeyl+jxu/pRnToaNwYOHWL/vp92HyefnuRXsDK0dWoraOSv\n/v2L1/Fe5bwyqALQODZt2rQpjh07hhYtWih7u66uroILZor0b9YfeRPyMHvzbMycYdzef1gY60aZ\n70Aqx58ch6ejJ+rZ1uN9H4BYzG6pj4xUoG1bEZYsCVC7mMYwDG58dQPWFtalzndv3B1dXcp3ezMy\nWGWlrxdITbi5sdY3JeWcPHIyxh8dD5mLDDbxNgj6Mkird8OtlhvcarmpvFa/vsrTANg9AGPHll4Q\nLSJHnqPR0qdZnWb4deCvnGSMTY/F1cSrvLpyrmNdB+v6rgMhRKv6mrmgvIuQtXND0cezNTav4N8g\nY0CzAQCAhy8ewrmGM+ws+d0h2ffNoKrkdGL3nd0BCG9oolEBPHz4EA8fPlQeMwyDnTt3CiKMqeNg\n54BvRnyD+Oh4o+9G/f57/dInvk5E0usktG/YvtT5O6l30LhmY9SzZVuV9HTW37yD7pHqALCNf+/e\nG5S7KmNjs3H9ehBOn1ZvUVG28Qegdg7ayordWyA03t7lz9VqVQvWP1tD1kgmyMhQnb+fOnXY51Yp\n57sqBNWD/MJ85BdWEHhABxiGwfsO72udTpUrDctCG3TvqKNNLEdWXl6Jie0monUDLTeAcISLixDe\n4XcdmkUul5OZM2eSUaNGkWHDhpEzZ86Q+Ph4MnLkSOLr60vmz5+vNq2pWgEpFArl3ynSFINYA2iy\nAtKHi/EXyYpLKzTet2YNIb/8on95vr7zCZBF2Oas6JNFfH3LvwuZuZnkTsqdUufK1kXsq1j9heKR\nA38fIPZd7XW2Cot+GU367OpT7nxSEiFNm5Y9x+97sfXGVhIRF8FrnkKiUChIg3btCYLeWOQFgbQf\n2r7Ub5RPpHlSMvzP4YLlHxbG/s4UCgVpP1T35+LVCmjy5MlYv349unQpHzru4sWLFSqVI0eOoFat\nWli+fDlev36NwYMHw8PDA9OmTYOnpyeCgoIQFhYGLy8v/TWYgZh7Zi6qF9bAg135uFFwC3Z18nBg\nxibe7IG14cwZ1o94yUhF2tK5UWd0bqTa/rwk+o40ikhKUqDUlnoAgK3KLfXRadH4/dbv2NBvg8q8\nChQF8D7gjXMB5wxnLw02SMvUqarrfeigobhx64bOvX+3Wm74pf8v5c43aKB+EVgda6+sRVeXrpx7\nqs3qNEMD+wbaFcITF59dxJora3Bw+EHOaRiGwfLpM/D1v2MgaywT1CCjaFomLScN3f/prtwTxee0\nTNOmrIuLIkMT31Bf5LvmG8bQRGuVwQGZTEays7MJIYS8evWK9OrVi3Tt2lV5PSwsjCxYsEBlWlMd\nATx6Ek1cm08q0YvNIu7u00lsbJxgZarr6W3fTkhkpGDFkt23d5frgeuLNiMAVXDp9V66RMj+/fpK\nqs473kYAACAASURBVJ7LlwnJyip97kL8BZKalSpcoSpISkoiMTGs3bsqTsecJomZibyVV1BYQGad\nmkUKFfwb2cvyZVrtSUjNSiUp0pRSvWXnju3J3bvC9M4Nvf+n5HNpO6rhdQQwd+5ctUpjyZIlFSoV\na2t27jYrKwtTpkzB1KlTsWzZMuV1W1tbSKVSbXWVUQmZvxfix0tQ3ivgSuzeHWRQWQIC9Et/Pu48\nFESh1q7e1tIWZqJiHw3377NrAPpYAIeEBODy5SCIxSXc6roHISREhWtHHbG3Z+fFhULVJvgzsWdg\nY2GjXDPRl6z8LJWLjPn5pV1+WFkVBxQvi5ebbiPrAkWByj0L+YX5cK7hDBHDv5G9tYW1yrUedfzv\n5v/gUsMFvu/7YprvDIxb/QVG952JevWE6SUbev9P0Shg7KqxBjE0UasA7t27h9zcXAwaNAgfffSR\n1qHWkpOT8d1338HPzw/9+/fHihIOvLOzs1G9gnBHEl3dLApEem46YmJlKDWFUfcRYJ4LsThHMHml\nUqkgeb94+QIKooDESnXe7aq3A+TF38Pmzfbo1SsP7drpvghoZWWBvXuHY/nyBUhNZeDgQDBr1nBY\nWVmUesbj4uNwq+EGj9oepdKrqovrqddhb2GP5rXZOZk6ddiPIV+f8c3GA4Sfd7ZQUYhOf3TCae/T\nqG5Z/PvYscMG8fHmCApifcRIpVLY20vQqRN/zyqTy9A7tDfOeJ9BNfPy4eCGNBwi6O9SnfIBgLSc\nNNSxZjV7gHsAACAxUYLxYz7HML9TmDCuAwoKJIJ972P7j8Xd83eV003jBoxDcnKyxnSEEGxesgTf\nzJ2rsSGfMKEWFi/OQK1aBB3bdIRvW1+sS1mH9+LeK/Uu8E5Fw4PHjx+TFStWEH9/f7J+/XoSF8dt\nuuPFixfk008/JZEl5im++eYbEhUVRQghZN68eeT48eMq05riFNC3R78lnb/2Lj2F4XGIoOVvnKcw\ndEHVtMfOnYTcvClYkYKRmcntvr139pJ7qffKnVdVF7tv7yZhMWH6isaJXr0IiY4Wvpz8gvzy5/IJ\nKTkTUNF02Bd/f0Hupt7VqWxd3EPwwYarG8isU7NUXssryCOtfmlF0mRp5a/lCWsoUYSu0zL//vkn\n+d7enpz4S/N00blzhMjKeMW4lnRNq2k3XdpOzmsAUVFRZNKkSWTYsGEa7124cCHp3Lkz8ff3J35+\nfsTf3588evSI+Pn5ER8fH/LDDz+orURTVACEEBITIyYODtONvgZw+DAhjx8LVqSSrTe2kn8e/8Nb\nfp07E3L/vu7puf7QV68m5NYt3ctRR0ICIfISLn1k+TIy4+QMwSxDKiIpKYns2kXIxYvlr91OuU2y\n87N5LS/4XLCgVm+58txy9Zgrz1X+XZEvpXnzMsixY4KJpuTPw39qZeWlUCjI9+3bEwXA/m+A90QQ\nX0BZWVk4ffo0jh49ipycHAwaNEjjqOLHH3/Ejyoc1ezatUu3YYoJ4OLSGD16TAKwEikpCjg4iLBk\nCX9eAbnCoforZO2VtWjToI1GPyyejp6lLGz++Qf45BP1dueaOHuWdQEhNK1a8e+7CGCtrkoiV8jR\nsl5LQeZoH754WM4jpEzGxk0uWgdwclL9nLrY1ZckJSsFabI0vFfvvVJ5auuxkyuqfCmlydJQaF6I\nB3sfAIDKqSGxOB4//bQD9+7l4s6damjRQv2mQj7wHuiN6/9d5zz3f/LgQfS9excMgD537+JUaCj6\nqNpEogEFUSAuI07tRkG9UacZjh07RiZOnEg+//xzsmnTJpKQkKCXduKKqY0A7qbeJa9zX5c6t2ED\nIXPnsrb05+POC1a2EMPbKwlXSHxGvNbpJk5kbdKFIjs/m/Tf01/lFAgh6usi9lUsmRs2VzjBCCG5\nuZrv4ZMJRyeQqMSoUuc++aTY8ktdXfDRywx9EErWXVmndz5cUWdls/vgbrVpYmPjiLu7YUfj2lCy\n908ATqOA0FDVVl3/Jf9HPt//OadydWk7GUJUr+56eHjAzc0NHh7sYlxJDb1q1SphtBGAGzduoE0b\n1X5RjMHkfydjVKtR6NCwg/KcXM72xsLFZ1CgKECfJn0EKVsikcDRsThq0uLFQK9erC/6ykJ0NOul\nsUOHiu+TF8pxNekqujQqv+8EKF8XRcjkMpyKOYXPPD7jQ1yVtGwJHD2qvf9/Pim5G1hdXXy4+UMc\nHnEYLjWN4BVPRwgh6Di8I66+V2xl0/5+e0QeiFQ7uvLzC8aePTNQel9JNnx9DW+Rp4oTf/0FZswY\n9JEV7+g9YWMDZudOtaOAxETWo2lTFdE6CUdXGbq0nWqngKqqu4eyrP90PWJj2cb3hx/Yc0VTGb3c\nehlUlp49DevxcuuNrXid9xrTO+keBzoxEYiP16wALMws1Db+FWFjYVOq8ZfLAV9fYP9+/lwD37hR\n2gRzY9RGMGAwsZ0esTi1pOzv/9tv2VjQJeUKHxOOWtX4nf/adnMb6tjUEUzBFpk9jvl7jNKXkqbN\nT9psKjQGdy9dQpanJyLLuAi3u3hRrQIoO8VYEiFNQdUqgHbtNLuxrSpYW7NzyyXJyQFiYtjeoaHQ\n1IhqYsgfQ7CgxwLOEbUGNh8ISzO2hcnJYRvVL77QrsyePTXfk1+YDwuRhV4vetFA1sKCgb8/G8uA\nLwVQdt3D/31/ZOVn8ZO5Gq4lXQPDMPB0ZCPDKxSsyWfDhuzfrVuXX1OpbV2bt/Jnn56NaR2noUPD\nDrAy13HhhyMlbe252NgXx+ktPQIwlTi9M9esYZ1olVykSU3Vy6HWqZhTKFAUoF/TfjxIWIxp1JiJ\ncuTxEaTJ0tCgAeuXvSRPngArV7L3HIs+ZhwBtWTVJ6vQtLaKMaYa6tvVVzYqFhbAf/+xjQ/fbP9v\nO2aHzdYrj757+uLu87sA2O/KnKcYLPHx5Z+5RrUacKrOsxvWMiRnJeN59nPlcUYG0O/Nb18kAr78\nsvSo4FXOK97KnjpvKo5tOYYhE4Zg4qyJ+HLal+g2phumzhPG1WrRKMD+rD0n1wchIQFwdw9CcbD2\nok2FAYLIpzVJSUC3buy8HcAOS7t1AzRsfu3Rg13sV0V1q+rCLMRrvWogMKa0CDzn9ByS9Lrilc+r\niVfJ9SRhZC652DduHOvqwBioW5itiNxcQoYMISQnR/O9CoVCo+mipgVxyWsJ76Z2CgUh7doRIpEU\nn1Nlj25oytZFQWEBcV3rSjJzOW620IAxwp8qFAoye/5szt9hbGwc8fWdTzp1mk18feebzAKwkoKC\n0sccnuvaNXbPh67wughsLExtEXjpUsDRERg92vBll1zsi49nHUbZ2+uWV25BrsodnprYeXsnriZe\nxc/9f9YqXUEBEBHBbQqIC+oWPlURGclGM9PgsURrCCFovaU1/vb526gLrUeOvEBy8jv4+uvSsvE1\nV0x0WJg1Ftq8F28DBYoCmDFmKr8HXdpOOgWkgS+/ZO3fVZGXB+zYYRg5XFx0b/wVRIFmG5ohIzdD\n67TD3xuO9Z+uBwDExQG//cYtnbk5t8b/Vsot5Bbkai2XKvIK8pAsTUbTpsBI/uKWKGEYBtfHXzdY\n438n9Q7WX12vPM7IABISgLp1FfAo7SmD14b5bQx/ajAePiwdMq4kN2+qv8aRQfsGISopSq88SkIV\ngBqWXVyGVzmvULeu+qhMFhbsd7rl2nbsv7dfMFkKC/VLL2JEeDLpiU5ziNXMqykdw5mbVxyEvIjM\nzOLpT00sv7Qcia8TtZZLFbvv7MavN35F3brA+/rthwLAjmDKBpkp6SRPaOpY10GT2k2Ux//+y3Y4\nGjcuRLduxfdFJUVBQfhdnCkZ6tLY4U8rFbduAdeuqb528yYQG6s26Y4drGVXRewZsqdcECe90H3G\nSRhMYQ1AoVCQlZdWkrSMPE73P3zxUJAAJUVzvZ98wroiNhbyQrnGtZCSTJ7M+iziEy6b4vhcA1Ao\nCBk0iBCplD1Oz0kn58TneMtfH0rWxevc18Rrp5cgrpq1dX9gDAzhC8hQSCSl15u0RZe2k44AVMAw\nDKZ3mo5PelkiOlrz/R51PeBaS7g4yX//DXh66paWEIJHLx9p7c21JKdiTmH+ufmc71+7VpgpGE2U\nnKJYtAg4cECfvIDDhwG7N56Zn2U+w8kYYYOPc2XjRjvcZQ2eYG9lj9P+pwVx1ew90Bvf9vyW9v4N\nRIMG7EcT+YX5+OfxP7yUSRVABURGqt6ZV5aQEHZuViisrXX3o/NS9hLj/xmvV/n9mvbDlv+3d+Zx\nVVXr//9sBgcEzbyYGsZgDqFXuwppaU5p4NX6XrJEBdTSftmtFKcUvSiKgSllt66WYi8nTBORrqmI\ndFNIJcWBWc0URWQQZ2bh7Of3x+ZMcA6cvc+IZ71fL14vtmevvR6W6+y11rOe57Pe2AwASE4W8gGa\nguOaD8O8V3UPG9Man4ClL9V11didtRsBAcDYsYZ7bv9n+iPitQjDPVBH7lXdw2s7XlMM4NnZgJtb\nHZydjV83x3FYs2IN8/3rSng4UFra9D3XrwuzEz0gIuy7uA81dfofgs0GgAbwxGNK3BRU1VbB3l7z\nYdwN6dcP2JIbhehz0Qa3p7RUd3+6JpzbOeO3d38z2Je4UychKkoTZWXA/v26PaficUXzN0nAzsYO\nKTdS8Gz3Wr1E4bZv1x6TbUo6tumIqLFRiuvoaMDFRYYuXYSZ4A9ZP5jROoYCIuHL0aFD0/d16qRV\nU0QmE/aumtvza23XGtv/sd0gCXpsAGgATzz8Paci/azupxT5+QEfvDIVk/pOMrg906YBZ88a/LGi\neVj9EKcLTqNfP2D4cM33lJRA4Zpoju4duuOf3v80nIH12NnY4dsJ36IgvxCBgSsxatQKBAauRF7e\nDZ2fIZMJbS6XWdiRsQNpt7Rs7BkZjuPwt65/A8dxyMu7gbt3V2L16i8QGLgS6ZczkF6cbha7GA3g\nOEGfQ1WbQxNOToJWiQZsbYEff9Rt0mkwpG85GAdL2ATOzyeaNMncVggbXDyvUw6JRu5V3qOjfx41\niC25t3Ppo0MfGeRZUhCz2WdotcjDfxymS6WXJJU1FJeu/EEePeZbrAKmuXiSNoHFknozlRYkLlBc\ns0QwM/Lll0DnzsCUqTK9QwXz8m4gNHQbrl2rgodHW4SHS9M6zy3NxZ7sPVg1apVe9jRk0ybA3V17\nfoQmVHXfbz68ibb2bdGpbScMdB2I9avWN1teTMJPH+8huFxdCjxuD9TIl+R16NGxDn9e+F1rOXm7\n37rF49lnbSS3uzF4emkX3P/uF+C+qo6T5ShgmguLSAQ7cQLYuVP4YujKG28IWaZ9+zZ/rxYeVj/E\n9QfXMaDLAAAGVgO1Rh5UP4BvjC9SZ4rPePzHP4Cvc0Lw8KyLXiqReXk3MHbsN7h6VTg8PTW1Ar//\nvgJJSeIPn/F09jT4yx8ABg1qfPj67NnAggXaN82Heg3F5oLNqHRVOtYdrjtgjvccg9tnW9cd6JsB\nvKASc53rAMocr7jcsEE4XEd+sHrDdgekt7sx6Hf6Pfym+vJ3LAL67rUYBUyrxttbvNDbv/+tUdp3\n/XrBFTRHh69FhzYdFC9/qbA9ABWcWjlhUc/t+N//xDvhPDyA1T7L9PZrh4ZuU3kJAUA7XL26EqGh\n2/R6riG4V3UPMZkx8PISVgCqTJnStFS1amIRAKMmGL3o2Rc4qV4XTvXFkIGeintatVJX+XztNQ3t\nnv8pXto0DI9ljw1uo1ie69oaSvEzADYyoNrBYhQwrZrWrXULF1TFw0N40zcgKAiYPl3co8pqynC/\n6r64QvWw3qOCrY0tnrHtjXKJSr+OrRxRV6ffDo6htM7PF51H/MV4vWxpiC1ni4ulFzV+NmJE0/tf\nHMfB/01/tL0hbK4bU15g9ep30RnPABcFKQNcbINn0AWrVyu1rN9/X3DZyWnfXkO71zrDI3uCQhLb\nnISHz4Br34VAm/qs6Ucd0aP8suUoYForDx5ID9OTyYTTklT4y1+aDyRSZd7yeej7Tl+8HPSyJBOM\nOgBkZGQgKCgIAJCfn4+pU6ciMDAQK1euNGa1kiAi1MpqMWyY4M6RQnw88O6sGr204pVa56qI1zrn\nwBlctqBDmw747DUhhvmDD4DcXCFU8rGOE2Tn/s5wue1idHkBd3dXpCZ/g05/dAQIaH/FEaeSv27S\nldOvn6Z2r0TPp7TogJgYd3dXjFlRhxHTPsUrryxBQECUxbinrJoFC4QvvhS2bBE2D/VgqNdQ3P3L\nXVz+62VpDzDYlnQDoqOjacKECeTv709ERLNnz6a0tDQiIlq+fDklJSVpLGeuKKDLdy7TwE0D9XpG\ndTXRx4fm0I506ToI165dJycnyz3vVM65c0SPHhFt3040d67u5aTKC0iJ9mhY1+O6x3TkyhGN9zaK\nHLIvIY+ewRbX7kREh9MPU3hyuLnNsAjMHgXE842ln3VF1li+o6KCqEcP3SP/eJ6nwW8PJqyAZUlB\nuLq6YsMGpYRwTk4OvOr1DIYPH47U1FRjVS2JXp16wefWb0jXI6y6dWvg63FfIWhAkORnuLu7Yu/e\nTzB5cpTJZnpEhLVLlugkF1FWU4bFSYvRseMNfPjhSmzdugK3b2uPs1+VvEpNKM+U8gIN6yp4VIAD\nlw9o/Dvd3V2RlPQJAgKiMGrUCrw8czaGhz+wmBn2vOXzMGL6CIycMRKhEaGI2xhn1ENa9EFMfzIH\nBrWP4zT68nVCw5F1JSU38Ne/rsTo0brlr3Ach2k+02F7RaJUgOghQwQFBQWKFcCwYcMU/56amkqL\nFi3SWMaceQDJyUR37uj3DJmM6MoVw9gjdXaz9cJWir8Yr/P9CbGxFOzkREf2NT8r53mewhNWk8fz\n83RapeTdz6NH1Y9E2a8JY8z0cm7nUJ1M++ytqc9MjTkOaZGKmP6kL1L6hUHs43miw4elz/7lVFcT\nHThARNLyV65du04eHvMJLt6WtQJoiI3KaFdRUYH27dubqupmqa6rRkl5CYYPbxzeKJaiIiDo4wKU\nVjSjCdIAnhciw6oNII3v3c0bns6ezd8IYTaUuHYtviwrw5F165qdFXEch0sxdbj2Zzi0RSpdvnNZ\nsQ/i9pQbnFpLPMjAyKxKXoXc0lytn5tS+rk5TBlFpQ9UXo7EBQt07k+mhoiQGBWlv31lZcCOHfqn\n7XKcoFpYW9tkBODHH6tLk8uvhXyhVUDJp5KqN1kegKenJ9LS0uDt7Y2UlBQMaeKE88LCQlOZBQBI\nL03HNxf+g+9f36L3szgOGPLPL3AocwBed9U9U6qqikNBQTuUlpYrVpRlZWU6t8WKqBXILspu9O/9\nuvbDyoXaN92PHzyI17OzwQEYm5mJPVu2YMT48VrvB4Br16qgKVIpL68KhYWF+Or0VxjpMhKvPvuq\nTrbrgpi20JUvX/kSkAn9bdnaZcgpyoGtjS0ePX6EdvbtYMvZNtt+puS98e8hKzkLlW6VcLjhgJkT\nZqKoqMjcZqmRsmMHfIqKhP6UlaVTf9IHMf2iVUoKjv36K17PyhLsS0/Xz74vvgCKi6WVVeXzz4HS\n0ia/VxMn3kdxcZVCFNLDoy2Ki6uUZWonAjgvvm4pqxZdUXUB5eXlUWBgIPn7+9PSpUu1arebwwVU\nXk7Uu7d+53EaAzHLWykuAp7nKXjwYOKF9SbxgHDdzA7UlIBQwlRfgm11/VJVWK4GBITpbK9YjL3Z\nN/+b+WQ3zc6iXSyqG36D327+/8nUSO1P+iCmX/Dp6RTs6WlS+8QQEBCm4v7R7XulWkbKu5NpAdWj\nz0EMDeF5oj17NG7yN+LxY6JrWs6SEdW5VV4OCINOL4mEyEg6Ym+v2tsowcGhWd/ou3PeI/u/OhPc\nXiG4jiC4DiNbL0f6v//3fzrbKxZjDwA8z9PgieLazxzE/jeWHF91tKiBiWpriSIjKWHXLjri4KDe\nn+ztjboX0GS/4Hmi//xHmOGR4PtvZJ8O/b0RKSlEcXF6WK2BzZup4KcDkvYA5GWkvDutXgqipLwE\nxeXFGNBVv5RqVTgOiEs9i94vdcaL7s81ee/588DXXwO7dulbp3CO67T4aahyq9Ip0Srr5k2U9+uH\nVJX9GMrMhGNcHHwmTtRa7u+vjcOeR7tR63ZK8W9211rjbZ+39fsjzAjHcVg4bSGm/zQdla6VFnsO\n7sQ3JuL4b8ctzvePVq2QlZqKci8vpMrbjOdBMhkcT5xosj8ZDY4DqqqAR4+Adu2QdfKkun0Q9gQc\nExLg89NPuvv0HR11OxtVDK6ueNbDA0lJ/REaGoXCQh7dutkgPLzpCEB59FpoaBSACeLr1WPMMgqm\nXgEcuZhMIUdWGvy561PX07G8Yzrdq22Sqeus90zBGaqqrTKMi6CoqNkgZCmrDX0xRby3pbtY5Jg9\n9l0KDx/qtiQWSaO2ePCA6JdfxD2ktlaY1bdwLDoKyFLh8ofj1g/LDf7c4CHBGOk2UuvnvIqyg76T\nzK3pW3HpziXFKsDpmFPTs9dTp4CLmiUd0KVLswbJ6+GuCfdZ6mxZLDq3H0Ng5UogJ0e3e+fPB342\nzDGGcogI30ZEqEfy3L4NJCSIe5CdHfCqSsBCXp5hDGwJGHwY0hNz7AEYa6IXHU2Uk6P5s/Bwom+/\nbbq8lJkez/O0OGxx07PXXbuIEhObftD+/UTx2nMJTD1bNtWsV6f2MzMWswJISCC6f1+3e6uqDP5F\nS4iNpTmOjnRk40aie/cM89Dbt4lefll7RMhbbxFdvmyYuhry++9EAQGSi7NNYJFkFGfo7KaRwtLt\nP9ORs5oPEikra77Pavui8zxPM36aQX/e/VNfE7Vz7hxRRkaTt0iVdZCCxbz0LIAW3xbaoh5EoBpx\nFNy1K/EHDxrAMMXDtX+WnS24jIxBRYVwGpVErM4FpJoeL/9pLj1+3vJ5GOw/GM8MdsNg39fxxuR3\nMNh/sFFS6nsPuIe/dNUsDOfoCMln1nIch1l/m4XnOjS9wdwIMTHjAwcKB5Q2galkHUjTUt/CIAuX\nPzAY0dGCiJlUeF7QOy4okP6MO3eQuHAhfOvj+X0ePsRRQ2RQypG7/qqrBbG3ykrl/6+np+AyMgYO\nDkD37ibtSy16ABjqNRRnbc8i2T1Z8XPW5iyGeQ/TWqbnc72QZnMBt/9+A9X/KEH5uDtI4y6g13O9\nDG7ftAHTMKib+gk9a9ZIdzHm3VcWHPrcUNjbitD/IAKmTgUui1QNrKgQ9gw0wHEc1qxYY3RfeWJc\nHB5t346jup44bwYS4+JQtHGjRdtoEMaNA3x8pJe3sQGSkwEXF3HlVF6GRITEPXvweqVwuJBPZaVx\nso7t7IRJUNu2SNy3z2T/v4lbt5qsrhY9AGhLjx/52khsS9+muO9e1T3F9cljJaCT/dTK0MkXceJY\niVFs3LMH+O475bWLizS5CRkvw7SfpqGwTGI2LMcBv/wC9O4trtz168JJ1WaC6lP3vyovt0hpAaCB\nvMCaNRZpo97I/yYXF+UxalKRTxiIgN+1H9GpVvfQoUB+PgAgMTkZvg8eQD7t4AD4ZGUZ/oVpZwdM\nnw4CkBgebhJ5C+J5JH7yicmkNFr0ACCP2nDIFw7+kEej1PF1KCpTujtqZbWK6+vXCbj/T+By/ez5\nogNQshhFRcZp6AtYiz3HP8SoUYK639ChN9CUDJKqW2vigokKt9bCsIVImZGCbk56nH8qRbWwb19B\npMjU8DyQn4/EuDjlUj893fJm2FVV6jZeuKC0sbAQyG4szyHHlEt9KXUpypw6JaweDU1xMbBuHSCT\nNbYvMxO4ckX4neOESUj9wJN18iROeXkhbMQIhAwZgrARI5Dq5YXMEycMbyOE1Z3v1avGG2hU69q/\nH74w4qDWEMk7DkZC7EaGLtEoN28qQ5CnTAkjoIzgUh/H7jKYgDKjyBhcu3adugz3IzydrnNmn8FV\nH0tKiEaNMszGVX1GpUk4eZL4SZO0SwtUVJjOlibg33qLgl94QbONv/xCFBmpvPnMGaL//U9xKVWV\n0lQKmIoysbFE1417LkIj+6KjiXTY2DVFhrip5C001tWnj851WW0UUHPRKGPGEOXmCr8rUqftdxL+\n5kSwjzHagStStD3uVd6jQX6D1JKsXpr4kvQOx/PaY1HFUFlJ1KePcAqMMaitJfr4Y6KaGuGa5ylh\n717NqftRUUSjRxvHDpEkbN+uu7zA8eMK6V+e5yn4+eclvVDEvvR4nhdeJKp1paYSffWV8qYG1/yp\nUxTs6moSvRye5yn4xRdN0hZiMZh8hNS6bG3pyI8/6lTeKqUg8vJuIP7HbDxV3B/792RhYD8vZGcL\nqdNvvCHcc/So0u0oT53+17+24sTZ/hj2zhWsXq37gStEhHUhIVgUGdns5ufx8wmA668AVO8jJJ+v\nAbACgCCdXMfXoW/nvgCAL1O/xJCRQ3Ax/aJCkuDT6Z9K32jlOMBTN2noJmnbFjh7FmjXUK1QHGrt\nJ4/caNtW8LcOGSKk2LdqBXAcsk6dUqTu19TUoHXr1kLqfkEBfA4cUD6U5zUermE09u4FfH2B9u2R\ndeGCZnkBTfIHI0Yofk2Mi4NvQYHaUt9YcgmJcXHwzc9Xr8vbW4j0ktOtm9p1Yno6fEtKTGff5csm\nqUssWuUjjCBvobWu1FT4TJpk0LpUK7AoxIxi2g5QiI+/TsZKJxCzlH519DuESeruHExqQ55/H6q4\nZ0/WHtqVuUutnEGSrC5dIoqJEV/OyKi138yZQsKZDmid6fG8sBowVnKOJsLD9Ypl17jU9/YmPiJC\np2QpnWe9U6cSn50t2oVhdreHiLpafE6Erjx8SDRunLAS14LVuYCkuFj0gT9xovFSugmuXs2j1j26\nqrlz7Ht3os3Ho5utS6rqI8/z9PnixcRnZxPpuHQUzfz5RGfPKuvS8cvKJyWpuxVE6G83+UXPz9f4\n4hRrX5MY8OWn1a3w/vs6ldf5pZeeTgl79oh2YZjd7SGiLqsZAIiEPaQmsDoX0K1bPDQdoFBYgput\nmgAAC5dJREFUyGu6XW8Sjx+Hb16ecqn6/ffwmTVL6/0eHm74ckko5hybC1mvWtj+YY9/LwzH+yO0\nl5EjVfVREY/u7W28ZaO/P9C7t3pdEyfWj7/lgFP9CWDHjwPbtgk/ABKvXFF3Kxw4YJhltGpY4g8/\nACUlwLx5je2TCs8Do0cLf4ebm77Wal/qt2sHRYT9wYPA4MGAs7PuD87LAzZsAKKihOsBA5C1bZto\nF4ZFuD3MpSBqyXh7K3/PzTWMa1fKQGRMLGoFwPNEe/cS1dRoXqo6OBAv37TU+gjp7hxJm30SN9PE\nwvM8Bb/0knpdZ84QjRypvKmsTIhCIhMu9e/eJfrjD3WpAEO0hQHkC0QRFkZ09arGj7S2hfx8WQvW\nMTI0VrUCkFNdTTRihNDXVbA6F5CUQ5RFwfNEixYR3bzZ/FK1Cd+cFM0cnufpXx991PyLKy9PEeKU\nEBurOODFWEt2OartoaiL57W+fEy91NdoH5Eg9tUEam6jY8cs42VaWqqI5GrUL/bvFyJ4rBSrHACI\nGvVLnuetTwtIHtETEBCFUaNWICAgCklJukf0aKS6WjilBRAiaNauBVxc1JJP5D9qyScffAAcOqTx\nkVI0c7TKH2RlCe4BOWlpwKlTimzU12trARgxPR7KzNdGqfiAVinpZtvPFPZVVQnLaPlhHjIZ8Ouv\namUVbqO9e4UU7nv3DG6faDIyFNnYjfqFg4MQNcWwLlQO3cGcOUiUqs9kiMHIkJjrSEgFGRlEs2aJ\nL1dRQVRXp7zWY+ao5r7o10+IDpFz7pzGzd2WtHEnBTEzvSbtU/1/KSkhmjxZccnfuUPB7u4Wd1as\nHIO7tZ4ArHYFoAIfF0fBL71kfZvAckhEbL7GMnfvCrHo7doJ4k/R0eKNcHBQ/p6SAmzeDMTE6GZf\nVZVQPwBkZyPxvffgm5MjbJZeu4ajtbXKzcGBA9Xjt+thG3dKdLavc2dg927FZeK+fSaLzZeCmuSE\nBdrHMA+JPA/fJiRHmsSgQ1Ez8DxPy5cvJ39/fwoKCqJ8DdrXUkYxvdLc9+0j+ugjov/+V3S9WpHJ\n1HS91eqqrSU6f155782bRL16KS75ykrFRq6xY7BbEk9Syr8ULN0+c2HtKwDVfmHxm8BHjx6lJUuW\nEBFReno6ffjhh43ukaIFFDxokPoXorSUaMMG5U0NrvnbtynYzU1ZxghnlSrqqquj4KefVtZVVUU0\ndKjSXcTzaq4jc7hXWgJPUsq/FCzdPnNh7QOAar+weBfQuXPn8Gr92ZsDBgxAttRliwqJcXHwvXhR\nfVk8fDhQvxkKQPi6qFwn/vwzfG/dUpaJjzdemnt8PHwrKpR1HToEH9WNT45TU+lUdV+oyR9YiHvl\nSaUlubVYv2DIUe0Xb0h5gKFHpKZYtmwZpaSkKK5HjRpFsgazbzGjmJRlMUtzb5mwtlDC2kIJawsl\nFh8G6ujoiIqKCsU1z/Ow0UPES3VTDNBNQ1tKGVPax2AwGKaCIzLd8UVHjx7FsWPHEBkZifT0dGzc\nuBGbN29Wu+fcuXOmMofBYDCeKAYNGtT8TSqYdAAgIoSFheFy/bm0kZGRcHd3N1X1DAaDwVDBpAMA\ng8FgMCyHFi0FwWAwGAzpWEwmsKp7qFWrVvjss8/QXVXm18p466234OjoCABwcXFBRESEmS0yPRkZ\nGYiKisLOnTuRn5+PJUuWwMbGBj179sSKFSvMbZ5JUW2Lixcv4oMPPoBbvTT1lClTMG7cOPMaaALq\n6uqwdOlS3Lp1C7W1tZg9ezaef/55q+wXmtqia9eu4vuFAaOQ9EKXJDFroaamhvz8/MxthlmJjo6m\nCRMmkL+/PxERzZ49m9LS0oiIaPny5ZSUlGRO80xKw7bYu3cvbd261bxGmYG4uDiKqNfFevjwIY0c\nOdJq+4VqWzx48IBGjhxJsbGxovuFxbiAjJEk1lK5dOkSKisrMXPmTMyYMQMZGRnmNsnkuLq6YsOG\nDYrrnJwceHl5AQCGDx+O1NRUc5lmcjS1xfHjxxEYGIhly5ahsl719Eln3LhxmDt3LgBAJpPB1tYW\nubm5VtkvVNuC53nY2dkhJycHx44dE9UvLGYAKC8vh5P8JCkAdnZ24HnjnOxl6bRp0wYzZ87E999/\nj7CwMCxcuNDq2mLs2LGwVcmQJpVYhXbt2qGsrMwcZpmFhm0xYMAAfPrpp4iJiUH37t3xzTffmNE6\n09G2bVs4ODigvLwcc+fOxbx586y2XzRsi+DgYPTv3x+LFy8W1S8sZgAwdJJYS8bNzQ1vvvmm4ven\nnnoKpaWlZrbKvKj2hYqKCrRv396M1piXMWPGwLP+OMCxY8fi0qVLZrbIdBQVFWH69Onw8/PD+PHj\nrbpfNGwLKf3CYt6wAwcORHJyMgAgPT0dvXr1MrNF5iMuLg5r1qwBAJSUlKCiogLOYs6GfQLx9PRE\nWloaACAlJUV0wsuTxMyZM5GVlQUASE1NRd++fc1skWm4c+cOZs6ciUWLFsHPzw8A8MILL1hlv9DU\nFlL6hcVEAY0dOxYnT57E5MmTAQhJYtbK22+/jZCQEEydOhU2NjaIiIiw2tWQnMWLFyM0NBS1tbXo\n0aMHfH19zW2S2QgLC0N4eDjs7e3h7OyMVatWmdskk7Bp0yY8evQIGzduxIYNG8BxHJYtW4bVq1db\nXb/Q1BYhISGIiIgQ1S9YIhiDwWBYKdY9rWQwGAwrhg0ADAaDYaWwAYDBYDCsFDYAMBgMhpXCBgAG\ng8GwUtgAwGAwGFYKGwAYLZozZ87glVdewbRp0xAUFIQpU6YgISFBr2cGBQWp5aE8fvwYo0eP1uuZ\nISEhOHHihF7PYDAMjcUkgjEYUnn55ZfxxRdfAAAqKysRGBgId3d39OnTR/IzDx06hDFjxsDb2xsA\nwHFcMyUYjJYHGwAYTxQODg6YPHkyEhMT0atXLyxfvhzFxcUoLS3F6NGjMWfOHPj4+GDfvn1o3749\ndu/erVBeVWXZsmUIDQ1FfHy8mhBbSEgIxo8fj2HDhuG3337D4cOHERkZibFjx2LQoEG4fv06Bg8e\njPLycmRmZsLDwwOff/45AGDXrl3YsmULZDIZIiIi0L17d8TExODgwYPgOA7jx49HYGAgQkJCcP/+\nfTx8+BCbN29WE0lkMAwJcwExnjg6deqE+/fvo7i4GC+++CK2bNmC2NhY7N69GxzH4c0338ShQ4cA\nAAcOHFBoqajSp08f+Pn56SxJUlhYiHnz5iEmJgY7d+5EQEAAYmNjce7cOZSXlwMQ9K62bduGWbNm\nYe3atbh69SoOHz6M3bt3Y9euXUhKSkJeXh4AYVWze/du9vJnGBW2AmA8cRQWFqJLly5o3749MjMz\ncfr0abRr1w61tbUAhNPW5s+fDy8vLzg7O+Ppp5/W+Jz3338fU6dORUpKisbPVVVUOnbsiGeeeQaA\nsArx8PAAADg5OaGmpgYAFO6kgQMHYt26dbhy5QoKCwsxffp0EBHKysqQn58PAHB3dzdASzAYTcNW\nAIwWj+qLuLy8HLGxsfD19UV8fDw6dOiAdevW4d1330V1dTUAoFu3bnBycsJ3332HiRMnan2ujY0N\nIiMj1Y7jbNWqlUKaOzc3V5RtmZmZAIC0tDT06tUL7u7u6NmzJ3bs2IGdO3fCz88PvXv3VtTNYBgb\ntgJgtHhOnz6NadOmwcbGBjKZDHPmzIGbmxvq6uqwYMECpKenw97eHm5ubrh9+zY6d+6MSZMm4bPP\nPkNUVFSj56lu+Lq7u2PGjBnYvn07AOCdd97B0qVL8fPPPyvOXm0K1WdlZGRg+vTpCoXXrl27YsiQ\nIZgyZQoeP36MAQMGoHPnzvo3CIOhI0wNlGGVHDlyBFeuXMEnn3xiblMYDLPBVgAMq2P9+vU4ffo0\nNm3aZG5TGAyzwlYADAaDYaWwnSYGg8GwUtgAwGAwGFYKGwAYDAbDSmEDAIPBYFgpbABgMBgMK4UN\nAAwGg2Gl/H827qoWdm5ZaQAAAABJRU5ErkJggg==\n", + "image/png": "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\nIk4AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -4430,16 +4435,32 @@ "def plot_times(times):\n", " plt.style.use('seaborn-whitegrid')\n", " X = ints(1, len(times[0]) - 2)\n", - " for (label, c, *Y) in times:\n", - " plt.plot(X, Y, c+':', label=label)\n", + " for (mark, label, *Y) in times:\n", + " plt.plot(X, Y, mark, label=label)\n", " plt.xlabel('Day Number'); \n", " plt.ylabel('Minutes to Solve Both Parts')\n", " plt.legend(loc='upper left')\n", "\n", "plot_times([\n", - " ('Me', 'o', 4, 6, 20, 5, 12, 30, 33, 10, 21, 40, 13, 12, 30, 41, 13, 64, 54, 74, 50, 18, 40, 25, 50, 10, 10),\n", - " ('100th','v', 6, 6, 23, 4, 5, 9, 25, 8, 12, 25, 12, 9, 22, 25, 10, 27, 16, 41, 18, 21, 45, 20, 54, 21, 11),\n", - " ('1st', '^', 1, 1, 4, 1, 2, 3, 10, 3, 4, 6, 3, 2, 6, 5, 2, 5, 5, 10, 5, 7, 10, 6, 19, 6, 2)])" + " ('o--', 'Me', \n", + " 4, 6, 20, 5, 12, 30, 33, 10, 21, 40, 13, 12, 30, 41, 13, 64, 54, 74, 50, 18, 40, 25, 50, 10, 10),\n", + " ('v:', '100th', \n", + " 6, 6, 23, 4, 5, 9, 25, 8, 12, 25, 12, 9, 22, 25, 10, 27, 16, 41, 18, 21, 45, 20, 54, 21, 11),\n", + " ('^:', '1st', \n", + " 1, 1, 4, 1, 2, 3, 10, 3, 4, 6, 3, 2, 6, 5, 2, 5, 5, 10, 5, 7, 10, 6, 19, 6, 2)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I asked [Kevin Wang](https://github.com/kevmo314), last year's overall time leader and my colleague at Google, how he manages to go so fast. His answers:\n", + "\n", + "- \"My code tends to be eccentrically terse.\"\n", + "- \"I save the most time by just observing that a problem is an adaptation of a common problem\" (such as a topological sort, or a search problem, or the Chinese Remainder Theorem).\n", + "- \"A lot of it is just finding patterns and not making mistakes.\"\n", + "- \"I also try to minimize the amount of code I write: each line of code is just another chance for a typo.\"\n", + "- \"For AoC it's important to just read the input/output and skip all the instructions first. Especially for the first few days, you can guess what the problem is based on the sample input/output.\"" ] } ],