"
+ ],
+ "text/plain": [
+ " 50_50_outcome_id 50_50_outcome_name ... type_name under_pressure\n",
+ "4 NaN NaN ... Pass NaN\n",
+ "8 NaN NaN ... Pass NaN\n",
+ "16 NaN NaN ... Pass True\n",
+ "20 NaN NaN ... Pass NaN\n",
+ "24 NaN NaN ... Pass True\n",
+ "\n",
+ "[5 rows x 122 columns]"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 89
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "b81BeCpOqhel",
+ "colab_type": "code",
+ "colab": {}
+ },
+ "source": [
+ "def draw_pitch(ax):\n",
+ " # focus on only half of the pitch\n",
+ " #Pitch Outline & Centre Line\n",
+ " Pitch = Rectangle([0,0], width = 120, height = 80, fill = False)\n",
+ " #Left, Right Penalty Area and midline\n",
+ " LeftPenalty = Rectangle([0,22.3], width = 14.6, height = 35.3, fill = False)\n",
+ " RightPenalty = Rectangle([105.4,22.3], width = 14.6, height = 35.3, fill = False)\n",
+ " midline = ConnectionPatch([60,0], [60,80], \"data\", \"data\")\n",
+ "\n",
+ " #Left, Right 6-yard Box\n",
+ " LeftSixYard = Rectangle([0,32], width = 4.9, height = 16, fill = False)\n",
+ " RightSixYard = Rectangle([115.1,32], width = 4.9, height = 16, fill = False)\n",
+ "\n",
+ "\n",
+ " #Prepare Circles\n",
+ " centreCircle = plt.Circle((60,40),8.1,color=\"white\", fill = False)\n",
+ " centreSpot = plt.Circle((60,40),0.71,color=\"white\")\n",
+ " #Penalty spots and Arcs around penalty boxes\n",
+ " leftPenSpot = plt.Circle((9.7,40),0.71,color=\"white\")\n",
+ " rightPenSpot = plt.Circle((110.3,40),0.71,color=\"white\")\n",
+ " leftArc = Arc((9.7,40),height=16.2,width=16.2,angle=0,theta1=310,theta2=50,color=\"white\")\n",
+ " rightArc = Arc((110.3,40),height=16.2,width=16.2,angle=0,theta1=130,theta2=230,color=\"white\")\n",
+ " \n",
+ " element = [Pitch, LeftPenalty, RightPenalty, midline, LeftSixYard, RightSixYard, centreCircle, \n",
+ " centreSpot, rightPenSpot, leftPenSpot, leftArc, rightArc]\n",
+ " for i in element:\n",
+ " ax.add_patch(i)"
+ ],
+ "execution_count": 0,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "dlpn4HOe6UUg",
+ "colab_type": "code",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "outputId": "487a0839-e0f5-4266-aeae-845b55eddf72"
+ },
+ "source": [
+ "filenames_home = []\n",
+ "players = home_team_list #['Alisson Ramsés Becker','Fágner Conserva Lemos','Fernando Luiz Rosa','Gabriel Fernando de Jesus','João Miranda de Souza Filho','José Paulo Bezzera Maciel Júnior','Marcelo Vieira da Silva Júnior','Neymar da Silva Santos Junior','Philippe Coutinho Correia','Thiago Emiliano da Silva','Willian Borges da Silva']\n",
+ "fig=plt.figure() #set up the figures\n",
+ "from matplotlib import rcParams\n",
+ "plt.style.use('dark_background')\n",
+ "fig.set_size_inches(16,9)\n",
+ "ax=fig.add_subplot(1,1,1)\n",
+ "draw_pitch(ax) #overlay our different objects on the pitch\n",
+ "plt.ylim(-2, 82)\n",
+ "plt.xlim(-2, 122)\n",
+ "plt.axis('off')\n",
+ "y_loc =0\n",
+ "timestamp = ['00:10:00:000','00:15:00:000','00:20:00:000','00:25:00:000','00:30:00:000','00:35:00:000','00:40:00:000','00:45:00:000','00:50:00:000']\n",
+ "time = 0\n",
+ "half =1\n",
+ "while (time < len(timestamp) ):\n",
+ " for player in players:\n",
+ " x_avg = 0\n",
+ " y_avg = 0\n",
+ " touches = 0\n",
+ " if player in players:\n",
+ " #print(players[player])\n",
+ " if time != 0:\n",
+ " #print('YES.',timestamp[time])\n",
+ " play_temp = pass_home[ (pass_home.timestamp > timestamp[time-1]) & (pass_home.timestamp <= timestamp[time])]\n",
+ " else:\n",
+ " play_temp = pass_home[(pass_home.timestamp <= timestamp[time])] \n",
+ " \n",
+ " play_temp = play_temp[(play_temp.player_name == player) & (play_temp.period == half)]\n",
+ " \n",
+ " if len(play_temp) != 0:\n",
+ " for i in range(len(play_temp)):\n",
+ " touches+=1\n",
+ " #https://math.stackexchange.com/questions/1013230/how-to-find-coordinates-of-reflected-point\n",
+ " #y_loc = (play_temp.iloc[i]['location'][1] + 40 ) %80\n",
+ " y_loc = -2*(play_temp.iloc[i]['location'][1] - 40) + play_temp.iloc[i]['location'][1] \n",
+ " x_avg = x_avg + play_temp.iloc[i]['location'][0]\n",
+ " y_avg = y_avg + y_loc\n",
+ " if len(play_temp) != 0: \n",
+ " x_avg = x_avg/len(play_temp)\n",
+ " y_avg = y_avg/len(play_temp)\n",
+ " \n",
+ " ax.scatter(x_avg, y_avg, s= (5 *touches )) \n",
+ " ax.annotate(player, (x_avg, y_avg))\n",
+ " plt.text(50,-4,str(half)+' Half '+str(timestamp[time]),fontsize=20,color='#cb4154') \n",
+ " plt.savefig('home_image'+ str(half) + str(timestamp[time]) + str('.png'))\n",
+ " filenames_home.append('home_image'+ str(half) + str(timestamp[time]) + str('.png'))\n",
+ " plt.cla()\n",
+ " time +=1\n",
+ " if time == 8 and half ==1:\n",
+ " time = 0\n",
+ " half = 2\n",
+ " #fig=plt.figure()\n",
+ " plt.style.use('dark_background')\n",
+ " fig.set_size_inches(16,9)\n",
+ " ax=fig.add_subplot(1,1,1)\n",
+ " draw_pitch(ax) #overlay our different objects on the pitch\n",
+ " plt.ylim(-2, 82)\n",
+ " plt.xlim(-2, 122)\n",
+ " plt.axis('off')\n",
+ " kargs = { 'duration': 2 }\n",
+ "\n",
+ "import imageio\n",
+ "images = []\n",
+ "for filename in filenames_home:\n",
+ " frame = 2*(i**0.5) \n",
+ " images.append(imageio.imread(filename))\n",
+ "imageio.mimsave('home.gif', images,**kargs)\n",
+ "#plt.show()"
+ ],
+ "execution_count": 189,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n",
+ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:98: MatplotlibDeprecationWarning: \n",
+ "Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
+ " \"Adding an axes using the same arguments as a previous axes \"\n"
+ ],
+ "name": "stderr"
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\nNXHevHnRrl273DNKSlEUUVFRkXsGwL+sSZMmsffee0f37t2je/fusddee8U777yzPg7/9uebb74Z\nK1eu/Nz307t37xg6dGj07dv3C/99O+644/qY/VvcfuMb34hFixbFpEmT1p933323pj9UgCzcbtyw\nuXPnRtu2bXPPWK+mP0d1JjxL6T/OUttTClwToC7bfvvto3///nHUUUfFv/3bv8XMmTPXB9+UKVPi\n448//srvc2PDc0MqKiqiS5cu6+P3wAMPjGXLlsVjjz0W9913X0yZMiXWrVv3ld8vQClwu3HDSum6\npNjiobYA1Evbbbdd9O/fP44++uj4+te/Ho8++mhcd911MXHixFi+fHnWbUVRxPTp02P69Onxi1/8\nIiIivv71r8dhhx0WN9xwQ2yzzTZx//33x9ixY+PZZ58tuUcGAcDf86y2ANQrBx10UPzxj3+MmTNn\nxp577hkjRoyI7bbbLk444YT4j//4j+zR+XlmzpwZ11xzTey+++7RvXv3mD9/ftx8880xZ86cGDp0\naGy++ea5JwLA5xKeAJS9pk2bximnnBIzZsyIG264IR599NHYYYcd4vjjj49x48bF6tWrc0/8St56\n6624+uqrY7fddosBAwZE165dY86cOXHrrbdG586dc88DgH8gPAEoW82aNYsf//jHUV1dHQcffHCc\neeaZ0aVLl7j99tu/8ImB6pIXX3wxBg8eHJ06dYr58+fHU089FePGjYvddtst9zQAWE94AlB2GjZs\nGN///vfjzTffjN122y3222+/OOKII+Lpp5/OPS2ZBQsWxPDhw6NNmzYxbty4ePzxx+O3v/1ttGnT\nJvc0ABCeAJSXI444ImbMmBEDBw6MI444IgYOHBhvvfVW7lm1ZvXq1XHLLbdEhw4d4u23346//OUv\nMWrUqNhyyy1zTwOgHhOeAJSFbbfdNh566KG46qqr4uyzz46ePXvGiy++mHtWNsuXL4/hw4dH586d\no0mTJvHaa6/FkUcemXsWAPWU8KRGbbfddtG8efPcM4B65thjj41XXnklZsyYEbvvvnuMHz8+96SS\nsXDhwjjttNNiwIAB8dOf/jTuvffe2HrrrXPPAuqZnXfeOfcEMhOe1KhBgwbFyy+/HHvttVfuKUA9\nsO2228Yf//jHuOCCC+Lggw+OSy+9tM49Q21tee6552K33XaLd999N6ZPnx79+/fPPQmoB5o2bRq3\n3HJL/OlPf4qmTZvmnkNmRamf4n9eGbtkTqntKYXzv6/JUUcdVcyfP78YOnRo9l2O45TvOeCAA4p3\n3323uPzyy4tGjRpl3/P3p3fv3sX48eOz79jQ2XvvvYu33nqruOGGG0ry2jmOUx5nl112KWbNmlX8\n5je/KVq0aLH+f3dbesOnlK5Loi35P7C69EkoxT2lcP7+mrRu3bp46aWXijvuuMONGsdxavycccYZ\nxfz584u+fftm3/J5p5TDMyKKli1bFo888kjxzDPPFF/72tey73Ecp7zOQQcdVMyfP7848cQT/+Hv\n3Jbe8Cml65Jii4faksS7774bBxxwQGy11VYxYcIEz6YI1IjKysq49dZb49RTT41vfetbfpfzX7B0\n6dI4/PDD489//nNMmzYtunTpknsSUCZOPvnk+N3vfhfHHHNM3HnnnbnnUCKEJ8l88skncdRRR8Xz\nzz8fU6dOjV122SX3JKAOa9y4cTz88MOx4447xr777htz587NPanOK4oihg0bFj/+8Y/jySefjP33\n3z/3JKAOa9CgQYwcOTKGDh0a+++/f0yaNCn3JEpIZe4BlLd169bFj370o/jrX/8akyZNip49e8br\nr7+eexZQxzRp0iQeeuihWLp0aXzve9+LNWvW5J5UVn7/+9/HokWL4oEHHogBAwbE5MmTc08C6piK\niooYPXp07LjjjvGtb30rPvroo9yTKDHu8aRW3HnnnXHuuefG+PHjo3379rnnAHVI06ZN45FHHon/\n/u//jmOPPVZ0JvLUU0/FwIED4/77748ePXrkngPUMTfffHNUVVXFwQcfLDrZIOFJrbn33nvj8ssv\njyeeeCJat26dew5QBzRp0iQeffTRWLBgQQwePDjWrl2be1JZe/rpp2PAgAExduzYOOigg3LPAeqI\nESNGxB577BGHHnporFy5MvccSpTwpFbddttt8Ytf/CKefPLJ+NrXvpZ7DlDi7rjjjli8eHEcf/zx\norOWTJo0KQYMGBD33ntvdOzYMfccoMRdcskl0a9fv+jXr18sW7Ys9xxKmN/xpNb9/Oc/jxYtWsS4\nceNiv/3282LvwAZdeOGF0aFDhzjwwANj3bp1uefUK5MmTYof/ehH8cgjj8Ree+0VS5YsyT0JKEHH\nH398DB48OA444AAPr+VLuceTLIYPHx7V1dVx7bXX5p4ClKBDDz00Tj/99DjiiCNi1apVuefUS6NH\nj45HH300xo4dGw0bNsw9BygxX//612PkyJFx+OGHx4IFC3LPoQ4QnmRz0kknxcEHHxz9+/fPPQUo\nIZ06dYrbb789jjrqqHj//fdzz6nXLrjggli7dm2MHDky9xSghDRv3jzuu+++GDp0aMyaNSv3HOoI\n4Uk2S5cujWOOOSZuueWW2GmnnXLPAUpAw4YNY8yYMXHppZfGCy+8kHtOvbd27doYOHBg9O/fP779\n7W/nngOUiFtuuSWmTp0av/nNb3JPoQ4RnmT1l7/8Ja644ooYO3ZsVFb6lWOo784777xYsmRJ/PrX\nv849hf9v6dKlceqpp8btt98ezZs3zz0HyGzw4MGxxx57xBlnnJF7CnWM8CS7m266KRYtWhQ//OEP\nc08BMurYsWOcf/758f3vfz/3FP7O448/HpMnT45rrrkm9xQgo6222ip+9rOfxaBBg2LFihW551DH\nCE9KwplnnhkXXnhh7LDDDrmnABlUVFTEnXfeGZdddllUV1fnnsMGnHPOOXHkkUfG/vvvn3sKkMlP\nf/rT+N3vfhfTp0/PPYU6SHhSEt5+++345S9/GVdffXXuKUAGAwYMiIYNG8Yvf/nL3FP4HEuWLImh\nQ4d6NnKop3bfffc45JBD4ic/+UnuKdRRwpOSMWLEiOjTp09069Yt9xSgFjVo0CB+8pOfxKWXXhpF\nUeSewxcYO3ZsNG3aNA455JDcU4BaNnLkyBg+fHh8/PHHuadQRwlPSsby5cvj8ssvjyuvvDL3FKAW\nDRo0KD788MOYMGFC7il8iaIoYtiwYXH55ZfnngLUom9/+9vRunXruOOOO3JPoQ4TnpSUO++8M/bc\nc89o37597ilALaisrIxhw4bFpZdemnsKG+nhhx+OoijiyCOPzD0FqCVnnXVWXHfddbFmzZrcU6jD\nhCcl5dNPP4277rorTjvttNxTgFpw2GGHxQcffBATJ07MPYWv4Iorrojzzz8/9wygFlRVVcUBBxwQ\n99xzT+4p1HHCk5Jz6623xuDBg6Np06a5pwCJDRkyJG677bbcM/iKxo0bF+3atYtddtkl9xQgsR/8\n4Afxm9/8xsun8C8TnpSc6urqeO6552LQoEG5pwAJbbvttrHffvvFAw88kHsKX9GaNWvi7rvvjuOP\nPz73FCChxo0bx0knnRS33HJL7imUAeFJSbr11lvj5JNPzj0DSOjYY4+Nhx56yE/R66gxY8bE4MGD\no0EDNyWgXB166KHx6quvxttvv517CmXAdwtK0p///Ofo3LlzbLHFFrmnAIkcd9xxMWbMmNwz+CfN\nmDEjFixYED169Mg9BUikX79+8cgjj+SeQZkQnpSk1atXxzPPPBM9e/bMPQVIoFWrVtGmTZuYMmVK\n7in8C8aNGxe9evXKPQNIpE+fPl7qihojPClZEyZMiD59+uSeASRw4IEHxrPPPhvr1q3LPYV/wcSJ\nE6N79+65ZwAJdOzYMdatWxdvvvlm7imUCeFJyZowYUL07ds39wwgge7du8ekSZNyz+BfNHXq1Oja\ntWs0a9Ys9xSghrm3k5omPClZb7zxRlRWVka7du1yTwFqWI8ePYRnGVi5cmW88sorse++++aeAtSw\nHj16xFNPPZV7BmVEeFLSZs2aFTvvvHPuGUAN2mSTTWKXXXaJl156KfcUasDUqVNjjz32yD0DqGEd\nOnSIWbNm5Z5BGRGelLTZs2dH+/btc88AalBVVVW89957sWbNmtxTqAFz586NNm3a5J4B1LCddtop\n5syZk3sGZaQy9wC+mgYNGsT+++8fXbt2jQYNGsSbb74ZTz31VHz22We5pyUxe/bs2GmnnXLPAGpQ\nmzZtorq6OveMpLp16xaHHnpoVFVVxVFHHRXjx4+PTz75JPesJKqrq+M73/lO7hlADdp2221j2bJl\nsXz58txTkmnfvn0cdNBB0bx581i0aFE8/vjj8eGHH+aeVdaEZx3y/e9/P0aMGBENGzaMTTbZJCIi\nPv3006isrIyf/exnceWVV5bdM0TOmTMn9t5779wzgBrUtm3bmDdvXu4ZSfTr1y9uv/32aNmyZTRq\n1CgqKyvjzjvvjMaNG8c999wTZ555ZqxcuTL3zBpVXV3tHk8oM+3bty/bezu7desWd999d7Rr1y6K\noojKyspYvXp1NGrUKJ5++uk44YQTYuHChblnlq2i1E9RFNk35N5z5ZVXFsuWLSs+z7Jly4o//OEP\nZXdN9thjj+Kll17K/jl3HKfmzvDhw4thw4Zl31HTZ9CgQcXy5cs/9+v0J598Urz88stFZWVl9q01\neTbbbLNi+fLl2Xc4jlNz59hjjy3uueeeZO8/1237ffbZp1i+fHmxdu3aDX6dXrVqVfH+++8XW2+9\ndZZ9pdQ8Kbb4Hc86oG3btnHuuefGpptu+rlvs+mmm8YhhxxSds8suGzZMk/TD2WmRYsWsXTp0twz\nalTTpk3jpptuiubNm3/u2zRr1ix23nnnOP7442txWXrLli2L5s2bR4MGblJAuWjWrFlZPsz2tttu\n+8KvV40bN44tttgiLr300lpeVj/4LlEHDBo0KCorv/xR0U2bNo3TTz+9FhbVns8++2z9w4qB8rDJ\nJpvE6tWrc8+oUf369YuGDRt+6dttuummcfbZZ9fCotr16aefRqNGjXLPAGpIOX6d7tixY7Rt2/ZL\n365JkyZx8sknpx9UDwnPOmCzzTbbqG/oDRo0iBYtWtTCotqzbt06P0WHMlNRURH/8wie8tG8efOo\nqKjYqLctx0dxFEWx0R8/UPoaNGhQll+n165du1Fv606PNNyirwMmTpy4UQ93WLZsWTz22GO1sKj2\nNGrUqOx+4gb13WeffVZ2944999xzG/XIlFWrVsUTTzxRC4tqV6NGjcr22dWhPvrbk+2Uk1mzZm3U\nD8jWrVsXL7zwQi0sqn+EZx0wfvz4ePPNN+PTTz/93LdZs2ZNLF++PO64445aXJZe48aNhSeUmVWr\nVkXTpk1zz6hRc+bMifvvvz9WrFjxhW+3Zs2aGD58eC2tqh2NGjWKoig2+p4EoPStXr06GjdunHtG\njVqxYkVcfvnlX/rSVitXroxzzjmnllbVL8KzjujTp0+8+uqrsWzZsn/45v7xxx/HvHnzYr/99iu7\nSGvdunW8//77uWcANei9996L1q1b555R404++eQYN25cLF++PNasWfN//m7ZsmWxePHi6NWrV3zw\nwQeZFqbRunXreO+993LPAGrQBx98EDvssEPuGTXuuuuuixtvvDFWrFjxD3fofPLJJ7F8+fIYPHhw\nTJs2LdPC8uZ1POuIDz/8MPbZZ5/o2bNnHHfccbH33ntHgwYNYsaMGTF69Oj405/+VJYPc2rfvn3M\nnj079wygBlVXV0evXr1yz6hxq1evjqOPPjr23HPP+N73vheHH354tGrVKp577rkYM2ZMPPzww2X5\nLJFt2rSJ6urq3DOAGjR79uxo37597hlJXHTRRTF69OgYNGhQHHHEEbHpppvGggUL4p577on77rsv\nFi1alHtiWcv+OjFfdkrpNW1KcU8pnFTX5LrrriuGDh2a/eNzHKfmzm677VZMnz49+47Up3fv3sX4\n8eOz70h9jj/++GLMmDHZdziOU3OnUaNGxapVq5K97rDb0qV/XbyOJ/VO+/btY86cOblnADWouro6\n2rRpk3sGNcQ9nlB+Pvvss5g/f35UVVXlnkIZEZ6UNA+1hfKzZMmSWLFihfgsE127do033ngj9wyg\nhs2ePTt23nnn3DMoI8KTkrXFFltEVVVVzJo1K/cUoIZNnjw5unfvnnsG/6KKioo48MADY9KkSbmn\nADXs+eefj3333Tf3DMqI8KRk9erVK5555pmye6ZeIGLSpEnCswx07tw5Pv74Y89qC2VowoQJ0bdv\n39wzKCPCk5LVp0+fGD9+fO4ZQAITJ04UnmWge/fuMXHixNwzgASeffbZ6Ny5c2yxxRa5p1AmhCcl\nq0+fPjFhwoTcM4AEXn/99dhss82ibdu2uafwL+jZs6eH2UKZWr16dUyZMiUOOuig3FMoE8KTktSp\nU6eIiPjrX/+aeQmQygMPPBCDBg3KPYN/0uabbx49e/aMRx99NPcUIJEJEyZEv379cs+gTAhPStKQ\nIUPiD3/4Q+4ZQEKjR4+OE044IfcM/kkDBw6Mxx9/PJYsWZJ7CpDIAw88EEcddVRsuummuadQBoQn\nJadp06YxZMiQuPXWW3NPARJ6/vnn47PPPov99tsv9xT+CSeccEKMHj069wwgoXfffTcmTpwY3/ve\n93JPoQwIT0rOwIEDY+rUqTF37tzcU4DERo8eHUOGDMk9g6+oU6dO0bp163jiiSdyTwESu+mmm+L0\n00/PPYMyIDwpOaeffnrcfPPNuWcAtWDMmDFx5JFHxvbbb597Cl/B+eefH7fddlusXbs29xQgsaef\nfjoaNGgQBx54YO4p1HHCk5Ky3377RcuWLb2MCtQTCxcujDvvvDMuuuii3FPYSB06dIjvfOc7cf31\n1+eeAtSSm2++OX74wx/mnkEdJzwpKddcc01cffXVURRF7ilALRkxYkQMHDgwqqqqck9hIwwbNiyu\nv/76WLp0ae4pQC256667Yq+99oq99tor9xTqMOFJyTj88MOjZcuWMWbMmNxTgFq0ePHi+NWvfhWX\nXHJJ7il8ic6dO0evXr3ixhtvzD0FqEUrV66Myy67LEaOHJl7CnWY8KQkNGnSJEaNGhXnnXderFu3\nLvccoJZde+21cfjhh8c3v/nN3FP4Aj//+c9jxIgRsXz58txTgFo2ZsyYaNGiRRxzzDG5p1BHCU9K\nwo9+9KP4y1/+Ek8++WTuKUAGH330UZx33nlx1113RaNGjXLPYQNOOumk2HLLLd3bCfXUunXr4rTT\nTotrr73W63ryTxGeZNetW7c4/fTT49xzz809Bcjo7rvvjv/6r/+KH//4x7mn8Hd22GGHuOaaa2LI\nkCGeyRbqsf/8z/+M8ePHx6hRo3JPoQ4SnmS12WabxdixY+Oss86Kd999N/ccILNTTz01zjjjjOjS\npUvuKfwvv/rVr+IXv/hFzJgxI/cUILOzzz47unfvHoMGDco9hTpGeJLVr3/963jqqafi97//fe4p\nQAl477334oILLoh77703Nttss9xziIizzjortt9++7jmmmtyTwFKwPLly2PAgAFx/fXXxy677JJ7\nDnWI8CSbU089NTp27BjnnHNO7ilACRk9enQ888wzcffdd0eDBr5N5dS7d++48MIL48gjj4w1a9bk\nngOUiOnTp8fFF18c9913XzRp0iT3HOoI39HJYq+99oorrrgijj766Fi1alXuOUCJOfPMM6NFixZx\n5ZVX5p5Sb3Xo0CF++9vfxjHHHBPV1dW55wAl5rbbbosZM2bErbfemnsKdYTwpNZ16dIlHnnkkRgy\nZEi89dZbuecAJWjNmjXx3e9+N4455hi/R5RBy5Yt45FHHolLLrkknnnmmdxzgBJ1yimnRMeOHePa\na6/NPYU6QHhSqzp06BCPP/54nHXWWTFu3Ljcc4AS9uGHH8Zhhx0Wo0aNisMOOyz3nHqjRYsW8fjj\nj8djjz0Wt99+e+45QAn75JNP4t///d+jV69eMWzYsNxzKHGVuQdQf1RVVcUTTzwRl1xySYwdOzb3\nHKAOmDlzZhx88MHx2GOPRcOGDeOhhx7KPamstWzZMiZMmBBTp06N8847L/ccoA5YsmRJ9OnTJyZP\nnhzLli3zUit8LuFJraiqqoonn3wyRo0aFXfddVfuOUAd8tJLL0W/fv3iT3/6UzRs2DDuv//+3JPK\n0hZbbBETJkyIZ555xusqA1/JwoULo1evXjF58uRYvXp13HTTTbknUaKKUj9FUWTfUMp7SuF80TXZ\ne++9i/fee68466yzsu90HKfunq5duxbvv/9+cdxxx2XfsjGnd+/exfjx47Pv2Jiz7bbbFi+99FIx\ncuTI7Fscx6m7p127dsWsWbOKUaNGFQ0aNPjct3NbuvSvS6It+T+wuvRJKMU9pXA+75occ8wxxcKF\nC4tDDjkk+0bHcer+6dSpUzF79uziqquuKioqKrLv+aJTV8KzW7duRXV1dXHxxRdn3+I4Tt0/m2++\nefHEE08Ujz76aLHppptu8G3clt7wKaXrIjxL5JTanlI4G7oml112WTFv3ryiS5cu2fc5jlM+Z+ut\nty4mT55c/PGPfyxatmyZfc/nnboQngMHDiwWLlxY9O/fP/sWx3HK51RWVha//OUvi1dffbWoqqr6\nh793W3rDp5SuS4otntWWGrfGJP24AAAKjElEQVTlllvG/fffH4ccckjss88+8dprr+WeBJSRxYsX\nR8+ePeOdd96JF154Ibp06ZJ7Up2zySabxPXXXx9XXnll9O7dOx544IHck4AysmbNmvjBD34Qo0eP\njqlTp0a/fv1yT6JEZC/qLzulVP+luKcUzt+uybe//e3inXfeKUaNGlU0btw4+y7Hccr7HHvsscXC\nhQuLiy++uKisrMy+53+fUr3Hc4899ihee+214qGHHio233zz7Hscxynv06NHj6K6urq48cYbi002\n2aSIcFv6804pXRf3eFLymjVrFieeeGKce+658emnn+aeA5S5e+65J/bYY4/Yf//9Y9q0ae79/AKN\nGzeOq6++OsaNGxdXX311HHnkkbFkyZLcs4AyN3HixNhtt91i4cKFsWbNmtxzyCx7UX/ZKaX6L8U9\npXBcE8dxcp8TTjihWLhwYTFs2LCiSZMm2feU0j2e++67bzFz5szi/vvvL7bZZpvsexzHqd/H7cbS\nvy7u8QSAzzF69Ojo1q1bfOMb34g333wzhgwZEg0a1O9vc7vuums8+OCDce+998ZPfvKT+O53vxsL\nFizIPQuAeqh+f0cGoKy8//77MWDAgBgwYECccMIJMX369Dj00ENzz6p122+/ffzqV7+KyZMnx7PP\nPhu77rpr3HfffblnAVCPCU8Ays60adOie/fuccEFF8RVV10Vzz33XAwYMCAqKytzT0uqQ4cOceON\nN8b06dPjo48+il133TWuu+66WLVqVe5pANRzwhOAsvXYY49Ft27d4tprr40zzjgj5syZExdeeGFs\ntdVWuafVmIqKiujbt2+MGzcupkyZEkuXLo2uXbvGhRde6MmDACgZ5f2jXwDqvXXr1sWDDz4YDz74\nYHTr1i3OOuuseOutt+Lhhx+Oe++9N55++uk6+UyLbdu2jQEDBsSJJ54Yq1atihtuuCH69+/v3k0A\nSpJ7PAGoN1555ZU48cQTY9ddd43XXnstLr/88nj//ffj17/+dfTq1SsaNmyYe+IXqqqqivPOOy+m\nTZsW06ZNi5122ilOOeWU2H333WP06NGiE4CSVRH/8/S2Ja0oiqioqMg9Y71S21MKXBOgrqqqqorv\nfve7cfTRR8dOO+0UkyZNWn9mzJgR//OM8l9d7969Y+jQodG3b99/ettWW20VBxxwQHTv3j26d+8e\nrVu3jgcffDDuu+++mDhxYqxdu/afft8AubjduGGldF1SbBGe/4RS21MKXBOgHOywww7Ro0eP9aG3\n1VZbxZQpU2LatGkxa9aseP3112P27NkbFXxfNTy33nrr6NSpU3Tu3Dm6du0aBxxwQFRVVcVzzz23\nPoRffPHFOvmwYID/ze3GDSul6yI8S0Sp7SkFrglQjrbbbrs48MAD45vf/Ob6KNx+++1j9uzZ8cYb\nb8QHH3wQixYtisWLF6//86OPPoo1a9bE3nvvHUOGDIlTTjklKisro1mzZrH11ltHq1at1v/ZqlWr\naN++fXTq1CkqKyvXx+3MmTNjypQp8fLLL7tXEyg7bjduWCldl3odnqVk3rx50a5du9wzSkop/R8F\nIKUmTZrELrvsEh07doxtttnmH0Jy8803j8rKymjRokVsueWWUV1dHWvXro2VK1f+n0j92z/PnTs3\nXn/99ViwYEHuDw2gVrjduGFz586Ntm3b5p6xXr0NT/9xljafI4D/qyZ+xxOgHLndWPpSfI48qy0A\nAABJCU8AAACSEp4AAAAkJTwBAABISngCAACQlPAEAAAgKeEJAABAUsITAACApIQnAAAASQlPAAAA\nkhKeAAAAJCU8AQAASEp4AgAAkJTwBAAAICnhCQAAQFLCEwAAgKSEJwAAAEkJTwAAAJISngAAACQl\nPAEAAEhKeAIAAJCU8AQAACAp4QkAAEBSwhMAAICkhCcAAABJCU8AAACSEp4AAAAkJTwBAABISngC\nAACQlPAEAAAgKeEJAABAUsITAACApIQnAAAASQlPAAAAkhKeAAAAJCU8AQAASEp4AgAAkJTwBAAA\nICnhCQAAQFLCEwAAgKSEJwAAAEkJTwAAAJISngAAACQlPAEAAEhKeAIAAJCU8AQAACAp4QkAAEBS\nwhMAAICkhCcAAABJCU8AAACSEp4AAAAkJTwBAABISngCAACQlPAEAAAgqcrcAzZWURS5J/AF5s2b\nl3sCAAB1wLx589y2r4fqTHhWVFTkngAAAPyL2rVrl3sCXyLFDwY81BYAAICkhCcAAABJCU8AAACS\nEp4AAAAkJTwBAABISngCAACQlPAEAAAgKeEJAABAUsITAACApIQnAAAASQlPAAAAkhKeAAAAJCU8\nAQAASEp4AgAAkJTwBAAAICnhCQAAQFLCEwAAgKSEJwAAAEkJTwAAAJISngAAACQlPAEAAEhKeAIA\nAJCU8AQAACAp4QkAAEBSwhMAAICkhCcAAABJCU8AAACSEp4AAAAkJTwBAABISngCAACQlPAEAAAg\nKeEJAABAUsITAACApIQnAAAASQlPAAAAkhKeAAAAJCU8AQAASEp4AgAAkJTwBAAAICnhCQAAQFLC\nEwAAgKSEJwAAAEkJTwAAAJISngAAACQlPAEAAEhKeAIAAJCU8AQAACAp4QkAAEBSwhMAAICkhCcA\nAABJCU8AAACSEp4AAAAkJTwBAABISngCAACQlPAEAAAgKeEJAABAUsITAACApIQnAAAASQlPAAAA\nkhKeAAAAJCU8AQAASEp4AgAAkJTwBAAAICnhCQAAQFLCEwAAgKSEJwAAAEkJTwAAAJISngAAACQl\nPAEAAEhKeAIAAJCU8AQAACAp4QkAAEBSwhMAAICkhCcAAABJCU8AAACSEp4AAAAkJTwBAABISngC\nAACQlPAEAAAgKeEJAABAUsITAACApIQnAAAASQlPAAAAkhKeAAAAJCU8AQAASEp4AgAAkJTwBAAA\nICnhCQAAQFLCEwAAgKSEJwAAAEkJTwAAAJISngAAACQlPAEAAEhKeAIAAJCU8AQAACAp4QkAAEBS\nwhMAAICkhCcAAABJCU8AAACSEp4AAAAkJTwBAABISngCAACQlPAEAAAgKeEJAABAUsITAACApIQn\nAAAASQlPAAAAkhKeAAAAJCU8AQAASEp4AgAAkJTwBAAAICnhCQAAQFLCEwAAgKSEJwAAAEkJTwAA\nAJISngAAACQlPAEAAEhKeAIAAJCU8AQAACAp4QkAAEBSwhMAAICkhCcAAABJCU8AAACSEp4AAAAk\nJTwBAABISngCAACQlPAEAAAgKeEJAABAUpW5B2yMefPmRVEUuWcAwFfm+xcAdc28efNq/H1WRITv\niAAAACTjobYAAAAkJTwBAABISngCAACQlPAEAAAgKeEJAABAUsITAACApIQnAAAASQlPAAAAkhKe\nAAAAJCU8AQAASEp4AgAAkJTwBAAAICnhCQAAQFLCEwAAgKSEJwAAAEkJTwAAAJISngAAACQlPAEA\nAEhKeAIAAJCU8AQAACAp4QkAAEBSwhMAAICkhCcAAABJCU8AAACSEp4AAAAkJTwBAABISngCAACQ\nlPAEAAAgKeEJAABAUsITAACApIQnAAAASQlPAAAAkhKeAAAAJCU8AQAASOr/ATwv/+TOheH3AAAA\nAElFTkSuQmCC\n",
+ "text/plain": [
+ "