{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"2022-01-26-reinforce.ipynb","provenance":[{"file_id":"https://github.com/recohut/nbs/blob/main/raw/T365137%20%7C%20REINFORCE%20in%20PyTorch.ipynb","timestamp":1644673798189}],"collapsed_sections":[],"authorship_tag":"ABX9TyPvQry7G08zNChJqXqGydZl"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","metadata":{"id":"EsWO9mLNJqqy"},"source":["# REINFORCE in PyTorch"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"2xm8x19-HLxm","executionInfo":{"status":"ok","timestamp":1634908084389,"user_tz":-330,"elapsed":3601,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"c610fd77-c3d8-414e-8e6e-fc9c492fa089"},"source":["!pip install -q watermark\n","%reload_ext watermark\n","%watermark -m -iv -u -t -d"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Last updated: 2021-10-22 13:08:10\n","\n","Compiler : GCC 7.5.0\n","OS : Linux\n","Release : 5.4.104+\n","Machine : x86_64\n","Processor : x86_64\n","CPU cores : 2\n","Architecture: 64bit\n","\n","gym : 0.17.3\n","numpy : 1.19.5\n","torch : 1.9.0+cu111\n","matplotlib: 3.2.2\n","IPython : 5.5.0\n","\n"]}]},{"cell_type":"markdown","metadata":{"id":"tUedeymSIaGe"},"source":["---"]},{"cell_type":"code","metadata":{"id":"gB58AmCQH5IP"},"source":["!pip install gym pyvirtualdisplay > /dev/null 2>&1\n","!apt-get install -y xvfb python-opengl ffmpeg > /dev/null 2>&1\n","\n","!apt-get update > /dev/null 2>&1\n","!apt-get install cmake > /dev/null 2>&1\n","!pip install --upgrade setuptools 2>&1\n","!pip install ez_setup > /dev/null 2>&1\n","!pip install gym[atari] > /dev/null 2>&1\n","\n","!wget http://www.atarimania.com/roms/Roms.rar\n","!mkdir /content/ROM/\n","!unrar e /content/Roms.rar /content/ROM/\n","!python -m atari_py.import_roms /content/ROM/"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"5hmUsRZNH5If"},"source":["import gym\n","from gym.wrappers import Monitor\n","import glob\n","import io\n","import base64\n","from IPython.display import HTML\n","from pyvirtualdisplay import Display\n","from IPython import display as ipythondisplay\n","\n","display = Display(visible=0, size=(1400, 900))\n","display.start()\n","\n","\"\"\"\n","Utility functions to enable video recording of gym environment \n","and displaying it.\n","To enable video, just do \"env = wrap_env(env)\"\"\n","\"\"\"\n","\n","def show_video():\n"," mp4list = glob.glob('video/*.mp4')\n"," if len(mp4list) > 0:\n"," mp4 = mp4list[0]\n"," video = io.open(mp4, 'r+b').read()\n"," encoded = base64.b64encode(video)\n"," ipythondisplay.display(HTML(data=''''''.format(encoded.decode('ascii'))))\n"," else: \n"," print(\"Could not find video\")\n"," \n","\n","def wrap_env(env):\n"," env = Monitor(env, './video', force=True)\n"," return env"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"XxINAZsiHLp0"},"source":["---"]},{"cell_type":"code","metadata":{"id":"vaxMAMEFE4R8"},"source":["import gym\n","import numpy as np\n","from collections import deque\n","import matplotlib.pyplot as plt\n","%matplotlib inline\n","\n","import torch\n","torch.manual_seed(0) # set random seed\n","import torch.nn as nn\n","import torch.nn.functional as F\n","import torch.optim as optim\n","from torch.distributions import Categorical"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"hjW7DIxtFP8v","executionInfo":{"status":"ok","timestamp":1634908503685,"user_tz":-330,"elapsed":10,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"f0eafef1-cdb0-4c91-90a5-cc85f7a4984e"},"source":["env = gym.make('CartPole-v0')\n","env.seed(0)\n","print('observation space:', env.observation_space)\n","print('action space:', env.action_space)\n","\n","device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n","\n","class Policy(nn.Module):\n"," def __init__(self, s_size=4, h_size=16, a_size=2):\n"," super(Policy, self).__init__()\n"," self.fc1 = nn.Linear(s_size, h_size)\n"," self.fc2 = nn.Linear(h_size, a_size)\n","\n"," def forward(self, x):\n"," x = F.relu(self.fc1(x))\n"," x = self.fc2(x)\n"," return F.softmax(x, dim=1)\n"," \n"," def act(self, state):\n"," state = torch.from_numpy(state).float().unsqueeze(0).to(device)\n"," probs = self.forward(state).cpu()\n"," m = Categorical(probs)\n"," action = m.sample()\n"," return action.item(), m.log_prob(action)"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["observation space: Box(-3.4028234663852886e+38, 3.4028234663852886e+38, (4,), float32)\n","action space: Discrete(2)\n"]}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"zGVueeA_Fn7b","executionInfo":{"status":"ok","timestamp":1634908550599,"user_tz":-330,"elapsed":46921,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"331eeab6-adaa-407a-9217-f4452beaa085"},"source":["policy = Policy().to(device)\n","optimizer = optim.Adam(policy.parameters(), lr=1e-2)\n","\n","def reinforce(n_episodes=1000, max_t=1000, gamma=1.0, print_every=100):\n"," scores_deque = deque(maxlen=100)\n"," scores = []\n"," for i_episode in range(1, n_episodes+1):\n"," saved_log_probs = []\n"," rewards = []\n"," state = env.reset()\n"," for t in range(max_t):\n"," action, log_prob = policy.act(state)\n"," saved_log_probs.append(log_prob)\n"," state, reward, done, _ = env.step(action)\n"," rewards.append(reward)\n"," if done:\n"," break \n"," scores_deque.append(sum(rewards))\n"," scores.append(sum(rewards))\n"," \n"," discounts = [gamma**i for i in range(len(rewards)+1)]\n"," R = sum([a*b for a,b in zip(discounts, rewards)])\n"," \n"," policy_loss = []\n"," for log_prob in saved_log_probs:\n"," policy_loss.append(-log_prob * R)\n"," policy_loss = torch.cat(policy_loss).sum()\n"," \n"," optimizer.zero_grad()\n"," policy_loss.backward()\n"," optimizer.step()\n"," \n"," if i_episode % print_every == 0:\n"," print('Episode {}\\tAverage Score: {:.2f}'.format(i_episode, np.mean(scores_deque)))\n"," if np.mean(scores_deque)>=195.0:\n"," print('Environment solved in {:d} episodes!\\tAverage Score: {:.2f}'.format(i_episode-100, np.mean(scores_deque)))\n"," break\n"," \n"," return scores\n"," \n","scores = reinforce()"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Episode 100\tAverage Score: 34.47\n","Episode 200\tAverage Score: 66.26\n","Episode 300\tAverage Score: 87.82\n","Episode 400\tAverage Score: 72.83\n","Episode 500\tAverage Score: 172.00\n","Episode 600\tAverage Score: 160.65\n","Episode 700\tAverage Score: 167.15\n","Environment solved in 691 episodes!\tAverage Score: 196.69\n"]}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":279},"id":"Zyp30sNGHHHf","executionInfo":{"status":"ok","timestamp":1634908550601,"user_tz":-330,"elapsed":23,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"5076a0db-d879-422d-8fc9-60d7b96d7df9"},"source":["fig = plt.figure()\n","ax = fig.add_subplot(111)\n","plt.plot(np.arange(1, len(scores)+1), scores)\n","plt.ylabel('Score')\n","plt.xlabel('Episode #')\n","plt.show()"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAEGCAYAAACKB4k+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO2debwcRdX3f2fm3pt7s+8LWUgCgRAWE7gSdoKEfRM3FhfgQREBkcfnURFE4XV58riLPiIgKCibCggSjOyERQIBQggBQgIhJGQjIftylznvH909011d1V3d0z3TM1Pfzye501vVmZ7uOlXnnDpFzAyDwWAwGAAgV20BDAaDwZAdjFIwGAwGQxGjFAwGg8FQxCgFg8FgMBQxSsFgMBgMRZqqLUA5DB48mMeOHVttMQwGg6GmePHFFz9g5iGyYzWtFMaOHYu5c+dWWwyDwWCoKYjoXdUxYz4yGAwGQxGjFAwGg8FQxCgFg8FgMBQxSsFgMBgMRYxSMBgMBkOR1JQCEY0moseJaCERvUZEX7P3DySih4noLfvvAHs/EdG1RLSYiOYT0f5pyWYwGAwGOWmOFLoA/BczTwJwEICLiWgSgMsBPMrMEwA8am8DwAkAJtj/LgBwXYqyGQwGg0FCavMUmHklgJX2581E9DqAkQBOAzDNPu0WAE8A+Ja9/1a2cnk/R0T9iWiEXY6hRunsLuDel1fgU/uPQi5Hscq4/5X3MW3PIejb2ozFa7Zg7eadOHi3QdJzn1y0FuMH98LogT3LEbsqzFqwEkvWbkWf1iZ8sHln5Ot3dBUAAK1N3r4eA9i0vbO4PXlMf+SIMH/5RuQI6C4AE4f3wfIPt2HD9k70aW3C1p3d2HN4HzTnc/jk/iPx8MLVmDymP+a8vR5HTBiCN1ZtwqLVm3HCviPw5+fexbaObuw3qh+a8zn8e8k69GltwpF7DAEDeGrRWuzsKqCrwOjVkg/9Hhu2d6J/zxZs2t6JtpY8OroKaM7nMKBnM3o05bB680405wjdzNh1UC8sX78NALCtoxv5PKFHPoddB/VCz5Y8Xl+5qVjuxu2d6NfWjA32vWjK5dC7tQnD+vbAolWb0a9nCzZs60BbSx498rmiLE25HHo059Dsen6dsqrJHsP74OT9dkm83IpMXiOisQCmAJgDYJiroV8FYJj9eSSA91yXLbf3eZQCEV0AaySBMWPGpCazIRmuf3IJfvrQIuSJ8MkDRkW+ftHqzbj0jpdx3N7DcP3n2zH9508CAJbOOMl37sMLV+NLt85FPkdY8qMTy5a90lz455c82xRBh4rLorivFY/d8m/lvCUpfVubcMGfXkRTjtBVYEzbcwieWfwBOrsZv3p0MT7YIldgv35sMaaOG4g576xXyiaS5PIuvVry2NrRDaLkyhXLivIbJc3J++1Sm0qBiHoDuBvAZcy8iVx3kZmZiCL9XMx8A4AbAKC9vd2sEJRxPtjSAcDqWcVh684uAMCqjTsCz1u2bhu+dKs1u727UPuPxa/OnIzTJo/UPn/5h9tw2P8+DgB46ptHeUZKYy+fWZYsW+zfoMu+rys37EBnt/VZpRAcCkJr/L1TJuG8Q8cpz//DM+/gmn8sDJWpOU9FGT7TPgrnHzYex/1yNgDg3EPG4o/PLkVnN+P8w8bhqpMn4bdPLMaPZ70ZWq7DkD49MG5wLzzvUmgLrjkOvXs04cp7X8Vtc5bhhH2G47rPHaBdZq2QavQRETXDUgi3MfM99u7VRDTCPj4CwBp7/woAo12Xj7L3GRqYYpMS0iXb1tmVuixp8eaqzVi5cbtn36gB0cxfOdf9iWumUyHe+rJGMOWLAwDo0VQyQ+UEgZzNAnNi9TUSqY0UyBoS3ATgdWb+uevQ/QDOATDD/nufa/8lRHQngKkANhp/gsFpVMJebqrh19/p4boZ1rdHpDI8SiFDt0Ics1GIRtEVvUdTDs4ghYg8isq5FwXmooKM+nyQRBZn26mrmqajNEnTfHQogM8DeJWI5tn7roClDP5CROcDeBfAZ+xjDwI4EcBiANsAnJeibIaawWpW6vUFVNGcjzaIz0kaxaRIUuEmJVprs3uk4G3Anc8F9jfkujTa8+Ymzeijp6FW/EdLzmcAF6clj6G6xH3JnJFC0g1d1oneiJHrc8LClAEL9qPQEZ+m8C2uCKucOFJwa0jy/ImEymzmKMlaHp0GYWY0GzKN06SENyZpS1JZoirBVEcKCRan2+iHkXd9YeujSym6znPuRWQlG/DEFcuqs2fOwSgFQ6ZJMkSxlojasLsbyXzKGjJKw+73KYSVrSlDgDyeUZNecZp11qkWEDBKwZAqovkg7vVhjWS9va5RG3Z3Q6irUO656JBIdbiJ68xOqmEVHcvubdnnqPUGfb86HygYpWCIxvaO7orOAyjo2o/qDIr4ZnrM6JrXDujZEq0SF7qO8KBJdTLi/Myio1lmSkti8FSKOiLP33rDKAVDJPb67ixcee+rFauPneijkPPq7f2M7lOIPlKIe8sIQIuuUkioTl+5roJzOVKOlOrssagIRikYtHFMOXe+8F7ImX5iv5zOPIUGe7ujmmfizFMo55425eNdHKqwYghFipBUd3lRe/VEFGpyqtdH0igFgzbVyB5Rsh6FT1+rJ6KOFGSTt5Kqw+/IjWI+SmlKswvf95AoyDjVsm+c4y2+XjsqRikYtHHy2FTyZeCGHSnEjz6qxJwOXaXQ1R1xnkIMWXIkKkV3ecndi0Z5Bo1SMGhTjfBQbtAZzVk2HxF5J48F0VUoCNeW/0N++cjx/ugjyJViLmavPhfw9UqT1+oToxQM2hRHChGuKVePlHIfhdh36+wNzdLkNRnNmj6FrkLUGc3hZe41vK+QvloISZWUl8QdKSoDIQqp3jBKwaBNNVJOFH0K9fn+KalEmgvdRk12lq5Zxmc+SsWnIGzn3PeivsNH08AoBYM21fEp6I016u2VL6cRK6ex17tO/0pxTkv4JMTwssUixMlrsnOTSHMhjjrq7ZlzMErBoE05pqC4jZxTp9iYnPLrp1FwNTimJ5hNOrtFn0LydYgjBa8pKfkKTe4jg8GmNFLQfxvKdU6za3Ty8rIPi/tfXbERO7q6i9t1+n6mir6Zyb9PFa4pEnX2exyZLJ+CYvJaoj6FxsAoBYM2bHf6qvFybNvZjdN/+6xnX6MkKKs0V564F6aM6a88HqW373M0JzRU8MxoJu+T4HW6FyuOXIfq+Sr6Ker0+Ut9jWZD/VDNeQrPL13vO6ZKgmbQQ9WoTR0/EK0teby8bIPiOv0RYJdoPgqVKRxRsfjnKbhGCmWEj4qjoZIycLZjFFoDmJFCg3HXC8swc368VU7L8ynEuy7uLOo1m3bEu7CBUDpnBXUhUx66P4s4Ukgjck2cp+Cm3mcfp0FqSoGIbiaiNUS0wLXvLiKaZ/9b6izTSURjiWi769jv0pKr0fnW3a/i4ttfinVtQTONtYy4voWg6KOgMr93/2vxKjRYuYQSGoX5zUfhdYchnuLPciEJSU3A1EPCh3rVM2maj/4I4DcAbnV2MPMZzmci+hmAja7zlzDz5BTlMZRJnMlr5aKrSxp1MZ5yUP2OVoK5gF+ZSDtUWHQ0p/Hs+JbjVExkM+iR5hrNs4lorOwYWer7MwA+llb9huQp5SGK4bSL+XYGtT26ETAGBUHmI9cx2W8Q986Hr6cQZ56C96skkeYiqF5xZnO9US2fwuEAVjPzW65944joZSJ6kogOV11IRBcQ0Vwimrt27dr0JTUUqUZvfNYCtf/DLU/UZR8NanI5byNbSPSHT8GnIGgFMVw16VpF5VBvVEspnAXgDtf2SgBjmHkKgK8DuJ2I+souZOYbmLmdmduHDBlSAVENDtWIPvr7vPeVx8w4oTyUzllxpOA7LtmpW2cC4Uei3OLaBx4neaIjhfpUAiIVVwpE1ATgEwDucvYx805mXmd/fhHAEgB7VFo2QzDxEuKl13S77dqijbtWenGL12yuWt2qNi4n+BTKXWfbW3YCDl+J+ch7PB1Hc7FMhRz1QjVGCtMBvMHMy50dRDSEiPL25/EAJgB4uwqyGQIoy6eQsCz1wvSfz662CD6I4PnBEvUplHlchuholmZMjVFwo4a5phmSegeAfwPYk4iWE9H59qEz4TUdAcARAObbIap/A3AhM/tnKxmqStYifFjxGYDRQhqob5G3ORR9CkTxRw+JmHGEbdHR7DEllVFfowYypBl9dJZi/7mSfXcDuDstWQzJUJqnUGVBbDyO5vRXfaw7VCM+a4aw23wkXFdWnfFkCrtGlTo8l4ajuc7zpJoZzQZt4iTESwpplY3ZkUsd8feVRR/FNx8FPzs6T5Y0dbaijJL9P0GfgjEfGQwW1WyD5TpBbUBqlEiRclBOXhOOyX73uKbEtFJnK30KdT77OA2MUjBow1WY0ezQCI38zz/zkVTLP/eQsZ5tdfSRsGiNaD5KcQEgvaK9JwVFNJVWXtMpV4/6Nh4ZpWCIQCFG9FFSzmmZH6PefApN+XRfx7ymM0jMfSQ3H8V0NMe6KqRMIYRWNWch0QphzEcGQ3mT18p8g2SKKKhZqsUXNm0Hvlh8UMil+1jcTLWqsss5LjsnR77wI9e59d2Ap4FRCgZtKhGSunVnF7bs7PLtl/oU3JPXUpSpUqQ14W6fkVZyAP1VzcQZzf6kdrF9CmmkuRDNXZ5jyddbMh/Vp6Yxi+wYtKlEltSPXPMQugqMpTNO8uyXvfQeN3MdmI/SGin89cuHYMvOLtz4lDAfVFGfuFs6eS0lR7NWQjxh2z9PwV9fnJFC2OS1ep3HYJSCQRunIcgRYUdnN3o05UL9C1FfGzH/voPMmdjRVUB3gbVt5VliZ1c3mnLegXpazvS2ljzaWvK+/cGOZvc8hWhrIgSRRg6ioO1y0mrUa6MfhjEfGbRxRgqbd3Ri4lWzcO2jiytWt+zVPmTGY7j4NmvBINnSiYUkjeEJwMxFmfb8zixcdNuLnuNp2711ixdN9MnmSE0i+siLONlOVkSi8xSc1Nk1OR4NxygFgzZOh3FrRzcA4N6XlwecnSyql3rWa6uk++e9twHjr3gQzy7+IE2xInH2jXMw/ooHi9v/em2153gaS1UGoZynIEYf+RbK0V9kR1Z2ufjNR+rmOY3RV72bj4xSMGhTTl79cl/NsOtF0d75YCsA4Mm3srPmxr/fXhd4PG0rmH/NCYXNHN5U1NleTcFe/0Exea3kaDboYpSCQRvRGlPJCWX1FFKo6mVn5TuKcsiscPFXXiv/S4pF+NZTcCuIFFZJq/foI6MUDNokmVc/KrmQbrRKtCy+uJ3dKqWQrqz+eQpyxBBP3+9ehphho6E498CXOluiIBINSTXmI4PBImu5j2qVrkJBur/iPoWAkFSPo7mCIalxyghSNEmu0dwomJBUQyD3zVuBq+9/DS9cOT1WNE9yaS7CQl+zbZJx09mlkLXMcu+96JBAxa37U/hGCpIr4/eSQ6KPYpQoPhvezTQczRl8qBLEKAVDIFf9fQE27bBmGft8ChWUI+w9zNoCQEF0dKczUpgyZkCk85UmFSr+B6Cy6ylolQG/ElCOeoyjOTJGKRgCcXpFzH7b8tsfbMWdzy/DmQeOqZgcka9LWI44bNzWiU9c90xxW20+Am79jwPRnFJiPJ9PIaAh9SbE8x+Pn+Yi5HiseQqkVHDFRXZSeBCy6K9KgjSX47yZiNYQ0QLXvquJaAURzbP/neg69m0iWkxEbxLRcWnJZYhGyakmNz9cfs+rkcqJSw1OWi7y5FtrsWTt1uK2ynwEAo7YYwgO3m1QhSSTI8b964YitzaHNyeJmF58PgVxjWbZRDbjaNYlTUfzHwEcL9n/C2aebP97EACIaBKstZv3tq/5LRH55+UbKo7zKjFzWfMUypcj5kghA8pEFKGzSo7moF/vUweMKn4mhDfesrIum75HqAyh0Ucxcx+pjpeT+6hRSU0pMPNsAOs1Tz8NwJ3MvJOZ3wGwGMCBaclm0MfdOFQza0Qt+xRE2TsVPoVqtlv/dWypQfeNFKQzmuPVk0qW1BxJFQGQ7hrNxnyUHJcQ0XzbvOR4xkYCeM91znJ7nw8iuoCI5hLR3LVrszNbtd5hlDejuVzi9qKz8OKKsqvMR2FzMcolrk9B91fXkT6Z9RS8J4kJ/CILFRFjPkqW6wDsBmAygJUAfha1AGa+gZnbmbl9yJAhSctnECiZjxBzokIyL86KDdtDasnuC6pvPkpfFjeq1coAQSlIb2127rc/dTa5jjmO5up3DmqFiioFZl7NzN3MXABwI0omohUARrtOHWXvM1QZbxRKGSuvNTBig6RO0lc9n4IbcWQjjhBV0UdxVk3zHQ8vQp4Qz+No9p+brPnI+VufL0JFlQIRjXBtng7AiUy6H8CZRNSDiMYBmADg+UrKZgiGwaU1mqsrihRlmosMCCvK8NOHFknPq/hIQdWQkrfB0zcfhX+BNJzpQUWm4Wiud/NRavMUiOgOANMADCai5QC+B2AaEU2G9ZwtBfBlAGDm14joLwAWAugCcDEzd6clm0EfKr0BZeU+SrtXleXXU/ebpx195PMpKD771jyWjRTiypCIT8G7LfoUfN9Fs1yDRWpKgZnPkuy+KeD8HwL4YVryGOLhvEsFrk70UT5H6C6j4iy0BbqNfVYaLoL3vunefq0GPY3oo4A0F2mYekz0kaGhcV6wAnNxpFBJp53u6KSaGVzD0L1dlZ6nQLLWE070kTsUuZKL7OjMUxCjjwLKMNFHkTFKwaCFFZJqfY7Scy+3rS77tctA9zurIwVVxA4J8xRkv0E66fBilhlw44r3vvqPQc1glIIhEKd5KBS4rJ5R3AZPV6lkuc+m+92zZI6QRZ2FX6PRy0/Fp6A+nkb0Uans7PxeSWKUQoMzf/kGfLBlp/J4cahcpk+hWtadLLy2qsaypcn7+uVSfhuDJq+JInoavCQT4iUwHJKFpKqOO/UlafIsJonMdFckPkYpNDin/uYZnHzt06HnMTjTdvsMi6ZWTILMVfUp+I6prwPkPpw4cwzilAEAZ08tZeYNum9mjeboGKVgwKpNO5THvNFHlTUfZVkJRUHbp5CyHFHq9kQfJRh2FtZj1+rRE3DeoeNc16jLSCdltvO3PlWNUQqGQJwXzIo+qmzd0erL7sprKhlE80M1UzH46vb4FPzny+62ZnueOGLOKLn5KLn6TPSRIVNs3dmF1QE9+6Qp+RS44vMUolSX5UGFSjZxf9ozmuMWr6u8tMxHYY5mnTJCQlLTnqdQ7xilUGOc9n/PYOqPHlUefz8kcVxcOKb5qJzGOor56MNtndL9WWgMVD3KKDb+ZORQ4zcflfZIf4aYv2safpOgMlMZKRT/Vv/ZSgOjFGqMxWu2KI/NWrASh8x4DLMXJZdSvDR5rdw0F9GJUtuXbp0bo4bKoBphifezmqvL+e3ypc+y311uPkogsihGSGrQdhqO5nrPuGqUQh3x6oqNAKww06QozlNghmJtmNRIwiSUhfdXpUzFvWlHH0UhaPJaOVKm8RX9Iank/5ydW5t5jFKoI5rsQPeO7uQN7MxAt2IdgLSoF0ee6ltU2g8S1C7611MobcvMhtKQVK1eflj0kUYZwrZPmQbMv0gC42g21AzOZCjVco9xcOc+6orhaS7nxUlkpFB+EWWja3ZLe+W1QCkIGDWgrbQZI/pIh1SijwIKLWW5yMKTUBsYpVAlNu3oxNjLZ+LG2W8nVmZz3nrwu5JUCvZfa6RQfz2jsZfPxNX3v5ZqHbrKrZo+BQD4xyWHYdZlhwMQzEe6WVJ1zgmNPgovRRxt+LYl5aUzX6E+FY1RClVi7WYrtcQdzy9LrMzmvDNSSH6yUdyRQjkvTqXMK398dmmq5Wunnq5iI0MEDOjVgonD+xa3S+itvKbT8qaTOlsUwz95LY07a8xHhkRJo8FzlEJHGiMFxBsplGU+SuClC2qnKjVjWtt8lKmOp8unUElXUozoo+A0F85IIVM3N9MYpVA1kl/bssUZKXQl+Ba7fQopOLCDSLvNrpQ1TLuaaoakitvukFRxpCDZJysjLcIczd4ZzWnKUZ+KJjWlQEQ3E9EaIlrg2vcTInqDiOYT0b1E1N/eP5aIthPRPPvf79KSK2sk+Vg12T6FRB3N9l9mRneWpw0rCOohVspHoj9SyE6aiyCfAhGlprDj3IGgeQqkOOe8Q8fGqMmLMR9F548Ajhf2PQxgH2beD8AiAN92HVvCzJPtfxemKFcmSNN8pOtTiGI+KTckNVZCvNi16VFOgr8o6Duas9Pz9Iak6l6TkjAh9QTOU3DMR0IZx04anoZodUFqSoGZZwNYL+x7iJm77M3nAIxKq/5aIUlbZ3PEkYJOY1VyNCNeSGqF0lzEKz/V4kv1aJ5XTZUQVPfdLy337ZP6mYVS2prz0eWI8T5ohaSGzIKOgzEfJc9/APina3scEb1MRE8S0eGqi4joAiKaS0Rz165NLp1DfRBRKWiXaM9orrRPIeXyK2UO01+5LGVBItQdPNENWj/O0L49ypAoCK90vpECyY6pzWNxMeajBCGiKwF0AbjN3rUSwBhmngLg6wBuJ6K+smuZ+QZmbmfm9iFDhlRG4BRI53GySk3LfBRnpFAO6Tuas2U+ylLPM46CihIVpCwjerWBCk3lUzDRSGqaKl0hEZ0L4GQAR7PdKjHzTgA77c8vEtESAHsAqFqWs9vnLENHVzfOdS3mkQZJPppO46Mbkqo1UnCm9DNHcsw+snA1Xlr2oU+2SKTcZnOFQi3dymfsoJ5Yum5bZSqOgC/NRciTqdNLTqvZjdLAqw4Z85GaiioFIjoewDcBHMnM21z7hwBYz8zdRDQewAQAyU31jcEV974KAKkrhSRxXtMOzZBUnYY6F9On8EU7a+mnDxjlkS0Kac9TcMxHlew05rM1GUFJrJFC6I506g0SJKdwNBvzkZo0Q1LvAPBvAHsS0XIiOh/AbwD0AfCwEHp6BID5RDQPwN8AXMjM66UF1wlpWi66NKOE3A/1B1t2Bp5rZUmtcEK8CpmP0m6m3d/DiRCTkiGfQti5WkEK8cUpq1xZD96fGiNBgeqM1EYKzHyWZPdNinPvBnB3WrJkEadBTvLhdF5U3Ulm7hf7//1jIa49a4r6XKCs1NlxGvh6CUn9wzPvFD87c0lkZKmhCpaFtJbjlPkUhvYJdj4nYZLxzFNQprlIoJ46NR+ZGc1VJskHy1E0cSZlySJx/vDMO3jng60A4o8Uyml2kwhJDbq/ztdJ2+n4yvKNxc9OenMZvVsq7uJTEue59Kff9h4/79CxiWSCjfJ7ldJciPvLFqNuMUqhSqTRSXXK1FUKQTJ0FxjX/GMhdtr+CY6ZEK9YVwz1UKmRQneBsb2jO/HymRm/f8rrGmtWjBS+fsweqafODiJKHL9lPtJxNMdQLBqXhJuP/OUFrRdh8GKUQpURn80dnd34/VNvx0w+Z6HbeAc11OJLn0bq7M07OvGHZ95Rr0ymqO5P5x8onKeWS/buO/fYbWb79WNvhQsckTdWbcYPZr7u2ZdVR3NYL18kSuRapdc08GRJVdSZzV8hG2RnvGoAAPzq0bdw3RNLMKBnCz55QLQJ38zRzEeetlS4RDQnxZ3RLK3L5ur7F+Lul5Zj96G9cfgE/Tkn4oseddT1y0fewu+eXIKtO0ujg20JjhTmvL0OPVuapD6LQEdzhkjGtl+K/GEkF8YauiaDJ/pIfo0ZKKjRfkKJqI2I9kxTmEZC1ZBt3N4JANjWGb+R0lYKQceEg4WI8xR02LCtAwCws1Puq1A1IuILHSSV7N3fvKPT8zdpzrjhOZzym6elSqEpqyOFiGLJ11MI3KwOqnkK2ZAuk2gpBSI6BcA8ALPs7clEdH+agjUqzssW55EtRh9pjxTU54kNWvk+heQuEu9N0PcIipJxf5808izJSmzK6EjBF8cf5FNQHfBlU3X+OiOGBBwGGuW4j6oczWakoEb3Cb0awIEANgAAM88DUDuzumqQeFlFHfNR+TOaxfafGShUOiGe6oBwb1Zs2B6pfqdRcSu+NJzaMkWjcjRnjSApdf0i/hFdZUKApamzzchAG12l0MnMG4V99Tmdr0KoX5D4vfzoIwX1MXGkYPkUKjtRQfeSI3/yhLoM2WIw0pFCFMn0kJWZDwhJrSZRJnfpdlhUs4kD5dA4O9pEO4Wj2egIJbpP6GtEdDaAPBFNIKJfA3g2RbnqnqKZSHg6nf2zF63FUnuOQND1sn26tv9X3tugLl9o/8v1KSSZ5iJKr08+UrCIM/KJgqx41UAhe+sXqe+xfoI/cbtSLXGpHqWjOQFZGj3NxVcB7A0rad3tADYCuCwtoRoJv33c+vuv11bjczfNUV4nexyjhKQuW7cNX7j5ede14shA8Clolpskqsan3F6eo4jT/j4yR3OWFtJxE8WnoFQKikKKSRV1oo8SuD1e85HxKUQlNCSViPIAZjLzUQCuTF8kg8PyD4Ns5QzxLYwSkrphe0fgcZmjWVXusnXbMKRPD7S1qBdVSTLNRZT3WWZmcxoE9/dJo9cn+86qCWrVbqSirKegTA8iOpqLf8l/UCWH1lkRylBFHyWhfOrUTxE6UmDmbgAFIupXAXkahmIytgSdcc6V3QUuhnvGRWz/C8zKnEpH/ORxfOlW/Szny9ZtQ5dGIiVVRFCU2ahBjua012iWya/y0WbNfBR0j3VFFb9rUo1olAZddb+TGLHVq/lId/LaFgCvEtHDAIqGbma+NBWpGgBlZ0vzOZOe5to5+f89jKUzThLK1n+IxXPXbenA9oC5E08v/kCrvB2d3TjiJ49j+l5DNWTQEDSsDACrN+3AsL6txX3FkYI7+igNR7NkX2bNRz7fVkCYr65PQchGp2c+0nA0h4Wkumc0qxzNobU0Lro+hXsAXAVgNoAXXf8MMSm3DZI6mkNKjdLwiZ3oH8x8vZgcLwqiTE4upUdeXxO5LIco7erfXlyOqT96FC+7Fvxxeo/u5UXT6PPJzCy1knMneGJj5UxBQQzq1RJar0oGYz5SozVSYOZbiKgF1mpoAPAmM6czHbRBUJuP9JApgLB31X1YPLerm7Gjsxut9mLrSaeVdkpzR/yI312MBlI6msJy3M0AACAASURBVCPUu2y9tZbTW2u2YMqYAXa9lXE0S30KNdKOBP38undNTFudVLipc87j35iGHSHpSdQjM2M+UqE7o3kagLcA/B+A3wJYRERHpChX3VO2+Ug6UojPQwtXY+JVs4rbaa01IEvR7fCd+xZ4tnXTXLi58Qvt0v3uxqEYkuqSpVBIPo1HLUUf+QkyH2mOFESTVMKNaN/WZgx1mQVL9co/q84xeNE1H/0MwLHMfCQzHwHgOAC/SE+sRsAeKSS5nkLYSCHCDN6kF1lzqpbNDXD23D5nmWZp6ns2XNJIAEIPXTJ57c4X3sNuVzyoWb8eMqXQr6050TrSInhio+KAIoIp0mQznXNCTtIakeiJU3Y9tYiuUmhm5jedDWZeBCD06Saim4loDREtcO0bSEQPE9Fb9t8B9n4iomuJaDERzSei/aN+mVrCebHiRh+5X9qv3fkyxl4+M9ynEEm+dMxH3pFC8EsVRwRVg+EdKdhpLhIeGcxasBJjL59Z3JYFWI0e2Ia7v3IwvnfKpETrTppAn4LmgTQmjOngzZKqCgGuzwY9CXSVwlwi+j0RTbP/3QhAJwbxjwCOF/ZdDuBRZp4A4FF7GwBOADDB/ncBgOs0ZatJlA2edvRR6cT75r0fXKa0/uCT4yiFsZfPxC3PLg08J4qJRtkhjfE+y9Ipl5W2Q8LfX37fsy3LQUUgHLDrwKLvxiFr9ulAn4K2o5k8f5OavBZFuSjNR9olNB66SuErABYCuNT+t9DeFwgzzwawXth9GoBb7M+3APi4a/+tbPEcgP5ENEJTvppD98Xq6Cpg7OUz8afn3hWul5QZWqemcAgwEYRw3RNLFHVbBbrbyTDFo5ynEEMuz0hBMnktCcS0RtKpGILzNasEL8CkV4ZzP6rZKVePFCosSA2hqxSaAPyKmT/BzJ8AcC0A9fTVYIYx80r78yoAw+zPIwG85zpvub3PAxFdQERziWju2rVrY4pQfYrmI2G/+L45cwOu+rvohJUQ1si6rgpXIPEaTF/vWyjGbT7q6Aruqcsk+NuFBwcO/aOYj5JWCmIPVjYSUdnZa8k+rTuq8a3mpucxCD8jzKfgSXOhqqV27nel0VUKjwJoc223AXik3MrZankivZnMfAMztzNz+5Ah+qt1ZQ3Vi+VrjJVRSmqHrbLOCowUxIZeLMbdEO/sCg4nlMm75/A+MUcKpc+lyWv+8y6942VccvtLMWqArwWKMk+htsxHigOiohNGRRVLnQ3/qNB3jtEJSnSVQiszb3E27M89Y9a52jEL2X+dWUwrAIx2nTfK3pc5vnbny/j+AwvLK8R+P15ZvhFrNu1QnqYyscj2Jukbjuto7hRaWkd5/WDm67j87vmecoNGCqr+QpiDULkmr2SWq8zmf/8r7+OB+St9+3UQTRUy81GUmP1qEkspJPD86fkUopRnzEdR0VUKW93RQETUDkCdrS2Y+wGcY38+B8B9rv1fsKOQDgKw0WVmyhT3zXsfNz39TllluHvij79Zmt0rvlfK90/mU0hQK8RVCqLJxP0973zhPWGkYJ2rWhtClfY6zgudk5gUVLmc3Fz4pxcx6buztDoBolhSR3NJK2SaoF697rNRWvXM63AulyjmI/U5Gf8Bqohu7qPLAPyViJzwihEAzgi7iIjuADANwGAiWg7gewBmAPgLEZ0P4F0An7FPfxDAiQAWA9gG4DxN2WoSj33f9Y6J75tuRkrFLu/xSNFJ+ue68Y0UhONupeCMFGSmqv/55+tYv9U/aZ4ouHEJ8in85YX38OK7H2JE/1a73vAvOeu1VQCAm55+B1edHBxGKtYtHSnUiKM5aJKd7qMRJ9w6kfkDCY82Go1ApUBEHwXwHjO/QEQTAXwZwCdgrdUc2lVm5rMUh46WnMsALg6VuE7QbevV58l714F1KhSRjKTmKYijAPdm0EjhxqfUj1ecVcFyOeCbd88HAPzndCtbS9JpLrRGCvD2nrPKxOF9cNn0CfjlI2/5D2retvQGReWXmPHbX1XCzEfXA3ByMB8M4ApYqS4+BHBDinLVPbqNrtohLTtXqCOw0QubpxAsly6+kYJLcEcpBKW+EEnCBOE0CElPXhMbell0U62MFIgIl03fQ3pM99n1LfGpFVmUwO+b+bubbcLMR3lmduYZnAHgBma+G8DdRDQvXdHql6feWqv0SQT1rD37NerpKjBaXMZ0d1lh7WFaIwV3Q+n0pKO0zXFTHLg77aXJa+mOFILKr+Weqrb5SPiQVPRRIj4FoziUhI0U8kTkKI6jATzmOqbrjzAIfP6m5/HUW6X1B9yvirb5SOqc9e4Tnb7uo2G95HJ60TsC1l1wKxtHQUR1kMdpUN31lqKP1PUyM3720Juefe+u24ofz3pDe/EfmVIoOl1Fe3u2IlIDUf5eISGpOiTiU0igjEYmTCncAeBJIroPVrTRUwBARLvDWqfZkDJRQlJFgnqqKpNNceZxGY3UE2+WJhWK1bgbYudjlFFJXEez7PuISqFva6mfs2bzTvz6scWe4+ffMhe/fWIJ3l1npePu7C5gxj/fwMbtndK6ZSG39dBgKZ+NkJ8xseijJMqohx8iJQJ7+8z8QyJ6FFa00UNc6iLkAHw1beEaEg7cDL5UbIAVcwZk57r3E5VnPnJnAhXLKXiUgq2AIqQgIlCsF5o9IwW5bJt2dBU//+WF9yDijIByRJi9aC3++uJy/OOV97F5Ryd+ePq+vrUSOiXhR6XeM0n31wJRPEBAND9BIovf1NC9zCKhJiA7D5G4b1E64jQ2jyxc7VkhDFCbcXRWXusMMB+pTCfdzMiBylIK7sbQp6gk5qOodQVGHyn2u79uTsN89LOH/Y+4I2YuB3zh5ueL+53vKzb0HTKlgDo2Hwmk1TiHKxkNh3YCcmRtFnpSGL9ABnDesS/eGpx41rseQnhIqtjoeR3N8gfa2V9OI+U2mwTNU4hTV9yGxuNTKO6LV4YYw59T+Alkk+PqoRcb9dmItp5CHdygGkd3RrOhSrhfQHeD+o9XVuKDLTu95wrXBs3YVSqFQvBxHV5YWkqMGzQZL85IgRDXpxBuPgrDkVdUCkWTkE8pBCXEq93GT9lDFh3NKdUfOk7QqTgJM1WdKjCjFDKOu+FyO46//8BCXCCMLMRGbvZbQhZZj4IJrq8cR/P1s98uVekLSXXX5f2rA1GYT0F+0C1G3EV2VAsjqaZpyaOPgqSsDXR1aazoI60UFSHHdepJ4BeoV/ORUQoZx/3YiY3M6k3CSEF4Rq+8dwEef8OdV8nfSxcpKYVkHnixHFm90UcK5clRypIa7TuywtyVU44UZOXLTU21RNBtO3vqmOLnpGZvTxzeB9P3GhZ+olNvLd/cDGCUQsbxmFuERqalyfvzyXq+5/3xBby33gqh1PIp2D35pJLriaXI6k1ynkKUkNSoo6FuhcJ0zEm+6KOAhHi1bHoIysf1o9P3xYCezZi+19DE6pt12RH4/Tntxe04926X/m2e7USinGr4NwzCKAUJSWYb1apPc5UrcTJac15Iq6CQe2tHl29f6EghoZUqX3rXG00lHynol5eEo7m4L6JWcHr+4lU5RUMvTXMRqcZsEvZ6vPzdY/H7cz5acVPZoF4tmDSir7S+vq3NWDrjpApJUtuY6CMJCWc/KAu3ghIbmY6uAt5Ytam4rZK7OHPYtS8s+igp85E79l9VbrTJa8EGJNUR932M+x07FAn8VLOU5dFHipDUSJJUF11HcxzK8Sm8eNUxAKyZ56FlRBGqwTAjBQlJNYi6BFUX5FNYum4bjv/lU65y9E1Cqjqd0caqgIV/yqHckQIQN81F6XNXMeopWhnOvAPVvROjkqST14S/tciWHf6RpwxVVJYh2xilICFLE4lUIakygiak6Z7rnPrd+17TEzAisno7ugpY+kF4784hqI1RORndir7c7Kh+R7O8zsAsqRUK30yD9zfqdRji2NwTyYJboWys9YpRChIqPVIIwi2LrOfpPTe4DPdhlf9h4/ZObNjWIT2WBLJ7+7+z3sC0nz6hXUacF1o2UoiLaD4RHcwOSyVmjJLo3ouy88R5uf+SQ/VPVn4Jk+ailqi4T4GI9gRwl2vXeADfBdAfwJcAOMH1VzDzgxUWD0DtjhTWbt4p3e/0jD3RR4qyjv3F7GgCRiREr5WNjk9h604984cK8dY5jZA4YliyVqIUaiwktX9bS/yLU0tzkUAZ5RdRt1RcKTDzmwAmAwAR5QGsAHAvrOU3f8HMP620TCJZmpSimrwm4+6Xlkv3dxcYO7u6PSmto8boJ0US9Qabj+T73UowaFU3HUTfjSrNhZQam7zWlI8vaWn2doRrauXG1DHVjj46GsASZn43Sza+oLY3jXDVru6C0jQUZaSgopsZB//PY1i/tWQWqlaEVRKrnZXraJZxRvto3DXXnxlVhlhUaWH6cJxzstPtCKYspRDhvsQpV31cp4yEhKlDqu1TOBPWmg0OlxDRfCK6mYgGVEuoIJ9CGh3sq/+xEAf96FHpse4IPgUV3QX2KAQg+aUoo8hSLoG5j1Qrr4X8cP17NQcedyMWVTQfqZwLnnNrqzVqzkVoIjIyIazW7nHWqJpSIKIWAKcC+Ku96zoAu8EyLa0E8DPFdRcQ0Vwimrt27VrZKWXDAW1vWk7odVvlzl13Ixq3Zlm8fBKNcxziKjY38dZTCCkzQmPkm6cg/A2up7aotPkoSrlxj1vn1NovUTmqOVI4AcBLzLwaAJh5NTN3M3MBwI0ADpRdxMw3MHM7M7cPGTIkFcGCfAqVtsW7lVBc05WsIa5WhJVsNbIk0cmSGuU6AMgLIwD/jGZ9R0E1O7G79GuNfE1zPn4TEee7Vsz0Y3SCkmoqhbPgMh0R0QjXsdMBLKi4RDbBPoXKyQF4e/n/fHVVvDIkX6haIwXZ4jWVIOzrBv2u+4/pH3huUWdo3FJlD7UCD9YXDh6LG7/QHn6iiyYNk1gR5UTnyrbAxnpUHlVRCkTUC8AxAO5x7f4xEb1KRPMBHAXgP6shGxDcq9TpYf97yTqMvXwmVmzYnqgstz73bqwy5COF4GuG9OkRq65KEMt8FMH4NmpAmyfZoDhSEBWqY8PWqaGaDVYuRzhmkn62UcD/3aMQ58okTD96k9c0BWpAqqIUmHkrMw9i5o2ufZ9n5n2ZeT9mPpWZV1ZDNksW9TGdHvadLywDALzwzvqQM8Nx9/LjOoe/duc8374w5dbWnI9VVyWI40iM0hE/YZ/hnm2xYRQTExYX7dH4fWqtLYp0r8VZ2lFCdQ2ZodrRR5kkyHZfaauLbKH7pMuVHs/SDD6BcucphJEjb18zL0TgdAqOe+dWadXQQA1krJFCAj4FrTL0xAkkS/OZksQoBQmVnqcQhHdN4wTLDfke1QpZLRd17qPg69wvuLi6m2hXF81xzjOho0gddZNhnZs4ldaDcesbKay50KgYpSAh6OWutIM2rWinsEa/M8NKId7ktSgjBXE72KfgbOpUUdemFN+sPvtPpC+t4Q8IOd6jKdz0KZNp4vA+odd55ajPH9MoBQlB77ZOW+k0Dkk0AGn12MOUTdqho7oOzK9M2823L3jyWolrz5qCv154MIiijfAs81GppLCRgnMvdeqoz2ZETrUazbaW7PrDagGjFCQENcRRGpckOvnlZvRUETaHLG2loBvUcvqUkb59usr21I/sgo+OHYgcUeTV3dx1iApM9CkUmPHTf72Jma+Gx0bU9WzbFDKcXn3KpMj1iMvUSuuJIFOjUe3cR5kkMPqoipPXKlluh+bMY6sXHr1+yyQTfuGEob39dYbI86szJ6PFNekqR8Hf93unTMIq1xoB5HM0C9FHPp8C8JvHFwdI5ZWvUUjiu56w74jwkwyJYkYKEoKiCnR6nEm++LIUFUngzpgqQ9d3olpgJgwd89F/HDpO2rMO622fNnmkpzGhkJHCeYeO82yLoonmo/Xb1Hmk+rQ24dDdBynraiCdEC9Lasi2tS+J/EhlF1G3GKUgIagBqXRUTlojk82aSyqq+NWZk3HFiRORj/l2xVEmFxwxHkCwQpE1GB1dBVw/e4n8fElRomxifcvWb/Nsu3+jtuY8fvKpj6jla6DGKK3vmsx6Ct5CejTlcPWpe+OM9tHlF17jGKUg8Lsnl3hWzBJ9CJWO309LCW3e0Rnrul+eMRnnHjIWp00eiQuO2A1Rkmi6iTNR9ooT9wKAWIpI9bPJSsqRdzQiKoXl670z1d1lE4WNguTHshvrVT7R1lMQZ8AlK4uK35y9P0YP7ImLjvIHNjQaxqfgYt2WnZjxzzc8+5i9D3WlIzXTGils2h5tpPCbs6fgvnnv4+NTRuLjLudvmuYjlRkvH5C5M6o4shQVok9BTIm9apN3jWJ3RyFHFDySKR6qQzUgphRPqUVPolTxOan0/KMsY5SCC9ljIe6r9DyFtEYKG7dHGymcvN8uOHm/XXz73Urhqx/bHb9+TM/hqqUUFF89aKQQtcGQiSEWL/oUPhTXphCVQoLyZYE+rU2xzI2l5LH639rvU4h3xy6atlvkZ9xgYcxHLmSPn9iDiNKjuH3OMmzrKM92L4Y/JsWH2+TrN0TF3f5FkTVKaObnDhqDUz5SUkhxTVZSOSS/eo7I8zCICkxc+8IdjLRpR2fgYju1GJL667Om6J0oWn5Syn2kcw+/efxE/PD0fbXLNOOEEkYpuJA9bOLDEmXy2vNL1+P7D7yOu15Y5gtj1CWtkcmGbcn0otwNZndB/ztGaSd+8PF9PQ1TU5BWiNoASR3N3m1xpCD2QN0dhc07uqSjoMG9W2KJlwWm7TkU//tJ/QbWIc5SDD6XQi3esBrHKAUXslGAuCtqI33H88vwrbtfxR+fXRpLps4IDW0UdOchhOE2lZz6Ef9EMxmTRvQtyzcT1Un9jeP2VB5zimLBBBTkUxARgw/Es5fOOAmDe1upyBupkXOejSP3sBbD+vgUv/kxDun4FKy/Q/tYCxFdevSEBGqpTYxScCFz6orOzrjRR6rlNsNIa56CSNS8Lw7O6Oreiw7BvqP6aV1z7VmTUc6APch8oDQHwVp57OT9RkiPieV7oo9CWnJRwfUImFFbq/lyYk1QtJXproN6YemMk7DfqP4hV/jvT6XvVltLHktnnIRPHTCqwjVnh4ZXChu2deClZR8CkD/44r6Kr7xWIcf2XV8+ONZ1Tic6ShRS2GQyh6QiQhwzRmeBfXI6m+6qwsxHIuLosSmfw5wrjpaeq7pNWQ9+iSOec6+TDpZIY56C8SqUaHilcNaNc/CJ3z4LQG8UEDdENO5LH9cXEZXmmAu052I4E61cROm8hEGT0boL7LdZy8oQyhHXUwC8+XVkK9s1kplIheNbifJb+30KlbmRUR7H9l0HAgCmR1zFrlaomlIgoqX28pvziGiuvW8gET1MRG/ZfwekLcfrKzcBsHqlOh2auI1Z3AU54owUls44KfI1gc7bAJwXP4pZJEeVnRnuyNjZXZCMFCTmppz32zRJFGYPlxdVZuJTjZxUbVw9KpHiinQJ/9TVTnMxaZe+WDrjpKKvpN6o9kjhKGaezMzOauKXA3iUmScAeNTerggFljdUfvORRnpkaWxrPLkq5VOIPVKwn6CoIwWdbxXnm8vEcJRCd4GVuXXEyWtuZA18s2ukIC7PqZLD2m9PlquiWbJfW3PkRjGOfI4vppxRoVTMRMxHXozxqES1lYLIaQBusT/fAuDjlaq4u8DSh1fs4VfImlNk8dotsa5T2bRVxB2mxzIf5cjXyITZ7XWR9vztfV3d7DsuNzd5y5HJ5laiHRFGClng+SuPxhvfPz7SNXFGum6znaF2qKZSYAAPEdGLRHSBvW8YMztJ6VcB8BntiOgCIppLRHPXrl2bmDAFhflIbLzi9npWbdoR6+WYvSjed+zfsznWdVFxXvwojaAslfXDXz8S13/+AM++pHrPzkihq1DQslnrhKS6fQqbJDNnM6wT0KMpX1ydLM0lKHO56EpBZ55CIo5moZCsO/orSTXTXBzGzCuIaCiAh4nIk3SImZmIfD8VM98A4AYAaG9vT+ynVI8UvMRVCvfNex/D+rYWk7qlTUuEmUO3fXFq7HqKqQyimo+E29irJY8+PbyPY5zeqdR8VDRj+COLVCMFN7KRgvv+zntvg1+OLGsFFw9//QitBZW0HnvhHOe+R4kiq5X7Vs9UbaTAzCvsv2sA3AvgQACriWgEANh/11RKnm5mxeQ1YZ6C4v3ZsrOUzkL1DjyycHVs+aIS5eUaNSB+b9F58SPlt5GMFJriTH/VxN3TV8XBezOdUuDKa0D4OsAJWcNSp2dLE/r3bAk9L15IqvW3nKSOsucqkclrwnbcQJB6pCpKgYh6EVEf5zOAYwEsAHA/gHPs084BcF+lZCoUGB1d8UYKi1Zvxj7f+xfueWl5YK8ryYynshXJojJxeB/89cKDseugXrHLiBN2KBsp5HOUjANRUoZb34hBVtLJa77r/ee0Nge/OvXe4/30AaPw2aljvDuFr5zLlUZoutT3XasNqjVSGAbgaSJ6BcDzAGYy8ywAMwAcQ0RvAZhub1eE7gLjxGuf8u13Gi+2RxKyxs8Ja/3xrDexx3f+iefeXqesIymctAk6TN/L65pxzCG79G/DR8cOLEsOonhKwTdSyJGvV5iUDvU2/DqOZvKcV88jBW2EH2OvEX1D/UiJTF6T+hSSD0k1PoUSVfEpMPPbAHzLUzHzOgDRwmYSQtmLt3fP+OcbuH7227jpnHb/KfY5Tp79NZt3SosqFDgxxSCLnVcxbnBPz3bv1iZs2NapHYb6fEAkk9P4RXmpZI7mKN8nCJm5wd2oi421bB5IPieYjySNUI+QkULU6KNaM19YEVrB5zgjtHIczYbKk7WQ1Kqh1gnWgetnvw0AUvOQ7gvdVWCsFhZoiUuUEE6xZ9XbduiKdvyffVq+jOTQvq3KslVhh+ceMlZ9Tc4/T6Epl/P33pQlRMPdqIt1dNq/p/s39K2nIFFYcSf7OdSWCvCTz4V7kYojhXIGCrKRQvziXOUKo9IEyqwXjFKwUfVmmIFL73i5uC3LLqrbSy4wY/mH28NP1ECWekGF+BL1abXCVZsFxTJpl76R5cgpfAoH7KqejC7zKchcCrGG9DJzkGek4D1BtgaE2ODJzEcqv/jPP/MRaT0Oqg5E1hPliVKLSQNl5GKYFqt1H8zKayXMyms2SqUA4P5X3i9u73SNFJityVC6z1N3gfH+hmSUgs5I4f5LDkVbcx53v7TCs79Pq/Wzt7V47eJxhu6OGOKLH7Symny1s/BGRgepo9k9UhCOOUreLX5eiD7q2+qf86EaKTiK1R/66oRnyuXOuvlIlFvnp4oThCAiq8aYmNLFKAUb1YMr9iA6PErBekB1H/nuAntCV8tBxwbvpCoWXyJnPkBrs1cplJfKwLs/yKaeI8KIfq1YuTEZU1oYbgWlo3jEyWoDe/lDNlVKrxiiK86cDq219gi7lcWQ1IR9ClkfVdU6xnxkEzRScONRCs5fzda0wMllPdVZ49ihWbB1OCOFsHUCdHAaTHHkEjSSIQL+9pVDNJZ5DL+vH5/sXbhFVqtnnoJOD5e8kVADoigFe3/Yz1Nr1grxGSf4o8VE4oSkitR7aG8WMUrBRj1S8G67zUcPL1xlnaNZR3eBtbOeBq0WBkRr0NuEEYETThm2opgOP/7UfvjeKZMwebR3AZVg8xFhZP82z7rLQEzzlcZ38JqPNM4XypTNDg9TCvXWmMWbvBY9JFXnrqVxa2tNSaeJUQo2qg68aOt1587/z7tecU7SrIO1lsEcPbANnw5Z+SlKo9MmhE/m805vtvy3q3/PFpx36Dh/ZtEQpeAw89LDis7ZOI5mvVTY7vM1yhRCUmXXqJRylBGcG3E0lzVkPoXQkFQnMi3pLKmGVDE+BRuV+ejV5Rs9227zkdMA6DoJu5m1U2GH9YCjtD2iQ7lZ08RRDkEjGXe9e+/SD3vvYi3jGUdH6VwSFJKqOt857VvHT5QqmrzCp6OrFBwdcNzewzBucG98+YjdtK7LEuI3FRV00XxUA1Oas+7oryRGKdiozEfucFQA2NnVXfwc9fntLrC2TyHMPBSlRyo6lJ1wVtXSlEkQFHGiHuWk0yJ4J6/pOJpLjf4pHxkhVZ4qn4muWW/6XsPwxcPG4SvTdsOgCLPTswKh9LxcfNRu2N5RwKmCOdBRfGVFH5mhQsUxSsFGNVLoFPZ7Jq/ZD2yUZ14sT0XYSCGK+UhUCk1F85F2EZHRybwpMnl0f5x7yFj07tGE3zy+WOu+6pgmPPdSc6Twh3MPxF/mvoeR/duwaYc/YkylXHSVdVM+h++cPEnr3Cwgu8vOM9i3tRnfOM4/0okzeU3H52N8CulilIKNqjcj9uzdPgHnoY/yPHVqNJYEUvZEJ4/uj/FDeuG/j90Ddzy/TKtO/0jBVgohDdgfzv0o3ly9WasOkZ0xlEI+R7j61L1xp/29gob0vzpzMrbs7MLz76wPL5fCRwru6JpcjrD70N7FNOeRRgp1l/TIQhZh53xTVaNPifgU6vN+ZhmjFGxUSkF84N2N3cbtnXju7XWRehm60UeqxqWtOY+ff2ayfoXwRx996fDxWLJmC845eGzgdUdNHIqjJg6NVJfDjs7u8JPK4LTJIwEAz73tVQqyxsszT0GjbJ9tXOZTaDClICLkDJQSZz0FrbpTUBRmpFAi2yEPFUR3+oBoFjnzhuciOak6NSuKuvB7EPuN6ofDJwwubg/s1YIbvtDui78fP7g39h/TX7w8Fju64iuFKN9Rx4mZ0xgpuBEbdtkln24frXVtveKep6B6/uMkxPPV0xi3M1MYpWCj++BKE+JFGSloRh8ltWYxYJmP/nR++OpqLU053P6lg8qq6//O3h+H7T4Yx+89vKxydOkSVj2S3V33ObrRR278IwdgaF+5czjLazMniiskVfX8l5IlJlx1Gj6Ft9amVAAAEfRJREFU5IusWYxSsNHtwUsT4iVcD4M99v5LP7Z78fN/HbtHhNq8/PD0fXDguOD1E8p94U7abwT+/MWpiUTU6ChbHV2+2eUoVieqKyGmNRIvyRGhWZH7qF5HCnHMK3ES4lULkxCvhFEKNtpKQeZAjfBA3fPyCvRqCV6gReTrx5ZmNx+wa/xFcT47dVf85csHB56TROoLh7ijnZJZIhwd89HeruyvotNdhtiwy0J33ecM6NmM75+2N4b3bVV+528ctyd692jCuMHxV7mrJjITkfNNVQ3qAbsOQGtzDhcemewcjPpUu9mhoZXCW67ImnKUQlSb6daO6Pb28YN74SvT1C/Xd+3wRllKhigkaf6I3WuOcJkT2XL83sPRlCP0lDT6/Xu24NhJ1upzPZrC70+Y+YjIGx328nePxecPHovnrjhaGSp81MShWHDNcejVoz5iO9zzFFR9ogG9WvDG908IHZ0G1iO5nWmkEDHjhBIVVwpENJqIHieihUT0GhF9zd5/NRGtIKJ59r8T05blmF/MLn7u0LT1y8xHmpeWxWP/PQ3fOn6i8rgza7lFo9ELIol8SA5J+kVUOAr5rKljsPhHJ/oWDnJw9LZqxTR3wybeA/FbkOScRiSVKKAMNc//cei4aotQFaoxUugC8F/MPAnAQQAuJiJnFs8vmHmy/e/BSgqlM38AUI0UonvSoqyxrKKlKVfMUnroblZ00WXTJ5RdblKIDefZU8dE8lno+RSsk8Kzklrnha2tDPhHCqLMjeJLduPPfVTKD5VmMy5TPEndfk9KdMmXOHbv4Vg646SEaqsdKq4UmHklM79kf94M4HUAIysth8iiNXqTtORKIXp9c78zPfQcMYuoyKIfnICXrjoGS2echDGDemLpjJPwxcPHRxcmJZyRwulTrJ/3R6fvi3f+J/wli/LSOyOFMFNVoagU5I/8CfuUoqX8Ialqc1LQsqP1hG/lNbgnr2Wndx+Fl646JjTxZCNSVZ8CEY0FMAXAHHvXJUQ0n4huJiLpeo5EdAERzSWiuWvXrk1MluuffFvrvO32pKzxQ0oOw7CRwscmDsXlJ6hNP6reyK/PmlLTPRUnx9K3T5iId/4nujVQx5RQVAoh3fei+UihFA7ZfTBabdNS+OIx1glLZ5yEq0/dO1TGuqUCQya5TyH5erJktqo2VVMKRNQbwN0ALmPmTQCuA7AbgMkAVgL4mew6Zr6BmduZuX3IkCEVk9fBCW90P5eykcLI/m0YM7AnAKBXj6aK2NezRnHykr1sqS77jrKypn5MYza109jrjhSCfC66ZTWy+WjUgDYAwN4j+7qijyojw+cOGlN2GeLo23nG9hnZr+yy64WqKAUiaoalEG5j5nsAgJlXM3M3MxcA3AjgwGrIFoaznKa7kZPldunZkkdP2/nbu0eTJ1/+A189DAAwol9rmqJWndOnWEPz3hEjbiYO74s3vn88Tt4v2HwGlEYKYUqHNRp8x++gGnUctrvlt2lAnVDkpP1G4I3vH4+Jw/tWyKdQ4v+dug/e+P7xZUUf/eqMyXjzB8cXt0/Y1/o+Tvp2QxVyH5H1i94E4HVm/rlr/whmXmlvng5gQaVli4I7NltmPjpx3xF4eOFqAEDvHnlP79JRFk98Yxpi+KgrwsHjB5VdxjeP2xMXH7Ub+kgWvg9DZz4BABy151DMe28DdukfrGBLDml1g+KMFGSRRQuuOQ47OrvR/oNH6m5VNR3c5hXfb5PgUCEooimXI7Tmos3xkZXRQyhD91lrFKoRNH0ogM8DeJWI5tn7rgBwFhFNhtXxWArgy1WQTRv3a7BhW6fn2AtXTsegXi2Y+aql4/q2NmPrztLcBMeEoRMJUw3mffcY38I8ccjlKJZCiMJXP7Y7zp46BkP6BEdzOUohqD0PGin07tFUDDKIYgkcPbBN/+QM47T77kY7yiTDuDSiAq42FVcKzPw05CPwioaglpOkC4DnTbhtjjeFtdNALV6zBQAwYVgfLFhRWsEtbIKZY6aoFv17+heqzyq5HIUqBMA1Cog5UrCO65mqHF78zvS664W6v3rY5LVE6kuvaIOChpzRvKOzGwvf31Tc3nNYn8hl6LwHE4b2BgDsM7Jv0RcByJ2dw+wEa09+YxquOXWfyPIYgpliZ3/VUSAqv4PTwB+8m55pbVDvHnUzg1mGabDrk/p9YgN4feUmnP7bZ4vbg/u04M3Vyddz87kfxepNOzBqQE+MtiORALlSeOiyI7FpR6fnPENyfOPYPfHxySOx25DeoeeqHM29ezThka8fgVEDGvc3ct+ZkqM5vaGCsR5VnoYcKYjRMO5wtDM/Ks+TP7BXC/797Y8Vt3WyKo4e2BPtY628L+e5JjnJzEf9ejYbhZAiTfkc9hphJcZ7/oqj8dQ3j1Keq0iACgDYfWifujMJ6cASn4xjRqvRuWsGBY2pFFpLSuGzU8fgE1NKsxqD4pVH9GtDX/talV35X5cdId3vtlOr8vMYKsPQvq2BCjjJTLH1jBNSPaJ/es5042iuPA3ZOrntvNMnDSvOZAXUIwWnp/TIfx2Jey86xBMCObh3yTG753C1f2Kohj3bUH0aZqGcCMhGA6dPGYmbzmnHZw8sf1KZITs0pE+hV0vpa/dszntCQ8VefI+mHHZ2FTBmkJXWYmifVgzt04qp4wbhmcXrAADH7zMcf37OG4Ek44GvHoa3P9iaxFcwpIjJgOrH0QmekFQiHL3XsETrac5n797/45LDPNaFeqdxvqkLd3RJW0temQ/n5nPbMXF4X7z2/ibf2sUXTdsNtzy7FOu2dqBVc77B0L6tGNq3vmcx1zKDe/fAB1t2VluMTNK/Z7Pnb3r1tOCGzx+Ar905r5hnrNo4aVcahYZUCm56tuSV+XCm7TEUuRxhF4nNtCmfw2c+OhrXPbGkIR2P9ch9lxzqmU9iKPHZqbuiKZfDZ9rTzyp67N7D8dh/H4lX3tuQel0GPw2vFFqb/SOFgb1asH5rh3Y4nM5qXobs8ZcvH+z5jUf2b8PIFJ2mtUw+Rzh7auV8ByP6tWFEP/NbVIOGVQot+Rw6ugvo2dJU9CM4DcS9Fx2COW+vD4186LLTo+YzaAc1hFPOMpEGQ73SsErhka8fiX/Mfx8DbBvpD0/fBx+15xTsOqgXdh0UvsD6BHsm9KqNO9IT1GAwGCpIwyqFMYN64uKjdi9uf3bqrpHLOH3KSLy7bivOOnAMDho/KJEkcgaDwVBNGlYpJEFzPodvHGetqNbIqQ8MBkP9YDykBoPBYChilILBYDAYihilYDAYDIYiRikYDAaDoUjmlAIRHU9EbxLRYiK6vNryGAwGQyORKaVARHkA/wfgBACTYK3bPKm6UhkMBkPjkCmlAOBAAIuZ+W1m7gBwJ4DTqiyTwWAwNAxZUwojAbzn2l5u7ytCRBcQ0Vwimrt27dqKCmcwGAz1Ts1NXmPmGwDcAABEtJaI3o1Z1GAAHyQmWLJkVbasygVkV7asygVkV7asygVkV7aocilTOGRNKawA4F76bJS9TwozD4lbERHNZeb2uNenSVZly6pcQHZly6pcQHZly6pcQHZlS1KurJmPXgAwgYjGEVELgDMB3F9lmQwGg6FhyNRIgZm7iOgSAP8CkAdwMzO/VmWxDAaDoWHIlFIAAGZ+EMCDFajqhgrUEZesypZVuYDsypZVuYDsypZVuYDsypaYXMTM4WcZDAaDoSHImk/BYDAYDFXEKAWDwWAwFGlIpVDN/EpEdDMRrSGiBa59A4noYSJ6y/47wN5PRHStLed8Ito/ZdlGE9HjRLSQiF4joq9lQT4iaiWi54noFVuua+z944hojl3/XXbEGoioh7292D4+Ng25XPLliehlInogY3ItJaJXiWgeEc2192XlWetPRH8jojeI6HUiOrjashHRnva9cv5tIqLLqi2XS77/tJ//BUR0h/1eJP+sMXND/YMV1bQEwHgALQBeATCpgvUfAWB/AAtc+34M4HL78+UA/tf+fCKAfwIgAAcBmJOybCMA7G9/7gNgEawcVFWVzy6/t/25GcAcu76/ADjT3v87AF+xP18E4Hf25zMB3JXyffs6gNsBPGBvZ0WupQAGC/uy8qzdAuCL9ucWAP2zIptdZx7AKliTvKouF6zMDu8AaHM9Y+em8aylemOz+A/AwQD+5dr+NoBvV1iGsfAqhTcBjLA/jwDwpv35egBnyc6rkJz3ATgmS/IB6AngJQBTYc3gbBJ/V1ghzQfbn5vs8ygleUYBeBTAxwA8YDcQVZfLrmMp/Eqh6r8lgH52A0dZk81Vx7EAnsmKXCilABpoPzsPADgujWetEc1HofmVqsAwZl5pf14FYJj9uWqy2sPNKbB65VWXzzbRzAOwBsDDsEZ7G5i5S1J3US77+EYAg9KQC8AvAXwTQMHeHpQRuQCAATxERC8S0QX2vqr/lgDGAVgL4A+22e33RNQrI7I5nAngDvtz1eVi5hUAfgpgGYCVsJ6dF5HCs9aISiHTsKXaqxonTES9AdwN4DJm3uQ+Vi35mLmbmSfD6pkfCGBipWUQIaKTAaxh5herLYuCw5h5f1ip6C8moiPcB6v4rDXBMqFex8xTAGyFZZbJgmyw7fKnAvireKxactl+jNNgKdRdAPQCcHwadTWiUoiUX6lCrCaiEQBg/11j76+4rETUDEsh3MbM92RNPmbeAOBxWEPl/kTkTMB0112Uyz7eD8C6FMQ5FMCpRLQUVpr3jwH4VQbkAlDsXYKZ1wC4F5YyzcJvuRzAcmaeY2//DZaSyIJsgKVEX2Lm1fZ2FuSaDuAdZl7LzJ0A7oH1/CX+rDWiUshifqX7AZxjfz4Hli3f2f8FO8rhIAAbXcPYxCEiAnATgNeZ+edZkY+IhhBRf/tzGyw/x+uwlMOnFHI58n4KwGN2Dy9RmPnbzDyKmcfCeo4eY+bPVlsuACCiXkTUx/kMy0a+ABl41ph5FYD3iGhPe9fRABZmQTabs1AyHTn1V1uuZQAOIqKe9nvq3LPkn7U0nTVZ/QcramARLLv0lRWu+w5YNsFOWD2m82HZ+h4F8BaARwAMtM8lWCvRLQHwKoD2lGU7DNbQeD6Aefa/E6stH4D9ALxsy7UAwHft/eMBPA9gMayhfg97f6u9vdg+Pr4Cv+s0lKKPqi6XLcMr9r/XnOe82r+lS77JAObav+nfAQzIgmywzDLrAPRz7au6XHZ91wB4w34H/gSgRxrPmklzYTAYDIYijWg+MhgMBoMCoxQMBoPBUMQoBYPBYDAUMUrBYDAYDEWMUjAYDAZDEaMUDA0JEXULGTEDs+US0YVE9IUE6l1KRINjXHccEV1jZ+z8Z7lyGAwqMrccp8FQIbazlTZDC2b+XZrCaHA4rIlKhwN4usqyGOoYM1IwGFzYPfkfk7UOwfNEtLu9/2oi+m/786VkrTkxn4jutPcNJKK/2/ueI6L97P2DiOghOw/+72FNeHLq+pxdxzwiup6I8hJ5zrATAV4KK/nejQDOI6Jqz8I31ClGKRgalTbBfHSG69hGZt4XwG9gNcQilwOYwsz7AbjQ3ncNgJftfVcAuNXe/z0ATzPz3rDyD40BACLaC8AZAA61RyzdAD4rVsTMd8HKVrvAlulVu+5Ty/nyBoMKYz4yNCpB5qM7XH9/ITk+H8BtRPR3WCkaACtFyCcBgJkfs0cIfWEtqvQJe/9MIvrQPv9oAAcAeMFKZYM2lBKtiewB4G37cy9m3qzx/QyGWBilYDD4YcVnh5NgNfanALiSiPaNUQcBuIWZvx14krWM5mAATUS0EMAI25z0VWZ+Kka9BkMgxnxkMPg5w/X33+4DRJQDMJqZHwfwLVgpiXsDeAq2+YeIpgH4gK21KGYDONvefwKsxG+AlWDtU0Q01D42kIh2FQVh5nYAM2Hl0v8xrMR2k41CMKSFGSkYGpU2u8ftMIuZnbDUAUQ0H8BOWGmU3eQB/JmI+sHq7V/LzBuI6GoAN9vXbUMpbfE1AO4gotcAPAsrBTKYeSERfQfWymg5WFlzLwbwrkTW/WE5mi8C8HPJcYMhMUyWVIPBhb1gTjszf1BtWQyGamDMRwaDwWAoYkYKBoPBYChiRgoGg8FgKGKUgsFgMBiKGKVgMBgMhiJGKRgMBoOhiFEKBoPBYCjy/wH04hKQIJRfNgAAAABJRU5ErkJggg==\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":421},"id":"-kQt576BHvxZ","executionInfo":{"status":"ok","timestamp":1634908595120,"user_tz":-330,"elapsed":4594,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"9b2cd399-081b-4ed2-a6b5-60067c07d9dc"},"source":["env = wrap_env(gym.make('CartPole-v0'))\n","\n","state = env.reset()\n","for t in range(1000):\n"," action, _ = policy.act(state)\n"," env.render()\n"," state, reward, done, _ = env.step(action)\n"," if done:\n"," break \n","\n","env.close()\n","show_video()"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/html":[""],"text/plain":[""]},"metadata":{}}]}]}