{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Extract Clusters from Python Dendrogram - adjusted for Clustermap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Original File: https://nbviewer.jupyter.org/gist/vals/150ec97a5b7db9c82ee9\n", "Blog Post: http://www.nxn.se/valent/extract-cluster-elements-by-color-in-python" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "from collections import defaultdict\n", "from fastcluster import linkage\n", "from matplotlib.colors import rgb2hex, colorConverter\n", "from matplotlib.pyplot import cm\n", "from scipy.cluster import hierarchy\n", "from scipy.cluster.hierarchy import dendrogram, set_link_color_palette\n", "import matplotlib as mpl\n", "import pandas as pd\n", "import seaborn as sns\n", "%pylab inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Packages load" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Amount_offers
geo_bln
Baden_Württemberg26712
Bayern28563
Berlin5191
Brandenburg11689
Bremen1734
Hamburg2787
Hessen19827
Mecklenburg_Vorpommern5795
Niedersachsen28356
Nordrhein_Westfalen44552
Rheinland_Pfalz20778
Saarland3826
Sachsen12531
Sachsen_Anhalt8175
Schleswig_Holstein11157
Thüringen4589
\n", "
" ], "text/plain": [ " Amount_offers\n", "geo_bln \n", "Baden_Württemberg 26712\n", "Bayern 28563\n", "Berlin 5191\n", "Brandenburg 11689\n", "Bremen 1734\n", "Hamburg 2787\n", "Hessen 19827\n", "Mecklenburg_Vorpommern 5795\n", "Niedersachsen 28356\n", "Nordrhein_Westfalen 44552\n", "Rheinland_Pfalz 20778\n", "Saarland 3826\n", "Sachsen 12531\n", "Sachsen_Anhalt 8175\n", "Schleswig_Holstein 11157\n", "Thüringen 4589" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_full = pd.read_csv('df_full.CSV', engine='python', encoding='utf-8', index_col=0)\n", "grouped = df_full.groupby(['geo_bln'])['obj_purchasePrice'].count()\n", "grouped = pd.DataFrame(grouped) \n", "grouped = grouped.rename(columns={'obj_purchasePrice':'Amount_offers'})\n", "grouped.reset_index(inplace=True)\n", "grouped = grouped.set_index('geo_bln')\n", "grouped" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Data load" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "cmap = cm.rainbow(np.linspace(0, 1, 10))\n", "hierarchy.set_link_color_palette([mpl.colors.rgb2hex(rgb[:3]) for rgb in cmap])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets set the colors" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "link = linkage(grouped, method='single')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we create the link within the data, we are using the single method but others are possible too, for example:
\n", " -Complete
\n", " -Average
\n", " -Weighted
\n", " -Centroid" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "class Clusters(dict):\n", " def _repr_html_(self):\n", " html = ''\n", " for c in self:\n", " hx = rgb2hex(colorConverter.to_rgb(c))\n", " html += '' \\\n", " ''\n", " html += ''\n", " \n", " html += '
' \\\n", " ''.format(hx)\n", " html += c + '' \n", " html += repr(self[c]) + ''\n", " html += '
'\n", " \n", " return html" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "def get_cluster_classes(den, label='ivl'):\n", " cluster_idxs = defaultdict(list)\n", " for c, pi in zip(den['color_list'], den['icoord']):\n", " for leg in pi[1:3]:\n", " i = (leg - 5.0) / 10.0\n", " if abs(i - int(i)) < 1e-5:\n", " cluster_idxs[c].append(int(i))\n", " print(cluster_idxs)\n", " cluster_classes = Clusters()\n", " for c, l in cluster_idxs.items():\n", " i_l = [den[label][i] for i in l]\n", " cluster_classes[c] = i_l\n", " \n", " return cluster_classes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets create a function to extract the clusters and display it nicely" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAHwCAYAAACrJhWyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeZxcVZn/8c+XsAhC2JeQgIAsGhajjCwuiOJARpQwCiMggohGGWQUxx8DbrhFEReQURiDIAFliQgGFxAHFARZjALDJhDWBAKBsKMQCM/vj3MquV1d3Qndfe8tbn3fr1deqT5V1ed00lX13HOe8xxFBGZmZmZNskzdAzAzMzMbaQ5wzMzMrHEc4JiZmVnjOMAxMzOzxnGAY2ZmZo2zbN0DGAZv/zIzMzN1avQMjpmZmTWOAxwzMzNrHAc4ZmZm1jgOcMzMzKxxHOCYmZlZ4zjAMTMzs8ZxgGNmZmaN4wDHzMzMGscBjpmZmTWOAxwzMzNrHAc4ZmZm1jhLDHAknSppnqSb2toPk3SbpJslHVtoP0rSrHzfboX2bSXdmO87QZJy+wqSzsnt10jaaOR+PDMzM+tFSzODcxowsdgg6e3AJGCbiNgS+HZuHw/sA2yZn3OipFH5aScBk4HN8p/W9zwYeCwiNgWOA745jJ/HzMzMbMmniUfE5R1mVQ4BjomI5/Jj5uX2ScDZuf1uSbOA7STdA4yOiKsAJJ0O7AlcmJ/zpfz8c4HvS1JElHZa+JnX3MeM6+8v69ub2cvEpAlj2W/7DesehpmVYKg5OJsDb81LSpdJemNuHwvMLjxuTm4bm2+3t/d5TkS8ADwBrNmpU0mTJc2UNHPq1KlDHDrMuP5+bpn75JCfb2Yvf7fMfdIXOmYNtsQZnEGetzqwA/BGYLqkTQB1eGwM0s4S7uvbGDEVmDrYY5bW+DGjOedjOw7nW5jZy9j7f3hV3UMwsxINdQZnDnBeJNcCLwJr5fYNCo8bBzyQ28d1aKf4HEnLAqsCjw5xXGZmZmZDDnB+AbwDQNLmwPLAI8AFwD55Z9TGpGTiayNiLvCUpB3y7qkDgBn5e10AHJhv7wVcWmb+jZmZmTXfEpeoJJ0F7AysJWkOcDRwKnBq3jq+ADgwByU3S5oO3AK8ABwaEQvztzqEtCNrRVJy8YW5/RTgjJyQ/ChpF5aZmZnZkC3NLqp9B7hr/wEePwWY0qF9JrBVh/Zngb2XNA4zMzOzpeVKxmZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGWWKAI+lUSfMk3dThvs9ICklrFdqOkjRL0m2Sdiu0byvpxnzfCZKU21eQdE5uv0bSRiPzo5mZmVmvWpoZnNOAie2NkjYA/hm4r9A2HtgH2DI/50RJo/LdJwGTgc3yn9b3PBh4LCI2BY4DvjmUH8TMzMysZYkBTkRcDjza4a7jgCOAKLRNAs6OiOci4m5gFrCdpDHA6Ii4KiICOB3Ys/Ccafn2ucAurdkdMzMzs6EYUg6OpD2A+yPihra7xgKzC1/PyW1j8+329j7PiYgXgCeANYcyLjMzMzMYQoAjaSXgc8AXO93doS0GaR/sOZ36nixppqSZU6dOXZrhmpmZWQ9adgjPeTWwMXBDXkkaB/xV0nakmZkNCo8dBzyQ28d1aKfwnDmSlgVWpfOSGBExFWhFNh2DIDMzM7OXPIMTETdGxDoRsVFEbEQKUN4QEQ8CFwD75J1RG5OSia+NiLnAU5J2yPk1BwAz8re8ADgw394LuDTn6ZiZmZkNydJsEz8LuArYQtIcSQcP9NiIuBmYDtwCXAQcGhEL892HAD8iJR7fCVyY208B1pQ0C/g0cOQQfxYzMzMzYCmWqCJi3yXcv1Hb11OAKR0eNxPYqkP7s8DeSxqHmZmZ2dJyJWMzMzNrHAc4ZmZm1jgOcMzMzKxxHOCYmZlZ4zjAMTMzs8ZxgGNmZmaN4wDHzMzMGscBjpmZmTWOAxwzMzNrHAc4ZmZm1jgOcMzMzKxxHOCYmZlZ4zjAMTMzs8ZxgGNmZmaN4wDHzMzMGscBjpmZmTWOAxwzMzNrHAc4ZmZm1jgOcMzMzKxxHOCYmZlZ4zjAMTMzs8ZxgGNmZmaN4wDHzMzMGscBjpmZmTWOAxwzMzNrHAc4ZmZm1jgOcMzMzKxxHOCYmZlZ4zjAMTMzs8ZZYoAj6VRJ8yTdVGj7lqS/Sfo/SedLWq1w31GSZkm6TdJuhfZtJd2Y7ztBknL7CpLOye3XSNpoZH9EMzMz6zVLM4NzGjCxre13wFYRsQ1wO3AUgKTxwD7Alvk5J0oalZ9zEjAZ2Cz/aX3Pg4HHImJT4Djgm0P9YczMzMxgKQKciLgceLSt7eKIeCF/eTUwLt+eBJwdEc9FxN3ALGA7SWOA0RFxVUQEcDqwZ+E50/Ltc4FdWrM7ZmZmZkMxEjk4HwYuzLfHArML983JbWPz7fb2Ps/JQdMTwJqdOpI0WdJMSTOnTp06AkM3MzOzJlp2OE+W9DngBeCnraYOD4tB2gd7Tv/GiKnA1MEeY2ZmZjbkGRxJBwLvBj6Ql50gzcxsUHjYOOCB3D6uQ3uf50haFliVtiUxMzMzs5diSAGOpInAfwF7RMTfC3ddAOyTd0ZtTEomvjYi5gJPSdoh59ccAMwoPOfAfHsv4NJCwGRmZmb2ki1xiUrSWcDOwFqS5gBHk3ZNrQD8LucDXx0RH4+ImyVNB24hLV0dGhEL87c6hLQja0VSzk4rb+cU4AxJs0gzN/uMzI9mZmZmvWqJAU5E7Nuh+ZRBHj8FmNKhfSawVYf2Z4G9lzQOMzMzs6XlSsZmZmbWOA5wzMzMrHEc4JiZmVnjOMAxMzOzxnGAY2ZmZo3jAMfMzMwaxwGOmZmZNY4DHDMzM2scBzhmZmbWOA5wzMzMrHEc4JiZmVnjOMAxMzOzxnGAY2ZmZo3jAMfMzMwaxwGOmZmZNY4DHDMzM2scBzhmZmbWOA5wzMzMrHEc4JiZmVnjOMAxMzOzxnGAY2ZmZo3jAMfMzMwaxwGOmZmZNY4DHDMzM2scBzhmZmbWOA5wzMzMrHEc4JiZmVnjOMAxMzOzxlligCPpVEnzJN1UaFtD0u8k3ZH/Xr1w31GSZkm6TdJuhfZtJd2Y7ztBknL7CpLOye3XSNpoZH9EMzMz6zVLM4NzGjCxre1I4JKI2Ay4JH+NpPHAPsCW+TknShqVn3MSMBnYLP9pfc+DgcciYlPgOOCbQ/1hzMzMzGApApyIuBx4tK15EjAt354G7FloPzsinouIu4FZwHaSxgCjI+KqiAjg9LbntL7XucAurdkdMzMzs6EYag7OuhExFyD/vU5uHwvMLjxuTm4bm2+3t/d5TkS8ADwBrDnEcZmZmZmNeJJxp5mXGKR9sOf0/+bSZEkzJc2cOnXqEIdoZmZmTbfsEJ/3kKQxETE3Lz/Ny+1zgA0KjxsHPJDbx3VoLz5njqRlgVXpvyQGQERMBVqRTccgyMzMzGyoMzgXAAfm2wcCMwrt++SdURuTkomvzctYT0naIefXHND2nNb32gu4NOfpmJmZmQ3JEmdwJJ0F7AysJWkOcDRwDDBd0sHAfcDeABFxs6TpwC3AC8ChEbEwf6tDSDuyVgQuzH8ATgHOkDSLNHOzz4j8ZGZmZtazlhjgRMS+A9y1ywCPnwJM6dA+E9iqQ/uz5ADJzMzMbCS4krGZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeMMK8CRdLikmyXdJOksSa+QtIak30m6I/+9euHxR0maJek2SbsV2reVdGO+7wRJGs64zMzMrLcNOcCRNBb4D+CfImIrYBSwD3AkcElEbAZckr9G0vh8/5bAROBESaPytzsJmAxslv9MHOq4zMzMzIa7RLUssKKkZYGVgAeAScC0fP80YM98exJwdkQ8FxF3A7OA7SSNAUZHxFUREcDpheeYmZmZvWRDDnAi4n7g28B9wFzgiYi4GFg3Iubmx8wF1slPGQvMLnyLObltbL7d3t6PpMmSZkqaOXXq1KEO3czMzBpu2aE+MefWTAI2Bh4HfiZp/8Ge0qEtBmnv3xgxFZg62GPMzMzMhrNE9U7g7oh4OCKeB84D3gQ8lJedyH/Py4+fA2xQeP440pLWnHy7vd3MzMxsSIYT4NwH7CBppbzraRfgVuAC4MD8mAOBGfn2BcA+klaQtDEpmfjavIz1lKQd8vc5oPAcMzMzs5dsyEtUEXGNpHOBvwIvANeRlo9WBqZLOpgUBO2dH3+zpOnALfnxh0bEwvztDgFOA1YELsx/zMzMzIZkyAEOQEQcDRzd1vwcaTan0+OnAFM6tM8EthrOWMzMzMxaXMnYzMzMGscBjpmZmTWOAxwzMzNrHAc4ZmZm1jgOcMzMzKxxHOCYmZlZ4wxrm7hZVc685j5mXH9/3cOwBrll7pMAvP+HV9U8EmuSSRPGst/2G9Y9DMMzOPYyMeP6+xd9IJmNhPFjRjN+zOi6h2ENcsvcJ30h1kU8g2MvG+PHjOacj+1Y9zDMzDrybGB38QyOmZmZNY4DHDMzM2scBzhmZmbWOA5wzMzMrHEc4JiZmVnjOMAxMzOzxnGAY2ZmZo3jAMfMzMwaxwGOmZmZNY4DHDMzM2scBzhmZmbWOA5wzMzMrHEc4JiZmVnjOMAxMzOzxnGAY2ZmZo3jAMfMzMwaxwGOmZmZNY4DHDMzM2scBzhmZmbWOMMKcCStJulcSX+TdKukHSWtIel3ku7If69eePxRkmZJuk3SboX2bSXdmO87QZKGMy4zMzPrbcOdwfkecFFEvAZ4HXArcCRwSURsBlySv0bSeGAfYEtgInCipFH5+5wETAY2y38mDnNcZmZm1sOGHOBIGg3sBJwCEBELIuJxYBIwLT9sGrBnvj0JODsinouIu4FZwHaSxgCjI+KqiAjg9MJzzMzMzF6y4czgbAI8DPxY0nWSfiTplcC6ETEXIP+9Tn78WGB24flzctvYfLu93czMzGxIlh3mc98AHBYR10j6Hnk5agCd8mpikPb+30CaTFrK4oc//CGTJ09+aSM2M7PGOPOa+5hx/f11D2ORW+Y+CcD7f3hVzSNZbNKEsey3/YZ1D6MWwwlw5gBzIuKa/PW5pADnIUljImJuXn6aV3j8BoXnjwMeyO3jOrT3ExFTgamtL4cxdjMze5mbcf393DL3ScaPGV33UAC6ZhwtrYDLAc5LFBEPSpotaYuIuA3YBbgl/zkQOCb/PSM/5QLgTEnfBdYnJRNfGxELJT0laQfgGuAA4L+H/BOZmVnPGD9mNOd8bMe6h9GVumkmqQ7DmcEBOAz4qaTlgbuAg0h5PdMlHQzcB+wNEBE3S5pOCoBeAA6NiIX5+xwCnAasCFyY/5iZmZkNybACnIi4HvinDnftMsDjpwBTOrTPBLYazljMzMzMWlzJ2MzMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwHOGZmZtY4DnDMzMyscYYd4EgaJek6Sb/KX68h6XeS7sh/r1547FGSZkm6TdJuhfZtJd2Y7ztBkoY7LjMzM+tdIzGD80ng1sLXRwKXRMRmwCX5aySNB/YBtgQmAidKGpWfcxIwGdgs/5k4AuMyMzOzHjWsAEfSOGB34EeF5knAtHx7GrBnof3siHguIu4GZgHbSRoDjI6IqyIigNMLzzEzMzN7yYY7g3M8cATwYqFt3YiYC5D/Xie3jwVmFx43J7eNzbfb2/uRNFnSTEkzp06dOsyhm5mZWVMtO9QnSno3MC8i/iJp56V5Soe2GKS9f2PEVGDqYI8xMzMzG3KAA7wZ2EPSu4BXAKMl/QR4SNKYiJibl5/m5cfPATYoPH8c8EBuH9eh3czMzGxIhrxEFRFHRcS4iNiIlDx8aUTsD1wAHJgfdiAwI9++ANhH0gqSNiYlE1+bl7GekrRD3j11QOE5ZmZmZi/ZcGZwBnIMMF3SwcB9wN4AEXGzpOnALcALwKERsTA/5xDgNGBF4ML8x8zMzGxIRiTAiYg/AH/It+cDuwzwuCnAlA7tM4GtRmIsZmZmZq5kbGZmZo3jAMfMzMwaxwGOmZmZNY4DHDMzM2scBzhmZmbWOA5wzMzMrHEc4JiZmVnjOMAxMzOzxnGAY2ZmZo3jAMfMzMwaxwGOmZmZNY4DHDMzM2ucMk4Tty7wl6lw45l1j2LkPDg+/X3azrUOY0RtvR9sO7nuUZiZNZMDnIa68Ux48HpYb0LdIxkZB92yY91DGFEPXp/+doBjZlYOBzgNtt4E+NAf6h6FddKkmSgzs27kHBwzMzNrHAc4ZmZm1jgOcMzMzKxxHOCYmZlZ4zjAMTMzs8ZxgGNmZmaN4wDHzMzMGscBjpmZmTWOC/1ZT6r7KItWJeM6C/75qAgzazLP4FhPah1lUZf1JtR7jMaD1zfrrDIzs3aewbGe1ctHWfioCDNrOs/gmJmZWeM4wDEzM7PGGXKAI2kDSb+XdKukmyV9MrevIel3ku7If69eeM5RkmZJuk3SboX2bSXdmO87QZKG92OZmZlZLxvODM4LwH9GxGuBHYBDJY0HjgQuiYjNgEvy1+T79gG2BCYCJ0oalb/XScBkYLP8Z+IwxmVmZmY9bsgBTkTMjYi/5ttPAbcCY4FJwLT8sGnAnvn2JODsiHguIu4GZgHbSRoDjI6IqyIigNMLzzEzMzN7yUYkB0fSRsDrgWuAdSNiLqQgCFgnP2wsMLvwtDm5bWy+3d7eqZ/JkmZKmjl16tSRGLqZmZk10LC3iUtaGfg58KmIeHKQ9JlOd8Qg7f0bI6YCUwd7jJmZmdmwZnAkLUcKbn4aEefl5ofyshP573m5fQ6wQeHp44AHcvu4Du1mZmZmQzKcXVQCTgFujYjvFu66ADgw3z4QmFFo30fSCpI2JiUTX5uXsZ6StEP+ngcUnmNmZmb2kg1nierNwAeBGyW1it5/FjgGmC7pYOA+YG+AiLhZ0nTgFtIOrEMjYmF+3iHAacCKwIX5j5mZmdmQDDnAiYgr6Jw/A7DLAM+ZAkzp0D4T2GqoYzEzMzMr8llUZmZmNTjt9gWce8+C0r7/XY+lRZJ3X/x0aX3stdHyfGjz5Uv7/sPhAMfMzKwG596zgBsfXcjWa4xa8oOHYJM3TCjl+7bc+OhCYIEDHDMzM+tr6zVG8atdV657GENS5szQSPBhm2ZmZtY4DnDMzMyscRzgmJmZWeM4wDEzM7PGcYBjZmZmjeMAx8zMzBrHAY6ZmZk1jgMcMzMzaxwX+jOrwV+mwo1n1tf/g9fDwgVwzGr19L9euQVWB7T1frDt5Hr6NrNqeQbHrAY3npmCjLqsNwFGLQ8LursQ6Yh68Pp6g0ozq5ZncMxqst4E+NAf6uv/tJ3T33WOoUqtn9e6x2/+90X+cOWLQ37+Xc8FAEd8+YUhf4+d37wM73qnr/WbyAGOmZnV4g9Xvshd98AmGw3t+W9fYbth9X/XPQAvOsBpKAc4Nagi/6K1/FHmVavzGcxsuDbZCI49up6PouHM/Fj3c9hagyryL9abUG4ip/MZzMysm3kGpyZ1518Ml/MZbLiq3klWxaxmO89ymtXHMzhmVouqd5KVPavZzrOcZvXyDI6Z1eblPpM5GM9ymtXLAY6Z9aSyl8iWtCT21Fx45qHh9THcGSkvoVmTOcDpUcN9cx+JfAa/uVqdWktkZS1bLen7PvNQKrS4/Mrl9L8krdewX4PWVA5wetRw39yH+6HgN1frBnUukdVdaNFLaNZ0DnB6WDe8uZuZmZXBu6jMzMyscRzgmJmZWeM4wDEzM7PGcQ6OmZlZDzrt9gWce8+CIT//xkcXAvDui58e8vfYa6Pl+dDmyw/5+YPxDI6ZmVkPOveeBYuClKHYeo1RbL3GqCE//8ZHFw4rwFqSrpnBkTQR+B4wCvhRRBxT85DMzMwabes1RvGrXespxjScmZ+l0RUzOJJGAT8A/gUYD+wraXy9ozIzM7OXq64IcIDtgFkRcVdELADOBibVPCYzMzN7mVJE1D0GJO0FTIyIj+SvPwhsHxGfaHvcZKBV+3ZqREytdqRmZmb2ctAtOTjq0NYv8soBjYMaMzMzG1S3LFHNATYofD0OeKCmsZiZmdnLXLcEOH8GNpO0saTlgX2AC2oek5mZmb1MdcUSVUS8IOkTwG9J28RPjYibax6WmZmZvUx1RZKxmZmZ2UjqliUqMzMzsxHjAMfMzMwaxwGOmZmZNU5XJBmbVUXS3hHxsw7te0XEuXWMyaxKklYFtgD6HEAUEZfWMyKzcjjJuGKSdgUm0P/N5Yv1jKg6ktYAPkPnn3+nisbwZESM7tD+aESsUcUYeo2kryzN43rhNVA3SR8infv3NPD3wl0REZvUMiizkvT0DI6kPkt0EfFiyf19H/g34Pe0vbmU2W+h/4E+aJ4jFVu8KCIeKnEIZwIrANPp+/OXTlLrzXsZSRvTt3r2JsCzFY9nHfoHeXdVOYYKFYt4vgJ4H6n21b3AhqSz6H5ew7hqV/V7EDAF2CsiLiy5nyWq8zUg6QDgkoi4v61934g4q4L+PzzAXa334qsj4rkS+18e+BCdLzYPKKvfAcZS2mug52ZwJL2BdAWzDenNFtKHXUTEqJL7ng9MiIjZZfYzSP9nA/8KXAvMJn3wbAf8klQ9emvgfRFxUUn9PwmsXeYLd5C+XyQFkp2OBXkQ+FIVZ5tJmgicAqzXNpbSf/9y/3+kc0DdemM9LyJ+WWL/ZwM/i4ifF9reC+wdEfuW1W/bGDYmfdB3enPfsIL+63wPeghYPyIWltnPEsZQ62sgj2EhMBf4t4j4U6G94wxvCf3/AdgReIj0uhsHrAvMBDbKD5sUETNL6v8s4HWk9/4+F5sR8eUy+mzrv5LXQC8GODeS/lPPoP9/7L0l9307sG1EPFVmP4P0Px04KyLOL7RNAvaLiPdLOhA4PCImlNT/FcCBEXFnGd9/KcdwWUS8rcb+7wS+BUyLiH/U0P9XgQOBaSwOcg8gza4JOBj4VkQcW1L/TwBrFD9gJY0CHo2IVcvos8MYrgLuBH5K//eAyyrov873oE8DqwBfrWC2aKAx1PoayGN4CtgLOB34XET8qNUeEatU0P8PgNsi4oRC2yeA1wCHAZ8Ddo+IHUvq/zFg44h4vIzvvxT9V/Ia6MUA50lg1ajhB5f0MWB34BukyH2RKqZmB/lweSwiRufbj5f1As9LZPsCPybNmiwSEaeW0We3kfQosGYdv3+5/2uAD0XErYW215A+bLaXtB1wdln5GJL+kvsqvrEfBhwUEW8oo88OY3gSWK3GD/g634Nmk2ZOFgDzi/dVMXuVx1DrayCP4cn8nrc58AvgEuBT5PfCCvp/jPRv8GKhbRTwSESsLmkFYF5ZQb+kG4BdS05JGKz/Sl4DvZiDcz6wK+lYiKqdlP9+d1t7kI6oKNudwCHA9wttH8/tAGsBz5TY/1tJ07H/3NYeQGkBziDLMn0HUU2i8ynAQZT48y7Ba4D2YPpe0q4aIuLanBtRlo8A50s6ArgfGAu8ALy3xD7bXQ68HvhLhX0W1fketH8Nfbar+zUAeWksIm6XtCNpNu93VPeZ+BDwHmBGoW13YF6+/Qrg+RL7Px2YIel79L/YrmI3XSWvgV6cwTmH9It1Bf1nESpNrqqapNeTfrFGsfjDZSHw3oj4q6SdgC0i4uQahzni8tLbEkXEtArG8kdS3tO99P/9Kz3AkvRL4Cngiyxe+/8SaUbj3ZK2JuXhbFbiGJYj5R+MIeVBXBURZb6Zt/f/fdKBvufR//+g9J1cvfweBPW/BvIYLoiIPQpfC/g6sE9EbFxB/7sCPwNuYvFS8VakXLSL8/07lpUPI+nuAe6qZDddVa+BXgxwjh7oviqSq/IYNgDGRsTVVfSX+1wG2Jm0e2UCsD4VfLhIUmsasj1bvqiu5YKqDRZsVRRgrQGcSJoxGUWaPTkPOCwiHpG0BbBKWcmNbWOpegdRq98fD3BXRMRAu1tGsv/a3oPy0scXSUvFa0bEqvnDdPOI+P7gzx6xMdT6GqhbDqY2Bp4E/oXF78W/joj5gz13hPpfBng7cEUdGz7yGCp5DfRcgFMnSRsCZ5ECjIiIlSXtBUyMiI9U0H8lCXRtfS7alVDYydTnIVS4eyKPY13SFeRaFHZxND0PKK/xH026Ul0ArA08XGVwWecOotx/699gSl1v7nWSdCJp5vYY4MKIWE3SWODiiNiy3tGVa5AyGX1UNIv3DOlCoq48sMo/C+rQkwGOpH8mTVGvExHvkfRPwOiy1x4lXQj8kfTmMj8nk60K/F9EvKrMvnP/vybtnqhy5miDyNviJQ34M5a9e6Qwnj2BnwB3AFsCN5Omhq+IiLdX0L9IeSj7AmtFxDZ5aXC9iJheQf/zSVv163pjrW0HUWEMj5Be+1UGdjtFxOX59jsGelwF70FzgU0j4hkViltKejwiViuz78IYankNDLTONQQAACAASURBVDJz10dEHFTWGApjuQL4SET8rey+Bui/8s+CDmMo/XO455KM846NTwI/Im0TBPgHcALwppK734609e9FSQEQEU/kIKcK9wIXSppBWvddFN2WddUShZo/rQ+wPEW6bkTMLaPPJfgaacfOzyQ9FhGvl3QQKdipwldISdbHA/+T2+YAx5EKIJZtGimx/MQK+urkVaRtuXVeWZ1O9f8GJ5ICaUhJtp0EqehkmRbQ9r4vaW3adlSVrJbXQBWBy0vwB+AiSafR/724ipnkyj8Liqr6HO65GZxcg2GXiLgnf8Ctnqet50XEmiX3fQuwZ87cfzQi1pA0nrQtd5sy+879D3gFU9FVy2qkN/q9gOcj4pWS9gC2i4jPl91/HkNxyaz1/78M8GBElLl7qNX/bOD1Od+l1b9IdWBWr6D/K4DtSUnm7W9sVSQ5TwPOjIg6dhC1xlDrv0GdJH0b2BQ4nLSLbEtSoDErIj5X0RhqfQ20jWUV+i9VV1Gy4/cD3BURMeAM3wj2X/dnQSWfwz03g0MqctWaVWi9sS1HurIp27eBX0n6BrCspH2Bz5KWrErXBVcw/wM8RrqKvyW3XQV8B6gkwAHmSVo3Uv2He/IW0UeoZps+uZ+n8+3W79/KhbaynZz/1OUVpG3ide4gqvvfoE6fBY4FbgRWIi3VngxUssEiq/s1QL6w/Cmpmm+rwnlrLKW/F1SxHL6E/uv+LKjkc7gXZ3DOBa6LiCmFWZQjSEco7FdB/3sCk0kf8rOB/4mIX5Tdb+57wOnviq5aHiaViX++bf3/iaiuiu1/ka5Wf650Hs1U4EXgOxHxhQr6/xHpRXw4aefEmqSp+eUj4t/L7r9u3bCLsQ551mJpajFVUmwPFi1NPVL1cmE3vAaUjkr4K2m57G7S8QjfAP4UET+paAxrAu8i5R59S9L6wDIRMaei/l9Lmk1fNyI+kXdQrhAR/1dB35V8DvdigDOGlOS4Fmk3wV2k7XrviYgHB3vuy506n8fUygWqYgfLLOCtETG38Eu9IWkHx2vK7n+AMW0IvDIKlX1L7m80KQdkIumK5VngYuCAqOAIDw18yF/jd5G11JHkKmmpjgeJko+KGOQi5zlgbhWJ13W/BvIYHiMltz7fSrCW9ErgpqimDs7bSAfMzgTeHBGr5LbPRMR7Kuh/b1K6wM9JR/WMzkm+x0TEOyvov5LP4Z4LcGDRG9x2pJOMZwPXVvTC3he4PiJuVSoRfjKp0N6/15FNL2k90pbZP0bEmRX0dySwB+mclfNJNSC+DsyIiOPL7r/DeGqpw5L7Xpf8+1dlYN1h7X894NXAlVVNmyudZLwF/XMfqqigitJ5XIuSXPOH2yakQ0C3LbnvUaQKvpOjew6dbX0IvAhcQHo/Kr2Ev1LF7FdR8Wsg9z0XeHVE/D1feL2DtHx+f1RzVMN1pGDmkkIOyiuAeyNi3Qr6vxXYNyKuL/S/HPBARKxddv95DALeyOLVjBH/HO7JAKcuObHqTRHxkFJF2dtI6847VZFYNsCYVgBuj2q2qYuUOd9aorsP+CHwvaqmyVVzHZbCOEbT/yTrB6rqv20sHwZeGxH/r4K+3kKq4LoCMJp01bYK6UOu9AqqeQx1J3rPBTaMCqs3F/o+GHgbKedmNinI/gLwJ+Ay4JukDQB7DfhNhj+GtYF/RMTTOeA7gFRw8qdVXWQoHTz8m4g4TdIxpKq6zwH3RcSeFfT/WOt3rTCbvQypLlWpm11yn/NJs5dR6H9ZUoBT+maLDuN5O7AwcimFEfu+vRDgdMv6txYf8PYK0trzeqTzRh5p5aNUTdI2wCVVRO2S1ut0pTZQe0ljqLUOi6R3kvJ+XkXbVXSVAVbbmJahot9BSX8m7aI6rhBcfBH4e0R8u+z+8xgeADaJiGcLb+6rALdExAYV9H8EsBpwdNVBjqQ5pDo4zxbaViJd5IyTtDpwR0SsVeIYrgE+HhHXFYKL54HfR8ThZfU7yHiWAfYjBdqnR0SZ5/G1+rwS+EpE/LbwO7gr8NmI2LmC/i8GfhIRpxf63590VEX7WYll9H8Z6We9MudFfpoU5P4gIr4+Yv30SIDTLevfdwK7AVsDh0TErvnN5f6KrhzbD51cibRN9CsR8Y0K+l+0Rbut/dEqPlxbY6Cmk5xz//cCXwXOJtV9WCQKp7yX2H/7cRkrkQ5gPKKKGRSlE+1Xj1QLqhXgLA/cHRFjy+4/j6HWJFctPtF7IfAwfbepl32R9QDwjuKSuNJp8r+PiDF5meLhKLHoX85/WSPPHswh1T15Grg5IsaU2O8DEbF+vn1qVHAsxyBj2QH4FfBr4N9IOUnvASZFxJ8r6P81pLynu4EdSHV5NiedMH5HBf3PJ+VALcxLhO8h/Q5cOZKvgZ7YJl524PISfJVUe2Ih8P7ctgtwQ0X9/6jt62eAG6r4hc7UryEt1VRZVbfOk5whLYv9uIpgZgAv0H82837goxX1/wRpaepxYK7Sdt35tC3XlezTpA+UJ0hJrk+Tk1wr6r/OE72PBy5VqoMym3TY6kG5HdKJ1leVPIaFwPI5D/GJiLgvB95l/w4sJ2nNSOc97QXUFuBExNWSXgd8gJSTNZtUD6ySHVQR8bcc5LybFGjNBn4VEVVt1V8GCEmvJk203AqQZxBHTE/M4LSTNAF4K/2THKuo4LhS7uvv+et1SFsDG7uDq7BEuD7QnmeyJnBWlHgWl6QzWPyhvgI1nuScE61F2q1Q+YtP/Y/LeCYiHqmw/+NJyYRnSvpP4AjS8sRFZf4ODDCWWhK96yZpIrA3iw95nB4RF1XY/xmkIHdN4LcR8VVJWwHnRom7KSV9jRTcPkLn9yKg8q36In0OVbpdX6nA6q/rutDKOaizgTHAnRHxmRzs/G+M4C62ngtwJE0mTUdfTNrFcyHpin5GVFAHJ49hHfonmFZRh2Z5UkG9fVn8Aj+bdPDgs4M9d5j9vo30of4b0r95SwAPRcRtZfWd+x+w9kpRVFCHRdJmpNmjtUhvtMX+K0myzeMYS/oduL+u5OY8jreSXgu/rSrBtNB3LYne6oITveuUf/4DSYHtGRHxgqSdSdv0zy6573Gkmjet9/9+qpjxV6rq/t+kQHM50r/Fz4BPRsSjFfR/A+n1fw4p7+jasvts639N4D9JP/e3csL57sBmMYI7ansxwJlFOovoj4UcgH8hJVcdWHLfE0nn0LSvM1eSYCrpFNL23Cmks0heBRxFKnxX+nStpJVaM1e9Kr+xXE96M2vPwbmkgv43JFVw3RF4FFgDuBr4QBVJ1t2g7kRv1Xiid77I+RAwgf7BXVVLdO1jWpG0g6aKavKtPt8bEedV1V+H/s8nLdV9gcXvxV8m5YGVvosrj+F1pOXSfUnpCmeQEo/vqaL/KvRigFM8i2jRycpVJLrmJONvAdMi4h9LenwJ/c8n1X54vNC2BinAqWIHzaeBSyPVXtiBdLDeC8D+EfGnsvsvjGMLUon29jf40gvd5STn1aqerSj0/3tSztfnIp0ovTIpN+z1Ze3e6JDc3lFUdA5UFyR613ait6SzSL/7v6T/LsJKKkkrnYc1PSKuzVft55J+P94fEb8sue8dgPOAdUkHfO4ZEdeV2ecA43gcGFP8HMjpCw+U/TvQYSwi5YJ+h3Qg7JWk8h1nlfU+VVWg3RNJxm3mSNooR6m3A5MkPUI1Z1GtDvywrh08pJyTlUgJni0rktbhq3A4i09S/gbwXeAp0pLh9lUMQNJnScsDN9D3DT5IyX5lm0EqKva/FfTVybaknRLPA+Sp4f+i3NOk25Pb61Z3onedJ3pPBDYuXuTU4AOk1yD57/1JCd/HkQKvMn2bNFMxjZRc/S2g9Mq9HdxGWiorVlDfMLdXJue97J//vEj6/7gP+ATwPuC9JXU9jcWBdmlFJXsxwDkWeC1wD+kcknOB5YH/qKDvU0gvqspK4ksqFhA8A7hI0n+Trl42AA4l7SipwqoR8YRSzZHXAe/M2wS/U1H/AJ8i7VYo/byVAawAXJBnNfq8sCtaIriaVMX7ykLbP1HizpmImAagVNTtaFLOV+VVfAuOA46QVEuiN2l5cpqkwwGUytYfT5pRKtt9pN/BOq0UqYLwmqR6RD+HjgnwZRgPvC2/73yetDxUCfU9JuUS4OKccD2b9F68P+k9uoqxHAp8kHSy/HTggxFxdeH+nwPzShxCJYF2TyxRSdojIi7It5eLQnGtPFW2fFnb49qm50WaqbiH/jt4Spmel3T3UjwsqkhwlXQzaTvylsDuEbFnTvS8Oyqo3pnHcC8pka2y9f62/is/bFLSVwpfrk0qavZrFr+xvotUfK+KGjCLloXL7muQMdSa6J3fc44lnYe1Emkm8WTgyLIDv7xzbW/ge/QPsKs6KuPPpIBuU2CLiNhP0lqkOjilHlOgtlpcVaQmFPpqPyalk4gKqtpL+hVpFmXGQO+FknaNiItL6v8G0kxyqUeC9EqAU8y76VhsrsS+lypxuXWV22SS3kVarlgAvC8i/iJpP9LVQ8cdDSWM4QDgzcCX6P8GX9uHbpmUap4sSVSUaP5dUs7XiWX3NcgYak30bhvLBqRCazdFBQe+DnLBU8lFTh7DG0kB1vPAhyPiTkkfACZGxAdL7nsBfWfK3k/aSbRIXcnWTde2mvB6Kgi0eyXAuR04AbiFVNRodzoUnavqCqYbqMaDJtvGsVzuv5KS9UqHDULfpNdKz6KS9M/APqRKnu9ROsV3dC/8/km6gjSLeT9pBqlYxbeqJONaEr3zTqn/Ji2TXEXKB7mctJtmNdJp2lUsU/WspSkZUVWyNdRXqiD3vQfpXLL2enClBHh1rCb0SoDzJlK+zauAjUlvrO1Kv4KRdAJwdnHHUB7bv0XEp8rsO/dV+UGTSqc0L1FUUAcIBl/nr2KbtKTDSAeO/gg4KlINlC2BkyPiTWX3n8ewEml5oP2NtfSdbIPNaFY1i5nzHqZFRKWJ3krFzeaR8v7eT0puPSwizpc0CfhqRGxT5Zjq8nII8iUdGRHHlPS9/5m0U2mjtrsqudDKgd7HSbNZH8tj2Q84JyKqyEetRE8EOEWSZkXEpjX1/TAwtrjmqVT0anZUcIKrajhoMs+YBB1mzPp2X89BkwBK5cH3rWLZJJcK2CUi7tHiOkyjgHlV5CHlJbrvk5YJi8szERVWcK2T0knS7wYqTfTO+UdjImJBDjKfIOX/Rb7/iYhYtYR+b42I1+bbAx48XNX/fzcE+UujzHSGLihVcC8pD/KmVnkCSdsBn4+IPSrofwIwPyJmF9o2IJ1RNmJHF/XiLqrfdGqUdHwFsyhBOoOjaFSHtrK8ilT/pLKoNiKq+tlekhxU7E46f+jdwB1AFXkhq7B4BrH1/7Ac1ZQpgJTc+r6I+F1F/fWjdETCdvSfGq9qd+HN+U/Vlmtd3ORdRE+1vRYHuwgYjuI5Y3Weg9XyKRYH+f+V2/5GKkLaTcr6/4D6SxWsFhE35dsL8uaba7WUB1OPgJ8A7YHU8qSL7xGbxezFGZyBTrSeX/YVdN56dzfp5OYXcx7MMaRdPf9aZt+5/2mk3TJ1HTTZGseGpEquc4oRfEV9v4EU1OxLqgG0ArBXlFxgrND/ucB1ETGltYND0hHAhKjgqBBJ95GKPVaS89Sh/z1Jb253kHbT3UwqLnZFRLy9jjFVRdLf6Zv/9wtgUuHrX0bEK0vsfxSpRMXksndrLWEc80gzWQsLr4FXkHZTlnaa+EtV8gxO3WfS/ZW0ueNmSZeSfhcfIy2TblRB/wN9Do/ov3nPzOAUahAs21aPAGAT2raLluSTpCTnuXmKcENSkb33VNA3pKuG83OiZx0HTY4hTcnuSCpqtqakq0nHZJSaWCfpM6TzbzYjnUPzSeAC4E7gmjL7bnMY8EtJHwVWkXQb8CTV/Q58AfiupC9HhYdsFnyNdFTKz/IS3eslHUQKdiojaSPSlWJ7HtKZJXY7j741sOa3fV1m3RFyQLErqaBbnS4HjiQdGdPyH8DSbKNuip+TShUcpVRodpGKdrN9nnTYKaTjen5Kei0cWkHfkAruviEi/tpqyBefI/o50DMzOIUaBG8lrb23BGkd/ntRKHRU4jiWIe0iGUdaqri2qt0cg+0gqGLngKRfkAqNHRWpTP0rga+TCj6Vuu6bc4Hmk17APyvkPcwFXhcRpX645L6WAXYm7aDZmrRkWPXvwI6kIHNcsZnqkhuLJRtaOUjLAA9WkYeW+z2KVLH1ZvrnIVWyk6suebZwNeDoGmfxxpByAdcizeTeRQ7yo4tOdc9LiKuU9L27qVTBOsBbgFujglIFuc+Pkl6Dx5IuMl8NfIZUBHTqiPXTKwFOi6SvRcTn6x5HL8pXKmOib6HFFUgnWq9Vct87k5am9iIdD3E2cCbpjXZCFQFOHkdpb5pL2f8s4CxS7Y/2N9Y7K+r/zRHxkKTrgH8nzZ5eXUWSdR7DI8BOEXFLFf11k5xkvB5pa/rD9N2mX1mSuSQBbyQF+feRgvyu+jCS9JuIeFdJ37vnSxVI2hs4mFRsdDbwo4g4d0T76LLfqdIpnfnyj0hn8IwifegtJJ2iWuovm1LNgy/RufZAVTsYatueKekOUr7LDYW2bYDzqtrZpnRy8V6k//e3k/4PvgScGBGlnwUk6dekde7SZwsH6P8x0k6FWl74Oal0VkT8PO/omkpaMvlORHyhojHcRjpctOdOth8siTQiLiu57yUeulrmDJr6FpobbAxVvBe6VEEFejHAuQb4eERcJ+mbpB00zwO/j4jDS+77J6SlgeNIiZb7A/8P+HlEHFdm37n/Wrdn5mnJr5PO5LqXdPV2EPCFkZyWfAnjGUcKdD4IvCoiVqqgzxNJCc4z6F/o7osDPW8E+/8ucH1EVHX+2KBywvkrq5oaz33+C+nAx+Npy3uJiPuqGkevUd8aSCKVK+iT8xEl1kJS/0JzY0mvv/mkfBSRNj5UcVxHT5UqGGAspe+m7MUAZ9EVrKQ5wJuAp0nnoJSawZ93D7w2IuYXag+MJe2eeEOZfef+a63BksfwDlJBqfVJCWVnVnHFtCSSto+Ia/LtE6Okc5k0yLEJEXFQGX229X8F6U3lbvq/sTY6/6QlX6meTHpjLaokD6lO6nsuWR9VBNhtY3ksIlavss9C358lBTVfiLRlfyVSMdj5EfGNCvqvJR+yfZeS2s7iKnPnWNs4KtlN2YsBziOkyH1zUlXhLXOS4xNl50bkvteLiBdycLUVKbnu8Yp+qV4W2zPrVuGLvI7kvlorCXfJMu39pFPNaymyVjVJH4yIM/Lt9gB7PdL/xfkR8YGKx1XZQZcd+n4YWL8tH3A54IGIWLuOMVVBNZcqKIzjJuDLsXg35eqt3ZQR8ZmR6qdntokXXEg6Hn5NFh+6Np50Nk7ZbiC9mVwCXEE6NuFp4PYK+oaatmeq/7b8fkZyWnIEjHiBryUl90mqJLmviiBmCU4kLdN+hbZl2grHsCz1Flmr2r6kAmodZwklTcyP6SXPkGYyryy0vZG2Cu9lqikfstZSBQUbRsTP2tqmkcqXjFiA04szOCuQ6qE8D5yRZ1N2Js2slPoBo3QukyKdnrs28A1S7YGvVLGjo67tmYUt+i1vpu8bS0TEUiUAVqGMGZxuSu6rYu17kL5rXabNY/h/pKqpX++2nTtlkDQuIuYMcv8ywGNl5150SPJtnz2o7MBjSR8kBdu/JOXCbUDKiTm0NdtVcv8vi+MqylLVbsqeC3Ba8ot63YiYW0Ff2wLPRS6NnYOb40m1UK4C/jMini57HLlvkT7cNqTiGiyFMdS29r40SgpwuiK5r6q170H6r3WZNo+htVV6AekKdpGqlsmqpL61h9oTaFci5cTtERFblTyOJZ0mHVUk+LZIGg+8j5QPOBc4t4oLzdx37fmQdapqN2XPBTiSViNF7nsBz0fEK5WOjd8uSqqPk7dHfjnylkBJM0gvqtNIU8P/V1ZSazeqc+19aaiEWjVdlNxXydr3IP1fQpo5uUTS2aQluqeBbSPin8ruP4+htq3SdZC0TOsiRv0Pv/07cB3wqYj4S01D7DnOh+yrrN2UvRjgnE06c+MrwC35DX5t4E8RsVlJfT5COkX8uRxgzQO2iojblU5Q/VNEbFBS3wOeHlxU5ZXryyDAOSkiDhnh79ktyX21VhKue5nWDEDSGqRcjwn0P66j9N2EqvlMum4j6e3Awoi4fCS/by8mGe9Czp6XFAAR8XDe0VKWZVl8WvQOpA+T23Pfs3PQU5bi6cFvJOUfncDiOjSfALqiJkpVlM7j6fTG9sX894gGN1m3JPfNk7RuRDwE3KN0dMMjpFPtS7MUy7SV1Z/Ju2U+T6p/1CpXcAapTHxVp7rXLge2i1S9VF2zM0kH7U6nwsTigrrPpKuVpMuAz0bElXm56tPAC5J+EBFfH7F+enAGZxbw1oiYW4icNwQujojXlNTnlaSzrqZLOg14MSI+nO8bC1wTEeMG+x4jNI6bgN0i4v5C2zjgojLX3zvMIo2lbddaVTNIkr4P/Btp51jxjS1a/ydNNsja93fLWqLN/XbNMq2k40h5aF9mcaD/BWBmlFzss25KBxr+gHTQ6CtazfRADaAipaMS1o56T1UvHldRSz5kXXJO4jp5iW4WKbB7GrhyJD8LejHAORLYA/gccD7wL6TqujMi4viS+nwLKVs/SDkHb4mI2/J9nwa2j4j3l9F32zgeBTaOiCcKbauR1n1LS/odLOehparch/zCmhARs6vor9uVtfbdoZ/almk7jGUO6YDV+YW2tYAbImJsFWOoi6QbSe9FZ9A2cxER99YyqBooFbw8MCo4f22A/mdExKQO7edFxHvrGFOVlArurglsTJpceHVuH9H8x15covom8CzpKmY50jLBD4HvldVhRFyRP0g2B26PiKcKd/+axfV4ynYBcIGkrwFzSFsjj8rtpXkpwYukX0fE7iUOZz7weInfvytpCecASSo796DOZdp2A9U5GvH6R13oVcDnoteubPu7FLhIqfBhnxIZUU1NroF2LO5cQd/d4ArSUR1jSBMNSHo1abl8xPTMDI7SGUCXA5dHxAN1j6cOOUv/S8DeLN4aOZ20dPCPQZ5ambJ3E0n6GCnZ9xv0P6rgrrL6rZv6nwP0A1LtiUWi3HOAumKZNvd3PIuXqO4jfeh/nrRE9akqxlAXSdNIx6P8tu6x1En9a3O1RJRYk0uLj8o4Aji27e5NSLsZX19W/91C0prAf5Lq0R0bEc9I2h3YbCRXUnopwJkK7ESaRbkLuIwU8FwWEffUODQrqCDAGWiNu9dyECrdydYty7S5v+VJAU3xTLSzgK/VmZNRFqWTq1tv9CuQ8h2uoP/MRWmHPFqixUdlfAD4aeGuIF1wnRIRsyofWIWU6v2cCkwu+/XWMwFOS94ttRPpDKCdSLs4HiQFOvsP9twmkLQF8Dr67yDqiqMSqqoH0+vq2KovaRU6LNPm38mnenVmtWwa5GDHoijxkMdulpN9i9WUS0/0lfTRiDi57H66laS5pOManl/ig4fTT68FOEWStiKV5/4UKaO+0VfwSifofpF0Jlb7DqKuOCqhqgAnJ7aOjYiry+6rG3V7LaKyKR0bsC+LZ3DOjohL6h1VeSTtGxFn1T2ObpGXRb9Pusjtk/9VxefAQK8/SfOqqEdVt1zzZzXg6DKDnJ4JcHKU/gbSL/TbgO1JW/P+SDoX6YqIqKoWSS2Uqme+MyL+r+6xDGSks+g7fP8NScsRE0iB3cqS9gImRsRHyuq3buqic4DqlpfEjgR+TNomviFwECkX4Dt1jq0snhntS+lsuL+TcvEuI30ufAn4TRUzK53e53J9pgejN45qaB2XshB4mMIGCG8THwJJT5Bqr5xDWn++OiKeqXdU1ZJ0LymJq2uLmUk6KiK+UeL3v5AU1B4DzI9UyXdVUh2WV5XVb93UZecA1UnS/aR6UDcV2rYEfhcR69c3svKUfeHwcpPLRWyYk1tbh76uQSpXUEo9tNxvazfjjqQCl0XjgJsjovHF/gYrHTKSJUN6KcA5mZR3szzpA+6PwB9bW1V7QS7s9mbSlUr7DqIq1p2/MsBdz5G2rV8UqcJumWOYT1qOfLE4Tdx6kyuzb+sOOcB5dUQ8W2hbkVQAsZF1cNT/qJB+emUGDxbNZm+Q6zLdQyq49yTwSMkzyAeS/g9OAj5euKuVZHxp2XkpvaRnApwWpRLxOwFvzX+vB/yJFOyUVgunGxR2EBX/0yurYqp0Dti/AteSlgc3IG3X/SXp6mVr4H0RcVGJY7gF2DMXmGtVsh5PysHYpqx+rXsolcffmRTot+pBfYG0VLEo2b6KoL8qkhaSluMGCnB6ZgYPFi1RnRoR50v6IbAZ8A9gpYgYqEbNSPU9ilT7bP8m7tpbGpJWIOWD7gusGRGrKh2hs3lEfH/E+um1AKeoB5OMB1yCiQqqmEqaDpwVEecX2iYB+0XE+/PVzeERMaHEMXyYlH/xDVJxx48BnwWOiYifDvZca4a2UgHFk7WLXzeqbIBzcPrKhSWXiYhH8+zdZ0g7S4+PiLkV9L9oJrnsvrpRrks3lpQqcGFeIhxLqmq85Yj10ysBTluScWub+MrAn0nLVZdFxMX1jbD5ch7UGhGxsNA2CngsIkbn24+XnSsgaU9gMovPgPmfiPhFmX1a9xgs0C+qIuivigOc7iLpu6Ql0RPrHksd8jbxTXMOVGmpAr10VMPjwDLANaQCf8eTEo17aopQ0h6kXWRr0XcHTRVFvu4EDiFtz2z5eG4nj6n0xO8czDig6UE5iJ5GSjLupdd+LxxDMahBcgD7iIgvlj0W0tL8YXm7dJ/DiKPcI1O6xQLa4o+cPjK/88OHppcCnN1IpdhfWNIDm1ozIhf8+jhp/Xdv0hlc+5F2llXhI8B5Sida30+aolwItA6X24KUC1EaSfsC10fErZI2B07OY/j3iPhbmX1b/SKdXrwx6WKn/QBqSQAAFuBJREFUZ3gHFZByrbrFyflPr/oZME3S4QCSxpAmHUb0XMaeWaJ6KZo6nZu3ie8eETcVtkZuB3w+IvaoaAzLkbZIjiGdhXVVlbsGJN0JvCkiHsqJhrcBTwM7dUuxQytXzsPaCTialGRcvHruyZwIsyrl41KOJV30rkSqSXQy8F8jWcbEAU4HTa0ZIemJiFg1355HquT7fLG96VrBq9LBo3NJu+ieJ20P7dnKvr2k7t2E1h1y/ast6H9sTenb5XOQ3VF0ybE5VclLU49ECcFILy1RvRRNjfrulLRlRNwM3AQcIukx4LGyOpR0a0S8Nt/us9ZcNJLVK5fgYUmbkrak/znXwVgJ5yj0ko3rHoDVS9KHgB+QZm/7HFtDOtW7jD53iojL85cfbLt7PeDVpKr6jQxwJA3277pK2gcEEXHXSPXpAKe3fB5olQE/EjiTdPXy7yX2+dHC7W44zPSrwF9IeTet06t3IZ3PZT2gtTtK0jLAusBDXprqOVOAvSLiwgr7PBHYCqBTrZ08q/PaCsdTtVkUyjDkttaFZfHCd8RmUb1E1UETc3Dym/nOpDO3uvaohirkGRsi4u/563VINTEerHVgVglJo0k7+fYhXeQ9T0pu/I+IeKLOsVk1JD0ErF8sWVG3/B7dE0vlkg4C3kkqtnkvqWTHF4FLIuK0EevHAU5/km6KiK3qHsdIqzu3KBe3upxUMfYy0m6mWn4Bc1DTvvY+YlOj1r0knQasAhzF4jfXKcDfI+LAGodmFckHrq4CfLWq2bvihXMOZopWIs1wH9ELFaUlzSGdi/iPQttKwO0RMW7E+unFAKfO5LI6Sfo16QV9dU39b0o6IuNt+c9qpINPL4uIb1c0honAKaRdXEVOMO0Rkh4ENmnN4OW2lYE7I2Ld+kZmVdHi06wX0FZ7pax8QEkbR8Td+faL9M9HvB/4aET8toz+u4mkB4BdIuLWQttrSWdxtb83D1nP5eDUkVzWRe4FLpQ0g/7FpUovbhURs0jrsD/ONWgOAA4j1SiqJMAh/d9/FZhWvHqwnvIssDbp9dCyFunQV+sNlecDtoKbrD3R/ZmIeKTK8dTsOOBSST9m8bmEH8rtI6bnZnDyScIfqTi5rCvkX6aOIuKgCvr/OGnm5s3AA6Tlqj+Q8oKeLLv/PIZHSYe79dYvvi0i6fOk4Pq7LF6iOhw4IyK+VufYrNkk/YbFy/R/XprCs02VZ9P3BtYnleyYHiN80HIvBjhdl1xWh5yD8hbg1uI0Ycl9vkg6luFY4FdVHGrXYQzfIv3MjdyKaQOTtFpEPJ7PpTuIVMV7fVKwfRbpdOneekPsIZI+FxFT8u0Bj20oczZb0mdJRSZ3JK2gXE0KeC4nFT19tqy+e1EvBjiVJ5fVLZ/S+t/AeOAq0nLQ5aSt0qsBB0TEiJbIHmAc65NmcHYi5eIsl8dxWUT8pMR+/0jfbYnbA/cAfXZN9cgZMD1L0rPAL4HTgIt6/SKn10g6KSIOybfrns1ehnT481tYfPjzaNJxQm8pu/+6SVqBtGtqX9KM+qqSdgU2j4jvD/7sl9BPDwY4lSeX1S0fSTAPOJdU++WdwGERcb6kSaRgb5uKx/R6YC/gE8DKZSb4SlqqnTERMa2sMVj9JG1DKrC2H+nq+aekXCzXQLJa5A0vbyUFOQcArxjJ07S7laQTSWcRHgNcmI8NGgtcHBFbjlg/PRjgvG2g+yLisirHUpW8PXtMxP9v796jNh/rPY6/P+O0IwxmUMwgU9pIUuhg0y6k7VCtyKGzyq5EdnYHUqKl7HZ7o9NSaKOUlA5rqF270qLopIPYhGEYOUwzxuRQiM/+4/o9ntszB9ru+/d7/K7Pa61nzdzX/Tzr952Ze+77+7uu7/W9fF+zFW8xsPLYdHxbRzU0B6u9kPIf+i7KOvTYDM7Vo75+BDx097wLJdl5OXAd5YTxs9ILqR7Nrp29gfVsv0PSZsAqti8b4TWnU5KZsZnsdSiz6j9uvn5Tw8qCpFuAWbbvlnT7WO+fsTMSh3ad2hKcGk1sXDj4glra8yOM43SaHjhd9ZyR9AngbNsXD4w9H3iV7cO6iCm6I2k14JXAMZSz2VbuOKRogaR9KJ2FzwUOaM6new5wvO2dR3jdB4ErgZMoTe3mjOpak1lz8PNWthePfR41yd9PbW86tOvUkOBMhuKyLkm6B9id8bbY3wReNvB4tu3VOojrCcADbXZWlvRHygfZfQNjqwDzbK/bVhzRvaYm7DXA6ynbVM9to/4iuifpSmB/27+RtMj2WpJWAm62PX2E130/ZQb7WZRE56Lm62Lbd43qupONpI8Dsyi7Fy8FtgBOBK61/f5hXaeWPjiDnRFndBZFd+bz8APcFk54PL+NIJoX9Tm2fy5pd0pNkCXta3t2GzFQio0ndhFdYSlj0UNNUv1KSlKzI+XD5XhKcnPP8n42emVdxs+f88CvI73jH7jRnkJJcv4BeCtwetP87iLb/zLKGCaJIym7aX9H6eJ8DXAKZSZ1aKqYwYnJoVl33dT2PZJ+RnmBLwZOsP2MlmI4F7ie0hL9weaN5nhK2/BXtBFDdEPSGcArKB1jv0DpezOv26iiC5K+B3zR9pkDSySvAfazvUeLcUwsMp5eW0f1ZmlqwShaNFSZ4HRRXBbjxcyS1gGuGpsKbvNwU0kbAudRjmq4AZhJaTK1p+2b2oghuiHpZOD0R3NUiaQX2P5JC2FFByQ9Hfge5WbnuZSGo08DdrV9zQivO1ZkPPa1JXAT40tVvd1wIWlj23Ob3y/z1IBh1mdWl+B0VVwWIOkXlHXWWcBmtg+QNA24os0zgJpZm+0pS5fzgJ/XsHMhHr02k+7oRrOjdA9KJ+t5lOajI62DaYqMr6EkM2M7SG9Y/k/1gwYOe27+HpbGw5zBqjHB6aS4LEDStpTdA/cDB9qeI+nVwG62X9ttdBHjBt+MI4ZF0vqPthWBpPfZPn7UMfVZjQnOQmCabQ+sva5ISXCyi6bnJK0BfIjSh2Ia4zvJetvoMf52mcHpN0mbAMcBWwNPHHxusrwP9PE1KOkCll/IbdsvHtb1atlFNehSSoOvMwfG9gN+3k04dZG0C+Xve13bezbLg2vY/mFLIXyGsjR1LPBFyjbhd1OWLCOiDl+inIt3ODBZd8/pkb/lcWdZR/JsABxK2VE1NDXO4HRSXBYg6RDgncCpwBFNwfEWwCm2n99SDPOBv7e9cKxrZtMifLbtbdqIISa/Pt49xzhJfwKmTubauxpeg82GkyOAtwBfAY4d5maP6mZwbF/VJDl7UHbTtFJcFgAcBrzY9lxJ723GrgI2azGGKZSt6QB3SZpK2UU1q8UYYvLr491zjLuQ0ofm0q4DqVFTKvBuylmE5wHbjKKrc3UJDkDT0OucruOo0OqUhBLG12FXohx82pbfUupvfkA5++XTlHOxerk1M5bU7KJbwuDdfAqM+2dCF/u5wHclfR14WNHvJOpo37sku2m0eRhlafBHwA62rxjV9apLcB4PxWU9diHwPsrf/5hDgQtajOEtjL9xHAJ8FFiT0mQr6vBXllLoKOmvwM3A14GjM6vbOxO72M+m3GANjk+mmo2Lug5gBK6ndI7/GPBLYD1JD2sRMsx6zBprcC6hFJedxYTiMvf0NPHJQtKTKG8q0yhFZdcBf6I02RvpKc6Sng3ca/vy5vF0Sk+eZ1BO8z08H2h1kHQw5RTx4ykzijOB9wDnA78Hjqb0ZnpzZ0FG6yQ9EzjK9j4tXW8z4JkseaP9+aX/xOOfpLk88i6qZTYB/JuvV2GCM+mLy/pMkoDtKB8qrTXZk3QRcIzt7zePvwU8GTgd2B+4zPbbRx1HdE/SHMqa/+KBsanApbY3bYrOL7W9fmdBxkg0zf2OoMzgX0NpGTEN+A9gZ+BM2we3EMeRwAcpS+aDN9q2/aJRX78WNSY451Gmn1NcVhFJCyiniN/bfJjNB7a0fbWkGZTTfGs8iLU6zYnyW9m+ZWDsyZQkd5qkFYDbba/ZWZAxEpL+i1Jc/F3gpcBtwNOBM4ATbS9oKY75wM45Hmi0qqjBeRwWl/WGpHk8inXtFuqfVmS8mPm5wK1jZ77YntckPVGHM4H/kXQSZRZxQ0r7gjOa53elLFVF/7wE2Nr2fEmfBG4EdrLddr3Lnyk7SGOEqpjBabL2R2LbB448mMpI2unRfN+o658k/QQ4yfY5kk4HHhz7926WJH5me8NRxhCTQ7OL6iBgH8oy5S2UXZWn2H5A0t9R3hv/3GGYMQITe8t01WtG0uuAF1CWyG4bfC7lE8NTRYIzppl6Pho4zva9XccT7ZG0A6XA2cADlO2Jv2+eexewve19OwwxWtC8B/wAeEneA+oj6R5gd8Z3Un4TeNnA46Hu4llOHGNJzOAHsBjyYZO1qyrBgYdqMdZNltw+SSsDb2DpW/RHvk1b0uqUrtVX275zYHwz4E7bN486huiepBsop9n/petYol1t7+JZThwbLSeAKk4Xb0ONCc5/Atfa/kzXsdRG0pcp2yJns+QW/WM6CSqqI+lAYEfKbO5NDHzg5cYn2tQsl643WPAew1NjgvNjYHvgD5QCw8E3tx27iqsGkhYBm9i+o+tYol5ZHoiuNZsaPgPsDdxvezVJewHb2T6q2+j6o4pdVBOc0nxF+24EVuk6iKjeJl0HENU7GVgEbAT8bzN2CaUfTxKcIaluBifaJWmwadWzKDtXTmLJnQMjL+yLiJgMml5MT7Z9v6Tbba/djC9O/6XhqWIGp1lzf0R9bpHdodOWMvaRCY8NjLywLwJA0hdYRqFpG8XuEcBiSgflwWaTMwcfx2NXRYIDvHbg96L0H7iVUoMzA1ifcrJ0Epwhs53lgJhsrp3weH1KLcRZHcQSdToVOFfS+4Epkp5HufE7uduw+qW6Jaqme+Uc2ycOjL0T2NT2od1F1n+StgYW2p43MDYDWNv2b7uLLGon6TmUI1z27DqW6L/mTL53UhpObkSpT/wspRlpXR/KI1RjgrMImGb7gYGxFYAFttfqLrL+k3Q5sJft6wbGNgW+YXur7iKL2klakXL+VOtdbSNiNGpZohp0K7AX8I2BsT0phy/GaM0cTG4AbM+RtHE34USNJhS+A6wK7Mf4bpaIoVvK626psuFieGpMcA4Fvibp3ZQanJnA5pTdPTFaN0naxvavxgYkbQOkg3C0aWLh+93Ab4D9O4gl6jHxdbcBpdh9IbAOpT70JrLhYmiqSnCadc85wKbASykH7Z0PnG97YZexVeIE4FuSPkb5d5gFHA4c12lUUZUUvkcXBl93ko6kJDUfsH2PpFWBYynJTgxJjTU4dwOrpyV7NyTtA7wJ2JAyg3aq7XO7jSpq03SS3Z1yk3Mz8G3bi7qNKmox2AdnYGwl4Gbb07uLrF+mdB1AB35NOXAxWiLp2ZK2BLD9VeB1wGWUKdpdJT1xeT8fMUxNLcRcynL1tsAhwPWSXtxlXFGVu4HtJoxty4Qz+uKxqWqJqvEj4L8lnc6SZ1GlD85onAgcA1zePP4c5c75s5S6h48Bb+8mtKjQp4CDbJ8zNtDMLH4aeHpnUUVNPkD5HJrNeD+2PYCDO42qZ2pcorpgGU/Z9qOqco+/jaQFwAa2722WBv4IbGH76qYPzsW2Z3QbZdRC0h3AOhNaRaxIaRUxtbvIoiaSNgdeSbnZuwX4mu3s5Bui6hKcaF/zgbKWbUvaDfic7ZkDz99pe/XuIoyaSPoEcK3tTwyMHQI8Nc0+I/qjxiUqJK1F6X2zAfAHYHYKDEfqCso2/HMo/Ua+P/aEpA0o57JEjIykixhfjp4CvE3Seyj//zcA1gN+2lF4USFJewE7Uc6k0th4zkMbnuoSnObMj/OBq4AbKOueJ0ra3fYlnQbXX+8FZks6GXgA2GHguX2Bn3QSVdTk1AmPT+kkighA0tHAW4GzKTd/nwUOAL7SZVx9U90SlaSfASfYPntgbF/gX21v211k/SZpdcrutatt3zkwvhlwp+00+4uIKki6Adjd9uWS7rA9VdJ2wFG29+o6vr6oMcFZRCkwfHBgLGdRRVRE0q7A1sDDWhTY/mA3EUVNJC22vWbz+/mUTRj3D47HY1fdEhVwDaUO5EsDY/tQOutGRM9J+hTwKuAC0nckujFH0ha2r6C0z3hbc/OdWtAhqnEG5/nAecDVlBqcjYGnAnvYvrjD0CKiBZIWAlvbntd1LFEnSf8E3GX7QknbA2dRZhMPTmf34akuwYGHdlGNtWn/A/Ad27d3G1VEtEHS1cCzB2vBIroiaV3KxosrbV/ZdTx9Uk2C0zT4m/iH1cCYbadVe0TPSfpnyg3OR4HbBp+zfV0nQUUVmrYYnwQ2By4BPg5cSNldOhV43eAGmHhsakpw3rSMpzagnEmzqu1VWwwpIjogaVkH7dr2Cq0GE1VpjmaYD3yN0iJjZ+AQ29+Q9DLgw7a36jLGPqkmwZlI0jrAEcBbKL0HjrV9U7dRRUREXzX1X0+yfZ+kVSlNTld280GcXVTDVd1p4pLWkPRh4FpK99JtbB+U5CaiLpJmSHpu13FEVVayfR+A7XsoPcAGZxm09B+L/49qtolLegJwGHA45UTxHZotehFREUkzgS9T+uAYeKKkvYHdbL+50+Ci71aU9I+MJzITH2eJdIiqWaKSdCvlxfPvwC+X9j22f9hqUBHROknfAS4CjgcW2l5L0prAZbY36ja66DNJc1lys8vD2N6knWj6r6YEZy7Lf2HZ9lNaCiciOtLUQUy3/aCk222v3YzfYXtqx+FFxJBUs0Rle+OuY4iISeE2YBal2ScAkjYHbuwsoogYuuqKjCOieh8HzpP0RkoNxP6UnZT/1m1YETFM1SxRRUSMkfRy4CBgI2AecLLtb3YbVUQMUxKciIiI6J1qanAiol6SDnw032f786OOJSLakRmciOi95iy6R2LbLxp5MBHRiiQ4ERGAJDlviBG9kV1UEVEVSe9axlOntRpIRIxUEpyIqM3rJb1p7IGKs4ANO4wpIoYsRcYRUZvdgB9JuhM4l3Iu1WrAnp1GFRFDlRqciKiOpI0oh+7eBCwA9rH9106DioihSoITEb23jG3iWwAHAB8C7odsE4/okyQ4EdF72SYeUZ8kOBEREdE72UUVEVWRtKukp00Ye5qkXbqKKSKGLwlORNTm08CdE8buasYjoieyRBURVZG02PaaE8YELLa9RkdhRcSQZQYnImpznaSJxcQvBK7vIJaIGJE0+ouI2nwI+Lqk04A5wKbAG5uviOiJLFFFRHUkbQccCMwA5gGn2f5Ft1FFxDAlwYmIiIjeSQ1ORFRF0iqSjpN0naTFzdiukt7RdWwRMTxJcCKiNicAWwKvBsamsK8A3tZZRBExdFmiioiqSLoFmGX7bkm32167Gb/D9tSOw4uIIckMTkTU5j4m7CCVNB1Y2E04ETEKSXAiojZfBc6QtAmApCcBnwLO7jSqiBiqJDgRUZsjgbnA74CpwDXAzcCxHcYUEUOWGpyIqIKkmROGpgDTgAXAgwC2b2w7rogYjSQ4EVEFSQ8yvmvqoeFmTIBtr9B6YBExElmiiohaXEZZjjoK2BhYGVhpwq8R0RNJcCKiCra3BvYG1gZ+DHwb2A9Y2fYDth/oMr6IGK4sUUVEdSRNAXYB3gC8FHiR7V91GlREDFVmcCKiRk8FdgKeB/waWNRtOBExbCs+8rdERDz+SVob2B94PbA68AVgx+yciuinLFFFRBUk/QW4npLY/HRp32P7h60GFREjkwQnIqogaS5LbhMfZNtPaSmciBixJDgRERHROykyjoiIiN5JghMRERG9kwQnIiIieicJTkRERPTO/wHb5yGnKswChQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "figsize(8, 7)\n", "den = dendrogram(link, labels=grouped.index, color_threshold=4000)#<-change this to change the depth of the clustering\n", "plt.xticks(rotation=90)\n", "no_spine = {'left': True, 'bottom': True, 'right': True, 'top': True}\n", "sns.despine(**no_spine);\n", "\n", "plt.tight_layout()\n", "plt.savefig('tree1.png');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this formula, we define the dendogram by using the link which was defined before. If you adjust the color_threshhold, you are able to increase/decrease the depth of the clustering. " ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "defaultdict(, {'#8000ff': [2, 3, 1, 9, 10, 8, 7, 6, 5, 4], '#4856fb': [11, 12], '#10a2f0': [14, 15, 13], 'C0': [0]})\n" ] }, { "data": { "text/html": [ "
#8000ff['Brandenburg', 'Schleswig_Holstein', 'Sachsen', 'Berlin', 'Thüringen', 'Mecklenburg_Vorpommern', 'Saarland', 'Hamburg', 'Bremen', 'Sachsen_Anhalt']
#4856fb['Hessen', 'Rheinland_Pfalz']
#10a2f0['Bayern', 'Niedersachsen', 'Baden_Württemberg']
C0['Nordrhein_Westfalen']
" ], "text/plain": [ "{'#8000ff': ['Brandenburg',\n", " 'Schleswig_Holstein',\n", " 'Sachsen',\n", " 'Berlin',\n", " 'Thüringen',\n", " 'Mecklenburg_Vorpommern',\n", " 'Saarland',\n", " 'Hamburg',\n", " 'Bremen',\n", " 'Sachsen_Anhalt'],\n", " '#4856fb': ['Hessen', 'Rheinland_Pfalz'],\n", " '#10a2f0': ['Bayern', 'Niedersachsen', 'Baden_Württemberg'],\n", " 'C0': ['Nordrhein_Westfalen']}" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_cluster_classes(den)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now you can extract the clusters from the HTML body. The clusters are named after the corrosponding colors." ] }, { "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.8.3" } }, "nbformat": 4, "nbformat_minor": 1 }