Bubble_sort_algorithm/Algorytm sortowania bąbelkowego.ipynb

539 lines
35 KiB
Plaintext
Raw Permalink Normal View History

2021-01-09 16:44:54 +01:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Algorytm sortowania bąbelkowego"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Algorytym sortowania bąbelkowego (ang. bubble sort algorithm)**\n",
"polega na porównywaniu par elementów leżących obok siebie i, jeśli jest to potrzebne, zmienianiu ich kolejności. Nazwa metody wzięła się stąd, że kolejne porównania powodują “wypychanie” kolejnego największego elementu na koniec."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Przebieg sortowania\n",
"\n",
"* Porównujemy pierwszy i drugi element tabeli i - jeśli trzeba - to zamieniamy je miejscami. Następnie podobnie porównujemy drugi i trzeci element i - jeśli to konieczne - zamieniamy je miejscami, itd.\n",
"* Powyższe operacje wykonujemy, aż dojdziemy do końca tabeli.\n",
"* Następnie ponownie rozpoczynamy porównywanie elementów od początku tabeli.\n",
"* Sortowanie kończymy, gdy podczas kolejnego przejścia przez całą tabelę nie wykonana zostanie żadna zamiana.\n",
"\n",
"![](http://home.agh.edu.pl/~pkleczek/dokuwiki/lib/exe/fetch.php?w=951&h=702&tok=e8e20d&media=dydaktyka:aisd:2016:bubble_sort_example.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Sortowanie bąbelkowe - pseudokod\n",
"\n",
"```c\n",
"BUBBLE-SORT(n, T)\n",
" for i := 1 to n\n",
" do for j := n downto i + 1\n",
" do if T[j] < T[j - 1]\n",
" then swap T[j] and T[j-1]\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Złożoność czasowa\n",
"\n",
"Algorytm wykonuje $n-1$ przejść, a w każdym przejściu wykonuje $n-k$ porównań (gdzie $k=1,2...n-1$ to numer przejścia), przez co jego teoretyczna złożoność czasowa wynosi $O(n^{2})$."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Optymalizacja\n",
"\n",
"Algorytm można rozbudować tak, by czas optymistyczny był lepszy, poprzez dodanie dodanie flagi informującej, czy w danej iteracji doszło do zmiany. Flaga jest zerowana na wejściu w przebiegu pętli, w przypadku natrafienia na zmianę jest podnoszona, a po wykonaniu przejścia sprawdzana. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Sortowanie bąbelkowe - python\n",
"\n",
"Poniższy program przeprowadza sortowanie listy z losowo ustawionymi wartościami o podanym przez użytkownika rozmiarze."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"#zaimportowanie bibliotek\n",
"import matplotlib.pyplot as plt #tworzenie wykresów\n",
"from matplotlib.animation import FuncAnimation #animacja\n",
"from IPython.display import HTML #animacja jako HTML\n",
"import random #generowanie liczb pseudolosowych"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"#funkcja pomocnicza do zamiany elementów i, j listy A\n",
"def swap(A, i, j):\n",
" \n",
" if i != j:\n",
" A[i], A[j] = A[j], A[i]\n",
" \n",
"#algorytm sortowania\n",
"def bubblesort(A):\n",
"\n",
" if len(A) == 1:\n",
" return\n",
"\n",
" swapped = True\n",
" for i in range(len(A) - 1):\n",
" if not swapped:\n",
" break\n",
" swapped = False\n",
" for j in range(len(A) - 1 - i):\n",
" if A[j] > A[j + 1]:\n",
" swap(A, j, j + 1)\n",
" swapped = True\n",
" yield A"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Podaj liczbę elementów w tablicy:\n",
"10\n"
]
}
],
"source": [
"#podaj liczbę elementów w tablicy\n",
"#stwórz listę pseudolosowych elementów \n",
"N = int(input(\"Podaj liczbę elementów w tablicy:\\n\")) \n",
"A = [i for i in range(1, N+1)] \n",
"random.shuffle(A)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#obiekt generujący\n",
"generator = bubblesort(A)\n",
"\n",
"#zainicjalizuj wykres i oś\n",
"fig, ax = plt.subplots() \n",
"\n",
"rects = ax.bar(range(len(A)), A, align=\"edge\")\n",
"\n",
"#ustaw limit widoku dla osi x i y\n",
"ax.set_xlim(0, len(A)) \n",
"ax.set_ylim(0, int(1.1*len(A))) \n",
"\n",
"#ustaw tekst z liczbą operacji w odniesieniu do współrzędnych osi (do animacji)\n",
"text = ax.text(0.02, 0.95, \"\", transform=ax.transAxes)\n",
"iteration = [0]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"#funkcja animacji\n",
"def animate(A, rects, iteration): \n",
"\n",
" #ustala wielkość słupka adekwatną do wielkości elementu tablicy\n",
" for rect, val in zip(rects, A): \n",
" rect.set_height(val)\n",
" \n",
" #iteracja po każdym dokonanym porównaniu\n",
" #(liczba operacji)\n",
" iteration[0] += 1\n",
" text.set_text(\"Liczba operacji : {}\".format(iteration[0]))\n",
"\n",
"\n",
"anim = FuncAnimation(fig, func=animate, \n",
" fargs=(rects, iteration), frames=generator, interval=500, \n",
" repeat=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Animacja sortowania bąbelkowego"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video width=\"432\" height=\"288\" controls autoplay>\n",
" <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAAOGltZGF0AAACrQYF//+p\n",
"3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MSByMzAyNyA0MTIxMjc3IC0gSC4yNjQvTVBF\n",
"Ry00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyMCAtIGh0dHA6Ly93d3cudmlkZW9sYW4u\n",
"b3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFs\n",
"eXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVk\n",
"X3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBk\n",
"ZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTYg\n",
"bG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRl\n",
"cmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJf\n",
"cHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9\n",
"MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTIgc2NlbmVjdXQ9NDAgaW50cmFfcmVm\n",
"cmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42\n",
"MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAA+A\n",
"ZYiEABX//vfJ78Cm61tbtb+Tz0j8LLc+wio/blsTtOoAAAMAABnblS+MhuoLgPtAADyZ5SNNQ384\n",
"gGS6VWlRScInTp5g35slS7FPUprtDrF2RIjYkWL16w8+Ftkcb5l6au3QGPtY6AMSo01kFwXrWljD\n",
"by4hgZzJsqxZ4UlKCngKpGvggmFOaMmNlM96jX0DQpf3N3HYB+LKpJgZfVwFad35lZwkTWzKGxzq\n",
"CQE3aZZM/5HHydOrq9WPHqY5QHqctvEXKETyBkprB1lxFPphI1oPnMeLhmlKkkI+8cYJHf91IxNu\n",
"rNO6ZheE9bzm2B5FwPWyT5TeQy198UGlNbMtVJKYnh9siKFQZFbC+ShGDSW6yN3tKPx8H0O9XAK3\n",
"NMVSMuK6wpPjiBJrYNrSf2h9JAS+2zG9rMuDfbC4zAGBeQoO5tu6xhj48PLBnnNo8om23ZQ17OHG\n",
"A9hI2DOfQuNNwVNNROO3OMxerkrLGFsOIP20q95m7UtjWLWFTM4ovaqNBtvYf7X/xj+o1mNAzPUL\n",
"lV4xItX7CcEr0G6s07Odgu/pYGGYwKJrGgPPpFwRA/d6ta6hvTuaXxd4IivPsr1g95qGYzsS0ZaM\n",
"kzeNgH9MpoYhpQNYkljLPfd4fa3jn0fMEXJPvi9iy12YdTaXxeql1/wtJreF1jGwMJ6JJ35dWBjL\n",
"2vpSNvizYVmPrwtVZopt1UHCuYoCIL5QEbnvt8MWuhInfxMnaRKDaTQBHahPdbhfM2Zd87XdQGAJ\n",
"eKWXMEwu5DYfYI4mKrwHYFil/vUvtPipJshXi46u/G0foK7e3dibg1xS7ymaOLLRjQi5ACgsQe/s\n",
"WLv3whGRXo3rEf/lbvJ9531o2myal06B7tnTg4eToC4vUxAHZwPFFXWNU7KMqjQQAMffyjk9O4q+\n",
"IryEOWGN19y7tq+4IYc5camATBTDsDyykl7wjIhtYjRieDfzwJxsyqPnTRk6fQz29fj0Ox4tKN/r\n",
"Q21PaZr8Zqp+HvnSnGL5nTtBA831zAK9uVWtsfeUvK2ifAllwzU3u4TyIG16QWhqyNj4dTk4sGHV\n",
"Omoo00BwEBscX947v24D/3PAgkWjPg4i/E+YDvflYYi54QskLauYdFaaRzqtvBn9nNGpfJnIGJj9\n",
"4ziLci+AeTSnTC/D3bVKv+5sBstFrUbKF/I63QqSGdOP9NpHoGmfXsP/+8Cl+yIWMZ3sjViwdMa7\n",
"OGwTxxql4iEKdrRMHkJkeNYVyw4f/fj+X3UCVN7SyBNr00uHR0PSue+HS2HF4/S0rAKfjFNmXo3f\n",
"pyG5Sgdedx/vkh8Y9HHYe8aFRX54V/Zq5BRbFjV3CvR14zngdXkCdUof/fxvCRGLldsk8vrZe0cj\n",
"x92L0Iz0yWEGPUa6sxWkum6W+1Ayxsf89Kt0mU7qrc4Jr+9XWfldN0ns+806nK3V1/+CuYCzRVNH\n",
"+ZxmlXOeY7zsQQ+xjAaTrKFmhrBpmNC/DseNE2la5lBan7SNiue2zIBfSQOsiGQuIMzy/sjX2fyv\n",
"PPuX8eXrDdOZpGA6QmElHcs7pSsmp26gLbSsJORGEokH1wExzPjqGvcS3HWivkF8gpXj2wStWlGf\n",
"76wnQBS1j8JG83q4U3hB1DggZD/MPZMWKDckAI5lSrQVeOEG25/4KaWEVUItY3t86kLp7mxJudWD\n",
"JBSRM2KDUx5OHdtCHbg8wZuP+5oIjeiblPFEUL3k7Dk92CxH9LpupmZxEa8oBlgu/ufzzTf4ze4Y\n",
"NyYkon+kKiPWL1vcuH5uLAJSHN35fh0IWradc3jk3by8dwqmhT4qmhI1H/hGpppo9qw8cqLOacK9\n",
"zbGSS30u5RAKH3ggdVoz5+NkF2IB52o6S4tvazSWDuwy8DgTm8i7SXvOKK3IudeLfNviawwmfmUM\n",
"caizGIL8Vg6bnloBfi5z1PTeYe02fPzez9CCQ8uLWYIjGCFfxeJmejJ/+fz7Ux8clbR11vxImz9L\n",
"kbG0g5JXwICqGG8tHJLK7eaWHOMbystP0TKWIBi0ZELk+ktqj0KRPxqcyX23V5wIRELpHsvqtY4a\n",
"U9/E98zKI8tyLm66ELh2Bp/Xy2UXCfX6HEiuEG2YLz0RUgDGdFFDK6B/mYoZtmX4mggRHF9QcIBD\n",
"QpBnnxTYsXQXbc0KEkX7owxg74vbG3wg4w1OfQdKcNwS/c57ryAWRUgExQt5KtouXAP3TY8AhglW\n",
"9Q8duocRQJxhjwmh7yHwBgZ42Vixet75oarSedECGuebiuTxkLYqPOamv8ogvQbJIBUwSFRr57d6\n",
"UiJaTDTs8sXKACo1jf2soOiAP8ZSVvuyHfAdnklzb/PON9ggLyI23LeVB8yyGxAciTYpnQWk7Q9c\n",
"IV4vpGQZL88s3mq32Ha52ZhnnMieZTGXQl6wt20lrdXzE0YnKRd3qk5FM8y70lQXhJz5zEngrFcx\n",
"MeTVW+ZECMNgmD2Vu/GgzlyqWi2ijQzeEPXHEAolpPtcmEzbzTuh9N9JDaXDdCzvSCb1WgZac8C3\n",
"9+7tlGV6dTvIVaURW7VArcflOfw7STEiiC+tGtlvWbQuwBqzo/oQuQvcsd45Wu1F2a2Za4as6NPB\n",
"boZxn4eidFyuIdLrttBFRBtD40z0BwUrUJoELhFIUL4F7x2lq3AZSyB5DXBmRwxY2AdfaJ+ouw0j\n",
"EP7uPZrBsfxaUqKWopR9pYVXGg9L1TMf4rjuzs4cPVL6+spv/OjNYMpzfUURf41MGaobBv/ngSEM\n",
"X0CpFlX65QdIzKtax2noLN40+ARjQcUP/52tvLC6p8LwlZSCLEYzFgYf02VaSsfr1rHKVdYQgd00\n",
"IHkt+AONUEpTQPRWb649j0kOXbiS8jEVNhgQ9CFEAzJ++9Ov09zvbzAzP2IEAwUB498RFIm4Y7gE\n",
"zIC+cw5H9LuJyNLcr2lG9NPI9ROCOa9iIVJYZ7ixF77yk2b6ovzRjkYNMfwE/W4jb+WGP4kPiF3U\n",
"GUUJi8z4bdoFO6p84QO7nfraT1rySwYf/fccAuGsEahfOe+E2qQnMlWyn+qM1t7Ou9XtZsUcKGsX\n",
"RlNxmnb3R/hk7ZZ8RyImJRHMYnNZ/Le0+JU3EHohFMJ5SEsX3FsSAvmbHZhD4BywCm08Uosjo1TH\n",
"8XnmKWG0Wo38WVnaO/8B380ArOsNsavwrx9mQNRSHD8TWlSvVIbRa3nzY+c+BR5uBbdsN4+NOC++\n",
"QMe8F1QfLVzJ8e2eaSBp+zkzKSnFoXcIkKbBlb8tEJyY+azJXQe1Q5RmwsiGga/D/taA9CbP4XlQ\n",
"UAQPIc+klsNaxvuQs6//5vpZUvBpP3p6uIYEyeQm7V6Q4H03j/Vr1+UVCaOP+TgBnpfWUxlm5TdK\n",
"DahJbtQlXT2jOlx03jFd4LxWOpBx/bxbDOCsy9e3M96MCcWkCoAMbItKT8prqEl4S6H73vb5p4s2\n",
"N3N2mLWNtjKhTtO84nUlFOQa39HJneCTAbAJiXCMtlcTuDA/TYVBdAwbi9T/el4UYR9AsUYQZaid\n",
"7jeVvNRO1fu+mwoQYPhkEibWmCZRr+AH1DqZNGqbkAm0fN0gcn3zav4wNrV3pm1gSXMrw0mK5Mds\n",
"1vD6j2vhPmotJ0xXMN4ZMUGDM8a/BCnhU9Cw4PCEJaVe2K9Gl2rATKAoK7BKoORsDol2ERlxVqDW\n",
"G6WXjkm3A2TcCs0lECVr1Tfxs9TY4mWuKCyEBtAP4TM89hSNxleNVLAKcNQtJUSQLNbkD9P4Rdz9\n",
"fnZuwTyEe0uEno0q6YAmgxpNEo2hUcTIyC7ws6TM4rXmR3EuWwY6GxkXwH4UQq73FEblDedpfsw4\n",
"xCLmGuOoE9KVO4aytRTt9EknnF00+QonciC5ccunGWHhYraLTRvW7rA4fEdhsv812EDrflzfrBlb\n",
"A/rSzXHrTld7LwI5NgZ4KUpLrQLQGvtWYE/ZTgcsS1XnXbFbrvGeiF4LfQm9LfXXflUbr5/3O2V5\n",
"Ib/AMPsnvi8tKe6WwZAowKlIcaMKil5uBc4ezcQygw0IhB/6GhY8qPX3LX/U7tS/cE9//m+TCNw1\n",
"kG6YdvgHPjgHLlFP2B16kQLd1IPTQRPk/y/zxSTuGuLy8hDC3P08enJVuX5fIoJ69ybWXa78wvZq\n",
"FZ6rl5bcc9dUVdnXpYnSiy2/bttP8f5vP9QkFIi8B5aR/3dkzRKOKHK+uorQngi6s23WhWKn8sxr\n",
"QLHP6uKwwYc1Zhd+3oVmmV+GljsOY4toaS2JcjygYIKjSk+h/pu1TOLzpvQnEYrmGGtZxZThhCRu\n",
"VYwIYZPMogYQ/y1h0MjCzDcBY75/omwpQaTkSh1wlUMEHkzAAcG+HPEbocpyP809UklxxErhiVa4\n",
"Tt6GJwk7Cy7o1HCg/Q8zLQQYMRYK47m+AWZBr8/QBW4Ld7IKbjQLj+h6sIOH4jPGzTd664ktZyK8\n",
"bBh0sxvcGQvJkLhzArwV4DkINzrokzB7GWui/iZTylYESrmhoDlH8UKadptHwsQmUdrDdBFbzdVN\n",
"dgYP0l+OMD3SWnuM2B0E64QIoCpHbf+r7I0PJLIc7ABxr3qoAzUlAeEV5Zco7oYlzLMT4zmHhBr6\n",
"Kjrdh3Sqk2xipfuHfEFicpzBkKbncvbdnYOBmWuECNLS7EKHK0/KFZkI3OpcRXuHTSrz5TAmnUep\n",
"1HWXTv1jx57zFpQLzeQvjoPg1agD6ob9cWhq5cfWkFLqpLyjeBny/7uCgVpNctEuj6pfP3xh9+PE\n",
"p8MEVPGCAXiCuxIMy6ixSl3OjrspTQV6q14D+GHk3H4Vi7OlwAuY/ImhfE+cGMNmMn595kmKfmzQ\n",
"1JnSPcN8ftpV5FOWcQ5pG1Za0Lab4iZeCfNn0Iujdz5/StnYYUtSUD/oys9+bwGt5ApQgXXot4Jn\n",
"OftGj6kfHYD0FCiDUMPtuDYntDkfsRQ7CFrJ9dOuY+cgvQq/YpIgHfMNVQPgv8yWuP5jSNiGbzT+\n",
"tXWdjJT5TmTXorrZrTGlzS+FNU/VjW9HcBm2KKuvjhN0GzU4SQJI9GJavBdzTIz5r4E3P4wQYA30\n",
"HRTXnZOxpDzdQDV0CfNA6iBK9hP7fzfqhvKt5t9SPsNQCg9flCvNYRtyssG0N2nJYA3DPTjITy1N\n",
"kxXGmsG3SOONK2IriKpl9bwKbO2x1FVHU0zAPEoWDQHqT+41UZk1Dnr2VAGlZhFzl9zOEHnDeC0k\n",
"7mmMoX1ixPGAq5b32sXHRPrGK6HWabWB4uudOyegGkAyA6M/YHGz32VFY1/95r/+m0xWxInh7ZU5\n",
"pMn6z9LU/BQb09zP97ot6rmhU1tAkiU7HO2eAIgUVMAAScEAAAIbQZohbEFf/talUAOQEHQBRoLQ\n",
"Fb68tvtvHY5PJXHdyEy0GeFksVqw+bQuy79h6fmNkfkkvGJvHmoW3pr+ueKtNMKgaqIIkTmIcDVQ\n",
"M6vBiVgq64xPDw02JJPlmnvtney+gzCYzhfjUEGYJq7/zIf9OKlAAMCmFCu8Dzl7UyCVDlNL0ct0\n",
"nJcS0lfS+om0XjPxCuFmtsrcupdrc1Vk6TOgWcKsbjmzl4Mj1fmF3e3wbmuK9rEI5Lj6KaFpmVO+\n",
"F2En3nF9+qR5dz9H59/r10l1QU0+2EMiQXXmTPuBpaBf7cgMuLpYa49YViITltLXefHJ5BkThLxx\n",
"sPY9qjSnKV7/bm62Nm+Y3TkYouopOxGdzfpv193eeaEboWKdN8sZiruV7ncKT8jPingGssZ8HJwl\n",
"T/PICmqc1YG8rR2BCWP+CNOHWDu/3NBM4hAo+s55gS5OBkfYb4TMvsRo/a8hdF5ZcuxCTjNlVNbn\n",
"FoKBX3W+umPPnRKgc+UWcWiWpynvMCeChvxeFL6BgqvVZDoYMsOl2+11pd1h3ziriHTPDSf17IGB\n",
"CFUAWzZyQSG0njIuzF34QY1+ZyebMrtxgu5eU69py2SV77HSb0VnGNbdNl0ojciIQfrugXS2uy6d\n",
"AqNaSgfjkWwSCFBwbPMAyPaekS74cEVIGXquDwtQFEt7HTFcMB9tt24s4gQBmzBN+aa+WGkr3OEk\n",
"LluDZjq67XAAAAEDQZpCPCGTKYQV//7WpVADcV9/16HrpzYAA7N0ENWdUJ4+l+Vg1x2UhHvQBLVI\n",
"I9fJmFddNM/DQJg6fS902eM24vB3Zq5sCXTB+Rx9zx0zRJWPJs18HefTabAUaYuR5ZuJ/7FBYfzh\n",
"yylyxMC4w3KiWoJrST6Y7qW/8f6NemItRXM1+n+owebNcm03E209UtGxJrjfP7FTexkfnZ9ki7lR\n",
"Nlp7BhvKYS1tzbdN7eBGiq0VstpB9c9sTH16OJ/XbOBKOTxyWrTP/nsHKBfDkuy7I0Ul8KcEgQDE\n",
"g7oA/J3TdNivbqWPw8ju+rjLMIOno+ofOeeu0lbkzW8y//uRTeDAv6zwIQAAAVJBmmNJ4Q8mUwIL\n",
"f/7WpVADbwBQ2IAAX0aRRNmHHnkSZS7616K/3NPRSrAgBGrJbuOGiSpx9ZsBBSenMB3qoyxVqRxu\n",
"+/371/7kI/z//CmwJoCgJmSgR8+Fs3wWB4RV70/5iNPomCRo0OALiswY4Qhs8v2E2yiICiQ2Cu6w\n",
"3lfiAFtpsM7SFihXaJr8Q0ILCvA8jkHsN6UdozXuca8l1Llbk4D/4Yrf9ySL4YIv2wZ1k9KJ6Wif\n",
"kO8QUAYYkELFD7MmCy/ptyUowW+USMQP7NLuZV6mgRVuLTNDmNuLbkLSZlBmoEuFHE9qLP/5uqq/\n",
"ki9Ga7i9ay1RfVBEtL5ci46q//gun7GNnUN3mxXykGJFREGa/TuiMFrZEOmH04cCxRo5eR1Gb4UG\n",
"fxUIwmg+SJeo0vPSfUqiwKBPDOFVpEL9sjqH2WoxDX7ZBXAUO7w6pkRQgAAAAWdBmoVJ4Q8mUwUR\n",
"PBb//talUANvKzZFmiAAF8UEQUqTtHDAQj8uUpjIJk71DFXjU0e/RFrtD7/UHz1XWDjgRQQ4+w7J\n",
"08B8zIpgqd+zPH/33/6biXOIrD//CiquwiHl1EW4l1YMCX7/UpUxKb5p/aPr50hNuDTGWGgSkjAX\n",
"xgvfsPg9pso4zk4esEudn2bykOYPtSIdf6AT0axHIDzfj5w+TRrfX0bWA7YN3YZdmRXnwFZWSjj2\n",
"FOebW37NJnCXK+ytvbnwak8xwAKFyFxj7SkcP/SRenh7lzJ1PAR4MuX4ayToiLRkvZyqce0Aa2Fm\n",
"trCDOtmS4od1d3gEwAOZ8gJUsW39oNQRjHCmn7u9Pt1D4A4LRTtAZoa8Br+Ng9t3bv9rXs/PtLQ1\n",
"pz3lUCiliaYTF0sG4vyx+Vv5r8ocSra02sjBrJfRZW5jr+c41Pq6N1oOorNkceh2as9ckwUmQ0D4\n",
"hSu1y/hdwQAAAF8BnqRqQS8ADEN4eyAAmo4NcgN1CCtrIVYzYPXzJdlCPY2VYN4g5gaH3FZ7ijUD\n",
"i9RXjHkWNeIT4oSGG8tQmUVbROLDbnS6S09JTjOw8F29Ky7vaXAA60/3b7unkMbJ8QAAAhlBmqlJ\n",
"4Q8mUwIK//7WpVADcV8FOFhWG03KAEsug43LseaOZY+pqT5S/Jf37IYOAJJmdUkHtB+kO4Kfqxza\n",
"pMrCSni8g8QuF26aUrz7T/YuB727rDpVy+td9KWEatYD8jR/qKW8dPcJItP4WCy7Bi2PTyNLU4dr\n",
"u+SnD8p+tPGlaN8LdJnGLCAyCbRBCAxyEIMl7xSWQGzHL/AVh1dIpGY1fhxC/ScloXCbL6zbcZZ/\n",
"r/7kSk/V/wgu07rMaSJ0VamHvZUfCJwG4cVdJ8IMkdOUTp4gOt1HxAwbyN2se2ftDCqb/TBbEpr4\n",
"VXtGaDFB4QzHFk4PzdhVWAMQblPNdRrKgZd8/Jf797q20ov+6K6kpzJnEI+essxiopL3d2+5xZH3\n",
"qWQuQHmlyeINZw0N2xchOhg4NuQ3uzQA30HKR+Tlq5g/p8i5W/2yNBvWsYJhYiASTsI1c2wFx4DZ\n",
"XAB8WHLq26dj0NTDa9P7+EVXNi9lie6/Ha8bKzVMNrmwFIPiVnhelibHQa4NAHoCTKj/wSPwepO1\n",
"G7T4zgD4FS6D3d4XjmAutq1/HbfPFNwXd2uaj9WE8eClCkvu9/nVULmXtOdXAdBt/vxgTwD5+y+o\n",
"7c4W0dnOplkbw3Iggyzce7GTYBjqG6SEu7qdzDiiax54sFKZypKp5tvXrzVxxG+CdgXjIEdxa8CY\n",
"T+jMK/Hpk+rldB8E1eVFtF8nvpEAAACIQZ7HRRE8FP8ABEClwVB+DDmgAbSCgSTh0cd+G88bosRf\n",
"EmNh3OKgMMibwdWgHa9R60oXaOPeITpZMDj+KrqikTsQj0JEc/zg8ykPCCWSzIJw1/AEZLUQh2dI\n",
"OwHxWFMVUTdnB3foz5tEi3zPuMAtdpI9VqphZJoofiTEepWJO67rzAMINLZpEwAAANMBnuZ0QS8A\n",
"DEA5orIACaZhOShVp/YRa7uo8foS9SFi/i4M5JHATmxcKBsHZZBRNA1H3RleC6Aw4Grdw9j6ylAO\n",
"f/tccf43tkEsO9bDrvqavuwH1Mnu6k0qDSjJQAXX+chWYls3JUHxM0D1am82HXq80Wt0Qw7E3Nga\n",
"AO8q75I9j/SsaGz5Cc2M8J34BniWeNyCMRlQ0+NOXJfstSiMqdGdyUZq9Hydwy9vTZAW/7OQrgQN\n",
"fp59B9s9zy/BoQOLFZvLOqBOKQscsYZLVWoeVMg6qxOOAAAAdQGe6GpBLwAMHzp5Fb/S2fAAhQ4N\n",
"Y78ttIMkiA14JuAi2w+v9AhwX+EYKiOeC6LvSYqdXGCQiXDnBgxEgVItbc1ivY9ZI7ajCgw+iYVW\n",
"dCZtKZ2U3fZu1+WL+SR55E2M2O/TRLNdpSmrVe/iBw+19EnP9l7CBwAAANtBmupJqEFomUwIK//+\n",
"1qVQA24EDYAF0ug76ArBXVSPFEM47TYWFVn9n+xbQODJ9VU9+6dDCcd0tylEyKCYwmuX5lGFXSxE\n",
"Naxmcqwe6YkM3mfiSfQv8utB/Aj8eTtnRIfsi3c4W0goFeSomvN49aPbb9UPD3KAZN7KCo7b0brM\n",
"uEuYOyxP8ybrT58O0VkqptzRMFIcIrmm9qXQjEK6dUO5T5EXyqxFaaN72E1R96TpP/ys8xWqgLMb\n",
"zTBD2Nd1X1DDflylVfdrvVnSdEM0YxyFdB/1EFh3foHj5eEAAAEQQZsLSeEKUmUwILf//talUANp\n",
"HKTWqAAJ2KghHr0Ri+8Bst0CbysX550Fnj1AuAp+9u4t3yhfZ6PA7np/dmKKIwHWlYo4n9Dx8s0/\n",
"7JdjkI6FcJZv+HYqoukRD4cEpxtBbWvjPQ3mxnRuSVtI7GtTYxtaEqbAcFkqqM3D+uKNd2tUuh/z\n",
"7fISLgQhFFsHOLuXmVumPhjP01S3FnFySaouoqO57QdekX+LM/Rpjd1W3oh8SU4uSxLY8Hx8uTpP\n",
"uoj1pQopZnBZ4wFm+d+KL5mEUWd8gZY+cwppi19z+LEp3WjHA4HXBE2W+oyuQ6UVMF3ZXTBHnntV\n",
"oNkaZQ124Gl+JtF1bd2as3D2d4wrhcjTDewAAAE5QZstSeEOiZTBTRMFv/7WpVADacxWgAmo8I/d\n",
"nnGlg1nR6yQCBE8dTgFZ7dXwvDQtQKu3NfRHeCO1/2V5aCqQd7lmT/ZLschHLH3z3x6SdkJJbsO7\n",
"2DeXyLZ8oJTfNP7R9EvbH55eF/lS5AWB6u2KamwLZI7fewYmXafQhKaOKs/Dhe3IAMVgRBHhbB0K\n",
"p4cliRzEVNdFpv1DQ22Z496UoVSlecUKGaxDQzbokJdSGS7KslsaTY+BYVh1vTN1e0Up8IQgksrp\n",
"+efVpe5agYX1DAL1q2/uBAwjGHRL5Tn+PN4hQgzZ5LiqFI1jHgBAtXgOwOEBI4rcHbP8apWuE6Dy\n",
"fRCq3X/Ol3R4QAAAAwAgi+85JXKmj/CvEIIIPpRwEeoHGEvkFqBvmoEuRTbtVSKPZFQigJfPXtOz\n",
"4AAAAH8Bn0xqQS8ADCB8kKMGCPgAQocGuQGJMoFw3pkgCel15boZq90dLQU8/fXQj12IEmNOXwmW\n",
"rxxd70HbSYlqd45RlPehZ2V7ge04N9u5B+J7tb0Mtott9aLRWvI8T/29noRhzLRDtmZqrApxeCB5\n",
"FiU6tQn5unkVsNiUo25MhHQtAAACD0GbUEnhDyZTAgr//talUANpJ52ABOx3O9b8c9iDlUfCCRxJ\n",
"D31F+33BSpPTQZxw7MqFiDvwozVG2HayXMsxzJpXLc9p6CKUHkQJrzmr+tLscgOf1BsG/oJH+YQf\n",
"5QxeJG7GTOgbBxmpg9pexTB7qoNOYwcXUSPTZokMuxT/Qdd7hMLdjRyX/69I/AU3pZ6M5MpPqJb1\n",
"6XtQjn7ArYfB947X/IU1iTnqDRPd0q1l+cTn8QPK7AE4FtFtHeALJX7TBUN7IvEgcdl64t1KYCJG\n",
"INWCC2xHHWlfQMC6m0Q0UTbbywjWU4aemaR33pOIMxOYwQE/O82aJA1LlhKuqNl/WehgkFvHgaLj\n",
"g72c/3QRCwWtzyekg5ukAUb0vwLoAi5x3jPNxxiNdKbHrU4/TEAdTngXxuFz5kNx5SNpb6USdlco\n",
"eD3cKF2h2qF4F8jTx5tNcNBlmhf3DUQvnTcVwaABOxbeY8KKbA0F2MCtdCNSs8+bxm7YTC4+doBi\n",
"liQP7ymLQup2+AWyRK5hmLSB+uCGCTEiI7/kp+OMSzbOmYG2ZloiHKrNFHCkoZB+k6kKC/GLcCYW\n",
"Uty0YfKQVm76O9gY/OTJS81AZXfppb6YCjln+Zx5SCFhOhaEo7USjQmgsMvZWWltCz2hlS835SJB\n",
"1+jUlJ03ynYV1JIN820TSvIom0q/xZsbhHaoo5jb+qB94q2BAAAAxEGfbkURPBP/AAflpTFvGAA5\n",
"tx3grreq1wbfXeajaSAzbCLEiCPd90O8AtWEY7s4yRBtUPNKuqmRQf0ETMvs//srGN2IEWvQnJ8d\n",
"qMqt3wHMVetMBnh5z+fS+fO2ZCU8jOWMJONyM+G1nPmUQQ/mKWrPmQ8tgLga8kMa5VXyl1T5P4O0\n",
"gAxWTIOBNhSu6X8oLDG697sV+LMZSF1nB0hOHqV8+WU9lh72zfRXvByBMa6fjusHIN3IKp2QHzX9\n",
"/0emGUYGd0EAAABhAZ+PakEvAAwghK/d0WqfU4AP5CcjmCq/jjdYIAuoCZsbyT6O9pc31/pLzHqh\n",
"EuLo4rETFyPG3GgS164PWrgJ80244CKhbBL3QRZn/Avwhh73el4P9qXtGexTuJ/c3wmFyAAAAQJB\n",
"m5FJqEFomUwIK//+1qVQA2j+qmDDwAmp1eRjd/ewfRfYp8bEE17jAA7vd6/LDyYPwbQxUT5Moz76\n",
"ULU6PAYW3PbAvWhFzvvrSCrJyn983j2M9CwDjqugVpSusIedBRFrdRZ4/NZzVkqpbec6VRUXXb71\n",
"Ir1iYcbBXKaeowXFhGPTEGiAjGHg9jVoRYOgWPlbmXVCHMiugai0U2TFInKIqBOnpkBXkea4Qfbh\n",
"OvbtNYpmsWUI+dVqeToHJ9rTO0GjU2t7VD3xghy0ELrkjBdm2+JSUDvkkH7/9e30PzxmLFSQMIKz\n",
"9pLc+Z8YVnFLEeD/x2VHm5kkOTZpGV9e3Cj3bLgAAAF7QZuySeEKUmUwILf//talUANpGjv2vaAA\n",
"Tr/UigkxvrditZ3WwoPMMuvdZH0bO2TOZy5zBL1IzMls0rxo7k73YBW28veQnUW7rzSBTjddpzXc\n",
"q2Y5Q6HWQHa5jvr36HRHzGFTu+IjnhPIaiihXfMvJi8P2CwNbtqFamutPiOKAflliI6lJfy0/WqV\n",
"fixehhR52fidmj92Pc43SxczlNS2shaG3JuTjbtcMFiprr3k2SggN9MfkWX767p39xBEjhzEDwbX\n",
"WbObWZ7xBeZBURCbm4BGuEKYR1G6ee9R2yXJf0/rM3x3Fn2q51chjLWeL4RuAkdRjGsNB8s3JPi3\n",
"wjXN1+W2PDlHR4YuhXhUKChuT8SbVaO1N44oVg6ScqVvPS7DLvtidNotah1dKc0zjkwTu9yMbA9V\n",
"SLWT+sVNOTjTkC1HrqY5S73bTjE3HbJcjP+snOUVM4MAllBWkIvEkcz1EmS+cOeN5SRuINiPLiEr\n",
"Bj7TDBHlOhZ5c9jlMQAAAcBBm9VJ4Q6JlMCC3/7WpVADaR+6D2EEAE1Gk9J2DaQmMm0YEqysNzAS\n",
"GgD5YqAunGwCtqhtQlHTdhu/iKbQhetSixBzaW5JtRspoMe0DdpyDzlPQEn/Z97H7u9+yXY3KPyH\n",
"/wiPZtEhQoruqZsdf3r27fXn9v5xrHjMINnZq8EiS0Aq/IN8j7602qSsjP+SlGxN+xzoVv66IaSZ\n",
"tZom5KkJmE2mIfFNImI6l6erWnkmrV7Cfa65uvoqbrBs2zPrIv+Fxm7lTGIgIUqzdoRYZ0+vwoce\n",
"4TnOWZHkVYrduAuHbrfv+9gXGucI/X8wvGARnWpOraMOu8uxB39fHq0yAAlev+68zJxE1S2zopsL\n",
"Yrn9qhnF0qGhy+A6f3Rbiisge2YqLZKL1i4X+sOP6h2BdnUXFP5z6MHiWZ+JaTybobM2FU4DQ3EH\n",
"ROAm0NMeWoSymRXmlbRlHxeKPntSllSrZtWymyIru7lQfgt+cHY6CEu4luYJjxoAErgviWLECsvc\n",
"Vya7COQXYtK/8M/FU9yEkln1Gp1F7o+pYpqmvlCepPj2/jDuXEsRRIxy8UpnTvHhnavOSFXrfv2z\n",
"+5GiOyCMD0MCAAAAd0Gf80URPBP/AAflqtGKxzVpYAL6Jit/UMf8sl6bsjfstEXvwuRculfnqfE5\n",
"MCkK33nKrqyU7V6Fgm5Q2LSmtaQ0nHtefieBj6C/wFJ3ftaI64T5TcI7C1dOaF6fWIwD/0Zqt6qI\n",
"fz9VViC9OVUKr4YKJrh20G9AAAAAUgGeFGpBLwAMPt41QARAROioYqYDRCOrK4rJmcPw+DtLnMSu\n",
"HN6/kBlms7EX9vRP0bfMpL113ATN3atj3Lp+1O8hK+SKcez/hPps6omzz2XwEDEAAAGaQZoXSahB\n",
"aJlMFPBb//7WpVADaRVcuwrQATUd/IIzDw3G25xLntZdvkU+fWpBbZQInKa8Z5zJW98bL94llTdA\n",
"TuIh/lqC9kq0EH6f/I6ZJM+Uf/wUlslZSKfFk2HB62qwYsT5Vv/0qMrbWJ95d9TZGUKPz5sL3/AI\n",
"U5A8PooD/kfdaDy66e+KnVNIprOyzG90VNh93DKmmLGP7C/Y5NWFJOfb9o8md8usde7X/vO+wgYc\n",
"mlBLVBeDIW1Pl8vBZXsscsTUn/G4gsTruLj2j2JbA8g5kprq21tw3kvcEZNHpyrsEG3drJ31dSc0\n",
"O7BoCHl3mnphAOS5BKGa2+AxjcmA+Z6VG2J5pp8Fdq7TTOjnWFb/Gd/OU7aFmS0ahh8DaW17zhRT\n",
"huPIdqewuY2ZZU/MXM7w58mXZSr3RngXAaxbrkT/KHK8812M/MzCNTkKlsQGo5Zie6/RZPXPUAuk\n",
"VSTZp9q3nT/7+YNTvFsv/5xEsyaljpO67CVEiKmcD60bMJlyIviSeNUfpd/gd/Oef+tr7QzQT203\n",
"4uiREbsAAAB3AZ42akEvAAwgfJCjBgj4AEKHBrkBiTKBcN6U/g4NxMqVpBVMgcVlz8Vsk03KH+ku\n",
"AJ5gZnHeefw0UI5zY6+98T1dyvY/UU6Vk7a8LrkH1lDwCWHCq//0ycNHELiDPhcpVVmamkqFMyj9\n",
"FVJSCaJ1XB/wmJWpE/8AAAE+QZo4SeEKUmUwILf//talUANuAvtABNR4SidvnjGmEHYIKI978dDe\n",
"tC91bAQkHssrbxpe3iqWhDXnUHJqTmdcXQmZBdk7eAcZUD4F6r/LKN2/m7uLNR/ZHPyeE2R/zIhG\n",
"Jr7A+/7mfmDQxhNcWiWS3fzh1Hk8PjXOydpU8QWvqBZjeQa4JUsofjMqeoyUoMWEZFVnuornq6fl\n",
"taXM8mWoEwU0ogbbMLNZM7gMdydpG5duGIb8p3YIqJgQNDNsR6rnU//cUldeSAaGA3tJKyp4VK5r\n",
"fVFMxH5+esu8G4GFPt2b4D3uC5HhuXxzR0Q+Mky121PJCV15E60LTQ6wEzGWxmTgWjCHOWOqwoQU\n",
"8OzJ6P+79hpVzQioUv5qNlJAN1sSUrtNSXE0UJTLNKkMDh1SrEC2c5MyQyekG9LKI7qBAAACLUGa\n",
"XEnhDomUwILf/talUANt80gADaRjUS1JebvxKmnAxXfpQSk8In9VSGNSF0SFyeFpoflOPgiroldU\n",
"wu/d10g3LL/1B41BbBI2ucnbr4UHD3x4q8Og3/tvBTEhII5eNPZiDAXVYb3H836Vv1rZIryRzgfA\n",
"93AuEjpUc+wFPzb4C1kfl6zhR03UIALGO+GCzH9k7bxENfxGKnwAPLv+RylzWCHbVkHzno3hUtiA\n",
"COFvjnLYYHFOq3vGn0Zmv3rKIS0otNpx9ubP1sufVeSdyGR/gWQSfXSP1T+/mKo52AwSfIz5yZcv\n",
"YDRK7tmC1cH/DtwA3Wxj9QxQK7WvS+vl0f+hUmEzrI8AG5ltonisgvGO3oAon2erqG1CRVPKsF0B\n",
"7RVtkODTqerWyO79VqvEnHOccXJ3qAcNWytlsCMW81moqMpcXcbL/G1fRRdUlR98JPd2t7unTN9/\n",
"uh4LE3L6c3xPIlDtPAxZnU0n5dAjIGWGnQPnhfNdglvRf07UD8ivhmj+hv2y0P8m011/vrFyzDax\n",
"SbEXlYf29wQ2CFsg5Vl426+UP5PLLfF8oHisetPuzMFlFI2YQyIR+es/oBKKawzARFDjt850TN90\n",
"ZVliU2ZL3J8IIFe21j4j8WAfo/hb+Xqf3HJwuptFZlUt3xv6WjsmYpWR7RawAjTfbCuwB1+TZhU6\n",
"us3gZ4r4DAbPFXFf1XbkhKaYdqFMH+Wym3VwgBz21TLKBLPljbXxbPKQAAAAc0GeekURPBT/AARC\n",
"ZknxtUQAP47dYYvahabzZs+QucHYgBu4HO+JRoXmxgdnkzulk/YiSs4dyEJ7xqDUvY1W+X42FHr6\n",
"B7TLs1ad6iMA9lRog8a5b7puG+ZRBhnKDIRRJalCwJia73I3HkxHB2QlBEiWmpEAAABeAZ6ZdEEv\n",
"AAxBKnbxwAfyE5HPiWw5B1csnGqgIAn5V/EFPvjWEKIGD+vUoYR9iuSmRkqj0qOmU+CHYHV2CQmH\n",
"Tins2ZBagUVy2A/YU2p16v6yFL//2njx0CmM2UAtoAAAAHIBnptqQS8ADB8Ag5ZdgA2lv9yUvebT\n",
"n03wkffcmi18HxVMxJ0IS0LJ73UdpM5dOoIO8Seb3hShQNR3NANFjVDA90UYAJHlN1kkrPrc+26m\n",
"gsTkZVL7f5u2eGANNAXBRCXLlkJMOIYMzM5fYtKF/Cb9nG8AAAFaQZqdSahBaJlMCC3//talUANp\n",
"H7eT7qnEAD+lMXq/vjVAjm/SpoeKwIiNbrzzgCgYkC0AwmUd+REza8RN1z/bibliKcQ7XvL4rDng\n",
"OqtVa5H4IWocLAeaf0Q0PS975jnJoaSAPb+EK8EvQyzhoyB0LDpQAHwYkIxuH3vmRKUkDIVB7MrA\n",
"lHd4Mf+M7p5n5oUF2XUaak1E9fhBzUZ281PNpLk6csucHhta9WZ66oR7VTtgykA8BOgKV94NlzuI\n",
"BKzHj+pyHf7tFYdOH7JnCgEfH4ngfSGWKjoVhP1lV0g5rBS1w4O9nrxOoWmsmpPJsY2sPV7t9Mmc\n",
"PRRhWKi9d/rg8RzAdNzWTJKTlQY2wU68j+sbOQxkTViWZvbndQ9Bb9k/Ta4WVOu6ySptoUz8Uiwr\n",
"Go1472wyD+jpoDrowoyvyfyglXqQv2Z8czRsuWmkQu0NNhv0eFSj3OiG8QAAAWNBmqFJ4QpSZTAg\n",
"t//+1qVQA2kPEgI5AAE7HhKBBfo9HxqoSxnWjGLLBDZDjpnHFi08ft3SHQwwTAFQN81E3xZj/jzC\n",
"RBT9LXvnPz9OsoctQedRkF+an/jKX+vP/yEnjdrksA/Wgx0qOjekSqtuv5Wkpe1E2EdHKKa2UhfY\n",
"Rfwf0NB/8q8bSREXsqsprsVfWDzAD7v778Jk4XmjJNPftQP6jeepelubKsrniYhniMyKZmJVmQ6t\n",
"jmJxIxklmkvoM/rWxsW6HcEweXnTBJRqU3Gwcfu32lOvAdDNe127euiwsNGs7xepZRN6HmiHDidC\n",
"21GmSdEE+IRgsD1R9pceoQ9yBelUwiqbb1DwI8D8kAAz4dPiIwbbYK8aJULmGnMWpGjD2cJYdUd1\n",
"22cvzjG+uLQRPMDU2A13wsJw0deOhYmYGNNI69NtiG9ZLTTrEryBblLNyaU8E+QGNSH1LPvSvnla\n",
"lsFcAAAAWkGe30U0TBT/AARC7UlqoUAAnY7BoAefw1RoUf1sRaEUyVP4JdUSAc3W7IHxcZJtJ+6S\n",
"eqTpEvBANqLh0QFcptlG6WkSQQhuy8lJ7LtwvXo7/l0p26JZ8p+rxQAAAEUBnv50QS8ADCCEXlKh\n",
"2ADZ+n2ALPTIQ4QU2UicNANRii8DoOYiUyyYPoh0Y04nNCxZCGtQWzLGF8KAfJrvaPkGo/T3xJ0A\n",
"AABoAZ7gakEvAAxCshwAITVomE5u3G1P4+BncSCEbRelbBIwoYP8P0hjqqOElyMd+O7+gz1KryOb\n",
"nxXs1J4dfxYGhk8Eps6cVnHINfOOzwygk8KUKBqEs3WvTnwGD/1kVofYr+O7FBY1osAAAADNQZrl\n",
"SahBaJlMCC3//talUANpxp8AAvtTsvCoHgPbkJm0e3aXsb7qVwm9twC1QIhAwxBukgC/qzVpCZgM\n",
"rfjCCH75q8Hr/HgJnrR6VKAmOWc2xb3CKp+9gM37AJV3/hTURJA77YAS+rGCRtii6t6DwzFFHZZO\n",
"nx7gRLn7kKgm6+N38YHtDscF93kovqJiw6DAN/Wlg5MpfpjRbnenAWClAcGP9K8NlC0yxrWbmEnO\n",
"rKn3XEAb1eYUJl2999azwD97Is8ugZ8mhuvOu6b7BQAAAFtBnwNFESwU/wAEQmRurC07d+CwAL6M\n",
"4iHC8eVBpB7CAOHuLzhD1uRhHJln9rZFghOoFL9fqxAtmXbjSQ1mavGhGKa01Lnt/5TTrR9BiwaB\n",
"n9tUVcWHgZ4omz3gAAAAQwGfInRBLwAMQSatsAG0uEDIBlKTqQRmiZiqSBJTKQ1/o+EiFIHcEVWM\n",
"92ZROL35JxjAsrpE1fNisnFyd7QLkvyfv2kAAABRAZ8kakEvAAwe5zlZz4AEJ/O/ExsAx9vGT6yr\n",
"GcsghCX6PTAj6fRQ/KhpSbc67ewKKK8UYEnyAO4GQdN1pBOws777hjnsvUDE+Wg6TZIV6MjRAAAA\n",
"8UGbKUmoQWyZTAgp//7WjLAG0XHgwaYUQANpcvnFIKb8nwkmbvtphQ0/L/PNq3Dhm2HNjfUd+980\n",
"N/3fBCRgTCoMxXyxfbx32FsaW3N6wOWQ+cIv6KSOEe48QcF1ZM6CHYyAOXhSme4zII/iRN7tf4nU\n",
"R7P9gcvZd6H2QH8g2xTGJsAcZc6FjEgPLEwF9xIwfWkuJqIt8ycpUTNObXaaE3/N08Z2XRQt2gUH\n",
"xN4H/mjJ896AcEAlCWnsUVenNvWF5IZEFU7paWWpmJU4qhQ78f//g2gCwcTIyr2Rphu/Y/+9fyps\n",
"lywz5vTm78roUeGOEsEAAABcQZ9HRRUsFP8ABEJ7YkmhWUtSAA5ty+cLX2BJoVLYXiR+7l7vQcBz\n",
"Dilb5TbV/2q1iJKqLJrqmoub9hgDAsp4cO3UuoL+bPBdExPKokUPNxfSGKngPrk0In2wmbEAAABE\n",
"AZ9mdEEvAAwfOj1x9P8OYANpZqbW7kE7Sj8RvPzxn69KxjZ4RQ+B5jcyMF5TTCVhZNBgLZGj95yA\n",
"lhr5xq22L6bnQIIAAABEAZ9oakEvAAwghYGkPYANn6fYAxCQx+KMxydV10sam/IfVoooPIr0oim4\n",
"Hc/susg44fos2fcK38M4cyBkckX3yK+EC4AAAADgQZtqSahBbJlMCCn//taMsAbR0lbj4CEAAiA7\n",
"BpUikgvAh6cuHHWw9SiGA+ysftDBJCHo7l3bB8VoxLqjm/P2zRz1T10UVLpjBmEs+VXAJLZ7z+B1\n",
"IvMjM/cEoXwe2206nUS3QZ+ZNyje1ddS4rl8W7e8WjXvVOe+5JmoZCcZxryf9N+xPqJ+973Ue7Zo\n",
"+5/7cBwwp/Pmktrqxo93k5q8QMKsIDzkEX2zFThcMKONraLxUX3mWdg9TLvIuPA2T3jLN2oXzNun\n",
"jpW/h+A9SDI479znWY39MBzv2W+91WFWx4EAAACQQZuLSeEKUmUwIJf//rUqgBo+PGwARAcFmY13\n",
"N4dmxPP7ElkP3RiP7pClFzTJYWUW/d8f8VgXO1eBVD9kl3HFR9pIBjkvIvTjpinM21rh+Awc6fn/\n",
"g+/T9jQ5/6GbWwBIK/+hpOltp1+tRDB07RV7GqwsJpkWp1jh+P3TQ7SGVFUspKLnwMG7NojvRkn0\n",
"IZqAAAAFAm1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAAFXwAAEAAAEAAAAAAAAAAAAAAAAB\n",
"AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n",
"AAAAAAIAAAQsdHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAAFXwAAAAAAAAAAAAAAAA\n",
"AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAGwAAABIAAAAAAAJGVkdHMA\n",
"AAAcZWxzdAAAAAAAAAABAABV8AAAQAAAAQAAAAADpG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAA\n",
"QAAABYAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAA\n",
"A09taW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJs\n",
"IAAAAAEAAAMPc3RibAAAALdzdHNkAAAAAAAAAAEAAACnYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAA\n",
"AAAAAAGwASAASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj/\n",
"/wAAADVhdmNDAWQAFf/hABhnZAAVrNlBsJaEAAADAAQAAAMAEDxYtlgBAAZo6+PLIsD9+PgAAAAA\n",
"HHV1aWRraEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAAAsAAAgAAAAABRzdHNz\n",
"AAAAAAAAAAEAAAABAAABMGN0dHMAAAAAAAAAJAAAAAQAAEAAAAAAAQAAYAAAAAABAAAgAAAAAAEA\n",
"AKAAAAAAAQAAQAAAAAABAAAAAAAAAAEAACAAAAAAAgAAQAAAAAABAABgAAAAAAEAACAAAAAAAQAA\n",
"gAAAAAACAAAgAAAAAAIAAEAAAAAAAQAAgAAAAAACAAAgAAAAAAEAAGAAAAAAAQAAIAAAAAABAABA\n",
"AAAAAAEAAKAAAAAAAQAAQAAAAAABAAAAAAAAAAEAACAAAAAAAQAAQAAAAAABAACgAAAAAAEAAEAA\n",
"AAAAAQAAAAAAAAABAAAgAAAAAAEAAKAAAAAAAQAAQAAAAAABAAAAAAAAAAEAACAAAAAAAQAAoAAA\n",
"AAABAABAAAAAAAEAAAAAAAAAAQAAIAAAAAACAABAAAAAABxzdHNjAAAAAAAAAAEAAAABAAAALAAA\n",
"AAEAAADEc3RzegAAAAAAAAAAAAAALAAAEjUAAAIfAAABBwAAAVYAAAFrAAAAYwAAAh0AAACMAAAA\n",
"1wAAAHkAAADfAAABFAAAAT0AAACDAAACEwAAAMgAAABlAAABBgAAAX8AAAHEAAAAewAAAFYAAAGe\n",
"AAAAewAAAUIAAAIxAAAAdwAAAGIAAAB2AAABXgAAAWcAAABeAAAASQAAAGwAAADRAAAAXwAAAEcA\n",
"AABVAAAA9QAAAGAAAABIAAAASAAAAOQAAACUAAAAFHN0Y28AAAAAAAAAAQAAADAAAABidWR0YQAA\n",
"AFptZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0\n",
"b28AAAAdZGF0YQAAAAEAAAAATGF2ZjU4LjQ1LjEwMA==\n",
"\">\n",
" Your browser does not support the video tag.\n",
"</video>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"HTML(anim.to_html5_video())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}