2026-rff_mp/NeklyudovMS/docs/Report 1.ipynb
2026-09-05 10:15:13 +03:00

424 lines
71 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "2acfa743",
"metadata": {},
"source": [
"# 0. Подготовим окружение"
]
},
{
"cell_type": "code",
"id": "4689b73e",
"metadata": {
"ExecuteTime": {
"end_time": "2026-09-04T06:25:55.150018Z",
"start_time": "2026-09-04T06:25:55.134797Z"
}
},
"source": [
"import sys\n",
"import os\n",
"sys.path.insert(0, os.path.abspath( '../task1'))\n",
"sys.path.insert(0, os.path.abspath( '../'))"
],
"outputs": [],
"execution_count": 1
},
{
"cell_type": "markdown",
"id": "37cc11a5",
"metadata": {},
"source": [
"# 1. Генерация тестовых данных\n",
"\n",
"Создадим список records из N=10000 элементов. Каждый элемент — кортеж (name, phone). \n",
"Имена возъмём случайные из небольшого набора (чтобы были повторения и коллизии). \n",
"Для проверки влияния порядка подготовим два варианта: \n",
"\n",
"_records_shuffled_ — случайный порядок. \n",
"_records_sorted_ — отсортированный по имени (по алфавиту)."
]
},
{
"cell_type": "code",
"id": "a3b5c31b",
"metadata": {
"ExecuteTime": {
"end_time": "2026-09-04T06:25:55.231512Z",
"start_time": "2026-09-04T06:25:55.159161Z"
}
},
"source": [
"from util.randomNames import generate_test_data\n",
"from util.timeTester import test\n",
"\n",
"records_shuffled = generate_test_data(N=10000)\n",
"records_sorted = generate_test_data(N=10000, _sorted=True)"
],
"outputs": [],
"execution_count": 2
},
{
"cell_type": "markdown",
"id": "c2f4989c",
"metadata": {},
"source": [
"# 2. Проведение замеров"
]
},
{
"cell_type": "code",
"id": "df12d41d",
"metadata": {
"ExecuteTime": {
"end_time": "2026-09-04T06:25:55.250684Z",
"start_time": "2026-09-04T06:25:55.233856Z"
}
},
"source": [
"# Подготовим функции СД, которые будем тестировать\n",
"from structures.LinkedList import *\n",
"from structures.HashTable import *\n",
"from structures.BinaryTree import *\n",
"\n",
"func_list = {\"Связанный список\" : (ll_insert, ll_find, ll_delete),\n",
" \"Хэш-таблица\" : (ht_insert, ht_find, ht_delete),\n",
" \"Бинарное дерево\" : (bst_insert, bst_find, bst_delete)}"
],
"outputs": [],
"execution_count": 3
},
{
"cell_type": "code",
"id": "cc8d0436",
"metadata": {
"ExecuteTime": {
"end_time": "2026-09-04T06:25:57.233606Z",
"start_time": "2026-09-04T06:25:55.260869Z"
}
},
"source": [
"# Проведём замеры\n",
"report = [[\"Структура\", \"Режим\", \"Вставка\", \"Поиск\", \"Удаление\"]]\n",
"records = {\"Cлучайный\" : records_shuffled, \"Отсортированный\" : records_sorted}\n",
"\n",
"TEST_ITERATIONS_NUM = 5\n",
"\n",
"for _ in range(TEST_ITERATIONS_NUM):\n",
" for mode, data in records.items():\n",
" for struct_name, fns in func_list.items():\n",
" result = test(data, *fns)\n",
" row = [struct_name, mode,\n",
" result[\"insert_time\"],\n",
" result[\"find_time\"],\n",
" result[\"delete_time\"]]\n",
" report.append(row)"
],
"outputs": [],
"execution_count": 4
},
{
"cell_type": "code",
"id": "2eedf056",
"metadata": {
"ExecuteTime": {
"end_time": "2026-09-04T06:25:57.277790Z",
"start_time": "2026-09-04T06:25:57.266011Z"
}
},
"source": [
"# Сохраним данные в csv\n",
"import csv\n",
"with open(\"data/task1/results.csv\", \"w\", newline=\"\") as f:\n",
" writer = csv.writer(f)\n",
" writer.writerows(report)"
],
"outputs": [],
"execution_count": 5
},
{
"cell_type": "markdown",
"id": "94335af1",
"metadata": {},
"source": [
"# 3. Построение графиков и их анализ"
]
},
{
"cell_type": "code",
"id": "cad64d2f",
"metadata": {
"ExecuteTime": {
"end_time": "2026-09-04T06:25:58.231489Z",
"start_time": "2026-09-04T06:25:57.280067Z"
}
},
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"df = pd.read_csv('data/task1/results.csv')\n",
"mean_times = df.groupby(['Структура', 'Режим'])[['Вставка', 'Поиск', 'Удаление']].mean().reset_index()\n",
"structures = mean_times['Структура'].unique()\n",
"modes = mean_times['Режим'].unique()\n",
"\n",
"fig, axes = plt.subplots(1, 3, figsize=(15, 5))\n",
"operations = ['Вставка', 'Поиск', 'Удаление']\n",
"\n",
"for ax, op in zip(axes, operations):\n",
" # a\n",
" x = np.arange(len(structures))\n",
" width = 0.35\n",
" \n",
" random_vals = []\n",
" sorted_vals = []\n",
" for s in structures:\n",
" random_row = mean_times[(mean_times['Структура']==s) & (mean_times['Режим']=='Cлучайный')]\n",
" sorted_row = mean_times[(mean_times['Структура']==s) & (mean_times['Режим']=='Отсортированный')]\n",
" random_vals.append(random_row[op].values[0] if not random_row.empty else 0)\n",
" sorted_vals.append(sorted_row[op].values[0] if not sorted_row.empty else 0)\n",
" \n",
" ax.bar(x - width/2, random_vals, width, label='Случайный')\n",
" ax.bar(x + width/2, sorted_vals, width, label='Отсортированный')\n",
" ax.set_xticks(x)\n",
" ax.set_xticklabels(structures)\n",
" ax.set_ylabel('Время (сек)')\n",
" ax.set_title(op)\n",
" ax.legend()\n",
"\n",
"plt.tight_layout()\n",
"plt.savefig('data/task1/performance_plot.png', dpi=150)\n",
"plt.show()"
],
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 1500x500 with 3 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAHqCAYAAADrpwd3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAACbsElEQVR4nOzdB3xN9//H8TeCGvVTkmhRpVI6fhTR0grVhZoddocRo2qLRKjR1ihi1mhrK4LQYdao1fSvNIlUECIxig5JqF/tFf/H+aa5zZVcNRJJbl7Px+M8bu45n3PO99xH63Pv53zP95vjgeIlrwkAAAAAAAAAAKSQM+UqAAAAAAAAAABgoYgOAAAAAAAAAIADFNEBAAAAAAAAAHCAIjoAAAAAAAAAAA5QRAcAAAAAAAAAwAGK6AAAAAAAAAAAOEARHQAAAAAAAAAAByiiAwAAAAAAAADgAEV0AAAAAAAAAAAcoIgOAAAAAAAAAIADLhndAAB3pnnzZpowfpzduvj4eEXt36+pUz/Vpk2bM6xtAAAgfXP+9fbti9ILL75019oEAAAAZAcU0QEnMTpgjI4cOaIcOXLIzdXN/NBeMH+e3mnTVt99tyGjmwcAANI451+vZ4/uGdIeAACyk27dumpAf3+99fY72rhxk902V1dXhYZsN53Z2rX3zrA2Akh7FNEBJ2El74iICNv7hYsWaefPO/RqkyYU0QEAcOKcn6R1q1YqUqRIhrQJAIDsYvHiIPn29TF59/oiesuWLZQnTx7NX7Agw9oHIH0wJjrgpP73v//pwoULunL1im2d1Uvd27u9Nny3XgcPRGtXxM+mt3rFihXN9t9+PXrDZemSIBOXO3du86VhzbertG/vHsVER+nrr77Us88+Y9eGkiVL2u3/y+GD2r5tqwYNfN8cI4nVa97absUnKVeunCL37NLcubOVK1cus65w4cIaPGigaX/0/n2K2hep+fO+0OOPP5bunycAAFmNlT979eqprf/3gw4djDE52N+/n/lxn5y1fvx1w8Q0bNjA5GZrW3L/9l3CYu3n06e3XTvmfTFXe3bv0iOPPJJu1wsAwN0QFxdnOqq9/PJLcnNzs9tmFdZ//fXXFMV1AFkfPdEBJ1Go0L0qct991q9b8whZ+/ZtVaBAAX315de2mHFjx6hFi+basGGjAhculIuLi6o9/bQ8q1Q2Pdq6de9hi61W7Wm9/dZbGjzkA508edKsi4+LN6/3FiyoVq1a6Ztly7QgcKEKFiigVq1aKnDBfDVo2Eh79kTatW3e/Pnavv0n5c2TR8/Vfk5duryrCxcvKiBgTKrXUrz4AwpcME8xBw7o3c5ddPXqVbO+VKlSqlu3rlauXKkjR4+aLyxvvfWmvly6RLWff1HHjx9Pl88WAICsaMyYALVo3kwrVq7U59OmqXLlSurRvZse8fCQd4eODvezit79+vmluu3fvks4aod1o71ly9aKjo5Os+sDACCjLAgM1Cuv1DN5dvKUqWZdrZo1Vbr0Qxo7dpyuXbtmi7VuVFtx11sctES9e/exva9bp47efKu1/vvEf3XffYX1++9/KGjJEn3yySQlJCTY7Wt1QPtp+4+ptq14iQdT3Px+s3UrPfTQQzp9+rTWrF2rESNGmo53Sayb5vuiotSmTTu7Yw0fNlTt2rW1O6Z1s9y6xrHjxtvWdXm3swYNGqitW39U02bNbeutG/fWd4/XXnvN/M4/ceKEvvlmmRma7tKlSzfxSQOZB0V0wEkELV5k997qhd7Hp6++Dw42760fr9aP3hkzZprCeJLPP59m+/urr/4puFs/iq0i+po1a3Xs2DG7Y5/63/9Urfozunz5sm2dVUz/fssmtW/XTj59fe3iw8J22I69cNFiPVX1KVWo8N9Ur+M///mP6dF27tw5tWnTVucvXLBt27dvn7xq1rL7QrJ06ZfmvFYRf8KEibfwiQEA4Lysp7SsH+wLFgTK16+fWTd37hc6EX/C3My2vhdYP3RT8+abrVWieHH98H//p4dKlbKtv5nvEtezer6/8fpr6tixs0JCQ9P0GgEAyCjWmOdWj/OWrVraiuit32xlOoBZQ6tez/p93tf3nxvUYwJGp4ixntA+d/acpk2brrPnzqpGjWfl59vXdGIbOmx4qu1I6rBmqf/KK6pf/xW77aNHjTTHtYagmTlrtko9+KApiluF+iavvqYrV/55cv12FSpUSN26dUux3irgz5k9S08//ZTmLwg0N9Ife/RRdezYQQ8//LDae3e443MDdxNFdMBJ9B/wvg4ePGj+tnqiv/H66yYxnzlzRt9+u0YN6tc3d6/HjZ9wx+eyjpN0J9xKjFbhO2eOHNoZEZFqcbxA/vyml3yevHn14osvyN3dTZ9P+78UcffkzatJn0xU0aJFVb9BI/355ym77cnvVOfMmVP/+U8hnTt7VgcOHlSF/6ZelAcAIDt64YUXzOvn06bbrf/s82mmiP7Siy+mWkTPd8896t2rp+bMmav7ihSxK6Lf6neJdm3bmN5n1neUtevW3fE1AQCQWVgduxYtWiwfnz7mJvO+fVGmJ/mmzZv122+/28XmdnExxerkndZGjfw4xTG7dutuiu1J5s2br1OnTqlNm3c0anSA3e9hq9ObJSQk1HbcMqVL2xXRn37qKXNjvGvX7vr6m29s6/9v649aGDhfjRo2tFt/u7p366orVy5r5077J9Jee+1V1azppTfeaKafQkJs660e71Zxv2pVT4WGht3x+YG7hSI64CTCw3+2e4zaekRq3bo1Gj5smBmvzXp064/jx00STgvNmjVV506d5OFR1m5s1V9++SVF7PDhw8ySxPqyYd1dv9648WNV1dNT589fsH0pSM4q2Hfo4G2+RFh30JPH/Pnnn2lyXQAAOIOSJUuY3nCHDx9OMY6r9V2gRMkSqe7XqXMn5c2bV59MmqwhQwbbbbuV7xLPP/+8nnyyom1OEwAAnI3V49yae+TN1q21Z88ekz8XzA9MEWetv3jx4r8eL3kB3Rqa1RoO1epl/s7bb5vf3ZGRe23bk+YYu9GQKNb8JtaQLVu+/z5x6Ne/7YqIMJ3trOJ/8iJ6bpfcdnFJbb+R+++/X+3bt9OwYcPVoEEDu21WkT46OkYxMTF2x/2//0vsUPfss89SREeWQhEdcOI741u3blXHDh1UpkyZND3266+/pokTxpse7p9+9pni408oIeGqunXrqtIPPZQifurUT03izpkzl8qXL2d6uFkF8d59fOzirN7kbdu21/DhQzV6tPXYWUu77T16dFc/P18tXLhIAaPHmB/xCdcS9OEHHyhnDuZJBgDgesmHQPs31g9ca0zTyZOn3PFN9ypVKmv+/AU6d/68evbobuYzOXAg8Yk5AACcgdXj3Op5bo2NbvWqtsYw/27DhhRxRYoU0V9/nf7X45UrV8783rWGcbGGSEnu3nvt31tPZVvOnj3r8HhWHcB6anz3rp2pbreeYE+udu3ntHt36vObONLXp4/++OO45s1fkKKIXqZMaXNNjo7pWrToLZ0LyGgU0QEn5pIr8X/xAgXymx7iVlK0eoPd6Q/jhg0a6PDhX1JMSmYl0NTsj45WcPAP5u8tW7aYnusD+vtr5KjRdpOBWmPErVu/XlcTrmreF3PVqmULM4b6P+etb8ZnvX7M9UL/KWSb/BQAAEjHjv1qJgi1fkBbPcCS/2C2vgv8euzXFPv07NVDZ86e1YyZs1I95q18l9iy5Xv59x9gerDVq1tHo0eN0htNU06qBgBAVha4YKEZIu3BBx/UhImfmKfArvfggyV16NChGx7HKpp/9eUSM/FnwJixJudavdetjmYDB76vnDlz2MW7ubmZ19jYOIfHtIZAtZ5A69a9R6rbrUk+kwvbsUOjRwfYrWvXtq3q1aub6v4eHh5mvPXu3XumOra6dX6r9/yHH32U6v6//fabw7YDmRFdNwEnZQ11Uuu5WibxWo9QrVq92iSxPr173fGxk74YWL3Jk1SuXEmenp43tb813mryR9CSJE2IsmHDRjMczcCBA+3ujlvnTX7OpEfUij/wwB1cDQAAzmfjxo3mtWNHb7v1nTsl3gC/vqfcgyVLmsfFx40dZ/c4eXK38l0iNDTUjJ9+/vx59fMfoGeeqW7GZQUAwJms/+47U6i2cl5g4MJUe6GXLFkyxXjh13v2mWdMbK/ePpo5c5YZktXqiHbqf/9LNd7q4W2d88CBAw6PaRXi77vvPjNuunWs65fkw8NYrI5p18f8/rv9+O7JWR3j9uyJ1LLly1PdfviXX1T4vsKpnttaeEINWQ090QEn8cILz5tx0ixW4fm1V19V2Ycf1qRJk814Z9bkYUuWLjVjilu90jZv3qwcOXOq2tNPm2FfZs+Ze9PnshJ6gwb1NWvmDPMj3Bqf/O2339L+/dGm1/v1PD2rmDvTVo+48uXKqV27dtq1a5eOHTvm8ByDBg/Rli2bNGzYR3r33fds5+3Tp7fGjxurkNBQM7P3a6+/ZnrFAwCAf1g/jBcHLdHbb72l/xT6j37ctk2VKlVSi+bNzHBs108qao2Lun//fi1aHOTwmLf7XcJ6Cm3pl19q4PsDtH79d4qNjU3z6wUAICNYT2fde++9+v774FR/3zZq1NC8/tsE29bT2JbkncasTmdt27yTItb6Xd2g/isK//lnnTt3zuExl69YqbZt25hx20eOHJXiGNa463/99Zduh9WBzno6rUXLVg5jVqxYaXrpWzfRFyywHyv+nnvuMddq3WwHsgqK6ICT8PPta/vbmpjzwIEY9fPvb2b0TtK7t4/2Ru5Tq1YtzCNh1qNi1h3xW53MY3FQkNzc3fT2W2/quedqKTo6Wt179FTDhg317DPVU8RbP+CtxepJbg3fsnzFCo0aNfqG57AeLfvggw/1ycQJ+vLLr8yPbmuSs/z58+vVV19V48aNTCH+nXfaaED//rfUfgAAsoO+fX115JdfzKPW1qPYVk85K5eOGzc+1fiRI0ebXm03crvfJYYM+UC1n3tOI4YPU4eOne7ougAAyGiPPfaoGebUmkjbKgjPnjMnRUzbNm3k59dX8fHxZnJua0lexH6oVCnVqllT3wcHmye4/vzzlCZOGKeZs2abOU2avvF6iiexa9b0kq9vXz322GNq07bdDdu4bds2fTFvnnp076YnHn/czFN25fIVlXm4tBo2aKjBQ4Zo1arVt3X9VgHdGrotadjW1Cxd+qW5iTBq5Meq8eyzCgkJUc5cucwwMNb61q3fUkTErY3BDmSkHA8UL3nzsw0BAAAAAAAA2Zh1g3pMQOIcX4sXB2nM2HEpYn779ei/Hsd6yqtps+bmb2ty0sGDB5mC96lT/9NXX32lH374Py1cuMDMK/Ljj9s09KMP9fjjj5ub4taTXsn59OktH58+Kl7iQbv1rVu3Mp3aypV7xDwhfvToMW3atEnTZ8y0PR22fdtW7YuKUps29oX54cOGql27tnbHtK7Luun+yisNtGv3btv6pUsSn2ZLup6kYWY7deygpk2bqnTph0yHvyNHjmjdunXm/NZT80BWQREdAAAAAAAASENWsTmp+O2oEN+8WTO7ojOAzIuJRQEAAAAAAAAAcIAiOgAAAAAAAJCGrLm94uLiHW4/fPgXMx46gKyB4VwAAAAAAAAAAMisPdGt2YqtCQwOHojWyhXLValSJYex5cqV0/Rpn5t4a2ypDh28b3jsbl3fM3EffjgkHVoOAAAAAAAAAHB2GVpEb9y4kYYMGaRx4yaobr36ioyMVOCCeSpatGiq8fny5TOz+I4YMdLMgHwjTz75pN56603tiYxMp9YDAAAAAAAAAJydS0aevFPHjgoMXKjFQUHmfT///nrxxRfVqmULTZ4yNUX8zp07zWIZMMDf4XHz58+vyZM/ka9fP/Xs0eO22lasWDGdPXv2tvYFAMCRAgUK/OuNYKQtcjoAID2Q0+8+cjoAIKNyeoYV0XPnzq2KFSto8uQptnXXrl1T8A/B8vT0vKNjjxgxTBs2bFRw8A83VUTPkyePWZK4u7vrh+Atd9QGAAAcqVylKj+67+KP7fAdoRndDACAkyKn3z3kdABARub0DCuiFylSRC4uLoqLj7NbHx8XL4+yHrd93CaNG6vCfyuofoOGN71P925d5ePTJ9UPj7vcAIC0vLtt/fgjt9w9SZ81OR0AkJbI6XcfOR0AkJE5PUOHc0lrxYs/oI8++kAtW7XWxYsXb3q/SZOn6PNp01P98M6cOZNOrQUAAHcLOR0AAOdATgcAZIQMK6KfPHlSV65ckZurm916VzdXxcXZ906/WRUrVJSbm5vWrvnWts7q7V69ejW1a9tWpcuUVUJCQor9Ll26ZBYAAAAAAAAAADJFEf3y5cuKiNglL68aWrN2rVmXI0cOeXl5ac7sObd1zOAfftDzL7xkt278uLGKORCjKVM+TbWADgAAAAAAAABAphzOZdr06Zowfpx2RkQoPPxndezorfz58mnR4iCzfeLE8frj9z/08chRtslIy5V75O+/8+iB++/XE088rrNnz+nw4cPmsa6oqCi7c5w7d05//vlnivUAAAAAAAAAAGTqIvry5StUtEgR+fb1McOw7NkTqTffelvx8fFme4niJZSQcM1uNu716xJ7rVu6dHnXLFu3/qimzZrf9fbny3eP7ruviHLmyHHXzw2kpasJCWYYJWuIJQDIjsjpcBbkdADZmTWcq1VbyJUzZ0Y3BbgjCdeu6c8/T+r8+QsZ3RQAmWVi0dlz5polNdcXxo8dO6biJR68peOnR3HdGnamWdM3VL169TQ/NpBRLl66qICAsWa+AgDILsjpcEbkdADZUdGiRdW3bx/lzZM3o5sCpJlt27ZpydIvde3aPx1MAWTTInpWlPhju5pWrFypgwcP6So9fZDF5c6TR2+92VqtWrXU1KmfkqABZBvkdDgbcjqA7HpTvGXLFjp75qymBc7Q5UuXMrpJwB3J5eKihx8uo0YNG5j3QUuWZnSTgGyPIvotypcvn+mtZv3Y3rRpc0Y3B0gzK1et0ttvvaV7771Xf/31V0Y3BwDSHTkdzoqcDiC7KVSokMo+/LDmzZ+vQ4cOZXRzgDTxyy+/mNdGDRua76sM7QJkLAYKu0X33XefebV6qwHO5ET8CfNasGDBjG4KANwV5HQ4K3I6gOymQIECdv/+Ac4i6XuqNXcPgIxFEf0WJU04xuPecDYJCQnmlUn1AGQX5HQ4K3I6gOwm6d+7pH//AGeR9D2VnA5kPIroAAAAAAAAAAA4QBEdmdbgwYP0xhuvm78Hvj9A7dq2SfdzvvzySwoYPcpMTPPiiy9o2rTP0v2cAAA4O3I6AADOgZwOILtiYtE09ODrG+7auY5+9eJt7efm5qaePbqbxHP//ffrxIkT2rNnj6bPmKkffvg/ZSaLFi1W0OKFGjd2jI4eO6bGjV9N93MGB/+g3r166fChAzp//rzatvNO93MCALJvPreQ09MHOR0AQE5Pe+R0ANkVRfRspGTJklr2zdf666//aeiw4dq3b59cXHKrdu3nNGL4MNV67nllJvv375dn1afl6uqq2NhYXbt2Ld3PeeHCBdVv0FDu7u46deqULl26lO7nBADgVpHT/x05HQCQFZDT/x05HUBmwHAu2cjHI4brmq6pfoNGWr36WzPLs5UAp02broaNmtjixo8fp99+PWq3fPjhELPNuts8d+5su+O6uLgoYme4WrVsYd5b8fXq1rVtb968mfZG7ra9f+ihhzR71kzt/HmHovfv0+pVK1WzppfdMbdv26oOHbx19epVHT9+XDVqPGuOO2vmDFvM0iVBtnYl8enTW+vXrbG7luT7JGcd3zpParHWl4ECBfIrcs8uu7YDAJAZkNPtkdMBAFkVOd0eOR1AZkURPZsoXLiwnn++tubMmWsef7reX3/9ZfvbmvR548ZNerJSFbOEhobatgUuXKjna9c2d4CTvPTSS8qXL5+WLV9xU22xkt6GjRvVvEUr1albT5s2b9ac2bNVonjxVOOtcc+GDB6kM2fO6G7q07u3+eIBAEBmQk6/deR0AEBmRE6/deR0ABmFIno2Ubp0aeXMmVMxMQf+NTa3S26dPXdWcXFxZrl06bJtW2homA4cOKCmf08kYmnZorlWrlylc+fOmffnz1/QPffc4/D4kZF7NX/+AkVFRenQocMKCBijX375RXXqvJxqfPNmzZQnTx6tXbtOd8vDD5dRy5YtNH166nfHAQDIKOT0W0NOBwBkVuT0W0NOB5CRKKJnE9Zd65tV8N6COncu5V3wJIELF6lFi+bmb2scNOvO+cJFi23braTboEF9h3eH8+fPr8GDBmrL5o3mESzrUbFHHvFQiRIlUsTmu+ce+fn5atjwEbpy9WqK7W3eecfsn7R0794tRcxLL71otlmPfK1fv1YtWyQ+znYjA99/X/PmL9AvR478aywAAHcTOZ2cDgBwDuR0cjqArINnYLIJ605yQkKCPDzK/mvs/cWKae/efQ63L126VAP6+8vTs4qqVq2qI0eP6qeffrJtHzLkA82aNUMx0VG6fPmycuXKpYsXL9q2Dx48ULVq1tJHQ4fp8OHDZpKQ6dM+U+48uVOcq0uXd3Xg4AGtX/+d6tevn2L7119/o4mfTLK9927fTtWrV7OL2bp1q/z7v2++LFiznY8ZM1p79zm+vurVq+vpak+rdx8f1a1b518+LQAA7i5yOjkdAOAcyOnkdABZB0X0bMKawXrz5i1q27aNZs6clWK8tUKFCpnx1qwx0zw8HtGkyVMcHuvPP0+ZR7ZaNG8uT09PLV4cZLc9JDTUjNFm3bG2EnP9V+rZ3Xl+qupTClqyRGvWrLHd8bZmJL9eMXd3vfPO23rjjWYO2/LX6b9Mgk9+ndez7tYnxcTExKhb1/f0xOOP3XBctwkTJup///ufw/PC3qrXH1JW1uCrXzK6CQBw08jp5PT0RE4HgLuHnE5OT0/kdCBtMZxLNjLg/YHKlTOnVq9aofr1X1GZMqXl4eFh7gqvWP6NPMqW1adTp+ivv/5nJiy5kcDAhWrWrKl5vGvJkqUptlt3048ePWqSYvyJE3bbDh06ZBL2E088rscff0xTp0w248Bdz/oi8e2aNdq9Z88dXbd17Lx586pAgQJq3LiR7rvvPu2Liko11surhu4tdK+Z2AUAgMyKnE5OBwA4B3I6OR1A1kBP9GzkyJEjqluvvnr26G7u4lozd584eVK7InbJv/8A+fj0MXekW7RsbZt8xJHvg4MVGxurqP37dfz48VtqxwcffqRx48Zo+bJvdPLkSU2Z8qkKFiyYalIdNWq07pQ1EcqhgzHmkbWjx45p4MDB2rEjXFWqVEkRayXwESM+1pUrV+74vAAApBdyOjkdAOAcyOnkdABZQ44Hipe8ltGNyGysRLE/aq/KlX9MZ86csdtWskQJ9enTW+PGjdexX39VdmU92rUjLMSMR/btt4mPeyFru5P/tnlMDLjz/IL0QU7/d+R050NOB9IfOf3uI6f/O3K68yGnA5knp9MTHbfEGousSJEierdzJzM227p16zO6SQAA4DaQ0wEAcA7kdABIfxTRcUusSUh+2v6jfvvtN/Xq3UdXr17N6CYBAIDbQE4HAMA5kNMBIP1RRMctOXbsmIqXeDCjmwEAAO4QOR0AAOdATgeA9JdyqmUAAAAAAAAAAGBQRAcAAAAAAAAAwAGK6AAAAAAAAAAAOEARHQAAAAAAAAAAByiiAwAAAAAAAADgAEV0AAAAAAAAAAAcoIgOOKmCBQtq/bo1yp8/vx544H793w/BGd0kAABwG8jpAG5F2zZttH3bVh08EK2VK5arUqVKN4xv2LCBvt+yycRv+G69Xnjh+RQxvn19FL4jVAdiorV4UaDKlCltt71w4cKaPOkTRe2L1N7I3Ro7JsD8m5XEp09v/fbr0RRLTHRUGl45kPmR04GsyyWjG+BMVr3+0F07V4Ovfrmt/YoXf0B9fXxUu3ZtFSlyn2JjY7VmzVqNnzBBf/55Ks3biYxz5swZ/fRTiPbt3WPeDx/xcUY3CQCyhLuZzy3kdPwbcjqAm9W4cSMNGTJI/v4DtCM8XB07eCtwwTzVrFVbJ06cSBFftaqnpk6ZrI8/Hqn1323Qa6+9qlkzZ6huvfqKikoscHd9r4vat2+nXr366MjRI/Lz9VXggvmq/fyLunjxoomxCujFirmrZavWyu2SW+PGj1XA6FHq2q272f7pZ5/ri3nz7c4dtHihft4Zka6fBzkdmQ05Hci66ImejZQqVUrfrl6lMmXK6L2u3VSjRk318+8vLy8vLV++zPQegHN5f+AgVXyysh5/ooI+/3xaRjcHAJBGyOnZDzkdwM3o1LGjAgMXanFQkKKjo01uOH/+glq1bJFqfAdvb23avNkUuWNiYhQQMEa7du9Wu3Zt/onp4K2JEydp7bp12rt3n3r07KVixYqpXt26ZruHh4fpve7T10/h4T/rp5AQDRw4WE2aNDZxlnPnzikuLs62uLm5qnz58lq4cJGyO3J69kNOB7ImiujZyIjhw3T58mW1av2mtm3bpl9/+02bNm1Wi5at9MD996tfPz8tXRKU6mN21mI9gmfJkyeP3h/QX6Eh23XoYIx5/Cj5l7Lq1atr1coVZpv1yN+A/v7KlSuXbbt1juHDhprFuvu6e9dO+fr2tdv+b22wHk+0vswl8fKqYbZbvSZu9jyW//znP5o4cbwi9+zSgZj9mj/vC7tHE5s3b2Y799Ejh7UjLNRce44cOcz2nDlzmkcVt/34f+bRxuDvN8vbu73dOcaPH2fXrqTjWo85JrGuy3qkK7lnnqluzluoUKFU90nuiSceN7ElS5ZMEXvq1Clzt/urL5eaGCsWAJC1kdPJ6eR0ANfLnTu3KlasoODgH2zrrl27puAfguXp6ZnqPp6eVeziLVs2b7HFWwVeqxBuHSPJ6dOnTbHc2tdS1dPT/PsUEfFPr/Lg4GAlJCSocuXKqZ63datWOnDggH766Sdld+R0cjo5HcgaGM4lm7DuXteu/ZxGjhqtCxcu2G2zegJ89dXXatyokbxq1pSLS26zfuaMaQoNDTO9Eixnz541r59MnGC+MA0cNESRkZEqVepBFSlSxGy7//77NX/eXAUFLVHPnr1Mr4SAgFHmMb+x48bbztmsWVMtXLRIDRo2UsWKFc2jfr/++qvpNdGhYyfzBfBGbUjOSpRDBg8yCeh6NzqPZcL4cSYZt23nrTNnTuv9AQM0b94Xql37BV25csXE/PXXX+bxR+sLxtNPP6XPPp2qrT/+aL7YWMn5999/V6fOXfTnn3+axyGtc1iP361YsVKZxSuv1NN///tERjcDAJAGyOnkdHI6gNRY/367uLgoLj7Obn18XLw8ynqkuo+bm5vZnlxcfLzc3dzM3+7uia9xKWLi5O7unngMd7cUQ8VcvXrVFAmT9k8ub968eu211zRlypQbXo9VFLaWJAUKFJCzIaeT08npQNZBET2bsBKQlUhiomNS3R4dE6P77iusnDlzmWRtuXTpskmGSe8tDz9cxoyzZ90VT+qxcOTIEdv2Nm3e0W+//aYB7w8072MOHFCx+4uZu8Ljxk8wPSEsVsyQIR+avw8cOKjHHn1UnTp2MEnT+rKVJLU2XK95s2bmy9XatetSfLG60Xmsz6Ru3Tpq3ORV8wXA0q17d4WG/KR69epq5cpVZp3V5qTzHzly1HwhtHpfWKwEPmbsONv5jh49anpiNGrUMNMkZ+uL9PvvD9CUqZ+qn59vRjcHAHCHyOnkdHI6gKzslXr1VLBgAQUtWXrDuO7dusrHp4+cGTmdnE5OB7IOiujZzd+PN92uJ554wiSkH3/clur2Rzw8FBa2w25dSEiImYG6+AMPmEfTLDt2hNvFWPt07tzJfIGwHvu7WfnuuUd+fr7y799f9evXT7H9Rud5xOMR89hc8hhr0hbrsULrOpI/Sha9f5/54pI3bx5NnjLVlswtbdu0UcuWzVWiRAndc8895u78nj2Rdud96aUXzTGSWHfLkybhSfLoo4/axVjnu15SW6zPyOohsm7tOo34eOQNP6O2bdvo9F+nTS8GkjMAOBFyOjkdAJI5efKk+XfdzdW+97erm6vDYqe13tqenJurq2L/jo+NTXy1xjC3evH+E+OmPXsSJ0aMi41T0aJF7Y5h/dto9bJO2j+5Vq1b6rvvNig+3r53+/UmTZ6iz6dNt723CrHWMCROiZxOTgeQ6VFEzyYOHz5s/kF/5BEPrbEf0suwkpGVmFKbsT256x8xy2hduryrAwcPaP3671JNzmnBupttzU5vfa8pX668xo4dY8b7W736WzVp3FiDBg3UR0OHKiw0TGfOnlWXLp1V5bqx/7Zu3Sr//u/b3td/pZ66d+9mF2N9KbAeV0tSuXIlTZk8yWFbyj1SThMmjDNfTJOPUXh9Mu/Vq6e8vTvaehcAALI2cvrtI6cDcGZW4TEiYpcZh3rN2rW2ITWsCSrnzJ6T6j5W8bKmVw3NmDHTtq5WrZoKCwuz9WY+fvy4OUZSAdIqvFr/rn3xxTzzPjQszBTMK1SooF27dpl1XjVqmIJoeLh9sfTBBx9UjWefVdt29uNTp+bSpUtmcWbk9NtHTgdwtzGxaDZhJd7vvw82j3FZd2GvHwfv9ddf0/IVK/71ONZs7NaXIWsyDUePmyVNMJPkqaeeMknlt99/t0s8yVWpUlmHDh26pbvbxdzdzd3qjz4c6jDmRueJjok2d6OtdUmsR+XKli2r/dHRtnVWrPXl5tChw+bL6P9t/T/zCGLitVVVaFio5s79Qrv37DFxpR96KEU7zp07b7YlLfGpfAmyvvQmj/njjz9SxCRvy9p16/R9cPANJyCxEvNP23/S9u3bHcYAALIWcnrK85DTASDRtOnT1bp1KzPmtDXu9ciRI5Q/Xz4tWhxktluTNfb372eLnzFzpmrXrm3+DfYoW9ZMpGiNUT179tx/YmbMVM8e3VXn5ZdNr1xr7G2rsJ5UqI+JidHGjZs0JmCUKlWqpKeqVtWw4UO1bNlyE5dcy5YtdPx4rIkHOT2185DTAWRWFNGzkfcHDlTePHkUuGC+qlWrpuLFHzBfmBYtDNTvf/yhUaNG/+sxjh07piVLlmrc2DGqV7eu6UlgJWprbDGLlaSKFy9uZtq2voTVrVNHfX36aNq06XZ3WK1HqoYMGayyZR/Wq02aqH37dpoxc9YtXY/1+NO3a9aYpOjIjc5jku2atWaCkaefekqPP/6YJn3yifksrHHbkli9N6wvMNbEOc8++4yeqV7djCGXeIxDerJiRT333HNmHDprVvEnn3xS6cmaiMf6gmX19LDaHRUVlWpcvnz59NabrTVs+PB0bQ8A4O4jp5PTASA1y5ev0NChw+Tb10fr163RE48/oTffets2dEqJ4iXkXqyYLd4a/qJrt+7m35j169eqQYMGau/dwe7fI2vM5tmz52j06JFavWqFChTIb46ZfNiLbt17KCbmgIIWL9S8eXMV8lOIfP3+KdYn/RvconkzBS1ZcktFWWdHTienA8gaGM4lG7GSUb1XGqhvXx99/tlU88idNQaelaDGjR9vN1HIjfj3HyB//34aMWK4uSNsjZ826ZPJZpt1V/att9to0MD3zZcw65gLFy7ShImf2B1j6dIvTYJZtXKFrl5NMAlz/vwFt3Q91p32f/tC8W/n6d3HRx999IHmzp1tJj3Ztm273n77HduM35ZChQpp5887Esc3i4vTipWr9Omnn5lt8+Yv0H//+1999ukU8+Xjm2XLzReUF154XunBeuzr0MEYW1u+XbPWjBNYrtwjKWKt67Gu9eDBQ+nSFgBAxiGnk9MBwJHZc+aaJTVNmzVPsc6aqDFpskZHAsaMNYsjVo6wivE3Yv3bWvWpajeMyY7I6eR0AFlDjgeKl2QAputYY7ztj9qrcuUf05kzZ+y2lSxRQn369Na4ceN17NdfM6yNWdnSJUHaE7nHNht3Vj+Ps7iT/7ZXvZ7y0bispMFXv2R0E5BN3Ci/IH2Q09MXOT1zIqcD6Y+cfveR09MXOT1zIqcDmSenM5wLAAAAAAAAAAAOUEQHAAAAAAAAAMABxkTHXZfaOHxZ+TwAAGRX5HQAAJwDOR0Aboye6AAAAAAAAAAAOEARHQAAAAAAAAAAByii36KrCQnmNXeePBndFCBN5XJJHN0p4dq1jG4KANwV5HQ4K3I6gOwm6d+7pH//AGeR9D31asLVjG4KkO2RYW5RXFycLl66qDdbt9Kq1at1Iv6EEv7+EQ5kVdaXzbp1XtaVK1d08uTJjG4OANwV5HQ4I3I6gOzI+vfO+nfP+vdv7br1unrlSkY3CbgjOXPmVFHXomrYoIH5vhoXF5/RTQKyPYrot8hKzAEBY9WqVUu9/dZbGd0cIE3/2545a5YuXLiQ0U0BgLuCnA5nRU4HkN1Y/95Z/+55t2+vRx99NKObA6SZAwcOaMrUT01uB5CxKKLf5l3uqVM/1b333quCBQsqZ44cGd0k4I4ff7T+u+bHNoDshpwOZ0NOB5BdRUXt1+AhH6hIkSLkczhFPj9z5oxOnz6tawzPBmQKFNFvk/WP2F9//WUWAACyurZt2qhLl85yc3NTZOReDRw0WD///LPD+IYNG8jPt69KliypQ4cOa/iIEdq4cZNdjG9fH7Vu3UqFCv1HoaEh8u8/wMQm6dGju1568QU98cQTunTpkh57/L92+z/++GPq1rWrnn76Kd13XxEdO3ZUX8ybr5kzZ6XptZPTAQBwDtYNxN9++y2jmwEAcEJMLAoAQDbXuHEjDRkySOPGTVDdevUVGRmpwAXzVLRo0VTjq1b11NQpk7Vw4SLVqfuK1qxdq1kzZ6h8+fK2mK7vdVH79u3k7z9ADRs10rlz5xW4YL7y5s1ri8mTO7dWrFyluV/MS/U8FStUVHx8vLp176nnX3hREz+ZpAH9/dWubZt0+BQAAAAAAMikRXSr59v2bVt18EC0Vq5YrkqVKjmMLVeunKZP+9zE//brUXXo4J0iplu3rlq9aqX2R+1VxM5w86O+bNmH0/kqAADIujp17KjAwIVaHBSk6Oho9fPvr/PnL6hVyxapxnfw9tamzZv16WefKyYmRgEBY7Rr9261a/dPcdvK0RMnTtLadeu0d+8+9ejZS8WKFVO9unVtMWPGjtP06TO0b9++VM+zaPFi81j2tm3bdOTIEX311ddavDhIr9R/JR0+BQAAAAAAMmER/VZ7vuXLl8/8iB4xYqSOHz+easwz1atrzty5atioiVq2ai2X3C5aGLjA7AsAAOzlzp1bFStWUHDwD3bDmwT/ECxPT89U9/H0rGIXb9myeYstvlSpUqZgbh0jiTWeY3j4z2bfO2GNXX7q1CmH2/PkyWPGNk9aChQocEfnAwAAAADAJbP0fLNYPd9efPFF0/Nt8pSpKeJ37txpFsuAAf6pHvPNt962e9+rVx/t3rVTFStW1Pbt29PlOgAAyKqsybdcXFwUFx9ntz4+Ll4eZT1S3ccaN93anlxcfLzc3dzM3+7uia9xKWLi5O7ufttttYaRsW7Av/NOW4cx3bt1lY9Pn9s+BwAAAAAAmaYn+u30fLsdhQoVMq836rUGAAAyN2u89dmzZmrc+Ana8v33DuMmTZ6icuUfsy2Vq1S9q+0EAAAAADgfl6zU8+1W5ciRQx9+OEQ//fSToqKibvjot7Uk4dFvAEB2cfLkSV25ckVurom9x5O4urkqLs4+Ryex1lvbk3NzdVXs3/GxsYmvbm6uio2NTRbjpj179txyGx955BEFLV6o+QsCNXHiJzeMvXTpklkAAAAAAHCaiUXT04gRw/Vo+fLq8l7XG8ZZj35bE5EmLeE7Qu9aGwEAyEiXL19WRMQueXnVsLsJ7eXlpbCwsFT3CQvboZrJ4i21atW0xVvzl1hzl1jHSGKNT165ciWz762wJhVfumSxlixZqlGjRt/i1QEAAAAAkIV7ot9Oz7dbMXzYUL380ot67fWm+v33P24Yaz36/fm06XY90SmkAwCyi2nTp2vC+HHaGRFhJv/s2NFb+fPl06LFiXOWTJw4Xn/8/oc+HjnKvJ8xc6a+XLpEnTt30obvNqhJk8Zm7hFfv3/mK5kxY6Z69uiuQwcP6cjRo/Lz7WsK62vWrrXFlCheXIXvK2xec+XKpSeeeNysP3TosM6dO2eGcFkStEibt2wxedoai91y9epV8z0CAAAAAACnLqIn7/mW9IM6qefbnNlz7riAXq9ePTVt1kxHjx7913ge/QYAZGfLl69Q0SJF5NvXxxSq9+yJNBN1x8cnTgxaongJJSRcs8WHhoapa7fu6ufnK/9+fqbo3d67g93QaVOmfqr8+fNr9OiRZn6SkJAQc8yLFy/aYvr69lWL5s1s79evS/w+8EbTZvrxx21q2KC+XF1d1fSNN8ySxMrt1ao/m+6fCwAAAAAAGVpEv52eb9ZkpOXKPfL333n0wP33m15rZ8+e0+HDh21DuLz2ahO1a99BZ86ctfVaO336tC5cuJBh1woAQGY2e85cs6SmabPmKdatXLnKLDcSMGasWRzp3buPWRwZO268WQAAAAAAyLZF9Fvt+VasWDFbLzVLly7vmmXr1h9tP/DbtnnHvH715RK7c/Xq3UdBQfbrAAAAAAAAAADItEX0W+35duzYMRUv8eANj/dv2wEAAAAAAAAAuFk5bzoSAAAAAAAAAIBshiI6AAAAAAAAAAAOUEQHAAAAAAAAAMABiugAAAAAAAAAADhAER0AAAAAAAAAAAcoogMAAAAAAAAA4ICLow0AAAAAAADIXFa9/pCysgZf/ZLRTQCAW0ZPdAAAAAAAAAAAHKCIDgAAAAAAAACAAxTRAQAAAAAAAABwgCI6AAAAAAAAAAAOUEQHAAAAAAAAAMABiugAAAAAAAAAADhAER0AAAAAAAAAAAcoogMAAAAAAAAA4ABFdAAAAAAAAAAAHKCIDgAAAAAAAACAAxTRAQAAAAAAAABwgCI6AAAAAAAAAAAOUEQHAAAAAAAAAMABiugAAAAAAAAAADhAER0AAAAAACfRtk0bbd+2VQcPRGvliuWqVKnSDeMbNmyg77dsMvEbvluvF154PkWMb18fhe8I1YGYaC1eFKgyZUrbbS9cuLAmT/pEUfsitTdyt8aOCVD+/PlTHOfdzp0VHLxFhw7GKCw0RD16dE+DKwYAIP1RRAcAAAAAwAk0btxIQ4YM0rhxE1S3Xn1FRkYqcME8FS1aNNX4qlU9NXXKZC1cuEh16r6iNWvXatbMGSpfvrwtput7XdS+fTv5+w9Qw0aNdO7ceQUumK+8efPaYqwCevny5dSyVWu1adNO1apXU8DoUXbnGvrRh2rduqWGfjRMtZ57Xm3btdfP4T+n46cBAEDaoYgOAAAAAIAT6NSxowIDF2pxUJCio6PVz7+/zp+/oFYtW6Qa38HbW5s2b9ann32umJgYBQSM0a7du9WuXZt/Yjp4a+LESVq7bp327t2nHj17qVixYqpXt67Z7uHhYXqv+/T1U3j4z/opJEQDBw5WkyaNTVxSzDvvvK127b21bv16HT16VLt27dL3wcF36ZMBAODOUEQHAAAAACCLy507typWrKDg4B9s665du6bgH4Ll6emZ6j6enlXs4i1bNm+xxZcqVcoUwq1jJDl9+rQpllv7Wqp6eurUqVOKiIiwxQQHByshIUGVK1c27+u8/JKOHDmil156Sdt+/D8z3MyYgNFmGBgAALICiugAAAAAAGRxRYoUkYuLi+Li4+zWx8fFy83NLdV9rPXW9uTi4uPl/ne8u3via1yKmDi5u7snHsPdTSdOnLDbfvXqVVNYT9q/1EOlVKJECTP+eo+evdWrdx9T8J827TOH15MnTx4VLFjQthQoUOAWPg0AANKWSxofDwAAAAAAwCZnjpy655571LNnLx08eMis8/Hx1dq136ps2Yd14MDBFPt079ZVPj59MqC1AACkRE90AAAAAACyuJMnT+rKlStyc7Xvde7q5qq4OPve6Ums9db25NxcXRX7d3xsbOKrW4oYN8XGxiYeIzYuxcSluXLlMkO1JO1vxV6+fNlWQLdEx8SY1xLFS6TatkmTp6hc+cdsS+UqVW/ykwAAIO1RRAcAAAAAIIuzitQREbvk5VXDti5Hjhzy8vJSWFhYqvuEhe1QzWTxllq1atrirXHMjx8/bo6RxBpapXLlSmZfS2hYmCmYV6hQwRbjVaOGcubMqfDwcPM+JCTUjNn+0EMP2WIefriMeT3267FU23bp0iWdOXPGtpw9e/a2PhcAANICRXQAAAAAAJzAtOnT1bp1KzVr1lQeHh4aOXKE8ufLp0WLg8z2iRPHq79/P1v8jJkzVbt2bXXu3EkeZcvKp09vVaxYUbNnz/0nZsZM9ezRXXVeflmPPvqoPpk4wRTW16xda7bHxMRo48ZNGhMwSpUqVdJTVatq2PChWrZsuYmzfB8cbCYeHTd2jP77xBOm4D5q1Eht2fK9Xe90AAAyK8ZEBwAAAADACSxfvkJFixSRb18fM2nonj2RevOttxUfH28bOiUh4ZotPjQ0TF27dVc/P1/59/PToUOH1d67g6KiomwxU6Z+qvz582v06JEqVKiQQkJCzDEvXrxoi+nWvYeGDxuqoMULlZCQoNWrv9XAQYNt269du6Y2bdtr2NCP9NVXS3Xu3Dlt2rRZH3409K59NgAA3AmK6AAAAAAAOInZc+aaJTVNmzVPsW7lylVmuZGAMWPN4sipU6dMMf5GrF7pHTt1vmEMAACZFcO5AAAAAAAAAADgAEV0AAAAAAAAAAAcoIgOAAAAAAAAAIADFNEBAAAAAAAAAHCAIjoAAAAAAAAAAA5QRAcAAAAAAAAAwAGK6AAAAAAAAAAAOEARHQAAAAAAAAAAByiiAwAAAAAAAADgAEV0AAAAAAAAAAAcoIgOAAAAAAAAAIADFNEBAAAAAAAAAHCAIjoAAAAAAAAAAA5QRAcAAAAAAAAAwAGK6AAAAAAAAAAAOEARHQAAAAAAAAAAByiiAwAAtW3TRtu3bdXBA9FauWK5KlWqdMP4hg0b6Pstm0z8hu/W64UXnk8R49vXR+E7QnUgJlqLFwWqTJnSdtt79Oiu5cu+1oGY/dobuTvV85QoXlxffDHHxETsDNegge8rV65cd3i1AAAAAADcPIroAABkc40bN9KQIYM0btwE1a1XX5GRkQpcME9FixZNNb5qVU9NnTJZCxcuUp26r2jN2rWaNXOGypcvb4vp+l4XtW/fTv7+A9SwUSOdO3degQvmK2/evLaYPLlza8XKVZr7xbxUz5MzZ0598cVcE9e4yavq2au3mjdvJl/fvunwKQAAAAAAkEmL6LfS861cuXKaPu1zE//br0fVoYP3HR8TAIDsrlPHjgoMXKjFQUGKjo5WP//+On/+glq1bJFqfAdvb23avFmffva5YmJiFBAwRrt271a7dm3+iengrYkTJ2ntunXau3efevTspWLFiqle3bq2mDFjx2n69Bnat29fqud57rlaKlfuEXXr3lN79kRq06bNGh0wRm3bvKPcuXOnwycBAAAAAEAmK6Lfas+3fPny6ciRIxoxYqSOHz+eJscEACA7s4rRFStWUHDwD7Z1165dU/APwfL09Ex1H0/PKnbxli2bt9jiS5UqZQrm1jGSnD59WuHhP5t9b1ZVT09TYI+Pj7et27x5iwoVKqTy5cqluk+ePHlUsGBB21KgQIGbPh8AAAAAAJmuiH6rPd927typocOGa9ny5bp06VKaHBMAgOysSJEicnFxUVx8nN36+Lh4ubm5pbqPtd7anlxcfLzc/453d098jUsREyd3d/ebbpt1nuuPER+X2E63v89xve7dump/1F7bYo3JDgAAAABAliyi307Pt/Q6Jr3WAABwDpMmT1G58o/ZlspVqmZ0kwAAAAAAWVzOrNTzLb2OSa81AEB2dfLkSV25ckVurvZ50tXNVXF/9/q+nrXe2p6cm6urYv+Oj439u7d4ihg3xcbG3nTbrPNcfwzXv/N53N/nuJ71pNqZM2dsy9mzZ2/6fAAAAAAAZMqJRTMDeq0BALKry5cvKyJil7y8atjW5ciRQ15eXgoLC0t1n7CwHaqZLN5Sq1ZNW7w1f4k1d4l1jCTWk16VK1cy+96s0LAwPfroo3bzmljn+euvv7Q/OvqWrhMAAAAAgNvloizU8y29jmn1WnM0xjoAAM5u2vTpmjB+nHZGRJjJPzt29Fb+fPm0aHGQ2T5x4nj98fsf+njkKPN+xsyZ+nLpEnXu3EkbvtugJk0aq2LFivL187cdc8aMmerZo7sOHTykI0ePys+3rymsr1m71hZTonhxFb6vsHnNlSuXnnjicbP+0KHDOnfunLZs+V7790dr0icTNWz4cLm5uaufn6/mzP2CvA0AAAAAcP4ievKeb0k/qJN6vs2ZPSfTHBMAAGe3fPkKFS1SRL59fczwZ3v2ROrNt95WfHzipJ4lipdQQsI1W3xoaJi6dutuCtr+/fxM0bu9dwdFRUXZYqZM/VT58+fX6NEjVahQIYWEhJhjXrx40RbT17evWjRvZnu/fl1i7n6jaTP9+OM2JSQk6J02bTXy4xFasXyZKawvWbJUAQFj7tInAwAAAABABhbRb6fnmzVxaLlyj/z9dx49cP/9ptfa2bPndPjw4Zs6JgAASGn2nLlmSU3TZs1TrFu5cpVZbiRgzFizONK7dx+z3Mivv/6qt99pc8MYAAAAAACctoh+qz3fihUrZuulZunS5V2zbN36o+0H/r8dEwAAAAAAAACALFFEv9Web8eOHVPxEg/e0TEBAAAAAAAAALhZOW86EgAAAAAAAACAbIYiOgAAAAAAAAAADlBEBwAAAAAAAADAAYroAAAAAAAAAAA4QBEdAAAAAAAAAAAHKKIDAAAAAAAAAOAARXQAAAAAAAAAABygiA4AAAAAAAAAgAMU0QEAAAAAAAAAcIAiOgAAAAAAAAAADlBEBwAAAAAAAADAAYroAAAAAAAAAAA4QBEdAAAAAAAAAAAHKKIDAAAAAAAAAOAARXQAAAAAAAAAABygiA4AAAAAgJNo26aNtm/bqoMHorVyxXJVqlTphvENGzbQ91s2mfgN363XCy88nyLGt6+PwneE6kBMtBYvClSZMqXtthcuXFiTJ32iqH2R2hu5W2PHBCh//vy27SVLltRvvx5NsVSpUjkNrxwAgPRDER0AAAAAACfQuHEjDRkySOPGTVDdevUVGRmpwAXzVLRo0VTjq1b11NQpk7Vw4SLVqfuK1qxdq1kzZ6h8+fK2mK7vdVH79u3k7z9ADRs10rlz5xW4YL7y5s1ri7EK6OXLl1PLVq3Vpk07VateTQGjR6U4X/MWLfVkpSq2JSJiVzp9EgAApC2XND4eAAAAMqlVrz+krKzBV79kdBMAIFPr1LGjAgMXanFQkHnfz7+/XnzxRbVq2UKTp0xNEd/B21ubNm/Wp599bt4HBIxRrVo11a5dG1M0NzEdvDVx4iStXbfOvO/Rs5d2/rxD9erW1bLly+Xh4WF6r9d7pYEiIiJMzMCBgzV/3lx9NHSYjh8/bjvfn3/+qbi4uLvyWQAAkJboiQ4AAAAAQBaXO3duVaxYQcHBP9jWXbt2TcE/BMvT0zPVfTw9q9jFW7Zs3mKLL1WqlIoVK2aOkeT06dMKD//Z7Gup6umpU6dO2QroluDgYCUkJKhyZfvhWubMnqWIneH65usvVefll9PoygEASH/0RAcAAAAAIIsrUqSIXFxcFBdv39M7Pi5eHmU9Ut3Hzc3NbE8uLj5e7m5u5m9398TXuBQxcXJ3d088hrubTpw4Ybf96tWrprCetP+5s2f1wYcfKSQkRAkJ19Sg/iuaNWuG2rfvoHXr16fatjx58pglSYECBW76swAAIK1RRAcAAAAAAOnm5J9/atq06bb3O3fuVLH7i6lLl3cdFtG7d+sqH58+d7GVAAA4xnAuAAAAAABkcSdPntSVK1fk5prY+zuJq5urw3HIrfXW9uTcXF0V+3d8bGziq1uKGDfFxsYmHiM2LsXEpbly5VLhwoVt+6cmfMfPKl3a8VwdkyZPUbnyj9mWylWqOowFACC9UUQHAAAAACCLu3z5siIidsnLq4ZtXY4cOeTl5aWwsLBU9wkL26GayeIt1sSiSfFHjhwxE4Nax0hSsGBBVa5cyexrCQ0LMwXzChUq2GK8atRQzpw5FR4e7rC9TzzxuK0Qn5pLly7pzJkztuXs2bM39TkAAJAeGM4FAAAAAAAnMG36dE0YP047IyLM5J8dO3orf758WrQ4yGyfOHG8/vj9D308cpR5P2PmTH25dIk6d+6kDd9tUJMmjVWxYkX5+vnbjjljxkz17NFdhw4e0pGjR+Xn29cU1tesXWu2x8TEaOPGTRoTMEr9/Acot4uLhg0fqmXLlps4S7NmTXX50mXt3r3bvH+l/itq2bKF+vb1y4BPCQCAW0cRHf9q1euOH7HLChp89UtGNwEAAAAA0t3y5StUtEgR+fb1MZOG7tkTqTffelvx8YkTg5YoXsJM7JkkNDRMXbt1Vz8/X/n389OhQ4fV3ruDoqKibDFTpn6q/Pnza/TokSpUqJCZHNQ65sWLF20x3br30PBhQxW0eKESEhK0evW3GjhosF3bevXqoZIlS5ohZ2JiDujdLu9p1arVd+VzAQDgTlFEBwAAAADAScyeM9csqWnarHmKdStXrjLLjQSMGWsWR06dOmWK8Y4sWbLULAAAZFWMiQ4AAAAAAAAAgAMU0QEAAAAAAAAAcIAiOgAAAAAAAAAADlBEBwAAAAAAAADAAYroAAAAAAAAAAA4QBEdAAAAAAAAAAAHKKIDAAAAAAAAAOAARXQAAAAAAAAAABygiA4AAAAAAAAAgAMU0QEAAAAAAAAAcIAiOgAAAAAAAAAADlBEBwAAAAAAAADAAYroAAAAAAAAAAA4QBEdAAAAAAAAAAAHKKIDAAAAAAAAAOAARXQAAAAAAAAAABxw0S168MEHVa3a0ypZsqTy3XOPTpw8qd27dyssbIcuXrx4q4cDAAC3iFwMAIBzIKcDAOBkRfTXXntVHby99eSTFRUXF6fjx4/rwoULKly4sB566CGT4L/6+htNmTJVv/76a/q2GgCAbIhcDACAcyCnAwDghEX0dWu/1aVLlxW0ZIk6duqk33773W57njx55OlZRU2aNNaab1ep/4D3tXLlqvRqMwAA2Q65GAAA50BOBwDASYvow0eM1JYtWxxuv3Tpkn78cZtZRo0arZIlH0zLNgIAkO2RiwEAcA7kdAAAnLSIfqMEf70//zxlFgAAkHbIxQAAOAdyOgAAWU/OW92hRPHiqa7PlSuX/Px806JNAADgLufitm3aaPu2rTp4IForVyxXpUqVbhjfsGEDfb9lk4nf8N16vfDC8ylifPv6KHxHqA7ERGvxokCVKVPabrs17uvkSZ8oal+k9kbu1tgxAcqfP79dzHPPPacVK5Zpf9Re7Yr4WdOnfW4mXwMAwBnw+xoAgKzhlovo33zzlR5+uIzdugoVKmjd2jWqV7duWrYNAADchVzcuHEjDRkySOPGTVDdevUVGRmpwAXzVLRo0VTjq1b11NQpk7Vw4SLVqfuK1qxdq1kzZ6h8+fK2mK7vdVH79u3k7z9ADRs10rlz5xW4YL7y5s1ri7EK6OXLl1PLVq3Vpk07VateTQGjR9m2P/jgg5o9a4b+7/+26uU69dS69VsqUqSIZs6YdsvXCABAZsTvawAAnLSIvmTpl/r6qy/1xBOPy8XFRf7+/fTN11/qu+++U916r2R4zzerB9vwYUMVGvqT6fm2edMGvf32W7fcLgAAMqu0zsWdOnZUYOBCLQ4KUnR0tPr599f58xfUqmWLVOM7eHtr0+bN+vSzzxUTE6OAgDHatXu32rVr809MB29NnDhJa9et0969+9SjZy8VK1bMVhDw8PAwOdynr5/Cw3/WTyEhGjhwsJlEzYqzVKxYwfTEs8aD/eWXX8w5Pvv8cz3xxBPmugEAyOrSOqcDAID0ccu/QEePDtD//vc/LV0SpD/++EPXrkmvv9FMO3fuvO2eb1YvtR3h4erYwdv0fKtZq7ZOnDjhsOfbxx+P1PrvNui11141Pd+sXnNRUVEm5oMhg1WjRg11795DR48e03PP1dLHI4br+B/HtW79+ltuIwAAmU1a5uLcuXObYvXkyVNs665du6bgH4Ll6emZ6j6enlX0+bTpduu2bN6iuvUSC+SlSpUyhXDrGElOnz5tiuXWvsuWL1dVT0+dOnVKERERtpjg4GAlJCSocuXKWrNmjSIidpn3LVs01+KgJSpQoIDeeON1BQf/oCtXrtzytQIA4Mw5HQAAZKKe6JbPP5+moUOHqWzZsgoYM+a2E3x69HyrWrWqlixdamYyP3bsmBYsCDSPpVeqfOMe7gAAZCVplYut4VGsnm9x8XF26+Pj4uXm5pbqPtZ6a3tycfHxcv873t098TUuRUyc3N3dE4/h7pbihvnVq1dNYT1p/6NHj6pV67dMr7zDhw6YsdOLP/CAOr/bxeH15MmTRwULFrQtVuEdAIDskNMBAEAm6onu3b6d7e9t27dryuRJpveadffcMnPW7Azr+WYJDQ1VnZdf1qJFi82d/GeffUYPP/ywhnzw0a1eKgAAmVJa5eLMzirWBwSM0pIlS/XNN8tUoGBBM1np9GmfqUXL1qnu071bV/n49LnrbQUA4HZkl5wOAEC2K6J37NjB7n1sbKyaN29mK4LfbJK/Uc83j7Iet9XzzTJw0GCNHj1SO8JCdPnyZfMYuK9fP23fvv2GvdasJQm91gAAmVla5WLLyZMnzdAobq72vc5d3VwVF2efo5NY663tybm5uir27/jY2MRXNzdX07Z/Yty0Z8+exGPExqWYuNQa/7xw4cK2/du2baPTf53WsOEjbDHde/RQWGiIqlSprB07wlO0bdLkKXY33K2cHr4j9KY/DwAAsmpOBwAAmaiIXv2ZGsrM2rdrJ88qVdSmbTsznEv1atU0YvgwHT9+3Iyhmhp6rQEAspK0zMXWDWdr7HEvrxpas3atWZcjRw55eXlpzuw5qe4TFrZDNb1qaMaMmbZ1tWrVVFhYmPn7yJEjJu9ax9izJ9Kss4ZWqVy5kr74Yp55HxoWZgrmFSpU0K5du8w6rxo1lDNnToWHJxbH8+XLZ26GJ3f1auJ7Ky41ly5dMgsAAFlBZv99DQAA7mBM9KThWMqWfdj0Grsd6dHz7Z577pG/v58++PAjrV//nfbu3afZc+Zq+fIVerdzZ4dtsXqtlSv/mG2pXKXqbV0TAAB3053m4iTTpk9X69at1KxZU3l4eGjkyBHKny+fFi0OMtsnThyv/v79bPEzZs5U7dq11blzJ3mULSufPr1VsWJFzZ4995+YGTPVs0d3M8Tao48+qk8mTjCF9aRCvTW3ycaNmzQmYJQqVaqkp6pW1bDhQ7Vs2XITZ9mwYYMqVXpSvXv1VJkypVXhv//V+HFjzVjpu3cn9mgHAMAZpFVOBwAAmaSInu+eezR2TIAOxOzXpo0bVKJECbN+2NCP1K3re7fV8y1JUs+3pJ5sjnq+JZe855s1PIw1LEuKXmsJVx32WLNYPdbOnDljW86ePXvT1wEAwN2WVrk4iXWz2ZrQzBpvfP26NXri8Sf05ltvKz4+cQi1EsVLyL1YMVt8aGiYunbrrrfebK3169eqQYMGau/dQVFRUbaYKVM/1ezZc8wQa6tXrVCBAvnNMS9evGiL6da9h2JiDiho8ULNmzdXIT+FmCHYkvzf/21V167dVa9eXa1bu0YLFswzOfvNN9/WhQsXbvvzAwDAWXM6AADIJMO59O/vr8cff1xNmzY3P2aTWEOl+Pj01uQpU2+p59uE8eO0MyJC4eE/q2NH7xQ93/74/Q99PHKUrefbl0uXmJ5vG77boCZNGpueb75+/ma7VQDfuvVHDRo40Py4PnbsVz3zTHU1faOpPvyIiUUBAM4hLXNxEuvJLWtJTdNmzVOsW7lylVluJGDMWLM4curUKVOMv5Fly5ebBQAAZ5QeOR0AAGSCIrrVG+zdLu+ZybysiU6SRO3fr4ceeuiWe74VLVLE9HyzJg21xk29vudbQsK1FD3f+vn5yr+fnw4dOpyi51uX97pqQH9/TZ40yYy1+uuvxzRq9GjbGKwAAGR1aZmLAQBAxiGnAwCQNdxyEb1o0aKKjz+RYn3+/Pnskn5G9Xyzxk3v3cfnltsBAEBWkda5GAAAZAxyOgAATjom+s6dEXrpxRds75MSe+tWrcyY5QAAIH2RiwEAcA7kdAAAnLQn+siRozR//hd6pFw55crlog4d2qvcI+VUtaqnXn+jWfq0EgAA2JCLAQBwDuR0AACctCf6TyEherlOPbnkyqV9+/bpuVq1zBjmjRq/ql27dqVPKwEAgA25GAAA50BOBwDASXuiW3755Rf5+vVL+9YAAICbQi4GAMA5kNMBAHDCnugvvPC8nnvuuRTrrXXPP187rdoFAAAcIBcDAOAcyOkAADhpEX1A//7KlSvlbjly5NCAAf3Tql0AAMABcjEAAM6BnA4AgJMW0cuUKaP9+6NTrI+JiVGZ0qXTql0AAMABcjEAAM6BnA4AgJMW0U+f/ksPPVQqxfoyZUrr3LlzadUuAADgALkYAADnQE4HAMBJi+hr163Thx98oIceesi2rnTp0ho8eJDWrVuf1u0DAADXIRcDAOAcyOkAAGQNLre6w7BhI7RgwTx9v2WTfv/9d7PugQce0PafftJHQ4elRxsBAEAy5GIAAJwDOR0AgKzhlovop0+fVuPGr+q5WrX0+OOP6cKFC4rcu0/bt29PnxYCAAA75GIAAJxDeuT0tm3aqEuXznJzc1Nk5F4NHDRYP//8s8P4hg0byM+3r0qWLKlDhw5r+IgR2rhxk12Mb18ftW7dSoUK/UehoSHy7z/AxCYpXLiwhg39SC+//JISEhK0evW3GjR4SKpD0lg97det/VZXr17VY4//97avEwCATF1ET7Ll++/NAgAAMga5GAAA55BWOb1x40YaMmSQ/P0HaEd4uDp28FbggnmqWau2Tpw4kSK+alVPTZ0yWR9/PFLrv9ug1157VbNmzlDdevUVFRVlYrq+10Xt27dTr159dOToEfn5+ipwwXzVfv5FXbx40cRMnvSJihVzV8tWrZXbJbfGjR+rgNGj1LVbd7vzubi4mPNt3/6TOTcAAE41JnqTxo1v+oDFiz+gp6pWvZM2AQCA65CLAQBwDumZ0zt17KjAwIVaHBSk6Oho9fPvr/PnL6hVyxapxnfw9tamzZv16WefKyYmRgEBY7Rr9261a9fmn5gO3po4cZIZv33v3n3q0bOXihUrpnp165rtHh4eeuGF5+XT10/h4T/rp5AQDRw4WE2aNDZxyfXz81XMgRitWLnypq8JAIAsU0R/5523tWXzRr3X5V2TIK937733mqQ5ZfIkrV3zre677770aCsAANkWuRgAAOeQXjk9d+7cqlixgoKDf7Ctu3btmoJ/CJanZ+q9vj09q9jFW7Zs3mKLL1WqlCmEW8dIPgSNVSy39rVU9fTUqVOnFBERYYsJDg42w7pUrlzZtq5GjWfN0DEDBgy8qesBACDLDefyRtNmqvPyy2rfvq369/c345rFxcfr4oWL+k/h/8jdzU0nT55UUNASPf/CS4qPj0//lgMAkI2QiwEAcA7pldOLFClihkuJi4+zWx8fFy+PsimL9RZr3HRre3JWW6w2WNzdE1/jUsTEyd3dPfEY7m4phoqxxju3CutJ+993X2FNGD9O3br31JkzZ27qevLkyWOWJAUKFLip/QAAyNAx0detX2+WIvfdp6efflolSpZQvnvuMcl91+492r17t7nLDQAA0ge5GAAA55DdcnrA6NH6+utvbmnC1O7dusrHp0+6tgsAgHSbWPTkn39qzdq1t7obAABII+RiAACcQ1rmdKsAf+XKFbm5Jvb+TuLq5qq4OPve6Ums9db25NxcXRX7d3xsbOKrm5urYmNjk8W4ac+ePYnHiI1T0aJF7Y6RK1cuFS5c2La/NZRLnTov6913O5v3OXLkMDFHfjkkPz9/LVq8OEXbJk2eos+nTbfriR6+I/QWPxUAAO7imOgAAAAAACDzunz5siIidsnLq4ZtnVWs9vLyUlhYWKr7hIXtUM1k8ZZatWra4o8cOaLjx4+bYyQpWLCgKleuZPa1hIaFmYJ5hQoVbDFeNWooZ86cCg8PN+8bNX5VL9epZ1sCxow1Y6tbf3+7Zk2qbbt06ZIZ+iVpOXv27B19PgAA3NWe6AAAAAAAIPOZNn26GXt8Z0SEmfyzY0dv5c+XT4sWB5ntEyeO1x+//6GPR44y72fMnKkvly5R586dtOG7DWrSpLEqVqwoXz9/2zFnzJipnj2669DBQzpy9Kj8fPuawnpSD/qYmBht3LhJYwJGqZ//AOV2cdGw4UO1bNlyE5cUk9yTT1Y0E49GRUXdxU8HAIDbRxEdAAAAAAAnsHz5ChUtUkS+fX3MpKF79kTqzbfetk1OWqJ4CSUk/DPWemhomLp2665+fr7y7+enQ4cOq713B7vi9pSpnyp//vwaPXqkChUqpJCQEHPMixcv2mK6de+h4cOGKmjxQlMcX736Ww0cNPguXz0AAOmHIjoAAAAAAE5i9py5ZklN02bNU6xbuXKVWW7EGn7FWhw5deqUKcbfrKCgJWYBACCrYEx0AAAAAAAAAADSqif6jOnTbri9Q8dOt3pIAABwC8jFAAA4B3I6AABO2hO9Xr26ZtZvayZta3nxxReUcC3B9h4AAKQvcjEAAM6BnA4AgBOPiW5NEHLixAnzd4MG9TVs2AgdOXIkrdsGAAAcIBcDAOAcyOlA5vTg6xuUtbXP6AYA2bsnujUD9z1589re586dWx282ytnToZXBwDgbiAXAwDgHMjpAABkDbecmQ8ePKgOHTvIzc1NHTt20NmzZ1WxYgUtXRIkV1fX9GklAACwIRcDAOAcyOkAADhpEX3U6AC99WZr7QgL0YD+/uZRszeaNteePXu0bu2a9GklAACwIRcDAOAcyOkAADjpmOjffbdBVTyf0sMPP6zffvtNcXFxZv2gwUMUGhqWHm0EAADJkIsBAHAO5HQAAJx4YlFrlvCdO3emWL9s+fK0aBMAAPgX5GIAAJwDOR0AACcsolerVu2G27dv334n7QEAAP+CXAwAgHMgpwMA4KRF9C+XBunatWvm7xw5cthts9Y/WKp02rUOyCYefH2Dsrb2Gd0AIFshFwMA4BzI6QAAZA23XESPjIxUkSJFtHDhIi1Z+qX+/PPP9GkZAABIFbkYAADnQE4HACBryHmrO9Sp+4q8O3TS/fffr1Url+vjEcP1xBNPmHHcrAUAAKQvcjEAAM6BnA4AgBNPLGpNemItH3z4kZo1barZs2Zo7LjxmjFjZtq3EAAApEAuBjInhmgDcKvI6QAAOGkR3VK8+ANq3aqVWrZsoV27d+unn0LStmUAAOCGyMUAADgHcjoAAE5WRK9Xt67efLO1/vvfJ/Tll1+pWfMWOnTocPq0DgAApEAuBgDAOZDTAQBw0iL6jBnT9Pvvv2v16m+Vy8VF77zzjt32Dz/8KC3bBwAArkMuBgDAOZDTAQBw0iL6tm3bdU3XVK58uRTbrl27llbtAgAADpCLAQBwDuR0AACctIjetFnz9GkJAAC4KeRiAACcAzkdAICsIeft7li6dGk999xzuueee9K2RQAA4KaQiwEAcA7kdAAAnKyIft99hbV48UL9ELxF8+fNlbu7u1k/buwYDR48KD3aCAAAkiEXAwDgHMjpAAA4aRH9gw+G6MrlK3rq6Wo6f/68bf2y5Sv0fO3n0rp9AADgOuRiAACcAzkdAICs4ZbHRH+uVi21fvMt/f77H3brDx06pJIlS6Zl2wAAQCrIxQAAOAdyOgAATtoTPX/+/HZ3yJMULlxYFy9dSqt2AQAAB8jFAAA4B3I6AABOWkTfvv0nNW3a1Pb+2rVrypEjh957711t3bo1rdsHAACuQy4GAMA5kNMBAHDS4VyGDR+hoMUL9WTFisqdO7cGDhyg8uXKmTvlTV59PX1aCQAAbMjFAAA4B3I6AABO2hM9KipKXjWf008hIVq7bp3y58uv1d+uUZ26r+iXX35Jn1YCAAAbcjEAAM6BnA4AgJP2RLecPn1an3wyKe1bAwAAMiQXt23TRl26dJabm5siI/dq4KDB+vnnnx3GN2zYQH6+fc2kZ4cOHdbwESO0ceMmuxjfvj5q3bqVChX6j0JDQ+Tff4CJTWL1shs29CO9/PJLSkhI0OrV32rQ4CE6d+6c3XHe7dxZb77VWiVLlNDJk39q7hdf8D0EAOA0+H0NAICTFtH/85//qFXLlnrkEQ/zfn90tBYvDtKpU6fSun0AACCdc3Hjxo00ZMgg+fsP0I7wcHXs4K3ABfNUs1ZtnThxIkV81aqemjplsj7+eKTWf7dBr732qmbNnKG69eqbHnWWru91Ufv27dSrVx8dOXpEfr6+ClwwX7Wff1EXL140MZMnfaJixdzVslVr5XbJrXHjxypg9Ch17dbddq6hH32o556rpaEfDdPefftM4f2+woXv4JMDACBz4fc1AABOOJxLtWrVtH3bVnl7tzPJ3lq827fTth//z2y7nZ5v1vEOHojWyhXLValSpRvGWz3fvt+yycRv+G69Xnjh+RQxHh4emjN7lvbt3aOY6CitXrVSJYoXv+W2AQCQGaV1Lu7UsaMCAxdqcVCQoqOj1c+/v86fv6BWLVukGt/B21ubNm/Wp599rpiYGAUEjNGu3bvVrl2bf2I6eGvixEnm0fS9e/epR89eKlasmOrVrWvL1VYO9+nrp/Dwn81j7AMHDlaTJo1NXFLMO++8rXbtvbVu/XodPXpUu3bt0vfBwbf92QEA4Mw5HQAAZJIi+ojhw7R8+QpVq/6sOnTsZJbqz9TQsuXLzbbb6fk2btwE03stMjLS9HwrWrRoqvFJPd8WLlxkxohbs3at6flWvnx5W8xDDz2kb775yvyob9q0uV58qY4mTJioC3/3egMAIKtLy1xsTWJWsWIFBQf/YFt37do1Bf8QLE9Pz1T38fSsYhdv2bJ5iy2+VKlSphBuHSP5o+pWsdza11LV09P0sIuIiLDFBAcHm2FdKleubN7XefklHTlyRC+99JIpJlhFhjEBo01vdAAAnEFa5nQAAJCJiuilS5fW59OmmR+5Say/p02bbrZldM83/35+2rhxo5nlfPeePWYyFqv3WmqPowMAkBWlZS4uUqSIXFxcFBcfZ7c+Pi7ejI+eGmu9tT25uPh4uf8d7+6e+BqXIiZO7u7uicdwd0uRm69evWoK60n7l3qolEqUKGGeQuvRs7d69e5jCv7Tpn3m8Hry5MmjggUL2pYCBQrcwqcBAEDWzekAACATFdF3796lRzweSbHeWhe5NzJDe77lyJFDL774gg4ePGTGXY3YGW6GiEl6dNwRfnADALKStMrFmV3OHDl1zz33qGfPXvrpp5/044/b5OPjK68aNVS27MOp7tO9W1ftj9prW8J3hN71dgMAcLOyS04HACCru+WJRWfOmq2PPvrA3BXfsWOHWVelShW1bfuORnw8Uo899qgt1hoD9XZ6vnmUTZxQ5VZ7vrm6upoieLeu72nU6AANHzFCz9eurRkzpqlpsxbatm2bwx/cPj59buFTAAAg46RVLracPHlSV65ckZurfa9zVzdXxcXZ5+gk1npre3Jurq6K/Ts+Njbx1c3NVbGxscli3LRnz57EY8TGpRi+LVeuXGaolqT9rX0vX75sbo4niY6JMa8lipfQgQMHU7Rt0uQp+nzadNt768Y4hXQAQHbI6QAAIBMV0a0xyS0DBw5IdZvVm9zqEW69Pljq7j5+ljNnYsf6tWvXafr0GebvPXsiVbVqVb3z9lsOi+j84AYAZCVpmYutInVExC55edUwc41YrH29vLw0Z/acVPcJC9uhml41NGPGTNu6WrVqKiwszPxtjWN+/PhxcwwrD1usm9yVK1fSF1/MM+9Dw8JMwbxChQpmslCL1cPcyuXh4eHmfUhIqHlyzZrvxBqezfLww2XM67Ffj6XatkuXLpkFAICsIDP/vgYAAHdQRLcmPEkL6dHzzTqmVQzYHx1tF2ONt/700085bAs/uAEAWUla5eIk06ZP14Tx47QzIsJM/tmxo7fy58unRYuDzPaJE8frj9//0McjR5n3M2bO1JdLl6hz507a8N0GNWnSWBUrVpSvn7/tmFaBvWeP7jp08JCOHD0qP9++prCeVKi35jbZuHGTxgSMUj//Acrt4qJhw4dq2bLlJs7yfXCwmXh03NgxGjLkA+XImVMjRgzTli3f2/VOBwAgq0rrnA4AADJJEf3XX39NkxOnR88365g7d+5MMU7qww8/rGPH0qbdAABktLTKxUmWL1+hokWKyLevjxk6zeo9/uZbbys+Pt42dEpCwjVbfGhomLp2665+fr5mQu9Dhw6rvXcHRUVF2WKmTP1U+fPn1+jRI1WoUCGFhISYY168eNEW0617Dw0fNlRBixeaSdRWr/5WAwcNtm23et21adtew4Z+pK++Wqpz585p06bN+vCjoWl6/QAAOEtOBwAAmaSIft99hfXnn6fM38WLP6A3W7c2k36tXbfeTPqV0T3fpn76uT77dIq2bduurVt/1PO1n9PLL7+kpk2b3+qlAgCQKaVlLk4ye85cs6SmabOUOXTlylVmuZGAMWPN4sipU6dMMf5GrF7pHTt1vmEMAABZVXrkdAAAkIFF9EcffVRz58xS8eLFdejQIXV5r6sWzJ9neplZvcc6duygTp3etfUqz6ieb2vWrJG//wB1695VQz/6SAcPHlDHjp31U0jIzX8qAABkQumRiwEAwN1HTgcAIGtJnInzJgx8f4D27dun119vqq0//qi5c+dow4aNKv/o43rs8f9q/vwF6trtvVtugNXr7elqz6jMwx5q2Kix6ZGevOdb79597OKtXm81a9U28S+8+JIZT/V6ixYvlpdXLZX1eEQv16mntevW3XK7AADIbNIrFwMAgLuLnA4AgJP2RK9U6Uk1a95Ce/fu057ISL315puaM/cLM16pZdas2VqxYll6thUAgGyNXAwAgHMgpwMA4KQ90QsXLqzY2DjztzWxl7X873//s20/9b//qWDBgunTSgAAQC4GAMBJkNMBAHDSIrol6a64o/cAACB9kYsBAHAO5HQAAJxwOBfLhAnjdOniJfN33rx5NWrkx+aOuSVP3jzp00IAAGBDLgYAwDmQ0wEAyDpuuoi+ZMlSu/dfffW1fcBpaenSL9OsYQAAwB65GAAA50BOBwDASYvovfv4pG9LAADADZGLAQBwDumZ09u2aaMuXTrLzc1NkZF7NXDQYP38888O4xs2bCA/374qWbKkDh06rOEjRmjjxk12Mb59fdS6dSsVKvQfhYaGyL//ABObfIz3YUM/0ssvv6SEhAStXv2tBg0eYutZX7bswxo58mOVe+QR3XvvvTp+/Li+/maZxo0brytXrqTbZwEAQIaMiQ4AAAAAADKnxo0baciQQRo3boLq1quvyMhIBS6Yp6JFi6YaX7Wq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"
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 6
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-09-04T06:25:59.106420Z",
"start_time": "2026-09-04T06:25:58.256204Z"
}
},
"cell_type": "code",
"source": [
"import sys\n",
"!{sys.executable} -m pip install pandas numpy matplotlib\n"
],
"id": "c677a727d4516f1e",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: pandas in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (2.3.3)\n",
"Requirement already satisfied: numpy in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (2.0.2)\n",
"Requirement already satisfied: matplotlib in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (3.9.4)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from pandas) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from pandas) (2026.3.post1)\n",
"Requirement already satisfied: tzdata>=2022.7 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from pandas) (2026.3)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from matplotlib) (1.3.0)\n",
"Requirement already satisfied: cycler>=0.10 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from matplotlib) (0.12.1)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from matplotlib) (4.60.2)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from matplotlib) (1.4.7)\n",
"Requirement already satisfied: packaging>=20.0 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from matplotlib) (26.3)\n",
"Requirement already satisfied: pillow>=8 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from matplotlib) (11.3.0)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from matplotlib) (3.3.2)\n",
"Requirement already satisfied: importlib-resources>=3.2.0 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from matplotlib) (6.5.2)\n",
"Requirement already satisfied: zipp>=3.1.0 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib) (3.23.1)\n",
"Requirement already satisfied: six>=1.5 in /Users/cvrse/Desktop/пересдача/.venv/lib/python3.9/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n"
]
}
],
"execution_count": 7
},
{
"cell_type": "code",
"id": "1d86131d",
"metadata": {
"ExecuteTime": {
"end_time": "2026-09-04T06:25:59.170550Z",
"start_time": "2026-09-04T06:25:59.127903Z"
}
},
"source": [
"df = pd.read_csv('data/task1/results.csv')\n",
"df.groupby(['Структура', 'Режим'])[['Вставка', 'Поиск', 'Удаление']].mean().reset_index()"
],
"outputs": [
{
"data": {
"text/plain": [
" Структура Режим Вставка Поиск Удаление\n",
"0 Бинарное дерево Cлучайный 0.008477 0.000095 0.000073\n",
"1 Бинарное дерево Отсортированный 0.089950 0.000914 0.000636\n",
"2 Связанный список Cлучайный 0.067483 0.000662 0.000383\n",
"3 Связанный список Отсортированный 0.133676 0.001328 0.000733\n",
"4 Хэш-таблица Cлучайный 0.042672 0.000473 0.000228\n",
"5 Хэш-таблица Отсортированный 0.044273 0.000492 0.000236"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Структура</th>\n",
" <th>Режим</th>\n",
" <th>Вставка</th>\n",
" <th>Поиск</th>\n",
" <th>Удаление</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Бинарное дерево</td>\n",
" <td>Cлучайный</td>\n",
" <td>0.008477</td>\n",
" <td>0.000095</td>\n",
" <td>0.000073</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Бинарное дерево</td>\n",
" <td>Отсортированный</td>\n",
" <td>0.089950</td>\n",
" <td>0.000914</td>\n",
" <td>0.000636</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Связанный список</td>\n",
" <td>Cлучайный</td>\n",
" <td>0.067483</td>\n",
" <td>0.000662</td>\n",
" <td>0.000383</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Связанный список</td>\n",
" <td>Отсортированный</td>\n",
" <td>0.133676</td>\n",
" <td>0.001328</td>\n",
" <td>0.000733</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Хэш-таблица</td>\n",
" <td>Cлучайный</td>\n",
" <td>0.042672</td>\n",
" <td>0.000473</td>\n",
" <td>0.000228</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Хэш-таблица</td>\n",
" <td>Отсортированный</td>\n",
" <td>0.044273</td>\n",
" <td>0.000492</td>\n",
" <td>0.000236</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 8
},
{
"cell_type": "markdown",
"id": "c9a486a5",
"metadata": {},
"source": [
"# 4. Анализ результатов\n",
"---\n",
"### 4.1 Влияние порядка данных на вставку в BST\n",
"При вставке элементов в отсортированном порядке в бинарное дерево оно превращается в связный список - это связанно с тем, что все элементы вставляются в одну ветвь дерева. Сложность всех операций приблтижается к **O(n)**. Вставка в BST на отсортированных данных заняла 0.122171c вместо 0.011921с, разница более чем в 10 раз. Причём, время вставки даже хуже, чем у чистого связнного списка - это связанно с дополнительными расходами бинарного дерева. Поиск так же ухудшился, примерно в 10 раз, а с ним ухудшилось и удаление.\n",
"\n",
"### 4.2 Почему хэш-таблица почти не чувствительна к порядку\n",
"По графикам видно, что для хэш-таблицы время операций почти не изменяется. Исключение составляет лишь поиск, его время больше на отсортированных данных. Это связано с особенностями теста - поиск 10 несуществующих записей ухудшают результат для отсортированных данных. Все эти наблюдения связаны с механизмом работы хэш-таблицы - она распределяет данные по корзинам независимо от порядка поступления. Получается, что сложность всех операций **O(1)**\n",
"\n",
"### 4.3 Почему связный список всегда медленен при поиске\n",
"Для поиска в связном списке нужно просматривать все элементы по порядку, так что сложность всех операций **O(n)**\n",
"\n",
"### 4.4 Сравнение удаления\n",
"\n",
"- **Связаный список** удаление требует сначала найти элемент за O(n), затем переставить ссылки за O(1). Время удаления (0.000605 с) близко ко времени поиска, что логично.\n",
"- **Хеш-таблица:** при удалении, поиск корзины за O(1) и поиск в коротком связаном списке за O(n) удаляется элемент. Время удаления (0.000324) меньше, чем в списке.\n",
"- **BST:** на случайных данных удаление очень быстрое (0.000137 с) благодаря логарифмической высоте. На отсортированных данных время возрастает до 0.000873, что отражает деградацию до O(n)."
]
},
{
"cell_type": "markdown",
"id": "a7ed5470",
"metadata": {},
"source": [
"# 5. Вывод\n",
"На основе полученных результатов можно сформулировать следующие рекомендации:\n",
"\n",
"- Хеш-таблица хороший выбор, если приоритетом является максимальная скорость вставки, поиска и удаления по ключу, а порядок элементов не имеет значения. Время операций близко к **O(1)** и практически не зависит от упорядоченности входных данных. Идеальна для кэшей, словарей и частых запросов по идентификатору.\n",
"\n",
"- Двоичное дерево поиска следует применять, когда необходимо получать данные в отсортированном порядке. На случайных данных демонстрирует хорошую производительность **O(log n)**, однако при поступлении заранее отсортированных элементов вырождается в связный список с падением скорости до **O(n)**.\n",
"\n",
"- Связный список демонстрирует линейную сложность поиска и удаления **O(n)** что делает его непригодным для задач с частым доступом к произвольным элементам. Может быть оправдан только в узких случаях, где вставки и удаления происходят исключительно в начале или конце коллекции (очереди, стеки) и не требуется поиск.\n",
"\n",
"Таким образом, для реальных задач чаще всего выбирают хеш-таблицы или сбалансированные деревья в зависимости от требований к упорядоченности данных.\n"
]
}
],
"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.14.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}