From e7670ee35038da76ea964241742b83886a86b2a4 Mon Sep 17 00:00:00 2001 From: ProfJust Date: Wed, 3 Sep 2025 19:11:32 +0200 Subject: [PATCH] oj --- chapters/chap01.ipynb | 175 +++++++++++--- chapters/chap03.ipynb | 274 +++++++++++++++++---- chapters/chap03_stack_diagram.png | Bin 0 -> 66499 bytes chapters/diagram.py | 386 ++++++++++++++++++++++++++++++ chapters/thinkpython.py | 93 +++++++ 5 files changed, 851 insertions(+), 77 deletions(-) create mode 100644 chapters/chap03_stack_diagram.png create mode 100644 chapters/diagram.py create mode 100644 chapters/thinkpython.py diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index bd3875d..8b4f5a4 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -1,15 +1,5 @@ { "cells": [ - { - "cell_type": "markdown", - "id": "1331faa1", - "metadata": {}, - "source": [ - "You can order print and ebook versions of *Think Python 3e* from\n", - "[Bookshop.org](https://bookshop.org/a/98697/9781098155438) and\n", - "[Amazon](https://www.amazon.com/_/dp/1098155432?smid=ATVPDKIKX0DER&_encoding=UTF8&tag=oreilly20-20&_encoding=UTF8&tag=greenteapre01-20&linkCode=ur2&linkId=e2a529f94920295d27ec8a06e757dc7c&camp=1789&creative=9325)." - ] - }, { "cell_type": "markdown", "id": "a14edb7e", @@ -100,10 +90,21 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "2568ec84", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "42" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "30 + 12" ] @@ -118,10 +119,21 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "c4e75456", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "42" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "43 - 1" ] @@ -476,10 +488,21 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 3, "id": "bd8ae45f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'Hello'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "'Hello'" ] @@ -512,10 +535,21 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 4, "id": "0295acab", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "\"it's a small \"" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\"it's a small \"" ] @@ -548,10 +582,21 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 5, "id": "aefe6af1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "\"Well, it's a small world.\"" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "'Well, ' + \"it's a small \" + 'world.'" ] @@ -586,10 +631,21 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 6, "id": "a5e837db", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "len('Spam')" ] @@ -607,12 +663,20 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 7, "id": "e3f65f19", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "UsageError: Cell magic `%%expect` not found.\n" + ] + } + ], "source": [ "%%expect SyntaxError\n", "\n", @@ -1092,20 +1156,42 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 21, "id": "5d358f37", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "42" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "round(42.5)" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 10, "id": "12aa59a3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "44" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "round(43.5)" ] @@ -1136,6 +1222,14 @@ "3. If you call a function like `round(42.5)`, what happens if you leave out one or both parentheses?" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3282418", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "1fb0adfe", @@ -1164,6 +1258,27 @@ "* `type`" ] }, + { + "cell_type": "code", + "execution_count": 26, + "id": "f8cf3c24", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "float" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(abs(-7.1))" + ] + }, { "cell_type": "markdown", "id": "23762eec", @@ -1285,7 +1400,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -1299,7 +1414,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.11" + "version": "3.12.10" } }, "nbformat": 4, diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb index 5f2cb1d..39cd490 100644 --- a/chapters/chap03.ipynb +++ b/chapters/chap03.ipynb @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 27, "id": "103cbe3c", "metadata": { "tags": [] @@ -64,14 +64,27 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 28, "id": "d28f5c1a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "def print_lyrics():\n", " print(\"I'm a lumberjack, and I'm okay.\")\n", - " print(\"I sleep all night and I work all day.\")" + " print(\"I sleep all night and I work all day.\")\n", + "\n", + "print_lyrics" ] }, { @@ -94,10 +107,21 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 29, "id": "2850a402", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "print_lyrics" ] @@ -115,10 +139,19 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 30, "id": "9a048657", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I'm a lumberjack, and I'm okay.\n", + "I sleep all night and I work all day.\n" + ] + } + ], "source": [ "print_lyrics()" ] @@ -146,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 31, "id": "e5d00488", "metadata": {}, "outputs": [], @@ -168,10 +201,19 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 32, "id": "a3ad5f46", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dennis Moore, \n", + "Dennis Moore, \n" + ] + } + ], "source": [ "print_twice('Dennis Moore, ')" ] @@ -186,10 +228,19 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 33, "id": "042dfec1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dennis Moore, \n", + "Dennis Moore, \n" + ] + } + ], "source": [ "string = 'Dennis Moore, '\n", "print(string)\n", @@ -206,10 +257,19 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 34, "id": "8f078ad0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dennis Moore, \n", + "Dennis Moore, \n" + ] + } + ], "source": [ "line = 'Dennis Moore, '\n", "print_twice(line)" @@ -244,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 35, "id": "e86bb32c", "metadata": {}, "outputs": [], @@ -263,10 +323,18 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 36, "id": "ec117999", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spam, Spam, Spam, Spam, \n" + ] + } + ], "source": [ "spam = 'Spam, '\n", "repeat(spam, 4)" @@ -282,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "id": "3731ffd8", "metadata": {}, "outputs": [], @@ -302,10 +370,19 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 37, "id": "6792e63b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spam, Spam, Spam, Spam, \n", + "Spam, Spam, Spam, Spam, \n" + ] + } + ], "source": [ "first_two_lines()" ] @@ -320,7 +397,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 38, "id": "2dcb020a", "metadata": {}, "outputs": [], @@ -333,10 +410,20 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 39, "id": "9ff8c60e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spam, Spam, \n", + "(Lovely Spam, Wonderful Spam!)\n", + "Spam, Spam, \n" + ] + } + ], "source": [ "last_three_lines()" ] @@ -351,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 40, "id": "78bf3a7b", "metadata": {}, "outputs": [], @@ -363,10 +450,22 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 41, "id": "ba5da431", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spam, Spam, Spam, Spam, \n", + "Spam, Spam, Spam, Spam, \n", + "Spam, Spam, \n", + "(Lovely Spam, Wonderful Spam!)\n", + "Spam, Spam, \n" + ] + } + ], "source": [ "print_verse()" ] @@ -395,10 +494,19 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 14, "id": "29b7eff3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n" + ] + } + ], "source": [ "for i in range(2):\n", " print(i)" @@ -427,10 +535,31 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 42, "id": "038ad592", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Verse 0\n", + "Spam, Spam, Spam, Spam, \n", + "Spam, Spam, Spam, Spam, \n", + "Spam, Spam, \n", + "(Lovely Spam, Wonderful Spam!)\n", + "Spam, Spam, \n", + "\n", + "Verse 1\n", + "Spam, Spam, Spam, Spam, \n", + "Spam, Spam, Spam, Spam, \n", + "Spam, Spam, \n", + "(Lovely Spam, Wonderful Spam!)\n", + "Spam, Spam, \n", + "\n" + ] + } + ], "source": [ "for i in range(2):\n", " print(\"Verse\", i)\n", @@ -449,7 +578,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 43, "id": "8887637a", "metadata": {}, "outputs": [], @@ -482,7 +611,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 44, "id": "0db8408e", "metadata": {}, "outputs": [], @@ -502,10 +631,19 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 45, "id": "1c556e48", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Always look on the bright side of life.\n", + "Always look on the bright side of life.\n" + ] + } + ], "source": [ "line1 = 'Always look on the '\n", "line2 = 'bright side of life.'\n", @@ -523,12 +661,21 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 46, "id": "73f03eea", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'cat' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[31mNameError\u001b[39m\u001b[31m:\u001b[39m name 'cat' is not defined\n" + ] + } + ], "source": [ "%%expect NameError\n", "\n", @@ -564,7 +711,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 47, "id": "83df4e32", "metadata": { "tags": [] @@ -593,12 +740,23 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 48, "id": "bcd5e1df", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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o48+6pYtW+Y1j59++umo56jzjBkzElXPhJ793HPP2TOTkkceecRVrFjR3XPPPbHOhfd9eL0OHDjgGjRoYHPr1VdfPad1lJRkTLaSRYozcOBA16VLF5clSxaXVlmyZInLlSuX27Bhg9u2bZsrWrRoSlcpzbNjxw43btw416FDhxSrw+nTp91bb711zuV8//33bs6cOa558+aJui8pnu3L3r173cyZM93OnTtdhgwZvOu1ePFily1bNrdgwQKXmlCkkYb48ssvXcOGDV21atVc1apV3dy5c80rql27tnkjjRo1cps3b7Zru3XrZj85xrl9+/alWL0x9pMnT3YbN250Z86ciffavHnzxvg+ceJE165dO9eiRQs3adKkqPf06dPHvfbaa/b7Z5995nLmzBnqB0STZwNGkr6i7zAye/bsseNPPvlk6H7g3uuvv96dOnXKffrpp3Y9fVi5cmXr84SYMmWK3RM8Z9euXSFD+fzzz1s5fHr06OFOnjwZ6/5Vq1aZV7pu3bpY5xjHNm3auCpVqlgZGP9w7/KVV15x9erVs+hs8ODBUevH3KCNtOnuu+8OHf/kk0+i3ks/MQZ16tSx5/bt2zfOth85csTKpP7MPaKaIAq57bbb3L333mtlfPXVV65x48Zm8OG3335zd9xxh93Hz/bt28fw9qlDy5Yt7XyTJk3MC6cv+vXrF4r0gjkfTlzjF/nsO++808q+/fbbzbgH/P333+7FF1+0tlNGu3bt3MGDB73H/dChQ9ZuIv5atWq5IUOGxNl34fVCMF544QXrJ57Ld/r2scces7rwjK5du0adP9HWUVIi0UgjsEgIbV966SUzKitXrrSJ0717d7d06VL7/uCDD7qnnnrKrh86dKj9nD9/vp3Lnz9/itWdZ+MxUZcJEybEKx60JbzNixYtMsFo27atGf9o97GIiEiAxVWpUqXQd37WrVvXfh80aJCVv3r1ahPeAQMGhFJD48ePN6MO77zzjhmtjBkzupdfftn6kj7kvoTSULSNxY5nyfUYKlIO8O6775oQkH6gvK1bt8ZKSXFfz5493fTp012FChVilc+54sWLuy+++MKMC2mLNWvWhM7/8ccf1me0+8033wwJVji0hzKow9SpUxO8t2PHju6hhx6y4ytWrHDffPONmzVrVtT2Uy9EZe3atSYaGLYADCAGmGvol3CYt4wb940e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IxqffPKJ6969e4LXHTp0yA0cODBZ67Jnzx7373//21WtWtXdcMMNbtKkSS4tULp06Rjfz54968qUKeOaNm0a4/jy5ctd9erVXWogKerSqVMnN2LECHc+2L59uxs7dmysfl+/fv05lfv++++71q1be1//6KOPumXLliV4Xf/+/d3TTz8d9Rx1njFjRqLqmdCzn3vuOXtmUvLII4+4ihUrunvuuSfWufC+D6/XgQMHXIMGDWxuvfrqq+e0jtIaF8WfETl16pS7/fbb7eMrGs8880yy1ofJf9NNN7lff/3V3Xjjja5Zs2Yua9asLi2xZMkSlytXLrdhwwa3bds2V7Ro0ZSuUppnx44dbty4ca5Dhw4pVofTp0+7t95665zL+f77792cOXNc8+bNE3VfUjzbl71797qZM2e6nTt3ugwZMnjXa/HixS5btmxuwYIF7mIjTUca6dKlc88//7wrX768u/baa82bCj/34osvmgfRq1cvN378eHfnnXeGjB1q36VLF1euXDlXqlQp99VXX4W8Sv6OFBEARj05KFKkSKjsv/76y6VPn94+KQHGfvLkyW7jxo3uzJkz8V6bN2/eGN8nTpzo2rVr51q0aBFntNSnTx/32muv2e+fffaZy5kzp9u8ebN9p/95NmAka9eubdEXRoZoDJ588snQ/cC9119/vQnvp59+atfj7VWuXNnNnTs3wfZOmTLF7gmes2vXrpChZC5RDp8ePXq4kydPxrp/1apVNqfWrVsX69y+fftcmzZtXJUqVawMjH8A8+2VV15x9erVs+hs8ODBUevXrVs3ayNtuvvuu2NEytHupZ8Ygzp16thz+/btG2fbmdeUSf0bNWpkUQ2wbm677TZ37733WhmshcaNG5vBh99++83dcccddh8/27dvH8Pbpw4tW7a0802aNDEvnL7o169fKNKjXZHENX6Rz2bdUjZOH8Y94O+//7Y1Ttspg344ePCg97jjINLuP//809WqVcsNGTIkzr4Lr9fixYvdCy+8YP3Ec/lO3z722GNWF57RtWvXqPMn2jpKa6Rp0QjE4ZtvvnHz58+3QcMIBuA5rF27Nmr4+N///tcm2XfffWf34fnDqFGj7A+EffvttyEhSS5YWCxiFmCWLFlcSpA/f37zmOi/CRMmxCseS5cuDf2OYVi0aJEJRtu2bc34R7uPRYRIA4urUqVKoe/8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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "from diagram import diagram, adjust\n", "\n", @@ -638,7 +796,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 49, "id": "886519cf", "metadata": {}, "outputs": [], @@ -658,12 +816,20 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 50, "id": "1fe8ee82", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exception reporting mode: Verbose\n" + ] + } + ], "source": [ "# This cell tells Jupyter to provide detailed debugging information\n", "# when a runtime error occurs, including a traceback.\n", @@ -673,12 +839,26 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 51, "id": "d9082f88", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'cat' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[51]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mcat_twice\u001b[49m\u001b[43m(\u001b[49m\u001b[43mline1\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mline2\u001b[49m\u001b[43m)\u001b[49m\n line1 \u001b[34m= \u001b[39m\u001b[34m'Always look on the '\u001b[39m\n line2 \u001b[34m= \u001b[39m\u001b[34m'bright side of life.'\u001b[39m", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[44]\u001b[39m\u001b[32m, line 3\u001b[39m, in \u001b[36mcat_twice\u001b[39m\u001b[34m(part1='Always look on the ', part2='bright side of life.')\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcat_twice\u001b[39m(part1, part2):\n\u001b[32m 2\u001b[39m cat = part1 + part2\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m \u001b[43mprint_twice\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcat\u001b[49m\u001b[43m)\u001b[49m\n cat \u001b[34m= \u001b[39m\u001b[34m'Always look on the bright side of life.'\u001b[39m", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[49]\u001b[39m\u001b[32m, line 2\u001b[39m, in \u001b[36mprint_twice\u001b[39m\u001b[34m(string='Always look on the bright side of life.')\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mprint_twice\u001b[39m(string):\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[43mcat\u001b[49m) \u001b[38;5;66;03m# NameError\u001b[39;00m\n\u001b[32m 3\u001b[39m \u001b[38;5;28mprint\u001b[39m(cat)\n", + "\u001b[31mNameError\u001b[39m: name 'cat' is not defined" + ] + } + ], "source": [ "%%expect NameError\n", "\n", @@ -1068,7 +1248,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -1082,7 +1262,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.11" + "version": "3.12.10" } }, "nbformat": 4, diff --git a/chapters/chap03_stack_diagram.png b/chapters/chap03_stack_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..525b0d9d80acf8ecfbe570b23a64856f3bba9881 GIT binary patch literal 66499 zcmeFZbySsIxb{nT3MwpGLQ-ncQX<_V9nzh$Ksp7K?(Rk!1d&FhyQNbJ>2AKc+-ILN z&L7|RopJsS?g?C*CFC!yC};iRW_Cm{8#cwWa0of8vast z{K2A1>OVgF3TIm8-z)V`9gu(T%*W!?qW$;kEe)E@zxT&7|1^yF_v%d$NmJM zdH#K&>|^8quYWV5Q%~gln3a}`rN0*pU^yZ%;uLwc+xWy|1D_{8k)B9`w(PK5} zY0XhL8GEyNidmwML!`&X-**ol=RxdVG|dKHM_o?$50OIqS~m|#dhcc5)vLnyhLj-K zBf;g$qIXcw>+Pc2th-%{S&^IFIJR#K?`MchtT@D9QM;%1y@lvRJlP@(-jcG4SMDX#oM+k?;fi0^&va#{}I#<)B? z#o?yVK{L1KdIaBfy>KjA)~sV}eg{`aws#G4gdmRsVayxTtV4)WVX|?kZ3pU898z9v zwy!G5Ph7TgLe4#Fp@T0k7My4AE|x`C4n(dt;&zV**hgF!U1nPClE4B4Gr$+XPSH=A z${U*IeLjnR+rl&l!Aa70)!y42@!of?+jcdb|MyJ2DNRSCx6(>|-_O*8IVlt9&ng+J zB^^THs&zg);=_A;d$}GJlAQy->m*hn5B=@+Oj`w;bIa+t{LKA5SW7cT>c05g&(AaY zZ`Pi+C6_lJ_s>S~E%6Uq+#dKo3{*7jH`>-sX$+WWxJ)13Zx^P$&~<1zt3ju9%bs-Q zc;mTOH)GzkTO(h8xfT|pZns6?b$^nDKVNk|XJa9He-u^waJwn0uiGfp8lri+5vOe4 zv{$ctK2_<%b8G*{YDDzmcJ}_}AnR_=!I$Ms|E;1~;=ahAWE1OyRg2q;wg+5N6q~YY zDc%`9XR~+L<4H9Fo9W#1mU$61Y4(jJzxOT|4}6mLzAgLA8i%nxsd!pZF7PLrR_|R= z`g^(a{iXxgTm1t2?-xs+HY|+_g4_ACf6^Q>%d381x!BCYE7%Z8nN=q`l^20vPHAPU zhwBi}%txu~wuife-HZ=QefF(ae{84JHF0T6$KE|$&)9yZPwbu6u_@mTCbP%zf3&2$ z+Q(Aa%%uw(ldPRk5-MLkxCK{|rpP@6rJ?3_-TgHx;P$utTTPVcJwNdqGct?~Td)8* zwJ)`3zfW@0a5(Rj6qzf(JbDc-q~*fkyhrq&Q)s_oz2^I7rjY05Y6$x852dLFV3`SC z(~L?Oo}A6R!$<7oTlV5kKOnQM52&t@8v+-jbtANYlHQrImKy5+ zCLqTw2`$sEeiky#xb6{pP;jn9IkWG5v6w{RGO0S7YEzNoy=U_dI}nwVae(?K*gYf_ zQ&MizUCYj0k2T}(mxOk!B=(j$8CBTZo5154Y_X@nJw(j)*Uh}fd*DTrZT-!DlZECx zZx=W7Gf3%ZwcYad^tT`Nio$1;tJ-}hx4X3?_U>u-XO+HY7MbqmmTHFrUX)okU}=SJ zGeamnic9B5j+RZLgspr0{0rwD+FDq$hBgnqvMYY!a1Rnh&b~YujI(P#>NaZ69&}NI z_KFGZEjW+himP$43TToV&RLh1%i%}!5cxj8DEV~$uJM^33kzM#^-k$*j5H-_1(60< zy6c>kM0s7y`5cSqc0rQP9Pc@q8uzzf#$mQ#Qw$Vl`CK2mp9~8*{6cTL>|!s|Wt5fh zua`DwPN25v^Y=7Y(H+{=4u%eUsmLt>-BO3>xNZo%2d`S;48wCLX~eqj(KHBGwv z&FmsDyu(}_2PxrlTiF*Ps0d5mS)I$7kp83bdOcO?IjNr46AGz-Ts=|f zs}bFvslVs4UW=LyZ4#+j*i-X)dwF``*%=vWn~ETlRo+^m86{Al<< ziGX@lFjt0mWo@T|&ZTfX?t31BmL&uh zCZs2Y8ucd8pJIO?gZi-b?tFfx6fhOq+}uWuN1?-Q2JjSQiQA zZs+@7CzR^`3U;+qvY&VSz-A{GNfL{sD@nzf{`!fK6e1b!br>yARUo?tL1M!x4`FfwA+GiWp(|B7Gqm_$zjMhZIg_3R75fpA_In^SBr zN?Nz4@4SxqanV|lY5SpNePz@qg_^j=XZRhDD$u3GQy%e5y;Z~A`Z;b$SBencJhAn> zT?_hNzEhaD0#on)FhmrG_MS=50EX7Lww7unNSW6cQFv@+NmCUQc{#p%-$`{JEqwmV zBmrkm&-d=EZkLJ+Z|$viVR0m-upkU-a;{j^0f`oPwaK>hAuNDrTgLaNC;a1^P8^Yq z>IakT;B2N8ayc5@ULuvgeCnn#E?YFge=^9;ciXxk z+K}XDGIF3y0UH%ZM&g0J{O%hq+u5s~klYd9IK*{Fb8r-#wicZ}bXunw2VO? zHa1#+@DK#j^icVFT~bPJT4~SQebc{Wzv18iP@k}#t_jPK(!+i^z+YiHN$`60dhOE5 z`%&~p>g@XgHVLw?V<(Ze4#P3YF+cqvSv}ON79uAph{&F%hVZUt^`gj5P4+E-AX!U#!M6;FLhvb z$*ovb>@;}X4b2ztjO}KhQKQVjD-<71d2T4N8Qo5eNRErI5cG+Zsl)))F4Q_QK_4~L zHuzLT8T}=iO>bFFr_5b}l1gQ`lJHjV7-#8IKN`cIJQCDFZL}*(j8ziUj8O-*pj`;| zM-m)BF%I2FUO?_;EFh9WTMT8XAPIQH6v=}86s4jexUa%0aj~7d+&}~OCeF_ZM=v_# z)e3)k^^+r8`q5FVLRoFEN|Iuu`ACuLt*VEKlfX!BaqB|1+GRH%E{bACKS@W6&5REf zsMZ)V;K+7I4lO21U(1w72+P`zr}8@Npix<3K4-hI=7Nb!J-vxCd{xv-{n;Nfr)r9D zL@s;eiK!G#-(710PHDW9gmj4rf{&|S8{~AJ48lua2lzww8~;`uS`2G)NrVk2arJ&e z+AAX|TWxx*FCD?r+wIct9PVe{DD1^MgM+AsC*HQchgj(?DJnRt%Yo+Cp4y`s($N+fyo}T~i!CytgbaIy*w7{XS)m}Art4_SHG@|6%?I$1<r=p2SL;8Pm)YEsQqS_X)$!&CqCa(@?XOF!y`4yv+iv-;ujk+- zhw36qqNsd?lT%Ak>)7iNu8nF+U*Ps`w|9at%D=!h#-Hf%)U(fsWyyPe2bFwhd|B!e z91Nl|v6Rk*!s@7Xl56fAckD_@Os|63{DVIE8MNACc2s`d$Cb1soBBx0L43hEFW&OK zhCeGgm$)c`vpnk6(c)YiCkqaIQtE`TqEurv=ReeItLoLqg{Ml9_L_S0kcn;4pCjHh zQ`Yl|SYZD8ZFA&je9P&mkQS#S8{x=CxbWErbo3t%ap`0OyR1~$a%1!yV4QYdlEg^% z4CNV?TLHIFlVMcu8b{c*YaTMYGpB+RNhI`RF1;1WJ^U8E6|-^VxHXm(p=qvF5sTA1xKE0EMHi(mLE^D-pwk4Kc0 zn0{B$<2Pr{&q^|%Cn%OJ3O!mn6|F{%Fd8+885($_NLvn5MDm7d5!g8k1{n;BEoS2vg8 zW@jx@y;V8wFI@HsijsLd4~$e8l*IFW@YKqCD|Ql3(@n?*P!P2Bz1;6&^Y`=5k(8nQAE@ovs1Dhx&SzGddF3kzb*wJ(pRm)&_0$iv1w zf%!?zf6m>vC74~C8QQFCrv-EV`hD<&EVA~Z))$Q_DZ-yhBcJ(asKSrq>X*NGdB^#z zH`3}0R|FSyNLxf&aX0sN({NjGaN1FuQ;iB#B)Rv-KdzD8!stQ3Pa({pHes0lk#jOI zK7BRJL7}m8?ReJ(5xZ@J{cO>0N&RH?R6*RR@tJrk7l~eR$Tc6V9n(CvPWA0TNTd1@ z_g3;7FW#tKK_p%jo4)bYoAK{Oox?Xxq^68vgZKg3sEtoTi30JNbOPSP4)u>gv1!uO##bkWMgv$9P1a$^8yGw_05@nryum03?)SOAE zF4UVOkmt&qn;b1chvJm+i?+nHYWy?`c#v7rMjNxRpFSp*-K`wh~#YVn-tUi(B zRc$p;gp7XnClNH|l+UwmffPD+?a}}0_>jYZ9i&Yfv3XH6V?0?_FQa3bT%y8M&o*a@6B?_Bt^}neyxS#WPknKwaS(||!e!L#6aUy4 zy~Cx4z0Bi(?#oYXpwyP+5oV43s}jbjpAbUd zVxqx#rZ>(+Er|iG&M5ownk^Pcc0yj8P&WyL037wi3rdA6L%DQ~Nrmgy+t|%*i$8(l zW+Iha+$W42WEV4F;-(6)TEzR6znr)0)91TszHE{&cd-Y?xAE!h5V{hNbTl3mj*+H> zXKiL-m~!gT)4AEx$happc|Gb~ZzZiQv$;1cpl5>d%Pgy(>H|ei$C_<3W+QMdb-+w38J!>$X zsTwlf7@bu>XY5~V6|Y{?s!BEsFX{SGGsAiFXvktzFFNN$-vvw&GJGW-3Io!uaZCZNKjMFlq53Rd9Vv~f%bJ{q+93x#>3?=-+vtN~McJXqZ)e#~Ino1UEJFBY& zm1v>}uEQiNXm%iSvB4rm;<$)q43Ea#zJ#DHoXowrWA z8+l9z4{bkbKb1`3;-v0`p(lQiOnFM|K+iaCo9#F3NsAJ;HTf-o6|+#FYwwv~!jmTq z+2awB96g`IOFv}~8OkNSZr!aJNS!{A)ocwdbt}MV?J^!C-lo?ro~@RtjT_&y3jVQ> zzJA4|Dk*6 zCS>xy88qpU+`^GewhD`(c!FEm!Ds%(%S6aaw$i1fdRKn9vyF>bzZ@3}#e<;oY*9EY zSg)mRB_7vk9gnBVS@G&ra@(xk`FU=E`>5%$5_!=Av$x$I=lId%G7G-A^|fNmG3hS$Qh0byB2ka4Z3g?KJ^cZQwV3jk zZ<>>o=r%>v1RxPQ2S5=p+Fm+!IUSS6x76Bv5UqsC1$g|O(tO8;gLNt-gB(C;C6+tO ztm4jElu^+bkLDwYJFSxc6yo2wb+qs>Sg|b;FB^fCl!OYt7IR(e-d{YZt$EZ!Z1rrUXA+ z@dY|lYoF_!H-?1{ zaAtY&g-=x$FF<9Q$jKy96TqaDkNwh<$|He78)-VS;PJP7bp)DxqLynpINGqI38|RG zEPUVmCfDdb}kA{bJOkZFbK-9*G$LOu z34?@7xImrQu^W)LZ8~RdZZzQd1|DW`0)$OcW>9 zWRb2(icm-o9?vY#-ef=Z$@)qlKIP#DGi+?MS;CDO+MHn8B|C5>o<8u-oBdwAz28KZhqra+6I`4lk zAGT;krmNRoE_q4s5EfuRA|QWx+)F!uj|UfRE!Cp0Wa`ln$pQ*Yg}L0%pZYl0(#7mE+Emv2PX8Y=S?@GNjP4K9#rdk7SJy6Rat# z5TlI@M!+?o>{dvK4Sp8D4zuk2l0!St&lCP^g2{9;ImSY;kND7Zj<~e-@B>7oAtc65 z%pzczbe7@{Z`==$uk?5Rg!&w2O>_iNAkSn3jZm4Yt32((Ltk^gGZ_zaZyNqIfumKT zOUGNffJ`SrEPsUnUZ$Ngj=E5>w?Z8d>nnn{pC)(bCd3(H}^5Mfaukr zQdl}s6%BH@@hFOIFS+=0#5AkI6b7KY&({D|n_k_kU43$l#*m~o zwNFpJcE*_6tSXR4%l&skXY23gybO#0<15xO;tM}g^JJsZZ;G*#jYlGTnyrP<0O%KX z>XK`W#G;AJWCH^1+j{OUI;8<4f!*3+!P4`G;!a{s>s%lCS}{CQdZ2>a?~P0%^gS(( z*b*xYay@BlBCO#}cKr#%3|)xj5krsiW14_%CYwYawnE+d{a&%mVpgv!^(4{P4^Xd2 z9)3y)y7akCxna{5pY&NJA#8v4OU&_$nwLn2@u7R!+i9G6sbH+01Y4>AO4ElbazQoq zU%urEG_+(v1;Y+Nu_h?abH(?!4-iRb_tLDfPPO{2rAjS?W-BIEH-SS&phcbBbtQ=q z8qR2qRUI$|^zkPZ-_2cek|`h8F7?jIV!O|<=#XoY+x~`F2A4rZ(gY>Fl3-`Ux2`d4 zB$~psLS@>cU#AW*YTjUyyuXi$7& zC9}?)b}XG09XA{{Uk8Zc%DV>X?YdN41JyaK#Tf^+{X; zoh*cjS=%tVph){g%`$U?O>jPt+jG{b<-ZY}8f|YH)Pmm=SMT%lIymV9{805>z3lj* ziNBF-r#L+~AmHPNyhlHYLg+tg2PYSNrk9Os63E%v9+Dc%+-g>#l|KQt0@uBSQLH@<}e0D&m!Iq)TfYa^i zG>6s{eb-sDSvdHxEh$LsH_vqcWBa9~u-`o0se6}f`BJLB6HmyLZxN<;4&GC_oc4vr zG(laX1eNCiAjVdE`8K37uY*g^St?rD+ok44GdlGCWl(W11c z)GlA!m7)>#AF78-X*Xfe0MI0JA2gqsgQio7cjV>CshOub1#E%e;qX5oJ1wpaXq~<4 z0VcAjY&qA_P>1&pydI}py8uahYMc$uCK-4zp)^x^?p6a&0bL0;C?^nC13)Nt0rLfC zH`EZbUje|x*_(s5EMaiU&eo2Iklin5-JcfOf@7n%qV4`V+KIMAblmoFpjqd#ebb%> z_N3RobJjqjfycHjs3Rjlpns6Rz3o_|yC4<7Nlw_lSJ%$CFx#?{B-NyNLH-cgH|*MmTH{sRz?Kjao+9NBWFlo7Q2+Nv z0Gt@0cF3S(Dn~p42vMLkH>WBhHh*=%Fd{!ugN{kZY8~t=2Umbd&Ht0s2f>d16Vv~& zmM_2lPeyO_J3`wcgD2daYe$ZzAM_>ko}i7YwZA_9)~0`xvI~(NUs?N3*mcdWesa`9 zrRhUPFWZ@jiBci^pz^vf9Clt=N&@~NpLdo?w+fx z|211qj$eUy6#v>Mj*LL#X@yE!o3LyXR?|fpRf5w_e9^%d;7N?WI;*SnWbAp~=&G*(nB8Km_&JSBK?R{XKV3`N-r}pYk8auI329POg!EnVS z1hxe_%u8+ip!C~o*K3cXuBWw1Sl#dKIj3U0IXZE;Kjv2NVrxuj+tp3gNZ<+35i?eP z7_oNQw)a_vlX`5^xT_vcvwky3mF1b|EwF81bU8fLbL^-}hu++jzPq!=h;@GP^=5YH z7MN}NhXD(>Ew7u#S`JzsaDP4OIU;<47e~|y;AX|nLB=_K_K$b2h zvhJa#bGxlK`!1qkD|i$IU|^~_{{VZrCFTwHgk-radtaD=2VY4>v516Yz>WxKhj^Z9 z%w6qa)Srex+5+n8#*f~5R_}Qg!H~O zZ=t*c!k%~Ojd**K@j5>E3jT+vJ24Fkb|fCr+g1G9zZFd{P$GpetqB?$ff=p`)A1y? z;l)jupB{@=Vv3j)d}#MxzILxFu~l2_0bI=+p-`Gfx-roC0+ z`_s=-iQ_8*I)_?dYY|CNr zko1xCwAvwFU4Fi+7E_Hi02(n!RZJfj)OC)V44ubBU=Al00Q*Gyfv($XP_2)l?i%kS zR-cU+=^rDz7MY4Aw^=s=Thy`;A5dkj$^27+*!9hk2O{-0rT?@Y8UN$3TL?87{WZC8Ac2{(gV^o@b>~_*|~Cd5a*D1_;BuDlNe|ogAlKQD5^|6K)jS%Rs zckY{f@C5xl^XRPHs?8(v>%Grwvv4~iJuoT=20xP&l<^7E<~r#T7t8K}@jFKXpX)>a zWGB-rY5!r#>+e=QS}i@*7V+->s81Mo^}4fh5hH+QD(`^D4r6juTxh2_4-LiIc;)j6 zHyV2{ue^=nq(rtkkUenKOpiBdQ&>z@z6RJpmAq5I!7JeiUGCWAPI=aK3JItxU%7*U z8Me?rm83Y^TwQRA)_nf#4NmeZxcRopb>a*t;si(-d(>jFXwjH&IVD+rMYwt5OSs6x zVAeW$?S|<({Z9Sp3%T%NQ=vRGh1nMrKB0;u7f`7}{Dd%gkKL`Z88XvM)!wtcMp-rh zyU>=d7hjOzatPgeTs#CgtoUvP@C0RIdDz{lR+a$qf+AgmoDIS+eA%z55EpftMU(oG(TP>k>pKRGeFQj1aPwMP; zTq2vQuW`<}F>+tq%IDGV^?hUnPl=>so@#lTBH!Xyt5H{ug3TU7bkh{1*M=|9b{QLW z@#n`Gb!o5Xm+zkhAg*M}uM`qiq(IYlHbo!Yr(e`8RJ302Aa0HVQ=h@b9m*z#o4=Sx zYvh>YRHZmNn0|gk8D;JA{z!0JQKaSKx#;Z1ogPY2q}_&!6Hb&RL)4zs2_#2$`I>}; zD)~O2KnXqcw)OiKwSEMQ7thIccQOd#2M$I^zUGL%pm@EsTueJ_SGGI8d%@`)pd>(H zKa4r-ZvA<(^I}gbg76kJ5anieqkZo@whPkGva~2dti;R+Z;eEuvF0SOnpCx>@gJ)w z_*yw%=4U)#JDq)+lQ5;`{n7GiFimQfhnP048xM>lFm8MgDWFlf^$A} zZFDG-M_kI9s*C#VATQ~#ASuky+K?P(`CEWN7IF`-6S^scm#}`RvGJB_YI>O@WgCt7 zgi42TjFMZ0p->l842J4gihP>>&ln}qB-3lMJERFhwkiK1yrQSY8520-h&$hZs{3zE z@?cF@-7UT%U@<1^H~q_TSCn9gJK>(HIAs0gD}}8>r?DW(W*^*RW&M#rWrd$$!=zE; zTmG3ve>xRPFNPOUblG!UYv;%$TnE+l%)TK08&5T^U0Td#rgJ6yCgs-w)qW%8* zm+hYHKssOm(V{J}TeS4*F;2-~)OAddI)!%^X~E*pKR;G#{Qi}Vq>EQ&LKNoFN4?z* z%{A9jESb89F`AI!E85O)E43A?nQAvH71y;sK82*nDJ}9xAVGszz)lL0j&+6(ZM-QcAk$*ojLMon+6QVOnE{vEV4GWfH;j>RhgAd|lTy zi_h~NU%=cRTHm;H@$UDS2a%!StDK4?c+(TpIS7&U?&_!C9{(EXFU7%f{?m#v{J2&J zi*`HE-?)o4Ye2rG2bybOI<*4YL)NoaEypJjSVyk9bKjM|<;2t+kcBq#+=n%dMspIZ zKE~1kCMxyjUBSTmn|FDOjaX-+h$boX4KTJd2_MjYTCh|!81rf+8%REhLJe*TRK0@R zh2c%n-+h3Y?ie}1dCs2XL3PIXEcENS+;tP&M*8OA573*3q+UfQueCL=y`|Dn5M2F8 zR0C?^bCgxM2U$h$TZT7fAP@Nk*R1EzxjSTX--UobBQYtnCn8@mpQ&n4*opsd7kmqC z0MCC(CEOaUq8t#=Hpxr9ZZ??Aseg03=sI6szrm(PrDc#{oYyisw9QIO=<gEuW-}WK(A! z9s9l>DfHw0PFa~6adA$qOc5M14Y%Gb9-P~4+!vUo&i0Cg2kUw3-U zfJC#+{H}#Rgdx>3R|oCUnKy*yW-nI$Mai8ze4v-=&qiJYYb~3>1=jjND~E}9tFO>7 z^bv&%q(yRzJdRDm&JT=@O^3qZ_QQH}KWkx{0~|$>?~rY8bd7mN`GqoHcBBhz(q^NT z?Pv+SlDibvFaxCts^A*?g>I-$@2RCVm} z*QVuF3I|{>2`V|p7$Q?#JkNB?t$#lWq>PypyNwUsyO6{X2L99$5}KPpKL*6%WXUmn zp!*wVl-L7LFWZmm74E-}Pky_petJpS12>T`1nNj~M0)TMc90KY5DyQKT0W}Bz=fe`#UJ(W7YU%$hs4YCrRsI#gL!U4MCpcD zv!M4DruO?fW8jIK{N*j0KT1GD^JU~NQ6#GWW5H?Db`>h7Cslu%<&j&`wx=2V3gZ)Dh zz+k$l@-w+n2xalocXHkxo)odCvE%_mQ*=fzZ*ApeM%ar+%U`aABa6NdcgQt4Pe8v! zfIw~)h=;P$ixVD*m)^6B9Z7Vs>aqSywTSIS(NY=Efvrs84+*#ibr2hdJM>#^} z3$Zg8rJnSC$+2XnO&(zTrgtfXO9lI}y~`2gmyJFPRmTAvh>alMNCzupBiEK-r>bh< zSVPw?;S5_|*cq48EDTRrE$7%@1?edqmHM^IR9@VH6X{XKo##OdABsQ&`k|ca==Ui@ z#YPwu5h^&*9LjOFEiHPjS`Vu5hj=HK-wB$*Ok%*1?^$lHBGMV;!6ACpr~Hbe90!SR zl48xR<|jW!G&Ge<%G`)A;A5V26y8LW>yrB>0mAc96_}Tp*ypm$7!A{wG;lo8k(R|s z5xm(X`=>dT5<+sUQa!m%A@Swq1TnmABO*5+HJd0z3?Qi_B@QmAnLfD;INFaC+^L-d zS#gn&xCc2TFc=@{8OkZP#c*~{;vjLgT~AfMLeFZ4`^{_MB839y`X)4cbl_Sr+3^Qv z?cd5a5tQ~z_EI`H8+9p)jh96Dw1VRw8A9d5Z_0CcSEAf0Ld_CnOREuJ-1wF+pxq0t zEAWbvc)^V4MJqOiN9Y(_a?8QPUH<+Ugd@~06|iuL$Tt?&(`iitpZzpNeUz>Z3V5wq zl0NT3po!C(5-;>o!g2C-Z@6o*zmXTg5GG>tQ>|VBD3>F zs*8laL@s&SWnA`oP*&g1Sh3ft20qQ zz5Dxa#^(UUE*EQ;St6j7ZTB9oow$6a(&SFB|22-F_c-xW3dJ>>!cP3U0|Gb@NBeSs z-~($SV&4Ln-h0`-)}E2r{6BDZ@&w?OWF3js)*&4bmyd!xNA$RouJKbW;HvaoAMP&j zFPlK(imnNq_c!&5U|)QJ$2g^$;n~W6dLz(GY2ey_Etpygm(%i%wm?q=7VZ0pcZGdD zJTSartr9B*eKWq9Vv%VZfO-G0Hwxj|;jO{<1p?XBz1J_J5Hk=~bUe>`xP1tV1vk|M1f=rcK02SBd5vW3$ncw}w2Y5C6H732yn;L;TK z!yY)lll8$|I141~ST+DT{snAzLFm@@5=SKLSuQ-pDIxJa6Pvvm7|g+_r;QF%9D4u@MKH7#Y>PMa#@CZFQ%7z?)z=d zZhV0OYW8X~E2|u|1hZgFp#0c4y?u+_Egervn4D;deH?*;K-62Un&MIQCN z1udtp$MBdXTRQR^Za{P%{KO)lByeh`L*NJw{vqCFuM;@mE57rsg%^7$T>y_ohKmNq zYXaLVfUig)-{EOqjEbuF1C>5!r390PR-K@~aBpubs8!y~^26z%g!I9&(K!H6z+G62 zu|e=DyNZ!EwNt#&n3zR&D(=BIVoCmJAa}%}2Mlu=Lja1-^3L1F>4RS`$EOqYgHIy| z;9=2!+|w1@C5z>&;SWEKDmQ^-jpttm#-SGq+E;))J;M6Y?Ys^$_e1bb@34t=W5$bg zdiieu!>p3f9mu&P2Ix%>+L{D77v-@ ztBKoiU85pc*|wU0^M*}%-H**fcdvc0S@sS+DLuAwD(ppjd_hL0m?99KRfh9{rsG+! zVK^i_3|~w6!D$k04*D*85Lxz`{gB<>2B4T!1*N~Z&Swxij3vg40Vxz%6a zv)t#+tm87Jj-91!rXk}2M8aASDd*CA4sXTW%zf9%mV3eQTDe=0WMFMI|I0yPXaPP= zIwy3z5ODxE758T4Y1?Jc83ujH2(v)Cf?qJTJQNOHJRU)di`m3`04;g&)_NmkZj-;& zFrgyuRSb91K_lJyML{So$LJK?PCl>hH}Y%=aI~1?oVAv7cX!|`3PXW2$-@tDSVlrf zp#Yt}Y9c_DEJ-{$mBYL;3JR7GhqV1+YTZkR4E~&!cGyDphjaU$E($6q!5j54S z$siJIGYh1ptVP&_B63aq=|i>kI6Trv{pknKkF)l$U{-nDiT29P>%W!whz-6V?HUvz z9*H_L3-pG^5Pzu5M0k}s|Fmh~Z|qv@jWx=V7S1K*t&c=*D@%RCjn)l?@YMNS7PwOd z2^#;r2mio7hB08#Y&6AVm`HRlS>VkbL4!Nk8b3lU-1XwDHuoKTZ*&{l-m?#Rf??}N zE%Hlw%-xMj=L)<1@9>1_LYnVkAeAYIhWGo4sfR|=j$qxM7Ksjl=dY!3IVJmjqwiHX z@rVZ!F&w7yKO~BAjF8nItcFnGk>?y{N!{+BQ@jdq&l24dMRJf!jY|A{{ z{)|Pg2^BO*J6AZRfB#nNU}dAo)kjC+jgBSK}4`Bg9)ZV)ma zKQ(I?nAkB=c%i*+7-K1PRWVekxqk>a>|fzo+w$v>L?hvW&5wR9AvKK5i8nATSH z`p{!68@Mwg<`wZB-E&B1O1Lk)2q&S#Qz)M`rbp*Gh^?7l1-T$#)Xn;?0`QEl%EDOogV)Fi06< z3N36&%rBo&D=zX>y7?RUXwLYe{+IFkt?#)n&Ln}?^SD4i)>$N!_ge@=7^_Qz-szEd zABmJmT0NK0$ZQFa=oL(UlfEu;`jcW|f9c&P_lz1XQn*djWmFs;7vQI(je9W$RDWwU z?5*Y=?`alW?w&MH&7W7*z0blv-jQhHn>^H5Q(U|%B#dKIgC|ylulSs*!ba99NA8kG z!bVh(nE&NfKZ3mK1}RysR-o5Y-Iy67jE2@IDeCfUf;RgkG!vel?}bJIIC_O``Yow&2kKKOAYhc2KAsN7;-$2hTPsb4R z0=tNjA=R*|W6N}I`j`^@vzkf_H?A(fzu}SdU?$gL-s-ay*d%Z%YIwRKWQStMpJbA# z0v>>Cg?5cjBJqyonAjcl(cl%crc$w(q3ES=TYf!;xG6jfQ3EJkWUC%IYWRZhVS_uU zh8QGHR4am;2ccYC6YY5Z*)Lm1fF=w#lkYC z-q8YeQ=zu21i1oJ{}&_QOy^;Nx^~nHioy}%Deb%yrR_#28hH$@+U2$Qsa%979TbHKJz}_sCGbBx(C(eGLOdd!d3UQ&lx~5jHmTFqN*_&l z(1gQW{Sb;aqa%qX3*1VNhn%f}20?L1>BBz4l*x_~QNQHzm*a7ib1`86M|xCx;8*PN zb;XrP=TG9Sj;$4-Z?>DEr=!LCs&8Bse4qiN;Q6ugY=%kO>Sg7`-fHc4b2o#DeHz_F z6TOcY?;{C|SGoD$UGCnBm@J=&1bCWGR}Y~e35lyjCDB=Znl8%`e=JR9_30KQ&B;%f z`vOIFrf+wAWw!P;7yXUQ z!x}OmFq*FjkVx41}kyt`?;?cSC95-kPASE=nqD1r&r2R({%BG_8;G=}x-c(xUpz|`UI@wwbx@p4iV zrQ}~}s0jmcQCPwX{}duloTf~^D1`lFdaR%pPWqYf!c}md6WgMXKB>&?@rEY)hIcis zvh+)RifRhe6=+(8JOYdP_v0J);H17Ut3FSJW>q}~=e_T7&}u~1-NiL*JSvAwbT}?L zKt%T5UFwjf+*5*ZPD;%e6Q|32(Dmzk-%T&$&^PJ4Qcddsd2Y?!M`#-v%DLtJ-x9L5 zs)cNO*fp)WuvDG4D*RuYXH_kF7u1GHm0ieO#U?As0js9Md_U^q&6~J;pUFZxCbGxr z(}dVCmwEw_CYB@Qyhesxllj5uq1nhKKg+m57m|XOdo?(yH0NE4CZc6rYCy!|5uupvEowmqod?r?LQw*F^3S^` z6~6ut_TDle%C_(Jrb|+K2q|f#5r!5S8VNx_M7j}>l130vU?}O%0VJeLY3UB>Qd9&f zMHrB9AE(zH*Zu5g@Autb-~E1)4Y;N?}NuIIaDxKf8C4A#0H6mYU6)m8&9(iXX=^0ceoxD$c$iFV9FnhlO^WAR^ zmF3L$tm_}+)+-MHOw&s16pwUX9-*Oe5lnj9-Rr___ZWnDvIN@bou-C63| zKJO%2(|C*BAfs`@#X6e4bn6=2bNP4c!lZMOK@Wk~B$1GVw-)hiyuhuzf|m+5Frya@ z_LeGH^8E^k02(2I#O^^Vd#yVDX>$_HJT@Hr^r83mt$GQFZ1Y-GZj-V9Ikrm{$CI|~ z(Hto(kO4xwIlk7!y20U{3U9)#?+4}-FCa9nqCbm;3TWC$B>n zLqJZYOutWR(PayrS7~@m-zn$(GfO>r@Rf#>;QL|XZ^elIV*AYKMQLj$We2UiT9d#& zjl>Au(TwvbCL8!;WqbP{QC*l*67;96Mm?tfD7PZyA#Y6D&w@uJ8u$BPxDE&5zQgY6 zJ11r$FD=_(FpumRZq+!aH~mywGntSW>M3Iq=#|JS#+dxzJI4z8^jo+#%wfBRLZv6e zW|5xIju#)P1m}$T@m>9%4<99?i;t9X*;=y%NCZa_`Ih`i1UEl2Aqn^-EF=uHkN5D` z)|8*Wy)VMdrhERuB-R*a^XM-oefBaP@~hZW6u)g7l&5a>XojoT zxNL1lAddytkQmfm5%rhU#?m-i5FUrTf|WhoIlHURbINF>=v$wJ5Bw|jJ^Gg%$WC*TLOcg{Uc4(N$`pgo zJy&eEs&F_XG6Pm%@ZKX48_N|~{N-3r^Zg@7@++%ek2Mc-U&fM_1qvs(CHHyAl@8UH z%%`(sM=J1?w@naQ``W;k9N0Z1@l=+SBkrf)T7WTXhQUTEG5{^ip;J|?ocMcIIhsvK z+gnN3Q2Wi4W}4AUj!OKi`xmFV8~#&pPGqg)7=TAC<`NF*RiqR@8?^oWra1fDa1Yb^ z?A;ds44eAB&lYO?bO+b#1hcX9o+(f+spSVcCXnC#B3-geibd{_UDcIHhDvIqE!iKo zdxgqPC&NoVeOoX-QrPLd{7^HOGi`P^MC+IA&|d1f&mKp#kE8}#fX^C*Ia4dBHbsz) zhpQKFl^3E5hl^&WqJ1x_x(H~W{Y0tB~Y+E6oE$UCoz}~HDR@QpjJR(V= zYj~uy*?T9`LQFdLnZ7)G$Br9pfJeVxcy@@6SV{azzn3=o`+NR^wV3Hc-HCIajnP=* zS#LB?mu)j$x|8O+NM}IIoF)`^jzlp+&Y_wWm1buuiJ6e{nFe;|l2Rty(8iwGe# z)^(UQeSi1EX%e2@g9UKVi%`dPf=sw3zj)c@z!vuYaBf1CW|#=r&s~JnANmno zeaAwMJTSv`o|??BEq9{Q@`C?9KfD6&6Uh3LH{A1dB@Lb?ukm8E``994+C_-wvYVxl=iqZY4GWdr~ZoiG9BN6nc8yzBS`MMJ@BxSf4rGO#x2XbK%{mq~hqC zQKqzB+E(!q22Ms;?Z#geZoaO3LMkE~X)cu>Zes?m4CZS86^7P~`F9u^>!a{t=*LPN z<*53{WGqIvX%Ku*B!owK9?@b})K?3M*R@Vke39%mxcVKeb8NzRvMomf8;vh=JU^E= zN8O8BzfbHa%zdj-r_L(Dma9SJbGl+yKqqR&&OhPjvSw2a^D1RnJ=J$;Dyw_-q92uu z8+{Le%@)T^*TMp0!7bgmI^tGS5t|A>w)$kJA5U9M0krd80OG94*&E15Gwa5#WDOkW zuo6tQ(U+5jDv=5GBH<@b2Kpl9$&6E$c5$(;*K{%?zlfxhE7J?}H<|uKQ=IX|YD)OK zma8IdFN0+`#U$w$V)YAu5Ku8a9$>|WZA?N&m;3FBU_EjhvQn(@kck-?<33~Q0jk3M zcOUvkX{3{1O@jdItmo26>^;kFXHBA}Y)phlB`K=jRvFHu*F%Q(6ghfDQ^Z5`SnuB{ zY}cqBpYjb2*7Z_uhU*t^egdYW;}0}Otu2gN*ajEnIk;U5ZvHdxJ}fZBiRu$FI5djr z@VYo9rKijg?v)5n^bT2rEt%p9`l|g#3tc5x*lk!x3YWfHSM>y|5b+AK+ZQ>KyV1KW z(kN;Wz&0NG?*rH{+1x4Tdb5I2s(t)rC3+SCQFFr8{(3)fCnTMH7xO~cs&D3U zHuE~)y$)oVp5YNbCDt1b{#kg9ByCR&N~|O_eg)g{G27h0<7ymkG8E(txAvQ;&chu4 zEf}`0{ceCukrkec6ZWxu$^Lm_PPRnseC&$PTHCR798iP0gEf>ya}%}Aql!(Usce=# zosNn?&OksK2p3Mlwm;KctOoDG7O7UPNoD$DH~fHKd=^2jZ~Z_xl(sIAp!NGcx7^48 zUw^92qLlmz|7Ff$cnm2rnumPn8kU)FQO@+BH7}wnw{OBr2HlzEV0cT7_m|f4sSSFpROJ(*Z9S~NqlPxi$o_d5E)75ul z>~zf1$=};f#|Nx}`xkF8Ql?Cd`5@A#0%mkoZ2ly{(HKGUra9XSXbq(`uK1&!4`h4d;HVB zmA44Ufk$p$IXgUsVl|bdx|3tHL=Jy-W%D$`FC>%Ky)BF3S*V$1QO-VPot z!x6LLa5Gvo02Q;|0tt~U+NY&6sIL-D#(>nQwW96!Cc(Np>hB*0( z-jEe%oHYzJ`M5krGKEJ%c4|Uu0o)32F_DdlB32~jCGDoR)WvoN9uLpKv6w93w_-{? z_@Okpj%yStV>S^Sh7;5ru{A;Q+@_(ltMl07fhc_Js5^JdO&G}*TR)|!h5b4YgHPW< z?{pG@s6AZE4Z%3mZljHJ*g1ITr>;q|r4quKto`6)PAZLxU^I*8h{$#Sr{7+!I6o~= zxUzKjC;z(7LDqo0AcM_pe6k`9KDIy&_JCJkjrlLCr#`hOmXR4du+Z&FwnO&deeU~4 zY3mCh3rA5aO89Kj{R`tqlOZ|J_}3n&ZaI+I{Y zEHku}c6 zZ(SMp^F^(!GnqqzSCc5~Yd;t_&+}%<==X@Hgg)nv@YUVDUe>`&UxAtJS9>FEZ7d8) zYR#`b?1&jtAljdyJA8g_9eR^LQ@!vM0xTj~L*>q;VWKkR4kzDr)T6f~ZVd?+lHnw( zcG>n)z;eT6(P;?!vP-cE0y&TZ)MssI85y8PayK?<9)!n|o^kD21-Z6?RmMl71e+cz zu2{0QXgo}$dMqv`9FFT5GuT=dneb4gDy_D+RJ1=Hk7;YqlhM8clKS!|d!nw1olN<0 z{*w2s`l>2Ch0rOsZ^bQ~HB~~!;{VRIqQQ2J!RXgrf3C?DD;+L~f2BW1Q%d9;K_fZU zh~4#SJuNw-o-^R;Hdi;w@rwTyd4{`y=gHZ;N=SMP5DN{qtjbDKeIdi>c!@(p-BY(GtyU0r{wgZfc4NvK6`?!m;`q9Nq0EWvacCNYS z8gQfBSNG*JkHq(FQHJfG&OeDt2g*&&uA6BH+ha+%`?+voGDOL)0Z0Zb3p1^1DLSj* zfeJ=w=UszI?du>v-{LTh3Ud&S7n$$MNTV1A>G|mN{`&kM#zs7Qn80(^ljoWVmV!7= zoddM&7H=1~nkPe?C33Sdz~}oeLSdl#!+Q-e6FS|G?}=cRHXRI1L|9yvj^fFwlY+H; zQ)Q2K**f116fO2YmqZ4K7Vy6q;}&J#6ARjyskPP_#cBz<~yzv{y@F zVJn#0RnCNO)1ojF#e0uNzJGWlcE7>1I^JcZ;dX*IR)i^ob-rkF0vu`TYWmt*#Qh?X z=U%UgLZa9*5?$6tSH=aS_TQmKaVlG9s!i!AG?I2b41MhhBed>?O91;ok8%dJX$w{l z_>$*u`Fl4TD1UE2L)iJR{CzXuyh z+`rNCDKY25tlj6lZ6_{)BgoZE=|a-53k*rwP?B!}%xN!2#ilhEsPr`_C)*_VwBrbY6>YH|8a7FaA7TUdR;OPBdJy6%C29_EGNp_I0kfQ&hzvCcky@|$a_-v zUlQ_!;G-3Ri%^LJzv{suL{x$7=vu!=!DyIy@guck1ahppU#>y6paV1%-T%vE#q4YC z4Kd2W>8>x&xufXu|5IR|^!L95^L4=TluuL2`VCs;kDzk=wihL|0gE7T1p!_e>uSW* zb1xuH*#PH%hf^>r;R5Lzz%Ewd5F!uK7z_JBXb>HBIDvLI-XMEmz2sb{^|0xFA|ezR zve@4M6|85RQcFzN8^r2uJw}983>zw7A|l@*7s`2hg{E2}9NfC5o=XgJytD?6nMaKf zA{`i++*~-s{2==jP*`r9ZCv|Jclj1r-fbYCPA!OOm)yC}-|(fPZj4CqD3)G+rE6x! zeo~os*CEdq0N}a37^huKfhmM!1~`!W!2J@zuQx~74H3f^AS;SHmiWo`y^f3vD4OkY z{vBKl)?C@1de<5a6A>x(cq34UK}A$Vw*)|n{V|DE6vo1NGi@^*GTL3iZ%XV%SpY_M zm-r^lM9BZqbnKxk)J7x+d?Q1yAT??Kql^uC@Y%X-uok$XY_8mBHka6~pN=5DN+g*R z@MEx8|MWM|2&|!zu@SNg6&u)r{)KoVIVfHJKB*D#&v&-VUyniN6Y&fF6bt0ifL?=e z=4X&T9+6mf>pAenF*^B8g&(WI(f_e~ee>s=FY>RMGy|jN1)&7@Qf~2H1$obRI|CG8 z>kBdv87-opv&RxlOEr%*ua+jv`~j?=?4ljgmX-|mZM z(i(E|;Apl0T$R}Z^%J)m{IP~9^sO`ZC$?&rE8aE&msEsPI$H&B`gk->sq@)@fABaY z)|K}nu&m%))?Bn;ds;&@%pmJNuy1(H<1hD@+V!@Zi)a5C-9E)Db@M(x+HOgKj)42;WmSB*^*GvZ z$v!P({!5LKudI5G5_BgJkBZ_}&b*k!sj?m#H~Kjjx^zzLZp3!?HL_P6+B{t(OQ zaRq+><7op;sRd3(g2k8JX^ax~Zf@YG`h7N0gR1L)&bmNu1GfseQ8?;6jzg(Q9*T&O z14Oh^_QK^Ds%ZwfpwU2Kh})ZaL5ksiliRhyM(KQbj+S4jH?f&!c=22$g9ky} zUKm9B!@G;E9VfOnO;}3RB8bx+Hsa)i2s*`-Z0A7L2xUr2E^x`!K_rDt;BM#Q zJD1~GN-|9ZjfgC(4Vh4Cc3D{d>mi1?v=n+h6(+@$j zjFL*?)>WQR2~Td|@^BV<4aS@WOnk<8FMW8RHFz8`a!n)JC`*cq!e#yG>sg;HMA1Qv z1TWfgV>j9Obi^hxuXV}O$inMW5}RN_B^wLHUt>H4w^VD{C9k;1vpHSs9d&VU=2UuKpu z4A5{p=SDYH2*;wIJgWb(^Fi994fsjUo)cFBH*Rp}89`BkK~D(L9KQH8U4{L1z6Js` z^q{r?_pWCJhpPBx_Vuy9_%)TEXRFt$e@&xe)whMbmJFqsBqP9*yqS+p5_Ch9Hg}9$ z!&=lNlWc}%_a`am)UWi|31_i~ZHl&(o4Z(7_;u!6ViXy$U^oP452hoWkfbo&%EL|m zr(D~@z3aI8E>kc%WEB!h0%<0wVT-eP6mwTE4geIu{mftQJbQr>9gsyTm#dbSyd|zY z&CKxOVwruQKo!^|biRW+6xYtXWXEc+dqe1sZiyd>08vEM%IokpF6+@m<)h-`{h1tO-fL6#$gJ+t5ds|}BB^Z&AI#g0N zQTl~rs<5PixpaGKrZzy6?T~O(J=Ui8eEu~HePx;{Eho{IQONJrWd^XID^-WGRU42k z#s^N?FOutD<6dQ$92}i%ESr)RH^(I$if{BVKmahlI-!#xh?9v7P2gbql%cBqt} zCVoMmu+3Ncs93N(gw0hZSN!HvMAAcp&z9D139)FGu(?eW%xPw5DU-K7ux`=4Ehihv znH%t{gvaUWA)1_$m;#<^f;y#g&a0Y#iDBG;47hkl|dfnx*!XV%wLQ(a=1qbsCB98 zk`(KnMCX!9D=CB-3}MOWuE;f<8S@D_jd>AcezR2tZeP$c4u>SRgJ=DEI-XfS@yMUe+COX zdY0~4)B{LfG85TrW*+1Ys_=zFlyw%uk)@YN{ zC6e(xN(ZN%ta*h4BR@9bkT&lNYdxnm4#J`3zSK0N=qk}JLQjdHKc4&z3(y?b^bah6 zze!}wznB0Yd5!WAcTBk7R2b&gB^Kq6W{6J_^iD0>6p^6M?Qa^3#mMyIaWD-)Wal>@ zA{e?Ic|4iHYT4$h8I@SUUK$v9;oqTY z?jA1>1m}uip66FE^q0IhSmjVt%1j6UGiCQ-k>N2E^5Fa|{g~?BcNXl(>xR*W%rAbm z@!p~5XB|##rBH?&50)&^7+WV)2iy=mVxE5PmtYVEs5{j&XO>;YV!ZE`TpTvxD-npH zc2{mT{|MSS&S7JH;%r)dFU$CJf2MTrW$d!2GrX~`{A??gfjM~cM%oz$slVJwi^pRO z+wTaDp9ZPM-6jAbQ+McSk3*1w)3<8T| zJq?&^pFucd#nT5k?M4@1x>@NeJui%tgNd|mL-=aI6)-)1yO~kpQ%QpQ=>wU;i!VvM zUPVZ!G@(ueUrWA^q<*O_`Qe$4LN*H{UvF=#VddT-sLW`7SvkEWXXjsNhW~Wh!FS7d zS=Hor2G+0*9$7@~&y%;{)EBry10FZ#(Di84PzEHoWG+hyVqBfWaFS^S(q6$#sL89Y zYidg@8amEGQ39u6W>MRb5E~bKjSiF_32jy`)n3twR~rx3_vPYvCwcfYQztON2lk+= zcPp9=>qVx_HSQH#Fbq-o?evXw7G644J;~H6V+2h@hCq>F_O9Eg15#vVcq&^Jt zod%(x1)GN4t-MbRDO&(TqAxq(rz%|-M*q{kVGnETs{`IB)I|mXw;rs>dC@XugVCJ5 zVnR9LTY&;ewlcgInrnbc`j8zB;rpijsQE`3u4sGQNHu0Hz0aM+kQ$2`yPF|=PtZ-_ zL28iN>myJy*1Xw~`@bL#*z)bV$Mzef5j-m@4>7KyBsOA{VIb4uBUEl0&_`vJ^V(vl;;^|Xx&9zE|mt0$Ho6Y1g*{z!V7m=XA+_%D_ zyFMQfIZ;vA-EA!4kHgiiU&+H2pg~u*wwj%tC_k8;xqleYhW@q zJv#+4v{8_)lGffl1;D0Js0yz7(~dbRphUkF(RjgDk*kx3HUQ-sjL1IoB!)pGrBUlau zMm}5)CQUyHfU!={I7JGJyMeKvklr3yRSdq24f?z3@Pea1q0?zX0Uz4UR zP?M^85uIdASjA@$L_q?aR(0#rX@j72Jevb>^6!EaAju zimgTNg@b6IPJ1*gx?jvz>F5oomT1-?Xd~%M|J6xFCqeXb~;=YQDWd&9N~PmF?r|89xhJKM}L2&WsXB`ka^N3_sj+!5`3I^D9nSY zpFG48-}#ftEI{R$us^huh{YgU0LHo}?W#g_DP{i^iJ+miFJk2MHfw zB}WqFU^)JWTExglZT*}a3S={4I{M2$!||$IwU^wcL07!ELHYQ z7r(lC)J`R8$)>cq*oNDD;pPiztN`nagui>3BZ49h7Z}u^9eFNkEhTMM-$El?a{aRp{^CGxN1c!}2`aZHnw*pU4__%V!>eO4Z0U z`NA*=y&@%Z_=UkC9*K&n(bENxgyo0ns|{ca7&*d^MWWn~FLQHXo8CcrmQZ31@Wff? z2SpjU}(aOX~n8=>{h+T-t0*=P-XGV69l`+wzftc?Is57 ztTPc@*~AE^^jivcwqsJ8#9qX+z&$k)a&3p&IxR(+D}09;;YLr$#Z4(HBo-i~x3*0r zbMcN!x=I)&6W`L+qNZRTL2o;da{o~a`5(x_E(m&BIO1W_qbR4kxP+8u7uESHsZeR( zJzzRtZ33Cx;tFP|FoiBPB-TOr=e`fGnlVlY!I&GFFGy-C8Dg*H{u0~4uGJfm_?R>3 z$y19j-D{^KleVwe^`I7Zdc*T84`R6OC0s0E({KbVs6U7fIs@sprC&;=4^R1d*_o1C zgn|tHb8G+JkMCBR$td4)b$WskG?FI>hlfy7NI80~VG_ZB{AzylEL2mv)=_ewz*g8R z29pX4l|?)A%&J%drR5&?weJ)#uT1*RX3Sz{D3MVD$LfpoeD|N|CI0xIxeMSVWR_9m zOsxeJ8JLyK->?f10fwVY%rGoUyo&p|I)x<=YrIkcwIGqoF|)dW0T34~wmJTTxZnd3 z7bpNg;g!fA;sWQnW`cW)Qptn>pHdsxOe`po$x=l{s!++b0auP+yJr)?FS{krR=A4; zT&`FrSo_hMDT7DU+iLYmKx2m%w;Uu_q5lXEzls*;DA=Gdr&I?)O%i(D*3dHaIte;@rt9ejtAc32`}0&vZM(4;5c0{s~1D`kM=`195Oi45^atNOpCD*69P zg-U6Fx4a@T@WYjd1h2uvrDQF$FblLb)_4cB1CFholJPn7+nM`W((Y>>+9Y0(2DN); z`grhq;7SU3zM~oi&X@UmwpMk*4_hAg*APJh4W!)d5|a}3^tu=TaZ@1WRWIKs)l3Yr`Bm}1yQz~A~{hrs;{#GDw>tRdLu*_jIz zg0UU&BpHCH#O*FGi&nh|9zhUfAf9|hb2`wm4u1f7St9x0pn&ubvO35$5pNR8XkD4n z6zalR0BKk1#nST_*MJR%z}0Sk@OWHte3}7OA1{C-SoWWW8_=K_{L-)eNAl~RzE>hi zp-=M>^ifa!!wb6H13A{g8=$Ad89=#qm%PDAcKZzMc{3jXwts{CZy?SL&;Vvpg*sh` zB@5Ai2uU3`odzI@TaWCoQ#`%HFK}9QT95!2a@kEt!#>d4PfK5B`lI0iKx$+zw0h3L za~zoG6*c(!FVymkf>tEI5Wm_K3j~n7wqKE77j$WMj$%twI*#Ku&+P_ zti^GIY`N@58<0fQ{%F_@3`2=UiU^pSDW=tbB;4;015uvm2*lLqf?|&zzLGR3-(HeT zYR12AK101itz zf#0Ja66bc=K_rKTUfPFQ7XTdK(E7}R{|0dsx_EfLwaDf7J=nUWe*GbsvWH*YAn9`> zrL0~6$7849e#W2m6th*Jm$=T`3_LTlic|HjXJ_o>`h5YQnnnMzwwFL^x)219x3gME z?79y)ymhZZi?GFQ4fL|^V*$`Uy#P_a4ZlS3d};gnUvlGPP-EJ?ba8*q#y!uV74XS1 z=7LPEJ7;UZgXZzG{Fmhy4EF>f%wQvU+iamJbfwXtTmvNk(JKqUXUkOOwfAtjNqk&W= z%isVZ)AS$`VkCoC1|pqCU_-eOlvx8aZn6OQ*f;#Xga0g+jVZYR|2mQxCN8%4Rr1Gr z5#_7=&tUu+tpb}16O~YHNfLb6!#}`jaWVea|225-RyFMaus~@daUP@+Vznw>J4n z?iPQQylRg-w+W7?_jsE#_a4fz%MYo9d;~{yy3Mtznlqr&bRWwC&Gf^iQa>8d`Ud@; z`d=kED)_v#koy)CgU9YbM|MDmsK;C|I-0O3s2lcCzX0zTDb#IDN_Ga^r8Ns2FEyto zeeygS!4&`sjVtT zGVEA*IBrjbo8Mg^NuA`~;y%K`y@;XzG}xI-a8Dnww%;x5|3I%Bx^>tFdz?q-u%9#U zJ+ukUJl&*IyeP;saK3+4=mULkU1*4X(}V<=WL^4OR-YWZndwGG>}x1|1Zz(+%&3Hj zO-i)so`p=RKJa{cKbf4}IEMpDIy%7M$!MnX*VsxiAU>czi%m)YvZgp|o;*G~w3?bY6#*t$xhU zjy?HdZby}Z6=Cp?66FXvdi)yQJEIwpNxUzJ@#(gh5w?iR*SAj(-~26@F7YTjioOLbuO3^O%Enx1sDz%8 zk@zA)zU7B$m9R*7w?zK%#hGu;{q9@ip{Wplp+O#U<|KVG0?b!MjX&_uQWP97>FT#3 zKH1ZgdJiSLBS?8QdhqP;>GYUiH~*eaXB`;)E1eFF(Fd|oW7D-yVnYHM(b7vp?qg2% zNiHLJ>&=Pp709pKa=Qio(A>yi)loDgpL-|^>CTcWmWZppW2Z8;#A&q({Rx_aaxb;N z04fA+kbFAE%B{RKV#%C^tZ!hQWqlHGOtA)JyL~?ZLkxFHa%!eu#5QH0`E5yPRXZSQ zcXB3T3|Ahw@sSQSN4ZJof;Se3rMqGKpm!?Wyf;m`I#UZu_y%|UHeX5e6<7f zg6$<{KM+4yi6zl)y?L($7^qZ^xkt=_SL8^P*@|zD#KOu(^6eqcjG&k zPsXsYo#iimaK|Z2+eT8P9D+?A%!6HVk4+cK9}q-pQMS zpP$64l?p+H)1Q85Z7e2wID@ZeTH2!OEMvApm9*aCVKz}LA5sGA9?qwMKkd*19!b|G zZTkDcm~)DZBE8>{V)2V3l}{V7F^w5-PXkbO$6C}^EE|EZV-&c{_XU4Suon& z+D!dNJG6_J*g})%ExHSQ`UgAmp@i9NVI1D(1dXB@LxHlr``0BEftD+(&-vBOomBkR zX4+wbM|{Ha&nJ}48;orJlv%H3qN6}B^heP!XVgD?p$|+q;Me((|Llck(uP0#TQ79B z^MCY0t01tJG&dXW&kK6qP2bk!RDx%x#nLZP=MGy}PCUJSGDWb!WeSS41`Y-uvY&Qk z+Y;O=nxn)d3T@vSl2|UZZz6xfOQ|!o<|;|MmGpy{h1^)M^cWo7q|QJ~GxOd9imvD< zLEm@4yC#y5f!jRHW={pEJLL{O?}zs`vRDVE)O6zPY+$9VZawuK^_BfW?A)E=Ll>3w zSeP=oK#%r#arQt?DanpSe?^iei*Lstiw7L6eV5iEJ<`v7h{09=Wnn~C#_RNRYNWF& z7RB=6VB@F#s95pwttXl%Z(r4GwA}dE7=J_+CZ07n+L*vo4+saFS$^AP8_VpF&&%z? zz0y74iP?`FTXguNrp;enpl{+=EWQbRHzbk)849-H1n(wTfS}kRy}nOaeIRv&B`&-X zF?K&ot{3}yF41ep!VieZ@C0Fai?6V~QsHwR4iNC~DRtU8Va?5^RtZ)teETQhkIecL z@NcoTY`w`IqAbokHIh-F&53yp9(mpYe#}4wOGEa5lwGTp;D4HY@uCY0%fqumUswqP zhh_k)Z0&P%9dCHi_f8vEL&o`_EWU*l-qTTtI`iWxj(7~Fb7`~y|VQjg!~ID z0^~5SVSS*`Cn9)KA4>5E?&7{SeVW$;bzLtAK&bxR@tu-@JUr_MiKpb!`Z&}C1QJS0 zx&NrThAVr{5|BT=xGMVO*NaZPe`NfLr>+4HVS~KK@-$X%8E|Tp7`_Y}Bi&Tgb&K}D znyxOa6tyuq3RelZHg+wi_q5fOIOgCy4h^dchEI+jWS8OI(kbIM>XI#`#vveF?XAE( zb_yc2jKxJ0V-Z#2h0Ws!%t2VJEb!WQ7B|RGu^?WPpU0f!AW;^N$KtHC5$zAnQ-2gA0+@%fmi^5)5nz6$*+ z(Y<@83MBU9MNhd{+_H0*Q2;1=z6Q;KJ@`2SbvswE4l>LDpH%`PyIa}#w{M6pl+tt$A3|1y`wLSnZ)I$9YqfWs!p3Yd zs{kT!+l{LrY*_$Diq5U9Nso9s@Z`5cWYvh6a@EU#&2}bJO6w!#m@hYno^X`vQDJ}v zHWXs|WobE8Z>PQB(T__tR(GtbbvhL0=eM@MTCYCk7_zusKZ4VF~Yu5piq6}Rm@ zMKxPdw#e0i0qLy~G4tsH8wXt_Sk1+)r!9zdY)AfCau$Ma#$eRIXS5yhqFdHh-j7Rd zz09QtxUbAc*)QerxYPG;*-3gAE%grEH7$Oo8UFKd3TUe0TX%(5Gpj;p|6bwU7u5FN z@A9Nye)fWK54)lsi%3xKCVQOjdohEz-0Yk#jH0j9`g3+#L7`sdw$|{_%}<1j@!nnO2G!<={E*iT~VaV)M z_jI@P+e>Eu`rlW0zqCm#AVu6p>7|!FaHxC%D!i$&Yez#FoaGgZja(x<>L-bOtZ#g( zb6HZZj#ls?X8bIA9F?QAGcDFRgWMSM)ie)v<__IjzTcpNV#dpfE_gi_{ zHC-{SEo|m!{hrVH8n)?o$;UTRThNp;RvjLs6FDqGtJ?lggRi|-86!gx-t6%Zw56UM zj$+ath=>j=ww6fdiOp$rC3yZ_6E;F!{i+jmF|}(!&(?^?E0sLww-!zuV<3cLQ$3T~H#k6l5=(ygmacP%OQX;y?Qu}eOXVwH&6s@9u} zEYqmLBmXVP;tU^NGbh=wgpMk=bY;(E%MAk`XZlQ`<4w{^u|;;c6{>5U(hDD!7_T!&b?4(RS|N zSgwnoB+V~#DAzJ z+RTog=^229@XS3iUMnRWq+yMHL?2gnwPbH$ML}^pKEq#S~L(utBSmn=sau(bcpKghu)u?$5~)o>UoA=FK6tb}?K z-j(juhyDyaJ+u9lZnK|%y0*k`pY07ZuCW$^$8MqRZCaIoWoHJ)nc;kDtz=lrdhIdu z$`j^Z(&|38+3@B(plPhfaOsB9XBlfhT784GsPt8AN#^CSLF+Hf!y&g#;+qYC_vF40 zD01c*5^^$Vvs@Xi_qg-uDC^qxFW-QOtAK2LWDvAv#_V?5!53EXEG@mWqvXKIbg)3R z<63Amf34~=pWN6>9qDp_EN%S+XCe zU5@zA%R4Z=L>Ped!%|q zks+FIBlU9m@mx-QK?NR(a=Y>1EATpL)m2I_Y&xumZMv3=hr=hwWLt7K1LTX&o*%1m zb+vyOf$o-U)RHt4*zBk72GNE^e8WPatK2&J;ROlSmpalt!1JPbAV9NO*(6Um_VZPz z8yxo)lXVa{qYJTlZ~`6zk%F*Mk9g{=QC>dPw^{O{1t0`#yf3#X&Z0Z9UXvi2$$QTe zMO7c8>^4|skvTY!zd^36Qk>k!+8brnWw|E}cnE|O|KK5Tn@Q10qHrWFxgrDgPzRrZ zuifZO>fvt|fS2$l4gTe8?Im6w-ZkK>+ZjQ9XJ}@C2fRk-u>~f|qkEe+tMXTiH;woM z76om_Cw~UE$y9CaJKpV-FlaQK)9DipwXCYi<4dQYdc@T^8W^*~hf>w!ZhUXhve*(S zzO-qbhG=7^bJ{!;5|`6{3L`|<@~*sm_2&gD#HNu>@T3~1N_G~z)}blfCqi*b2Y z>gCVDrXSXwKBD~kpC#`CJId||nCTXg-T7W^f4Vtkp_|xz6&PvBE4~`8z(S2`%t*jY zYMQD*vmmO8ZTT)K&=_T=1>bzD`C<0tY?$p}=36Z(d$M#-GsV`c8|)pQ@jsVWA# z?c9PU@=AiPr2EBQ zldJExmDJ~Fgv6So3Kgt_J!ncuXHdD2GF$e6eK>yuriQu%zo41|*7Rgu=}kkw0At(s zNyn$_EsOkh5&rN6h4nVgJA2eQZNeH^$Ast++bO&Ig5&6*5A=zojaeWG5xA1`3J5c0 z`)PgTn_omM+kxiQa8B>=eHuY#&71+W01Y}>LD2`S-iR#>`sy;gP^=2lyA3Q_i>I+^ zZ`Rbc;_7v7Fu@QR@C1nyZX8Bxo5G^t)b=JbLy{>LQe#mhK&4>mw_1A{JLFq9etf6E z*PmYY3@LV>o;w-!DizQVwqylY?|+TgJ1b_!a*1SoJP;C^d%ETBshZYG%>>v7B;T-g zJGivZETv6G*N5<(A(m+su5AYJR#VP%Vp;(g?OFH5FDQ`V*%Z?(xU9TnnSNZ(5 z6u~MQh#B54_X)JYpY2{@Ny~H7HUWdn_VtYZP3~Gn`tZT8PE<1Me(H5^B8E>5jxPtl ztJh^NwFLjDh%J{EUQby){4pQ{Ne~*iHGMJk`e&m0^+VcDN?e#)drDh@$z_empqu5w zC`E6Y5jsN1K#w`6J5t5FF-jrgH3Z!qt#X-&XP!~qggv%4ybb99l?h`> zyv(0Y6M`P?ccWn(hXvf+6ZPLDSgFyh{;K%tZut`V&d>a{+KMtv3%SXJgkF)>!bJ za><#=MpG9=kP@#vAouFtQtZCcLDnWI zHgR^IwrPOe)g5*Xv8u*2HaxK?hgVTM50 zRPr_xs&67Bjw#1%uE>ESyY=?0nl#dosCh~eYvGER`O+v2H&K1Hmhyt!IVntA(@9Ny zr~<@s@MMuw^O&D9HjIPzv&otd zjBFSh_+h_@9D3pt+9kWC)0$n$-B?s_vnT(>InYCI=}_8#$f2(5FD3K<;@5kU3b%(J z+xss+uN|}*#by~aoU8_@Y*Q2$zQMt7p>1@6>~fe4du=%VEq2pe=6;r3;?4tkZ00?3 z=5M5Cab^Zc^TUoI%ex;n;2n_1uhEyt+$G5t!{eAY!@FXMjPqXpX5v^5UnTQDGjx;90W9?ozFPg!c2eUG@Q*W<8u!LOwAut8 z!FnB99=h-6Ta7mio%SESYv_}>+8IUfYt0U!&OdB+nL1PxC~Axalc#ask5lk#g3A|XhFf;33y20=htN|2V$O(Wec9UIuho!fKnch0%z z+%fKt`|tby=pI`JvKMR3wdS1f`#d*h^g(_@rym0)p|5rghQ=!HoH2zH51*ervcCDOYsZp_Ax|G_QHiCRRrvd zRmXqai?Zd_X`f-4=fLKyhJZ{tDM~Ib#<4^Wgb>q-3{aJw9s|kycfRc+O_#tV^db$} zun50pF0o0BDE^nb!KIhJ(EW2vA|=FrdKP)mZ|3pgV&zyxKl`?9jeJRSab5k%-S-8alnX!*| zLlJT>V#QFyj2R?ye^{BDr&<_|Z!=h#L#!*n6^GAC!-%4z+vOIGgw6yUQ1LbuT{8V< zK+#zw2~R$aK|aW#U6_$hKT~6#VvTwb81#hN@IKB;5CXRk}CniugF$Za%A2 z@5|L}5=<$J=2{Y2rn`U{F*VePF%wLK_rcG>v2eZ65}4naD%SJ|h>_1fIRM0hYRNJkK<2lQ4N}ALxfO3}@Ip z{-{Mm>px*jzs3yma_R&$Hev)50t{X00X?j^c^dB5+kXqA%M^<6+U2rG*%hA8&@$dk zRqSw6nF16Tdk!kes~`5Z4__1?BohCO!2FyYYTQD5i`fU9ElFhgU`+chaZ{aQ^6hoE3i?1sU^VTLH$^_pXYguXMMPLc*t`6p1jCB~i@jy!1pL>>Jq#4Rr)fx3P#z3Ng%_HRO&V}PS3N3oz?evUJgLYM^A}AF z+dUD>s-d$mznFfze-)iRP_CfjaV^u(aCKWH&{YWh2W3K6Hnab;iK=aa03V2AKUPkX zN8!;S{OUf5tGp}h@P)^iN;S*;L-u2j5JXV$r2(45>bpV`W@~F2Wh$o$mD~f}(RTx8 zx>R}x%Ba00f1*|VRkRC1K;ZndAV}2T{IwqGh*o1ZNjNffvYagDyDPyV+A;Y-R=Bn0srK(0$sEOHdIr7Ith zRD96y3nNX#olx3EbhsaX|59|{_V71?VWvN(^W}pzXf@)fa3P|o=IFl=jdji^ss#c} zOPu_}RRciqHB1J2iooHNZ{BOKsU0f<)KCb1MXbtuprHc6Lfu5fX9chFAAoi6f3IHt zX9*0h`2lqk-#(#;L{y#gsn73gVN*y!6buoRY7Kb>6 z@OW*2;0^KWKl5=+BA6NkK$97-wPt-`jQjYq$69D6JQ%JVO5^WQNN`1?{y zpUK|pf3rB{zc~Hyz3%_7IBVQG&qkt-XAO5f^IGfH>;3L4I7r{w_R#t`)qx+=3SkTs z>LSs3xk;<(f#J9-0=94*C?A7>tW`~ZJG_MG` z(?`xQ1cT+~rcnBpEdvx#K$nW@IfBo30X8|qAS|h1cL*3>AEa^ouQ}H$F!AKNL0F-l z8iGPgH5dn_;Dfez+_vi+rdKZ@KPzY1=}Ld7tJTI`S(Z^L?+*Tt%xlbOCFoK}%z^9% zyv`WhldkW;$Fe~bEB2wSmtEY?FjSIwkh)|@5W3mFfW0vUC^j+vE>m&ZS77EJzX3w> ze__l@AqW55RD(+6faIn>P=~kyHOm%M&irmZ2L@l@K@0r^a*)hEpr+CRMYw@9Pz9}= zZb4MZ>AD4>=%|H|8@p?v3OZNX0JW9m8Tc4BAo2=z2q<_u`@e@@X=+Ws7OO+le;xxb z(mT_i*81p<7D0w4qac=<=nS}}<|Z@w3F_%;f|D<2ezu&KX>t~+T18*kAM+y&VPUO4 zx98JxT)0wU2~ObIgkUn)(D+y5b~Rh2JHo((fWG_-!A2Q9^gys%sTADTY-#*2SAddr z%N>H-JvMplqy3f-kWtDW1h{Z|-2nUJ#NC1T(v|uG^bX|mssM7c{$df4pY~XSBMe*_ zR$r8V!~*n&u4tc?OXk)t+NgzI~2}`i5-nAj*Md09xSTI0LT4ZwU6wEcC~n z3TdH(t{-(t`GiSco*K_`kMy1E1!7I&$?rvw$|P)K@HhgLm01zD!;A)y=0xCZSj53% zP{$UcVQE}~t0w0K1j#s`H0i*nuQZ}S#wpeU8QrTH(9DlRw4i1*6-PD@nX}8Z-B|<* z<-ts9lG;C=sX$5@j5*L3l1{1 zM0G)@j8C~!6&43L<&Dl}=2Pm+ch0&GVIZ0-h$e~cRJZ!QFuVT(ocB(M9BPnNL~XnY z0_Yifi&e+<26e9VZpGxcU(naA=mRF*cnr&WTcZCZ;rz6G!z-P05;>Wa#}N}U02a^?cl}inl&i07PVp^&pQgDvL$+E zb(|N}I{ZI@EqTPh;F1L*408UVellE93b2oFmi^xXaM4HEaRb{d!AFL5pM)&LlD;Nw zgnmcuzD<(z$8+-9kcQTk{tmXaBZehV_g7*W(ZyYUdiQOZCi@OvM_}nTlu($hhUuEz@et z7wO@U86ju)n8N)vK%m97gA445=Of5UBLV9-TP>=PPd=z6rlT$NJC={_URQ4-M88}E zABXt}-jCIO=TWDByjZ{O>w5eU%RW@$5i-5Ho~HyQxe>k9EBEv}wJF?aekzvC8-dPC z8YdwX&7j^tM7QjA5C70Nz|kFXms_* z8(q%1W5P7OpkMan`O^jwJrnN@*G0POXvP+4VJR`}=*5Aq(We*E(b)o@6`6782BNdV zqpwqX#M^a$)*we&oTTg0Lx}Hj`hP4 zq1Q%Ntz6zF$dh?{f_9XrAGO`lNo90<%$wEp8K>%@-_ep?qKJ9aC-P{_;Eth80C>%1 zNEYI=!zI*QZFvu>03ToBCKk7fya!SD+1cA5p9iqF2MJb-x_Da;Wp`OI?7c$281#F0 zOUA>+WTVwbyb81i=y8Im#U9F+JdLYO7dpBJk>XD~`e+6x_5Ro~K|VY|StPJ`*=4R9 zVG?yAX#rl@fO~`}FIPQ|HTJeIQs_5;bY+6Nial!8kKNpk=eELlze8k+hXrH!X=pFF z49c^lgd1GmwBBCS9?G!9$QWu-7n36HJaRVfEs`Oi@-5orbvK^7Q9rt~({q~l3K5(> z3DGgyYXS{M$VXM@1CF5)&&MK!6??v6QRMKzIv$7$ec>Dh>*EfdrK{D&=L*8DDL%3s zwbqxMd~Jp_s&76DJ^Y`e(sTCGr?^b|&*{Z!nhF*akiw=x!1B?7i@QEN$cJRwT+3Ou zE`c1zb|H#valm%v^OmFDw7OOFP993+PXMdnYahCCi^}oW8i@c>?`{5*s8s`5nHs}Y z)ufyA?&`492xPk!Ze;9-xZ52u0uqq=t#<_Q$J4_3ew~qZv|H0a%0v{i@fm;Wt((>C z1EvE6Wh(GqG0ZCjPY8=ZfJ$lJZpItY|LuV0Gj$HzJ`W6uZ;>8Cvd6^Zc>0ElUqEwp z%zD{eJuzOLP59ZH>#J>R&c8}LY#5H0!mhicX5q-Zw4A*9h)}3dmP03Mkb-1U-2$t= zoJ;&+$Iuoqb^&1Xp6Qiz@>Jh?SKWwka~SSuck@#6JGu9jH+XhJaao zIov?t=~%p10ZKO#(_DWqIz*+zzw!{9on>*HF`Fyu_d7_1#mFXb;Z+EpHDIjzCBvz= zn4@n+P$umwF>v)qyiup+v?`ftc4EC;z~9dEWTgC7_Xy9ETDfS!)w?BzI60pn87yZE zsyp|;_NXMrDK*?)o+HT1GtUbFm9WOWU{#5uM@o9x^*ZR;a-G)Z|t>QlJRb&GPDsv_iFH^XagH$XhY60hntJTpLXuet#=m~sUf|`L~ zE9+*%0DrPu7P65P#IF;!GP~UPWpY5UUvM7R54)TQBhY?}XJk;cV=1L?jP02xQ4ddZ zwnz`f@zy-cGUyNpu_LGG#a|72V^js!-@kLQiu>&8jB64v-|epq7nWFCy^@!#xr}0P z%d<24zMaVtvJ{WuP@fWKudJEu_E|>SxsPv#&-%z$>6Q2@)kc~E8~(MsL}UG3!_xtq zc*4YQ_Z@-+*R+qR;`WEGpr?`fC>IP{^fS5hDx%!t@;)if(NI=@VJO`JS50d}_o`nE zoE0XCq2Vn>O5<3^Z4>UQdI~b)TGfisCo>)Z)4&SqLy27c%rn3B98u6f!?goFE|!^NG#7TSP1l{D?s&6T{zE z_@b<1b2amsX!HY9p#a7u{toQ37c2ie5=9CTf`-7zw|P%0I|9P%h>ado^z) z{-R&j75MPNat-V&ln6eM`6WuRAKp%-;AUtnx)LURV_tvI;7y#WN=+cKY=2f0*^M_X zIZlRkSFjWvL!KvwhSq*)0xCTZP(viz2td1W79z^hkdiMy_ebvny?wc+Jn1?t$8u0f z`JCNue0SG+hh5W(Ki{psL8IFY52_~?l@(KrFxCPu8`b4MFI)ZLxE4#??J}XJ^nz}`TzwS(GYtiXFNK=%`vnio zrm!WIx52}lP`=q*_xckLLd?A@Eet4L+z?1g`~Lj8S41TC#Hi5f+o+Jn&oJm_dTxhu z*wIH~^&;`NT|S~cUggJ>ncTjf{*WJs-gNtNd=LNFh*d27_Rqa-KotK}F;Fy!X!z?Q z>4ke==c1|{eIu&Us8^`J=fz5BRd`K9!HgAeqJhSWbzQ(Q2MXvzGRxmpW!M5*SB&y? z`uXWi4f*hj8QT+lZEJmbFqV}?8&{SnSE>4juaA_9=Qf7sD5cqL1zH0qV_ybQsKD%NB3xI zZUlz@-@p<5K60Oe9}nqXL@jscU}aIfdBpZKMno-?xMksk;LfMs1|4oq9UBs+m^XYM z^tm;ON59+DU`vd6rAE68yuJr<)ldkK`)L+WUoEc;NYO^oqeU}QHD^+TUQ||tdPIz? ze?o1S=T<8+yH{e}vdEpkqQt&0UXn%|B+S8_vVrrM7uInKb1* zaYC?&;B0h7;gpaXN(76gv=LRe z1Ir@SbW8`6XuBu34-dv`&UfY}OJWlkW#|gUzZiG$3(*xJZ!xrwP!KZJ6JtuwcDeD| zWWCFBZS4oTK_6y33ErgIaon@qU|<2TbH#V9F!-92C2JUq^tx$!bhre@`3OJ#BCcQH z<=804o8_U1rQ;m6aoDf#gP9j+t9G?o+JZmcsJ)J4PO=#xEDC3Xxn67iER;D8d?6hc z|M|^xk#VAr3aq#@rIvhO@@aIaviD=KJR`JZ_u?&L-Xw?_TtaiIG)j?0LWV&5)H zg&kdhGSW9F%swgYUQmBQsaElBBsB0juFyz5C%Z%%eoVfB$iBr3#Y}D41pGmE zx^`A~)$;<&FQ%gLur9zdKUUvk=J`!YYVFgFL`E}m38yACQLT2s>RvBgDCm(;<2V%F z+yG&f!KHsecw;Kf!s_@6!)Hf8rq^*>I{KL>D7QX#24Ael+Et2Ij0RKBP8@J!@r>tM z?J>juE-MJ?ZzmFaDc?I+f308e@;{@32l|;1%u%QGK0zq-h^rr4P{(n`yN}djO+ReU zD#{2kuTkkmDi*er6HmE^cy9Nr>a2_HSj9(ub__0U`8;}~KpBgs8-ao}6gN4+Iu6;H z*20at(B?jbSZ()Qhd$~M$jO}kd#{Ka*g5zj*u(uS1CQh(Mb!SL`mp!E+>7IPtxf6w zIsD#h;gW37)W@7LF)LiNm(KN?=cQnDDo+4_Naj*>p7meSzWKA8)c>URQ+99zrqam)k@ds13HgG?5y}{v9Zz09 z(pPK@IS_vnstIPz1a;E2<{kc8gXVOJ3(2J*KQ%p~=-Uq^=bgB1A5fo7G@BtMeZ>=}0EH1ZsNpn{o48 zCW^wJo0xvPD=;1zvO@Z??4184WuKo-u|=D=;=W5g8L-oRnm0`~$%e8;0Bh5KneNOy z@HpuyV;hn~T2N-q)bpQuy(s&gHtl$IkR0t&;SSMRyHDbL6bfp8M!!7RjcRbIfs*q9X`))J4wAF2U zc&I-YG=HUD%n|tIXm^GMK$-1M-n-mzShB)^XDQf@3SuX)n;( znToA0f~G}hb0`~YX{kb7L6k^W4i=uF*fJV_-z;nKhMbMj4X&7{ybd;S4jO(UG7P@@ zZ_YvQ0O1f^>(MsVLuqRa5fKI44_zCTJ8cE+=>kVx@P3J~@uh)Q+eRvn<+RP`wv1Dz z^d-?Bn6gyuxg1dQVV%H8MHEm_*tz^zc21!^{f&h52QE4<`??|dkS{-+DNyOGgEj4w zwS`}Ka5idFOuOJt2|PIHMlxinJ<{Ge{EFqARyz9?u2J2hQcV?U6g!`>Hc@MW>4=pc zXWsP}yPTti3Hc>o16IC=W55>78=w&VIxaeA739ah`^+1TaW?UVv}NAkG}pYKGdqNPgm=`57knmLY0iI9X9D_8`Lh%K++ zt7zN`QVf=js8zyip)XeQOrtUdGxN6r{sY;k0S6ZQwNro+*1S{=J%nFn#-{8wZ2fJ% zczt-(1cf)rIgD<6(%saXYwmWSxBKm=O|ZeJoC-`bedXx zvdF-%I`2fypP_r|sQvUA7+Hgf`o;t3zS#34gnTklvfRWWY`c@|Q2)`q=#1|Rr|GpC zK85B<+3;W;zOQB?rntoh<}5rt&y(8kzM{9-8rbyzB|&~2fmv5Z>p^+#CwEjzRb)Vy zO)%TV#*%JqAXvKVf%mJoJlqT~$N_~k68EE<*%OD+=cbfCD`~(6q(PtJT;wE7Uqm|n z1RQUq+FYnP$E#`2Z$idv7*$Fl@ga^x&iZb13X3R$j&PxUB>N*0z9+<~cd@IVe2Gde zA_XYrR9|dkzT(Z!febj0#i8@9i#-~eIGoSM17(8%+UZnio})G>8(ix@c=mM7z3E1Z zA^~?_u|AZjbVns}DF(+^E*Skv@MrX=uWjt_)N*pu(HF>h&*(q2obzGHD9q-!kf3QQ+cvOlh$3V3^6J!$hXvfkHQ$o`*yh2jxnp0vNT+} zCtQE%(0IM~;ATeAwd2P-q_|$Tiuc(S`zEn=>`r?t**Sj<%LnPw(DTa@K4{cHl14@L z&0c)Nv~zzcQ4umLAHU-5pXZz@Vv~25fTPl5(fGRc$;W-K? z9nL*>z{2m@+n8Bz25p4jrML%Ix20!2ueM9LzTn_hld`YX%9|>*ec!u2S;W#La_ZfG zi2C2V2px<{<(9RaLsS8BbC4Uqp%$V0!QB0qr?89jCGWA`@FxSQA~E(U8HWvreoj5; zEo>&IUn9+RVu%asw=%kErCZC7+dUfyW){1AgUV7H@Rm<=@Cq~qojGwHHqak8ootD_ z-~55isA^qU{AD~!74ly6@ozNT+N$0U5tP$maw~RI{si}ocw`pdrh;oCip;3^?z;*h zjohhEhP0!J*2Ghckw^)VE87iS`k`1|>WI}Umt;mG5=%>!m+DKV-M zv*l1Hxm9uU_mVOgDKpXLW5p~?O=I(kc)jtb-5*Wiy7ydP{qrL(zRY#G##aPB_0*h6lw z`Hm`NIlHmxV%R7cotaEXp zwBH9yKgLL+Xx`I7S>|Xi#lV))9yUINXbx%hjLYGf5um>`cO3{RUdXOB1?{+0a$?=2~MC^=r;k!lQ=69t9U<}blaB$6Ns=7olC6x44;hH`PC zI=7({B`f)v`nPMd7g?*qE<|1rUU!>C{iQPD53**)cP`Yyr+lPcD)NAA+(kR`6O#-R z{4ra zTqr_lTLohK{H+B3iiTxhTjaYLmRgB7d^o46jKXqZc6Tkh{^fhLbcqpCpy!}9lGMld zX->2&%oFq+>OjxIbMfykue1J=AQZ;}fN9)nUsx^@7_M33OsLxpyl_Z(G2WP%8e5X_ zbnOU?66NUx6N8VG4jjC&AR)Y7EwqU13Ll}W%UHG(3HrO>7M*a2v}k) z`EvD=BW8IpI=P_zW76^?MYJs_7hOh6mbQCOKg(iga--CM$nPZE*h#w9Za-cTD-IkO zzq6rX4l@}^jKoRrFP_yZR6*SOuY^v3<-mt~715Gd=koW#M(Hm>ql}_ga*dG4y|Jgy zFL0+5_Qdi{)E3>O^4~h%+~xlHMdIP{N3S~=X(pFfbgQ!?lT?74nFQ@Sc1%}Wwtu2i zr**FL(7wh5`|h)Dho{AVjOYi>8SM%~oecU~Qv#&V-063*HgKs?9CW^YC8i%hy=0jF zr;RLOeIu=heQS?DtnOVkPSJ3*H*#pW@%62LcCR|^7oz%Mrp0NGfOye9t^PsjuUVVk zgI%RPMyCugOv}1V=b87=@#Ipz5Q(J<&S&pQCtQ4<&e&J>oja`Z$HGHhiPH?J0Db&) zRn6tY_~1PxX+VNOdbcRASS^kzwInJo_O@A7#)3y3HBp1W9%pL3RUE+A#arK-JRg%I zsiv`t$+7G;(Mq#O_tBFkwdxII?^KZ0rpUWZr%Jj4Keh#>!Z5$ zvVrY0HO&+q@>%9WqWqN!su*`;U1ve&>f^z<$=+spwG;+ZT;Ia}Ve>I+569kAa|;>{ zU*|MFqPXzMvEHT}FAmvwA#V-?(_OK4#wwo8eY%-Vl8Q(qJrmAVt1oQK?7r$(k7KMW zes40xV+&lIyIrl9h;)_AWOwDH{7$yQIrk$I6=!SBmg2k-Kozq3qdKXv?!({OZE%^5 zHOAMlBev*m{Ep$?gOqc)XZ6IlLTo%olx@F+x7R4d>4?Wuyq^L<5SR2u;-DqmZ-;NE z1zl#(;E}|5eWkdT2W2-`?*@HM--h_tx(q+hpk>K9X?D^uA-!H?-EX_J>c#%q;9|IO z+w$~`!TZOj59#2@o1=8}J;0?;*LStF=HsLN^R&y%p1ATljXFX;@<;Slvy*(E2hR2S zzPi>%X3z`6YaxQ?xTS9LXY#v~Xxja!KWdx~>FFoxAc^YHNm>q60u{Uo91gUdY^(^> zZ8K)Fx(}JyDFVk@J}P%Sm=!~slMB;4*iN^@Hl1p8 z83*WRQD;X0f%e0Ze$Zhf001%jaG|kK{v3LsJyyPD>Dz~KAQt22AVKV{!cs`*fllC+ z{myf`VBS=2PD84~$o8EoT-lVSP@MODud@lU+Xy0GtVy^BvKBLz=HA)Ie;JY0W^?Du zt0wFA-X|<%hy1ldIYeUtdwjG|EvcIVD6>n}F5VPEZ0jMXE+@aH#1lH4ko4%mU01f- z13K4LIrVRg!(IVei7DMNy<(`v3F>0s#Q;rVuYw_d)H{BG5S13g`FWwY(&^z7uZaS# z5k3x`&~_t!$<$EJ3g)N5pY2L7M&Cj}I>6(#XuD)pg_lO@-=p`BsQtiZUajW@n*Y1D zP$dyr+2Ggn2_)D|sl7kOZ#ZL2HnJBc*5)?5Bs*&@2#x{Ge(74$SIUX4_mgZxwt>kL z^R575RMJAA`q6`Td8}Qo+iVT8lNvaJq|otLjOes47GK>$>>mDDpxJYLrL!!Q$w*5vL9THIYrI-Rg&)RU`OU5$hi3j}v&i5)BKt-&4*Vdkcm{ zpnbCIV46!(KIDrDKa^W2M+6{Bpex=E7|^RnqHj{S?6cNFd;_?C`3W&?4@f>s-YVr4 zLZ&I#1*-bI-m?ty{Wth+an{c=rZ~f7#MN70NQ+zD^*Kf!bGARM!fH^cc9=W%$I2c* ztZb{q^2B_8uT&Y!IV$4J%f!Kf`8|z1rtG$1p^}0mNb4G(><%h@f0M>y?kXK;-|yu& zbs15*>>Jn-hdVTOrWcggFD%Rv!a?QGl3stsDxkQKs3!Y3OBUDARbM`5rH{>?-i!Zm zxsiaw>Jj9Tp}$C3a7EN`Ql5MU#alO~P4-*kxpWGn4ZlM)hXS#KxaoE>u>-m~Wn~jqHIvb}Cnc7dMVG><)8Li)R^*C%MtKu6BR2HlN#UHe91aeD zk*$0ZIw6X=s#AR!R_9oqmMH@PuE97q5GVQe6(A798z6rq1oT<-BLVmk&ywyGYx z)|p@_j>>09+rM$RODnkVLt$MM(HB{;A)m+MVigAu9}OB7ZFPBt1mdCEl3ii_;n^|6 ztyCH{Cv(F3^A^u*!55THw!`cq4L;|X$k!mFAzx+v*vJ)79YYuuuFtDJs25;C&87A~ zwbXEZ7JG8w7ZF4JlF28?QOPU=9?~TdOspDOMAz=+Xkbt)5ew2d1~gGNtMY*{PPojg zBqC75S?@RGqG*)JP<=OvP4*OOo9D z;P);Hv4b8mTd+I{1herFrm&E1q>|@oNQ}yXA}81K9+%4QfKto?#aPwf{t;y*f13qq zVz4&uZ>$dj0&$=xwA39Rnn^61k+^b{fM`V0A%yDvzs zCX<1!uztBU{7r&^;#wcnuKa`;Z)v!l>JdP|d-SMowXH|1=NK3z*2TcZDl*H&St}EG zkycx*`Py^hW$m#cn9xU&6hTPasq{F`mS~Rp3}3ma8UwP3+3Z-{l8vX4YA8z?md8>& z+Vvh|Wc;A{q^!!Hl;#=UhZ|JH+fIdXj7DmqU5QwIH^}fi@#A&meLSK_#KW-mhIG3p zwP*~ZYyD#jq_l^5kvk~8PCg^*A{8>=z!&6wpv>HQMRDO9aKcY+T$x)@;F3cjKrC|Y z#QCt&{Oe$TG`5YEK2NyA99b_~BDPjvWSEnNt4OE7ybliTd4JyWgoAi0MKve|9}lC0+DbJt>8 z3UZzwgR=X&Fh$P%V+qBDN1MDuh>FV~b!lJw^F?vX69a2(FDP2h)`IrT^MZ%Y+MK@6 zn`@(Ti0P)y6HmamqU{z4^Na^tMn z>4e9og0$Pb_Aa;=o7f6N)Lvg#vVI<0ziSi9lpi(Vznnin4$`&w7KqFR#VRSvH{!!$ zGE=Zs3477g1>+qLif>*QPblvtx@sEh*jbhh)QDSKf>*p8P>f_#oqqcz^FL(on z6N=Pu^;}ryJG>h;u~U(LFw%6}m{+m>&gZJ4S6(sB|3iN-gz5N;&pJIQv;1%tW zZF^9g*o+C2hOhL88nRXp;I@PvEgapZA2_aVYnNIQAZS3|oDKW`|=(vZ49a z(|J{#A?v7xw$W$A+4_$X>teSh?5M;0;CWoR zBp7Ql*^X7l6o&~}@}3JMwJl!BX(6M@Z(ZKHj8*(A#&`LwHLDseB=GmM+It~`MOl^I`isS`0$y00#!4ODAdMI zc*2>)gOpL$NKp*5dKA7)MdxtfNYe*)Br7OWbv(oQBES;-r{V1q``F|YKm0UOtyj$C zkCO8rcIqjJNX6A)f$E6>%kK5_X0$O#*c*cQ8m}Ayh*65hP+Y!89}b8@ zCJ*x6mZN)3r?EG>F!oOKb9{n@$W=ITE31AcsxV1*V!m}A);>enBklV%ISkf8RayN_ zd3sBO!hP)=n)kLB7I@Rh(^xq7nR*kRLbI`z{zD|JJtkiJ}i?07|ZFN z@9z?sW(3~XchD3!0!h*Nk1W-PqGMWPyPEewOdn%KRzF`WX(+!=Ld6%!k#e{K)#5UZ z97MoycklyWk?4z5%WhFmZ!jO7`jJpG@2vTyU`6O34}7d?a4F?qMTPx8>KVcRx=f&J z@SozXUX#Z6hl|Yz)j3X z-gkjpaZKnmwMU}hR|n03W`N&O2%QmZK&t~G^f@0^3JN+fq^UxP~3Cj>h5`>Yle2Wycs9?{g zgKhclB%!+`utVv)HEBKW52KOAs00#~*Si&WySoD|e+MG$QESrPR3DJj+Y3sa#K*pL z@!K;jS-KfoDwP5RVLiz8L}BsV!hz?citpLyrMAwuFhH|?*}TE!l6E8b;!FO}smA@8#$+Dd?e=c$-F9rT_U#Ph z*5H=ve$(ZyV0Pj-v){5(VQ%&`8`iW7T)xHkzM#T6bzdfVJ6m!4`W!smHD3Sek@76L zKWx3*Yb{=aH!qd6`X6lhmy3bD|U|LB^Zn3&3-! zZDv+3$slYx%{nY?*=uZZT;Nuw2Bn|Y%gENE`$39NpPo2B?LHzZY8Y~Uqa%5iOHjuD z>XN@@!?4AAsG_nMp~xze!Hdk|boZZp<)?e@4S_X8v%^5|XX@rbZ8)H_Qpc2rJu1rO zHz#zTn_H~APLRGz*!}6h_p^AR@%^j&yTf}E8c@Xbc(G+3MpHL6UAn)9I3#<4W*5@; zr_z(uOPAfdJ^p`trY?Q~O~ut6y!F2E!+6GG&G{0bR?n3nZgT9{IGUW#S0Y=sBa2OM zCr!%^{0@C8;MVq-Jo02kMb z^_gF*(|eHr6zGP#rXU9P*FOW`Kg*n`!4pRf71Vp!ZI`=j_z?WO74RocXk_@{+uYaQ zolg7jPnQd5%5_i0l|2KUlAfP;AjmEKMx3*(x;J**>iLL-p{iFlP{T1Zr zozd>a&JES!hv~-h^IAJwFoZbQ1AjnTGwHz$jxPYFd+)VcLh2_z2`q~suc@@Gs}vVX z?%Pkoe4((xQftt@ohXG+ycpWGDbd@h(8}m*bf%8XtGaqHK_?2BQDpQU*&yGitm5kIu*CxPiWk} zJkPZ9Yq=K{TCOwvP@ISv;g%!O$8LY+p zp-HbyL|^3y-qFbap7TA+qbpMv+sXe`&(TF8x_idavdXbL4Fgj1CNa=<*-L0(?D9<# z@s62RSZa5KpK#xwIDq7Q2`%^~zvA|p8QAn!gIo>T?&7u|-Yy=N1>j4^Lg4#Lcl+mu zx%U|lA@{NOm$5E>7^YWArUuR6=`CyB_SDV)OfjHl*moXG9`~Ssfx9~3e4NkDN)n=?CSr}@C6;@ad%-btAMc33guq=l^4_8dm7{uTkQu?vxhe%X0WeVe|( zbZ#om0{VXod#)HbSOA!EGLM64BwS~s&3d2FvXim93b|==x#@N(tw65j`8E5IZG;vu zEYQzIHXK_v9e1J0)4zq*o02TD*Feoh!RH0MAG!)^F5{+Ak|$|<>RQu>mobM$hq5hR zdNU7h!!>*@RxBI(MkE2peb*<`Gr=~=@nl^3cAOt_djmhQg>FrI{u{YV$&SINYZbfr zW4Y(p)~pEcbNuG#J&{MNoAs`rZ4&X|x{J8NSww$jaN5>ootBRKkE);gc-eS+_E@N@ z9naZ0dLN`=j_8d|bziK1KW;)ClalO{#KMWgaQGMa=P2j$J)kvcNxK&cn5v-*^89us zsx#ur3``yH4oYQ7QqyB>E? zRQvTn7gBP#=EP67+}%6%4t_*~#98fe>PP;!W=9^NSk}Uh=Zv#2_nCgE9h1%o(@mMu zX6ytET~hudE)KFJ%VIhX_xOiq;KS!X(H)W#u1~~$MC{+COk&iVE@8_H1#vDri*w>)?VK<_w5+BF6ff_BZ{Z{ z@zH`f#LUc%O@&eP{4gpAKQV3jKClGn`yG=996vh@>YE|BKO%5x#$;PH{2}8_$R=^y6J5j!HtY0Z|}C{(#@vuw5h6;256iXlQg|z zmPOn_FD`wuJz7lQv(ryTsO^^_aR<%a%fj#k58Z zQ8C~tUbKFM^ZE30!qBa8KziCgp4&D=Gpne0!;E!%*s zWziB@%~$%Trf90$dD|RVpVgm`g=Ijg{Rm*B9(G=>Xpc?Ki(l=>H#h5yNRMugg^qID zM#WxQl=j?ufSciW@)|XD0aTguerqbn^p&Iq3oQ{7vZuQKb!ZR4Z*rDzJ;bn zW3}USd6}3}sSFoYDY7$Kf-oUHVy80ct_@a)?s&3XSC+~!EsY{*di~Axbw$k=+1>|K z&Wz5a&K$C&7%G4Edv!Yl>ai_~IicY! zvU;<2%t}^Vd^-`2b?i+xQZ5)dLGTcHlyb{V+U|2}M%lo~APJ7PYMyo*ZNd=aD)B2o z>ED*S^yWoWH_o46wS~X8JmN=8Wy=zz>+8_8Ga&6v+v14R_<*;;yz07a>ALKEhtbz$ z)HDEelS(U?+P^aRQ5@cn$PtuPu(fNK6UeI1l4b{Cg~s*u!|fV1!XnT~%3Y1#n{Ytf zbf&fH;_=$HUg)9vd0DX@`SP`Ir2T{RLzg%a4|;n(kNLjz;%{ulTel^nGsi@cU#3M- z;)`wPT*EYGrioZ>jO32ue6o0nr6G=;@Rgb6<`z&*E{AAkuP`J?W)pQAapv>Xt!1wq zhFR?lzRq0XAA}OaC^+us;b@t5ONghzN#qpo_`V@OQ0=e_u&1Vsy+e#TdPfnQeB~;S zhH$Uz>syP$$oz2AsEx)8>U`c{`77d2j3oancldmkxu?5Zp~LS_rVPGgfOvNDzkn!Q zh$FwgewrPSJ&)>IkkBaCZOs4tY~n(ub#KW({{6=&}9Z&v+IagOK_PxE`m(h|z#tV99=7Ww!wqKQJ7_4Ew5hOz`{$g@ZjUSbH8$_VPPttCem$o^TmS@FAaE=f^LPYMCyWB(TL{Lz~Im?z%ek=q`V8}RnTG}V2& zlbN(gE8l)6iRk&dsMYj>#z?}?P7DlCsvsK@pp1Z# z22q*J;g}o+Ute#*L&Et>W>sYx-u%%0$`vU8HcZ)4l{1ZS1iH~Ke%tvZ#YkJj|B651 zWJ?OxkjI>EWXQ~*1$K6xmeaL=l#iEvNK8?OTa|w8w*>R^@g-4RU>y`Co> z3|BT;KKR2~lBlNKa;U4v;+tU)fbQpi0iOz!LAupJ163xw!*t58XF*XLSDf{)>Mx?w z4!wHBWBjG(2WpmxigLLMTng}@iItR&2v=Lydvu&gwoj6#n9-^oLy{h1Y26h72AB$#_FoTXgs6ZRU7hg6%n@ z11>Lxx%Th=FM6>-)Wl?Z-KpzB@*|A3 zD_!;Z<@+IBJ%7ORzqrG!BN;4)2;tzMtIn>@@?Yf~W-@{r!~iHM|2$tZDzwSLaPnb1 zWnlgX^T*%OnITi8FQ81d)b6y3Mk1!oZ;`9P6fB7k-=~{0zUI@A~##*a)h^!In;+`Oor<5RA{u{G&qMv`Tqe-J4Ry$HN z!*C;W5o%t=+ow{t<(A;w(wr{EQ4&{MjzCW{ICtekIs35?k1l-u2YjUYFf=(P`tEve zGRf|*ra)hn%|BZL-jA|4)=k!DP}!#oByl4JCBCC?H@QkF&LuA8nVSmNJfM#W4l8P zac2#~OvW-JYuO7~Bgb~#ab3f-i=XZYpKl9)G zHRsGZ-*c|-b-k|lr?4yTu{P93f>q`+Gu}|u-)vQ@@QQ`vlxk4<3A|KXCn3xJ*Zl^t zfWHNq#bn{zIm}#qPuio&qw5V8@3W-~jEEiQeTxGXZa59S6y@W@uOw;GaxB_BRt6IH!>*ZTDu3e4*PkQp)nX=2GH4EdW)w zlRm2a^V3u_1W)$->|XN43ZQIfffB?}U&ZY_kz|Ic8xfHPDq-nAZtuscu#xrc9} zLn2#@adr)iH)+=XtzNnpjx{^W=2->D9X0*~a^6Q_Vm~2};cDFBf@sj7s#H{@)WM-z zp#Z@+nTn2ka;OF*{uwN2%`hS6m+_}LfjbU$>ak6RqI5;2wf*1l+VkL>9heOIe&dkC zd&pzrFlpv-`M2v=a%0+&U|rrus%x}&bAOHQV7)aTW&sndKRyB#$>1SbtPjXQV|YIc z^!kNF^BleT)`&)xWi9+3Xo25D%p=DtGq+)>q6|tt#i29YW`1YcR2kdKnt;e%t&mPl zyPy;yG+{rEpAOq0%KlD?{b2!{^g`LeWyz*eRR%YU>(f7Wuy=1C zZ#CO`mTX!1442YHNz*zny_1vHiB@fUuEi0$bNAj|Qvo&U=Hwe=Ip=4_iPR4H(kyVL zVNy-GGj71`1m!F~kvkX`1#`o6_iIEoBXzq)#mNeWO<7= z>X!Qo3#iv;*v)^oIM4mPWl=Q9CS&LE(_4!#&B1H=f)J0O!O;#9Doxb3*}FXU1%ecJ z9}BptNQH1io%QQ5UZKsHt43RUi?pJ0BzEG>r27+Lw}AtjuRgcT_&X%S|0uQhL=Je_ z`&&`Co(1Fu!Tk52t6ZN~rGt&{OKV(RyTwD^V^@2K1l9TXKH_bNb|R|*8t$=1<7{>+ zce4Qy>kq`BmDqq-|Le=(?nQhtaxjZcp7KDFV9ggy(C*PqG|-!PWxEgyZ%NZ=G#Bt* zX^5H=&kgQpEhSd-x1M9PE54Bq3;4(k5wF5U$q~FrZ>*tot@2)In2Pj9e{p2rHC9!~ z2E}(n9@4HWE6CWfOL@S@rQrCq;-qc*6QJMkVDGhFYKdpE!)ncmw=TT!tLf&6P-4Zt zDAl`&FH0cWXn+x)F&C@d$%gQ8(PIJ@*uHmjKVglS&Y_)}NcS;5WXc!zsFg;l!jt^i z&sEGC3pXYOzt8VS$p}#Z`A_xpGycTv3(JgQ7O=*R3jAUFB9BR{;3M=zqf*)T8g+?B zrq3?ATUO5y#ioqG3tg)9*BRH=1MGds$|6kPA;GN7+FxXzk^(b2NAR8gp+(A`mY$dC zu(;D{D9WrJ$JByFxe{*Ggcmm31e0y2>5~O*CmMJyt<~}im`_{CSZ&?h6k;woRV9(6 zG`8(we}oYyq9!=&5~e8SLAA0f$1AUaT^bH|@1mB*DNn{nY5ZmnFYxM1j_6oNR7V!p z(*rDDK1V|uv*p)k?QBlGHg&){j)fr9_}(#(#F}{tg>Wv3zTK;i@;%jv(9PK>==l zrloOHm&8>@aNT?p1tWs_ghu;TrIxxkn`KuRT(lO?A$8P=L`2<~ULYp401sBLIPUB( zQ~wSx8|%T zD4Bb_?|UVUN%sY=4A6p~Ew}M9Uo>rwMryvwj+K|R+UyC3cAT0r37=IFz`b?X_Bcy9<9UFEg&b8kly& zNNDtenU!M#|6l~@Hx2ctr3fDVnnanC&>J*HjVZ>EGRW)uiP$I3tyzL2v2a%Ue5*M@ zo64wi^20A~?yB#!CazAFAU3mjrw>k-h#5P^ z1+}@ZY|_l9qjmC|SMLZDS|665$M(Fzf%2Jf7s+<6DC;B=Lo78_bG8t*)HduKXGF8^ zY1)r>#Zz0U_04{v8dFA$?n>Pw>h+C) zNm?VPxWjPiAI_a}d%64!(AC&Z{*0mwUnYjg1`hgsiqP z_YCz#n$@LA?OYyo~58Zo8d>3YOlxNml;m zn+A*oUjoL=?v4Km)K?Waqlr)Abr_?W&iI=C#vZxfD->RGRDr{=pK*j+bj9v-o=BcBcdOV(~OKnJ)ys9eHR@`TDsF@wU% z0EMB~wT>YZYH~5t!L-4#^9cc(*o5JS53*;{Qb(b#3VguAI>%*%x6IMOy$oc2Su9__ z$_|(Qn4D5Y5SB^<#-kpZg}#3Lf_#NzSSnH>z!~%O4;m|HJW|4w+uHkxnag~i*3ra- z8<%wg8z_+}$e!Q*+#ybSt^7+hl=&twft2Scz-}ASkfsCNGE%4Nu+;ai3&)jT6MQW| z?th*N7ZAeJf@WxWL1>1-hs+F;gbjrTO}-KQTz7JT4nmBd%ww*s5hrd|`n)ov@JzoR zcXo(b1+Nw;VYsq#;kt%i#9#8fdR2xFm|AAefQ2N<-%kv*Z|Tk88`6eHmp#u>w9GoS z=RlWRZI_H$d|vd(hV0%K=@1<{d;YcKZovHS`J#~_69L`(O>1&6NtL54{~p(rYu?p8 zN^r{Lh`W#^JzJwDWQvL%PzulrCl*)6>^=hmA*x~weyUknqqEIhF3?#uhCmBoJ)g3NrSiM0 zS8hzIB{$B;Ne3?PQ1F%WT$S;$X4tXfDv1x;A^Cbkh%Ahgo}0?I3(%`(?@BSYz}ijkkXCRfj)R)8RsZRtUK4s z?R}38r@7m*<%&X0nd~hoPscXNHV(Rr(Y^wMx&^qpRe`!5@gQ5)MyI~cG5J1p)zriC zgBy9fStUW9=>t%`BDqN_11Bas{*T0(-5~Xd7k$9?kH~gD%AWS%eA0o5lHSVcTg{^c zvpLIza=w5ur?+^~JK;CE(lkq1!2;y9SwALM_(d@$@jXPCn;2d$ziD(Fk-#=?TFi@P zA>x_~TOVrO3%*UmT=HryA|3}6wL74w<7mKyX7gMCe-{zBc7G=G4;tL~p{53$)UFtF zVm4mCC6rAL@=sp(p#qbkXQrIHL%trJ?bv)X^gW@S3uLgiIX({_)%GW!aa%)b^^Cm9 z8#~vNQew}BX(JB%zwf34bIgVGPG{CqQ7u&FN%l**sz@E+HiMFFkZ}B8Z^*W+eHvV?i zeK|4zhpS%Ff%MKeppO3_iv9(w&!#XhdX@ugGXcG4vn?)neU4iDQ?)m{7-~O%E&W;( zAiXZrLL}{pT50o$PPka$uFRb5@Yy@V!^fkQ+ps9i{4H66zeLtqMuaM&c(w5T?NzW0 zqaN~c+h^eDpmOM6wt9~usTr{Fzq;BO$LKzejRBf%^{Pjpu{W%bK9@y$cC>{Q!NYh- zQ1eQ$!sH44Z0dJA;59K*Y%u+^n^ZWDbg~f_HTS0BGU?RkyaeXqm+tR;`)t!ms;3oP zp5B+{6i;ex2i?IE;kE@5Q!UU?CVEL?9ojBau?((IfHCFggwtsS^I-Fx?i*hJ%(tlU z{S3aG#PY=_fB&QUfrpEuBja}2^Sq<^&m!@$Y&+~^h76?XzcjN`ki;>ja9vh2=EpC`k32&rO0@mUwqAww)>?4Tx~6uP`T@MDNVc(-HSH5biu;jpjwBVr_ zY`{4-{3SQJ%|L7QM1JAjT3+JRg;FJ(PctQp%36v9-i9bJu~GB+wvK0bAN%%MQcITP zaYv#5gqlmJ8y~$}EfVHyYb|TljaC9I8V~*R{Kx$hz*S;r6S2C8%r2M-KUQZXWnUQl ztZ)36Y6iyI{6jUbK>t$BX}?r69qm7MqmBXhT3M!CYIL1@uS#eLBol4$PYEsAr%=G84C>l zX_zwbA6k6)fn`Xsuw1n%mF@7bwP(l;c*$=iS}6UljGfovCx9_NhOa>}Sb8WYEC1=o6<74>p&x4n0-E~) zKs=261&Bx1Cx0%3QKz|J5H>sd5$B^)zQZ_!Z89IW_YN0Se(-narLv2eqU?%Lt1gke z0&OFfBm1CwoM6%>$CpG?rL`-cg}~b>qvj^%7GbemoMWFKUGZ@D?qt!3e4Gs&^teH) z?iPknse~*e7R?=T{A@65P@Cp%=0l#NMbv{hrxBx1B*6}`V*=2Aqp1w!Z&3{R=R{nX z5j>MU^`nFN)o2idbT6_qxn@EviLin+E}QbfHLgS8_YF)Hj!PH)J0%{v=`3@~RzM+~ z9*k%vcF73*WIcUbW`pCBIK;3@1TjX>X#h=AdEUBo5Mu<-qfXA7uvb_Ir?X}TL@26c zkb+8#Kn}PgNX#o0cM_KBf_IubyHtJ)obdfHdYoB|&wv@cRzkv}ggk-DSS#~G6OkORvO&hSzX{-^a32s?!qPD3POul4h*kAi+P>np^6Y0QmH<|AB4r~S z$t9f6-rw4eVLAlPVDGlB9|BEPyS=w<%NqblA+EK@PAMEiztW^n@_UNDhLZo@PmVNf z2cJV!cTBcRuCn8alW96E>ta2OyY(to?^C7Tvr>FRZudTjGlCG$RKGJ!wq@Ki+E9jO z8=PKumtm|dt9ad=`-UVM1`6jXQ{_~fzr+qDf!ikowLsZ-@=~2Q}v*t8jX*2IJJ}c3De!jcG=@wErLE7tgH= ziizm>J(`a>9#FqN<%s80toES56PP z)R(J~Hc&F=mhwghR|N3N1kMcckvvY)R*Z?kQ<23$AWS=P5BjI{EqZ|6TqV(UrHGdw z`#0oU=5!@n+|}er%h|{iL_dVHZ@oC3QtM%v-e3#@(VsQY)%tx@yb#JVsoM2T&ETCI zFndtkwFffV?F9t#zo5?;*eESMHQjl++HlMBJewlO2b4+I>_w>;cl9f?u1T=2c@_-J z)dRE0dz-OJYI+?d@_jxdTMv0R1ffS6d)^!YQ9KcJivA$9I3kq@u7V<|cz%Xq;6 zS7xp7s6@*kr52q7^7`Xx`pnY03PU$Mq1f*e*SR+5IdNeG8fJRdVA&C%pT*oy4(P8! zguS{swv+QxYR@wXdcs3Sx9TSBZS&!G-y2^ZyUL7be$#*Xb-d5YR)t;j%V;%<=yGUd zN^Maio1u+ZJ@8ZF22*_>85JKfL`fWd`LDHrM8>Hm_EfB5_z$^Wn5#{Vy6 d{jz`a5ae|m", ls=':') + arrowprops = dict(arrowstyle="->", color='gray') + options = underride(options, arrowprops=arrowprops) + self.options = options + + def draw(self, ax, x, y, **options): + options = override(self.options, **options) + dx = options.pop('dx', 0.5) + dy = options.pop('dy', 0) + shim = options.pop('shim', 0.02) + + handle = ax.annotate("", [x+dx, y+dy], [x+shim, y], **options) + bbox = get_bbox(ax, handle) + self.bbox = bbox + return bbox + + +class ReturnArrow(object): + def __init__(self, **options): + style = "Simple, tail_width=0.5, head_width=4, head_length=8" + options = underride(options, arrowstyle=style, color="gray") + self.options = options + + def draw(self, ax, x, y, **options): + options = override(self.options, **options) + value = options.pop('value', None) + dx = options.pop('dx', 0) + dy = options.pop('dy', 0.4) + shim = options.pop('shim', 0.02) + + x += shim + arrow = patches.FancyArrowPatch((x, y), (x+dx, y+dy), + connectionstyle="arc3,rad=.6", **options) + handle = ax.add_patch(arrow) + bbox = get_bbox(ax, handle) + + if value is not None: + handle = plt.text(x+0.15, y+dy/2, str(value), ha='left', va='center') + bbox2 = get_bbox(ax, handle) + bbox = Bbox.union([bbox, bbox2]) + + self.bbox = bbox + return bbox + + +class Frame(object): + def __init__(self, bindings, **options): + self.bindings = bindings + self.options = options + + def draw(self, ax, x, y, **options): + options = override(self.options, **options) + name = options.pop('name', '') + value = options.pop('value', None) + dx = options.pop('dx', 0) + dy = options.pop('dy', 0) + offsetx = options.pop('offsetx', 0) + offsety = options.pop('offsety', 0) + shim = options.pop('shim', 0) + loc = options.pop('loc', 'top') + box_around = options.pop('box_around', None) + + x += offsetx + y += offsety + save_y = y + + if len(self.bindings) == 0: + bbox = Bbox([[x, y], [x, y]]) + bboxes = [bbox] + else: + bboxes = [] + + # draw the bindings + for binding in self.bindings: + bbox = binding.draw(ax, x, y) + bboxes.append(bbox) + x += dx + y += dy + + if box_around: + bbox1 = draw_bbox(ax, box_around, **options) + else: + bbox1 = draw_box_around(ax, bboxes, **options) + bboxes.append(bbox1) + + if value is not None: + arrow = ReturnArrow(value=value) + x = bbox1.xmax + shim + bbox2 = arrow.draw(ax, x, save_y, value=value) + bboxes.append(bbox2) + + if name: + if loc == 'top': + x = bbox1.xmin + y = bbox1.ymax + 0.02 + handle = plt.text(x, y, name, ha='left', va='bottom') + elif loc == 'left': + x = bbox1.xmin - 0.1 + y = save_y + handle = plt.text(x, y, name, ha='right', va='center') + bbox3 = get_bbox(ax, handle) + bboxes.append(bbox3) + + bbox = Bbox.union(bboxes) + self.bbox = bbox + return bbox + + +class Stack(object): + def __init__(self, frames, **options): + self.frames = frames + self.options = options + + def draw(self, ax, x, y, **options): + options = override(self.options, **options) + dx = options.pop('dx', 0) + dy = options.pop('dy', -0.4) + + # draw the frames + bboxes = [] + for frame in self.frames: + bbox = frame.draw(ax, x, y) + bboxes.append(bbox) + x += dx + y += dy + + bbox = Bbox.union(bboxes) + self.bbox = bbox + return bbox + +def make_rebind(name, seq): + bindings = [] + for i, value in enumerate(seq): + dy = dy=-0.3*i + if i == len(seq)-1: + binding = make_binding(name, value, dy=dy) + else: + arrowprops = dict(arrowstyle="->", color='gray', ls=':') + binding = make_binding('', value, dy=dy, arrowprops=arrowprops) + bindings.append(binding) + + return bindings + +def make_element(index, value): + return Element(Value(index), Value(repr(value))) + +def make_list(seq, name='list', **options): + elements = [make_element(index, value) for index, value in enumerate(seq)] + return Frame(elements, name=name, **options) + +def draw_bindings(bindings, ax, x, y): + bboxes = [] + for binding in bindings: + bbox = binding.draw(ax, x, y) + bboxes.append(bbox) + + bbox = Bbox.union(bboxes) + return bbox \ No newline at end of file diff --git a/chapters/thinkpython.py b/chapters/thinkpython.py new file mode 100644 index 0000000..3f08885 --- /dev/null +++ b/chapters/thinkpython.py @@ -0,0 +1,93 @@ +import contextlib +import io +import re + + +def extract_function_name(text): + """Find a function definition and return its name. + + text: String + + returns: String or None + """ + pattern = r"def\s+(\w+)\s*\(" + match = re.search(pattern, text) + if match: + func_name = match.group(1) + return func_name + else: + return None + + +# the functions that define cell magic commands are only defined +# if we're running in Jupyter. + +try: + from IPython.core.magic import register_cell_magic + from IPython.core.magic_arguments import argument, magic_arguments, parse_argstring + + @register_cell_magic + def add_method_to(args, cell): + + # get the name of the function defined in this cell + func_name = extract_function_name(cell) + if func_name is None: + return f"This cell doesn't define any new functions." + + # get the class we're adding it to + namespace = get_ipython().user_ns + class_name = args + cls = namespace.get(class_name, None) + if cls is None: + return f"Class '{class_name}' not found." + + # save the old version of the function if it was already defined + old_func = namespace.get(func_name, None) + if old_func is not None: + del namespace[func_name] + + # Execute the cell to define the function + get_ipython().run_cell(cell) + + # get the newly defined function + new_func = namespace.get(func_name, None) + if new_func is None: + return f"This cell didn't define {func_name}." + + # add the function to the class and remove it from the namespace + setattr(cls, func_name, new_func) + del namespace[func_name] + + # restore the old function to the namespace + if old_func is not None: + namespace[func_name] = old_func + + @register_cell_magic + def expect_error(line, cell): + try: + get_ipython().run_cell(cell) + except Exception as e: + get_ipython().run_cell("%tb") + + @magic_arguments() + @argument("exception", help="Type of exception to catch") + @register_cell_magic + def expect(line, cell): + args = parse_argstring(expect, line) + exception = eval(args.exception) + try: + get_ipython().run_cell(cell) + except exception as e: + get_ipython().run_cell("%tb") + + def traceback(mode): + """Set the traceback mode. + + mode: string + """ + with contextlib.redirect_stdout(io.StringIO()): + get_ipython().run_cell(f"%xmode {mode}") + + traceback("Minimal") +except (ImportError, NameError): + print("Warning: IPython is not available, cell magic not defined.")