Switch to side-by-side view

--- a
+++ b/Production/Densenet169-folds.ipynb
@@ -0,0 +1,7712 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/home/reina/anaconda3/envs/RSNA/lib/python3.6/importlib/_bootstrap.py:219: ImportWarning: can't resolve package from __spec__ or __package__, falling back on __name__ and __path__\n",
+      "  return f(*args, **kwds)\n",
+      "/home/reina/anaconda3/envs/RSNA/lib/python3.6/importlib/_bootstrap.py:219: ImportWarning: can't resolve package from __spec__ or __package__, falling back on __name__ and __path__\n",
+      "  return f(*args, **kwds)\n"
+     ]
+    }
+   ],
+   "source": [
+    "from __future__ import absolute_import\n",
+    "from __future__ import division\n",
+    "from __future__ import print_function\n",
+    "\n",
+    "\n",
+    "import numpy as np # linear algebra\n",
+    "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
+    "import os\n",
+    "import datetime\n",
+    "import seaborn as sns\n",
+    "import pydicom\n",
+    "import time\n",
+    "import gc\n",
+    "import operator \n",
+    "from apex import amp \n",
+    "import matplotlib.pyplot as plt\n",
+    "import torch\n",
+    "import torch.nn as nn\n",
+    "import torch.utils.data as D\n",
+    "import torch.nn.functional as F\n",
+    "from sklearn.model_selection import KFold\n",
+    "from tqdm import tqdm, tqdm_notebook\n",
+    "from IPython.core.interactiveshell import InteractiveShell\n",
+    "InteractiveShell.ast_node_interactivity = \"all\"\n",
+    "import warnings\n",
+    "warnings.filterwarnings(action='once')\n",
+    "import pickle\n",
+    "%load_ext autoreload\n",
+    "%autoreload 2\n",
+    "%matplotlib inline\n",
+    "from skimage.io import imread,imshow\n",
+    "from helper import *\n",
+    "from apex import amp\n",
+    "import helper\n",
+    "import torchvision.models as models\n",
+    "from torch.optim import Adam\n",
+    "from defenitions import *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "SEED = 8153\n",
+    "#device=device_by_name(\"Tesla\")\n",
+    "device=device_by_name(\"RTX\")\n",
+    "#device = \"cpu\"\n",
+    "torch.cuda.set_device(device)\n",
+    "sendmeemail=Email_Progress(my_gmail,my_pass,to_email,'Densenet169-folds0 results')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def get_submission(test_df,pred,do_sigmoid=True):\n",
+    "    if do_sigmoid:\n",
+    "        func = lambda x:torch.sigmoid(x)\n",
+    "    else:\n",
+    "        func = lambda x:x\n",
+    "    epidural_df=pd.DataFrame(data={'ID':'ID_'+test_df.PatientID.values+'_epidural','Label':func(pred[:,0])})\n",
+    "    intraparenchymal_df=pd.DataFrame(data={'ID':'ID_'+test_df.PatientID.values+'_intraparenchymal','Label':func(pred[:,1])})\n",
+    "    intraventricular_df=pd.DataFrame(data={'ID':'ID_'+test_df.PatientID.values+'_intraventricular','Label':func(pred[:,2])})\n",
+    "    subarachnoid_df=pd.DataFrame(data={'ID':'ID_'+test_df.PatientID.values+'_subarachnoid','Label':func(pred[:,3])})\n",
+    "    subdural_df=pd.DataFrame(data={'ID':'ID_'+test_df.PatientID.values+'_subdural','Label':func(pred[:,4])})\n",
+    "    any_df=pd.DataFrame(data={'ID':'ID_'+test_df.PatientID.values+'_any','Label':func(pred[:,5])}) \n",
+    "    return pd.concat([epidural_df,\n",
+    "                        intraparenchymal_df,\n",
+    "                        intraventricular_df,\n",
+    "                        subarachnoid_df,\n",
+    "                        subdural_df,\n",
+    "                        any_df]).sort_values('ID').reset_index(drop=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(674510, 15)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(674252, 15)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "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>PatientID</th>\n",
+       "      <th>epidural</th>\n",
+       "      <th>intraparenchymal</th>\n",
+       "      <th>intraventricular</th>\n",
+       "      <th>subarachnoid</th>\n",
+       "      <th>subdural</th>\n",
+       "      <th>any</th>\n",
+       "      <th>PID</th>\n",
+       "      <th>StudyI</th>\n",
+       "      <th>SeriesI</th>\n",
+       "      <th>WindowCenter</th>\n",
+       "      <th>WindowWidth</th>\n",
+       "      <th>ImagePositionZ</th>\n",
+       "      <th>ImagePositionX</th>\n",
+       "      <th>ImagePositionY</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>63eb1e259</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>a449357f</td>\n",
+       "      <td>62d125e5b2</td>\n",
+       "      <td>0be5c0d1b3</td>\n",
+       "      <td>['00036', '00036']</td>\n",
+       "      <td>['00080', '00080']</td>\n",
+       "      <td>180.199951</td>\n",
+       "      <td>-125.0</td>\n",
+       "      <td>-8.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>2669954a7</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>363d5865</td>\n",
+       "      <td>a20b80c7bf</td>\n",
+       "      <td>3564d584db</td>\n",
+       "      <td>['00047', '00047']</td>\n",
+       "      <td>['00080', '00080']</td>\n",
+       "      <td>922.530821</td>\n",
+       "      <td>-156.0</td>\n",
+       "      <td>45.572849</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>52c9913b1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>9c2b4bd7</td>\n",
+       "      <td>3e3634f8cf</td>\n",
+       "      <td>973274ffc9</td>\n",
+       "      <td>40</td>\n",
+       "      <td>150</td>\n",
+       "      <td>4.455000</td>\n",
+       "      <td>-125.0</td>\n",
+       "      <td>-115.063000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>4e6ff6126</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>3ae81c2d</td>\n",
+       "      <td>a1390c15c2</td>\n",
+       "      <td>e5ccad8244</td>\n",
+       "      <td>['00036', '00036']</td>\n",
+       "      <td>['00080', '00080']</td>\n",
+       "      <td>100.000000</td>\n",
+       "      <td>-99.5</td>\n",
+       "      <td>28.500000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>7858edd88</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>c1867feb</td>\n",
+       "      <td>c73e81ed3a</td>\n",
+       "      <td>28e0531b3a</td>\n",
+       "      <td>40</td>\n",
+       "      <td>100</td>\n",
+       "      <td>145.793000</td>\n",
+       "      <td>-125.0</td>\n",
+       "      <td>-132.190000</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   PatientID  epidural  intraparenchymal  intraventricular  subarachnoid  \\\n",
+       "0  63eb1e259         0                 0                 0             0   \n",
+       "1  2669954a7         0                 0                 0             0   \n",
+       "2  52c9913b1         0                 0                 0             0   \n",
+       "3  4e6ff6126         0                 0                 0             0   \n",
+       "4  7858edd88         0                 0                 0             0   \n",
+       "\n",
+       "   subdural  any       PID      StudyI     SeriesI        WindowCenter  \\\n",
+       "0         0    0  a449357f  62d125e5b2  0be5c0d1b3  ['00036', '00036']   \n",
+       "1         0    0  363d5865  a20b80c7bf  3564d584db  ['00047', '00047']   \n",
+       "2         0    0  9c2b4bd7  3e3634f8cf  973274ffc9                  40   \n",
+       "3         0    0  3ae81c2d  a1390c15c2  e5ccad8244  ['00036', '00036']   \n",
+       "4         0    0  c1867feb  c73e81ed3a  28e0531b3a                  40   \n",
+       "\n",
+       "          WindowWidth  ImagePositionZ  ImagePositionX  ImagePositionY  \n",
+       "0  ['00080', '00080']      180.199951          -125.0       -8.000000  \n",
+       "1  ['00080', '00080']      922.530821          -156.0       45.572849  \n",
+       "2                 150        4.455000          -125.0     -115.063000  \n",
+       "3  ['00080', '00080']      100.000000           -99.5       28.500000  \n",
+       "4                 100      145.793000          -125.0     -132.190000  "
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "train_df = pd.read_csv(data_dir+'train.csv')\n",
+    "train_df.shape\n",
+    "train_df=train_df[~train_df.PatientID.isin(bad_images)].reset_index(drop=True)\n",
+    "train_df=train_df.drop_duplicates().reset_index(drop=True)\n",
+    "train_df.shape\n",
+    "train_df.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "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>PatientID</th>\n",
+       "      <th>epidural</th>\n",
+       "      <th>intraparenchymal</th>\n",
+       "      <th>intraventricular</th>\n",
+       "      <th>subarachnoid</th>\n",
+       "      <th>subdural</th>\n",
+       "      <th>any</th>\n",
+       "      <th>SeriesI</th>\n",
+       "      <th>PID</th>\n",
+       "      <th>StudyI</th>\n",
+       "      <th>WindowCenter</th>\n",
+       "      <th>WindowWidth</th>\n",
+       "      <th>ImagePositionZ</th>\n",
+       "      <th>ImagePositionX</th>\n",
+       "      <th>ImagePositionY</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>28fbab7eb</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>ebfd7e4506</td>\n",
+       "      <td>cf1b6b11</td>\n",
+       "      <td>93407cadbb</td>\n",
+       "      <td>30</td>\n",
+       "      <td>80</td>\n",
+       "      <td>158.458000</td>\n",
+       "      <td>-125.0</td>\n",
+       "      <td>-135.598000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>877923b8b</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>6d95084e15</td>\n",
+       "      <td>ad8ea58f</td>\n",
+       "      <td>a337baa067</td>\n",
+       "      <td>30</td>\n",
+       "      <td>80</td>\n",
+       "      <td>138.729050</td>\n",
+       "      <td>-125.0</td>\n",
+       "      <td>-101.797981</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>a591477cb</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>8e06b2c9e0</td>\n",
+       "      <td>ecfb278b</td>\n",
+       "      <td>0cfe838d54</td>\n",
+       "      <td>30</td>\n",
+       "      <td>80</td>\n",
+       "      <td>60.830002</td>\n",
+       "      <td>-125.0</td>\n",
+       "      <td>-133.300003</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>42217c898</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>e800f419cf</td>\n",
+       "      <td>e96e31f4</td>\n",
+       "      <td>c497ac5bad</td>\n",
+       "      <td>30</td>\n",
+       "      <td>80</td>\n",
+       "      <td>55.388000</td>\n",
+       "      <td>-125.0</td>\n",
+       "      <td>-146.081000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>a130c4d2f</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.5</td>\n",
+       "      <td>faeb7454f3</td>\n",
+       "      <td>69affa42</td>\n",
+       "      <td>854e4fbc01</td>\n",
+       "      <td>30</td>\n",
+       "      <td>80</td>\n",
+       "      <td>33.516888</td>\n",
+       "      <td>-125.0</td>\n",
+       "      <td>-118.689819</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   PatientID  epidural  intraparenchymal  intraventricular  subarachnoid  \\\n",
+       "0  28fbab7eb       0.5               0.5               0.5           0.5   \n",
+       "1  877923b8b       0.5               0.5               0.5           0.5   \n",
+       "2  a591477cb       0.5               0.5               0.5           0.5   \n",
+       "3  42217c898       0.5               0.5               0.5           0.5   \n",
+       "4  a130c4d2f       0.5               0.5               0.5           0.5   \n",
+       "\n",
+       "   subdural  any     SeriesI       PID      StudyI WindowCenter WindowWidth  \\\n",
+       "0       0.5  0.5  ebfd7e4506  cf1b6b11  93407cadbb           30          80   \n",
+       "1       0.5  0.5  6d95084e15  ad8ea58f  a337baa067           30          80   \n",
+       "2       0.5  0.5  8e06b2c9e0  ecfb278b  0cfe838d54           30          80   \n",
+       "3       0.5  0.5  e800f419cf  e96e31f4  c497ac5bad           30          80   \n",
+       "4       0.5  0.5  faeb7454f3  69affa42  854e4fbc01           30          80   \n",
+       "\n",
+       "   ImagePositionZ  ImagePositionX  ImagePositionY  \n",
+       "0      158.458000          -125.0     -135.598000  \n",
+       "1      138.729050          -125.0     -101.797981  \n",
+       "2       60.830002          -125.0     -133.300003  \n",
+       "3       55.388000          -125.0     -146.081000  \n",
+       "4       33.516888          -125.0     -118.689819  "
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "test_df = pd.read_csv(data_dir+'test.csv')\n",
+    "test_df.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "split_sid = train_df.PID.unique()\n",
+    "splits=list(KFold(n_splits=3,shuffle=True, random_state=SEED).split(split_sid))\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "pickle_file=open(outputs_dir+\"PID_splits.pkl\",'wb')\n",
+    "pickle.dump((split_sid,splits),pickle_file,protocol=4)\n",
+    "pickle_file.close()\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def my_loss(y_pred,y_true,weights):\n",
+    "    if len(y_pred.shape)==len(y_true.shape):\n",
+    "        loss = F.binary_cross_entropy_with_logits(y_pred,y_true,weights.repeat(y_pred.shape[0],1))\n",
+    "    else:\n",
+    "        loss0 = F.binary_cross_entropy_with_logits(y_pred,y_true[...,0],weights.repeat(y_pred.shape[0],1),reduction='none')\n",
+    "        loss1 = F.binary_cross_entropy_with_logits(y_pred,y_true[...,1],weights.repeat(y_pred.shape[0],1),reduction='none')\n",
+    "        loss = (y_true[...,2]*loss0+(1.0-y_true[...,2])*loss1).mean() \n",
+    "    return loss"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "class parameter_scheduler():\n",
+    "    def __init__(self,model,do_first=['classifier'],num_epoch=1):\n",
+    "        self.model=model\n",
+    "        self.do_first = do_first\n",
+    "        self.num_epoch=num_epoch\n",
+    "    def __call__(self,epoch):\n",
+    "        if epoch>=self.num_epoch:\n",
+    "            for n,p in self.model.named_parameters():\n",
+    "                p.requires_grad=True\n",
+    "        else:\n",
+    "            for n,p in self.model.named_parameters():\n",
+    "                p.requires_grad= any(nd in n for nd in self.do_first)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def get_optimizer_parameters(model,klr):\n",
+    "    zero_layer=['conv0','norm0','ws_norm']\n",
+    "    param_optimizer = list(model.named_parameters())\n",
+    "    num_blocks=4\n",
+    "    no_decay=['bias']\n",
+    "    optimizer_grouped_parameters=[\n",
+    "        {'params': [p for n, p in param_optimizer if (not any(nd in n for nd in no_decay) and any(nd in n for nd in zero_layer))], 'lr':klr*2e-5,'weight_decay': 0.01},\n",
+    "        {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)  and any(nd in n for nd in zero_layer)], 'lr':klr*2e-5, 'weight_decay': 0.0}\n",
+    "        ]\n",
+    "    optimizer_grouped_parameters.extend([\n",
+    "        {'params': [p for n, p in param_optimizer if (not any(nd in n for nd in no_decay) and ('wso' in n))], 'lr':klr*1e-5,'weight_decay': 0.01},\n",
+    "        {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)  and ('wso' in n)], 'lr':klr*1e-5, 'weight_decay': 0.0}\n",
+    "        ])\n",
+    "    optimizer_grouped_parameters.extend([\n",
+    "        {'params': [p for n, p in param_optimizer if (not any(nd in n for nd in no_decay) and ('classifier' in n))], 'lr':klr*1e-3,'weight_decay': 0.01},\n",
+    "        {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)  and ('classifier' in n)], 'lr':klr*1e-3, 'weight_decay': 0.0}\n",
+    "        ])\n",
+    "    for i in range(num_blocks):\n",
+    "        optimizer_grouped_parameters.extend([\n",
+    "        {'params': [p for n, p in param_optimizer if (not any(nd in n for nd in no_decay) and ('denseblock{}'.format(i+1) in n))], 'lr':klr*(2.0**i)*2e-5,'weight_decay': 0.01},\n",
+    "        {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)  and ('denseblock{}'.format(i+1) in n)], 'lr':klr*(2.0**i)*2e-5, 'weight_decay': 0.0}\n",
+    "        ])\n",
+    "    optimizer_grouped_parameters.extend([\n",
+    "        {'params': [p for n, p in param_optimizer if (not any(nd in n for nd in no_decay) and ('norm5' in n))], 'lr':klr*1e-4,'weight_decay': 0.01},\n",
+    "        {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)  and ('norm5' in n)], 'lr':klr*1e-4, 'weight_decay': 0.0}\n",
+    "        ])\n",
+    "    return(optimizer_grouped_parameters)\n",
+    "\n",
+    "    "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<torch._C.Generator at 0x7fe53c62a630>"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(449982,)"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(224270,)"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "/* Put everything inside the global mpl namespace */\n",
+       "window.mpl = {};\n",
+       "\n",
+       "\n",
+       "mpl.get_websocket_type = function() {\n",
+       "    if (typeof(WebSocket) !== 'undefined') {\n",
+       "        return WebSocket;\n",
+       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+       "        return MozWebSocket;\n",
+       "    } else {\n",
+       "        alert('Your browser does not have WebSocket support.' +\n",
+       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+       "              'Firefox 4 and 5 are also supported but you ' +\n",
+       "              'have to enable WebSockets in about:config.');\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+       "    this.id = figure_id;\n",
+       "\n",
+       "    this.ws = websocket;\n",
+       "\n",
+       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
+       "\n",
+       "    if (!this.supports_binary) {\n",
+       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
+       "        if (warnings) {\n",
+       "            warnings.style.display = 'block';\n",
+       "            warnings.textContent = (\n",
+       "                \"This browser does not support binary websocket messages. \" +\n",
+       "                    \"Performance may be slow.\");\n",
+       "        }\n",
+       "    }\n",
+       "\n",
+       "    this.imageObj = new Image();\n",
+       "\n",
+       "    this.context = undefined;\n",
+       "    this.message = undefined;\n",
+       "    this.canvas = undefined;\n",
+       "    this.rubberband_canvas = undefined;\n",
+       "    this.rubberband_context = undefined;\n",
+       "    this.format_dropdown = undefined;\n",
+       "\n",
+       "    this.image_mode = 'full';\n",
+       "\n",
+       "    this.root = $('<div/>');\n",
+       "    this._root_extra_style(this.root)\n",
+       "    this.root.attr('style', 'display: inline-block');\n",
+       "\n",
+       "    $(parent_element).append(this.root);\n",
+       "\n",
+       "    this._init_header(this);\n",
+       "    this._init_canvas(this);\n",
+       "    this._init_toolbar(this);\n",
+       "\n",
+       "    var fig = this;\n",
+       "\n",
+       "    this.waiting = false;\n",
+       "\n",
+       "    this.ws.onopen =  function () {\n",
+       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+       "            fig.send_message(\"send_image_mode\", {});\n",
+       "            if (mpl.ratio != 1) {\n",
+       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+       "            }\n",
+       "            fig.send_message(\"refresh\", {});\n",
+       "        }\n",
+       "\n",
+       "    this.imageObj.onload = function() {\n",
+       "            if (fig.image_mode == 'full') {\n",
+       "                // Full images could contain transparency (where diff images\n",
+       "                // almost always do), so we need to clear the canvas so that\n",
+       "                // there is no ghosting.\n",
+       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "            }\n",
+       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
+       "        };\n",
+       "\n",
+       "    this.imageObj.onunload = function() {\n",
+       "        fig.ws.close();\n",
+       "    }\n",
+       "\n",
+       "    this.ws.onmessage = this._make_on_message_function(this);\n",
+       "\n",
+       "    this.ondownload = ondownload;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_header = function() {\n",
+       "    var titlebar = $(\n",
+       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
+       "        'ui-helper-clearfix\"/>');\n",
+       "    var titletext = $(\n",
+       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
+       "        'text-align: center; padding: 3px;\"/>');\n",
+       "    titlebar.append(titletext)\n",
+       "    this.root.append(titlebar);\n",
+       "    this.header = titletext[0];\n",
+       "}\n",
+       "\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_canvas = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var canvas_div = $('<div/>');\n",
+       "\n",
+       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+       "\n",
+       "    function canvas_keyboard_event(event) {\n",
+       "        return fig.key_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+       "    this.canvas_div = canvas_div\n",
+       "    this._canvas_extra_style(canvas_div)\n",
+       "    this.root.append(canvas_div);\n",
+       "\n",
+       "    var canvas = $('<canvas/>');\n",
+       "    canvas.addClass('mpl-canvas');\n",
+       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+       "\n",
+       "    this.canvas = canvas[0];\n",
+       "    this.context = canvas[0].getContext(\"2d\");\n",
+       "\n",
+       "    var backingStore = this.context.backingStorePixelRatio ||\n",
+       "\tthis.context.webkitBackingStorePixelRatio ||\n",
+       "\tthis.context.mozBackingStorePixelRatio ||\n",
+       "\tthis.context.msBackingStorePixelRatio ||\n",
+       "\tthis.context.oBackingStorePixelRatio ||\n",
+       "\tthis.context.backingStorePixelRatio || 1;\n",
+       "\n",
+       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+       "\n",
+       "    var rubberband = $('<canvas/>');\n",
+       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+       "\n",
+       "    var pass_mouse_events = true;\n",
+       "\n",
+       "    canvas_div.resizable({\n",
+       "        start: function(event, ui) {\n",
+       "            pass_mouse_events = false;\n",
+       "        },\n",
+       "        resize: function(event, ui) {\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "        stop: function(event, ui) {\n",
+       "            pass_mouse_events = true;\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "    });\n",
+       "\n",
+       "    function mouse_event_fn(event) {\n",
+       "        if (pass_mouse_events)\n",
+       "            return fig.mouse_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
+       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
+       "    // Throttle sequential mouse events to 1 every 20ms.\n",
+       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+       "\n",
+       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+       "\n",
+       "    canvas_div.on(\"wheel\", function (event) {\n",
+       "        event = event.originalEvent;\n",
+       "        event['data'] = 'scroll'\n",
+       "        if (event.deltaY < 0) {\n",
+       "            event.step = 1;\n",
+       "        } else {\n",
+       "            event.step = -1;\n",
+       "        }\n",
+       "        mouse_event_fn(event);\n",
+       "    });\n",
+       "\n",
+       "    canvas_div.append(canvas);\n",
+       "    canvas_div.append(rubberband);\n",
+       "\n",
+       "    this.rubberband = rubberband;\n",
+       "    this.rubberband_canvas = rubberband[0];\n",
+       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
+       "\n",
+       "    this._resize_canvas = function(width, height) {\n",
+       "        // Keep the size of the canvas, canvas container, and rubber band\n",
+       "        // canvas in synch.\n",
+       "        canvas_div.css('width', width)\n",
+       "        canvas_div.css('height', height)\n",
+       "\n",
+       "        canvas.attr('width', width * mpl.ratio);\n",
+       "        canvas.attr('height', height * mpl.ratio);\n",
+       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+       "\n",
+       "        rubberband.attr('width', width);\n",
+       "        rubberband.attr('height', height);\n",
+       "    }\n",
+       "\n",
+       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+       "    // upon first draw.\n",
+       "    this._resize_canvas(600, 600);\n",
+       "\n",
+       "    // Disable right mouse context menu.\n",
+       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+       "        return false;\n",
+       "    });\n",
+       "\n",
+       "    function set_focus () {\n",
+       "        canvas.focus();\n",
+       "        canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    window.setTimeout(set_focus, 100);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) {\n",
+       "            // put a spacer in here.\n",
+       "            continue;\n",
+       "        }\n",
+       "        var button = $('<button/>');\n",
+       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+       "                        'ui-button-icon-only');\n",
+       "        button.attr('role', 'button');\n",
+       "        button.attr('aria-disabled', 'false');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "\n",
+       "        var icon_img = $('<span/>');\n",
+       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+       "        icon_img.addClass(image);\n",
+       "        icon_img.addClass('ui-corner-all');\n",
+       "\n",
+       "        var tooltip_span = $('<span/>');\n",
+       "        tooltip_span.addClass('ui-button-text');\n",
+       "        tooltip_span.html(tooltip);\n",
+       "\n",
+       "        button.append(icon_img);\n",
+       "        button.append(tooltip_span);\n",
+       "\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    var fmt_picker_span = $('<span/>');\n",
+       "\n",
+       "    var fmt_picker = $('<select/>');\n",
+       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+       "    fmt_picker_span.append(fmt_picker);\n",
+       "    nav_element.append(fmt_picker_span);\n",
+       "    this.format_dropdown = fmt_picker[0];\n",
+       "\n",
+       "    for (var ind in mpl.extensions) {\n",
+       "        var fmt = mpl.extensions[ind];\n",
+       "        var option = $(\n",
+       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+       "        fmt_picker.append(option)\n",
+       "    }\n",
+       "\n",
+       "    // Add hover states to the ui-buttons\n",
+       "    $( \".ui-button\" ).hover(\n",
+       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
+       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
+       "    );\n",
+       "\n",
+       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+       "    // which will in turn request a refresh of the image.\n",
+       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_message = function(type, properties) {\n",
+       "    properties['type'] = type;\n",
+       "    properties['figure_id'] = this.id;\n",
+       "    this.ws.send(JSON.stringify(properties));\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_draw_message = function() {\n",
+       "    if (!this.waiting) {\n",
+       "        this.waiting = true;\n",
+       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    var format_dropdown = fig.format_dropdown;\n",
+       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+       "    fig.ondownload(fig, format);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+       "    var size = msg['size'];\n",
+       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+       "        fig._resize_canvas(size[0], size[1]);\n",
+       "        fig.send_message(\"refresh\", {});\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+       "    var x0 = msg['x0'] / mpl.ratio;\n",
+       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+       "    var x1 = msg['x1'] / mpl.ratio;\n",
+       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+       "    x0 = Math.floor(x0) + 0.5;\n",
+       "    y0 = Math.floor(y0) + 0.5;\n",
+       "    x1 = Math.floor(x1) + 0.5;\n",
+       "    y1 = Math.floor(y1) + 0.5;\n",
+       "    var min_x = Math.min(x0, x1);\n",
+       "    var min_y = Math.min(y0, y1);\n",
+       "    var width = Math.abs(x1 - x0);\n",
+       "    var height = Math.abs(y1 - y0);\n",
+       "\n",
+       "    fig.rubberband_context.clearRect(\n",
+       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "\n",
+       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+       "    // Updates the figure title.\n",
+       "    fig.header.textContent = msg['label'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+       "    var cursor = msg['cursor'];\n",
+       "    switch(cursor)\n",
+       "    {\n",
+       "    case 0:\n",
+       "        cursor = 'pointer';\n",
+       "        break;\n",
+       "    case 1:\n",
+       "        cursor = 'default';\n",
+       "        break;\n",
+       "    case 2:\n",
+       "        cursor = 'crosshair';\n",
+       "        break;\n",
+       "    case 3:\n",
+       "        cursor = 'move';\n",
+       "        break;\n",
+       "    }\n",
+       "    fig.rubberband_canvas.style.cursor = cursor;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+       "    fig.message.textContent = msg['message'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+       "    // Request the server to send over a new figure.\n",
+       "    fig.send_draw_message();\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+       "    fig.image_mode = msg['mode'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Called whenever the canvas gets updated.\n",
+       "    this.send_message(\"ack\", {});\n",
+       "}\n",
+       "\n",
+       "// A function to construct a web socket function for onmessage handling.\n",
+       "// Called in the figure constructor.\n",
+       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+       "    return function socket_on_message(evt) {\n",
+       "        if (evt.data instanceof Blob) {\n",
+       "            /* FIXME: We get \"Resource interpreted as Image but\n",
+       "             * transferred with MIME type text/plain:\" errors on\n",
+       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
+       "             * to be part of the websocket stream */\n",
+       "            evt.data.type = \"image/png\";\n",
+       "\n",
+       "            /* Free the memory for the previous frames */\n",
+       "            if (fig.imageObj.src) {\n",
+       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
+       "                    fig.imageObj.src);\n",
+       "            }\n",
+       "\n",
+       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+       "                evt.data);\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+       "            fig.imageObj.src = evt.data;\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        var msg = JSON.parse(evt.data);\n",
+       "        var msg_type = msg['type'];\n",
+       "\n",
+       "        // Call the  \"handle_{type}\" callback, which takes\n",
+       "        // the figure and JSON message as its only arguments.\n",
+       "        try {\n",
+       "            var callback = fig[\"handle_\" + msg_type];\n",
+       "        } catch (e) {\n",
+       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        if (callback) {\n",
+       "            try {\n",
+       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+       "                callback(fig, msg);\n",
+       "            } catch (e) {\n",
+       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+       "            }\n",
+       "        }\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+       "mpl.findpos = function(e) {\n",
+       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+       "    var targ;\n",
+       "    if (!e)\n",
+       "        e = window.event;\n",
+       "    if (e.target)\n",
+       "        targ = e.target;\n",
+       "    else if (e.srcElement)\n",
+       "        targ = e.srcElement;\n",
+       "    if (targ.nodeType == 3) // defeat Safari bug\n",
+       "        targ = targ.parentNode;\n",
+       "\n",
+       "    // jQuery normalizes the pageX and pageY\n",
+       "    // pageX,Y are the mouse positions relative to the document\n",
+       "    // offset() returns the position of the element relative to the document\n",
+       "    var x = e.pageX - $(targ).offset().left;\n",
+       "    var y = e.pageY - $(targ).offset().top;\n",
+       "\n",
+       "    return {\"x\": x, \"y\": y};\n",
+       "};\n",
+       "\n",
+       "/*\n",
+       " * return a copy of an object with only non-object keys\n",
+       " * we need this to avoid circular references\n",
+       " * http://stackoverflow.com/a/24161582/3208463\n",
+       " */\n",
+       "function simpleKeys (original) {\n",
+       "  return Object.keys(original).reduce(function (obj, key) {\n",
+       "    if (typeof original[key] !== 'object')\n",
+       "        obj[key] = original[key]\n",
+       "    return obj;\n",
+       "  }, {});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+       "    var canvas_pos = mpl.findpos(event)\n",
+       "\n",
+       "    if (name === 'button_press')\n",
+       "    {\n",
+       "        this.canvas.focus();\n",
+       "        this.canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    var x = canvas_pos.x * mpl.ratio;\n",
+       "    var y = canvas_pos.y * mpl.ratio;\n",
+       "\n",
+       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
+       "                             step: event.step,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "\n",
+       "    /* This prevents the web browser from automatically changing to\n",
+       "     * the text insertion cursor when the button is pressed.  We want\n",
+       "     * to control all of the cursor setting manually through the\n",
+       "     * 'cursor' event from matplotlib */\n",
+       "    event.preventDefault();\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    // Handle any extra behaviour associated with a key event\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.key_event = function(event, name) {\n",
+       "\n",
+       "    // Prevent repeat events\n",
+       "    if (name == 'key_press')\n",
+       "    {\n",
+       "        if (event.which === this._key)\n",
+       "            return;\n",
+       "        else\n",
+       "            this._key = event.which;\n",
+       "    }\n",
+       "    if (name == 'key_release')\n",
+       "        this._key = null;\n",
+       "\n",
+       "    var value = '';\n",
+       "    if (event.ctrlKey && event.which != 17)\n",
+       "        value += \"ctrl+\";\n",
+       "    if (event.altKey && event.which != 18)\n",
+       "        value += \"alt+\";\n",
+       "    if (event.shiftKey && event.which != 16)\n",
+       "        value += \"shift+\";\n",
+       "\n",
+       "    value += 'k';\n",
+       "    value += event.which.toString();\n",
+       "\n",
+       "    this._key_event_extra(event, name);\n",
+       "\n",
+       "    this.send_message(name, {key: value,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+       "    if (name == 'download') {\n",
+       "        this.handle_save(this, null);\n",
+       "    } else {\n",
+       "        this.send_message(\"toolbar_button\", {name: name});\n",
+       "    }\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+       "    this.message.textContent = tooltip;\n",
+       "};\n",
+       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+       "\n",
+       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+       "\n",
+       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
+       "    // object with the appropriate methods. Currently this is a non binary\n",
+       "    // socket, so there is still some room for performance tuning.\n",
+       "    var ws = {};\n",
+       "\n",
+       "    ws.close = function() {\n",
+       "        comm.close()\n",
+       "    };\n",
+       "    ws.send = function(m) {\n",
+       "        //console.log('sending', m);\n",
+       "        comm.send(m);\n",
+       "    };\n",
+       "    // Register the callback with on_msg.\n",
+       "    comm.on_msg(function(msg) {\n",
+       "        //console.log('receiving', msg['content']['data'], msg);\n",
+       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+       "        ws.onmessage(msg['content']['data'])\n",
+       "    });\n",
+       "    return ws;\n",
+       "}\n",
+       "\n",
+       "mpl.mpl_figure_comm = function(comm, msg) {\n",
+       "    // This is the function which gets called when the mpl process\n",
+       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+       "\n",
+       "    var id = msg.content.data.id;\n",
+       "    // Get hold of the div created by the display call when the Comm\n",
+       "    // socket was opened in Python.\n",
+       "    var element = $(\"#\" + id);\n",
+       "    var ws_proxy = comm_websocket_adapter(comm)\n",
+       "\n",
+       "    function ondownload(figure, format) {\n",
+       "        window.open(figure.imageObj.src);\n",
+       "    }\n",
+       "\n",
+       "    var fig = new mpl.figure(id, ws_proxy,\n",
+       "                           ondownload,\n",
+       "                           element.get(0));\n",
+       "\n",
+       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+       "    // web socket which is closed, not our websocket->open comm proxy.\n",
+       "    ws_proxy.onopen();\n",
+       "\n",
+       "    fig.parent_element = element.get(0);\n",
+       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+       "    if (!fig.cell_info) {\n",
+       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
+       "        return;\n",
+       "    }\n",
+       "\n",
+       "    var output_index = fig.cell_info[2]\n",
+       "    var cell = fig.cell_info[0];\n",
+       "\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+       "    var width = fig.canvas.width/mpl.ratio\n",
+       "    fig.root.unbind('remove')\n",
+       "\n",
+       "    // Update the output cell to use the data from the current canvas.\n",
+       "    fig.push_to_output();\n",
+       "    var dataURL = fig.canvas.toDataURL();\n",
+       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+       "    // the notebook keyboard shortcuts fail.\n",
+       "    IPython.keyboard_manager.enable()\n",
+       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
+       "    fig.close_ws(fig, msg);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+       "    fig.send_message('closing', msg);\n",
+       "    // fig.ws.close()\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+       "    // Turn the data on the canvas into data in the output cell.\n",
+       "    var width = this.canvas.width/mpl.ratio\n",
+       "    var dataURL = this.canvas.toDataURL();\n",
+       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Tell IPython that the notebook contents must change.\n",
+       "    IPython.notebook.set_dirty(true);\n",
+       "    this.send_message(\"ack\", {});\n",
+       "    var fig = this;\n",
+       "    // Wait a second, then push the new image to the DOM so\n",
+       "    // that it is saved nicely (might be nice to debounce this).\n",
+       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items){\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) { continue; };\n",
+       "\n",
+       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    // Add the status bar.\n",
+       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "\n",
+       "    // Add the close button to the window.\n",
+       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
+       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
+       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+       "    buttongrp.append(button);\n",
+       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+       "    titlebar.prepend(buttongrp);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(el){\n",
+       "    var fig = this\n",
+       "    el.on(\"remove\", function(){\n",
+       "\tfig.close_ws(fig, {});\n",
+       "    });\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+       "    // this is important to make the div 'focusable\n",
+       "    el.attr('tabindex', 0)\n",
+       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
+       "    // off when our div gets focus\n",
+       "\n",
+       "    // location in version 3\n",
+       "    if (IPython.notebook.keyboard_manager) {\n",
+       "        IPython.notebook.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "    else {\n",
+       "        // location in version 2\n",
+       "        IPython.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    var manager = IPython.notebook.keyboard_manager;\n",
+       "    if (!manager)\n",
+       "        manager = IPython.keyboard_manager;\n",
+       "\n",
+       "    // Check for shift+enter\n",
+       "    if (event.shiftKey && event.which == 13) {\n",
+       "        this.canvas_div.blur();\n",
+       "        event.shiftKey = false;\n",
+       "        // Send a \"J\" for go to next cell\n",
+       "        event.which = 74;\n",
+       "        event.keyCode = 74;\n",
+       "        manager.command_mode();\n",
+       "        manager.handle_keydown(event);\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    fig.ondownload(fig, null);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.find_output_cell = function(html_output) {\n",
+       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+       "    // IPython event is triggered only after the cells have been serialised, which for\n",
+       "    // our purposes (turning an active figure into a static one), is too late.\n",
+       "    var cells = IPython.notebook.get_cells();\n",
+       "    var ncells = cells.length;\n",
+       "    for (var i=0; i<ncells; i++) {\n",
+       "        var cell = cells[i];\n",
+       "        if (cell.cell_type === 'code'){\n",
+       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
+       "                var data = cell.output_area.outputs[j];\n",
+       "                if (data.data) {\n",
+       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
+       "                    data = data.data;\n",
+       "                }\n",
+       "                if (data['text/html'] == html_output) {\n",
+       "                    return [cell, data, j];\n",
+       "                }\n",
+       "            }\n",
+       "        }\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "// Register the function which deals with the matplotlib target/channel.\n",
+       "// The kernel may be null if the page has been refreshed.\n",
+       "if (IPython.notebook.kernel != null) {\n",
+       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+       "}\n"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Javascript object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<img src=\"data:image/png;base64,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\" width=\"720\">"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=2), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=5633), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7009), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.21780084248622414, 'val_loss': 0.11624475680918823}\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=5633), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7009), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.17916381089949246, 'val_loss': 0.11170460123375839}\n",
+      "\n",
+      "0.11170460123375839\n"
+     ]
+    }
+   ],
+   "source": [
+    "%matplotlib nbagg\n",
+    "\n",
+    "num_split=0\n",
+    "np.random.seed(SEED+num_split)\n",
+    "torch.manual_seed(SEED+num_split)\n",
+    "torch.cuda.manual_seed(SEED+num_split)\n",
+    "#torch.backends.cudnn.deterministic = True\n",
+    "idx_train = train_df[train_df.PID.isin(set(split_sid[splits[num_split][0]]))].index.values\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "idx_train.shape\n",
+    "idx_validate.shape\n",
+    "\n",
+    "klr=1\n",
+    "batch_size=32\n",
+    "num_workers=12\n",
+    "num_epochs=2\n",
+    "model_name,version = 'Densenet169_3' , 'basic_splits'\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   )\n",
+    "\n",
+    "_=model.to(device)\n",
+    "weights = torch.tensor([1.,1.,1.,1.,1.,2.],device=device)\n",
+    "loss_func=my_loss\n",
+    "targets_dataset=D.TensorDataset(torch.tensor(train_df[hemorrhage_types].values,dtype=torch.float))\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "imagedataset = ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                           window_eq=False,equalize=False,rescale=True)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "imagedataset_val = ImageDataset(train_df,transform=transform_val.random,base_path=train_images_dir,\n",
+    "                               window_eq=False,equalize=False,rescale=True)\n",
+    "combined_dataset=DatasetCat([imagedataset,targets_dataset])\n",
+    "combined_dataset_val=DatasetCat([imagedataset_val,targets_dataset])\n",
+    "#param_s=parameter_scheduler(model,num_epoch=0)\n",
+    "optimizer_grouped_parameters=get_optimizer_parameters(model,klr)\n",
+    "sampling=sampler(train_df[hemorrhage_types].values[idx_train],0.2,[10,1,1,1,1,0])\n",
+    "sample_ratio=1.02*float(sampling().shape[0])/idx_train.shape[0]\n",
+    "train_dataset=D.Subset(combined_dataset,idx_train)\n",
+    "validate_dataset=D.Subset(combined_dataset_val,idx_validate)\n",
+    "num_train_optimization_steps = num_epochs*(sample_ratio*len(train_dataset)//batch_size+int(len(train_dataset)%batch_size>0))\n",
+    "fig,ax = plt.subplots(figsize=(10,7))\n",
+    "gr=loss_graph(fig,ax,num_epochs,int(num_train_optimization_steps/num_epochs)+1,limits=[0.05,0.4])\n",
+    "sched=WarmupExpCosineWithWarmupRestartsSchedule( t_total=num_train_optimization_steps, cycles=num_epochs//2,tau=1)\n",
+    "optimizer = BertAdam(optimizer_grouped_parameters,lr=klr*1e-3,schedule=sched)\n",
+    "model, optimizer = amp.initialize(model, optimizer, opt_level=\"O1\",verbosity=0)\n",
+    "history,best_model= model_train(model,\n",
+    "                                optimizer,\n",
+    "                                train_dataset,\n",
+    "                                batch_size,\n",
+    "                                num_epochs,\n",
+    "                                loss_func,\n",
+    "                                weights=weights,\n",
+    "                                do_apex=False,\n",
+    "                                model_apexed=True,\n",
+    "                                validate_dataset=validate_dataset,\n",
+    "                                param_schedualer=None,\n",
+    "                                weights_data=None,\n",
+    "                                metric=None,\n",
+    "                                return_model=True,\n",
+    "                                num_workers=num_workers,\n",
+    "                                sampler=sampling,\n",
+    "                                graph=gr,\n",
+    "                                call_progress=sendmeemail)\n",
+    "torch.save(model.state_dict(), models_dir+models_format.format(model_name,version,num_split))\n",
+    "torch.save(best_model.state_dict(), models_dir+models_format.format(model_name,version+'_best',num_split))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<torch._C.Generator at 0x7fe53c62a630>"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(449982,)"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(224270,)"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "/* Put everything inside the global mpl namespace */\n",
+       "window.mpl = {};\n",
+       "\n",
+       "\n",
+       "mpl.get_websocket_type = function() {\n",
+       "    if (typeof(WebSocket) !== 'undefined') {\n",
+       "        return WebSocket;\n",
+       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+       "        return MozWebSocket;\n",
+       "    } else {\n",
+       "        alert('Your browser does not have WebSocket support.' +\n",
+       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+       "              'Firefox 4 and 5 are also supported but you ' +\n",
+       "              'have to enable WebSockets in about:config.');\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+       "    this.id = figure_id;\n",
+       "\n",
+       "    this.ws = websocket;\n",
+       "\n",
+       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
+       "\n",
+       "    if (!this.supports_binary) {\n",
+       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
+       "        if (warnings) {\n",
+       "            warnings.style.display = 'block';\n",
+       "            warnings.textContent = (\n",
+       "                \"This browser does not support binary websocket messages. \" +\n",
+       "                    \"Performance may be slow.\");\n",
+       "        }\n",
+       "    }\n",
+       "\n",
+       "    this.imageObj = new Image();\n",
+       "\n",
+       "    this.context = undefined;\n",
+       "    this.message = undefined;\n",
+       "    this.canvas = undefined;\n",
+       "    this.rubberband_canvas = undefined;\n",
+       "    this.rubberband_context = undefined;\n",
+       "    this.format_dropdown = undefined;\n",
+       "\n",
+       "    this.image_mode = 'full';\n",
+       "\n",
+       "    this.root = $('<div/>');\n",
+       "    this._root_extra_style(this.root)\n",
+       "    this.root.attr('style', 'display: inline-block');\n",
+       "\n",
+       "    $(parent_element).append(this.root);\n",
+       "\n",
+       "    this._init_header(this);\n",
+       "    this._init_canvas(this);\n",
+       "    this._init_toolbar(this);\n",
+       "\n",
+       "    var fig = this;\n",
+       "\n",
+       "    this.waiting = false;\n",
+       "\n",
+       "    this.ws.onopen =  function () {\n",
+       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+       "            fig.send_message(\"send_image_mode\", {});\n",
+       "            if (mpl.ratio != 1) {\n",
+       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+       "            }\n",
+       "            fig.send_message(\"refresh\", {});\n",
+       "        }\n",
+       "\n",
+       "    this.imageObj.onload = function() {\n",
+       "            if (fig.image_mode == 'full') {\n",
+       "                // Full images could contain transparency (where diff images\n",
+       "                // almost always do), so we need to clear the canvas so that\n",
+       "                // there is no ghosting.\n",
+       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "            }\n",
+       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
+       "        };\n",
+       "\n",
+       "    this.imageObj.onunload = function() {\n",
+       "        fig.ws.close();\n",
+       "    }\n",
+       "\n",
+       "    this.ws.onmessage = this._make_on_message_function(this);\n",
+       "\n",
+       "    this.ondownload = ondownload;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_header = function() {\n",
+       "    var titlebar = $(\n",
+       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
+       "        'ui-helper-clearfix\"/>');\n",
+       "    var titletext = $(\n",
+       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
+       "        'text-align: center; padding: 3px;\"/>');\n",
+       "    titlebar.append(titletext)\n",
+       "    this.root.append(titlebar);\n",
+       "    this.header = titletext[0];\n",
+       "}\n",
+       "\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_canvas = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var canvas_div = $('<div/>');\n",
+       "\n",
+       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+       "\n",
+       "    function canvas_keyboard_event(event) {\n",
+       "        return fig.key_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+       "    this.canvas_div = canvas_div\n",
+       "    this._canvas_extra_style(canvas_div)\n",
+       "    this.root.append(canvas_div);\n",
+       "\n",
+       "    var canvas = $('<canvas/>');\n",
+       "    canvas.addClass('mpl-canvas');\n",
+       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+       "\n",
+       "    this.canvas = canvas[0];\n",
+       "    this.context = canvas[0].getContext(\"2d\");\n",
+       "\n",
+       "    var backingStore = this.context.backingStorePixelRatio ||\n",
+       "\tthis.context.webkitBackingStorePixelRatio ||\n",
+       "\tthis.context.mozBackingStorePixelRatio ||\n",
+       "\tthis.context.msBackingStorePixelRatio ||\n",
+       "\tthis.context.oBackingStorePixelRatio ||\n",
+       "\tthis.context.backingStorePixelRatio || 1;\n",
+       "\n",
+       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+       "\n",
+       "    var rubberband = $('<canvas/>');\n",
+       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+       "\n",
+       "    var pass_mouse_events = true;\n",
+       "\n",
+       "    canvas_div.resizable({\n",
+       "        start: function(event, ui) {\n",
+       "            pass_mouse_events = false;\n",
+       "        },\n",
+       "        resize: function(event, ui) {\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "        stop: function(event, ui) {\n",
+       "            pass_mouse_events = true;\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "    });\n",
+       "\n",
+       "    function mouse_event_fn(event) {\n",
+       "        if (pass_mouse_events)\n",
+       "            return fig.mouse_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
+       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
+       "    // Throttle sequential mouse events to 1 every 20ms.\n",
+       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+       "\n",
+       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+       "\n",
+       "    canvas_div.on(\"wheel\", function (event) {\n",
+       "        event = event.originalEvent;\n",
+       "        event['data'] = 'scroll'\n",
+       "        if (event.deltaY < 0) {\n",
+       "            event.step = 1;\n",
+       "        } else {\n",
+       "            event.step = -1;\n",
+       "        }\n",
+       "        mouse_event_fn(event);\n",
+       "    });\n",
+       "\n",
+       "    canvas_div.append(canvas);\n",
+       "    canvas_div.append(rubberband);\n",
+       "\n",
+       "    this.rubberband = rubberband;\n",
+       "    this.rubberband_canvas = rubberband[0];\n",
+       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
+       "\n",
+       "    this._resize_canvas = function(width, height) {\n",
+       "        // Keep the size of the canvas, canvas container, and rubber band\n",
+       "        // canvas in synch.\n",
+       "        canvas_div.css('width', width)\n",
+       "        canvas_div.css('height', height)\n",
+       "\n",
+       "        canvas.attr('width', width * mpl.ratio);\n",
+       "        canvas.attr('height', height * mpl.ratio);\n",
+       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+       "\n",
+       "        rubberband.attr('width', width);\n",
+       "        rubberband.attr('height', height);\n",
+       "    }\n",
+       "\n",
+       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+       "    // upon first draw.\n",
+       "    this._resize_canvas(600, 600);\n",
+       "\n",
+       "    // Disable right mouse context menu.\n",
+       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+       "        return false;\n",
+       "    });\n",
+       "\n",
+       "    function set_focus () {\n",
+       "        canvas.focus();\n",
+       "        canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    window.setTimeout(set_focus, 100);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) {\n",
+       "            // put a spacer in here.\n",
+       "            continue;\n",
+       "        }\n",
+       "        var button = $('<button/>');\n",
+       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+       "                        'ui-button-icon-only');\n",
+       "        button.attr('role', 'button');\n",
+       "        button.attr('aria-disabled', 'false');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "\n",
+       "        var icon_img = $('<span/>');\n",
+       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+       "        icon_img.addClass(image);\n",
+       "        icon_img.addClass('ui-corner-all');\n",
+       "\n",
+       "        var tooltip_span = $('<span/>');\n",
+       "        tooltip_span.addClass('ui-button-text');\n",
+       "        tooltip_span.html(tooltip);\n",
+       "\n",
+       "        button.append(icon_img);\n",
+       "        button.append(tooltip_span);\n",
+       "\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    var fmt_picker_span = $('<span/>');\n",
+       "\n",
+       "    var fmt_picker = $('<select/>');\n",
+       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+       "    fmt_picker_span.append(fmt_picker);\n",
+       "    nav_element.append(fmt_picker_span);\n",
+       "    this.format_dropdown = fmt_picker[0];\n",
+       "\n",
+       "    for (var ind in mpl.extensions) {\n",
+       "        var fmt = mpl.extensions[ind];\n",
+       "        var option = $(\n",
+       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+       "        fmt_picker.append(option)\n",
+       "    }\n",
+       "\n",
+       "    // Add hover states to the ui-buttons\n",
+       "    $( \".ui-button\" ).hover(\n",
+       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
+       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
+       "    );\n",
+       "\n",
+       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+       "    // which will in turn request a refresh of the image.\n",
+       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_message = function(type, properties) {\n",
+       "    properties['type'] = type;\n",
+       "    properties['figure_id'] = this.id;\n",
+       "    this.ws.send(JSON.stringify(properties));\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_draw_message = function() {\n",
+       "    if (!this.waiting) {\n",
+       "        this.waiting = true;\n",
+       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    var format_dropdown = fig.format_dropdown;\n",
+       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+       "    fig.ondownload(fig, format);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+       "    var size = msg['size'];\n",
+       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+       "        fig._resize_canvas(size[0], size[1]);\n",
+       "        fig.send_message(\"refresh\", {});\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+       "    var x0 = msg['x0'] / mpl.ratio;\n",
+       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+       "    var x1 = msg['x1'] / mpl.ratio;\n",
+       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+       "    x0 = Math.floor(x0) + 0.5;\n",
+       "    y0 = Math.floor(y0) + 0.5;\n",
+       "    x1 = Math.floor(x1) + 0.5;\n",
+       "    y1 = Math.floor(y1) + 0.5;\n",
+       "    var min_x = Math.min(x0, x1);\n",
+       "    var min_y = Math.min(y0, y1);\n",
+       "    var width = Math.abs(x1 - x0);\n",
+       "    var height = Math.abs(y1 - y0);\n",
+       "\n",
+       "    fig.rubberband_context.clearRect(\n",
+       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "\n",
+       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+       "    // Updates the figure title.\n",
+       "    fig.header.textContent = msg['label'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+       "    var cursor = msg['cursor'];\n",
+       "    switch(cursor)\n",
+       "    {\n",
+       "    case 0:\n",
+       "        cursor = 'pointer';\n",
+       "        break;\n",
+       "    case 1:\n",
+       "        cursor = 'default';\n",
+       "        break;\n",
+       "    case 2:\n",
+       "        cursor = 'crosshair';\n",
+       "        break;\n",
+       "    case 3:\n",
+       "        cursor = 'move';\n",
+       "        break;\n",
+       "    }\n",
+       "    fig.rubberband_canvas.style.cursor = cursor;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+       "    fig.message.textContent = msg['message'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+       "    // Request the server to send over a new figure.\n",
+       "    fig.send_draw_message();\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+       "    fig.image_mode = msg['mode'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Called whenever the canvas gets updated.\n",
+       "    this.send_message(\"ack\", {});\n",
+       "}\n",
+       "\n",
+       "// A function to construct a web socket function for onmessage handling.\n",
+       "// Called in the figure constructor.\n",
+       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+       "    return function socket_on_message(evt) {\n",
+       "        if (evt.data instanceof Blob) {\n",
+       "            /* FIXME: We get \"Resource interpreted as Image but\n",
+       "             * transferred with MIME type text/plain:\" errors on\n",
+       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
+       "             * to be part of the websocket stream */\n",
+       "            evt.data.type = \"image/png\";\n",
+       "\n",
+       "            /* Free the memory for the previous frames */\n",
+       "            if (fig.imageObj.src) {\n",
+       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
+       "                    fig.imageObj.src);\n",
+       "            }\n",
+       "\n",
+       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+       "                evt.data);\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+       "            fig.imageObj.src = evt.data;\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        var msg = JSON.parse(evt.data);\n",
+       "        var msg_type = msg['type'];\n",
+       "\n",
+       "        // Call the  \"handle_{type}\" callback, which takes\n",
+       "        // the figure and JSON message as its only arguments.\n",
+       "        try {\n",
+       "            var callback = fig[\"handle_\" + msg_type];\n",
+       "        } catch (e) {\n",
+       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        if (callback) {\n",
+       "            try {\n",
+       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+       "                callback(fig, msg);\n",
+       "            } catch (e) {\n",
+       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+       "            }\n",
+       "        }\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+       "mpl.findpos = function(e) {\n",
+       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+       "    var targ;\n",
+       "    if (!e)\n",
+       "        e = window.event;\n",
+       "    if (e.target)\n",
+       "        targ = e.target;\n",
+       "    else if (e.srcElement)\n",
+       "        targ = e.srcElement;\n",
+       "    if (targ.nodeType == 3) // defeat Safari bug\n",
+       "        targ = targ.parentNode;\n",
+       "\n",
+       "    // jQuery normalizes the pageX and pageY\n",
+       "    // pageX,Y are the mouse positions relative to the document\n",
+       "    // offset() returns the position of the element relative to the document\n",
+       "    var x = e.pageX - $(targ).offset().left;\n",
+       "    var y = e.pageY - $(targ).offset().top;\n",
+       "\n",
+       "    return {\"x\": x, \"y\": y};\n",
+       "};\n",
+       "\n",
+       "/*\n",
+       " * return a copy of an object with only non-object keys\n",
+       " * we need this to avoid circular references\n",
+       " * http://stackoverflow.com/a/24161582/3208463\n",
+       " */\n",
+       "function simpleKeys (original) {\n",
+       "  return Object.keys(original).reduce(function (obj, key) {\n",
+       "    if (typeof original[key] !== 'object')\n",
+       "        obj[key] = original[key]\n",
+       "    return obj;\n",
+       "  }, {});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+       "    var canvas_pos = mpl.findpos(event)\n",
+       "\n",
+       "    if (name === 'button_press')\n",
+       "    {\n",
+       "        this.canvas.focus();\n",
+       "        this.canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    var x = canvas_pos.x * mpl.ratio;\n",
+       "    var y = canvas_pos.y * mpl.ratio;\n",
+       "\n",
+       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
+       "                             step: event.step,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "\n",
+       "    /* This prevents the web browser from automatically changing to\n",
+       "     * the text insertion cursor when the button is pressed.  We want\n",
+       "     * to control all of the cursor setting manually through the\n",
+       "     * 'cursor' event from matplotlib */\n",
+       "    event.preventDefault();\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    // Handle any extra behaviour associated with a key event\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.key_event = function(event, name) {\n",
+       "\n",
+       "    // Prevent repeat events\n",
+       "    if (name == 'key_press')\n",
+       "    {\n",
+       "        if (event.which === this._key)\n",
+       "            return;\n",
+       "        else\n",
+       "            this._key = event.which;\n",
+       "    }\n",
+       "    if (name == 'key_release')\n",
+       "        this._key = null;\n",
+       "\n",
+       "    var value = '';\n",
+       "    if (event.ctrlKey && event.which != 17)\n",
+       "        value += \"ctrl+\";\n",
+       "    if (event.altKey && event.which != 18)\n",
+       "        value += \"alt+\";\n",
+       "    if (event.shiftKey && event.which != 16)\n",
+       "        value += \"shift+\";\n",
+       "\n",
+       "    value += 'k';\n",
+       "    value += event.which.toString();\n",
+       "\n",
+       "    this._key_event_extra(event, name);\n",
+       "\n",
+       "    this.send_message(name, {key: value,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+       "    if (name == 'download') {\n",
+       "        this.handle_save(this, null);\n",
+       "    } else {\n",
+       "        this.send_message(\"toolbar_button\", {name: name});\n",
+       "    }\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+       "    this.message.textContent = tooltip;\n",
+       "};\n",
+       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+       "\n",
+       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+       "\n",
+       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
+       "    // object with the appropriate methods. Currently this is a non binary\n",
+       "    // socket, so there is still some room for performance tuning.\n",
+       "    var ws = {};\n",
+       "\n",
+       "    ws.close = function() {\n",
+       "        comm.close()\n",
+       "    };\n",
+       "    ws.send = function(m) {\n",
+       "        //console.log('sending', m);\n",
+       "        comm.send(m);\n",
+       "    };\n",
+       "    // Register the callback with on_msg.\n",
+       "    comm.on_msg(function(msg) {\n",
+       "        //console.log('receiving', msg['content']['data'], msg);\n",
+       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+       "        ws.onmessage(msg['content']['data'])\n",
+       "    });\n",
+       "    return ws;\n",
+       "}\n",
+       "\n",
+       "mpl.mpl_figure_comm = function(comm, msg) {\n",
+       "    // This is the function which gets called when the mpl process\n",
+       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+       "\n",
+       "    var id = msg.content.data.id;\n",
+       "    // Get hold of the div created by the display call when the Comm\n",
+       "    // socket was opened in Python.\n",
+       "    var element = $(\"#\" + id);\n",
+       "    var ws_proxy = comm_websocket_adapter(comm)\n",
+       "\n",
+       "    function ondownload(figure, format) {\n",
+       "        window.open(figure.imageObj.src);\n",
+       "    }\n",
+       "\n",
+       "    var fig = new mpl.figure(id, ws_proxy,\n",
+       "                           ondownload,\n",
+       "                           element.get(0));\n",
+       "\n",
+       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+       "    // web socket which is closed, not our websocket->open comm proxy.\n",
+       "    ws_proxy.onopen();\n",
+       "\n",
+       "    fig.parent_element = element.get(0);\n",
+       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+       "    if (!fig.cell_info) {\n",
+       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
+       "        return;\n",
+       "    }\n",
+       "\n",
+       "    var output_index = fig.cell_info[2]\n",
+       "    var cell = fig.cell_info[0];\n",
+       "\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+       "    var width = fig.canvas.width/mpl.ratio\n",
+       "    fig.root.unbind('remove')\n",
+       "\n",
+       "    // Update the output cell to use the data from the current canvas.\n",
+       "    fig.push_to_output();\n",
+       "    var dataURL = fig.canvas.toDataURL();\n",
+       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+       "    // the notebook keyboard shortcuts fail.\n",
+       "    IPython.keyboard_manager.enable()\n",
+       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
+       "    fig.close_ws(fig, msg);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+       "    fig.send_message('closing', msg);\n",
+       "    // fig.ws.close()\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+       "    // Turn the data on the canvas into data in the output cell.\n",
+       "    var width = this.canvas.width/mpl.ratio\n",
+       "    var dataURL = this.canvas.toDataURL();\n",
+       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Tell IPython that the notebook contents must change.\n",
+       "    IPython.notebook.set_dirty(true);\n",
+       "    this.send_message(\"ack\", {});\n",
+       "    var fig = this;\n",
+       "    // Wait a second, then push the new image to the DOM so\n",
+       "    // that it is saved nicely (might be nice to debounce this).\n",
+       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items){\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) { continue; };\n",
+       "\n",
+       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    // Add the status bar.\n",
+       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "\n",
+       "    // Add the close button to the window.\n",
+       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
+       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
+       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+       "    buttongrp.append(button);\n",
+       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+       "    titlebar.prepend(buttongrp);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(el){\n",
+       "    var fig = this\n",
+       "    el.on(\"remove\", function(){\n",
+       "\tfig.close_ws(fig, {});\n",
+       "    });\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+       "    // this is important to make the div 'focusable\n",
+       "    el.attr('tabindex', 0)\n",
+       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
+       "    // off when our div gets focus\n",
+       "\n",
+       "    // location in version 3\n",
+       "    if (IPython.notebook.keyboard_manager) {\n",
+       "        IPython.notebook.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "    else {\n",
+       "        // location in version 2\n",
+       "        IPython.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    var manager = IPython.notebook.keyboard_manager;\n",
+       "    if (!manager)\n",
+       "        manager = IPython.keyboard_manager;\n",
+       "\n",
+       "    // Check for shift+enter\n",
+       "    if (event.shiftKey && event.which == 13) {\n",
+       "        this.canvas_div.blur();\n",
+       "        event.shiftKey = false;\n",
+       "        // Send a \"J\" for go to next cell\n",
+       "        event.which = 74;\n",
+       "        event.keyCode = 74;\n",
+       "        manager.command_mode();\n",
+       "        manager.handle_keydown(event);\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    fig.ondownload(fig, null);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.find_output_cell = function(html_output) {\n",
+       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+       "    // IPython event is triggered only after the cells have been serialised, which for\n",
+       "    // our purposes (turning an active figure into a static one), is too late.\n",
+       "    var cells = IPython.notebook.get_cells();\n",
+       "    var ncells = cells.length;\n",
+       "    for (var i=0; i<ncells; i++) {\n",
+       "        var cell = cells[i];\n",
+       "        if (cell.cell_type === 'code'){\n",
+       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
+       "                var data = cell.output_area.outputs[j];\n",
+       "                if (data.data) {\n",
+       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
+       "                    data = data.data;\n",
+       "                }\n",
+       "                if (data['text/html'] == html_output) {\n",
+       "                    return [cell, data, j];\n",
+       "                }\n",
+       "            }\n",
+       "        }\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "// Register the function which deals with the matplotlib target/channel.\n",
+       "// The kernel may be null if the page has been refreshed.\n",
+       "if (IPython.notebook.kernel != null) {\n",
+       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+       "}\n"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Javascript object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<img src=\"data:image/png;base64,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\" width=\"NaN\">"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=3), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=14062), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.07768034991924208, 'val_loss': 0.08734600420387903}\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=14062), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7009), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.07624361318589765, 'val_loss': 0.08570605492861648}\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=14062), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "ae59c1faf15e4743a31e747d40089c1a",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7009), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.07219762333392048, 'val_loss': 0.0856807165333244}\n",
+      "\n",
+      "0.0856807165333244\n"
+     ]
+    }
+   ],
+   "source": [
+    "%matplotlib nbagg\n",
+    "\n",
+    "num_split=0\n",
+    "np.random.seed(SEED+num_split)\n",
+    "torch.manual_seed(SEED+num_split)\n",
+    "torch.cuda.manual_seed(SEED+num_split)\n",
+    "#torch.backends.cudnn.deterministic = True\n",
+    "idx_train = train_df[train_df.PID.isin(set(split_sid[splits[num_split][0]]))].index.values\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "idx_train.shape\n",
+    "idx_validate.shape\n",
+    "\n",
+    "klr=1\n",
+    "batch_size=32\n",
+    "num_workers=12\n",
+    "num_epochs=3\n",
+    "model_name,version = 'Densenet169_3' , 'classifier_splits'\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   )\n",
+    "\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,'basic_splits',num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "weights = torch.tensor([1.,1.,1.,1.,1.,2.],device=device)\n",
+    "loss_func=my_loss\n",
+    "targets_dataset=D.TensorDataset(torch.tensor(train_df[hemorrhage_types].values,dtype=torch.float))\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "imagedataset = ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                           window_eq=False,equalize=False,rescale=True)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "imagedataset_val = ImageDataset(train_df,transform=transform_val.random,base_path=train_images_dir,\n",
+    "                               window_eq=False,equalize=False,rescale=True)\n",
+    "combined_dataset=DatasetCat([imagedataset,targets_dataset])\n",
+    "combined_dataset_val=DatasetCat([imagedataset_val,targets_dataset])\n",
+    "optimizer_grouped_parameters=get_optimizer_parameters(model,klr)\n",
+    "sampling=simple_sampler(train_df[hemorrhage_types].values[idx_train],0.25)\n",
+    "sample_ratio=1.0\n",
+    "train_dataset=D.Subset(combined_dataset,idx_train)\n",
+    "validate_dataset=D.Subset(combined_dataset_val,idx_validate)\n",
+    "num_train_optimization_steps = num_epochs*(sample_ratio*len(train_dataset)//batch_size+int(len(train_dataset)%batch_size>0))\n",
+    "fig,ax = plt.subplots(figsize=(10,7))\n",
+    "gr=loss_graph(fig,ax,num_epochs,int(num_train_optimization_steps/num_epochs)+1,limits=(0.05,0.2))\n",
+    "sched=WarmupExpCosineWithWarmupRestartsSchedule( t_total=num_train_optimization_steps, cycles=num_epochs,tau=1.5)\n",
+    "optimizer = BertAdam(optimizer_grouped_parameters,lr=klr*1e-3,schedule=sched)\n",
+    "model, optimizer = amp.initialize(model, optimizer, opt_level=\"O1\",verbosity=0)\n",
+    "history,best_model= model_train(model,\n",
+    "                                optimizer,\n",
+    "                                train_dataset,\n",
+    "                                batch_size,\n",
+    "                                num_epochs,\n",
+    "                                loss_func,\n",
+    "                                weights=weights,\n",
+    "                                do_apex=False,\n",
+    "                                model_apexed=True,\n",
+    "                                validate_dataset=validate_dataset,\n",
+    "                                param_schedualer=None,\n",
+    "                                weights_data=None,\n",
+    "                                metric=None,\n",
+    "                                return_model=True,\n",
+    "                                num_workers=num_workers,\n",
+    "                                sampler=None,\n",
+    "                                pre_process = None,\n",
+    "                                graph=gr,\n",
+    "                                call_progress=sendmeemail)\n",
+    "\n",
+    "torch.save(model.state_dict(), models_dir+models_format.format(model_name,version,num_split))\n",
+    "torch.save(best_model.state_dict(), models_dir+models_format.format(model_name,version+'_best',num_split))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<torch._C.Generator at 0x7fe53c62a630>"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(449019,)"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(225233,)"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "/* Put everything inside the global mpl namespace */\n",
+       "window.mpl = {};\n",
+       "\n",
+       "\n",
+       "mpl.get_websocket_type = function() {\n",
+       "    if (typeof(WebSocket) !== 'undefined') {\n",
+       "        return WebSocket;\n",
+       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+       "        return MozWebSocket;\n",
+       "    } else {\n",
+       "        alert('Your browser does not have WebSocket support.' +\n",
+       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+       "              'Firefox 4 and 5 are also supported but you ' +\n",
+       "              'have to enable WebSockets in about:config.');\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+       "    this.id = figure_id;\n",
+       "\n",
+       "    this.ws = websocket;\n",
+       "\n",
+       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
+       "\n",
+       "    if (!this.supports_binary) {\n",
+       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
+       "        if (warnings) {\n",
+       "            warnings.style.display = 'block';\n",
+       "            warnings.textContent = (\n",
+       "                \"This browser does not support binary websocket messages. \" +\n",
+       "                    \"Performance may be slow.\");\n",
+       "        }\n",
+       "    }\n",
+       "\n",
+       "    this.imageObj = new Image();\n",
+       "\n",
+       "    this.context = undefined;\n",
+       "    this.message = undefined;\n",
+       "    this.canvas = undefined;\n",
+       "    this.rubberband_canvas = undefined;\n",
+       "    this.rubberband_context = undefined;\n",
+       "    this.format_dropdown = undefined;\n",
+       "\n",
+       "    this.image_mode = 'full';\n",
+       "\n",
+       "    this.root = $('<div/>');\n",
+       "    this._root_extra_style(this.root)\n",
+       "    this.root.attr('style', 'display: inline-block');\n",
+       "\n",
+       "    $(parent_element).append(this.root);\n",
+       "\n",
+       "    this._init_header(this);\n",
+       "    this._init_canvas(this);\n",
+       "    this._init_toolbar(this);\n",
+       "\n",
+       "    var fig = this;\n",
+       "\n",
+       "    this.waiting = false;\n",
+       "\n",
+       "    this.ws.onopen =  function () {\n",
+       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+       "            fig.send_message(\"send_image_mode\", {});\n",
+       "            if (mpl.ratio != 1) {\n",
+       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+       "            }\n",
+       "            fig.send_message(\"refresh\", {});\n",
+       "        }\n",
+       "\n",
+       "    this.imageObj.onload = function() {\n",
+       "            if (fig.image_mode == 'full') {\n",
+       "                // Full images could contain transparency (where diff images\n",
+       "                // almost always do), so we need to clear the canvas so that\n",
+       "                // there is no ghosting.\n",
+       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "            }\n",
+       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
+       "        };\n",
+       "\n",
+       "    this.imageObj.onunload = function() {\n",
+       "        fig.ws.close();\n",
+       "    }\n",
+       "\n",
+       "    this.ws.onmessage = this._make_on_message_function(this);\n",
+       "\n",
+       "    this.ondownload = ondownload;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_header = function() {\n",
+       "    var titlebar = $(\n",
+       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
+       "        'ui-helper-clearfix\"/>');\n",
+       "    var titletext = $(\n",
+       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
+       "        'text-align: center; padding: 3px;\"/>');\n",
+       "    titlebar.append(titletext)\n",
+       "    this.root.append(titlebar);\n",
+       "    this.header = titletext[0];\n",
+       "}\n",
+       "\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_canvas = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var canvas_div = $('<div/>');\n",
+       "\n",
+       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+       "\n",
+       "    function canvas_keyboard_event(event) {\n",
+       "        return fig.key_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+       "    this.canvas_div = canvas_div\n",
+       "    this._canvas_extra_style(canvas_div)\n",
+       "    this.root.append(canvas_div);\n",
+       "\n",
+       "    var canvas = $('<canvas/>');\n",
+       "    canvas.addClass('mpl-canvas');\n",
+       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+       "\n",
+       "    this.canvas = canvas[0];\n",
+       "    this.context = canvas[0].getContext(\"2d\");\n",
+       "\n",
+       "    var backingStore = this.context.backingStorePixelRatio ||\n",
+       "\tthis.context.webkitBackingStorePixelRatio ||\n",
+       "\tthis.context.mozBackingStorePixelRatio ||\n",
+       "\tthis.context.msBackingStorePixelRatio ||\n",
+       "\tthis.context.oBackingStorePixelRatio ||\n",
+       "\tthis.context.backingStorePixelRatio || 1;\n",
+       "\n",
+       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+       "\n",
+       "    var rubberband = $('<canvas/>');\n",
+       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+       "\n",
+       "    var pass_mouse_events = true;\n",
+       "\n",
+       "    canvas_div.resizable({\n",
+       "        start: function(event, ui) {\n",
+       "            pass_mouse_events = false;\n",
+       "        },\n",
+       "        resize: function(event, ui) {\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "        stop: function(event, ui) {\n",
+       "            pass_mouse_events = true;\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "    });\n",
+       "\n",
+       "    function mouse_event_fn(event) {\n",
+       "        if (pass_mouse_events)\n",
+       "            return fig.mouse_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
+       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
+       "    // Throttle sequential mouse events to 1 every 20ms.\n",
+       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+       "\n",
+       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+       "\n",
+       "    canvas_div.on(\"wheel\", function (event) {\n",
+       "        event = event.originalEvent;\n",
+       "        event['data'] = 'scroll'\n",
+       "        if (event.deltaY < 0) {\n",
+       "            event.step = 1;\n",
+       "        } else {\n",
+       "            event.step = -1;\n",
+       "        }\n",
+       "        mouse_event_fn(event);\n",
+       "    });\n",
+       "\n",
+       "    canvas_div.append(canvas);\n",
+       "    canvas_div.append(rubberband);\n",
+       "\n",
+       "    this.rubberband = rubberband;\n",
+       "    this.rubberband_canvas = rubberband[0];\n",
+       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
+       "\n",
+       "    this._resize_canvas = function(width, height) {\n",
+       "        // Keep the size of the canvas, canvas container, and rubber band\n",
+       "        // canvas in synch.\n",
+       "        canvas_div.css('width', width)\n",
+       "        canvas_div.css('height', height)\n",
+       "\n",
+       "        canvas.attr('width', width * mpl.ratio);\n",
+       "        canvas.attr('height', height * mpl.ratio);\n",
+       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+       "\n",
+       "        rubberband.attr('width', width);\n",
+       "        rubberband.attr('height', height);\n",
+       "    }\n",
+       "\n",
+       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+       "    // upon first draw.\n",
+       "    this._resize_canvas(600, 600);\n",
+       "\n",
+       "    // Disable right mouse context menu.\n",
+       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+       "        return false;\n",
+       "    });\n",
+       "\n",
+       "    function set_focus () {\n",
+       "        canvas.focus();\n",
+       "        canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    window.setTimeout(set_focus, 100);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) {\n",
+       "            // put a spacer in here.\n",
+       "            continue;\n",
+       "        }\n",
+       "        var button = $('<button/>');\n",
+       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+       "                        'ui-button-icon-only');\n",
+       "        button.attr('role', 'button');\n",
+       "        button.attr('aria-disabled', 'false');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "\n",
+       "        var icon_img = $('<span/>');\n",
+       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+       "        icon_img.addClass(image);\n",
+       "        icon_img.addClass('ui-corner-all');\n",
+       "\n",
+       "        var tooltip_span = $('<span/>');\n",
+       "        tooltip_span.addClass('ui-button-text');\n",
+       "        tooltip_span.html(tooltip);\n",
+       "\n",
+       "        button.append(icon_img);\n",
+       "        button.append(tooltip_span);\n",
+       "\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    var fmt_picker_span = $('<span/>');\n",
+       "\n",
+       "    var fmt_picker = $('<select/>');\n",
+       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+       "    fmt_picker_span.append(fmt_picker);\n",
+       "    nav_element.append(fmt_picker_span);\n",
+       "    this.format_dropdown = fmt_picker[0];\n",
+       "\n",
+       "    for (var ind in mpl.extensions) {\n",
+       "        var fmt = mpl.extensions[ind];\n",
+       "        var option = $(\n",
+       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+       "        fmt_picker.append(option)\n",
+       "    }\n",
+       "\n",
+       "    // Add hover states to the ui-buttons\n",
+       "    $( \".ui-button\" ).hover(\n",
+       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
+       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
+       "    );\n",
+       "\n",
+       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+       "    // which will in turn request a refresh of the image.\n",
+       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_message = function(type, properties) {\n",
+       "    properties['type'] = type;\n",
+       "    properties['figure_id'] = this.id;\n",
+       "    this.ws.send(JSON.stringify(properties));\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_draw_message = function() {\n",
+       "    if (!this.waiting) {\n",
+       "        this.waiting = true;\n",
+       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    var format_dropdown = fig.format_dropdown;\n",
+       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+       "    fig.ondownload(fig, format);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+       "    var size = msg['size'];\n",
+       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+       "        fig._resize_canvas(size[0], size[1]);\n",
+       "        fig.send_message(\"refresh\", {});\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+       "    var x0 = msg['x0'] / mpl.ratio;\n",
+       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+       "    var x1 = msg['x1'] / mpl.ratio;\n",
+       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+       "    x0 = Math.floor(x0) + 0.5;\n",
+       "    y0 = Math.floor(y0) + 0.5;\n",
+       "    x1 = Math.floor(x1) + 0.5;\n",
+       "    y1 = Math.floor(y1) + 0.5;\n",
+       "    var min_x = Math.min(x0, x1);\n",
+       "    var min_y = Math.min(y0, y1);\n",
+       "    var width = Math.abs(x1 - x0);\n",
+       "    var height = Math.abs(y1 - y0);\n",
+       "\n",
+       "    fig.rubberband_context.clearRect(\n",
+       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "\n",
+       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+       "    // Updates the figure title.\n",
+       "    fig.header.textContent = msg['label'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+       "    var cursor = msg['cursor'];\n",
+       "    switch(cursor)\n",
+       "    {\n",
+       "    case 0:\n",
+       "        cursor = 'pointer';\n",
+       "        break;\n",
+       "    case 1:\n",
+       "        cursor = 'default';\n",
+       "        break;\n",
+       "    case 2:\n",
+       "        cursor = 'crosshair';\n",
+       "        break;\n",
+       "    case 3:\n",
+       "        cursor = 'move';\n",
+       "        break;\n",
+       "    }\n",
+       "    fig.rubberband_canvas.style.cursor = cursor;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+       "    fig.message.textContent = msg['message'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+       "    // Request the server to send over a new figure.\n",
+       "    fig.send_draw_message();\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+       "    fig.image_mode = msg['mode'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Called whenever the canvas gets updated.\n",
+       "    this.send_message(\"ack\", {});\n",
+       "}\n",
+       "\n",
+       "// A function to construct a web socket function for onmessage handling.\n",
+       "// Called in the figure constructor.\n",
+       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+       "    return function socket_on_message(evt) {\n",
+       "        if (evt.data instanceof Blob) {\n",
+       "            /* FIXME: We get \"Resource interpreted as Image but\n",
+       "             * transferred with MIME type text/plain:\" errors on\n",
+       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
+       "             * to be part of the websocket stream */\n",
+       "            evt.data.type = \"image/png\";\n",
+       "\n",
+       "            /* Free the memory for the previous frames */\n",
+       "            if (fig.imageObj.src) {\n",
+       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
+       "                    fig.imageObj.src);\n",
+       "            }\n",
+       "\n",
+       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+       "                evt.data);\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+       "            fig.imageObj.src = evt.data;\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        var msg = JSON.parse(evt.data);\n",
+       "        var msg_type = msg['type'];\n",
+       "\n",
+       "        // Call the  \"handle_{type}\" callback, which takes\n",
+       "        // the figure and JSON message as its only arguments.\n",
+       "        try {\n",
+       "            var callback = fig[\"handle_\" + msg_type];\n",
+       "        } catch (e) {\n",
+       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        if (callback) {\n",
+       "            try {\n",
+       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+       "                callback(fig, msg);\n",
+       "            } catch (e) {\n",
+       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+       "            }\n",
+       "        }\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+       "mpl.findpos = function(e) {\n",
+       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+       "    var targ;\n",
+       "    if (!e)\n",
+       "        e = window.event;\n",
+       "    if (e.target)\n",
+       "        targ = e.target;\n",
+       "    else if (e.srcElement)\n",
+       "        targ = e.srcElement;\n",
+       "    if (targ.nodeType == 3) // defeat Safari bug\n",
+       "        targ = targ.parentNode;\n",
+       "\n",
+       "    // jQuery normalizes the pageX and pageY\n",
+       "    // pageX,Y are the mouse positions relative to the document\n",
+       "    // offset() returns the position of the element relative to the document\n",
+       "    var x = e.pageX - $(targ).offset().left;\n",
+       "    var y = e.pageY - $(targ).offset().top;\n",
+       "\n",
+       "    return {\"x\": x, \"y\": y};\n",
+       "};\n",
+       "\n",
+       "/*\n",
+       " * return a copy of an object with only non-object keys\n",
+       " * we need this to avoid circular references\n",
+       " * http://stackoverflow.com/a/24161582/3208463\n",
+       " */\n",
+       "function simpleKeys (original) {\n",
+       "  return Object.keys(original).reduce(function (obj, key) {\n",
+       "    if (typeof original[key] !== 'object')\n",
+       "        obj[key] = original[key]\n",
+       "    return obj;\n",
+       "  }, {});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+       "    var canvas_pos = mpl.findpos(event)\n",
+       "\n",
+       "    if (name === 'button_press')\n",
+       "    {\n",
+       "        this.canvas.focus();\n",
+       "        this.canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    var x = canvas_pos.x * mpl.ratio;\n",
+       "    var y = canvas_pos.y * mpl.ratio;\n",
+       "\n",
+       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
+       "                             step: event.step,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "\n",
+       "    /* This prevents the web browser from automatically changing to\n",
+       "     * the text insertion cursor when the button is pressed.  We want\n",
+       "     * to control all of the cursor setting manually through the\n",
+       "     * 'cursor' event from matplotlib */\n",
+       "    event.preventDefault();\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    // Handle any extra behaviour associated with a key event\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.key_event = function(event, name) {\n",
+       "\n",
+       "    // Prevent repeat events\n",
+       "    if (name == 'key_press')\n",
+       "    {\n",
+       "        if (event.which === this._key)\n",
+       "            return;\n",
+       "        else\n",
+       "            this._key = event.which;\n",
+       "    }\n",
+       "    if (name == 'key_release')\n",
+       "        this._key = null;\n",
+       "\n",
+       "    var value = '';\n",
+       "    if (event.ctrlKey && event.which != 17)\n",
+       "        value += \"ctrl+\";\n",
+       "    if (event.altKey && event.which != 18)\n",
+       "        value += \"alt+\";\n",
+       "    if (event.shiftKey && event.which != 16)\n",
+       "        value += \"shift+\";\n",
+       "\n",
+       "    value += 'k';\n",
+       "    value += event.which.toString();\n",
+       "\n",
+       "    this._key_event_extra(event, name);\n",
+       "\n",
+       "    this.send_message(name, {key: value,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+       "    if (name == 'download') {\n",
+       "        this.handle_save(this, null);\n",
+       "    } else {\n",
+       "        this.send_message(\"toolbar_button\", {name: name});\n",
+       "    }\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+       "    this.message.textContent = tooltip;\n",
+       "};\n",
+       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+       "\n",
+       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+       "\n",
+       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
+       "    // object with the appropriate methods. Currently this is a non binary\n",
+       "    // socket, so there is still some room for performance tuning.\n",
+       "    var ws = {};\n",
+       "\n",
+       "    ws.close = function() {\n",
+       "        comm.close()\n",
+       "    };\n",
+       "    ws.send = function(m) {\n",
+       "        //console.log('sending', m);\n",
+       "        comm.send(m);\n",
+       "    };\n",
+       "    // Register the callback with on_msg.\n",
+       "    comm.on_msg(function(msg) {\n",
+       "        //console.log('receiving', msg['content']['data'], msg);\n",
+       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+       "        ws.onmessage(msg['content']['data'])\n",
+       "    });\n",
+       "    return ws;\n",
+       "}\n",
+       "\n",
+       "mpl.mpl_figure_comm = function(comm, msg) {\n",
+       "    // This is the function which gets called when the mpl process\n",
+       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+       "\n",
+       "    var id = msg.content.data.id;\n",
+       "    // Get hold of the div created by the display call when the Comm\n",
+       "    // socket was opened in Python.\n",
+       "    var element = $(\"#\" + id);\n",
+       "    var ws_proxy = comm_websocket_adapter(comm)\n",
+       "\n",
+       "    function ondownload(figure, format) {\n",
+       "        window.open(figure.imageObj.src);\n",
+       "    }\n",
+       "\n",
+       "    var fig = new mpl.figure(id, ws_proxy,\n",
+       "                           ondownload,\n",
+       "                           element.get(0));\n",
+       "\n",
+       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+       "    // web socket which is closed, not our websocket->open comm proxy.\n",
+       "    ws_proxy.onopen();\n",
+       "\n",
+       "    fig.parent_element = element.get(0);\n",
+       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+       "    if (!fig.cell_info) {\n",
+       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
+       "        return;\n",
+       "    }\n",
+       "\n",
+       "    var output_index = fig.cell_info[2]\n",
+       "    var cell = fig.cell_info[0];\n",
+       "\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+       "    var width = fig.canvas.width/mpl.ratio\n",
+       "    fig.root.unbind('remove')\n",
+       "\n",
+       "    // Update the output cell to use the data from the current canvas.\n",
+       "    fig.push_to_output();\n",
+       "    var dataURL = fig.canvas.toDataURL();\n",
+       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+       "    // the notebook keyboard shortcuts fail.\n",
+       "    IPython.keyboard_manager.enable()\n",
+       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
+       "    fig.close_ws(fig, msg);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+       "    fig.send_message('closing', msg);\n",
+       "    // fig.ws.close()\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+       "    // Turn the data on the canvas into data in the output cell.\n",
+       "    var width = this.canvas.width/mpl.ratio\n",
+       "    var dataURL = this.canvas.toDataURL();\n",
+       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Tell IPython that the notebook contents must change.\n",
+       "    IPython.notebook.set_dirty(true);\n",
+       "    this.send_message(\"ack\", {});\n",
+       "    var fig = this;\n",
+       "    // Wait a second, then push the new image to the DOM so\n",
+       "    // that it is saved nicely (might be nice to debounce this).\n",
+       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items){\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) { continue; };\n",
+       "\n",
+       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    // Add the status bar.\n",
+       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "\n",
+       "    // Add the close button to the window.\n",
+       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
+       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
+       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+       "    buttongrp.append(button);\n",
+       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+       "    titlebar.prepend(buttongrp);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(el){\n",
+       "    var fig = this\n",
+       "    el.on(\"remove\", function(){\n",
+       "\tfig.close_ws(fig, {});\n",
+       "    });\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+       "    // this is important to make the div 'focusable\n",
+       "    el.attr('tabindex', 0)\n",
+       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
+       "    // off when our div gets focus\n",
+       "\n",
+       "    // location in version 3\n",
+       "    if (IPython.notebook.keyboard_manager) {\n",
+       "        IPython.notebook.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "    else {\n",
+       "        // location in version 2\n",
+       "        IPython.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    var manager = IPython.notebook.keyboard_manager;\n",
+       "    if (!manager)\n",
+       "        manager = IPython.keyboard_manager;\n",
+       "\n",
+       "    // Check for shift+enter\n",
+       "    if (event.shiftKey && event.which == 13) {\n",
+       "        this.canvas_div.blur();\n",
+       "        event.shiftKey = false;\n",
+       "        // Send a \"J\" for go to next cell\n",
+       "        event.which = 74;\n",
+       "        event.keyCode = 74;\n",
+       "        manager.command_mode();\n",
+       "        manager.handle_keydown(event);\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    fig.ondownload(fig, null);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.find_output_cell = function(html_output) {\n",
+       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+       "    // IPython event is triggered only after the cells have been serialised, which for\n",
+       "    // our purposes (turning an active figure into a static one), is too late.\n",
+       "    var cells = IPython.notebook.get_cells();\n",
+       "    var ncells = cells.length;\n",
+       "    for (var i=0; i<ncells; i++) {\n",
+       "        var cell = cells[i];\n",
+       "        if (cell.cell_type === 'code'){\n",
+       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
+       "                var data = cell.output_area.outputs[j];\n",
+       "                if (data.data) {\n",
+       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
+       "                    data = data.data;\n",
+       "                }\n",
+       "                if (data['text/html'] == html_output) {\n",
+       "                    return [cell, data, j];\n",
+       "                }\n",
+       "            }\n",
+       "        }\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "// Register the function which deals with the matplotlib target/channel.\n",
+       "// The kernel may be null if the page has been refreshed.\n",
+       "if (IPython.notebook.kernel != null) {\n",
+       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+       "}\n"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Javascript object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<img src=\"data:image/png;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/98eHNAAAAAgDHr/1OZwAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATtQAYj5VvbXle1QAAAAASUVORK5CYII=\" width=\"720\">"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=2), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=5758), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7039), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.22168027256175762, 'val_loss': 0.11785463814715344}\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=5758), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7039), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.19196260699937726, 'val_loss': 0.11602187715245865}\n",
+      "\n",
+      "0.11602187715245865\n"
+     ]
+    }
+   ],
+   "source": [
+    "%matplotlib nbagg\n",
+    "\n",
+    "num_split=1\n",
+    "np.random.seed(SEED+num_split)\n",
+    "torch.manual_seed(SEED+num_split)\n",
+    "torch.cuda.manual_seed(SEED+num_split)\n",
+    "#torch.backends.cudnn.deterministic = True\n",
+    "idx_train = train_df[train_df.PID.isin(set(split_sid[splits[num_split][0]]))].index.values\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "idx_train.shape\n",
+    "idx_validate.shape\n",
+    "\n",
+    "klr=1\n",
+    "batch_size=32\n",
+    "num_workers=12\n",
+    "num_epochs=2\n",
+    "model_name,version = 'Densenet169_3' , 'basic_splits'\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   )\n",
+    "\n",
+    "_=model.to(device)\n",
+    "weights = torch.tensor([1.,1.,1.,1.,1.,2.],device=device)\n",
+    "loss_func=my_loss\n",
+    "targets_dataset=D.TensorDataset(torch.tensor(train_df[hemorrhage_types].values,dtype=torch.float))\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "imagedataset = ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                           window_eq=False,equalize=False,rescale=True)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "imagedataset_val = ImageDataset(train_df,transform=transform_val.random,base_path=train_images_dir,\n",
+    "                               window_eq=False,equalize=False,rescale=True)\n",
+    "combined_dataset=DatasetCat([imagedataset,targets_dataset])\n",
+    "combined_dataset_val=DatasetCat([imagedataset_val,targets_dataset])\n",
+    "#param_s=parameter_scheduler(model,num_epoch=0)\n",
+    "optimizer_grouped_parameters=get_optimizer_parameters(model,klr)\n",
+    "sampling=sampler(train_df[hemorrhage_types].values[idx_train],0.2,[10,1,1,1,1,0])\n",
+    "sample_ratio=1.02*float(sampling().shape[0])/idx_train.shape[0]\n",
+    "train_dataset=D.Subset(combined_dataset,idx_train)\n",
+    "validate_dataset=D.Subset(combined_dataset_val,idx_validate)\n",
+    "num_train_optimization_steps = num_epochs*(sample_ratio*len(train_dataset)//batch_size+int(len(train_dataset)%batch_size>0))\n",
+    "fig,ax = plt.subplots(figsize=(10,7))\n",
+    "gr=loss_graph(fig,ax,num_epochs,int(num_train_optimization_steps/num_epochs)+1,limits=[0.05,0.4])\n",
+    "sched=WarmupExpCosineWithWarmupRestartsSchedule( t_total=num_train_optimization_steps, cycles=num_epochs//2,tau=1)\n",
+    "optimizer = BertAdam(optimizer_grouped_parameters,lr=klr*1e-3,schedule=sched)\n",
+    "model, optimizer = amp.initialize(model, optimizer, opt_level=\"O1\",verbosity=0)\n",
+    "history,best_model= model_train(model,\n",
+    "                                optimizer,\n",
+    "                                train_dataset,\n",
+    "                                batch_size,\n",
+    "                                num_epochs,\n",
+    "                                loss_func,\n",
+    "                                weights=weights,\n",
+    "                                do_apex=False,\n",
+    "                                model_apexed=True,\n",
+    "                                validate_dataset=validate_dataset,\n",
+    "                                param_schedualer=None,\n",
+    "                                weights_data=None,\n",
+    "                                metric=None,\n",
+    "                                return_model=True,\n",
+    "                                num_workers=num_workers,\n",
+    "                                sampler=sampling,\n",
+    "                                graph=gr,\n",
+    "                                call_progress=sendmeemail)\n",
+    "torch.save(model.state_dict(), models_dir+models_format.format(model_name,version,num_split))\n",
+    "torch.save(best_model.state_dict(), models_dir+models_format.format(model_name,version+'_best',num_split))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<torch._C.Generator at 0x7fe53c62a630>"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(449019,)"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(225233,)"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "/* Put everything inside the global mpl namespace */\n",
+       "window.mpl = {};\n",
+       "\n",
+       "\n",
+       "mpl.get_websocket_type = function() {\n",
+       "    if (typeof(WebSocket) !== 'undefined') {\n",
+       "        return WebSocket;\n",
+       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+       "        return MozWebSocket;\n",
+       "    } else {\n",
+       "        alert('Your browser does not have WebSocket support.' +\n",
+       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+       "              'Firefox 4 and 5 are also supported but you ' +\n",
+       "              'have to enable WebSockets in about:config.');\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+       "    this.id = figure_id;\n",
+       "\n",
+       "    this.ws = websocket;\n",
+       "\n",
+       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
+       "\n",
+       "    if (!this.supports_binary) {\n",
+       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
+       "        if (warnings) {\n",
+       "            warnings.style.display = 'block';\n",
+       "            warnings.textContent = (\n",
+       "                \"This browser does not support binary websocket messages. \" +\n",
+       "                    \"Performance may be slow.\");\n",
+       "        }\n",
+       "    }\n",
+       "\n",
+       "    this.imageObj = new Image();\n",
+       "\n",
+       "    this.context = undefined;\n",
+       "    this.message = undefined;\n",
+       "    this.canvas = undefined;\n",
+       "    this.rubberband_canvas = undefined;\n",
+       "    this.rubberband_context = undefined;\n",
+       "    this.format_dropdown = undefined;\n",
+       "\n",
+       "    this.image_mode = 'full';\n",
+       "\n",
+       "    this.root = $('<div/>');\n",
+       "    this._root_extra_style(this.root)\n",
+       "    this.root.attr('style', 'display: inline-block');\n",
+       "\n",
+       "    $(parent_element).append(this.root);\n",
+       "\n",
+       "    this._init_header(this);\n",
+       "    this._init_canvas(this);\n",
+       "    this._init_toolbar(this);\n",
+       "\n",
+       "    var fig = this;\n",
+       "\n",
+       "    this.waiting = false;\n",
+       "\n",
+       "    this.ws.onopen =  function () {\n",
+       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+       "            fig.send_message(\"send_image_mode\", {});\n",
+       "            if (mpl.ratio != 1) {\n",
+       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+       "            }\n",
+       "            fig.send_message(\"refresh\", {});\n",
+       "        }\n",
+       "\n",
+       "    this.imageObj.onload = function() {\n",
+       "            if (fig.image_mode == 'full') {\n",
+       "                // Full images could contain transparency (where diff images\n",
+       "                // almost always do), so we need to clear the canvas so that\n",
+       "                // there is no ghosting.\n",
+       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "            }\n",
+       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
+       "        };\n",
+       "\n",
+       "    this.imageObj.onunload = function() {\n",
+       "        fig.ws.close();\n",
+       "    }\n",
+       "\n",
+       "    this.ws.onmessage = this._make_on_message_function(this);\n",
+       "\n",
+       "    this.ondownload = ondownload;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_header = function() {\n",
+       "    var titlebar = $(\n",
+       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
+       "        'ui-helper-clearfix\"/>');\n",
+       "    var titletext = $(\n",
+       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
+       "        'text-align: center; padding: 3px;\"/>');\n",
+       "    titlebar.append(titletext)\n",
+       "    this.root.append(titlebar);\n",
+       "    this.header = titletext[0];\n",
+       "}\n",
+       "\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_canvas = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var canvas_div = $('<div/>');\n",
+       "\n",
+       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+       "\n",
+       "    function canvas_keyboard_event(event) {\n",
+       "        return fig.key_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+       "    this.canvas_div = canvas_div\n",
+       "    this._canvas_extra_style(canvas_div)\n",
+       "    this.root.append(canvas_div);\n",
+       "\n",
+       "    var canvas = $('<canvas/>');\n",
+       "    canvas.addClass('mpl-canvas');\n",
+       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+       "\n",
+       "    this.canvas = canvas[0];\n",
+       "    this.context = canvas[0].getContext(\"2d\");\n",
+       "\n",
+       "    var backingStore = this.context.backingStorePixelRatio ||\n",
+       "\tthis.context.webkitBackingStorePixelRatio ||\n",
+       "\tthis.context.mozBackingStorePixelRatio ||\n",
+       "\tthis.context.msBackingStorePixelRatio ||\n",
+       "\tthis.context.oBackingStorePixelRatio ||\n",
+       "\tthis.context.backingStorePixelRatio || 1;\n",
+       "\n",
+       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+       "\n",
+       "    var rubberband = $('<canvas/>');\n",
+       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+       "\n",
+       "    var pass_mouse_events = true;\n",
+       "\n",
+       "    canvas_div.resizable({\n",
+       "        start: function(event, ui) {\n",
+       "            pass_mouse_events = false;\n",
+       "        },\n",
+       "        resize: function(event, ui) {\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "        stop: function(event, ui) {\n",
+       "            pass_mouse_events = true;\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "    });\n",
+       "\n",
+       "    function mouse_event_fn(event) {\n",
+       "        if (pass_mouse_events)\n",
+       "            return fig.mouse_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
+       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
+       "    // Throttle sequential mouse events to 1 every 20ms.\n",
+       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+       "\n",
+       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+       "\n",
+       "    canvas_div.on(\"wheel\", function (event) {\n",
+       "        event = event.originalEvent;\n",
+       "        event['data'] = 'scroll'\n",
+       "        if (event.deltaY < 0) {\n",
+       "            event.step = 1;\n",
+       "        } else {\n",
+       "            event.step = -1;\n",
+       "        }\n",
+       "        mouse_event_fn(event);\n",
+       "    });\n",
+       "\n",
+       "    canvas_div.append(canvas);\n",
+       "    canvas_div.append(rubberband);\n",
+       "\n",
+       "    this.rubberband = rubberband;\n",
+       "    this.rubberband_canvas = rubberband[0];\n",
+       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
+       "\n",
+       "    this._resize_canvas = function(width, height) {\n",
+       "        // Keep the size of the canvas, canvas container, and rubber band\n",
+       "        // canvas in synch.\n",
+       "        canvas_div.css('width', width)\n",
+       "        canvas_div.css('height', height)\n",
+       "\n",
+       "        canvas.attr('width', width * mpl.ratio);\n",
+       "        canvas.attr('height', height * mpl.ratio);\n",
+       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+       "\n",
+       "        rubberband.attr('width', width);\n",
+       "        rubberband.attr('height', height);\n",
+       "    }\n",
+       "\n",
+       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+       "    // upon first draw.\n",
+       "    this._resize_canvas(600, 600);\n",
+       "\n",
+       "    // Disable right mouse context menu.\n",
+       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+       "        return false;\n",
+       "    });\n",
+       "\n",
+       "    function set_focus () {\n",
+       "        canvas.focus();\n",
+       "        canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    window.setTimeout(set_focus, 100);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) {\n",
+       "            // put a spacer in here.\n",
+       "            continue;\n",
+       "        }\n",
+       "        var button = $('<button/>');\n",
+       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+       "                        'ui-button-icon-only');\n",
+       "        button.attr('role', 'button');\n",
+       "        button.attr('aria-disabled', 'false');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "\n",
+       "        var icon_img = $('<span/>');\n",
+       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+       "        icon_img.addClass(image);\n",
+       "        icon_img.addClass('ui-corner-all');\n",
+       "\n",
+       "        var tooltip_span = $('<span/>');\n",
+       "        tooltip_span.addClass('ui-button-text');\n",
+       "        tooltip_span.html(tooltip);\n",
+       "\n",
+       "        button.append(icon_img);\n",
+       "        button.append(tooltip_span);\n",
+       "\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    var fmt_picker_span = $('<span/>');\n",
+       "\n",
+       "    var fmt_picker = $('<select/>');\n",
+       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+       "    fmt_picker_span.append(fmt_picker);\n",
+       "    nav_element.append(fmt_picker_span);\n",
+       "    this.format_dropdown = fmt_picker[0];\n",
+       "\n",
+       "    for (var ind in mpl.extensions) {\n",
+       "        var fmt = mpl.extensions[ind];\n",
+       "        var option = $(\n",
+       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+       "        fmt_picker.append(option)\n",
+       "    }\n",
+       "\n",
+       "    // Add hover states to the ui-buttons\n",
+       "    $( \".ui-button\" ).hover(\n",
+       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
+       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
+       "    );\n",
+       "\n",
+       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+       "    // which will in turn request a refresh of the image.\n",
+       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_message = function(type, properties) {\n",
+       "    properties['type'] = type;\n",
+       "    properties['figure_id'] = this.id;\n",
+       "    this.ws.send(JSON.stringify(properties));\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_draw_message = function() {\n",
+       "    if (!this.waiting) {\n",
+       "        this.waiting = true;\n",
+       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    var format_dropdown = fig.format_dropdown;\n",
+       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+       "    fig.ondownload(fig, format);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+       "    var size = msg['size'];\n",
+       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+       "        fig._resize_canvas(size[0], size[1]);\n",
+       "        fig.send_message(\"refresh\", {});\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+       "    var x0 = msg['x0'] / mpl.ratio;\n",
+       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+       "    var x1 = msg['x1'] / mpl.ratio;\n",
+       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+       "    x0 = Math.floor(x0) + 0.5;\n",
+       "    y0 = Math.floor(y0) + 0.5;\n",
+       "    x1 = Math.floor(x1) + 0.5;\n",
+       "    y1 = Math.floor(y1) + 0.5;\n",
+       "    var min_x = Math.min(x0, x1);\n",
+       "    var min_y = Math.min(y0, y1);\n",
+       "    var width = Math.abs(x1 - x0);\n",
+       "    var height = Math.abs(y1 - y0);\n",
+       "\n",
+       "    fig.rubberband_context.clearRect(\n",
+       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "\n",
+       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+       "    // Updates the figure title.\n",
+       "    fig.header.textContent = msg['label'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+       "    var cursor = msg['cursor'];\n",
+       "    switch(cursor)\n",
+       "    {\n",
+       "    case 0:\n",
+       "        cursor = 'pointer';\n",
+       "        break;\n",
+       "    case 1:\n",
+       "        cursor = 'default';\n",
+       "        break;\n",
+       "    case 2:\n",
+       "        cursor = 'crosshair';\n",
+       "        break;\n",
+       "    case 3:\n",
+       "        cursor = 'move';\n",
+       "        break;\n",
+       "    }\n",
+       "    fig.rubberband_canvas.style.cursor = cursor;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+       "    fig.message.textContent = msg['message'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+       "    // Request the server to send over a new figure.\n",
+       "    fig.send_draw_message();\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+       "    fig.image_mode = msg['mode'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Called whenever the canvas gets updated.\n",
+       "    this.send_message(\"ack\", {});\n",
+       "}\n",
+       "\n",
+       "// A function to construct a web socket function for onmessage handling.\n",
+       "// Called in the figure constructor.\n",
+       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+       "    return function socket_on_message(evt) {\n",
+       "        if (evt.data instanceof Blob) {\n",
+       "            /* FIXME: We get \"Resource interpreted as Image but\n",
+       "             * transferred with MIME type text/plain:\" errors on\n",
+       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
+       "             * to be part of the websocket stream */\n",
+       "            evt.data.type = \"image/png\";\n",
+       "\n",
+       "            /* Free the memory for the previous frames */\n",
+       "            if (fig.imageObj.src) {\n",
+       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
+       "                    fig.imageObj.src);\n",
+       "            }\n",
+       "\n",
+       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+       "                evt.data);\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+       "            fig.imageObj.src = evt.data;\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        var msg = JSON.parse(evt.data);\n",
+       "        var msg_type = msg['type'];\n",
+       "\n",
+       "        // Call the  \"handle_{type}\" callback, which takes\n",
+       "        // the figure and JSON message as its only arguments.\n",
+       "        try {\n",
+       "            var callback = fig[\"handle_\" + msg_type];\n",
+       "        } catch (e) {\n",
+       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        if (callback) {\n",
+       "            try {\n",
+       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+       "                callback(fig, msg);\n",
+       "            } catch (e) {\n",
+       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+       "            }\n",
+       "        }\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+       "mpl.findpos = function(e) {\n",
+       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+       "    var targ;\n",
+       "    if (!e)\n",
+       "        e = window.event;\n",
+       "    if (e.target)\n",
+       "        targ = e.target;\n",
+       "    else if (e.srcElement)\n",
+       "        targ = e.srcElement;\n",
+       "    if (targ.nodeType == 3) // defeat Safari bug\n",
+       "        targ = targ.parentNode;\n",
+       "\n",
+       "    // jQuery normalizes the pageX and pageY\n",
+       "    // pageX,Y are the mouse positions relative to the document\n",
+       "    // offset() returns the position of the element relative to the document\n",
+       "    var x = e.pageX - $(targ).offset().left;\n",
+       "    var y = e.pageY - $(targ).offset().top;\n",
+       "\n",
+       "    return {\"x\": x, \"y\": y};\n",
+       "};\n",
+       "\n",
+       "/*\n",
+       " * return a copy of an object with only non-object keys\n",
+       " * we need this to avoid circular references\n",
+       " * http://stackoverflow.com/a/24161582/3208463\n",
+       " */\n",
+       "function simpleKeys (original) {\n",
+       "  return Object.keys(original).reduce(function (obj, key) {\n",
+       "    if (typeof original[key] !== 'object')\n",
+       "        obj[key] = original[key]\n",
+       "    return obj;\n",
+       "  }, {});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+       "    var canvas_pos = mpl.findpos(event)\n",
+       "\n",
+       "    if (name === 'button_press')\n",
+       "    {\n",
+       "        this.canvas.focus();\n",
+       "        this.canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    var x = canvas_pos.x * mpl.ratio;\n",
+       "    var y = canvas_pos.y * mpl.ratio;\n",
+       "\n",
+       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
+       "                             step: event.step,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "\n",
+       "    /* This prevents the web browser from automatically changing to\n",
+       "     * the text insertion cursor when the button is pressed.  We want\n",
+       "     * to control all of the cursor setting manually through the\n",
+       "     * 'cursor' event from matplotlib */\n",
+       "    event.preventDefault();\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    // Handle any extra behaviour associated with a key event\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.key_event = function(event, name) {\n",
+       "\n",
+       "    // Prevent repeat events\n",
+       "    if (name == 'key_press')\n",
+       "    {\n",
+       "        if (event.which === this._key)\n",
+       "            return;\n",
+       "        else\n",
+       "            this._key = event.which;\n",
+       "    }\n",
+       "    if (name == 'key_release')\n",
+       "        this._key = null;\n",
+       "\n",
+       "    var value = '';\n",
+       "    if (event.ctrlKey && event.which != 17)\n",
+       "        value += \"ctrl+\";\n",
+       "    if (event.altKey && event.which != 18)\n",
+       "        value += \"alt+\";\n",
+       "    if (event.shiftKey && event.which != 16)\n",
+       "        value += \"shift+\";\n",
+       "\n",
+       "    value += 'k';\n",
+       "    value += event.which.toString();\n",
+       "\n",
+       "    this._key_event_extra(event, name);\n",
+       "\n",
+       "    this.send_message(name, {key: value,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+       "    if (name == 'download') {\n",
+       "        this.handle_save(this, null);\n",
+       "    } else {\n",
+       "        this.send_message(\"toolbar_button\", {name: name});\n",
+       "    }\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+       "    this.message.textContent = tooltip;\n",
+       "};\n",
+       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+       "\n",
+       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+       "\n",
+       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
+       "    // object with the appropriate methods. Currently this is a non binary\n",
+       "    // socket, so there is still some room for performance tuning.\n",
+       "    var ws = {};\n",
+       "\n",
+       "    ws.close = function() {\n",
+       "        comm.close()\n",
+       "    };\n",
+       "    ws.send = function(m) {\n",
+       "        //console.log('sending', m);\n",
+       "        comm.send(m);\n",
+       "    };\n",
+       "    // Register the callback with on_msg.\n",
+       "    comm.on_msg(function(msg) {\n",
+       "        //console.log('receiving', msg['content']['data'], msg);\n",
+       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+       "        ws.onmessage(msg['content']['data'])\n",
+       "    });\n",
+       "    return ws;\n",
+       "}\n",
+       "\n",
+       "mpl.mpl_figure_comm = function(comm, msg) {\n",
+       "    // This is the function which gets called when the mpl process\n",
+       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+       "\n",
+       "    var id = msg.content.data.id;\n",
+       "    // Get hold of the div created by the display call when the Comm\n",
+       "    // socket was opened in Python.\n",
+       "    var element = $(\"#\" + id);\n",
+       "    var ws_proxy = comm_websocket_adapter(comm)\n",
+       "\n",
+       "    function ondownload(figure, format) {\n",
+       "        window.open(figure.imageObj.src);\n",
+       "    }\n",
+       "\n",
+       "    var fig = new mpl.figure(id, ws_proxy,\n",
+       "                           ondownload,\n",
+       "                           element.get(0));\n",
+       "\n",
+       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+       "    // web socket which is closed, not our websocket->open comm proxy.\n",
+       "    ws_proxy.onopen();\n",
+       "\n",
+       "    fig.parent_element = element.get(0);\n",
+       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+       "    if (!fig.cell_info) {\n",
+       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
+       "        return;\n",
+       "    }\n",
+       "\n",
+       "    var output_index = fig.cell_info[2]\n",
+       "    var cell = fig.cell_info[0];\n",
+       "\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+       "    var width = fig.canvas.width/mpl.ratio\n",
+       "    fig.root.unbind('remove')\n",
+       "\n",
+       "    // Update the output cell to use the data from the current canvas.\n",
+       "    fig.push_to_output();\n",
+       "    var dataURL = fig.canvas.toDataURL();\n",
+       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+       "    // the notebook keyboard shortcuts fail.\n",
+       "    IPython.keyboard_manager.enable()\n",
+       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
+       "    fig.close_ws(fig, msg);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+       "    fig.send_message('closing', msg);\n",
+       "    // fig.ws.close()\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+       "    // Turn the data on the canvas into data in the output cell.\n",
+       "    var width = this.canvas.width/mpl.ratio\n",
+       "    var dataURL = this.canvas.toDataURL();\n",
+       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Tell IPython that the notebook contents must change.\n",
+       "    IPython.notebook.set_dirty(true);\n",
+       "    this.send_message(\"ack\", {});\n",
+       "    var fig = this;\n",
+       "    // Wait a second, then push the new image to the DOM so\n",
+       "    // that it is saved nicely (might be nice to debounce this).\n",
+       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items){\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) { continue; };\n",
+       "\n",
+       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    // Add the status bar.\n",
+       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "\n",
+       "    // Add the close button to the window.\n",
+       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
+       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
+       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+       "    buttongrp.append(button);\n",
+       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+       "    titlebar.prepend(buttongrp);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(el){\n",
+       "    var fig = this\n",
+       "    el.on(\"remove\", function(){\n",
+       "\tfig.close_ws(fig, {});\n",
+       "    });\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+       "    // this is important to make the div 'focusable\n",
+       "    el.attr('tabindex', 0)\n",
+       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
+       "    // off when our div gets focus\n",
+       "\n",
+       "    // location in version 3\n",
+       "    if (IPython.notebook.keyboard_manager) {\n",
+       "        IPython.notebook.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "    else {\n",
+       "        // location in version 2\n",
+       "        IPython.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    var manager = IPython.notebook.keyboard_manager;\n",
+       "    if (!manager)\n",
+       "        manager = IPython.keyboard_manager;\n",
+       "\n",
+       "    // Check for shift+enter\n",
+       "    if (event.shiftKey && event.which == 13) {\n",
+       "        this.canvas_div.blur();\n",
+       "        event.shiftKey = false;\n",
+       "        // Send a \"J\" for go to next cell\n",
+       "        event.which = 74;\n",
+       "        event.keyCode = 74;\n",
+       "        manager.command_mode();\n",
+       "        manager.handle_keydown(event);\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    fig.ondownload(fig, null);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.find_output_cell = function(html_output) {\n",
+       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+       "    // IPython event is triggered only after the cells have been serialised, which for\n",
+       "    // our purposes (turning an active figure into a static one), is too late.\n",
+       "    var cells = IPython.notebook.get_cells();\n",
+       "    var ncells = cells.length;\n",
+       "    for (var i=0; i<ncells; i++) {\n",
+       "        var cell = cells[i];\n",
+       "        if (cell.cell_type === 'code'){\n",
+       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
+       "                var data = cell.output_area.outputs[j];\n",
+       "                if (data.data) {\n",
+       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
+       "                    data = data.data;\n",
+       "                }\n",
+       "                if (data['text/html'] == html_output) {\n",
+       "                    return [cell, data, j];\n",
+       "                }\n",
+       "            }\n",
+       "        }\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "// Register the function which deals with the matplotlib target/channel.\n",
+       "// The kernel may be null if the page has been refreshed.\n",
+       "if (IPython.notebook.kernel != null) {\n",
+       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+       "}\n"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Javascript object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<img src=\"data:image/png;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAlyiK/w3JgUGN94ciLgAAAABJRU5ErkJggg==\" width=\"720\">"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=3), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=14032), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%matplotlib nbagg\n",
+    "\n",
+    "num_split=1\n",
+    "np.random.seed(SEED+num_split)\n",
+    "torch.manual_seed(SEED+num_split)\n",
+    "torch.cuda.manual_seed(SEED+num_split)\n",
+    "#torch.backends.cudnn.deterministic = True\n",
+    "idx_train = train_df[train_df.PID.isin(set(split_sid[splits[num_split][0]]))].index.values\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "idx_train.shape\n",
+    "idx_validate.shape\n",
+    "\n",
+    "klr=1\n",
+    "batch_size=32\n",
+    "num_workers=12\n",
+    "num_epochs=3\n",
+    "model_name,version = 'Densenet169_3' , 'classifier_splits'\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   )\n",
+    "\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,'basic_splits',num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "weights = torch.tensor([1.,1.,1.,1.,1.,2.],device=device)\n",
+    "loss_func=my_loss\n",
+    "targets_dataset=D.TensorDataset(torch.tensor(train_df[hemorrhage_types].values,dtype=torch.float))\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "imagedataset = ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                           window_eq=False,equalize=False,rescale=True)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "imagedataset_val = ImageDataset(train_df,transform=transform_val.random,base_path=train_images_dir,\n",
+    "                               window_eq=False,equalize=False,rescale=True)\n",
+    "combined_dataset=DatasetCat([imagedataset,targets_dataset])\n",
+    "combined_dataset_val=DatasetCat([imagedataset_val,targets_dataset])\n",
+    "optimizer_grouped_parameters=get_optimizer_parameters(model,klr)\n",
+    "sampling=simple_sampler(train_df[hemorrhage_types].values[idx_train],0.25)\n",
+    "sample_ratio=1.0\n",
+    "train_dataset=D.Subset(combined_dataset,idx_train)\n",
+    "validate_dataset=D.Subset(combined_dataset_val,idx_validate)\n",
+    "num_train_optimization_steps = num_epochs*(sample_ratio*len(train_dataset)//batch_size+int(len(train_dataset)%batch_size>0))\n",
+    "fig,ax = plt.subplots(figsize=(10,7))\n",
+    "gr=loss_graph(fig,ax,num_epochs,int(num_train_optimization_steps/num_epochs)+1,limits=(0.05,0.2))\n",
+    "sched=WarmupExpCosineWithWarmupRestartsSchedule( t_total=num_train_optimization_steps, cycles=num_epochs,tau=1.5)\n",
+    "optimizer = BertAdam(optimizer_grouped_parameters,lr=klr*1e-3,schedule=sched)\n",
+    "model, optimizer = amp.initialize(model, optimizer, opt_level=\"O1\",verbosity=0)\n",
+    "history,best_model= model_train(model,\n",
+    "                                optimizer,\n",
+    "                                train_dataset,\n",
+    "                                batch_size,\n",
+    "                                num_epochs,\n",
+    "                                loss_func,\n",
+    "                                weights=weights,\n",
+    "                                do_apex=False,\n",
+    "                                model_apexed=True,\n",
+    "                                validate_dataset=validate_dataset,\n",
+    "                                param_schedualer=None,\n",
+    "                                weights_data=None,\n",
+    "                                metric=None,\n",
+    "                                return_model=True,\n",
+    "                                num_workers=num_workers,\n",
+    "                                sampler=None,\n",
+    "                                pre_process = None,\n",
+    "                                graph=gr,\n",
+    "                                call_progress=sendmeemail)\n",
+    "\n",
+    "torch.save(model.state_dict(), models_dir+models_format.format(model_name,version,num_split))\n",
+    "torch.save(best_model.state_dict(), models_dir+models_format.format(model_name,version+'_best',num_split))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<torch._C.Generator at 0x7fe53c62a630>"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(449503,)"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(224749,)"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "/* Put everything inside the global mpl namespace */\n",
+       "window.mpl = {};\n",
+       "\n",
+       "\n",
+       "mpl.get_websocket_type = function() {\n",
+       "    if (typeof(WebSocket) !== 'undefined') {\n",
+       "        return WebSocket;\n",
+       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+       "        return MozWebSocket;\n",
+       "    } else {\n",
+       "        alert('Your browser does not have WebSocket support.' +\n",
+       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+       "              'Firefox 4 and 5 are also supported but you ' +\n",
+       "              'have to enable WebSockets in about:config.');\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+       "    this.id = figure_id;\n",
+       "\n",
+       "    this.ws = websocket;\n",
+       "\n",
+       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
+       "\n",
+       "    if (!this.supports_binary) {\n",
+       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
+       "        if (warnings) {\n",
+       "            warnings.style.display = 'block';\n",
+       "            warnings.textContent = (\n",
+       "                \"This browser does not support binary websocket messages. \" +\n",
+       "                    \"Performance may be slow.\");\n",
+       "        }\n",
+       "    }\n",
+       "\n",
+       "    this.imageObj = new Image();\n",
+       "\n",
+       "    this.context = undefined;\n",
+       "    this.message = undefined;\n",
+       "    this.canvas = undefined;\n",
+       "    this.rubberband_canvas = undefined;\n",
+       "    this.rubberband_context = undefined;\n",
+       "    this.format_dropdown = undefined;\n",
+       "\n",
+       "    this.image_mode = 'full';\n",
+       "\n",
+       "    this.root = $('<div/>');\n",
+       "    this._root_extra_style(this.root)\n",
+       "    this.root.attr('style', 'display: inline-block');\n",
+       "\n",
+       "    $(parent_element).append(this.root);\n",
+       "\n",
+       "    this._init_header(this);\n",
+       "    this._init_canvas(this);\n",
+       "    this._init_toolbar(this);\n",
+       "\n",
+       "    var fig = this;\n",
+       "\n",
+       "    this.waiting = false;\n",
+       "\n",
+       "    this.ws.onopen =  function () {\n",
+       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+       "            fig.send_message(\"send_image_mode\", {});\n",
+       "            if (mpl.ratio != 1) {\n",
+       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+       "            }\n",
+       "            fig.send_message(\"refresh\", {});\n",
+       "        }\n",
+       "\n",
+       "    this.imageObj.onload = function() {\n",
+       "            if (fig.image_mode == 'full') {\n",
+       "                // Full images could contain transparency (where diff images\n",
+       "                // almost always do), so we need to clear the canvas so that\n",
+       "                // there is no ghosting.\n",
+       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "            }\n",
+       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
+       "        };\n",
+       "\n",
+       "    this.imageObj.onunload = function() {\n",
+       "        fig.ws.close();\n",
+       "    }\n",
+       "\n",
+       "    this.ws.onmessage = this._make_on_message_function(this);\n",
+       "\n",
+       "    this.ondownload = ondownload;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_header = function() {\n",
+       "    var titlebar = $(\n",
+       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
+       "        'ui-helper-clearfix\"/>');\n",
+       "    var titletext = $(\n",
+       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
+       "        'text-align: center; padding: 3px;\"/>');\n",
+       "    titlebar.append(titletext)\n",
+       "    this.root.append(titlebar);\n",
+       "    this.header = titletext[0];\n",
+       "}\n",
+       "\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_canvas = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var canvas_div = $('<div/>');\n",
+       "\n",
+       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+       "\n",
+       "    function canvas_keyboard_event(event) {\n",
+       "        return fig.key_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+       "    this.canvas_div = canvas_div\n",
+       "    this._canvas_extra_style(canvas_div)\n",
+       "    this.root.append(canvas_div);\n",
+       "\n",
+       "    var canvas = $('<canvas/>');\n",
+       "    canvas.addClass('mpl-canvas');\n",
+       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+       "\n",
+       "    this.canvas = canvas[0];\n",
+       "    this.context = canvas[0].getContext(\"2d\");\n",
+       "\n",
+       "    var backingStore = this.context.backingStorePixelRatio ||\n",
+       "\tthis.context.webkitBackingStorePixelRatio ||\n",
+       "\tthis.context.mozBackingStorePixelRatio ||\n",
+       "\tthis.context.msBackingStorePixelRatio ||\n",
+       "\tthis.context.oBackingStorePixelRatio ||\n",
+       "\tthis.context.backingStorePixelRatio || 1;\n",
+       "\n",
+       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+       "\n",
+       "    var rubberband = $('<canvas/>');\n",
+       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+       "\n",
+       "    var pass_mouse_events = true;\n",
+       "\n",
+       "    canvas_div.resizable({\n",
+       "        start: function(event, ui) {\n",
+       "            pass_mouse_events = false;\n",
+       "        },\n",
+       "        resize: function(event, ui) {\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "        stop: function(event, ui) {\n",
+       "            pass_mouse_events = true;\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "    });\n",
+       "\n",
+       "    function mouse_event_fn(event) {\n",
+       "        if (pass_mouse_events)\n",
+       "            return fig.mouse_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
+       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
+       "    // Throttle sequential mouse events to 1 every 20ms.\n",
+       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+       "\n",
+       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+       "\n",
+       "    canvas_div.on(\"wheel\", function (event) {\n",
+       "        event = event.originalEvent;\n",
+       "        event['data'] = 'scroll'\n",
+       "        if (event.deltaY < 0) {\n",
+       "            event.step = 1;\n",
+       "        } else {\n",
+       "            event.step = -1;\n",
+       "        }\n",
+       "        mouse_event_fn(event);\n",
+       "    });\n",
+       "\n",
+       "    canvas_div.append(canvas);\n",
+       "    canvas_div.append(rubberband);\n",
+       "\n",
+       "    this.rubberband = rubberband;\n",
+       "    this.rubberband_canvas = rubberband[0];\n",
+       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
+       "\n",
+       "    this._resize_canvas = function(width, height) {\n",
+       "        // Keep the size of the canvas, canvas container, and rubber band\n",
+       "        // canvas in synch.\n",
+       "        canvas_div.css('width', width)\n",
+       "        canvas_div.css('height', height)\n",
+       "\n",
+       "        canvas.attr('width', width * mpl.ratio);\n",
+       "        canvas.attr('height', height * mpl.ratio);\n",
+       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+       "\n",
+       "        rubberband.attr('width', width);\n",
+       "        rubberband.attr('height', height);\n",
+       "    }\n",
+       "\n",
+       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+       "    // upon first draw.\n",
+       "    this._resize_canvas(600, 600);\n",
+       "\n",
+       "    // Disable right mouse context menu.\n",
+       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+       "        return false;\n",
+       "    });\n",
+       "\n",
+       "    function set_focus () {\n",
+       "        canvas.focus();\n",
+       "        canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    window.setTimeout(set_focus, 100);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) {\n",
+       "            // put a spacer in here.\n",
+       "            continue;\n",
+       "        }\n",
+       "        var button = $('<button/>');\n",
+       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+       "                        'ui-button-icon-only');\n",
+       "        button.attr('role', 'button');\n",
+       "        button.attr('aria-disabled', 'false');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "\n",
+       "        var icon_img = $('<span/>');\n",
+       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+       "        icon_img.addClass(image);\n",
+       "        icon_img.addClass('ui-corner-all');\n",
+       "\n",
+       "        var tooltip_span = $('<span/>');\n",
+       "        tooltip_span.addClass('ui-button-text');\n",
+       "        tooltip_span.html(tooltip);\n",
+       "\n",
+       "        button.append(icon_img);\n",
+       "        button.append(tooltip_span);\n",
+       "\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    var fmt_picker_span = $('<span/>');\n",
+       "\n",
+       "    var fmt_picker = $('<select/>');\n",
+       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+       "    fmt_picker_span.append(fmt_picker);\n",
+       "    nav_element.append(fmt_picker_span);\n",
+       "    this.format_dropdown = fmt_picker[0];\n",
+       "\n",
+       "    for (var ind in mpl.extensions) {\n",
+       "        var fmt = mpl.extensions[ind];\n",
+       "        var option = $(\n",
+       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+       "        fmt_picker.append(option)\n",
+       "    }\n",
+       "\n",
+       "    // Add hover states to the ui-buttons\n",
+       "    $( \".ui-button\" ).hover(\n",
+       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
+       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
+       "    );\n",
+       "\n",
+       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+       "    // which will in turn request a refresh of the image.\n",
+       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_message = function(type, properties) {\n",
+       "    properties['type'] = type;\n",
+       "    properties['figure_id'] = this.id;\n",
+       "    this.ws.send(JSON.stringify(properties));\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_draw_message = function() {\n",
+       "    if (!this.waiting) {\n",
+       "        this.waiting = true;\n",
+       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    var format_dropdown = fig.format_dropdown;\n",
+       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+       "    fig.ondownload(fig, format);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+       "    var size = msg['size'];\n",
+       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+       "        fig._resize_canvas(size[0], size[1]);\n",
+       "        fig.send_message(\"refresh\", {});\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+       "    var x0 = msg['x0'] / mpl.ratio;\n",
+       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+       "    var x1 = msg['x1'] / mpl.ratio;\n",
+       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+       "    x0 = Math.floor(x0) + 0.5;\n",
+       "    y0 = Math.floor(y0) + 0.5;\n",
+       "    x1 = Math.floor(x1) + 0.5;\n",
+       "    y1 = Math.floor(y1) + 0.5;\n",
+       "    var min_x = Math.min(x0, x1);\n",
+       "    var min_y = Math.min(y0, y1);\n",
+       "    var width = Math.abs(x1 - x0);\n",
+       "    var height = Math.abs(y1 - y0);\n",
+       "\n",
+       "    fig.rubberband_context.clearRect(\n",
+       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "\n",
+       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+       "    // Updates the figure title.\n",
+       "    fig.header.textContent = msg['label'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+       "    var cursor = msg['cursor'];\n",
+       "    switch(cursor)\n",
+       "    {\n",
+       "    case 0:\n",
+       "        cursor = 'pointer';\n",
+       "        break;\n",
+       "    case 1:\n",
+       "        cursor = 'default';\n",
+       "        break;\n",
+       "    case 2:\n",
+       "        cursor = 'crosshair';\n",
+       "        break;\n",
+       "    case 3:\n",
+       "        cursor = 'move';\n",
+       "        break;\n",
+       "    }\n",
+       "    fig.rubberband_canvas.style.cursor = cursor;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+       "    fig.message.textContent = msg['message'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+       "    // Request the server to send over a new figure.\n",
+       "    fig.send_draw_message();\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+       "    fig.image_mode = msg['mode'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Called whenever the canvas gets updated.\n",
+       "    this.send_message(\"ack\", {});\n",
+       "}\n",
+       "\n",
+       "// A function to construct a web socket function for onmessage handling.\n",
+       "// Called in the figure constructor.\n",
+       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+       "    return function socket_on_message(evt) {\n",
+       "        if (evt.data instanceof Blob) {\n",
+       "            /* FIXME: We get \"Resource interpreted as Image but\n",
+       "             * transferred with MIME type text/plain:\" errors on\n",
+       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
+       "             * to be part of the websocket stream */\n",
+       "            evt.data.type = \"image/png\";\n",
+       "\n",
+       "            /* Free the memory for the previous frames */\n",
+       "            if (fig.imageObj.src) {\n",
+       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
+       "                    fig.imageObj.src);\n",
+       "            }\n",
+       "\n",
+       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+       "                evt.data);\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+       "            fig.imageObj.src = evt.data;\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        var msg = JSON.parse(evt.data);\n",
+       "        var msg_type = msg['type'];\n",
+       "\n",
+       "        // Call the  \"handle_{type}\" callback, which takes\n",
+       "        // the figure and JSON message as its only arguments.\n",
+       "        try {\n",
+       "            var callback = fig[\"handle_\" + msg_type];\n",
+       "        } catch (e) {\n",
+       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        if (callback) {\n",
+       "            try {\n",
+       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+       "                callback(fig, msg);\n",
+       "            } catch (e) {\n",
+       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+       "            }\n",
+       "        }\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+       "mpl.findpos = function(e) {\n",
+       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+       "    var targ;\n",
+       "    if (!e)\n",
+       "        e = window.event;\n",
+       "    if (e.target)\n",
+       "        targ = e.target;\n",
+       "    else if (e.srcElement)\n",
+       "        targ = e.srcElement;\n",
+       "    if (targ.nodeType == 3) // defeat Safari bug\n",
+       "        targ = targ.parentNode;\n",
+       "\n",
+       "    // jQuery normalizes the pageX and pageY\n",
+       "    // pageX,Y are the mouse positions relative to the document\n",
+       "    // offset() returns the position of the element relative to the document\n",
+       "    var x = e.pageX - $(targ).offset().left;\n",
+       "    var y = e.pageY - $(targ).offset().top;\n",
+       "\n",
+       "    return {\"x\": x, \"y\": y};\n",
+       "};\n",
+       "\n",
+       "/*\n",
+       " * return a copy of an object with only non-object keys\n",
+       " * we need this to avoid circular references\n",
+       " * http://stackoverflow.com/a/24161582/3208463\n",
+       " */\n",
+       "function simpleKeys (original) {\n",
+       "  return Object.keys(original).reduce(function (obj, key) {\n",
+       "    if (typeof original[key] !== 'object')\n",
+       "        obj[key] = original[key]\n",
+       "    return obj;\n",
+       "  }, {});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+       "    var canvas_pos = mpl.findpos(event)\n",
+       "\n",
+       "    if (name === 'button_press')\n",
+       "    {\n",
+       "        this.canvas.focus();\n",
+       "        this.canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    var x = canvas_pos.x * mpl.ratio;\n",
+       "    var y = canvas_pos.y * mpl.ratio;\n",
+       "\n",
+       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
+       "                             step: event.step,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "\n",
+       "    /* This prevents the web browser from automatically changing to\n",
+       "     * the text insertion cursor when the button is pressed.  We want\n",
+       "     * to control all of the cursor setting manually through the\n",
+       "     * 'cursor' event from matplotlib */\n",
+       "    event.preventDefault();\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    // Handle any extra behaviour associated with a key event\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.key_event = function(event, name) {\n",
+       "\n",
+       "    // Prevent repeat events\n",
+       "    if (name == 'key_press')\n",
+       "    {\n",
+       "        if (event.which === this._key)\n",
+       "            return;\n",
+       "        else\n",
+       "            this._key = event.which;\n",
+       "    }\n",
+       "    if (name == 'key_release')\n",
+       "        this._key = null;\n",
+       "\n",
+       "    var value = '';\n",
+       "    if (event.ctrlKey && event.which != 17)\n",
+       "        value += \"ctrl+\";\n",
+       "    if (event.altKey && event.which != 18)\n",
+       "        value += \"alt+\";\n",
+       "    if (event.shiftKey && event.which != 16)\n",
+       "        value += \"shift+\";\n",
+       "\n",
+       "    value += 'k';\n",
+       "    value += event.which.toString();\n",
+       "\n",
+       "    this._key_event_extra(event, name);\n",
+       "\n",
+       "    this.send_message(name, {key: value,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+       "    if (name == 'download') {\n",
+       "        this.handle_save(this, null);\n",
+       "    } else {\n",
+       "        this.send_message(\"toolbar_button\", {name: name});\n",
+       "    }\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+       "    this.message.textContent = tooltip;\n",
+       "};\n",
+       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+       "\n",
+       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+       "\n",
+       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
+       "    // object with the appropriate methods. Currently this is a non binary\n",
+       "    // socket, so there is still some room for performance tuning.\n",
+       "    var ws = {};\n",
+       "\n",
+       "    ws.close = function() {\n",
+       "        comm.close()\n",
+       "    };\n",
+       "    ws.send = function(m) {\n",
+       "        //console.log('sending', m);\n",
+       "        comm.send(m);\n",
+       "    };\n",
+       "    // Register the callback with on_msg.\n",
+       "    comm.on_msg(function(msg) {\n",
+       "        //console.log('receiving', msg['content']['data'], msg);\n",
+       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+       "        ws.onmessage(msg['content']['data'])\n",
+       "    });\n",
+       "    return ws;\n",
+       "}\n",
+       "\n",
+       "mpl.mpl_figure_comm = function(comm, msg) {\n",
+       "    // This is the function which gets called when the mpl process\n",
+       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+       "\n",
+       "    var id = msg.content.data.id;\n",
+       "    // Get hold of the div created by the display call when the Comm\n",
+       "    // socket was opened in Python.\n",
+       "    var element = $(\"#\" + id);\n",
+       "    var ws_proxy = comm_websocket_adapter(comm)\n",
+       "\n",
+       "    function ondownload(figure, format) {\n",
+       "        window.open(figure.imageObj.src);\n",
+       "    }\n",
+       "\n",
+       "    var fig = new mpl.figure(id, ws_proxy,\n",
+       "                           ondownload,\n",
+       "                           element.get(0));\n",
+       "\n",
+       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+       "    // web socket which is closed, not our websocket->open comm proxy.\n",
+       "    ws_proxy.onopen();\n",
+       "\n",
+       "    fig.parent_element = element.get(0);\n",
+       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+       "    if (!fig.cell_info) {\n",
+       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
+       "        return;\n",
+       "    }\n",
+       "\n",
+       "    var output_index = fig.cell_info[2]\n",
+       "    var cell = fig.cell_info[0];\n",
+       "\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+       "    var width = fig.canvas.width/mpl.ratio\n",
+       "    fig.root.unbind('remove')\n",
+       "\n",
+       "    // Update the output cell to use the data from the current canvas.\n",
+       "    fig.push_to_output();\n",
+       "    var dataURL = fig.canvas.toDataURL();\n",
+       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+       "    // the notebook keyboard shortcuts fail.\n",
+       "    IPython.keyboard_manager.enable()\n",
+       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
+       "    fig.close_ws(fig, msg);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+       "    fig.send_message('closing', msg);\n",
+       "    // fig.ws.close()\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+       "    // Turn the data on the canvas into data in the output cell.\n",
+       "    var width = this.canvas.width/mpl.ratio\n",
+       "    var dataURL = this.canvas.toDataURL();\n",
+       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Tell IPython that the notebook contents must change.\n",
+       "    IPython.notebook.set_dirty(true);\n",
+       "    this.send_message(\"ack\", {});\n",
+       "    var fig = this;\n",
+       "    // Wait a second, then push the new image to the DOM so\n",
+       "    // that it is saved nicely (might be nice to debounce this).\n",
+       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items){\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) { continue; };\n",
+       "\n",
+       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    // Add the status bar.\n",
+       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "\n",
+       "    // Add the close button to the window.\n",
+       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
+       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
+       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+       "    buttongrp.append(button);\n",
+       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+       "    titlebar.prepend(buttongrp);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(el){\n",
+       "    var fig = this\n",
+       "    el.on(\"remove\", function(){\n",
+       "\tfig.close_ws(fig, {});\n",
+       "    });\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+       "    // this is important to make the div 'focusable\n",
+       "    el.attr('tabindex', 0)\n",
+       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
+       "    // off when our div gets focus\n",
+       "\n",
+       "    // location in version 3\n",
+       "    if (IPython.notebook.keyboard_manager) {\n",
+       "        IPython.notebook.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "    else {\n",
+       "        // location in version 2\n",
+       "        IPython.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    var manager = IPython.notebook.keyboard_manager;\n",
+       "    if (!manager)\n",
+       "        manager = IPython.keyboard_manager;\n",
+       "\n",
+       "    // Check for shift+enter\n",
+       "    if (event.shiftKey && event.which == 13) {\n",
+       "        this.canvas_div.blur();\n",
+       "        event.shiftKey = false;\n",
+       "        // Send a \"J\" for go to next cell\n",
+       "        event.which = 74;\n",
+       "        event.keyCode = 74;\n",
+       "        manager.command_mode();\n",
+       "        manager.handle_keydown(event);\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    fig.ondownload(fig, null);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.find_output_cell = function(html_output) {\n",
+       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+       "    // IPython event is triggered only after the cells have been serialised, which for\n",
+       "    // our purposes (turning an active figure into a static one), is too late.\n",
+       "    var cells = IPython.notebook.get_cells();\n",
+       "    var ncells = cells.length;\n",
+       "    for (var i=0; i<ncells; i++) {\n",
+       "        var cell = cells[i];\n",
+       "        if (cell.cell_type === 'code'){\n",
+       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
+       "                var data = cell.output_area.outputs[j];\n",
+       "                if (data.data) {\n",
+       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
+       "                    data = data.data;\n",
+       "                }\n",
+       "                if (data['text/html'] == html_output) {\n",
+       "                    return [cell, data, j];\n",
+       "                }\n",
+       "            }\n",
+       "        }\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "// Register the function which deals with the matplotlib target/channel.\n",
+       "// The kernel may be null if the page has been refreshed.\n",
+       "if (IPython.notebook.kernel != null) {\n",
+       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+       "}\n"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Javascript object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<img src=\"data:image/png;base64,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\" width=\"720\">"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "048835455e1240eca8fe9bc3027dfec5",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=2), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "43ccbdca5e0440fc868acdc0824d5d79",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=5735), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "2271970109d94274bcb482db118eef96",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7024), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.2221166049806295, 'val_loss': 0.12875761505553673}\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "6a2ff3d0ae704244b2369ad59f64330c",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=5735), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "fea6da24311d488090717a2e53651c51",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7024), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.184453817157075, 'val_loss': 0.113561624119054}\n",
+      "\n",
+      "0.113561624119054\n"
+     ]
+    }
+   ],
+   "source": [
+    "%matplotlib nbagg\n",
+    "\n",
+    "num_split=2\n",
+    "np.random.seed(SEED+num_split)\n",
+    "torch.manual_seed(SEED+num_split)\n",
+    "torch.cuda.manual_seed(SEED+num_split)\n",
+    "#torch.backends.cudnn.deterministic = True\n",
+    "idx_train = train_df[train_df.PID.isin(set(split_sid[splits[num_split][0]]))].index.values\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "idx_train.shape\n",
+    "idx_validate.shape\n",
+    "\n",
+    "klr=1\n",
+    "batch_size=32\n",
+    "num_workers=12\n",
+    "num_epochs=2\n",
+    "model_name,version = 'Densenet169_3' , 'basic_splits'\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   )\n",
+    "\n",
+    "_=model.to(device)\n",
+    "weights = torch.tensor([1.,1.,1.,1.,1.,2.],device=device)\n",
+    "loss_func=my_loss\n",
+    "targets_dataset=D.TensorDataset(torch.tensor(train_df[hemorrhage_types].values,dtype=torch.float))\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "imagedataset = ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                           window_eq=False,equalize=False,rescale=True)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "imagedataset_val = ImageDataset(train_df,transform=transform_val.random,base_path=train_images_dir,\n",
+    "                               window_eq=False,equalize=False,rescale=True)\n",
+    "combined_dataset=DatasetCat([imagedataset,targets_dataset])\n",
+    "combined_dataset_val=DatasetCat([imagedataset_val,targets_dataset])\n",
+    "#param_s=parameter_scheduler(model,num_epoch=0)\n",
+    "optimizer_grouped_parameters=get_optimizer_parameters(model,klr)\n",
+    "sampling=sampler(train_df[hemorrhage_types].values[idx_train],0.2,[10,1,1,1,1,0])\n",
+    "sample_ratio=1.02*float(sampling().shape[0])/idx_train.shape[0]\n",
+    "train_dataset=D.Subset(combined_dataset,idx_train)\n",
+    "validate_dataset=D.Subset(combined_dataset_val,idx_validate)\n",
+    "num_train_optimization_steps = num_epochs*(sample_ratio*len(train_dataset)//batch_size+int(len(train_dataset)%batch_size>0))\n",
+    "fig,ax = plt.subplots(figsize=(10,7))\n",
+    "gr=loss_graph(fig,ax,num_epochs,int(num_train_optimization_steps/num_epochs)+1,limits=[0.05,0.4])\n",
+    "sched=WarmupExpCosineWithWarmupRestartsSchedule( t_total=num_train_optimization_steps, cycles=num_epochs//2,tau=1)\n",
+    "optimizer = BertAdam(optimizer_grouped_parameters,lr=klr*1e-3,schedule=sched)\n",
+    "model, optimizer = amp.initialize(model, optimizer, opt_level=\"O1\",verbosity=0)\n",
+    "history,best_model= model_train(model,\n",
+    "                                optimizer,\n",
+    "                                train_dataset,\n",
+    "                                batch_size,\n",
+    "                                num_epochs,\n",
+    "                                loss_func,\n",
+    "                                weights=weights,\n",
+    "                                do_apex=False,\n",
+    "                                model_apexed=True,\n",
+    "                                validate_dataset=validate_dataset,\n",
+    "                                param_schedualer=None,\n",
+    "                                weights_data=None,\n",
+    "                                metric=None,\n",
+    "                                return_model=True,\n",
+    "                                num_workers=num_workers,\n",
+    "                                sampler=sampling,\n",
+    "                                graph=gr,\n",
+    "                                call_progress=sendmeemail)\n",
+    "torch.save(model.state_dict(), models_dir+models_format.format(model_name,version,num_split))\n",
+    "torch.save(best_model.state_dict(), models_dir+models_format.format(model_name,version+'_best',num_split))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<torch._C.Generator at 0x7fe53c62a630>"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(449503,)"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "(224749,)"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "/* Put everything inside the global mpl namespace */\n",
+       "window.mpl = {};\n",
+       "\n",
+       "\n",
+       "mpl.get_websocket_type = function() {\n",
+       "    if (typeof(WebSocket) !== 'undefined') {\n",
+       "        return WebSocket;\n",
+       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+       "        return MozWebSocket;\n",
+       "    } else {\n",
+       "        alert('Your browser does not have WebSocket support.' +\n",
+       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+       "              'Firefox 4 and 5 are also supported but you ' +\n",
+       "              'have to enable WebSockets in about:config.');\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+       "    this.id = figure_id;\n",
+       "\n",
+       "    this.ws = websocket;\n",
+       "\n",
+       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
+       "\n",
+       "    if (!this.supports_binary) {\n",
+       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
+       "        if (warnings) {\n",
+       "            warnings.style.display = 'block';\n",
+       "            warnings.textContent = (\n",
+       "                \"This browser does not support binary websocket messages. \" +\n",
+       "                    \"Performance may be slow.\");\n",
+       "        }\n",
+       "    }\n",
+       "\n",
+       "    this.imageObj = new Image();\n",
+       "\n",
+       "    this.context = undefined;\n",
+       "    this.message = undefined;\n",
+       "    this.canvas = undefined;\n",
+       "    this.rubberband_canvas = undefined;\n",
+       "    this.rubberband_context = undefined;\n",
+       "    this.format_dropdown = undefined;\n",
+       "\n",
+       "    this.image_mode = 'full';\n",
+       "\n",
+       "    this.root = $('<div/>');\n",
+       "    this._root_extra_style(this.root)\n",
+       "    this.root.attr('style', 'display: inline-block');\n",
+       "\n",
+       "    $(parent_element).append(this.root);\n",
+       "\n",
+       "    this._init_header(this);\n",
+       "    this._init_canvas(this);\n",
+       "    this._init_toolbar(this);\n",
+       "\n",
+       "    var fig = this;\n",
+       "\n",
+       "    this.waiting = false;\n",
+       "\n",
+       "    this.ws.onopen =  function () {\n",
+       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+       "            fig.send_message(\"send_image_mode\", {});\n",
+       "            if (mpl.ratio != 1) {\n",
+       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+       "            }\n",
+       "            fig.send_message(\"refresh\", {});\n",
+       "        }\n",
+       "\n",
+       "    this.imageObj.onload = function() {\n",
+       "            if (fig.image_mode == 'full') {\n",
+       "                // Full images could contain transparency (where diff images\n",
+       "                // almost always do), so we need to clear the canvas so that\n",
+       "                // there is no ghosting.\n",
+       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "            }\n",
+       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
+       "        };\n",
+       "\n",
+       "    this.imageObj.onunload = function() {\n",
+       "        fig.ws.close();\n",
+       "    }\n",
+       "\n",
+       "    this.ws.onmessage = this._make_on_message_function(this);\n",
+       "\n",
+       "    this.ondownload = ondownload;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_header = function() {\n",
+       "    var titlebar = $(\n",
+       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
+       "        'ui-helper-clearfix\"/>');\n",
+       "    var titletext = $(\n",
+       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
+       "        'text-align: center; padding: 3px;\"/>');\n",
+       "    titlebar.append(titletext)\n",
+       "    this.root.append(titlebar);\n",
+       "    this.header = titletext[0];\n",
+       "}\n",
+       "\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_canvas = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var canvas_div = $('<div/>');\n",
+       "\n",
+       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+       "\n",
+       "    function canvas_keyboard_event(event) {\n",
+       "        return fig.key_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+       "    this.canvas_div = canvas_div\n",
+       "    this._canvas_extra_style(canvas_div)\n",
+       "    this.root.append(canvas_div);\n",
+       "\n",
+       "    var canvas = $('<canvas/>');\n",
+       "    canvas.addClass('mpl-canvas');\n",
+       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+       "\n",
+       "    this.canvas = canvas[0];\n",
+       "    this.context = canvas[0].getContext(\"2d\");\n",
+       "\n",
+       "    var backingStore = this.context.backingStorePixelRatio ||\n",
+       "\tthis.context.webkitBackingStorePixelRatio ||\n",
+       "\tthis.context.mozBackingStorePixelRatio ||\n",
+       "\tthis.context.msBackingStorePixelRatio ||\n",
+       "\tthis.context.oBackingStorePixelRatio ||\n",
+       "\tthis.context.backingStorePixelRatio || 1;\n",
+       "\n",
+       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+       "\n",
+       "    var rubberband = $('<canvas/>');\n",
+       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+       "\n",
+       "    var pass_mouse_events = true;\n",
+       "\n",
+       "    canvas_div.resizable({\n",
+       "        start: function(event, ui) {\n",
+       "            pass_mouse_events = false;\n",
+       "        },\n",
+       "        resize: function(event, ui) {\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "        stop: function(event, ui) {\n",
+       "            pass_mouse_events = true;\n",
+       "            fig.request_resize(ui.size.width, ui.size.height);\n",
+       "        },\n",
+       "    });\n",
+       "\n",
+       "    function mouse_event_fn(event) {\n",
+       "        if (pass_mouse_events)\n",
+       "            return fig.mouse_event(event, event['data']);\n",
+       "    }\n",
+       "\n",
+       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
+       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
+       "    // Throttle sequential mouse events to 1 every 20ms.\n",
+       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+       "\n",
+       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+       "\n",
+       "    canvas_div.on(\"wheel\", function (event) {\n",
+       "        event = event.originalEvent;\n",
+       "        event['data'] = 'scroll'\n",
+       "        if (event.deltaY < 0) {\n",
+       "            event.step = 1;\n",
+       "        } else {\n",
+       "            event.step = -1;\n",
+       "        }\n",
+       "        mouse_event_fn(event);\n",
+       "    });\n",
+       "\n",
+       "    canvas_div.append(canvas);\n",
+       "    canvas_div.append(rubberband);\n",
+       "\n",
+       "    this.rubberband = rubberband;\n",
+       "    this.rubberband_canvas = rubberband[0];\n",
+       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
+       "\n",
+       "    this._resize_canvas = function(width, height) {\n",
+       "        // Keep the size of the canvas, canvas container, and rubber band\n",
+       "        // canvas in synch.\n",
+       "        canvas_div.css('width', width)\n",
+       "        canvas_div.css('height', height)\n",
+       "\n",
+       "        canvas.attr('width', width * mpl.ratio);\n",
+       "        canvas.attr('height', height * mpl.ratio);\n",
+       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+       "\n",
+       "        rubberband.attr('width', width);\n",
+       "        rubberband.attr('height', height);\n",
+       "    }\n",
+       "\n",
+       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+       "    // upon first draw.\n",
+       "    this._resize_canvas(600, 600);\n",
+       "\n",
+       "    // Disable right mouse context menu.\n",
+       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+       "        return false;\n",
+       "    });\n",
+       "\n",
+       "    function set_focus () {\n",
+       "        canvas.focus();\n",
+       "        canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    window.setTimeout(set_focus, 100);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) {\n",
+       "            // put a spacer in here.\n",
+       "            continue;\n",
+       "        }\n",
+       "        var button = $('<button/>');\n",
+       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+       "                        'ui-button-icon-only');\n",
+       "        button.attr('role', 'button');\n",
+       "        button.attr('aria-disabled', 'false');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "\n",
+       "        var icon_img = $('<span/>');\n",
+       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+       "        icon_img.addClass(image);\n",
+       "        icon_img.addClass('ui-corner-all');\n",
+       "\n",
+       "        var tooltip_span = $('<span/>');\n",
+       "        tooltip_span.addClass('ui-button-text');\n",
+       "        tooltip_span.html(tooltip);\n",
+       "\n",
+       "        button.append(icon_img);\n",
+       "        button.append(tooltip_span);\n",
+       "\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    var fmt_picker_span = $('<span/>');\n",
+       "\n",
+       "    var fmt_picker = $('<select/>');\n",
+       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+       "    fmt_picker_span.append(fmt_picker);\n",
+       "    nav_element.append(fmt_picker_span);\n",
+       "    this.format_dropdown = fmt_picker[0];\n",
+       "\n",
+       "    for (var ind in mpl.extensions) {\n",
+       "        var fmt = mpl.extensions[ind];\n",
+       "        var option = $(\n",
+       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+       "        fmt_picker.append(option)\n",
+       "    }\n",
+       "\n",
+       "    // Add hover states to the ui-buttons\n",
+       "    $( \".ui-button\" ).hover(\n",
+       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
+       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
+       "    );\n",
+       "\n",
+       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+       "    // which will in turn request a refresh of the image.\n",
+       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_message = function(type, properties) {\n",
+       "    properties['type'] = type;\n",
+       "    properties['figure_id'] = this.id;\n",
+       "    this.ws.send(JSON.stringify(properties));\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.send_draw_message = function() {\n",
+       "    if (!this.waiting) {\n",
+       "        this.waiting = true;\n",
+       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    var format_dropdown = fig.format_dropdown;\n",
+       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+       "    fig.ondownload(fig, format);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+       "    var size = msg['size'];\n",
+       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+       "        fig._resize_canvas(size[0], size[1]);\n",
+       "        fig.send_message(\"refresh\", {});\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+       "    var x0 = msg['x0'] / mpl.ratio;\n",
+       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+       "    var x1 = msg['x1'] / mpl.ratio;\n",
+       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+       "    x0 = Math.floor(x0) + 0.5;\n",
+       "    y0 = Math.floor(y0) + 0.5;\n",
+       "    x1 = Math.floor(x1) + 0.5;\n",
+       "    y1 = Math.floor(y1) + 0.5;\n",
+       "    var min_x = Math.min(x0, x1);\n",
+       "    var min_y = Math.min(y0, y1);\n",
+       "    var width = Math.abs(x1 - x0);\n",
+       "    var height = Math.abs(y1 - y0);\n",
+       "\n",
+       "    fig.rubberband_context.clearRect(\n",
+       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
+       "\n",
+       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+       "    // Updates the figure title.\n",
+       "    fig.header.textContent = msg['label'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+       "    var cursor = msg['cursor'];\n",
+       "    switch(cursor)\n",
+       "    {\n",
+       "    case 0:\n",
+       "        cursor = 'pointer';\n",
+       "        break;\n",
+       "    case 1:\n",
+       "        cursor = 'default';\n",
+       "        break;\n",
+       "    case 2:\n",
+       "        cursor = 'crosshair';\n",
+       "        break;\n",
+       "    case 3:\n",
+       "        cursor = 'move';\n",
+       "        break;\n",
+       "    }\n",
+       "    fig.rubberband_canvas.style.cursor = cursor;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+       "    fig.message.textContent = msg['message'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+       "    // Request the server to send over a new figure.\n",
+       "    fig.send_draw_message();\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+       "    fig.image_mode = msg['mode'];\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Called whenever the canvas gets updated.\n",
+       "    this.send_message(\"ack\", {});\n",
+       "}\n",
+       "\n",
+       "// A function to construct a web socket function for onmessage handling.\n",
+       "// Called in the figure constructor.\n",
+       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+       "    return function socket_on_message(evt) {\n",
+       "        if (evt.data instanceof Blob) {\n",
+       "            /* FIXME: We get \"Resource interpreted as Image but\n",
+       "             * transferred with MIME type text/plain:\" errors on\n",
+       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
+       "             * to be part of the websocket stream */\n",
+       "            evt.data.type = \"image/png\";\n",
+       "\n",
+       "            /* Free the memory for the previous frames */\n",
+       "            if (fig.imageObj.src) {\n",
+       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
+       "                    fig.imageObj.src);\n",
+       "            }\n",
+       "\n",
+       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+       "                evt.data);\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+       "            fig.imageObj.src = evt.data;\n",
+       "            fig.updated_canvas_event();\n",
+       "            fig.waiting = false;\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        var msg = JSON.parse(evt.data);\n",
+       "        var msg_type = msg['type'];\n",
+       "\n",
+       "        // Call the  \"handle_{type}\" callback, which takes\n",
+       "        // the figure and JSON message as its only arguments.\n",
+       "        try {\n",
+       "            var callback = fig[\"handle_\" + msg_type];\n",
+       "        } catch (e) {\n",
+       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+       "            return;\n",
+       "        }\n",
+       "\n",
+       "        if (callback) {\n",
+       "            try {\n",
+       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+       "                callback(fig, msg);\n",
+       "            } catch (e) {\n",
+       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+       "            }\n",
+       "        }\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+       "mpl.findpos = function(e) {\n",
+       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+       "    var targ;\n",
+       "    if (!e)\n",
+       "        e = window.event;\n",
+       "    if (e.target)\n",
+       "        targ = e.target;\n",
+       "    else if (e.srcElement)\n",
+       "        targ = e.srcElement;\n",
+       "    if (targ.nodeType == 3) // defeat Safari bug\n",
+       "        targ = targ.parentNode;\n",
+       "\n",
+       "    // jQuery normalizes the pageX and pageY\n",
+       "    // pageX,Y are the mouse positions relative to the document\n",
+       "    // offset() returns the position of the element relative to the document\n",
+       "    var x = e.pageX - $(targ).offset().left;\n",
+       "    var y = e.pageY - $(targ).offset().top;\n",
+       "\n",
+       "    return {\"x\": x, \"y\": y};\n",
+       "};\n",
+       "\n",
+       "/*\n",
+       " * return a copy of an object with only non-object keys\n",
+       " * we need this to avoid circular references\n",
+       " * http://stackoverflow.com/a/24161582/3208463\n",
+       " */\n",
+       "function simpleKeys (original) {\n",
+       "  return Object.keys(original).reduce(function (obj, key) {\n",
+       "    if (typeof original[key] !== 'object')\n",
+       "        obj[key] = original[key]\n",
+       "    return obj;\n",
+       "  }, {});\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+       "    var canvas_pos = mpl.findpos(event)\n",
+       "\n",
+       "    if (name === 'button_press')\n",
+       "    {\n",
+       "        this.canvas.focus();\n",
+       "        this.canvas_div.focus();\n",
+       "    }\n",
+       "\n",
+       "    var x = canvas_pos.x * mpl.ratio;\n",
+       "    var y = canvas_pos.y * mpl.ratio;\n",
+       "\n",
+       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
+       "                             step: event.step,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "\n",
+       "    /* This prevents the web browser from automatically changing to\n",
+       "     * the text insertion cursor when the button is pressed.  We want\n",
+       "     * to control all of the cursor setting manually through the\n",
+       "     * 'cursor' event from matplotlib */\n",
+       "    event.preventDefault();\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    // Handle any extra behaviour associated with a key event\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.key_event = function(event, name) {\n",
+       "\n",
+       "    // Prevent repeat events\n",
+       "    if (name == 'key_press')\n",
+       "    {\n",
+       "        if (event.which === this._key)\n",
+       "            return;\n",
+       "        else\n",
+       "            this._key = event.which;\n",
+       "    }\n",
+       "    if (name == 'key_release')\n",
+       "        this._key = null;\n",
+       "\n",
+       "    var value = '';\n",
+       "    if (event.ctrlKey && event.which != 17)\n",
+       "        value += \"ctrl+\";\n",
+       "    if (event.altKey && event.which != 18)\n",
+       "        value += \"alt+\";\n",
+       "    if (event.shiftKey && event.which != 16)\n",
+       "        value += \"shift+\";\n",
+       "\n",
+       "    value += 'k';\n",
+       "    value += event.which.toString();\n",
+       "\n",
+       "    this._key_event_extra(event, name);\n",
+       "\n",
+       "    this.send_message(name, {key: value,\n",
+       "                             guiEvent: simpleKeys(event)});\n",
+       "    return false;\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+       "    if (name == 'download') {\n",
+       "        this.handle_save(this, null);\n",
+       "    } else {\n",
+       "        this.send_message(\"toolbar_button\", {name: name});\n",
+       "    }\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+       "    this.message.textContent = tooltip;\n",
+       "};\n",
+       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+       "\n",
+       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+       "\n",
+       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
+       "    // object with the appropriate methods. Currently this is a non binary\n",
+       "    // socket, so there is still some room for performance tuning.\n",
+       "    var ws = {};\n",
+       "\n",
+       "    ws.close = function() {\n",
+       "        comm.close()\n",
+       "    };\n",
+       "    ws.send = function(m) {\n",
+       "        //console.log('sending', m);\n",
+       "        comm.send(m);\n",
+       "    };\n",
+       "    // Register the callback with on_msg.\n",
+       "    comm.on_msg(function(msg) {\n",
+       "        //console.log('receiving', msg['content']['data'], msg);\n",
+       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+       "        ws.onmessage(msg['content']['data'])\n",
+       "    });\n",
+       "    return ws;\n",
+       "}\n",
+       "\n",
+       "mpl.mpl_figure_comm = function(comm, msg) {\n",
+       "    // This is the function which gets called when the mpl process\n",
+       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+       "\n",
+       "    var id = msg.content.data.id;\n",
+       "    // Get hold of the div created by the display call when the Comm\n",
+       "    // socket was opened in Python.\n",
+       "    var element = $(\"#\" + id);\n",
+       "    var ws_proxy = comm_websocket_adapter(comm)\n",
+       "\n",
+       "    function ondownload(figure, format) {\n",
+       "        window.open(figure.imageObj.src);\n",
+       "    }\n",
+       "\n",
+       "    var fig = new mpl.figure(id, ws_proxy,\n",
+       "                           ondownload,\n",
+       "                           element.get(0));\n",
+       "\n",
+       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+       "    // web socket which is closed, not our websocket->open comm proxy.\n",
+       "    ws_proxy.onopen();\n",
+       "\n",
+       "    fig.parent_element = element.get(0);\n",
+       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+       "    if (!fig.cell_info) {\n",
+       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
+       "        return;\n",
+       "    }\n",
+       "\n",
+       "    var output_index = fig.cell_info[2]\n",
+       "    var cell = fig.cell_info[0];\n",
+       "\n",
+       "};\n",
+       "\n",
+       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+       "    var width = fig.canvas.width/mpl.ratio\n",
+       "    fig.root.unbind('remove')\n",
+       "\n",
+       "    // Update the output cell to use the data from the current canvas.\n",
+       "    fig.push_to_output();\n",
+       "    var dataURL = fig.canvas.toDataURL();\n",
+       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+       "    // the notebook keyboard shortcuts fail.\n",
+       "    IPython.keyboard_manager.enable()\n",
+       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
+       "    fig.close_ws(fig, msg);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+       "    fig.send_message('closing', msg);\n",
+       "    // fig.ws.close()\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+       "    // Turn the data on the canvas into data in the output cell.\n",
+       "    var width = this.canvas.width/mpl.ratio\n",
+       "    var dataURL = this.canvas.toDataURL();\n",
+       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.updated_canvas_event = function() {\n",
+       "    // Tell IPython that the notebook contents must change.\n",
+       "    IPython.notebook.set_dirty(true);\n",
+       "    this.send_message(\"ack\", {});\n",
+       "    var fig = this;\n",
+       "    // Wait a second, then push the new image to the DOM so\n",
+       "    // that it is saved nicely (might be nice to debounce this).\n",
+       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._init_toolbar = function() {\n",
+       "    var fig = this;\n",
+       "\n",
+       "    var nav_element = $('<div/>')\n",
+       "    nav_element.attr('style', 'width: 100%');\n",
+       "    this.root.append(nav_element);\n",
+       "\n",
+       "    // Define a callback function for later on.\n",
+       "    function toolbar_event(event) {\n",
+       "        return fig.toolbar_button_onclick(event['data']);\n",
+       "    }\n",
+       "    function toolbar_mouse_event(event) {\n",
+       "        return fig.toolbar_button_onmouseover(event['data']);\n",
+       "    }\n",
+       "\n",
+       "    for(var toolbar_ind in mpl.toolbar_items){\n",
+       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
+       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
+       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+       "\n",
+       "        if (!name) { continue; };\n",
+       "\n",
+       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
+       "        button.click(method_name, toolbar_event);\n",
+       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
+       "        nav_element.append(button);\n",
+       "    }\n",
+       "\n",
+       "    // Add the status bar.\n",
+       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
+       "    nav_element.append(status_bar);\n",
+       "    this.message = status_bar[0];\n",
+       "\n",
+       "    // Add the close button to the window.\n",
+       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
+       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
+       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+       "    buttongrp.append(button);\n",
+       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+       "    titlebar.prepend(buttongrp);\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._root_extra_style = function(el){\n",
+       "    var fig = this\n",
+       "    el.on(\"remove\", function(){\n",
+       "\tfig.close_ws(fig, {});\n",
+       "    });\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+       "    // this is important to make the div 'focusable\n",
+       "    el.attr('tabindex', 0)\n",
+       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
+       "    // off when our div gets focus\n",
+       "\n",
+       "    // location in version 3\n",
+       "    if (IPython.notebook.keyboard_manager) {\n",
+       "        IPython.notebook.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "    else {\n",
+       "        // location in version 2\n",
+       "        IPython.keyboard_manager.register_events(el);\n",
+       "    }\n",
+       "\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+       "    var manager = IPython.notebook.keyboard_manager;\n",
+       "    if (!manager)\n",
+       "        manager = IPython.keyboard_manager;\n",
+       "\n",
+       "    // Check for shift+enter\n",
+       "    if (event.shiftKey && event.which == 13) {\n",
+       "        this.canvas_div.blur();\n",
+       "        event.shiftKey = false;\n",
+       "        // Send a \"J\" for go to next cell\n",
+       "        event.which = 74;\n",
+       "        event.keyCode = 74;\n",
+       "        manager.command_mode();\n",
+       "        manager.handle_keydown(event);\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+       "    fig.ondownload(fig, null);\n",
+       "}\n",
+       "\n",
+       "\n",
+       "mpl.find_output_cell = function(html_output) {\n",
+       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+       "    // IPython event is triggered only after the cells have been serialised, which for\n",
+       "    // our purposes (turning an active figure into a static one), is too late.\n",
+       "    var cells = IPython.notebook.get_cells();\n",
+       "    var ncells = cells.length;\n",
+       "    for (var i=0; i<ncells; i++) {\n",
+       "        var cell = cells[i];\n",
+       "        if (cell.cell_type === 'code'){\n",
+       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
+       "                var data = cell.output_area.outputs[j];\n",
+       "                if (data.data) {\n",
+       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
+       "                    data = data.data;\n",
+       "                }\n",
+       "                if (data['text/html'] == html_output) {\n",
+       "                    return [cell, data, j];\n",
+       "                }\n",
+       "            }\n",
+       "        }\n",
+       "    }\n",
+       "}\n",
+       "\n",
+       "// Register the function which deals with the matplotlib target/channel.\n",
+       "// The kernel may be null if the page has been refreshed.\n",
+       "if (IPython.notebook.kernel != null) {\n",
+       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+       "}\n"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Javascript object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAPwCAYAAADH/tkFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAP+6SURBVHhe7N0HnCRlmT/wlw2w5AySJCNJUUFAUMzxxHx6Z8bzznR/PdOd8dQz55wT5oBgJCo557jAsoSFDSybc97lXzXzttNT06G6u7qneub75fN8+u1ipqenu7p36ldvP28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASmOzeAljwX1JbZfUjIFrAAAAAHRqv6SWJbX/wDVokQCasWThlltuudNhhx0WrwIAAADQiTvuuCOsXr16UTLceXALtEYAzVhy/eMT119/fbwKAAAAQCeOPvrocEMiHQ5ugdZMiJcAAAAAAFAoATQAAAAAAF0hgAYAAAAAoCsE0AAAAAAAdIUAGgAAAACArhBAAwAAAADQFQJoAAAAAAC6QgANAAAAAEBXCKABAAAAAOgKATQAAAAAAF0hgAYAAAAAoCsE0AAAAAAAdIUAGgAAAACArhBAAwAAAADQFQJoAAAAAAC6QgANAAAAAEBXCKABAAAAAOgKATQAAAAAAF0hgAYAAAAAoCsE0AAAAAAAdIUAGgAAAACArhBAAwAAAADQFQJoAAAAAAC6QgANAAAAAEBXCKABAAAAAOgKATQAAAAAAF0hgAYAAAAAoCsE0AAAAAAAdIUAGgAAAACArhBAAwAAAADQFQJoAAAAAAC6QgANfWTTpofDu397U3juVy8JN81cErcCAAAAQDkJoKGP/OWWOeGMG2eHO+cuD6/83pVxKwAAAACUkwAa+sgN9y+OoxDWbtgURwAAAABQTgJoAAAAAAC6QgANfWSzzTaLIwAAAAAoPwH0+LR3Uj9Oak5Sa5OakdRXk9oxqbyeldSXkjo/qUVJPZzUZUnVs11S6c+4NKn0565Jal5S1yT1X0ltnRQAAAAAMIYIoMefA5O6PqlTkkrD368kdW9S70wqXdVu56TyeHtS707qhKRmpxua2Cmp/0gqbVx8ZlJfTuq0pLZNKr0P6X1JQ2oaePjhNOcHAAAAgP4ggB5/vp3Ubkm9I6kXJ/X+pJ6eVBoCPyqpTyWVx+eSOjKpbZI6Od3QxMyktk/qKUn9e1IfTCoNsQ9L6pdJHZ7UW5KigZ9eeX8cAQAAAED5CaDHlwOSenZSacuNb6Ubqnw0qZVJvTapPO0w0tnSU5PaOHCtufTr1g8OR0hnQqcOjpcAAAAAwBgggB5f0pnOqfOSSlthVFue1OVJbZXU8emGHqrMoL4lXgIAAAAAY4AAenxJW2yk7oqXWdPj5SHxshsmJfWxWF9P6qak/i2pC5P6QVIAAAAAwBghgB5f0h7MqaXxMquyfYd42Q1pAJ22+0jr/yV1VFI/T+qFSa1JKo90EcVadWhSAAAAAEBJCKCptlm8fDhedkMaMqc/J9339k7qDUk9M6nrktovKQAAAABgjBBAjy+VGc6VmdBZ28XLejOki5SG3LOT+mlSL00qbQ/yzaTyOLpO3ZkUAAAAAFASAujxZVq8rNfj+eB4Wa9HdLdcldSSpJ46cA0AAAAAGBME0ONLutBf6tlJZZ/7bZM6ManVSaWBcC+lPzudfb1h4BoAAAAAMCYIoMeXe5I6L6m01/Lb0w1VPp7U1kn9LKmV6YYoXdiviMX9HptUrcUNN08qbb2R7otnphsAAAAAgLFBAD3+vC2peUl9Pak/JvWZpC5I6l1Jpa03PpRUtTtiZT0pqVNjfTHdkEhbeFS2pVUtXWxwTlJnJfWdpNKfm/Z/vj+p1yWVtgd5b1IAAAAAwBghgB5/0lnQxySVBsTHJfWepA5MKg2kn5jUwqTyOCip18d6WbohsVtSlW1pVTstqV8ntW9S/5LU+5I6Oan0/qTjxyf1YFIAAAAAwBghgB6fZiZ1SlJ7JJW2wEhD4XcmtSiprM1iZaUBduX/1atqlyf1b0kdkdSOSU1Kaqek0pnU6QzqVUkBAAAAAGOIABoAAAAAgK4QQAMAAAAA0BUCaAAAAAAAukIADQAAAABAVwigAQAAAADoCgE0AAAAAABdIYAGAAAAAKArBNAAAAAAAHSFABr62MMPPxxHAAAAAFA+AmjoY/JnAAAAAMpMAA19YuOmkWmz/BkAAACAMhNAQ5+o1W5DCw4AAAAAykwADX2iVtQsfgYAAACgzATQ0CdqTXY2ARoAAACAMhNAQ594uMZ851rbAAAAAKAsBNDQJ8yABgAAAKDfCKChjwmgAQAAACgzATT0iZozoLXgAAAAAKDEBNDQJ+6ZvyKOhpgBDQAAAECZCaChDzy4dHV4wTcui9eGbJJAAwAAAFBiAmjoA58/Z1ocDSd+BgAAAKDMBNDQB9Zt2BRHwz1cezMAAAAAlIIAGvrBZvEywyKEAAAAAJSZABr6wITNaifQm+TPAAAAAJSYABr6QJ0J0OFhixACAAAAUGICaOgDdSZAa8ABAAAAQKkJoKEP1JsBffPMJXEEAAAAAOUjgIY+sFmdKdAXTpsXRwAAAABQPgJo6AP1ZkADAAAAQJkJoKEf1Emgl6xaH1as3RCvAQAAAEC5CKChD2zcVHu5wb/e8mA4/tPnh5mLVsUtAAAAAFAeAmjoA2fe8mAcjZTOgP7AGbfGawAAAABQHgJo6ANH77tjHNV22d0L4ggAAAAAykMADX1gy80nxhEAAAAA9A8BNPSBi6bNjyMAAAAA6B8CaAAAAAAAukIADQAAAABAVwigAQAAAADoCgE0AAAAAABdIYAGAAAAAKArBNAAAAAAAHSFABoAAAAAgK4QQEPJrduwKY4AAAAAoL8IoKHkfnL5fXEEAAAAAP1FAA0ld8YNs+MIAAAAAPqLABpKbtpDy+MIAAAAAPqLABoAAAAAgK4QQAMAAAAA0BUCaBhD5ixZHZatWR+vAQAAAMDoEkDDGHHBnQ+FJ33ugvDET58fHlq2Jm4FAAAAgNEjgIYx4o2nXhc2PRzCynUbw//99fa4FQAAAABGjwAaxqB5ZkADAAAAUAICaBiDVq/fGEcAAAAAMHoE0DAG3TZ7WRwBAAAAwOgRQAMAAAAA0BUCaBijPvzHW8OcJavjNQAAAADoPQE0jFG/uOqB8K7f3hSvAQAAAEDvCaBhDLv6vkVxBAAAAAC9J4AGAAAAAKArBNAAAAAAAHSFABoAAAAAgK4QQAMAAAAA0BUCaOgzj9l7+zgCAAAAgHITQEOfec4Rj4gjAAAAACg3ATQAAAAAAF0hgIY+s9lmcQAAAAAAJSeABgAAAACgKwTQ0Gc2S/5rxfI16+MIAAAAAHpLAA19ptUWHN+84O44AgAAAIDeEkBDHzl4t23iKL95y9fGEQAAAAD0lgAa+sikiRNabMABAAAAAKNHAA195I0n7tdyCw4AAAAAGC0CaCi5/XbeKo5COGT3bVtehBAAAAAARosAGkpumymT4qj1BQgBAAAAYDQJoKHkHn44DhLtzH5ev3FTHAEAAABAbwmgoeSGBdCbhbDnDlvGa/n89ZYH4wgAAAAAeksADSVXlT8PeN6Rj4gjAAAAACg3ATSU3MNVU6AnbLZZmDBhs3DI7tvELQAAAABQXgJoKLlsC47U0tXrBwcAAAAAUGICaCi5h6uacFQCaAAAAADoBwJoKLlhM6CT/1JTJk8cuAQAAACAMhNAQ8lVL0JYmQF9/8JVgwMAAAAAKDEBNJRc9SKE7XbgWLN+YxwBAAAAQO8IoKHkas2AbtWhHzknjgAAAACgdwTQUHbVCXTbc6BDuPGBxXEEAAAAAL0hgIaSK2IGdOqc2+bGEQAAAAD0hgAaSq5WD+jHPXKHOMpv2ERqAAAAAOgBATSU3PAZ0IMRdDsToauDbAAAAADoBQE0lFx1btxBB46wSf4MAAAAQI8JoMenvZP6cVJzklqb1IykvprUjknl9aykvpTU+UktSiqNNy9Lqp69kvp/SZ2dVPrz0p+7MKm/JfXSpKjj4ao50JUe0JWZ0K0wARoAAACAXhNAjz8HJnV9UqckdU1SX0nq3qTemdSVSe2cVB5vT+rdSZ2Q1Ox0QxNp+Pz1pB6V1IVJfTmpc5N6clKnx+vUMHwGdPtzoKuDbAAAAADoBQH0+PPtpHZL6h1JvTip9yf19KTSIDoNhz+VVB6fS+rIpLZJ6uR0QxNp2P3UpA5IKg2/P5DUq5J6XFLLknpXUkcnRcawALoyA3rwoiVmQAMAAADQawLo8SUNf5+dVNoC41vphiofTWplUq9Naut0QxPpbOmpSW0cuNbcGUldPDgc5o6kfjs4HAioyaGNDhzBIoQAAAAA9JoAenxJZzqnzktq0+DwH5YndXlSWyV1fLqhh9bHyw3xkirVwXEleL5/4arBQQssQggAAABArwmgx5e0xUbqrniZNT1eHhIve2G7pF6WVBqPpsE4GdW5cWXxwXnL0zUcW6MHNAAAAAC9JoAeX7aPl0vjZVZl+w7xstvSNPWHSe2e1HeSSttx5JEuolirDk1qzBm+CGH75rcRWgMAAABAJwTQVKvkm72aKvulpP45qUuTene6gZGqZy630/u54typD8URAAAAAPSGAHp8qcxwrsyEzkrbYaTqzZAu0heSeldSlyT1/KRamZ57dJ26M6kxZ/gM6E7mQAMAAABAbwmgx5dp8bJej+eD42W9HtFF+UpS703qwqSel9SKpKijejp6JzOgAQAAAKDXBNDjSxr4pp6dVPa53zapE5NandRV6YYuSOPTbyX1X0n9Lal/SmpVUjRQVA9oAAAAAOg1AfT4ck9S5yW1X1JvTzdU+XhSWyf1s6RWphuidGG/Ihb3S7PT7yf1tqTOTuqFSaVhN00Vk0A/5ZBd4wgAAAAAekMAPf6kAfC8pL6e1B+T+kxSFySV9mNOW298KKlqd8TKelJSp8b6YrohkbbwqGxLq9r/JvWmpNLQ+aak3p/UxzL14qTIKKoH9MQJ5k8DAAAA0FsC6PEnnQV9TFJpQHxcUu9J6sCk0kD6iUktTCqPg5J6fayXpRsSuyVV2ZZWtf3j5ZZJfSCpj9YoAXQNekADAAAA0K8E0OPTzKROSWqPpDZPat+k3pnUoqSy0sizVuyZBtiV/1evqr0hqVpfU13p15DxcNUU6PRBAgAAAIB+IYCGkhs+A7r9CLo6yAYAAACAXhBAQ8kN7wHdPvEzAAAAAL0mgIaSG9aCQw8OAAAAAPqIABpKblgLjg7mQMuuAQAAAOg1ATSU3LAWHF6xAAAAAPQRcRaU3LAWHPGyHTMXr44jAAAAAOgNATSU3LAWHB00gd5xq8lxBAAAAAC9IYCGkhvWgiNetmPnrbeIIwAAAADoDQE0lNzDVXOgO5gAPex2AAAAAKAXBNBQcsNnQLefQFffDgAAAAD0ggAaSq46N+5kBvTu202JIwAAAADoDQE0lJ2ZywAAAAD0KQE0lJwe0AAAAAD0KwE0lFxRPaA3yZ8BAAAA6DEBNJRcdW7c0QxoATQAAAAAPSaAhpJ7uCo57iB/TkigAQAAAOgtATSU3PAZ0LUj6GcetnscDTdpwtDXz1++Lo4AAAAAoDcE0FByw3tAD9plm83jaFC91hwbqho///2Oh+IIAAAAAHpDAA19pBI0v+85jxoctOjWWUvjCAAAAAC6TwANJVbd/zlVacHxssfvHQ7abZuB8cdfeETu3tCzl6yOIwAAAADoPgE0lFgmf/6HSRMnhHPe+eRw1QeeEV5/wn65lxes16oDAAAAALpBAA0lVh0sZ8PjNIR+xPZT4jUAAAAAKB8BNJRYdQuORpOXD9hl6zgCAAAAgPIQQEOJDZ8BXT+CfsczDg6P3GmreK0+HTgAAAAA6CUBNJRYdQ/oRuHx1ltMChe+96nhyQfvErcAAAAAwOgTQEOJPVw1B7rZAoITJ2wWtpsyOV4DAAAAgNEngIYSGz4DunkDjWYhdXVLDwAAAADoNgE09IscDZzTWdCNVC9qCAAAAADdJoCGEsvbA7piQpMp0JvkzwAAAAD0kAAaSqyVHtCpZgH0Bgk0AAAAAD0kgIYSa7UHdJMOHOHsWx+MIwAAAADoPgE0lFj1fOV2ZkA/dp8d4mjQ2bfNjSMAAAAA6D4BNJRY9aKBOfLnMCEzBfqwPbaLIwAAAADoPQE0lNjwGdDNI+hsC45fX/NAHAEAAABA7wmgocSG94BubmKzJtAAAAAA0EMCaCixYS04cmTLS1evjyMAAAAAGH0CaCixYTOgcyTQf7ppThwBAAAAwOgTQEOJDe8BHQcAAAAA0CcE0FBit85eGkchLFmlvQYAAAAA/UUADSX2+h9fE0cAAAAA0H8E0DCOzV6yOnzqzNvDuVPnxi0AAAAAUBwBNIxj//mrG8IPLr0vvPnn14eZi1bFrQAAAABQDAE0jCHPO/IRcZTPjQ8siaMQLpw2L44AAAAAoBgCaBhDHv/IHeOodRMnbBZHAAAAAFAMATSMIaddPzOOWnf9/YvjCAAAAACKIYCGMWTRyvVx1LpLpy+IIwAAAAAohgAaGDBZCw4AAAAACiaAhjFk3YaNcdS6iRMF0AAAAAAUSwANY8iyNRviqHWTJng7AAAAAKBYEicYw97zrEPCvzxhn3gthCmTJ4SfXzkjnHHDrLBp08Nx6yAdOAAAAAAomgAaxrBXHffIcPwBO8drIaxZvyl85E9Tw7t/d3M44INnxa2DzIAGAAAAoGgSJxhDXvCYPeJo0GabbZZUvNLE9ltNjiMAAAAAKIYAGsaQdz/rkDgalGbPE3Im0M8+fPc4AgAAAIBiCKBhDMm20Uiz57wBdDpbup416zeG9512c3jLz68P85aviVsBAAAAoDEBNIwh2Qx5s/S/fPlzWLFmQxyN9N2L7wmnXT8rnDN1bvjwH26LWwEAAACgMQE0jCETJoxIoEN2Uz3rNm6Mo5HOuGF2HIVw3u0PxREAAAAANCaAhjEkGzan1xu11qg2scHX5Z1FDQAAAADVBNAwhmT7PafhcxHZsfwZAAAAgHYIoGEMyc5UTq/mXYTw4XgJAAAAAEURQMMYMnIGdLIt56t89+2mxNFIedt4AAAAAEA1ATSMISMC6PS/nOHxxAarFYqfAQAAAGiHABpKau2GjXGUXzZDTrPnvOHxpoc14QAAAACgWAJoKKk16zfFUX7Z2c7p1bw9oDc1yp/zptgAAAAAUEUADWWVCYRf+vi94qi+ETOgk/9yL0LYYAa0/BkAAACAdgigoU+8+LF5AujhUXF6NWf+HDY1mAJtEUIAAAAA2iGAhpJ6ODMFulGHjIqRixC2EEA3+AHiZwAAAADaIYCGksp2xDj+gJ3iqL5s2JzOXM7fA3roB85YsDJ8/C9TwwV3PhS3AAAAAEDrBNBQUtnceItJE+OovpozoAeHTVUH3v/+s+vCTy6fEd546nVh/vK1cSsAAAAAtEYADSVV3RJjx60mx1FjI2dAJy/y7MqEdVTPgJ4+b0UchXDdjEUjbhcAAAAA8hBAQ0lVB8J522iMXIQwbcERrzRRrwf0gpXrwma6QAMAAADQBgE0lFR1AJ0GyXlMnLBZOOmQXQfGT33U4GXeJhzVP6/aF8650wxoAAAAANoigIaSqs6D885iTv3o9ceE37/lieEHrztm4HruGdB1pkAvW7MhjoY8XCesBgAAAIBqAmgoqeEzoOMgh8kTJ4Rj9ttp4DKVt31Ho0g5OwP77qoe0QAAAABQjwAaSqp6kvHilevjqHV5A+h6LThqWb1+YxwBAAAAQH0CaCipW2YtiaMQ1m3cFEetyzt7ut4ihLXowAEAAABAHgJoKKlfXTMzjjqTu31Hg1Q520d6owQaAAAAgBwE0FBS9RYFbFX+FhxxUEP2Nm64f3EcAQAAAEB9AmgoqcvuXhBHnck7A/rBpWviaKTsDOhLprd+39Zt2BRum720sGAdAAAAgPITQMMYl3cG9Ok3zIqjGjK3cUWL4fjDDz8cXvG9K8MLvnFZ+MAZt8atAAAAAIx1AmgY47Kzl9uRvY1NLfaAnrFwVbhp5uCiir+9rpje1gAAAACUnwAaxrzOE+jsLbTaRWPDxk1xBAAAAMB4IoCGMa6YGdCd3chmHX4/AAAAAP1JAA1jXKfhcarTm8h+/5r1G8NGixECAAAAjHkCaBjjiph8fO2MxXHUnuxdOP4z54eTPn9hWLBibdwCAAAAwFgkgIYxrogZ0J3KtuBYsmp9mL1kdfi/v9wetwAAAAAwFgmgYYwrIn9+1O7bxlGxbpq5JI4AAAAAGIsE0DDGFbEA4OP33SGO2lPvHjywaFUcAQAAADAWCaBhjJvQQv6cLg748MMjFwf89TUz46g9JegCAgAAAMAoEEDDGLdZ3fnHI73+x9eEGvlzTRdNmxcW5lxEsJX7AAAAAMDYIYAen/ZO6sdJzUkqTRBnJPXVpHZMKq9nJfWlpM5PalFSaWx5WVKN/FtS30vq6qTS3gvp93wyKbqolRnQV9+3KKxavzFea+wNP7k2HP3Jv4dFK9fFLQAAAAAwnAB6/DkwqeuTOiWpa5L6SlL3JvXOpK5Mauek8nh7Uu9O6oSkZqcbckgD6/9I6uCk0vCbBo7db6c46qyFRas9oDduyjkFOvry36bFUX0PD5xrAAAAAGC8EUCPP99Oarek3pHUi5N6f1JPTyoNoh+V1KeSyuNzSR2Z1DZJnZxuyOFfktovqTRZNfO5ieMPGAqg/+OkA+Koda2G17V6QDeyfM2GOKqvxZsEAAAAYIwQQI8vaYr57KTSlhvfSjdU+WhSK5N6bVJbpxuaSGdLT00qX7+GQeckdf/gkKaqkuMtJ0+Mo9ZNaDGBvnPu8jgqjvwZAAAAYHwSQI8v6Uzn1HlJbRoc/kOaOl6e1FZJHZ9uYJQVNG24lR7QqfUbs7tGY3luvtVZ1QAAAACMDQLo8SVtsZG6K15mTY+Xh8RLRtE5U+fGUQjzlqdrRbZns1wR8ZAWW0DnIn4GAAAAGJ8E0OPL9vFyabzMqmzfIV6WVbqIYq06NKkx466HVsRRCL+6+oE4akOLM6AntTplOgcToAEAAADGJwE01SrJo7iwZB6x3ZQ4al2rixDuuu0WcVQkuxQAAADAeCSAHl8qM5wrM6GztouX9WZIl8XRderOpMaMJx+8SxyF8NanHhhHrWt1PvPGLvTgaGUG9Mq1G8L3Lr4nnH79LL2jAQAAAPqcAHp8mRYv6/V4Pjhe1usRTQ/tss3QTORtp0yKo+7b1GLoe/uDy+KovlZu8dsX3R0+c/ad4T2n3Rwunb4gbgUAAACgHwmgx5cL4+Wzk8o+99smdWJSq5O6Kt3A6Cpq9u+EFntwtPpjq3tV19PKbX7rwnviKIQv/825EAAAAIB+JoAeX9Jk77yk9kvq7emGKh9PauukfpbUynRDlC7sN6YW9+sX1Zltq32cq7X6va3OgM7j4TZ7QBd/TwAAAADoJQH0+PO2pOYl9fWk/pjUZ5K6IKl3JZVON/1QUtXuiJX1pKROjfXFdEMibeFR2ZZW1puSqvy/dJw6OanKtvenGxhps5Y7OQ/ZYtLEOMqnCy2gW55VXfHAwupzIQAAAAD0GwH0+JPOgj4mqTTwPS6p9ySVrnCXBtJPTGphUnkclNTrY70s3ZDYLanKtrSy0tC68v/Sdh+pxyRV2fbcdAODipqIPHHCZuG0t6RPbT6jvQhhtcWr1scRAAAAAP1IAD0+zUzqlKT2SGrzpPZN6p1JLUoqK516W2v6bRpgV/5fvcp6Q1K1vq5ST02KGjppwZF6wn47xVFzi1eui6PitNuCAwAAAID+JoCGkio6sk1nQufxiTNvj6PidKGtNAAAAAB9QAAN40TeSdT3L1wVRwAAAADQGQE0lNTDBU8b7rSNRyfMgAYAAAAYnwTQ0Ac2KyA93iz3HOjibZRAAwAAAIxLAmgoqcIj2y7mz2vWb4yj2v5ww6w4AgAAAGA8EUBDHygiO+7m/OdNTWY4//TK++OosTNveTCOAAAAABgLBNBQVgVPgR7NHtB5vf1XN8QRAAAAAGOBABr6QBHhcTd7QI9mf2kAAAAAyksADSX1cMFToPthBjQAAAAAY4sAGvpAETOMa93Cm560fxx1pt2wfNdtt4gjAAAAAMYiATSUVJN1/Vq2WY0p0McdsHMcdWZTm/d1omnZAAAAAGOaABr6QDE9oEd6uKCUe1Obt9Pu9wEAAADQHwTQUFKFZ7M1Euh2Zy5nPbwpDlokfgYAAAAY2wTQ0AeKaFTRzWYX7c5kLmoGNgAAAADlJICGkmp3Yb96avWALkr7AXQcAAAAADAmCaChDxTSA7rGbey8zeZx1Jl2W3nInwEAAADGNgE0lFTRs4Oz+fPTHrVrOGbfHeO1zrTbSsMihAAAAABjmwAa+kLnU6CzLTh+csqxhbXl2KgFBwAAAAA1CKChpIrOZouJmmu7ddbSOGqNGdAAAAAAY5sAGkqqOpstYqLySYfsGkchHF1Q642KD/7h1jiq7fgDdoqjDPkzAAAAwJgmgIY+UMTs5Y+84PDw2H12CIc+YtvwlVc8Nm4txoIV6+KotsfuUzvwNgMaAAAAYGwTQENpFRvO7rT15uGPbz8xnP3OJ4dH7rxV3BrC39/9lDjqnnqLFIqfAQAAAMY2ATT0gaIWC0xlb+ug3bYJzzxst3itO753yb1xNJwZ0AAAAABjmwAaSqqX2ewdDy6Po85s2vRw+OONs8Pvrp0Z1m/cNLBt9bqNA5e1yJ8BAAAAxjYBNPSB4uY/1zZ7yeo46sy5U+eG//rtTeG/T78l/P76WQPbzrt97sBlLfJnAAAAgLFNAA0l1Y/hbBo8V3zgjFvDX2+ZE975m5vilpHq9YYGAGB0rVm/MSxe2XihaQCAPATQ0AcKbAHdXZk8+T9/dWMc1SZ/BgAon/nL14Ynfub8cFxSV9y9IG4FAGiPABpKqh9nB7d6jy1CCABQPh//y9SweNX6sG7DpvCqH14dtwIAtEcADX2gX2ZAtxooi58BAMpn5qJVcQQA0DkBNJRUP4azrU5oNgEaAKCE+qb/GwDQDwTQ0Ac2S/4rswN33Xrg8uE2YvNKq5ENGzcNXAIAMLrEzwBAkQTQUFL9NDv45KP2jKPWLVm1fuBy/caRv/DmE71FAQD0mgnQAECRpDvQD/rkIKCd0HzO0tVxNFI7M6oBAOiM/BkAKJIAGkqqn6LXTR3c2SmTJw5c1gqb9YgGAOi9CaZAAwAFEkBDHyj9IUBMitvJi7esBNA1vln+DADQe/JnAKBIAmgoqcrifP3gHzOg27jLmxqE1/30GAAAjBVlXwAbAOgvAmjoA5uVfBpKpX1GOz2bKxlzrbC5k9YeAAC0Sf4MABRIAA10rJIdr9/YemLcaAZ0au2GjXEEAEAvTBBAAwAFEkBDHyj7MUAnM5U3xm+u123jttnL4ggAgF7QggMAKJIAGkqqXiBbRu203qho1j+60z7QS1etD1fduzBs0s8DACAXixACAEUSQENJVYe6ZT8I6CQjrrTgqKcyQ7od6zZsCs/+6sXhX75/VfjM2XfErQAANCKABgCKJICGPlD2j0F2Mkt5qAd07dtoJX/+002zw3O+ckk49fL7Bq6fO3VueGjZ2oHxDy4d3JZavU5faQCAeiZIoAGAAgmgoaQ67DzRU510t9i0afCy3u/bbIZ0tXf+5qYw7aHl4WN/uT2sWLshrN0Qbzz6+VX3h59fOSM85uPnhjf99Lq4FQAAAIBuEUBDHxgPLTjq3UQrAXS15WvWx9GQj/zxtvCRP00N6zc+HP5+x0PhhgcWx/8DAEDFZmZAAwAFEkBDSXUS6rZqj+2nxFFje+2wZRwN125InPpHAF3nNtrtAZ1+W7NDpwXLB9tzAAAwRPwMABRJAA19oNsHAV995WPjaEitiS+TJxZ/TyoBc72Yud1we1OO4LqT1iEAAGOVCdAAQJEE0FBS9Rbl64aV6zbE0ZBauW+9j2N2NgN68LLeTXRw02HhysYznDtZPBEAYKyyCCEAUCQBNPSDLh8DbDFpYhw1Vu9udJLj/qMFR53Avd0WHAtXrgufPuvOeK028TMAwEjiZwCgSAJoKKleTs49bI/t4qixepNhOpoB3SRgbrdNxou/dXkc1dfJ/QYAGKtMgAYAiiSAhj6wWZfnoeS99XotOO6cuzyOWvePCLhOFjx36eo4Kt7a9ZviCACAinp/8wEAtEMADSXVy7m5eY8x6n3Z9fcvDn+9ZU681prKJOR6v++X/3ZXHBXvB5feG0cAAFRMkD8DAAUSQENJXXPfojjKHxC3K+8sl0Zf9p+/ujGOWlNZCLBeN4x1G/PNUm5nQcFOZm4DAIxV3f70HQAwvgigoQ/c8MDiOOqO/DOgiz8YqcTG9RYh3G7K5DhqrN1e0QAADDfBUSIAUCB/WkAfuKvLM3UnFDADul2VhQDrTWDeeZst4qi+Nes3hmd/5eJ4DQCATpgBDQAUSQANfaDbC8GMZp+/SvBcbwJzntYap14xI9wzf2W81v8WrFgbzrr1wbBy7Ya4BQCgd7r8pycAMM4IoIHcs1zaaLPcVGUGdD3N/n/qgUWr4qj/bdr0cHj5d64Ib/vlDeE9v7s5bgUA6J1uT34AAMYXATT0gW4fAuQ9xqjXp7kTlVusN9P5rodWxFF9f7lpThz1v7vmLQ8zFg4G6udMnTtwCQDQS6P56TgAYOwRQEMfOGa/neKoO0ZzkksleJ6xoL1ZzDMXrQrLx1Crim7MMgcAaIX8GQAokgAa+sDj990hjroj7yKE3QhH09tct2FTeM2Pro5bWnPVvQvjaGzIPhV5emADABQp79+GAAB5CKChpA7ebZs46v5BQN7b//iLjoijEI7ap5hQfNPDIVw4bV681rqx1qNw8sThb8vX3784jgAAekT+DAAUSAANJVW9+F63jwHy3v4TD9g5fPc1R4fPvezR4bXH7xu3tib9/n133ipeG5zhmy68166x1qNw8oThb8ur1m2MIwCA3jADGgAokgAaSqo6ku32MUDe209nGz/3yEeEVz7hkWGLSe29faTff8ju28ZrgzOgO/n9VhYQ0KYh+E0zl4Slq9fHLeWxYdOmOAIA6A3xMwBQJAE0lNWwScHdPQxop41FJzNjhn9n+ou2f1vfOH96HLXuRY/dc+DymxfcHV78rcvD0794UVizfnRnHGcf1tOvnx1HAAC9YQY0AFAkATSUVHX+XMY2E+0cl7zvOY8auKw+qElnQDf7/aY/tLzuYnzzlq+No9btsOXkgcsv/e2ugcuFK9eF3103c2A8WrK/5q2zl8YRAEBvyJ8BgCIJoKGkhvWALuFRQDv36C1POXDgsvrXSX/NZrNsnvWVS8IH/3BbvFacWpH2yrWjOwO6+nlPnXDgznEEANAbY22RZwBgdAmgoaSqc8gyHgK0c2AyMU51rg6cH07+y3NTv77mgTgqTna2cSq9P6Mp+9Mfs/cOcQQA0BvyZwCgSAJoKKnqILSMBwEd3aeq7+10EcJOZGcbp2qF0u26dPr88L7Tbg43PrA4bmkue59q3UcAgG4qY/s3AKB/CaChpKpzx9FYCOYxe28fR7V1cp+qv/fWWUvCpk3xSgnU6zXdqrUbNobX/uiacNr1s8JLvn1F3Npc9seLnwGAXls1yi3JAICxRQANJTXaE19/8Lpj4qi2TmbGLKhaOPAHl97XlfYaedR6iIt63JesWh9HrckG4EUF4gAAefkEFgBQJAE0lFR18DgaLSp2325KHNU2oYMEetpDy+No0D3zV8RRb9U6tkpbghSh3Ucn++MtAgQA9Fonf+cBAGQJoKGkqoPIMoaQnbTgyH5nZXHCXqs1u3i0Z/xkf/7u224RRwAAvTEa7d8AgLFLAA0lVZ1DlnESSif3KXtMkzdg37Cx2GbRtbLmouLndk8aZO9TUfcHACCviQJoAKBAAmgoqeqZsJu13dChOMcfsFMcDepsZkx733vBnfPiqBgP14h3NxXUg6Pdh2dEAF0rJQcA6CItOACAIgmgoaSqY8cyTEJ533MeFUeDOrlP2WOaLSdPjKPG1mzo/gzo6fOG96duV7sPT7YFh/wZAOi17N95TogDAJ0QQENJVf+dP1r5849ef0zYZ6ctw2uP3zccvW9xM6Cz39pswcOKVWs3xFExah1KnTv1oTjqTFF9ux3uAQC9lv0rpqhFmgGA8UkADaU19Jd+LxYhPHb/4QFz6hmH7R4u/e+nh0+8+Mi4ZUgnCwdmW4qsWpcvWC762Kebk3myj07emUNmQAMAo80MaACgSAJoKKkFK9bF0ciDgG5oNU8uchHCK+5ZGEeNZcPZTtXqAd0ti1YOPZ+NZH/FXt5HAIBUdrKAGdAAQCcE0FBC2YXwepA/jzjQaKbZrOyvvvKxcTTSg0vXxFFt202ZFEfDFbVAYEUReXZ6n2rdr+yW9Rvz/bBsyO6ADwDotREzoJ0QBwA6IICGElq8avhs2V78yd/qLOtmPaBf/Li94qh173vuoXE03Hm3PxSum7EoXht9t85aGg744FkDNXvJ6rh1UPajqpMn5nuAs8+1j7wCAL2W/avFnyMAQCcE0FBC2b/xVxa8+F4ROmnB0cy/PmGfsP2Wk+O1IZdOXxBe/t0rw00zl8Qtnek03D35m5fFUQgnfvaCOKptY86flf2ytes3xREAQG9MyPyhV3QbNABgfBFAQwmNxt/4Rc+A7sSkiRMaBtzv+u1NcRTCbttuEUet62Z7i4WZns95n9NsKP6DS++NIwCA3jhw123iaJCWYABAJwTQwIBWe0B3M4BONbr9DZuGZgU/47Dd4qh13TyW+vRZd8TRoI05j9yyXzV93oo4AgDojeyfYWZAAwCdEEBDCWUXetl2ysh2FKNtQpffPfLm250cDxXZX3nnrTePo0FzMj2h8wbQRS+0CIyeNes3htOumxmuvGdh3ALQnx7WEQwA6IAAGvrAtlMmxVH3tDqhudszoDdrcPvVuXFHAXS87IZsjpz3fnbzPgG99cNL7w3v+/0t4V9/cFW426cZgD5mBjQA0AkBNPSB7ka97enmIoSpvLff0QFRjW+d1OYvlr2p7OzqvIsQ1vp9Fmf6SQP94Yvn3RVHyfjcaXEE0H8E0ABAJwTQUEaj8Dd+oxnHtbT69a1qNMN61uKh9hbXzFgUR63LtjpJbTFpQvjBJfeGi6bNi1vyyQbO2VvOfeBW48vumW/mJAAwenQIAwA6IYCGPtDtsDfV6k+Y2MF92nfnreKovrwtPu5fuCqOWlcrE165bmP41Fl3hDf85NqOgt/sbeft7Vzrqxz0Qf/rwds4QNeYAQ0AdEIADSU0Gn/itxqOdNIDep8dmwfQvQhrmh1M/fiy++KouWbPWd4QudZ9ElxB/1uwYm0cAfQfATQA0AkBNJRQ9o/8bvdbTrX6IzoJRfN874aN3T/QaXYstX5jcUu+b8yZQK9YsyGOhsifof9dO2NxHAH0H5/GAgA6IYAen/ZO6sdJzUkqnZI1I6mvJrVjUnk9K6kvJXV+UmkT3vTP0suSaubwpH6XVNpgd01S6apMH09qy6SIsn/k96QFR4s/Y0IHqXienzV3Wbp7dFezY6n1LYTg2TA72xM678yhL/1taNEyAIAyyNtKDACgFgH0+HNgUtcndUpS1yT1laTuTeqdSV2Z1M5J5fH2pN6d1AlJzU435HBcUtcm9eKk/p7U15JaltT/JvW3pLZIikR1eLnXDr3J5luNkzuZld2LGd15NMuEW/m4aTZwznooZ6B+9zwLDgIA5dLCn0QAACMIoMefbye1W1LvSCoNgt+f1NOTSoPoRyX1qaTy+FxSRya1TVInpxuamJjUT5JKm/++PKlXJfU/SaWh9OlJnZjUu5IiUf1Hfg8mPw9o9ed00gO6JPlzovHRVCuTfbJfmr2+dPX6OKpv7tLuz/oGAGjVRgk0ANABAfT4ckBSz04qbbnxrXRDlY8mtTKp1ya1dbqhiXS29NSkNg5ca+4pSR2W1CVJ/TndEKVNdv97cBjeklR5sslRVD3ztlcBdKs6CaA7+d4iNTuWKnLBnV22aTzB/6dXzAjHfybtaDNSWfcBAGB8KPJvIgBg/BFAjy/pTOfUeUllV1dbntTlSaUzlI9PNxSs8rPPiZfV0hYgaePbfZNKQ/Jxr/pv/LKEtVmdtNEoy6/U7FCqWVuNRrLf2uzA7aN/Ts/n1DM6D9hNM5eEX159f1i5duTCiADA+NHJ30QAAALo8SVtsZGqt8rZ9Hh5SLws0mj+7L5THVb2LoBu7ed0cr+KOIb5xVX3x1H7mh1MtXQ/M1/7cGZDvx23pT2r/+X7V4YP/eG28Plz7oxbAYDxyBqEAEAnBNDjy/bxcmm8zKps3yFeFqnIn50uolirDk1qTKj+I79X8fOBu+bpvDKkW8H4xJxTqz/8x9viqH3NDqZa+bhps6/s7KOrnXxve3525YywZv3gByV+emXnYT8A0L+04AAAOiGAplol+RuNvzBH82eX0NDD0KsJ0P/vGQeHR+60Vdhy8sTwszceG7fWt1mDd49j998pjmqb0CBk3mrzdL3K3kgf20azoFtahDBzO9mbLXrm0Fm3Phi+dN60sGDF2rilWGY6AQAVm7LN+wAAWiCAHl8qs4wrs5GztouX9WYpd6LIn310nRozfQKqw79eteDYZotJ4cL3PjVc++FnhpMO2TVura/R/ZrY5D7vtcOWcTTSW55yYBx1X/o4N5rQ08lkn1mLV8fRoI0NEt0ZC9L1P+vLfuudc5eFt/3yhvCNC+4OHylgJjgAQCMrrAcBAHRAAD2+TIuX9fosHxwv6/Vp7sRo/uy+U/0xx17NgE6l7S/SIDqPRiFztv9x1rueVb/V96P3qneOonjprOVG97SVBXdWrtsYR7U1uq25y9bEUW3Zb/3ttTPjKISzb5sb1qxv/LMBADrxiu9dGUcAAK0TQI8vF8bLZyeVfe63TerEpNJpm1elGwp2Qbx8brysdkBSaSKZNpq9N90w3lUHjr1bhLA1ndyt7becHEe9c8y+O8bRkDToX7Gm/oyeVvsdrt9Y//OpnbS0yN6P7N36yeUz4ggAAACgXATQ48s9SZ2X1H5JvT3dUOXjSaWr0P0sqep+AOnCfkUs7ndxUnckdVJSL0w3ROk++LnBYfhuUh3EdGNHPyz00igYz3P3e9nrOfX4GgF0ej9/eFn9cx4bW3waKs9brdnOjZ7TZo9X9v9nb//bF94dR8Up52kPAAAAoN8IoMeftyU1L6mvJ/XHpD6TVDo7+V1Jpe0vPpRUtTQ0TivrSUmdGuuL6YZE2kajsi2tammPgFOSWpXU75P6VVKfTerqpF6e1OVJfSUpMjYr6QzoBusI5jqL0Gxm9zMP2z2OGmt0P5pJQ+Gpc5bFayNtanPa8toNI2dCd3JSIdsoJHtLy7vQl7H9ewsAAAAwRAA9/qSzoI9JKg2Ij0vqPUmlq76lgfQTk1qYVB4HJfX6WC9LNyR2S6qyLa2sNGx+QlJ/SiptA5KG3mnD3/9L6llJrU2KRPVK43c8WD8gHU2NAuS35lhIsFluPLHgd6epc0aub5nmyxfcmZ6Pqa3RwoG1pMHzhjptODrIn0ekwR3dFgAAAEAPCaDHp3QFs3Q28h5JbZ7Uvkm9M6lFSWWlOWGtrDANsCv/r17VcntS/5zULkltkVTa+/mjSaW9p4lOv2FWHJVXvfz5My99dHjqo3aN1+qr9/2V7QtXrBscNJE3i73zweVxNKTZIoMbW0x6n/jp88OTPndhmLds5LmUVsPsatlvbbbIIwAAAEBZCKD7Q9qDOZ0t/Oak0hnDjHE3PLA4jsqrXmuQfz32kbnahkxo0jvjuvvzPQZ5M+JD90jX2RyuWSbcami8ct3GMHfZmvDBP9watwwpsgVHB1l2bs2fQRh7Vq7dENasTztGAQAAUBQBdLn8b1IPJrXTwLVBz0zqxqTSPsvfTuqGpHZOijFsYieNjftEvd/wMXvvEEfF2mfHreJoSLNQuN1Zy7fOHtnuo9GPajajuRuB88xFq8KDS+t/8KALPxJKLW3Tc9ynzx+oBxamyxUAAABQBAF0uTwvqTuTqm6FkS4SmGZBaZuK7yS1f1JpuwzGsGYL9I0F9X7H7becHEfN1WuhUeuma21rNim53VnLS1evj6MhjW5rcpOG153Mnq7l6nsXhid//sLwxM9cEG5vsAgjjCf/8bPrw4q1GwZev+897ea4FQAAgE4JoMtlv6TuGBwO2Cupo5NKZz5/Mqn/TOqCpF6cFGPY2I+f00C489+yXi77wqP2jKNqI39e0x7QBU49bnRTzR6JZvezVa/8/lVxFMLzv35pHMH4NnvJ0CcC7po3smc8AAAA7RFAl8uOSVXPfj4xqTR5+uvAtUHXJ/XIwSFj1TiYAF3I71gvlj1iz+3iaMgWk0a+3TXLl4sNoNu/rU2b4iDqRYeWcbALAgB1FHzuGwAY5wTQ5TI/qXTWc8XTkko/y3/1wLVBmyfleaPvFRGi1poZvMf2U8IpJ6adaob7j5MOiKMhzULhIltfNJrF3CyMz37nZj2Ih4v7zaH/CF4AhnvSQbvEEQBA6wSZ5XJTUi9M6sikDkrqlUldllT1SmFpm450oULGsF4EjKOtiD7X2YzoEy86Ivzq348Pk2qk2ztsNTl89OTD47VBU5v0P95Q4AzoTmZTZ4Pw8TBDHgAoj0fvvX0cAQC0TgBdLp9PKv3rLl39aFocfympiilJPTWp6wauMXaNg4CxkAC6KpdNQ+fXPnG/sP8uW9fsL51+bToz+qx3PDluaW5ToS044qAN2dnT8mfoPzttnX6ACaA/+WQIANAJAXS5pKuBvSCpPyb1h6RentTZSVWckNSMpNL/xxj2rMN2jyMaqZ4Z3CzPrvz/CS286xU5A7qjHtCZby1iAcdmhNxQrC0nT4wjgP7zsOZcAEAHBNDlc05SL0sqDZ+zQfMFST0uqd8PXGPMesT26WT3QUfvm65NOfbMXlLdWaY91W0tmrUt2WrzSQOXrcy8nrW48/tY0TiAbnyftOAAAEaTGdAAQCcE0P0jTSG3Hhwy1lX/jV8dRvezXbbZIo6KM6cqxF63cVMcjXTALkMvnSIWP2xH49nUjY/qst967/yVcdQ9jjMZzxotGgowHnlfBAA6IYAul2cklfaBrp7yultSFye1IKlFSX05Kca46j/y+3my67ZTBmcdp17wmD3iqDjP+solcdTY1lsM3Y/RekQ3bKx/4Nas00f2oO/iu+bH0ZDV6zbGEdCpbsQsRXzqA2C0NPtbBQCgEQF0ufy/pF6a1OKBa4O+mFS6atrdSS1M6p1JvSIpxole9Pvtll++6biw27ZbhEMfsW14z7MPiVtH16jNgG4wQ7vZpKI8/aM76TFdSz+f+IBOVbf3AaD53yoAAI0IoMvlqKQuGxwO2DKptBf035J6VKyZSb0lKcaJfg4CH7P3DuGK9z89nP3OJ4dtp0yOW+t7yiG7xlEIj3/kDnHUuQlVqXMrPaCL1KgFx7LV6+Ootk31s+t/cFwIxVnlEwUAwxR9ohsAGF8E0OWSttuYMzgccFxSaQPgUweuhbA8qb8mlQbRjGHVf+P3+0y8SRMn5J7Fffie28VRCCcftWccda561vNoBdCNnsUvnjctjmobjRnQ/b3XAQBFuure9IOYAADtEUCXy9qk0lnPFWnrjTQHqm50uyypnQaHjFW3zl4aRyGceeuDcTT2VUfDRcbEw263oBtudTGeRgHxnXPTc0v15flRBefPQBesb9CKB6DMmv2tAgDQiAC6XO5L6umDwwEvS2p6UrMHrg3aJ6l0QULGsB9dlu4K40/1ZO8ie19PrG7BUVAT6FmLW1xQrIOAONfs5hZuf7uqxSHrKe7RByqWr9kQRwAAAOOHALpcfprUo5O6OqlL4/hXSVV7fFKNP68PPfKsw3ePo2JUzyouslPGjlttHkfFBauttkbpIH8eFswXoZ1wf1Oft4KBMlizXm9pAABg/BFAl8t3kvpNUsckdWJSab/nzyVVcWxShyV10cA1GGWfe9lj4qgY1TN9i5yB+45nHBxHyZteQcl2qzfTasuOahsz37v15hPjaMjDLUTc7TwEqwRnjCOP2C5dfqEzc5euiaMhf7v9oTgCAAAYPwTQ5bI+qVcltWNS2yf1oqTSvtAV9yb1uKS+MXANRtlOW28env/oR8RrnaueZLt+Y/uBbdYBu24dR2kAHQcd2qzFiLyD/HlEeH38ATvH0ZBuT1BeuKL6rWjwPi1dlb5lwdhT3banXXfMTZdsGO7X1zwQRwAAAOOHALqc0qPWWit9pL2fb05qaIU6GEOqZ0B/9+J74qg9P33jseGkQ3YNX/uXx4atNh/qeVxkb+lWdJIPZ9tfVAfqFZ3MsM7jKV+4KPzvn24bGKc/61U/uDo87hPnhR+P037l0Eytd5pc/dwBAADGGAF0OW2V1GuS+lJSP0rqy/H6yNQJRtkWk0a2g2hXdTYzb/nwGbetesohu4afvfHY8KLH7hW3DCpsBnSLt9NJ7rShKoBevmZ9+OstD8ZrQ1q5+UZ3PQ27f3HV/eF7l6QfuBjuZ1feP3B53f2Lw5X3LhyYdf1/f719YBuMJUWc0Kl1sqvbn1QAAAAoIwF0+Tw/qTTlSRckfFdSpyT1X/H6jKRekBSUxvue86h/fFz9Iy84fOCyXffMXxFH3TNaM6ArMx9XrN0QPvbnqeH//nJ7WL1uY/jLzXMGtjdy1q1DgfP/+/WN4cEavWWLWiTwrNseDB/+420NF1lcvHJdHMHYVMSrqdY7jRnQAADAeCSALpfHJ3VGUjsk9cuk3pjU8+Jlej3d/vukjk4KSmHPHbYM5/7Xk8NPTnlCeMMJ+8Wt7bl0etplprtGawZ0xdfPnx5OvWJG+PHl94XvXHzPQKDczA0PLImjEC6aNj+Ohmsl1moUwn/h3GlxVFsadJvFyVhXRE5897yRJ9SKOlEE0GtH7Z0uTwMA0B4BdLl8KKn06PTJSb0uqVOTOjdepteflFT6/z+YFJTGQbttG572qN0KWbir24qaAT1z0eo4yqfykf7vV7W26LTPdbW8gVkagC1qMIN5QpPHZ/q8FYW0J4CxrlZ7mup+9AD9ZOstvH8BAO0TQJdLGjyfltRVA9dGujqpdAZ0+nVAG4rKyC+486E4yqdWZLtuw6Y46lzej/a/5DtXxFFtzR6el3778kLaE0CZPdylvXz/GguIAvQD554BgE4IoMsl/WzbzMFhXQ8ktd3gEMaunbbePI6K1WyGb16t3k63D9zyBtA3zxxq51FLs19r5bqN+th2wdm3Phg+fdYd4cGlrc2spzu6tYv79ADQr7p1Yg4AGB8E0OWSrkZ27OCwrmOSGlqRDMao7becHEfFKih/bj5VOCM9cFu2Zn28Vryicq08wboMrVjp4ptv/eUNA+1Z3v3bm+NWRlO3TrIcf8DOcQTQX7SwBwA6IYAul7OSenpS709qYrqhSvpcvSepZyaVfh2MaR/+p8PiqFijNQN6zfpN4cTPXBCvFa+ovCxP8OYYtFh/vXnonOKV9y6MI0ZTt4KWfXbcKo4A+otPcAAAnRBAl8snkpqb1KeSujupnyX1uaR+mtT0pD6fVPr/P5kUjDkHVvVHfXSXVltvJTfee8ct46hzv79+Vli+dkO81p4VDb6/qBmb98xfGUf1OQgt1lm3+lBL2TRaqLMT2tcA/crbFwDQCQF0uaTh8olJ/T2pfZN6TVLvS+q1Se2fVLr9SUlJKxiTnnnY7nGUdrgoZqZyViu3W7aDrSWr6odivQy2HIQWa46+z+OGj7AD/coJNACgEwLo8pmR1HOS2iepFyaVhs/pZXo93X5fUjAmTZgwFA4X1qs5o+pHNLWxZGlRo7YfvbynFiIqVtn2M7rHpweAfuWfKgCgEwLo8pqd1F+T+mW8TK/DmFYdDrfaY/k1xz8yjhqbNDH/297GBmHRaORIjX5kr4KtLSdPDJs2xSsUYsNGR/XjhQAH6FfevgCATgigR9eP26wfJcU4kTdYHQuqQ+ftpkyKo3z+82kHx1Fzv3vzE+OosTLNVrx2xqKwxaT6b9m9CrbWb9zkILRgGyT644YZ0EC/8v4FAHRCAD263tBBMYY9pmoBvuc/eo84GvuqA+h0pvIZbzshvPHE/cMv/u24uLW+rbaYGEfNHbnXdnHUWKPWCN1qEVIxMdMr5JdX3d9wVngnvRmnP7Q8jprbkDwmDkKLZVbs+OGpBvqVHtAAQCcE0KMrXViwnTogKcaw6pmukyaMn5fp5pkZvo9/5I7hf08+PBy+Z77AOK+87T0aBYPdPg7bdZst4mhQel/mLl0Tr43Uyf151lcuiaN8Gv2oNJz+v7/cHl7y7cvDTTOXxK1ASoAD9Csf1gEAOiGAHl33d1CMYdXBZyuL5vW7SXV+2aIfgrwB9LoN9Y+2ur0QX/YuLlixNjz/65fGayP1MthqNAP6kukLwo8vvy/c+MCS8IrvXhm3Qv95aFn9Ez7tkj8D/crbFwDQCQE0lFB1mNjtVg9lcuJBu8RR6zZvYXHBbHuLeuqFutffvyh87+J747XuyN7DK+5ZGEe19TLYavSzrr9/cRyFsG6j6VL0r+9cdE8cFccMaKBfab8FAHRCAA0lVP03/mZjNIE+ap8d4mjQR08+PBy511Dv62p5HoIpk/P3gM47q7zesdbLvtP9mb2tPu95gq0iDh6P2nv7cOfc+j2jx+beCsWQ3wD9ygk0AKATAmgooeqgMG+7iH7zr0/YJ44GnXJi2t68ts2axJrve86j4iifvOFut9tsNNJq6+90l0n3m0YhcxGL3d08a2k49YoZ8dqgF33r8nDn3GXxGowNl929II6KM5rvKQCdkD8DAJ0QQEMJVQeFY3VGaZG5+lufcmAcFauIwLZd++28dRzlc/+iVeE5X70knPzNywb6RdeSZ/bSEW0s+HjzzCXh3069bmA8Rs+XMA7dPW9FHBXHIl5AvzIDGgDohAAaSqh6ltxYnQF99L47xVEIO2w1OY5qmzSx8WMwoUsrNdY62JrXhYXJajliz9rtSOr5r9/cGO56aEW4bfay8LE/T41bh8tz8FhvIchmZi9ZPXCZna2+Xh9o+AcBDtCvvH0BAJ0QQEMJVc+SG6szSg/abZvwiRcdEZ57xCPCr950fNxa29ZbTApPP3S3eK0Yu267RRzVV+tga36d2cWjrXq2dr3WAXkOHlev3xhH7cl+/++umxlHUG5bttBHvl3ym8Y2Jm9k506dG666t/Giq0DvOYEGAHRCAA0lVP1H/lidAZ167RP3C9997dHh8BxtH374umPiqBibT8z39pftqdysH3VROukVW+8e5jl4TGdRd+L7l9wTR4PmLy9nYA9ZB+zaWtubdmTfT9LA9bsX3xO+cO6dYfma9XHr+PWHG2eHN//8+vAv379qoLUPUB7t/1UCACCAhlKqzij01B1UdJuNSsuIZh5aNjxAvf3B8i+2V2+RxUY9rRstXtiK7M8YyydQGFuK3lVPOmTXOBqSfX2cccOs8Nmz7wzfuvCe8LW/T49bx6/3nnZzHIXwvt8PjYHey/5VYAY0ANAJATSU0HjoAd0vskH1ZdPnx1F5pbMqa2l08Fjve1pxeZ3WH9SWzvD84rnT4jVGW9GfbqjVTz37EvzWhXfHUQg/vOy+OCJVxHsSUByLqAIAnRBAQwlVH3d3aX29vvSxkw+Po96pnhmc9iX9401z4rUu6yB7Wbq69kf5H25w8LixgJlNr/7h1XE0xISp2tZu2Bhe9K3LwzerAkjGvuxJoHqfVqCjt0AAAKBkBNBQQtUhhXxiyBtO3D+Oeqf6ZEDal7SfNQqZzWzqrZmL8rWAYWwZ2VOeuiTQUCpacAAAnRBAQxlV/Y1vhtzoKqo3chk0Onjs1oHljIUr4wjKrRdvtR/509Rwzm0PxmuJPnl7X7hibfjX718VXvm9K8O85Wvi1u4SdUG5CKABgE4IoKGEqv/I1wN6dI2lNqSXNuhfXUQLjlr+cOPscN8CIXSWl3X59OopecsvboijkT+zrCe8Pv6X28OV9y4MV9+3KHzkj7fFrd2lBzSUi/wZAOiEABpKaMbCVXHUNxPkxqxezfbL6uQ4b/OJI9/a5y1bE97125vjtZHWrNsYR8XrVWBVRrfPWRY+fdYd4dZZS+OW5sbSrPu+UuOswJwlq8OGjZsGqhuyn3B5yhcuGthnyuasW4dmbZ879aE46q4HFg39OwiMPueEAIBOCKCh5NZ1KfjoV8fut1McdeaEA3eOo8Y+eeYdcdRbu2yzeRy17uEa8fW5tzcOjS6cNi+Oirdi7YY4Gn9e/O3Lw/cvuTec/M3LwqacR+/9NPPzWxfeHf79Z9eFux5aHrf0sRrB/wmfvSA8+fMXhpOSeqDqxGBRspF3Grq+4SfXxGsA5bFgxdo4AgBonQAaSm51F2em9qPvvObxcdSZsrY2Se/WXjtsGV73xP3ilta1M4F2QxdDz/H8Ufp1G4ZOIFWfTGq093WrHUrRrpuxKHzh3Gnhb7c/FF73o/4PTevtpg8uXRPmJPWe026KWzp32+zBGfG13obmLRfyAOW0Zr2/SQGA9gigoeS6GQz2o5232SKOOjNhQr4AOueXFeLNJx0QrvrAM8JF73tqmDJ5YtxakCah5oaN3dvPbo1hG0MWrFgXRyNt6pMPPVx294I4CmHustFpVVOkZidKrrt/cRx17gXfuCwsXbU+3PXQirgFoPz0ZgcA2iWAhpJ79F7bxxFFyhssV89g7bYTDtol7L7dlDC5Rg/nVrRzeOhER/dVnwO4dsaiOBqpX2ZATyzppwjaVb34ay1FPy0f/MOtcQQAADC2CaCh5Cb2cgpuH2r34ckbnq3v4szgrGYBWF7tLGK37ZRJcUS31OrNXUveGWZpT+mL75of7p43Ov2Xx1j+XNjrL68zqxb2K7vePjJAWY21930AoHcE0FBC/sDPb4et2lus774FK+OosZ5+3LSgH9XOzTxq923jiG7JuyvlXazwF1ffH17/42vCs79ySZi1uPgF8pr5w42z46i/3T1vRfjRZfcN9HruRNob9axbHwxzlqweuN7OiSAAAICxSAANJSeLHqk6LH3cPjvEUWvu7UEA/YPXHRNH+RQVdreTe/V69ud4kA0gq68/8cCd42ikvC04/vdPUwcu093m02fdMTDupXvm53sNldn6jZvCy797RfjEX28Py9dsiFvb87E/Tw1v++UN4YXfvCys3VDuhbquvndheOsvrg/n3DY3bmlM31cg5U8FAKBdAmgoIX/gN/atVz8+PGK7KWHvHbcMn3zJkXFrd7TTj/fKDzw9/P3dJ4VnHb573JJPN0PgdU1aiXR7l/vTTWNjtmwrsk9ndYY3eUL9f37zzoCutnb96K9cOK8PFyK8Z/6KsGTV+nituXOn1g9sf3PtzIHLdIHJi6bNHxiX1Su/f1U4+7a54S2/uD6sWtdZ8A6MH+knPQAA2iGAhpLTjmOkg3bbJlz2P08LF7/vaWGP7beMW7ujnZl/6X06aLfWW1oUOcnw9OtnxdGgZuFgt9sFvPM3N8XROFb1EDc62dDOSY8yzGD/959fH0fld+MDiwdmAP/5pjlxSz5vzvk7dvp09LJ9x4Ll6+IIoLHR/5cGAOhXAmgouc0k0DVNmjhhDC7QWNyh3XtOuzmO8tkQZ0hvvfnEgUs6l302q0PiRs90Oyc9bpq5JI6Kc+Gd88Krf3hVOOOG4Scz6rm5C/ehW17y7SsGZgB/+6J74pZidfrW9OofXt2zEDrv4pgA7XxCBwAgJYCGkunlzDfyW7G2+x9TH83jusqCco4ti5N9LVcH0PcvrN8/eVMb3TQWt9BGIq9TTr02XH73wvDu390cVvZg/x9LOj1xeMU9C8Ol0xfEa93lNQ/k1c4ndAAAUgJogBzmL18bR93z6L22j6Peq/SvNRuyONlHsjroe//pt8bRSN04wJ86Z2n4/fWz2u73u3R18QH3WLJ63fC+qEV8OGPhyu6/56Sc9ATycsIKAGiXABpKRhZQTr3osbvPTlvFUfHytnVwcFmc7C5THe6vbrCQ08Z2pkA3sHDF2vCSb10R3nvazeFrf58et7amDD2my+xnV86Io0FFdE7aLPmvFzyzQF5acAAA7RJAQ8lU/2mv/XN5LFnVeKGuT7z4yPDkg3cJv/2P4+OWQVuNYk/ldGbjvOWDiw/mPmZ0bFmY7GzyvBnuxmLz5/CzK+8P6+KNfu+SewcuW3XNfYviiFoWZd4fiujd36v3/3bOLZg1DeNTO2sUAACkBNBQMmYa9sYzD9stjhr7p0fvMXD5+XOmDVzW89rj9w0//7fjwnEH7By3DLrxf58VR7138jcvC8d+6vzwib/eHqZMzvd2b/8rTvahzPvYFn2AP6GAJDPtA531ymP2iSOys5WvvGdhiOt6tq13C9C2fkfXbij4LAnQF/yNAAC0SwANJXPe1IfiqL2ZaeTzmL13iKPGDt9zu4HL+xbUXzSukS0mtT8D+kWP3TOO2nPb7GUDlz+67L7wqEdsOzBuZPaS1WGD2U1dk/ehnT5veRwVY2KX/qXfeotJcTT+zFy0Knz34nvC3fNWDFzPZsXfv+TecMld8+O19vQqfr53fuvvbcvXWJQSxiMBNADQLgE0lMzbf3VDHNFNecOdykfNR+Njp884bPc46tzF05qHYe/53U1xRBGyx+l5e2f+Ni4IWZSJE7rzT33PJuiW0Bt+ck347Nl3hn/5/lUDz2s3HorszPXb5yz7R0udIp0zdW4c5det537/XbaOI6CMnKMGANolgAbGpbwBypJV6wcuR2Nm8IQCQ54zbpwdR/Vdda8+v0XK9oDO64p7FsZRMbo1A3o8uyfOGl6wYu3AbOAi2pxkVd/kTy6/Lzz/65cOtNTJLnjYsTZ2024tRNatYBsoxnUzFscRAEBrHJYC49LNs5bGUWM/vOy+gctJRabBOU2UxvS1bEY3Wh9d7tYM6G2njN8WHNXSEw3deKlW3+TH/3J7HIXwv3+aGkejp1vn47zjQbldOr2z1kIAwPglgAbGpb/dPtRrO4/RmAHdu0XI6IZK+5aKvLvQ/zz30DgqRrdOnmwzjntAV1uwYl0cFatXL/92FhTc2KWTKd7zoNxOPqqztSkAgPFLAA2Qw9LVg604avn6vz4ujoo1cRRmXVOcbESXdwb0NgXPLJ7Qxn6UDc+p72vnT+/K7PZKMLxm/caBy24589YHw3UzFrX0nHerBYe3PCi3KZMdOgIA7fFXBECHHrfPDnFULGFMf8vmeXkDvqLD3zy7URpy3jZ76T9+dp58seC72TMf+3OxLSz22H5KV1pSpItRps/JcZ8+P27pnpd/98pwzX35e8B3a1HWbvTSBoqzqfUPTAAADBBAA3SoWWbywjY/strOzNVuevNJB8RReT2wcFV4z+9uDqdePti7e1RlMrrqwLZRW4x2g916wfWDS1fHUW3pbNaTv3FZeEFSnzzzjoFteULwdhdZHE1pcHrqFcUu4pfeZjdmQKeLUf7Hz65r+OmLIr3y+1fFUXOj1c8cGF1e+wBAuwTQAE0896uXxFFte+2wZRzVdtge28VRfQfsunUcDSnbIoSP33fHOCqvt/3q+nD6DbPCx/5ye7jhgdFdrT8b0FZPGn3FE/aJo5HaPcCvNyv1kTttFUeDsuHy1fctCtPnrRgY/yguulnnpobpxxxi+Zriw9z0cd+wsTsPxpyla+KoOMsKeAzy7B/t0AMayk0ADQC0SwANkDhq7+3jaKQ75y6Po9qahSZ5MpVaYXPZPo7e6b1ZtHJd+Nw5dyaP57K4pXi3zR667fOmtrbQZNGyIV31gfsu22wRRyPNW742fPlvd4UL75wXt+RTLxTcbsrkOBqUDapXr98QR0PyzG6u9fOKbh9StPUFBMXZ3zF9PHfeZvN4rfyuumdhHLWvW89zud7xgKx6/84AADQjgAbGpcc9cnjf5jc+af+w+aTuvCXmCVXecOJ+cTRkwhh6h957xy3D4z/xt/Cdi+4Jz/3qpWHVupGhZ9FGu0XEadfNjKNBw2aONQjw0sfo6+dPD6ecem2YuWhV3NpcvZlp2RMka+LidhW1vi1Pvljr8c3zfaOpiOA0G8BsvcWksMvW9U8olE2jE2afOWuwBUszG7v0RI+l9zwYi8yABgDa5U99YFx66eP2iqNBj9tnx3DGW08In37Jo+OWfE5/6xPjqL48E5lfeczIlgzdnAGd56Zfe/y+cTSok/uT/dZKr+GuGuXj5EunL4ijQdUzj/POIvvrLQ/GUXP1goFsu+l7YruNRvJkDLW+JuevNWqKmL2XDbGffPAufRXKNHoVf++Se2ue9Hj0XsM/IdKthcgsQgjlZgY0ANAuATQwLt3+4PC2Go/ceatw5F7bh1cd98i4JZ+j990pjuprFqr85A1PCJMmjnw7ntjFRQiz4XIt//XMg+NoUCfZ0PoNw49am/XNLsJoHycfmOnrXR0mX3f/ojhqrJVZ3DMX1V5sMLv/bciRIGQD1ckT8z35ZQ9ii7h/tR6+fgplmr2OF6xYG0dDsj3qu/U8d+8dDyhC2dssAQDlJYAGxqU/3Dgrjkb656P3jqPeeNqhu8XRcF3MnwdsvfnEOKot+1H9TgLoucuGL6Z2wC4jF10sWjcOlGctXhXm5lwYLvv4ff+Se+MohKvuzRdAt+J/Tr8ljhrbItNqZsmqkYvSZR+5kx+zZxwNqfX4lj2ALuLeZX/H9HrZf+9qzV7HtX6TbMDetd+3kzcZoOvqLXYLANCMABoYlybXmHFc8bKCA+hmixTW09UWHEltv+Xwxemysj2xNytwfmIvcqaiM7JfXn1/eNLnLgzHf+b8cPuc5gsp9jpLu2nmkjgaLvswbJk58VDrfmYDxi0mj3y91Mohyp7DbiogPFm5dnj/8jSQ6acAuh3Z369bGVS3T7oBnZE/AwDtEkAD49L/e/pBcTTSVk1mBreq3VCl2/1Q//fkI+Kotm22mBT+9dh9BgLKtzzlwMHUuo8UfaD8oT/cFkchPP/rl4Znffni8JtrHohb+letVi8PZ3r81spX824rkyLu30XT5sfRoPQmL7lreL/vMmvnMZizZHh7l24F7tk90cf9oVzG+sk2AKB7BNDAuLTrtlvE0UhFB7/t3tq6jV1a6SuRzsree8fmfZg/89LHhFs++uzw/ucdWmj+PH/5yD6zRWulf3I7ps9bEd5/xq3xWmuO3nfHOGqsiGP9bIi35eThJ1j23Xl4O5T067OPXa37Uevx7fZj3qkiwpONmdtIH6+/3/FQvNb/7p2/Mo6G3PjA8Nn1Rcwkr2XJ6uHtYAp4uoACOSkEALRLAA2MS0W2k2im3RYcyzJhTNHyBu3bThls1dHu71HLR/40NY66p1fHyfXC9H132iqORsoT/hcl+zBkr2ef1fRxu3X20nhtUK3gttbjW/aPZxdx97Lh66bunSfKrchQ6L2n3RxH9aUPwe+umxk+/pepNRctbFc2/DbbEsqli+fFAYAxTgANjEuNstTCZ0C3eXOTavSp3mWb+jO3W5H+jhNa/Bcgu3gdgz7656HWHNUO2m3bOBppNBdyygao2XuShn5v/+UN8dqgWve2VuhZ9tlxN9fpk92KWo9Xr1U/zh8445Zw3KfPD+fc9mDc0n3n3/FQ+O/f3xJ+cvmM8KJvXh63Fq/TR/bS6fPD58+5M8zOtBABcqjx3uakEADQLmkCMC41ms27ZPW6OCpGuzOHJ9fozXvwbtvEUWfSbLvVoP3Y/XYK++08OKv3Vcc9cuCyzHoVhp5169w4Gq5RO4peBtDNHobs45TetWVrhi+0Vyt0mFdj5vco5uq5/Ndvb4qj4ozG7/zsr1wSZi1eFa6/f1H49TUzB56Lt/xi+EmDelp52ddrtfG9S+6No9DVcPeWWe2fMEhnZr/2R9eEb190T/jPX+V7bIDGyn6SEQAoLwE0MC41Whhw3rJi+xO3uwhhrcXhDsoE0AfuOrx/b15vfsqBLd+vCck3/PUdTw6/+Y/jwydedGTcWl6tHiav27Ap3DN/RbzWuUbH6RtyppZn3Vp/VmvlZEBzw39WsxlsS1bVOAFT41t+c+3MOBoyHsKJ7OM3Gr9z2n/8fafdkuyvI/s1N5PnhFgaPL/pp9eGJ3zq7+GCO0evv/XLvnNlmDZ3ebzWmsvvHloYMtvDGmhP2U8yAgDlJYAGxqVGs3/bnLBcV7v9pidNHPl9u2UWT/zXY1ufifzhfzpsoJVHOzOzt9liUjj+gJ1rhuNl00oumAZu//T1S8MzvnRx+Mrf7opbO9Pox+edAT11zrI4GqlWi5Zaso/DiOvxsuIL506LoyF5P3Y9Cllsz/3q6gfiaNBoBTJX3rswbNjY+g+flOO1+5db5oS/3zEvLFy5Lrzx1Ovi1tHxnK9eEv544+x4DRhNWnAAAO0SQAPjUtF9nhtp90fVuo+vPHafOErD533CnCVr4rX8HvfIHQcue/kYjIZGLTCyLp4+f2BWaepr508fuKzWzizXRgfqeWdAN9LuzNuRM3jjIKrVWiPvTxoP4UT2pMBo/s7r21gRbOstJsVRfaddNyuOyqGd1ilFLpoKDBrN9QsAgP4mgB6f9k7qx0nNSSpNGmYk9dWkBlOp/HZKKv2+9PvT20lvL73d9PZrSY8G35jUVUmln6ldldSNSb0jqYlJkdhnpy3jiG5qlE0UHVw0mnB4/AHpy6i2WgHxbttOCae/9YTw8RceET7w/MPCjy+/L/6f/Cqzl/tgEnNHWskFV63dGEe1tXPQffG0+XE0Ur3euq3I+/tlv2zktw3fUitQzd7dh5bVPvEx8jvHvtEMoG94YHEc5Zfn7l5W1b4idcjuxfSe76Wx/v4Go2EU3+4AgD4ngB5/Dkzq+qROSeqapL6SVLqa0DuTujKpnZPKI/269OvT77snqfR20ttLbze9/QOSyvppUj9Kav+kfpvUD5LaPKmvxesOFxNP2G8okHz709Kni2548sG7hCmTB98Cn3vEIwYuK7bevNjzIY1acGw5uf7PqpeDH73vjuH1J+wXtpsyOW5pTSWYGfszoPPLhlXn3DZ8YcF28uJTr0jPzdW2YVPrM1ez8t6lbGDQLEBYtnp9HA3Jzrb+aZ3fbTzMgM4azRmBMxel53Fb1fr97eavmO5b6WN4+vXFzrpeuKLYxWSB8fkeDwAUQwA9/nw7qd2SSmcdvzip9yf19KTSAPlRSX0qqTw+ndQhSaXf94yk0ttJby8NpNPbT39OtfT/vTapdLrmEUm9Kan0ax+b1B+TellSr0+Kqr/t99+l/2ad9YutNp8UznjrieGjJx8ePv3SR8etg9Iex0Vqd7b15pO68xZdCZ7HSv583tS54cTPXhA++Idb45ZB97awoGD2sXjLL64P181YFK8Vf9BdRGjZ7n3KhsnZm7l51tI4GpL9mro/ub271Nfa6cNclGwrl7UbGs/kT7Wz23QrdFq0cl141lcuCUd/8m/hPafdHLcW44eXpefWgSKN4vk2AKDPCaDHl3RW8rOTSqeufSvdUOWjSaXL6ach8dbphgbS/59+Xfr16fdV+2ZS6e0/J6nqWdAvjZdfSqr6s73pVLuPDA7D/4uX41r13/ZjJB8srcP33C6ccuL+Yaet04n4Q4qeGdzu7T1q923jqFiV+9PNGdDNbnpyjQUW2/UfP78+zF6yesTicFfdOxQgN1PrRMAXzxtajK/oAK6YHtBx0ES2F3b22/LcTPY26j0e4zGc+NPNo7dA3roNw2fS/+yK++Oovnaeoi7lz+Ejf7wt3D1vRViyauSse6B8unUyCgAY+wTQ40s60zl1XlLZz3+nPZkvT2qrpI5PNzTwxKTSRsXp16ffVy293fT2U0+Ll6lKj4NaU5Iq2x6f1A6Dw/GrenZiF/NBGij6cW/39rq1iNZQD+jObv/IvbaLo5Ga3fLLjx5aTLEMarWdqO6SkQ36OtXLGdDZL8t+X56bGdExpM73jMdw4vK7F8ZR72UXIbzu/uYnXe6bn547bk23ntczb30wjoq36zZbxBFQlCLWLwAAxicB9PiStthI3RUvs6bHy7S1RiPt3E5l1nPa/zmreqb0ofFy3Kr+014APTq6HUBXt9Y4cs/6IW63DPWAHrxs1/dee0x477MPCV/856Pilvw6/dlFW7xqZL/Ya6pacIxmAP0fP7sufOzPU4fdh/PveCjMWrw6XmvNyrUbwwfOuCW897Sbw9LV64ed9Kqn2Szqivy/FUXIzhxudlLp/oUrw3+ffku8ll8/nlh48eP2iiOgKPJnAKBdAujxZft4ObLB56DK9mazkNu5nb/Gy3cnNbTKXgiTkvr44HDAjvGykXSRw1o1JsLr6uP8RovX0T1Ft6bI3t6v//34sNu2W4Sj9tkhvO1pB8WtvTMhpr+dzrDea4ctw38+/eDwnCN2j1uGpLOsD9ilfjefyizsblu5dkMcNXZws3YnBd/dVgLo825/aGBBw8d8/Nx/hMX/9tPrBi7zyP6kb1wwPfz6mpnh99fPCp8/5864tbHs3a0XyJsd11sLVw4/cdIsKP7on6fGUWsKWDOz53r1HgPjyXj8lAsAUAwBNNUqR2ud/nVZ63Z+k9TZSR2Y1O1JfT+pryZ1U1LPT6oya7r5CkpjXPWDVnAOSk7dftiP3nfHcOUHnhH+9PYTw5TJE+PW3pkYd6yi8pltp0yOoyFpuP2zfzs2XhuplR+9Yu2GEa0G8so7c7nZbOKij7nb6QG9Zv2m8JE/3Rav5Zed4XzRtPlxFMIvr34g1xt+9vefPi/bfYk8tt68u6/3Zvvp/OVr4wigdXk+MQMAUIsAenypzEyuzGDOqvQCqDezuaKd20lToBcm9d6k5iaVLmL4xqRmJfWkpCpNNOfFy0aOrlP5pvKVnD/uR1/RM6BrzTQuanbeO55xcBzlV/n9iv49q6W3vPXm6Qccasubv15z36Jw7Kf+Hk787AVh4YrWw7O8s7U+d3bjt49mt5N3pnVFuzOFf3HVA2H5mmIXbMvzEKWLPOZhdlxtTzxg5/D0Q3cLv31zuoRC90x7qPGJgalzlsVRa/I+/2WyvuC2OUAIG73HAwBtEkCPL9PiZb0ez5Ukq15v54p2bydNaL6U1GOTShcxTIPq5yaVzohOt6VHuO19PngMqf7TvluL0NFY0Q97Nz8JvveO6UupNRPiO383d6/0tiutPmrJG1S+7sdXh1XrNoZ5y9eGT555R9yaX95D5XSWdSPN8uLjP3N+ch/XxGvNdRLULsq0XehUtr9zLXc8mC+4lE3U9h9POSD8+A1PCEfuVe+8bTHuX7gqjvjNtTPjCCiKLksAQLsE0OPLhfHy2Ulln/u0AeqJSaUh8FXphgbS/59+Xfr12cap6e2mt5+q/Lxm0tnQU5L6XVLFTu3rR1V/3HcxH6SBooP/dOZj5aP3Jx+158BlYdo4GKzMfO5mj/H0tidPbBRAx0ETaduJimlzR6/tQ7MZy8vXbAif/OtQQN6sZUgnx/CtzlzvRihcb98xA3p82tBmi5xuunMU3y9grPIeDwC0SwA9vtyT1HlJ7ZfU29MNVdKFANMVw36W1Mp0Q5Qu7Jdd3G9FUj9PKv36j6UbqvxnUuntn5vUvemGKpXWHNWekNRnk0pv8//SDeNd9WzEbs5QpXe22nxSOP1tJ4RPvOiIgWrXE/YbuUZnntmrWf9o/1Hg/nXSIbvG0aB03508sf4/MfOXrwnXzVjUUsuZDW2shNbLY+U5VW0KqsfV7p2fvtV1dhDfavuWpvtIgY9RDx9uSuTiu4b6igNjl/wZAGiXAHr8eVtSaZ/lryf1x6Q+k9QFSb0rqbRlxoeSqpZO6av1ufcPJpV+/buTOj+p9HbS2/taUuntZwPu1N+SuiipbyaVfv2fk7oyqS2SenlS2cB6XKr+476bM1Tp3Eset1ccNXfoI7YLr33ifmGHrTaPW1p37YzFcTSknYPByomNIk9w7LDl8IUI05tudPN/v2NeePl3rwzfuyT/y76d37WdgL6WVgPjel/+2h9dM3DZRpb+D0X1D68o5hEaNFZ62L/6uEfGUTEaPWMH7bZN+M+nHRSv9ad2FwkF+stGPTgAgDYJoMefdBb0MUmdmtRxSb0nqQOTSgPpdHWkymKAzaRfl359+n3pkXN6O+nt/SSpdEHA9Odk/T6ptGXHa5JKg+tHJ/XDpNIpoemMaRLV+Y0Z0OV0yon7hX8+eu/wkRccHreMnkkNZhnXM7ELO9Zj9h7e2/awPbbL1Sris00W/6vW1mFvg2+6e96K8MVzp4VbZzVbdzUNoOOggfU5vihdzK3TkLbVFhzrNzT+eUVmxmXOJpasyt87+3lH7hG+9arHx2vFettT039yh6Qtet77nEfFa/1pjJx3AJrQggMAaJcAenxKV+Y5Jak9kkqnY+6b1DuTWpRUVpp01Es70q9Pvy/9/vR20tt7Y1KzkqrlC0ml4fQOSaWznvdP6i1JzUiKaFgLjnhJeaSzFT968hHhC/98VNhp6/ZnMxflBY/ZI+y41fDZx81UZtBuu8WkgctaPv7C1lqFvP6E/cKu26Yv60FfesVRhZ9AaefAt9F3vO5HV4dvXnh3eNG3Lms6qzjPz7555pI4auzKexd2dBBf777uvt3Q41/tF1ffH0fFqTezvMzZxHcvbu1DNulrvRuyJxC6cD6o5zYKpWBc8FIHANolgIaSqf7jfiwEE2NNN2YPd2LK5Inh3P86Kfz4DekHG/KpLLLYaLHF1xyfnlfKL+33fO2Hnhlu/7/nhDs/8dyw785bN7z9drRz4Nvoe+YsXTNwmc7abfax4iJbS3z9/OkdHcTX64Vd7zZvaTLDu6g2Jakyz467/cFlcdRc+ph066WePX+wYs2GOOpfZZz5np6cA4plBjQA0C4BNJTM8D/tu5SA0Lai++8WYbftpoSnH7p7vNZcs9/huP13avv3TBdcTEPxbmhvBnQxB8ut/uhmX97JQfwP6vTNbvcW896VdRuGgu9JE2r/+XD53QviqHxa2aPT/vvLCwyGZywYWts3e2Lml1c/EEf96/fX1/vgU2PHH7BTHBWven8FipGerB0rvf4BgN4SQEPJVP9d360ZeLQv7eHb75ply1ffV6sbz+hrJ7Stnpm5at2G8JPL7wtn3/pg3JJfqzM8G93XVes2dhSL1wss210cKu931Zt5Xe2TZ9Zas7YcWn0/Xb5mfRx17u75K+Ioff119419w8ZNYXWyj/XSJXfNj6PW1DuRUYTzbn8ojlq3Yu2G8MNL7w3n3DY3bgFS6b8/j/2/v4VvnD89bgEAyEcADaUzFAfJn8tn6eriQqnRUh2A7b3jlnFUfjnyzxE2VYWy373onvDxv9we3vrLG8L19y+OW/NpNfxuNEMsbYnRyQyyNMCuZdHKdeHcqd0LzNJZwRV77tDZfpOeyJm5aFW81hsXTWstJN2ywJn81a17uv0hiid97sJw7Kf/nrsn+Wgq60nWf//pdQMnU97yi+uT12v5H0fopfTvoC/97a62T3oCAOOTABpKpjqXKrqHLqSqA+h+2sXamX1e/Xr6+gV3x1EIXzpvWhw19p2L7hm4bDWAnthkZme3jtvf/PPr4yi/dsLwPbefEketu2320vDkz10QTvrCheHaGb2Zbb9mfWszgnfeZvOw+aTi/kSaUJU6d/s1N3fZmoH2Ia//yTVxS3l189+45x7xiDjK74YHFoczbpg1sFBoxTt/c1McAdU6aSUFAIw/Amgomeo/5/soG6QEjtp7+zhqrLq/c/Ws1rGo3gHyhpwJ8OfOuXNgpm6rx9mNFqs88aCdB2Yrl0X2Vzv0EdvG0XDVj2WLD8cw7/jNjQMBfHpzp/zk2ri1u+a0ePLiUbtvGw7YdZt4rXPV+0OvTiwuWVX+T2t0czb4vrtsFUeDmp1ombV4VXj5d64I7/7dzXHLoPuq+ncDAADtEUBDyVQfJPcop2CM+Ma/Pj6OGqsOfcb6PlYvcmpl1u97fndzywF0o8UPb521NI5KIufv1uJDUNf85WvjKAz02u2FdhbV3H7LyeGHrzsmvPzoveOW9qWzkiu63QO6nzQ6UdOxzA7b7DX8jfPv7tonE2AsavXfRQBgfBNAQ8lU/z0vpyifHbeaHEfl88idtwrTPvnceK2+6hmYY30XqzcDes36/A2lr5mxKNwyu7U+sI2CrGVrehO6Fq06tP/99bPiaKQZTWaMTurmtNc62g19n3n47uGL/3xUvNa+S6cviKPhJ4DGu1aelmwblXR/XLeh/us4+xK8eHrjHuD+vYXWNDrRCgCQJYCGkqnOy8Z6ewSKt8WkiWHK5Pxv7c9/9B5x1J+qFxmspd5M51tntzYL+UN/uC2O8umn3ph5Q4Tqh/qBBgsIXn3fUP/cWhaPQmuIVsPF6p7NRZg8cej2RnMG9CO2a793dze00o4kbZFRcfucZWH/D5wVDvnw2XUXFM2+9tN2L41a37QzSx4AAMhHAA0lM+yQ2fFw6YxGeNaqVj7W/v+efnAc9af1mxrPZB6tj9RvbOEHP3afHcLLHt95m4da8iy+lzsrz/l1ZczeR3tB10YLfz7poF0GLnsRgE6qCsLLoJVfeWPVS/35X780jkJ42XeuiKPhar0Eb3ygdlidGuVdBPpOH51nBQBKQAANJVM9a8vxMFtvPjGO8mtl9uaWbdx+L6S9gX937cx4rb5mnxIYrZnIv7r6gThq7pdvOi685vhHxmvFyrPYYt6HaOnq8p98qWe0J7dWtx3JzoB+zfH7Dlym+0HR7Une8vPrw5JVQ7N+yxaytjIbvHJSp96nGrJqfVmjl4NPHEFrRumf17Zccc+C8L9/ui3c8eCyuAUA6DUBNJTYaM/aY/S1sw+MhY+Sf+asO8J/n35LvFZfs/YRlQnSt7XYcqNT502dG0fNpU9xt17rRd7qJ8+8PY4a64dPCaROOmTXOOq+SROH/tzKvjw3nzS44fgDdg5XfODp4RMvOmLgehHOSfbDT515R7yW7g/d2c/a1UoAPSE+hCvXNZ/Vn6p18qnRCSn/3EJr+qUHdPpJoFf94OrwsyvvDy+v84kJAKD7BNBQMtXHx46HaWcfGM0es+1Yv3FTeGDh8J7Cv8w5g7jZDKzfXDt4O5/4a77wtCitHJanz1e3zhnMXbYmjurLe1/Pu/2hOGrsC+feGUflUWs/+ekpT4ij7hvWAzrzZFeHwrttOyXssNXm8VoxTqtaMLJR7+7R0MpbVdrfPtXJS+XNP78+fPm8afHacJ3cLoxHzf79LYvZS1bHUf4TWABA8QTQUDLVM0rMyKKdVGTVug1x1B8O/tDZ4aQvXBj2e/+ZcUtx0hlP6Uf3r75vUdzSG622/ujWzNQ8HzfO29IgrxxdP3oue5f23Xmrrs06r2Vy1QzoET81s6HfTiB1op3fNe+31Nuvv37B3eHueSvitSE+cQSt6ZfFdvslKAeAsU4ADSVT/YeynpSj52v/8tg4Gl3t7AFr1jdemK/MLp0+P45qS3tDt+rUK2bEUe+0csDbaghXdOuI7F0diwfr2TDy1ce11nO707Y21Yv/ZYPO7C2PgQ46ubWy61fCrlr/LqbPb9pmZ+GKtXFL4xMh984fGUAzdmxKnvy/3/5QuPDOeSNe+xSnfx5Z+wAAlIEAGkqm+ljJhKzR86LH7hVH9NJrf3RNHNW2fM3w/sJ5soVet99ItXK422rguM0W+ReObCd7KdOstqLCo+zN/PHGOXGUz6kdtuuongGdPeEwIpD2xl9To30hbdnzgm9cFp78+Qv/sehio/60eRbnpH/97Y6Hwpt+dl045dRrwyXTF8StFO3h/j3XDQCMAgE0lMywFhzxkvFLGDXc+g3Dg6OyLoLUSm6aPset/B5F58PZ2ytLAH31vQvDiZ+9ILz+x9cMtFEp0pylQz1B83jywZ3NOt9mi0lxNPKEQ/YV3q1FRJuF+Wlbkl5rZVdrtAt8+I+3DVyuWrcxfO386QPjRl+f9p3P8lY7dqS9viv+/WfXxRFF04IDAGiFABpKZtgfyg6Ixz2hyHDrMsFReQ8s89+xVvPG4n/n4TeY5/aP2HO7OMrvzrnLwkXT5sVrzb3y+1eFOUvXhIvvmh9+fU2+RSnzWr+ht1P33vTkA+Ko1gzoOIi61YKj2fM6cRTebFrZlSv3v9nJmuVrBtv0NPp9i38Nldu85c0XI826f+HKEZ846Uvj7LnupX55aO0CAFAOAmgomeo/lPWAhsbKdmB5xg2zBi5bCbjSGdDdeq3nuRvZ+7oxx51vNcC7b8HK8NyvXhre8JNr45bWTJ2zNI7akz1xsc2UoRnJvbDjVpPjaGTgnH3uu7UIYbOnbEK3ku8GWmmxUpltOXVO44U1h2Zl1r/tWjM3x+q/tx/6w63h2E+dH979u5vilube/dubwlO+cFF49MfOC3OWtPZpgbLpl1m6/chjCwC0QgANZVP19/woTEijZEZjF3jp48vc/3r4AW/ZFph69+9uHrjsVhuF1NoNG+OouXYen6LbXaQ+/pepcdSeTR1OWP7lVcNnUL/1KQfGUW9MmtCoB3QcRN0KgpuFRfOXDy3gV0aV+3/NfYsGLutZGxdhbbTP1NrFx+q/t2l/7NQZN8wOa9bne+8448bZcRTCCZ+9II76k5C0e/rloc1zP39x1f3h7b+6IUybuzxuAQCKJoCGktEDujzecMJ+cTR6RqMH9N47bBlHnfu/Fx0RR8XIBkdlPf7do8DHMOvCafPjqLk84Uv2Md2UI4CePq+1g/RaPXdb0WmINGPhyjgatGcXn59aJk2s/zrO/p9uvOJXr9vY9DFcurr37RZaeVYrd3+7LYdmk9dy5q0PDlw2atVR68RMN99p5y5dE3582X0DnwQYTd04uVR24+837p1unABO99G0VdNdDxUXBP/l5saLzk5PflbaR/7MWx4Mr/nR1XFr69J/58p2UhwAykQADSVT/berBehGVzdnseY1GvegyCDqdU/cL5z5jifFa83tvWPjYDAbopX1WO9lLc4iz9P2oh15Zg5nf/aGBiHVtTMGZ5+u39ja/e20vUGexyed3VkvtLjgzuG9p+v9ipMnbha++srHxmvFqZ71XDUZekD2rlR6GBfpqV+8MKztcd/rXFrYjSqv/QN32XrgsplGWWut3enW2Z21eamo9QmFdGbl//319vDqH1w1qiFwpydy+tE4/JUL0+yh68ZD+7ZfXj/QqunZX7kkPLBwVdzambvnrYij2q6u+lRFu58EuereheHYT/09vOAbl+X+pAEAjDcCaCiZ6j/o5c+jqwwPf/VMza02nxhH3bXVFsX2xz3sEduFPbefEq819qLH7tlwtuyIQLWk4UKrfXy7FUrludWLRoSz9b8r7QfbzgyvTt/LbmsSDm5I9pk0sEjr6+dPj1sbGfk7vOKYvcN1H3pWePHjim9BU30yKxvGZx/viV34y+yhZWvDb6+ZGa8Vb4eqHtetaLagYLXKSyTvidlGu2mtfbw6hGrX9y+5Jzz6o+eF//79YCueiuvvXzxwmS6q+dCy1hcEbKSVsGsUs2/GoG6c0Dh36kNxFMJJX7gwjjozscEnUFJF/K39L9+/KixetX6gR/23L7onbgUAqgmgoWSqw50C/iamA2U4AfCVVx4VNp84YSDAOvWUY+PW7tq24AXa0p62p731hNwtTRqFjdkD3lYCrCJ97mWPjqPaypLz5AkIqvu9phrNgD7tulnh5lnDn58Ddh0+I/XfnrR/HA25dPqCOGrPXQ81nsF29m1zwwOLBmfLfflvdw1cNrL5pME/f37wumNCmg1vl+zz73/eYWH7NoPUisP22C4887DdR+wfE6veTLLvK9mHu1uLEHazxUaeti2dquzLeV/zDVtwxMuiffqsOwcWvPxd8jqZtbiY2ZuN/O66meGoj58X3vCTa2qeGMouINiL56kMyvBv93iQ45+XUqh+/+2FOx5svFAqQ9L3pE5bdAHQPwTQUDLVf887iBpd++y0VRyNnoN22zZc9cFnhMv/5+nh2P13ilu7qxsB2F47bBle+YR94rX6mh3QVoLDitE6AH7FMU1+lxbvWLde6+08lxsbtNe47O4F4WXfuSJeG/SFlx8VR4O233LysDDsnvmNw+MirFzbWtuKI/fcfuDyWYfvHq78wDMGXmM7bb35wLZOvOAxe4Qfvv6YcMx+w1+re+ww9AmA7AzebHDYrdZL3TxZs2zNhhG/Rx6tfEurN9/o61d0oc1JVjdaqWT99+9vGWitctG0+eHyuxfGrUM+9Idb42jQ7EwgnddNM5eExSvXxWvl162TOAzXjRnQ3ZDtpjbiPbfg6R7jsdd6O1Yk/24/56uXhKM/8bemi8sCMDYIoKFkXvfEfcP/PPfQ8N/PfVTYa4fRD0DHs3899pFxNLrSYOwROVtYFKFbh+55QoFzp84Na9Y3aMGROXAcrcO8RiHhhdPmhf/989R4bXSlwX+rmvVbzh5cH7TbNuHko/aM1wZnIJ/8zcvC8jWDM25vemDJwOVoOjYTCO+23dDrafdkvNXmxc76zz6Ek6v6amTDjyYPd2G6HYief8fwVi55tPK7/+Nxy/k9jQLxr+Vq09JfHlw6MlxeuXZ4e47PnXNnHLXmxd+6PDzuE3/7x2u67Lr1bxjDFf3eNa/g9jQVh+6xXRwNyubDRZ+v6JdgfrT99IoZYfq8FQMnMF/xvSvjVgDGMgE0lMxLHrd3eOtTDwxve+pBPQ0dGSkNjf749hPjtfGjW5PHsrOQarln/srwrz+4Kl4bqboHdBowNQqZRsspP7m25QPzbs3Yu3dB67OPG7XgqCn58gMyC8PdNntZ+OK50wbGvVjMs1v7bPvqP4Y3ZgL5XoUVP7vy/jjqjutin+NWtDIru9XdstHXpzPvuq3ytGZnDnfr2a61G10TFw2tmLW4vRnQFd+88O44KrfyvR+MTUW/dX22zRMkzRy82zZxNCj7nlv07tLqe9V41WxtBwDGHgE0QAPj8Ti2W3lYEa0F0sAqDZ3f8esbw7GfPr+tWZdl1K397EN/uC2O8mu1T2z6nNQK0G+cORi09iIMmrGw+/1286g8do1eQ9nHI/twNzup0otAv1daea9JP1mQLu53a87QooWb7qp05nC1bp00y3Mi474FK+OoPf0SGHWrjQ3DtXICKY9utcbJvjRGBNAF7y5lPDEOAGUggAZgmG4dOhWRm6XHdemCdn++eU6Yv3xt+O/Tb4n/p78dmJmh1Ymr7x3ZC7YVrc6ATp+Tqg4T/1B5unsRmH7nonviqLaig5J6Kj+lusVHVjasb7Vf6M0ffXYcteakQ3aNo/6UPsfp4n6fOTvfLMmiQqAdO1yYMqtbn3ZocTdqS60+02XUrXec9ATT3fOWCxijove5bp03yN7N7NNXdA9oLTgAoDYBNADDbLX5xDgqVhHBS3pg1+ksvjL56MmHD1xus0VxPYjndqmPZkX2vqaH2jVnHMZt3QrcKpasar44Wq/ygMrPSRdi/PIrjgpPOWTX8Ms3HTe4MZqUCeRbDbPa3Vd22abzRRYbWb+xfu/2err5tBT1nLfbHzw96bFm/fAezKlXfr87vU6FXkO69Zbzbz+9Njzzy5eE9542Nk58dqrofa7oILgi+x474n4X/GOrW4UBAEME0AANjIVD+sc9coc4yucVx+wTR8UqJoDuXrgwGh6zd2vPTRlk++emJywazXLudgCdZwbxaLyOX/r4vcNP33hsOPGgXeKWQRMyj1UvZq6mzpv6UBx1x48uuy+O8utmZtqrWe/1PLBwVc1e0zMXrQ53z2u9N3szG9o4ATBWdeM9Z+mq9eHCafMHxqffMGvgcrwr+vW7YMXaOCpW9m5m/80oem9xMggAahNAA7Tg9LeeEEf9Y58dt4qjfKZM7s4M6CIygfTAbvW6kbMK+1Wn3SkO2X1k644ij33/6dF7xFF96f5S6/eo9Itt9rzXmiWatfeOW8ZRe4r4yPwzDt0tjjqTfax6FVZkZyj/6t+Hz8weDQ91cbZ+UbMQ29133vrLG8LEOjv/4hyz9lv1y6sfiCM6fFv9h/S5rzz/G3v0Ou0nc5euCW/++XXh/affEtZt6PwF185Cpnlkn7rsfc1+gueSuwZPNLTr6vuGL/4JAAwSQAM0kA0fjt53xzjqH5MmFnU43pnszM92pM/HbXOWxWv9Yaet67c+6HSm3j8fPXK2ehFBf8XTcoautX6PyiyzZnfnZ1fOiKP25ImF9ttl6zhq3wf/6bA4qi/PrNvsY9VOAL3XDq0H8tkfs9u29ftU90reBQXbUdQM6FZ7olcr4j0vr+ldmFXdr4qYAZ2Gq8/72qXhuV+9NMxZsrpLzSH62/+cfks4d+pD4TfXzgw/vrz1T0DkkS48WrQzb30wjmq7uMMAGropfT962XeuCK/+4VUDn8wA6CcCaIAG0hYJ++48OIP4X4995MBlv8n2nM3qxSJxqSJ+TJoF/eXmOfFaf3jRY/eMo5E6DUqKDJtryS4uuN2U2v1wO/k9luQ4gKoOT9ODr2lzl8dr+Ryz705xFMIe27cXvO7c4ERCRZ4sOftYZb/nqH3qt2U59BHbDlw+vo0TYdlAttv7zmhrI9evqd0Z6gO9uut8a1H3jdqK2Lc/9Idbw53J+8y0h5YPBK1j/fXSjtnJe3HFn24a+e/y329/KLzk25eHn+c8ybhDjQU/04VHO1/3YfgLblXmU1Tp4pLVvD4ps//+/S3h+vsXDywK+9lz7ohbAfqDABqggTScPfMdTw6/+Y/jwydedETc2l+ahYMfzjGzswhFzErLHij2g/QEwKdf8uh4bbiyhxoTJwz/M+GUE/ePo+EancSouUBhlWYnSFKVEPCa+xaFEz57QXjOVy8J59w2d2BbnrCgOnx96qN2jaPWNPs9Unn2zuxjlQ04d99uSnjCfrUD5mcdvvvAZY6HbIT1G4f/nCJej2VW1FtFnh7jtaQPb71Z2O229chr4Yq14R2/vjFeG3/yvFabuahqFuyl0xeE7AJ53X4O+02tx+NNP7su3PjAkvCRP00Ni1c2bztT72Rkpy1rsnctnd1e7bfXzYyjQa1+euL6+7XcoHcuu3tBHHV/bQeAogmgAZpIZ7Idf8DOYVJ2OmifaHYw/ron7heefPDgQmlnvK17Pa6LyLt6dchfCfqKkD7+9dqgVPokt6vWc7vjVs1n6uaV7WG7Y40ZaqlGrQaaPe152hSkIeDKtRvCK753ZdwSwlt+cf3AZa2wIBuGDL/a/OfVkif03XWb5o99NoCuFXD+4k3HhV1q3FblO9v7DYbL3kblkx7VKjOuq6WLThalUXuazhXzbpEngE6/5nfXDg+x0pNlOb41t7SH97t/e1N41Q+uGpgR+r9/ui3+n+EunDYvHP3Jv4c/99knRYpUxL812ZvIvs8U+dyOB/OWt7/AYKdZf/bbT71i+IzsdDZptVZ/3su+M/TvUoUTFAAwkgAaYIxrlpungdjP/+24MOOz/xQe/8ju9bguYsZlu7MRW/HOZxwc3v+8Q+O1zqW/db3ffXWOBfgaqRWKXnDnvDjqXHbfqXcyI084W0+9hdqqpU/7ty+6O14brtZxfnZb9dV2d8M8+++Wm9duUVItezu1+spvMWliOPe/Tkpel8fGLVH83svuXjhwWbFlGwuHZu/HL5L3gIoXPGaPcPv/PWfgtZB180efHQ7YdeswuYDe8vvVCL1Trzm+83ZHRb1V5Lmdc6fODf99+i3x2qD0++qFUO3ctZ9feX8448bZ4Yp7FoanffGi8LPkei2n/OTaOCreSx+3VxyVw9Q5SweC/xVrN8Qtg4r4tyZ7G9mnshf/Fo0lrc4qLtJoZMGj8TP7jceocx5CoN8IoAHGmKdlWgxkPzo8WooIBX59zQNx1B3PPeIR4V3POiTsVOAs4svvWRBmLx7qlVmt0wOwWo9odnZXJ0aGMA+Hx9boUdwoRN7Y5JfMMwM6bVPxrQvvideGq3Xz6Wy7//n9LeHz59w5GBRVfVG7e2GjNiMV9XpkV8uG+gfsuk0cDbfzNluEJx+caRcSf48FK4bPJnzXs0YGxc1kn7J0YcO7P/W8MPXjzwnffNXjw1abTwo71pihPDn5Bf7+rqeE6z70rLilvmVrGvf3rpfh/c9zDw2ffPGRbS/6mu6nzWYg5p2huGHTpjiqr9Zs5HSfzfcT8inyxFLb2n3xdMGSVevCS799xUDw/4XkdV5tUY52D01lftdsq5zs9fGu2cPRycOVbZnRqlZfiXnfGxqxf9ALReyrAL0kgAYYY9LgqlqzALBXOpklW/HXWxqvXt+pyoHqxAJmd1bcNntZ+MsttT8OX92P+D3POiSO8iui12kjI/sVh3DSIUP3+c1POWDgstHJhXYOkLIfiW4UKNU60P/wH28b6Ov57YvuCb9LLqu/ot2HLM/3PfOw5q1bOjkRU++R3HOHLeMov5XrMrNGk+c6bTO0dbp4XvSYvbePo+HSr92+TjuWirf/6oZw1MfPC1/7+/S4ZaR6+8a2UyaH1xy/b9sB9MA5hziuJzuDtV4v8jXrNw1bbK2WBStG7p8DAXSdO9HGSyLMWdr4PvREG/e7W9IWI2s3DJ4c+Gmd2eCdyO4N2V9dwDhcs5C3k4frfb+/OY7a0+rPLuKZtXc01+U/X8YF+xnQbwTQAGNMNkgpy8J93Q5Li1A5UJ2cWXyvWjozs1V1sq2BoK3i3086YGDm58dOPjxuaa7bD2k627XaQOhSdTS/1eTBsLLRLOZmu98ZN8yKoyHpYoN51br5v98xtDDPb66dOSyAaPcTAc2C46P23j7XbO5OXgetBimdSmdBtyMNbM+85cGB+/uVv98Vt45086zGPdDbfajS/bTZfpf9/3vtWD/Ef99pQwHY6nUbwxfOvXMgAE3fWy+sMzM5XfTxTzfNjteGyzOrOuve+SvjaPT0ePera92GTWHt+tYfw1Zk972Lpg0tSpgqyT+rpdHsvamTzwOsSl5znaj1k9Ne6fUUMYM+u78wUq//PQNg9AmgAcaY7IJ3ZelVmSObG3WV0KHeooGpPXeYEkf51QsvqzdPmTwxvPWpB4Y3nLh/3NJct0P99H6/6UlD9yfdl6p3p8pz2ui5bbb/3dNhsNbsBEt616pn2rb7kDULoE/J+bx1Mrm+3qzLsrTZqUhD2iK0O1s83eeazbzPPpb3L1wVRyOlfZdT6UKYh/3vOQPtYN7x6xvDX299MJxyav2ey5888444Gu6sW+fGUX8pw6zfxSvXhRM+e0H41Fm1H9uiZPe991adhEiV5d/Vspg+b0Uc1Taau87SVSMD5Ua90ud3sGBixTm3NX+NXzZ9QXj6ly4KH/zDrXHL6LNf95d2/40EGC0CaIAx5tXH7RtHIbzosXuGlx+9d7yWtgjYLY56rx/+UH7DCYMhYr2P46fa+T3qL97X2WPS7Uc0vXvV7UjSdi7VIVRlxm+t/siVTVtt3voCeXndv7B5eJ3+DtWH1CPvaT6NQvbU5pPy/UmVp5d0PfWigXba7LQTWqcnSPLocLf+h3YfqmtnLGo6Y7idQOy7Fw/vQ56G0O2Yv7yznrbddN+C+o9bGbKpz5x9x4ge6Fnttm6p1mzXyy58SGOjGUB/5E9T4yifIu7r6TfMCrfNbvwJj9f86OqB96lfXf1AuPzuBXHr6Dn71gfDgR88K+z3/jMLO4nYyC2zlsQR7Wr0typAGQmgAcaYw/bYLnzn1Y8P73zGweGjJx8Rjjtg5/CJFx0R3nDCfuHTL3l0/Kre64cA+okH7jxw2WhmcTuzjrMLz1V0euzQ7Yc0vf3qBQbTg+XqEKryv2o9JpWv26GNBR3z/l5pf+FmszLTm6r+knZnjTf7vrzPZXWP5VbV+1W72Wbna//y2IHL9Nd/37MfNTCueMnj9oqjEA7erfZiip1o9z3jtT+6pmnf5nZC+3nLOp8Zmao+KVg2a9bXD57KMAN6Rp2Z6hs2DrXk6OQ1lteJn72g4WPFcJ204Oi1ovbzF3zjsrB2Q759ZNrc5XE0OtJ/Q976yxvitRBe/K3L46h7avXOpzX98Hc1QDUBNMAY9LxH7xHe9axDwk5bD4Z/r33ifuFjLzwi7LZd6+0jijJW/k5u59d47D47xNFwnbZOqHfwcdW9gy0DOpXev9VVIcvvr58VhrWziPe/OqQeqXvBw7I1G3LNVutN9JHvuUwX+mtXvRBnQxsBdN7X44seu1eY8dl/Cvd95p9G9LiunLBJHVW1j+e86abaPVmQRzshU1HB1JZt9tbuhckNesTUamsyb9masL4q/O22evduVdX7VBGTAvMEO6cl74fjxeF7bBdH7eniObLCFblwc6V9T5mlr+GnfemieG3QtIe6H4j300mJsjIBGug3AmgAeqKLWVJPtTPj5IVHDc0UrbZZh/8Kp/fk8y97zOCVKq/78TVx1Jn04Ob2OcvitUHVh4yVg58OMtWOpIFYnkPYInpAN9OT/bvOL7vn9qNzYqn6tVAdzmaD43TRuKd84cJw0AfPCg8ubTwzuVo3H9KFLc6+S3sAFxU4dmPG+h4F7QPZhUerZddOPD15PI7/zPnhqV+4qGezgfO8zoqYFbg8R4uNZavXx9HYd2CHn3Aow+z5vDZsLO6+zlqc//1utHzkT7c17IHfLX20S5RWN0/SAnSDABqAnigiFOilDz7/0DgarhJ5bpGz52+q3td2+pik3/6KJ+wTrw1JA79Upw95enBz9X2L4rVB1eFZ5f43Oghq5yAz791OQ410YbhGsvetW/th3lud0sJ+k1Xvodx12y3iKL/tt5wcR+2rnn1V/TxnH4u3/uL6gYAjnan9xM9cELc21833jP85/ZY4yied/V+UZgt9/fbaB8IbfnJNuCbz2mvkmYftHkedWd8gfMuGiO857eaBma1pu5OfXD4jbu2uPJ8a6XRW4PI1+YLlfXbaKo7Gvk57zTZbFDTV6fNWlCJn9Hfyft8r19+/OI5666RDdo2jQavW6aveqi7+EwnQFQJoAHqiF38n/+B1x4TPvLSYPtf//uQD4mi4ynH0V1452Bs3j3pBWqePSbMwZv+dt46jEJ588C5xlF+tu12dnVX+f+MWHK1blXMBpPS+fPG8afFabek9GzY7N14WLe/igk8/dLew945bDozffFLtfayeeiFOOw//7ttNCaecuF/YZotJ4WMnHx63tqZ6v240w/H8O+fFUWu6GUhVh7t5wrEiNXqs5i1fE/7n9FvDRdPmh1d878q4tbm8+0Cz8PvbF90dRyM1+s5eLSiW7/fsbMeZmvnURz293m9GUyeLp6byPFTdPOHUii0LXDh3yuR8t3XP/BVxNH5kT4Ke9PkLhdAtKstrBiAvATQAPdHpAWwezzp89/Cvxz4yXutMvVm9lePo5x7xiPCTNzwhXqvvSQftUjc06fQxaXbsUd3Lsp2fVetbqsOzysHPhAZ/TbQT0XzzwvohWLX0vqRBXSPpXawOP5o9Zq3457iYXDoD+ckHD5/NVU/aA/rc/zop/OFtJ4T3P6/2LPt66meH7f1S6SKlN3/02eENJ+4ft7Sm+rGsvm/tPOe1ZHtOF+3WWUsHLvOEY0VqFEA/0OZH4fM+Uu/67U1xVNtND9QPkhsFrmffNjeOuivP67fT3aa7e11/atQbPI8HFjXfr4t8b+5Ek3M0LckbQP/y6gfiaDSMzgP/hxtnx9GgdFHCH156X7xGHmV5zQDkJYAGoCfGSq+6SgiThmNPO3S3gXEjn3jxkXUPEjoPoBt/f3XQ1d5HqEd+T/px+4rKTRY9C6fZLM2KvF9X/VVF7ofpc/udVz8+/OU/nxQ2b+Gj1ltvMSk87pE7tnxfGv2+zzvyEXHUmk72wXozoBsFrNW2m9J4Mb6Cd6sRFqxYO3CZ794WZ9HK+i0e2l2kMu++9Oeb58RRHQ1upshgrl31PvWxsap1SKfvR3kfy5y7eV+asWBl+OK5Q58uafV94rbZgyd3KtJ2Lc00av/STQfuOvRJodSGAltwtPLvwmjp9vtsKxbG92TyMQMa6DcCaABoQauHyOnMsXoHCZ22rmj23dWLhk1qNE25jlqZw99ufyiOkv8fv6BRONHNkCZPAJ3Oqqq+D5094sOls9ue9+g9wiN6tAjg2bc9GEfDpbvRp15STOuZVlTvvtWzY/M+57W+rDqwKfLgOhsyVet1K4UvNWgbk31PWJazH3ErGgVsjR7xvCcWuqneLnFrVeBZ4G7TUL4lUPvTKadem+x7Q+0Q0uD/356U/5MSnz37zjgalGfX2XnrzeOot17wmD3jaFCjf1fS186l0+eHRSvzLWI6uYMTfL1SpntY/aktmpu3bE0cAfQHATQAtKLF46N0Nl29IK3TFgPNgpbqwGhiGx+hbpbvVmYK1vr9jj9gpzjqnnU5Zqrdt2Dl8KCos4d8VC2uM3M2/ZUmdfgR+XZUP+/VJztyB7o1vuyy/35aHKW3HwcdOv2tJ4Tz3/PUeG1IZb9IF0fspYUNwqvseaKLm7SYqUgf87yP+4oGC3c2mv1bhhnQ9VQHV52euMj77Xl3836Uvm9mfeQFh4ej990xXmtsbhvBWKPey2vW51sXoB3Z5/vOucvjaKRPnnlHeO2PrgnP/eol/1jst5H00y5Zi5PX/59uGt5+YjR1+HIpVIGTz8eFlTnXywAoCwE0AGPOq44rpg90La3OekuP7VoN0l5ddf/TvtaffPGR8dpwjYKWn1x+37CZXO204FiyqvEsr8pN1roflXCmm7NLb2zQr7Za9V1otnBjma2vTnmrpKFhey1WOlP9I6tfF7Oq2rQ0UmvP2G27odnknQaJFfVupvJwlikMyv7OV9yzMI4aS1/qeV9qP7l8RhyN1OgR7/VM8VrqBeTVLTgK2m2aKsHD0XO1AtWKtRuGwrB2noJ0vYR6vnfxvXFUvEbPY7rPXzdjUZg6Z3CG/alXDL525i1fO+zTQPXUOjH4bz+9NrzzN417sfdSmf5NLMN7DADdI4AGYMz51IuPDPvvUv8j9504au8d4iifNAxpNKuwlv89+fDwP889NHzqJUeGH7zumPDSx+8V/89wjW7243+5PayumjXWTguOtCfnoY/YNl4bqRKW1WrB0cpx5O1zlsVR9/UqnOqGRo/pVptPCk99VL6FEN/+tAPjqDPV+3X17NgP/+G2OGqsWUuHVl839TS7lfnLe9t3dLdtt4ijkbIB9K+vybc4WfpY5m2R8Z2L74mjkRo95GVowVHvPEv1LPZO95u83z36j0bvNXpsnvS5C//RMqadp2BxgxOedzzY/r8RR+3T+N/sRs/juVMfCi//7pXhn75+2T8WLa1Yt7H57NPsSyY9KXxDzhOnvVLQ22zLarVFytNWiyGP2r3+32cAZSSABqBntujRgjxpAHH4HtvFa8V57fH7hp23GR4effifDouj2tJAqdXJqVtMmhje+tQDw6uP23fgehoutmN5VQ/PdmbIbti0KTy3weJ2lZusddOVGbF5DicfWj70ce2VDdoDtKt6VtUoHWt3VeV3+tHrnxBHje2S2YfbVR2WVj/G1QtV1vKXm+eEy6YvaHqSoqjnql6LjcrWXueq++2ydd2WAm28TAekv2LeX6NR64BGsyHrTMDvqXr3rjoczz6G1TNz88gbyI3H2ZqN9s/0RM43zp8+MG5nVm0a9tbT6iePqu2/81ZxVEeD5/Etv7g+jkJ4529ujKNBeV4P2ZM2ZQxYW3+mirHH9lvG0RD5c2s6XcgaoNcE0AD0zFde+dg4Kt62mY8Gd9pfuZanH7pbHA1505MPiKPa0nuRndXYjq1r9MesHHwctff2A5eNtNMDOr3fb3lK/dmylZCh1mPdSjZT+fj8VfcuDMd+6u8D4yJV35cCnorSqfxOvT4Yrf5xrQQH/+/XN4bX/OjqYTP0U89/9PCTHUX9OlfWaWNRCRB7HXpcc9+icOhHzonXhmt39m76u7Tymqun0Y9vNEN1mwatGYpU7/GpPsmQfb9NT3a0Jt9z0OPdphSa/Vv24NLBk4lt7sZ13Ta7/RnQzZ6nvM/jynXDT47m+b7se8uDS/O1J+qloj5p0or0U0+X3T3ydZme9Ca/2zv4ZADAaBBAA9AzR+7ZPCht1wkH7RxHg0ajJ25Nyd0oIhisdRuVMOBr//K4gctG9t5x5GyjZtIfOWVy/YWhKsetE2scwFZmfuUJxSpf+y/fv6ori+pU34V+7gFdz2j9TtVhVKftGV5z/CPD/71oeK/zok4iNbuV6gXseumGBxbHUbWR9+W22cM/+l/L8rUbku/s/Pdo9FCki7OlJ4lq6VkAHS+z9ql6f8t+Td4+2i2reqw2jPHV0yoni5pllWvWd+dxaPapikaavbzzvvyzYXL6ntdsFnz2/7/3tJvjaLhmbUK6qdlz2g2v+N6VcTTcWbc+GEcAjEUCaAB6poiApJ5sj+P1mUCgiIAke5t5pOFgEQd4tQPowcv0I/3NvOrYdhZmbHzHKwFkrVlxlTXBKos3NdK9vWJQdQYwGgfbRXvdEwdbs1RU/05//s8Tw0mHNO4FvXT1YJ/WTlX/3E5nEX/4nw4f0RqkqJl5kybW/nO3EuyOViuFecuGWs9U1LorF981P47qO/OWB2t+bz2LV9aezVxvocuKV/3gqjgarhutc2qpt0tU7yvZ/abR4nadqPx79uW/3RWO/Ni54UvnTRu4PhZV/u1r9ppcsbaY95YidXpyrCL7PpHnUwfZ98VrZ9Q66RTCjltNjqPeK+httiUr6rxfpOtOADB2CaAB6Jmdtt48jor36uOGB6x/vWX4TJpbPvrsOGrfGTfMjqP80pC4iCBtYo1FBFu53c0nTRgRXHaqcpdqrW+4KR55//76WQOXjXQ7AKw+8TEKx9qF2TUuXvecI+r35X7M3juEn73x2Hittq/+fbBPa6eqTzx0+hzW2pULmgAdnnjg8E9HVJwZZ9t1efer6zfXzoyjIZ866444al0rv8eaOn2Rd9qq8Xt0vRMNRYV8zdXeKe5bsCKORu433WpNU/mVv37+9IGZv9+44O6uv5cV7ZN/vT086XMXhLObzDyt/FrNHsmDdyvfomjNnpG8J8azvdPT10LT2+6D/WEsfioIgHISQAPQM9tOmRy++M9HxWvF2r/GiurVivg4//I2ZnelIXGtH/32p9XvrVxLrZYitWYe15N+bStfn3rywY1nDlZur1bAU5kxl+f4u9vH6MNuv8XHoEz233lwH+9WoNaq6v2p0wCyVgjS6v5azx7bT4mj4Sr3uJufzGjkomnDZzanbRyy21rRyu9R7+lqtOhoI53OgM+r3i7xrt8OtTbI7jfdumufPuuO8O2L7o7XBnX/vezhMHPRqoHLTk1/aHn44WX3hVmLV4e3/vKGuLW2uXG2flGvyXakv/MPL703fCZ53JfEfuTL16wP7/7tTeG/fnNj/U92NHmo8u67y6oW9U194Ixbw+zksWuk0YKfZTGKTyktqrd4LUC/EEAD0FMvP3rvOCpWngPjRgvq5ZFtEZBHeq9qhWuT67QFqKdRC4480u9v9UBz6yZtSyozsGs99gtWrI2j5roZXr35pAOG5Q8tPgSlUgl5s/tCred1l22692mDiuq7UencMDcuQtaqWr9DK/t3I/XeGyqz9LPte0ZLp72ol63O3waj3gmDdj+t0asZ0HnuXadP58acb0hpIPn5c4a33ej2o/Bfv70pPPnzF4b31Okl3Io0eM4rXTgz1WghylRlP+jG7nDu1IfCJ8+8I3zvknsHwv/Uq35wdTjjxtnhjzfNCZ89+46BkPqe+SuG9eRudmKmk323Xk/nih9fPiOOyqugt1m67K6Hlif7033xGkB/EkADMCZkc5M3nLBfHA3ZfsvO+iy+vsZtNpPer1pBWqszyWoH0PlvI/3aoj9qW7lLtQPowaBit+2ah/Zpn+jvXXxPvFasdPHF6tmCrT7uZVIJSrK7Qq3QcIcmrRQKUfVjK/ftQ3+4deCyVbWel3bD0Kx6M8YrfUgnT/z/7d0HnBxl+cDxF3KXu+Ry6b333nuhJAQCAaRI70WKgA0ERUFFEUQsCCIoFrAiRQH5gyC9d+kllBBaCJDeK/7n3X2Xm333nZl32rb7ffm87LuTvd3Z2ZnZnWeeed5kXqfUpv/oHtULVldjHlw0amZt9BBeOF61Y9309Sbse4qzPkRdfjZkYPyW5xZn+lHKQem8Ni+/APwTKhDtJfeXSV9VMKJH27zg2/VPZ0s7vegaoPPaJ98TP/r3a2Luzx4QB/76sc8+i6CPJHciKoonF/kvj7tf/Uj1kqu9n7Sk9rNIz6at28SBVz5acMILACoNAWgAQFXQA1itWhYGWPyOs768y2DV8xZlIMNM2NfwwmEP+UxBtDDHjfLPkz7OzC1zrwCfdMiUPqrn7Yr738oEDtLiDkAkvQyKKfc2bILoLYrwRt3zkZu3h95YqnrhmOY2qXfgvXpm/8FrYLBi8wqULVq6TvWS4xVklRmmUaQZeHV79K1lquct7npj+u6wleZSSHoZewUe12qlJqJIenUY36e91ed61YMLM7fPvbfys+B0UIbzbx8qTlbpj+/w/o5z70tlmYV//vd98cL7K9WUdMXdXpIkP2cUevbdlQUlYKTBXduoHgBUBgLQAICqoAflwh5UnbDDQNXz5hdo9bKd801rOs73OPb3ZHppm0CklA0+J53/LMRWlTnmt1je/iT54FlY7my8pJdBMeUy9fT10PSe4lxWbisvAB3z9Uyrsu36HcSr/ntu8gOvR6+7nCSvRXiDxUCeYZleK1e3PYot25ytrAjrnA19vTnvXy9bz9vqjVvEfa/FqMOd4iLQnzr2NqduC8TY7NJcB8LuDjZsztbL9Zqlh974xLrcShL+9sS7qlfIvYv61X1vijOuf158/opHI5c0CuPDIryGreJ9GpXF67uwVW30k2UAUAoEoAEAVUGPMZl+r/sdv7awuOzaNBBgEPkXpoOHsLEeU/DbNkCXO8Yem3B20SMq29VvPn521+uqVzruAITlIitr+vI2vadiBFbcq2Tu5TZHDGKasjGTKs3slQ1+6ux4NeGTlnTZAj/6CQoZOHw4YvZ6zmMLg7OTi0H/uBctWy/+9Xy2dIUfuQx2+ekDvpmqQWQAOy2rtRIOXoFVW177bY/JVp5WVxMkvSbL794PVtrXrHa797WPVS/fUb9/Ulx6zxvqXmndt+CTzwaY++W92YEt5QneK7VBLtOwwTCw3dQBHTPfIXHKk0RR7NerFF7bZDHGegCAJBGABgBUBZv8Xr8Da5vYcqQMaOdFTX/1VEDtSJ0pWBB2dj43tofYd3xPdS++3HvwWi6bt0bPqEyKPJx1H9J6XXZeCXLvoyAAbVjD/Aa0O2p6P9WLx70s08i49juxEYbX83Rv10r1yoMp9tI6RjkIP/pLPfLmMnHcNU+pe8FMma4/ubN09Ul7tW/6LE2r4j2vmoOQbnJQvjCDp5r84NZXVC95P9dO5sXd5tLYFb7x8drMbdKZ0H978l3x3vJwAejcHOSu1DG5rEwC0DLY+7W/P6fuNdlSooDs4pUbxE4X3yd2/ul9kQP/UciyKeXwu6FSlGbtSNeajVvEg69/wnoAVCkC0ACAqqAfjIctOGF6/FfmDlG9rBqPlMw+Hb0DWfJZkwik1RgytMMGU+XjLz10gpg3spuaEs9CVZvW6/0VM6PTT8KxkJKzOREysW8H1Sv0jT2GqV487tmQcZKbn40/MJpbUicLvDOpy2vFMAXt9h3fS/WSpe8vT/nrM6pnx7RNyTqlpRIUJLMJZiSxutlkWkf17vL1qpcVd+1NaPMqiqhXdBSrjrIU5QoptzteXqJ6Td7TPvNikSdj5DYlg/7fuPF5NbU4/vbEO6qHHK81q0TnJ1IjvwP3v+JRcfQfniz6egegOAhAAwCqQsua4K80v0Cw6Z+6ta1TvSyvQNYF+41RvUKZ5413XJphKiOwfN1m1QvHZlmF4bVcijEQno28GtAJzdKR0/uqXvHkgn56nMP0ns7da4QY2KVB3cvXWF+revG4tyd54Pi16woz+OKIGc/5TG49/P0xkzO3OeV28G6an2uf9K4bG4ce0Fu7KdzAc2W26ALZ1LeOcoVLKZlOAoThtX+O+7xSOawfL76/Suxz+SPqXvpM9Xgn9/M+EWjj1Q9Xq156vL4ncp5YGO5qrSC5UiNeyqkmdbnw+t2S9JUGpfbqh2vEm+oqipufS+9kHoDSIQANAKgKDXU1qpfl9YM9DP23fV2N+XL4HYd0Vr1CMkhnimuEnT/TQGryMlkb7VrlBxy93kdUXs+3qVwuoXR9jmEz47306+h/0J6GXCBdXxdM76hTmzpxzxk7iwv39z45Epc7AF3OJThygcW5I7qJod3aZPrSXx5/p2wuwc8oYizhWm1AtLAfXzkHPkxXXtiUMkhqfSuWuNucV8A9jc92av+Oqlc8F9z+qur50wPH3dvWq144ptVn91HdM7e5ARHDkoN7pm1hwEDBSe/bg2qsp/FdUvm8tlXVqRJ89kD1IwANAKhKSYQS9ANxr3qsQaUCkghsmLLVbEtc6H+adAa0VyDjufdKd0m+m3spJfBRZJSyvEjB+uTxnuR6aSrdkhT3bLz0QfKZeh6rVWju7XNIt0bVE+LRt5YJva5usb28eJXqFffg+zI10FlUpVv7o3n2nRXijOue880oL/cAdNKrh+mkppTI62jPEbS/lN+1XRrzrzgqFn0Qvt4dotWGN/0OkO9bDqy39y8fUlPCKYeAXNJXilz9yCLVgy2vXRMBWwCVhgA0AKDZCFtTVv9pX9si2tdmEnENU7DANptXf1Tb+vxs8ahmD+uSufUKFP7wNrsMtDTJ4zP3iYQ4H8WuI7qqnhB7jU1uMEdbubcRprRJmkG19AN2yT9/uQUZj/lD08B/lRRKSCPuIes03/HSEvHOMv+MzCjWbNoq/vnsB+Jb/3xRLFiyRk1Nh+2VKWHpwaakg0+5/aTpWfcck83ktaVvZn5BzHNuelEM+Nbt4pM18QaATIrfAK5+TLsW+b6ffW+FeCsgy9hLGttZqfVo559hXo3vOS6vby0C0AAqDQFoAEBZkgcpt31lh8D6hF7CBpuNB48Jpf6Ygl5h5y9OPWX9tUb3aqd68fTr2Dpz6xXUe39FaQZQ0rmP0WIsRvGjz48VZ+w2VPzp+KmiV/toWXJx5N6HXnPb70REUlnEJnGWpY005j3N5RHF0rVNQbdKCiakcQXAz+5aIL74l2fEnpc+JNZs3KKmhhe0GB98/RPVy5fUe/pwVXEC0He98pHqRaMvp9zX3UsfNGXl53RtDFeWYreR+QFrr0EE5Wv9VSsHU2pRv/dXri9cZ+VntnlrtOeTwtZmrwRBNZ4T+tlVVbzKpFTQV4aVtH9TACg9AtAAgLL0txOni1E924kTdhiopoRj+iEb9rdtEr/to2ZN60xlLmx/rOt/airBUedTlkMGXE1yB4peAeg1G8vj4Nn9OcapAS0vEf/K3CFip6HZzO9S0Ze333qQZsZvms8tpfH8ac9zHJUUTEhjXn/zwMLM7brN21IbfFHyXAUSek8W4x1G8u6y/BN6i1fGHawt/w3nAtxH/+HJzK1b2LrQ+neM19+/t7w8TlK6JRkArYRtuqbczsqhwNdveF718j3x9nLx+MJl6l7lS2qMDgDliwA0AKAsDeiczXxuqDPXXQ7KQD1wUm/VE2KfcdlyCX6xJ9MP3yQOHmXg2BT0Cvsz2xyAtn2W/MfVGuoC+z2V1yCLfTpmP4Mox69Hz+ineulzf47Wi6wM5d6Gvi74vaU032/acQs90zsJtsujfev8gTuLIWyQr5S2pBVlVbZWcBqkV7avyfrN9ifpFmuZo3EytuW6dt9r+Zngfhn4YT+O3z6YPZmQ4/X35bg/DvP5BZHZ1MV6j4+9tUz89Yl3Qq1T0q4juqleeUjj6opqduhVj6seAJQ/AtAAgLI2e1hT3V23tq38A0S9O7QWfz1hmvjmHsPF9/cZpaaGE+Yw6LCpfVWvkClQF/ag1BSAtg0A6q8VNivbK9BdoyKEUbJKi5WJKgMt1XJAW18bfnmHLfUSRprPLaXx/LbL7pgZ/VUvGWN7B5e9qaS19NbnP1S9dMSJxUf906SW/9ZP7YLzVz34lhhz3n/El/72XzUlnDglona8+D5x+X35A1H6LfMw5WGefXdFwcB+Xn+f8nmMSMK81yDyIyrGd92ipevEYb99XJxz00visnvCDTDaubGl6pWHBBc/Ksyjby1VPQDVigA0AKDoLjtsguoFizNg3qzBncUpsweJDg3BB1imY8QwGYnzRnlnESURSDMdxO5sWQpC/8uRPdqqXtaX5gxWvXByS8c0QGKQYl72e82jTaPub9lWWUe3lx46XvWE+PEBYzO3+qLzW7/SXMxpf4RJBG7O2n2Y6mXZzPOxM/uLE3eKVvrHS+6KDj8bNucH7cpZ2CzLSpBU4GvVBrv61Rfe/lom2/b/XvhQvPlx+IERo9ZOlmUv3l9RWKfaL/M3TKz7kTcLg0hez331I2+rXvlwB6CHdG2jetHIKwXi7CcPn+Z9Ytvtivubgs6/fuAt1bNTjAA5YKMcBq4GkC4C0ACAottxsLmkg4lXcC3KIdOw7o2qZ2dQiINPv/kxHYCaBnryY0pa7tRQp3r+9EXYqU2d+PWRkzKlNb41f7g4fbehzvxHWaJNLj/c/qSCZMroTos7sPTnx5qC0ZVAlo+5/uQZ4j+n7ySGdsuuv2FKcKQZXEg7cBF3FZFXPnxhhwHqXpbNPJ/n/F29T030KM7Za4Tqefvdw/llC8rVDU+/J557b6W6l440y5F4fackdaVE+1bhM0pNA9gFkYO5RVlOv3nQHKD0y/zNvc4hk/tkbv2Ylq/XUz/9zgrVi6+hpblcV1hvuQZ8i/s99fen3vM9QajTP8/ubcMN/lgN0tz2AQClRQAaAFB0UTJmdVHqw84c1DmTUTSwc4O45rgpamqWaY5mD+0i9p/QS/RsVy+u1h6v8wtsmQ5Al67drHp2TAfC21kuA1NweY/R3cWfvzBNnLzzoMgH2e4Dxb3H9hSLLtpL3bMQ7SVjW74+3HIvNbnuTB3Q8bPgs6SvT37xjQQ2NU/pB6DjPf8xM/uL+tr8oJRtMCjp99a1MTiQ9JfH0xt4L0ln3fhCJms3TaYYlG1gKuhhpueR02wzl4O0iXHVTlifrNmkevb+/eIS1cvnl+WcC05PcfZFQUybTpJlLbwk8btCSrIG9NK14T4ffTHZLrc4J5CL8NHkaVPnv30UeXYAAEVEABoAUHTFzH7VXbj/GHHvmbOtylfIYNUlh4wXj5y9i5jjUYs6J+F4VQFTQMw95Tt7j1S9QjbzFvSYL+48SPWayDrbYe09tof456kzxY1Pv6+mhPML5/MIQz+YtSzPWtbCbD+2Adco0l7n03h620WXVDCrXAR9VqXcJ9tKKlCmBxg3bd0mBnzrdrHHLx5SU+KxCZTr9ZsTemtWlq0zn4ST8+0177nZtSmdZAqGbkshyvn20qZM5YxiLsQQbNaHHD3gbBsLT3tfXEwprCoAgDJBABoAUHSmY9gJfdurnp24JSPCBOZsHht3foIYM6Bd83XcTO9B0zZqA0KZBM39SYaauLv71L32cvnhE8XEvh08gyBBGutrROc2MQZNSvdjKooW2vrot+6lmaWcdpA2jeB50PJondBl/OXmhe/NUz2zJLM+o9CDdGsNNaaD5tB2UL6t2uNO+OPTqpcMm9n4x3/zT8DFGVAwKXIWvGZD7rMleeVMENMmlkZQ8cNV+XWs12xKpi55y5CD9AYJc3KnYDEVIRpbboP0VsugwQCAQgSgAQBFZwoCyXqtst5hbYvtxG+OmqSmeks6NhX3kCdsSRBZezkMYwBa3UoyGPirwyeqe/lWRKgvqtNfvlVti1QChEHkuhO2fEm1KVjsPh9DmjHiNJ9bSuP5g1bZ4SHrxOe0b12reuWpsb685++2F/NLemw0DMgYlEnalGUb8DgtymoaNC+e4G8TWcbE7ZCrHi/5wI5yuXgt40OmZGs/10WsjZ5GCY6rH0mnnn8rdRJq3aat4rUl4QeH1AWVnHCTNaPdinFeoggx7jxrA04UFOM9AwBKgwA0AKDoTMFUeZD20DfniCe+vavYfZRFlpW6jWO/8T0zt3uN6SFqY2Y9TenfUXRrazcooJQ7oLelZ71K+qS9xvaIHLQLCibr2a5ycLxSCAogBon552VB3378lkmqGdApPrcUNsP6xB0HiIMn9xZ9O7bODLJpEjTPUU+qmK4QmDago/jDsZPFmxfMV1PM/vtucgOxldLQbvaDtupeeD9/UFZTECooLmWbxa1nQCcd74oaQLv83jdVL543P14jvnDNU+Kndy4IDNq7ycd6PTq3z7HZPuQglTqvAPSxPlfuBHn1w9Wql6yt27J1mn51XzKfR5jV4Ts3v6R6WcWonZ3+KzSxuRqr2AFxVL/VG7eIS+9+Q1z75Luh9okAkkcAGgBQdKYgkDywlUHgjg2W5RUiBorcZH3n+8+cLS4/fIKaEp2c9xu/OFPdCxa2ZIc5A7pw2kk7FdZqToIeAO/WrjSj88cNeiaw2pSc6WSElzTfb1JPffSMfqqXL2T8ORO4uPjAceLBb8zxLBUQtDx6RFyv62sKS3e0rNle7DK8m6gJOLl1wJWPql5lG92rneqFp38splBoUNxg01a7Au/btELwSccjopbTeOuTtapn1q5VYRa76aVkSZF7XvtYXH7fm+L+BZ+oqcHkcyWxLN76RKvN7PCqvR+nnFJacaTcMr3i/reynZjizGfUkxlhpLUcTRavzC+bYlbEGUJZSypY/PP/vC4uuft18a1/vhhqnwggeQSgAQBFZwoshQ1mrdkYv6yEDHr379yQuU1Cn46trQY3jMKUDWqa7aiJ3J8b10P1sn6w7yjVy9IDv7ns8WJ782PvIM3PDhqnek3045e0a3UXQ5jVVV+3z9c+1zgS2248BrNM6vndgk5gnB2yNE6OaZ9mm70Y5xh7Ysja+W5Jl56I8z5+8+BC1csyPVdQbdg/PZotyRA0H1u2xZhRC1GDhne+/JGYd8kD4rYX8suR5KzaUPidZxrcb9Gy9aonxAOv2wdbPli5IXAZR+W1Lfz2obdVL7wUdg8ZSS+DOM9XnGzN4NdIaj5sTiBXw0DBSEZSq/816rtBujKhE0sAoiEADQAoOlNgKezB5CdrNqleebHO2gz5fm1KcEhhsmPdvrH78EzwXJYRufTQ8eLIaflZqXqN65qwRa8T8tSi5apXyJQlXo307cfvIG29Vm/zyOnmbOMoklrcXqts2Gx3m2PVoHnu3Ma+jI6b6QTRwM7RS1LYmmdRrsjLEb97Qpz9j/xaxHEkOZDh6o2GQQgDnv7fLy1RPX+bLMoAxBEnWPf6R2vFaX/7r7oXLCjbOkwJB5mJb/Pwz0/opXr2TPPxzrJ1xqC6rY1b0olUxlmNrz52iuo1ibE6ZEpW2CyjzZbZ/yY285fUpn3yn59RPW9pnQRB5UmjBA3rF1BaBKABAGUhbGZqCr9LE/GFHZpqwR7qU+c5bJzYtgRH1NIYHRpaij8ePzVTg3vf8b0KAmpRA9tuZ84bqnrRxQ2gnrDjANWrHn4Bryfezg/YJ5lVHLccSpCkAtxuQfMc9S2Znvcoj9IiSaqxWEh+J2b0Qc/ieGlxfh3nHBkkvfD2V8Upf3lGvL+iKTvXz63PL1a9JkH7/A9X2Vzeb1+qI6qgQdaSFBT0D/s9afP4s/cMf5WAKquc542P/EuOBFm6Np2T0HFOIMwZ3lX1msR4OvHHx94RUy+4O/BqhUffWqZ6WUlnTts+3yuLV4vHnHnxevyCj4IHdUwq2I3Kl8aqkPCmASAkAtAAgLIQNvBTzIP8MHYY0ln86PNjxKmzB4lv7uF9oB42zmUKcJmW2S6GA+Ak6K8f9vOSTp09WPWi+2CFXZDJbUDnBtUzBwgqnd8Be5TPyVaazy2lUS4lKAAf9TVrWxT+Xb9O5tIiSbIJQCcdjPKy8JN1xqDgLc9/IK56cGEmQ/lrf39OTQ0vKHNtxfotmfca9HaHdmtUvXRc+UDxLvE2leBwC5vtZ/P4ro31YtbgTuqeHdM6mPb+I6q4m8sBE3urXlbc3yryhIm8WsHPVq1uhekKAi8279cmKCyDz3te9pA47LePi1s9ysjYSCPrFfZkKZ5/Pb9YrN9c+t/Y6WRAAyglAtAAgJKQ2bbV6rCpfcU39hieySr2kkQmqukZujWmMzignhHtdVzQ3yPo1rtDq7znaKyrUb1wVm7YrHp25Gy2rW96rTKNecTSUFc4AF5O2lnKSfCqUxt21m2OVS3itZ+Z3K+D6gX73LieotG1nt182ixRZxiYMGlDuwcHU4t5wP0bQ/D1theaSmM8/c4K1QvP5vN9e2nhAHi6Lo3ZMisLlqxJZCwB3bPvrlS99H39+ufFGz5ZpWHjN7aPlwP4hlFJQcW48zpfGwD12KufVL30bI2RNmxz0sHmMd90lfP5yrXPql4ElbOqVB1ZymW/Xz2S+fzOveklNbV0Kmi3AcASAWgAQElMH9hR9bIqIE6WqLBv969PvKN6TUxBbFMt2jR4Zd55BTz1yYdP66t64Zgu5Q7iPjavhICsjT8dP1XMHd5VXHnERN9AZyXUxX7GIyiZxme1frN//V/3Sw4JkSnbumWNuP0rO2Y+j9fO30OM7xN9cMAw+nVqyu73EnQQv3hl+KsKvJjiYEEDo9pmaNs8yuYxcpu45pG3xe6/eFDsdPF9aqq3hpbZ7UueNJs5KFzmb9qee2+lb3Zs2Lik7cPDXilgmo9y3RWHXGQFWmhXQwTtc5JQVxPtkF5mZ1//9PvqnretFgN3ynrVSSADOl0vL14llq8zn8h/bOGyz8ZX+eezH2RuSymVDGjWL6CkCEADAEpCrymcZG3aShD27ZrqlpZyiXkdGNi+rxpDyQIbfs/fWgWKdO7srWpZzXYa2kX8/tgpYv6YHmqKWZrvN6njOK8ATdhxLm2y9IIyZN2LK2zsvk/H1pnPo742/cznnDiDj+XMvOhe1YvPtE4kNWCpTeBAfmRB64F8mvNufSXTl2U7gtzwxZmZkko3njJTHF2Eut5hfew7IG/wMnOzDc5sDnkmMGiwRF0a583O3WuE6vmLu19LYryEsA6clF/2w9YV972pev6uffJd1fOW1NsOe9KkOZjQN5kTmjKRYa/LHhY7/PhescIQhE7qJEJSklgX3vw4/woRVi+gtAhAAwBKQs/MLP4hW2klUd+2lMFUr0CF14kE/f1GzW71C0w01teK03ctHOjQPatp1BUuZ2m+31YeAf+kpJEB7VXuI8e9/lZCtnzLiJmPaTGdmNKvyuh/9m1imatW9BaL7EopqcBBmKy62cO6iJE922ZKKg3r3ihqg9K5y0zYYKptwKdH23ClnsJmMsqg/7QB+VdJxTUjRPZ6lCzJ3HdPKa460a+CsZ3/O15qKo/j54e3vap63vTvGj2YKUve2Ai/5Ktfj4iDS+vOUWU15Enfyw0nH1ZZnJArpijboe7Jt/OvsErgKQHEQAC6eZKnyf/gNDnEuDwCWOS0XzjNvthhlvxlKP9O/r18Hvl88nn9TsPv5bT/OE1e7yWv+VzotBucNsNpAJoRPVCZxqV25awCYlu+vBLgbI+9o2a8y7IIXgOvyaf86q5DxHGz+qsp2QOYlxevVvcqf7mHlWYsJO1M3xLEcfKU+vVttLQIiH55l/iDf8ZhuthhygV3q54QTy1arnr+kvqKCPM0+mtWWgmfW5+XP81DsFw4YUs9GUtw+Jwcm9Svgzh4ch91Lzm2weEomZdzR2QHuC2HVWSb5RtI8gSW/r5leRi3c256UfX82WTLb9i8TWzaWl7ZumlK4+fxWsNAle5xDMpBlO1Qp6+XKSxKACEQgG5+BjntGacd5zQ5KsYlTpNB4K867TGn2aYHyMfJx8u/kyPOyOeRzyefVz7/QKfpfuy0/3PaRKfd4bRLnfZfp+3rtEecdqTTADRT2iDusOAVxD12ZlMANi2eJTg8ggr6rEYN7k3o0z5wwCX3PLzyYVPwWSqH4EAxVfL7DXuS4omFdoFMP+5XjHqSpJhqPUrZfGv+cHHijgPECTsMEKfMlj/9iuPm5z4QCz9Zq+5lmYKVkQILFn8jHxIUrImTVVeuq8THqzeqXr51IesP25SxicJrzAA/CVVu+Yw8YfaPU2aKKf2D823irCNpleDwmyf9+9h2+0ryhIq+v9RLw3hlQOcGBc0JSkZ4ZfFqMeK7d4hh594h3lu+Xk3NJ7Ov120qDLBWqiRKLeneW1G47PQlbxqk9d7XPhKH/OYxcf3T76kpyTCt33G2w5xKOJEMNCcEoJufK5wmT9F/xWn7Oe1sp+3iNBlAHua0C5xm40KnyWvN5N/NdZp8Hvl8MiAtn1++jpscEvpMp33ktJFOO8Fp8m8OdNruTpNfDz9wGoBmKuwB6sk7m85zVY40AxnFCJJ4BqA9XlufHPXAN2xQ8Nl387Ow0ixJUY7qfQYoLHdh1xH9ZEMU7pdMOtu1TZ13dtmigNrUXrwyOls7r3XOXiPFuXuPzAyQWCwr128Ru/zsAfHzu15XU2QNaP/laLuUbYKjNl8jS9eaB+Ay0fdz5ZoB/d6K+ANJ1tdub7X8ojAGkgIWZdLLelCXNpnBQWV5j5N28v/9EOUESW5+0yrBscGjPu+SVRvFL+5+Q93LCgri5qS5Op/zz/yM51qPbGt9/xA063te9pDqOQegzr5G9/6K9Zm69tMuvEe8+P4qNbVyye+Ge177WN1LzqNvLVO9Jvqyd+/Hc46/5mnxxNvLxTdufMEYoI7qMcP8JJEBXbAfSWsnB8AKAejmRf7amuc0WTLjV3KCy/ecJo9+jnJa0JDq8t/l4+Tj5d+5Xe40+fwyqOz+dSdHbZHrmxyqW/8WlUOQy9PiXTL3ADRLfpeMmkZ4H9g5aFdV3tIMhBYjSOL1G972taNe+hv22F5/eBEWTVnZe1xP1as8QR/V51J+b0nHka49cboY17udupfv7lfl+Xl/pgC21wB/pV7NL7unKSBm2ic0uOqH3/2qXXDFLm4Q/KDz/y87AKEN/XupGPtWL8O7N6peIZtSLEHke7NaxEq3tvmZq36iBJLSvAKhXata1TOLkgmem92w5UlsybITJmfd+LzqNbEtwZHk+qw/0xotA9nrtfTptsFzyTQY5rdvekksX7dZrHVe//g/PqWmVq4zrn9O9ZKXy6z+ZM0m8fjCZQXL/upH5CG9t2UhTuYFef2jwgz5MOuCF30/Ev8ZAcQR/9cKKonMdJZkDWb9G1vu9WUZjNZOmy4n+JD1mls5TT5e/7aQzyufX5qjbiV5JCK/paY6rbOc4LKT0+Sv6qaCgACaHb8fmtedXFgmvncHubuqXAke9xVI6fg3j1etQK/3pR8E2AQP+3cq/IzjHjAnecBdCdIepG5Ql/gngrwCa0Gf1c8OGqd6yXGvp0kHksb0bif+eeosdS+fTbDtoMmFQ2yUYsCzsEz79jpX/fA/PPK26vmzCRzIl0oywPD1efmDmpZycTf4ZNDXeJRiCWNkj7ahAj5/PSHocKGJ6XlXrPMPXpVyWYdYDJ/J7a9SK8GhbnUPvbFU9ZrYBqBtZ3WEs27Etc2jzpq+D4tyssJtwZKmK2FkYLXSPZ9iFvek8+8S//fCYrHLT+8Xh171uPjev15W/2InSmkdLxu2FK4fSQSg9ROOCc4ygAgIQDcvssSGVHg9TVYuXSX/13ahKM8jCzN+02ndnCa/Ca5y2o+cdr3TZMD6Lqed7DQbssa0qQ13GoAK1aWNdzaVvGx29rD8iyRmDuok9hzTPRMIveywCWpq5Ujz2DqtIOsZuw3NHLDuNaaH6NfJHHj0em19qjsD0kTW6exsWCfCvjX9WCOlRdNs/eaoSaqXvKDPKu3gehrrSpygmmnb8gpAl9N6bgooRantafM3SccWJvWT4203STMrN4jf+09itnYe2iVUcGZw1zbirtNlDkkw+bzu+X/jozXijOsLM3elXHmMtL7HbEQJfOVmN635DjNLtvNfzPV5xXpzuYbCEj32b9Q0+x+trvygs1uan5DMUv/S3579LFtdZo6HYTNgpC3jeAYJPP2qDcmVCQEQHwHo5iV33afXqdTc9Pbq1kvU5/mF0z7vNJnCcaLTZA3og5wmRzG4xmnJF7gCUNauPm6KmDqgo7hg/9GiQ0NLNdVMzyqSB05XHDFJPPfdeWKfCigz8LVdh6heVpoHfmk991fmDhHPf2+e+NURcixZM9uXDsrcPGBib+MlmX4H9y8vzmY++c1DOkumfKX9fgd39S4LEFdal7LbSiOQFGfb3G2kPIefr8SLyIopFhYlrmDzNxHihqEUa3mbgs1+by338KCB11Z5BAElmc0YtvREq4ATiW7uWNXJf5Z5I2bHzxqQuS3luh1lPcrN74er4tfjNglz0sa+BIfqlJC+S7Sd9+Yiha+hxCSZAW2SxqqwbG11naAAKg0BaLjlvuLi7u69nucbTrvRaTLYLIdkl+lzMnVqodP+6rSLnWZD/o2pveY0ABVkzrCu4vqTZ4gjpsky8f68AjeVcAm6tN/4XqqXFXeuZTaylzQXSdt6/9qZngE2bbJX7docGfxbvbEwmOL3eS9eWXjgrz+6nA/m0lAJ79frGDaN9fiU2fLnh51i7lpWW2RpDTDUvffa3uLUmO/dQVZZi0/WF/3TY4vEP/77vprSJErm3H/fWaF63mTwKs2YSFon93Sm9+D3vnIZr1fe/1bm1uTpRcvF1Au9q91lPpKQyy7MSZpH3lwqDrzyUXHwrx8TC30G3eyoTkanuaz9rriSomVAZ+c3ibIBJmE2Gdt5sP380lzr9c95a4g3mtKiLis2+3KbkxO5es9J2rotuQ/AVM87jW1p8aqNqhfdSx+sEmfe8Ly4x2LsBgD5CEA3L7nMZPMIOELkCnx5ZTbnRHme2U77sdP+5bQznCaDzuud9l+n7e+0D5z2daf5D0sNoNkyDURYSfQanXGPrU/YMZslZpJG5qYtr1fWpwfEn8WOQ/XhArL83pvNsUqxAkjlolNDU6DFNIhdOQu7HvsN0pbTtdF+4DTTgX+/Tq0zJWiSdqlr0D4vYZaGadH16WgXWL7vTPmTLb6R371DfPcWc03RKGGFk3yyZnPSCv7lFOukhOl9+L0z+fA7X14iLr/vTTWl0GG/fVxs8glCPbFwWejPJWgwP7ej//CkePqdFeLJRbIqn7dcaZ00v8f2n5h/QlgXZS3KzW1a8x0mO90QyzNKcn1+5cOm2ssmQ7u1UT1/T7ztv34kQQZs5QmZVwPmuSxYfEZBMfubnn1fjPt+boim5IQ5WRBky9bC5yrX8hn7X/GIuPGZ98UX/vi0WL2REh9AGASgm5cF6tYrbS53fbhXbeecKM+zt7q9T926yUD0k06T62PlFXIFUBTH7+AdcK0EtS3yv3LjBkJbt/QOJhYzc1Nn+9pBGdA92pmDZX7PbxN8KuGiKQkZzPnHKTPFCc72c+MphYN5JuHYmf1Vz2z+6O6qZ+YVWAm7ifzo82NULxmmde2Bs+aIo2cEX7GRipgr75VHyIvFgpkCaFGuNPELTqQVJ7bJJI+jWCewjIvOZ6HJ2q1+ZS2kLQHZijLwZ9qHft4nWCsHRrwo4e0uJ83vMfl97LdfWviJd4a2l9x2k8SAkCZhYn3WgxBa7lQGBAw2KzNCg9gG5pPO1DVlB8uTNQf++jEx/9KHrOa9lGy2g6DfPqdf97zYsGWbupecMGVhgpiCzf80XD1TDtz70neXyTAGAFsEoJuXXPB3ntP0z16mDcmh2eX1y4/LCT7kv8vHycfr6UbyeeXzS+5gcy7lKH8UsSa56eFGPwDQbHRobZ9pVY70AHRYYQZcK2WWr9dBpj5PfgdVflmqNu/N7xGlXDalMqlfB3Hu3iPF8O65C5SS9b3PjVS9fN3a1onXfzhfXHmkXeBTZxOwuP0rO4pdhncV39xjuJjQt4OamgyvdaVUtanDZLCb5tAmQ1wyvb2k67IGBUxM5UZsXHznglCZomHZfvTvr4gXlLA5mea2YElhvfwo9JeV2/b39h6l7pkdOrWv6iXLNmAZld938pJVG8XuowprrvvJzW7QydWowpStsV1/bBdxUKb7cdc8pXrhHZ7S+pNz96uFQwx98S/yAtysr133nOqVJ338E5Ow+4ukJPm1IH8v6OKUy9i67VNx87PyAmsA5SSdb0iUK1kYTl5/I1OVTpMTXL7vNPlr/09Oc5/2H66a21qn/dlp8vHnyQkuX3KafP47nSbLbOQ8pG5PcpqeSjHfaTKYLb9lHpUTAEBX6YHDuFlRQ7raXb4qpX3g7sfrpfXJfp/nx2vMg8TMHNRJ9cyM2Tjay5QodljVTJ+lzEa+7qQZrsvpMzdG/TuZg4026/HInm3FH46dYl3bOczH7/X6+nu55JBxqpcuv6sedKZZt90vFGNfu36zfzZe1IDKc++tVL34fn1k4WCrtsvw9JhBLdPb91siSQXd3c/So129OG7WANGuRCd/014N/fZJcv0LW0c9t26klQEdRlA5jBzb9Tko0/UTj+9sG0elfEXJiX96WvXM1gcM3FlqNic8I+4uY0syA9oUzL7thQ9VL7xDrnq8KCcXSrXsgUpFALr5OdVp8lTwZU672Wk/ctq9TjvdabJkxjlOc3tVNd23nSYfL+s53+M0+Tzy+S51mnx+PcAtBx+UI5/IdAL5fH90Wq4m9G1Ok9+uZzttmdMAoEDpD+niqY2ZFRXmYLyUQdZBXewD5WHtNTZbe3fHIeb60DbHAXEGZ4O9w6b2Ff1dWax+JRzO2WuE6uUr9ifVtj4/wKvP8rfmZ8/H65cK7zy0q+qVt7QDeknSA9CbtiZ/+bifzm1aij1GF9b6tg3YPbUoeMBEP6YAvF+g4/n3kykjsGxtUyCx1KuL7bKOyi+wlxnMMmRQPze7aWVAL3U+G3mCxSbo961/vqh6/mxn9dMEqmKYZlueVI57dVhc2yyWZynZlD8q1VtIMgO6TV0L1UvGMxaD1gIoPgLQzY/Mgp7stGucNs1pcuA/mTYkA9KyOKRtAFg+Tj5e/t1gp8nnkc93tdPktbb6MNzyp8ueTpOB7lecJgcelH8z3Wm3O213p8ngNQBUpfra7T/LBm0fIaMszMF4qUoESGerIJ0uSizhzHn5Qw3klsFFB4zN3OpsDsLSvDwf3vyyaju3MZdcSSMA5TcfqzfmZ8Lp21H3dvWZW/0kRgk3N0+mEy3FyGxOir4th8qES2AT96qXXKxFaAqK+e274mQKup1z00uqJwOepa2Kl3oA2uf55QmAsEG93PYVpV66jf2veFTs96tHxO8eeltN8WZbMkdfBl6lztL63ox6pUOSkgyipqGcS3AkmQHtNe5HueM3JRAOAejm6T2nHec0mdrR0mny2qevOs007LD81vP65pOPl38n/14+j3y+453mNWKATBn6hdNk0FkWopSpRjJtSA5QmPzQvABQRuTB6c2nzhKnzh4k/n6S3A2GEyZ4FOKhiWvfWn4dFIqSeaxnIOaO63u1Nx+oGAOZ2rGBzCJD8UWJyWxX4l+p+nb0WbBGm17MrHrbbbuSDoon9m2vek30uMbWgAH0kua1nNMOiuY8925hKZFixJhedA3ItnmbfdrrPuN6ql5y0j6x4/f8DS1rQm9Buefr3SHdQNoFt5suTI1G/11RV2POQl2jnZyLwrRPSiKzOq4kg6hpsEko8AtAP74wvYuLkxzYsBxORgBIHwFoAEBFKNJxf6pkvdpv7DE80mBwLUPUldSDJGfslp9JXCn0TLKgILzMMpf8HsYxTmls3OIdafD6SNII9oUJNuivn7tfrCCkie0r3/nyR6oXTd+OrVUvfTMMtd31YERtTemWuVuY6gpxAlvryrwurW72MK8xxqMLc9I1yEGTeqteE7/tuFeHVqG/K3InovwG0U3aQ298onrR6LFNryDgv19aonrRvf6RHEIo3ylzzLX7X17sXVIm6d1vGhnQTyxcJg688lFx+b1vqCnR2dTX9nsPby91D+2UrF/d96bqxZfCx1AUMXbzQLNEABoAUBHa1pdmIKRyccH+Y1RPiIs+39Q30Q8qx/Zup3qlE+WgUX8fQYE/43FAwgerSJ5XgpfX9DjCBBsK17/825wwmaJhzB3eVFs6tw3bBuXctXyj+PnBxRlYUTJdYq4f1Iepq5tEPGDl+vw63zlhTj5c+YBejc7e04b6peUc6OiTwgmLJLf/8/cbrXpN/DJLf36XHOYm3ALPZfgmGTgPctTvn1S9aJaskuO/N/HbP0Y5KfKDW18R1zzytvFkjPwdM3uo+cTFjc94XUyb/HZgW64kDDkAntyGf/qf18WCJWvU1PT4nexKc78Rt9a9W7lnonupzLkGSocANACgInRoaJnJ5O3Zrl5c7FEDuJoN7dYobjltlvj9MZPFQZP7qKlmekmAYv9AblWbzGAyerDHPVbRuD7Bl+1LeiiAg4Xy0Lpldh3ZZXhXp58/+F9OGpnGYS7z1V8/F1jSp7dtZZ7/uL45f7jo6Oz3ZF3WXx0+MTPt+Fn9M7fSsTOb+rq4MZWBKQ4mqjPNqv45pbAqRBImKHrxHQtUL99Gi8vWn3y7sCpeOe+7pvTvqHrxuAPFSY5lUG/4TvJ7+rte+Sh0YDKFOGbqXtOCozt7BISlKNvgHx55W5x36yvigdcLM7UPndrXM1gfNRYZJYipDyqbtNeWrFY9sz89tkic+tdnAh/nx2/dq5RyTKs3VNZVHwCiIQANAKgYX5k7RDz6rbni4Cn+AdhqJYOuc0d0CxzkSD+mK3ZmyeWHT1C9ePQAhLuMw+WHTSgIwJmCi/qUTysxSlCFnv3ubuLfX91R/PZoOS6yWamDjnpwJLc66rOVRg3oy5z1W550evTsXcRT5+z6WYbpV3cdKg519n+ypMAZ2iCdbl5Bhx2HdFY9fwnG/gKZttty3UyTyG69+pFFquft/RXrVa9JuWcIHmgocxHGkdP7iqOmy2FlstI4AeUWNLjbfQvClbco4iaTmj3HdFe9QnH2c3994l3VyxrevVH1zP7vhcWqF8ydmf3qh4XZxgM7N6heafjtM2R29HdveVnc/uISceTvomez5/ahch/xwcoNmX6lufhO8wm7clepmdtAqRCABgCgyhV7oB+Z1aqLErjR/8L9O18G5M7bZ5S6l8/9Wp+szi9FIOtwo/RkSYURPdr6nkzxC0D5Zf/6CZPVqM9abn70dTnCqh1o/uhsIEhmbta4Uv/b1NWIiw4YK35y0DjfskRex8RXHjkpE8DO1Uv3kmT2aRDzvOZPDHOMn2ZAIImg6C8t6sKuWL9FvOQaELASnLvXCNWLpk+H/DIeaa+CSZxMcEtjP5Am03bit93HyaTV97vDAgLQS9duVr1gV9zfVIfYtH8f3LV4V3OE5R4gMM4AybkA9Al/fFrMuuhecd6/Xs7cl1LcHSaKAaKB5oEANAAAVUY/sN5W5COQpA7s9bkOOgA2HVCv0epWhqkli/TYBJdMDzluVn9xxLS+vtm/flqp0h829GBj7q4+7xZvJbS4z+kVZ88FsB84a46aYpZ29qmbaV5tzxNccUS2NInbzc/ZZ0+GlURQ1HbZnnXjC6qXVe6BpPatW6peNPrbS3sdTPr507gSws+ajfFKR5jWJ7+scNtt0kQPDOvPFXRCzM+v7nsrU/P+tw8uFM+9Z1eTuKW7nlfKirFWyM/y49UbxT2vfZy5f82jTVdZFHFXHlnYcjflpHLnHCgNjsIAAKgy5Xi8EWWe9L8xHaMcP2tA5rauZntxxLSmy7dzgsqVoDRsTlKYAkTf+9yozICcUQclPXhyH9GpwS5Qpq86ufkpzIAOfi9hxQ2OrVrvn0EY9PRB5QmSZDqxZCrLoZM18fcc00PdK44kgpa2z5BEuaC29enUJ09DlzZ1qpeVdIBY5y4ZstvIbqoXXW2L4m0z0lUPLlS9Qv06BQ8KaVq7/Jb5u8vWi5uf/SCTXRu3zIN+svikHQeqXjTn3vySuOD2V8V3bmnK/M0xvc+aIn5Wfqvxgo+SGaBQ7i83bTVf6lbsEyNR3Pbih6qXb3Svyr1iTQbV733to6IMQglUEgLQAABUGf2Apxxq1CURSzC9jzN3Hyp+cuBY8c9TZ2YGqtR1a8wPalTKgDyVJmpJDD9pxJ9kSYt7z5wtbnLWlxfPm6emmhUGmvNv0xT3NYLW8qDgXlEvFDDMrE3w1TQQadqS+Oxtn0PfV0XZd+V2mXGzZYth3/E9VS8r7e1MlmOStda/uPMgccH+TYMfRtXJFUD/wb7m8lBJ8hs8751l2RriH6/ZKK5/6r3Mrc5YgsNnmZ/y12fE1657LpNd+5Vrn1VT7eivpN+fNdi/Nr2c/wOvfFQc4DSTf7+0RPXsrN8cPBBoUvwCwJ+sCS47YVNCxG93meQ5+LR+S551w/Oql2/+6OKeYLRx07Pvq16W1yKRg0sef83TYv6lDxpr+gPNFQFoAACqjH68cfer2csyy81Zuw/L3HoNEqQHyUxBqdYta8RBk/uIUT3bqSn571//k5SOn5q97+498rOBpe782k6Z27jSyCyW2rWqFRP6dhCNAVnUi7Usv9z6qM9V2Cz73x/jPfBiTtz3HpRBHPTsaWefum3cUhgM0uden53GEmX2JrFcbOtr6x9hlH2XLL/0o3+/Ksac9x81pTzJwTHdtc6lYly9ss+4nuLs+cNF18Z6NSUZR8/oLw6eHG9QxrhksPD4a54S3/jHC+LkPz+jpjYxrU5++51cUFt65h27Uhc5euBSvx+0v5OB56ed1wz7urZuee6DwGCwLHFx1ysfiU1bkwte12jr+JZthVnM+mYwpX+HTB1/N78TdkXclUfmNY9pBbzjOP06PVhunsfv3/pK5lZ+ND/692uZPgBnn6ZuAQBAldAP5lauL332m+kA47Q5g8V9Z84Wd3gELPW/8cvy8WJzKT/ik0E1+Tkuumgv4wBTA7uYTzKUkwatPvQfXXU0pVzwsV+neO9l7ohu4slz5ooe7ZINerkFbStegdTJ/TpkbotVgmPFus3ij4+9o+41WbMxv3Z7uUgiAG27S9IfFmVPJjM9f/OAd6mGcvHQG0tVr0kxT4KkwSuALk/U/eUL0zL9OEH2oL+UJQBe+mB1pv/suyszt26m9bBYi1x/bX0xjOvddEJZem95vJIfQb769+fElAvu9qxFvHnrp2LPyx4WJ/7paXHev7KBxSToJ12eXlQYYNczqL+796hMHf8+HVupKf77lCSzvdP6OeW1raf1ejo54OvY8+4UB//6MbEq5O9lm3nc4lEeBWiOCEADAFBlCn/LF+lXvA+vy1AHdG4QLWu2zzSd/hdRgsn6X5R+STRP7gz1cnXK7EGql6UfFOeCJF0a68TFB44Vs4d1EdedND07MSSZcRlmQMSwgkpYeB3wX3LI+MxtsQJRP74jWmZYkWavQIx44We2GrIcTYKyRqudaVl/YYdszf/KYF5Z+ndqEDsM6SzuP3O2ePib/oOBJklff0zfp2ltV/pL6ff1k+bPv79K9ZLntx0d9tvHVS/ffQs+FkvXZjOkr33y3cytLb99qZ4BbaL/fe6++zeV/Cz1kixp7C+Sf8Ysr6Xg/hpLc/+39y8fFqs3bhVPLlouzr3lJTXVjs1cpTfnQOUhAA0AQJUp/DHv9fO+fJjmsHVd/mX2UY4/9Mtq6w2BbqSvXNdA9yCWR07PH8Sy8MC/aYIczPCa46aKaQM7qSkRpHhUujUgAL2dx2bQp2N28LKgS+KT8v6KaJmNp+82VPWKU283J4nlss4yI/GtT9apXvNkWtayXEZYsrxHKXitKhP7ZWuX9+/cIHq0a8piDSto29GXn833Z1rbfVA985ReNkN/337L4cm3l6teviQGBDWxGbhSP1mYu+uOXcu5+8vj+VeS5Ga5oWVy5YrSCgJ7rXe5kySvLF4tdrz4PjHronvF3a98FGs+hgTU1L71+cWqZ8dmVlJabEBF4igMAIBqk+bRXESmQZCCtNEC0LKeaVz6Ja9o3uQglj89aJy4+bRZon3r/EEs9Vq9SW9Wn6iMujQEHaCX3x7Cn15GqK8KlEuHTumreukLmwH91idr8wag0uuKh9HcYhimZV0bYv+94Id7iP+cvpP4syp3UWxem+AxCQ3YKtctP/o+QM94Ns1ft7b5g/YmZcW6/O1XvwggzXIr+nL4IMI2GGf2/P7U5veI/tq5ZeVeZvKzXbI6/zdW7vPuaBicOSrDKiPeXrouU6IkDq9llPvsZC1zecJFfnYn/OlpMeNH92amR2F6D3Ho25VZ0q8KVC6OwgAAqDL6j/npAzuqXul8tDp+sM3uh77D62gG0MhBLA+c1FuM6NFWTWmiBz2TDpKkWef4G3v4Z4qGfS+lruH9i7tfV71CsnyPXr87LWGX29yfPZDJ3JMZfNL1T7+XuY2kmcUw4g5CWFfTQgztVliPvtTkfLnNHBTtKopFrkEBbehJvHoWslRfm8529MqH2fU/5/4F+QMjx/yofenv8us36IPI5fv69c8XDHYYJzPc70/1Ehymx+r7nNzdhUubrpAwZWjn6lkX/kt0pp9gc356v9jjFw961s+24rGMcs+oB9f1+7rn3iuseZ4TJ3vaxOZ3acIvCVQ0AtAAAFQZ/SDGFFwrN+5R3Q+Y2Fv18vEjvnLtNLSL6uVnr1aSNIMkSZN1Zv2EDaResN8Y1Ssed6Bg6drNqpel7wuSPjngxe91BnkE6eW8ysHLcv2o3AGnSuHer4dVrM80CX87wZRlbfdht4548iRof6SX4dEDZfq6KEvZFGuR6/NmGiNC1odPovSF/r69ymzk/OO/74sDrnxU3cuKF7T0Xqg12+eHYkyP1D8T03Zx+4tLxP0LPlH3snKzbH3i3sKHq8zZ43LfdMdLS9S98Ly29ajzvmBJ/gkPN/mUsg6/HGT4qgffEhu3xBuk0WYWk/wMgEpHABoAgCqjH8xVwm/fr+8+TOw9tofYc0x3ce5eI9TUfElnrqB4Pj+hlzhsal8xbUBH8ftjJquplSWt+qhpCMoetXkr1544Xew1pkfm8xrePZ1M0neXe2dx5jb3oFIDUtE+Gu11Tt5poDhjt6HiZweNy5Ry8ZK77F9ert6c7DOup+qFV0Gbm/Ek74OvL1U9f73aR6sDveOQppN6Jn9+LL8msP71qX+bHjGtX8mC/qaXvfL+t8Q/n/1A3YvusbeWqV50aS0XmxrQ+iNMf2HaR+ZKliVZv/pMn+zxX933puqF57V4o8663ziv8in/9fxi8b1/vSwuvP018YdH3s7+Q0Q2weXkPgGg8hGABgCgyug/5k2X2pabtvW14vLDJ4orjpgkOrhqFnZtbKpJOSPipcooPVlP+UefHyOuO3mGGFKGl8XbqKQTIFMH+JfdsYmnyO3tV0dMFHNHdEstALN2k3cZktyB/XdveSlz66Z/EsU6OaCvAw11NeIrc4eIAyb1tlpGMvDRnMT5XEoVDE2Kba3h0+YMVr1wgjKgL7j9VdXL0gNl7vvyhJVsYZb4+s3JlRDy+qxvePo9332EjU0x6xNLcjtPwwOv52ctm7YXfZppUZnGx8iVxEgw/iyeWpRfmsRNL7MShtd6J09CyGzlsPyCwvLfLnRtGxffsUD1orFZviu0cl5Ac0YAGgCAKqP/mPf5LV725ABSu47oKs7afZiY1M+ulnW4w2jAbLeR3VQvK1aNSwNZuzgJ87T5lIIyoEMH91LapPzmI7e4120qvES6bX1+QCgoGJcUvX6ve52IW7O4FNwn+NIQZ5mEWUcvO2yC6pVGnNrJUfcDs4d1VT07+t7L/bugtZr/MLu4lz6IHnDUeX3Ur3+0RqxNsVa+n01bm/Y71z0VvXa713uTA5K+tmSNupdleqy+CZmC1KaTo7lpfsFYG1EGbQzL70TVn7RMfht+71guDr30SRw2y/d5n5rUQHNDABoAgCqj/5aPd/hRWsO6N4rfHTMlcpYYEFWjFuRMmldsLuyAf6dG2DbCBqD1wbKSsnqDd2ZY7soN06zqGd6hA+oRtdLq9boD0GnOQm4Qw6T5BT/H9m6neva6t61Xvaw4q02YGNHeY3qoXvHI4Losn3H2/OEF60UYUYP0NRblG9wKTqC576qnChOs9KoHHIXX9iszR23KVKQhlzktS1ikceWCnv0smd5pQQa0unUzDWjblAFt/5maXHDbK6qXHr9N4Af/F/71/cqOyOWR5MlCSsMB4RCABgCgyhTWgC7+D+SJfdurHpCM/p2KO3ihHhSRZUSS5BV08aslbBIlOGz6i0afy8zTyu7d7HN5dW63ZVpONpelx3HLabNUz587uOO3jOIG0V54P50MujqfAPQfj5uqevYOn9ZX9YTYf0KvvHJKYYU5qZD0thnk4W/OEW9duKd45OxdxBd3HqSmRhM1GzP0lT7azwB3aa7cM4XZjs664QXVi8/v4yv+r5es/6ldk98+ykQP9Hu9NdufZfqyMW0XD71RWG98y7bsC8T9+Xffa4WB8uSFWPEsFJxscZHLI+r3hem3dIQKIUCzRgAaAIBqo/24jnn8EcnnYgw+BZjEucw9Cv3AP9lDZO/n07NIg2yJcARsOgD320+ECQYmJRfctXllv0u4oxjXx+4EmnuZ+S2jro3hPlPd6o3p1BBtqZUUcYvymZ+000Bx5PS+mUFH5WCyg7q0iTwQYSnWOVtht1E/YTOZc8IuHn0sCHcsLbf9hFlPwwZm/fhtv3EDqJ0ingTJ1VX2C2aa6AMCev21bQ1t/USD7ef+58cXZW7jZkBv2FJYAilpSZ8/8nvP8v1sjlgX3PS0v7j7ddUDYIMANAAAVUb/LT+ie+EI/WnTszL3G1+8gHQZxy1QQfaf0Fv1spJer7wCbGFfp2uEYJgp4ON30F6KbSo3OzaBSK9HpFU6JMe9yPzmM+5VKJfe/YbqJSvpq2PkSaIf7jdG/PyQ8aJTm2x9aVmf+Qf7jsr0w0j5o4slyRMeLSI+V9i/0uOo7rulXtZ+i+D6p6PXX5Y6tYkYgFYLbKvKJLbVskV+eMVrE/v1AwtVr4lxOWjTbDPfn3knO2BgyPh5SSR9sslvt7Z83WbVC8/0tC9blkeKMpgiUI0IQAMAUGX0g+Pu7ZLL1rKlz0MaNRTRvCQcKwvUo2C7SfYg2evpwl5aL+vQJmH9Zu9MtzSyUYOCn59lQFu8tNf89U25bIv7PfgF8eIEgWT953U+n00cCz7KHwTNLW7mpFurgKsXTCcK9O+QXKmLXUcUDrpZbBarpLUo5UPkendtyIHx9O3N/fkmGVCPwm//8pM7F6heNO51L8wJl9zy2fppYeBw3Sbv7OW6Wj0AbX7NpWs3qZ5b4XLQp9h+VEnVgA5DZnVvjJAxnfQJkFz2upeP15iWfbAw649ufREyyYFKQAAaAIAqk/Bv+Uj0A8pKyMJBedMvIU+bvg4nPSihV3Zu0gfjSfCbp7nDu6peOEH7hNy/2wRclqzeqHrF5X4LfjWgowaBHl+4TOx52UPqXvL8yhO0SHDwt6AA5z6GK2T05ZkbFHGhVuLA5JeHTVC9dNgGAaO66PNjVM9MBheffy9cXXA5oJ+be5VM+e0UmD5QH0RUdVLQtlWt6jUNLGijKYCbucnztyfeVb1C+qYetJ/LV/hgfYrtriQ3/3GCpmFNu/AeMf1H94h3lq1TU+x8YgzGR5dW0N32Wb9y7bOq1yRXUxxo7ghAAwBQZdI+OLZRDvOA6lLE4+gMfR0e2q1R9ZLRq4NH5nIZbjumAOLsYV3EH4+fKtq1bgrwhBFYA1V93mlkXyfFfbm933xGXXUPvepx1UvHTkO6qF6+bm3rRNv6aJ+rSUufwQ6lWsNAfHpQMnfXK1h19bFTRHtnXZSDH6Y9BkHaGcOzBndWPbOt4aKaGdc9lR80zRuEsMib2G+Pnqx6WaEHVAzBHYwMUy8/93emAO41j2brK5vowc8wwVDjx6pNs30+vwB6WtZs3CpWrt8ivn7982pKMJkxnRswMSkhFnnilqzaaLziL8x6AFQzAtAAAFSZcojXpJnRFFVvr4AfKkKxD9/S3o5+cch41atM1xw3Vew8tItV8MgUgPztg4U1UN1yB+xxAtBp74a+tMtg1XPm02en55WF2Ldj8iVC+nRsFVjyImeHIeZA548PGKt6ydh9lH/ZjIMm59dbl/TPfYuKpMkgl8mc4V3Fc9+dJy4pk+2qX4zyL3Jd+u7eI9W9QokEs/KeIu0tJV+jdnIjzX2tu4JGmHrOy9ZmawWbArgfrNygeoX0jybMZ2V6qP73ts8mT1LI/U4pAp+vfmhXF1m6NeHybCvWbf4s+J40m0XpNcBh8T8FoDwRgAYAoMqkmU1kq5Q1Jb1euS4gCw/lrZiXEktpZ94O7uqRUV1hR6pBi0kOQvfn46eqe03e+Ni/lEJuMcT5GN76JNyl4DZePG+eOGp6P3H3GTtnBt3L8RtMziseMrhrG9VLzrBujYEZxznF2k3X1fgHxNsYytvo83ZDzMHoghw4qTAIHseAzg2qF55868fN6i/O2XNEdoImSga0/p3sfgav9WCcKnsSJMx6ZCo9FKUOti0ZgF2wZI145M2loTKgf3jbK5nbsKWf9K+pMF9bpmCxPsU2oCwHx5tywd3inJteUlOKJ8RbTjRAftYNz4sJ598lfn7X62pKslZuCB7AsMajdFGxf78A5YojMQAAqkyxa+WazBjYSfXKRzlfyo9gxV6rS7W6pJS8VTL7jOspGuoKA4xvL/UPDucCE0mezHr5+7urnrffHDVJ9cxk9ub5+40uCB77xdC8gixpBCXkU8aN56VxAvGW02apnh19f/2JGjisS2Nd5jZpficQooiVue/8qfwMxvVpr6bk2xahZIG+rrnveq0vnifJEpbsks/31idrxe6/eFAc8bsnxF98ajfr3lQnyMLuj/VtPczvMdN+ouD5QszPUpXFXWxh5rGFofyODX193rB5m7jhmffVvXSsWJdfR93Ea7uvtu91ICoC0AAAVJkwP/7T0qmN9+BWpUIAurK1MQQx01Sq9aUcTiCFYbOUTIvytSVrVM/sswB05v/JMAXC3Q6e3FvMG+lfLsKTz4x67ZNlJuu1J05X95LhVaLCZESPtqqXPq9gqmRaPvr2lwuKX3JwOiU2bONgnS2/2+597WPVCza5XwfVy8pdxeQ1sOXdr36kevbeXrpe9bK2uRb6R6ub6mpfeuj4TAmXnYZ2EZP758+XlzC/OUz7gjT3te4g7GX3vKF6wXKDNoYN9usBY3cJkCCm5Vg4Ldz8lIIpkO4l6skyPaC7JcyCTpHX+6m073UgLQSgAQCoMmEOBtNSjsHeNC/zRTp+feRE1RPi4gOTrUsbpFRrS6m237nDu6pesO+46tPabOpegTQ/S9dkA0fF3GxH9mj7WaAzSV4BGVkSYEi3ZMtwPLlo+WfBsyANLYt7UseLafHon3vurlfd6rhs19Gnz91N9ZLTqmV+iZLcrJjKVUhn3fiC6tnTg9Z3vbxE9fLtO76XeP5788Sfjp9qVUs3bBa/qURYMbdxW7ll/59XCpeTe/BRnb7IwgRj5YB8On35VsKJ9DBrRNT3oy/Xj1dvVL3S8vz+CLNQgCpGABoAgCrT3H/nev3+L8eDXPjbfVR3cfNpszL1dod3L162prQ5RL3QJJVq+5W1mv3sqAJ/7VrViuNn9c/0JZsAQpQgw56XPSR+9p8F4vn3V6kp8fS3GBSujTY4Whh+tfe9YlAyaa8SAkppM2UH6oGcjVsLg3NJ8irBMbBLw2c1tU+ZPShza2NML7v6yVLBOqDuRjlxY8uvBE7u/doEoFeHyLj3lN7bjCxXZ/uHt72auXWbNrCj6hX60e35jw8Tn7/KMDCrO1Ndria52uLDuxenPEoUYT7OqLs/PQB9yV322e1R2cyr12MsNiWgWSAADQBAlQmTcZOWcgyqHDuzKWiGyiCDUOP7tE9lsLYgpmy0pJ27V+EgYx1ahw+CXnxA/OzwoPIUVx45SVx5xETxwFmzM59Ljs2mHjWO9st73xTL10WvYyozmo+Z0U9MH9hR/PyQ4NINnxvXQ/XC81sOXvtkOb2Ue0q5jrfWsm+lYs+TzVfWspTr2XplLsoTLv/60qxMaYqvzh2ipgYLEyDUM52DSnAkwTNT02WDxT4w9DwaHl6uJ2FWbTBfSeD3G+serfRKmN9jT7y9XPWauM+D/uOUmZ99bnuM7p65Tdr/fXkH0T7Cd1BUUT97fbFu2pr+CWO5Lwji9XFTggPIIgANAEC1KYPfueV4PPn5ib1VDwhWjKDI7GH5ZS92GNxZtI5QFmHfCT0/G5zttDn2WZo5NgO7yRrc88f0EO1b6zVwg5eTTbArjqn9zRmJclf4/X1Hi7+fNENM7Btcz7Y24oBYkt879ApKZALQJdxXytc+NURWbymlMWCjm9f2LrOA5dUXsjRFfW1hsN6LKTDbo1296uXTy0Pl7pY6MGuTAR12Dk2PL9cA9PVPvad6+bZ41IXebAiC3vrCYtWz86m2zN33ZW3unDgn5rzIE3Wje7XLO9Gy55jwge4wH2dSAehiiHNSuhTzC5QjAtAAAFSZcsi00A8qrjluiuqVTprZZKg+Pdq1Ur306JmPUbPa6mpaZMqU3PjFGeLMecPUVHuTLIKzXmziB17lDaIwZud5PH3aQUs3vyC7DDRv2FwYvJCxJb/SHWmTiyco871c5MpCpGXf8T1VL59XsDGIHlQe1KVB/OFY8/eg/tWUW5fS/Mp65M2lqudN1igPksQWVsztNIx3lpvLlGz1WC7XPPq26jV55M1lqmdn4LdvF1++9ll1L78Eh/s3zF8ef0f1kjOoS/ZKI/eAv7mTLml9RlHX8TCZ5Uk5//8Ky7HYKsX8AuWIADQAAFWmexECZ0H0Y4qODXrWZHpKGdBB9ZADg8mSEz3b1Yu/nThNTU1WkidF5OXBk/t39A2EetklxACEOlmnO0iSGY5DuxaWNvB69rYWl0y7xZnNOp8AqYw9/PLewhqljfXJB39tal27lcOJOZvYTKeG4Cz9OAZ5lPmxCcKauOukHzm9r7jn67PFiB7mOvb3vJpftiH3iSS42eR59cPV4o2P16p73lZaDGYZNrBmek/lGpp7d/kG1cvndU7i/gWfqF48tz6/WCxemX1t9/J1b6ppZI2fvtvQzG3ec6uXf+B1+/cW5jdY1KtjCte75NYir2C7PpBnGCE3E6BqEYAGAKDK7DSks5g9rIuor91e/OygcWpqcenHFGkcLAFpkyUnHv3WXDFzUHYAvqTVtsj/KV6Jm8nOQ7uonre035fX/iXsQF1xSoX4ZRLLYMkV97+l7jX50pzBzouqOwmZOsB7gDST1z9ao3pNynF/XdMi3XnyisObyirYGNy1UVx97BTx7T2Hi7N2H66mmuUGvMvJLf4466Of79z8kur5s8mSDhtYMwUny/X3wYMeQdfn31sp3vy4cLtJMsiYC/67S3C4l5O+zsR14o4DROc22ZM87o8jF+hdsKTw/SYhega06igPvhG8rtpab7haxZbXFYj3Lcg/yQQ0VwSgAQCoMvKg9ZrjpornvzdPHDCpNHWP0zpwBqpJuZSFSbtsj16OIA7TvHotx3LJOvOajbG92+cFe5IQ9j0/+lZhiYBir5Y2659X/eSkeAVB312+XvXCmzO8qzhpp0GBg5e5Sx5Iue/PMIFZmWVtyzZr2epxIde3anHs1U+pXjpy24RXCY6kjerZTvXy17vcq4d5bZvBK3Oinnz4aPVG1cuKeqLIJOngvvTdW1529s3NdGMBXAhAAwBQpWRd2HIR8RgDqGp6DehSlY/pGLO8wRd39h/ILska0KbYQLkE8r2YAnmyrIss8xJ22QSV2AgTO5EPNQaAirw4beIy3917lOqlI2ogLAl6dnduVsLMUVCWtZv+Xr1K8NisS2FPXpVwMSfq/RWF5TmSPJGX2yY+dcVVi7WOul/mlucWi/eWr0/ttaOO+zrvkgfFXa9EL4nhZ+2mraoXLMyJMeLPgLPNq1sAAIDUUJcZKNTCI/BUDOfvO0rIuO24Pu3F3Bg1oKWvzh0ifn7wOPF/X95BTcmXZHz4m3sUBto8M6ANAaH7z5wtenfI1sm/7qTpmdu0mQIP0wZ0ytzK0h3TQpTNWLTMPyNXvufJ/ewHlTQtuWIHY/t5BNUvP3yCaHSWz+m7DhV9Q9a2DquU5zBqtChcblZsP4a/O+txKzVYnA39eTu0No/RkBuUzovM6AybLGp6S+V+AslLklm3uo/XZDN8t7kWsHs55fZhSXHvK/Ur2Ha8+D7VS16cq+VO/NPTqpesWRfdmwm62/hw1cbMdvAZn+3B9soDoJoRgAYAAKkrZjyjmK8FxKFnQBfTUTP6i6fP3U3cfOrM2CUyZCbv5yf2FqN7NV3G7WYTZPjbCXYDPU7pXxhc9QxAG473+3duEA9/cxex6KK9nOcKVy85LX88fqq46PNj1D1/h07po3oenPf89Dsr1B1/3dvVG/eXxVwrPzeup2jvEQDde2xP8eL3dxdf3XWImpLVuU3yg9qWMgO6tuBEVPa+7TxNH9gpVBBX3x69XkbWr/bz1KIV4r+W65qfoBIl5WrT1vxSE0meaD/+mqfFLc994FmCo6U2fkBc7n2laVVaFyIrOIzklliyvvXPF1Uv2N3aIKJegk4eAs0BAWgAAJC6Eh7bA2XLK/OxWDo2tCwIRqXBJjY2c7DdQI+m+Y1a4kMG3n995CSx45DO4qqjJqmpxVdf28J6oMuTdhooDp7sXdvfNsful4dNEG3ra41BziRrdgfZa0x31bMn19uklfI7SmZRuuUWf5h5ChWAVrc5Xn85MCAD+uDfPCZOCJmFWoz9TSnc+Mz74rGFhfXU4/jq35/zHIQw7jYqB6p2cwegTYH0binVYLfdXxXbomXrVC/Yi++vVD1/qzdmB5YEmjMC0AAAIHWU4AAKhQkaVbK0s0u9lqPNy+4xurv48xemiXmjwgdC49BnbaOWTelFnrT47udGiYsPHCtatywsu2CTVX/W7sMymceSXn9YKvfVMo31qZwCo7nvy9qEs1xz5Rz05Zfk8uzV3r80RPks5WSdecPzqmfHNoPZKwN6pyH5AeSwfn/MFNXLkifBcoq5/ZfrwHymGt9eLrv3TdH/7NvE6x+tEVMvvEdNLVSmbxUoKgLQAAAgdWV0bA+UjXIP9CUl7e2/uQTypfVbtoo2dTXi4Ml9xH4TeqmpWXIxfH3eMHXPm3t5tTCOAla85dmpTbwBMKtRbnvp1rY+VD3vIP9+6cPMrb49Jrl9NqfvevcAgWHJskU28mpAuxbucbP6q1408plOnZ0dPFaeNNh9VLdMXzKejEkpeGoKyg7q0qB6lUUOjOiPCDRAABoAAKSumMekzej4FxVOP9APO6BXpUg7u9QzA7qC9ga2MXR3wGaXYfmDR959xs6Zus5B6mqaDgENCdBFPTESJcCadkZ9qbnf3l9PnCb+ccoMz4Eaw1izMVvHV19+Rc3+TumljpjWV/WK59qn3s3cfrjKPls2x3ZAurwSHK7ITdzsePmRyyshbjltlvjP6TuJGtfzmVYH04CuSTAtBnnipRq5s8yB5ooANAAASF1dTfF+eKdzmASkr1pHyU87oOkVkNTrnJYT/ZM2ZyIXcgfb9bcdVLM3x11D2RS8L2ZAMsprFXH2SsJ94kR+d07q11G8k8AAZnL38uL7q8TDby5VU7KKuTzTeqk06oIHueOlJZnbvzz+TuY2FMtdvVcJjiT2qXLbG9envWioq1FTshavLAyop3Vy1PSd98Wds5nZ1aahZf5yBpojAtAAACAVh6uMpFmDO4k+Hf3rQiapWoN4qH7lWg8zrrQzVrdsK7wW/rQ5g8Quw/MzhMuJHkDqb5nh6l5Foi7W1q5ASNfGwmzDJIJbaarWKwVy0lr+Mov1c5c/rO41KfOP20op3sNz72UHn1u6ZnPmNgz7DGjVcbj3o3FPEvn9/Zsfr1W9JivWh3+PNkzb8oxBnVSvuvDbFHD2Y+oWAAAgURfsN1o89I054prjpsY+WAKag+otwaE6AWwG0DPR/+6C/UeLs3YfXvT9zpHT7csA6PNmO6+9OjSdzIsSz+jRrl7McWWGn7DjANVrUu6lS0Z0b1Q9IYa7+pVqD20AzLRO2Jxz00uqly/J1wt6Kq/1PMy2U27WbsqWNgny1KLlYuef3CdO+tPTYovlzj7NDGgvpvXBdtDEsO5QdcndZK1rmbhQbar9xBlggwA0AABIhTzQ7NOxdeIj+QchyQSVqnpLcNhFS9rU+1+iPKSrucSEXkaiVItRBr3TvnxcDkAYx7+/umNevVdTXVLLj6tkzt17pOjZrl40Osvi/P1Gq6mVq4VWiHv7NKOLBsX8vL1e6/x9Y36OJVxp5UkdGwf9+rFMKZX/vPKR2LzVbgRDr0EI0zpJIRVz9bv5ucWq10S+NfdVGqXytyeyNb6TUq1XOAFhEIAGAABVJYlamUApNPcMaHeAxeQPx05RvXzugKpUqsXYrlWtOHv+cNHblaWcpn6dGlTPXvvW+bVyzTWgVadMyXq/D39zF/HkObuKKf07qqnpaOkasDEtQet92pJ89aDs+ZXrt6hevrhXK5RyCRZrf+M+MZFmADruZxHGyB5tVS9LvrR8/SKfgzH6wf+9rHpZOw7prHrRkAENEIAGAABV5rYXCy/pBCrBp1V6hGobLAkKfDR6ZEjrF1mUOnZRrES3wV3biK/sMlgM7dZG/P6YyWpqOKZAz5qNdiUFSkkG41q1THZw2+NnFZYjkZnWaUsq3te3o10dcd3rHxXW/K00SSzDM+cNVb1wilEGRt9Ot0sxirMypXrPJsfM7Kd6Wbd+aYfMrenEWLFt3GKXpW7Lnc0ONFcEoAEAQNX7wb6jVA8oX9VQgsNUu9M2AL107SbVCyfNbMAo6mr9D7H+duI01YvvjHnDxH9O31nMHdFNTQmrcNlV64mQIKYTHAdP6aN66bFZe71OvrhFjdk9uWi56sVXqk0xbt1yWcpl/4m91T17MqjYqU3+VQVp0AOyae7zbnm+sCxGWl9N7vdxgLP8R/dql+kXMwvbiz4Lcb+fGYQQcLZ5dQsAAFC1Dp1SuQMcofmohrhfx4Y61WuSVCjBq26qHowp9WK85ODxqmcWtS7+13YdonrJMQUt3QOfNSemdz2hTwfVS49NsO2rc4M/+6hBu2rIzJRv/Yhp0b/nW9e2iBTAf+adFaqXLn0fl2aCcDFP6Ll3Ne6XDTMPxaqtHHc7If4MONu2ugUAAKhaxajjCcRVrRlSacczihkwsTGuT3vVM4syt/88daZVEDIsU9CyWAHJ7+9TZlemaNvfsTP7ixmDCjP6k2azPhw9o7/qeWvug5x9Y4/hYvawLmJc72wWbRhyyUXJopb77GIs9mJmQKcZ3NY5S0/18l9XG5fTV7H2V5/GrMhBBjRAABoAAAAoC9WQiWiS1OXUXkvnv+/mZyHuMDjeYFFp81oesgyAl4l9OyS2HN1MwaZiBUoOj5Gxmgb9XZ9XpAC5zedqcxJ1cNf0axGXqw9XbcwMAnrNcVPF30+aoaaGE2XzeuuTtUW5ckUfqDKFXcFn4u5nWrdsIV7/aI346Z0LxKsfrlZTzdzLzh1UDxNgL9YVG3FL1RCABghAAwAAAGVhWcQayM2F1/H7c++tVL2sHkUYOC4Or9jKUdPzB+QqBlPW59ZtxQmURC1FUm3iZJwePaNpnfmhzwkMP20t6kvbivFWYrn2yXdVT0QenDLKvJ9z00tFCSzKQTfd0syA7tC6VvWauDOVg3RuUyfmXfKguPy+N8X8Sx/yzcx3Lzt34DtMEDxuZrKNd5etV73oCEADBKABAACAsvDc+6tUr3JFCYucbzlIqO0BfH1ttABUsfgtoyQuf9cv1/djivNs8qi1HVdjXXKBzjSUKj4UJ5bYs30r1ROie7t6seOQ8Nn/YdaXIOVSP9wURPWTCZJGXAx+bzmpOLH+GekZ0Uk6xDBmxtYQad76ftrvT93/5n5LS1ZvUD1/T769XNz24ofqXrJ6tmvathZ8tEb1oitGpjxQ7ghAAwCAqtapIf0R6oEkjO7ZVvWqz05Du6heoa5t7TKWG1qWdwDTll/2YhKZjS1DZBabXi6tAHTJ0mMthcnyTFKU2sM5euy4LsJ4B37rXJfGwkFFvVyw/2jRv1ODuldaLbYPtxzkJx/1c/DL8JX/lERtbv0zSmA34alfx9aqF41eSmrNxi2qZ+BaNu51+ZE3l6mev4N/85g484bn1T1vsixIWA11TX+zLYE060+JQAMEoAEAQHUbWcVBPVSXajg+HesaAMydtXfVUZPE1cdNUffy5YIrsoarl2HdGkU7j6xG+W+VxC/jVL/UPoqaECN4mYKP9bXpHCImEVxPU2N9uKzZpMRZLHrQdM7wrqonxNBubVTPn986VxtifZzQp4O4cP8xmUz3KIHwXq5s7rhqQm5Hct2M+jkE7beT2K/r55TSqAefY9p/bAtRlmfLtvxgrV/83b1s0tw/RHluGUh/8f1VYtWGLaEywL0ksR4AlY4ANAAAqCpRMl2AcpBEplypHTOzf2YQwJ7t6sX1J09XU7NlMeYMawqOueVCA+P6tFe9Ql+ZO0T1Ck0b2FH1KoMeoHFLYh0IU1vZFGwaktJgdgnE1lMl6yl3VFfMnPe5kZnbYogTd9P/9tApfcUhk/uIWYM7iV8fOUlN9ef38rZXJ0gyg7xPx9bi8W/PFU9+e1c11Z7fVRJhhS0rIq+UilqTPKg0UBK1f9MsuaEzBbe3hIiebg5xBYV72bhfdcbATqpXOm99sk587vKHxcTz7xJLVm1UU6Orhu93IC4C0AAAoKroB2r85kelSCJQUWoyiPOXE6aJR87eRUzqZxcYzl0t7xdi8YsnVdpiW7Z2s+oV2pLAAIBhsj+7NtaLiX3zA/9+AfI40szaTELrljXiwW/MEXedvpM4dtYANbUYoi8XfZnKwOuPDxwr/nrCdDGwi2UGtM/n8rODx6lesNx22FBX43m1gp8v7JDcMg9zFYC089AuvldgtPd5Pw+98YnqmSWxX0/iyoicfcf3VD2zCYYTgVtD7BP0fZjfu3/23aYBZJevbyrVMV7bJ8UVJ/grM6F/eNur6l50ZEADBKABAECV0Q/2qiGoh+YhpbhfSYQJNuYe6xdj8Xu+DVu2qV5lCLFoMuaN7KZ6dsIOwvi3E5sy1WWgbVj3dDKgQ77tkmhTVyOGFLmkS9j1wS2JZeq33Q2yDGJLg7vmP/bI6YWD2fmRfy/L9Jy71wg1JbqwGdC5AO+JO5qD4PNHd1e9Qtc//b7qma1yBVajCvt+TBpayqtQuojv7O2f3S+z2HVhSlDoNaD9gr//en6x6glxq6ufdMZ3qzK4Mq5cBugESokANAAAqCr6cRK/+VHOhruCfXNHmEtUVLtcBqZfkFkPari9u3y96lWGsLGVsGWFwta/lQHrJ789NxP4u/7kGZFLEQRJOKZUNeLEFpNYpmFOFvnRT3wEBTpNZJmeE3YcKNrWxxtwNOw2kBN28EIbSQSPkwjI/u6YKeLq46aKzm3sB5bM2Rriyow22mcXJfM3gUWWJ8n64lGRDAEQgAYAAFWGDGhUkiuPnCR2HdFNnLzTQN8su2qWCzb4BR3Wb96qeoWm9O+gepVBHzjO7Wu7Fta6ntw/XI3rKLEqWetXBv6Gppr9m3BUqUqcMnuw6sn+INWz41fOxVYSAVKTupoWkQPkcYPi+4zzLzPhJY1zL698uFr1okuiBEecRbr1U/vLc5avy18nTb/BZJkf/XFuSZYckcrhVyA1oAEC0AAAoMroBztje7dTPaD8DOjcIH53zGTxrT1HJJaJWKmOi1h397Q5g0XLmuxhjd9gheViqE+Ji1aG8hmHTQ1XyqBc16OU4pwVT2Zn3vjFGeKiz48RX96lKRhtY8FHa1QvujQ/lzYto2Uyh12FD5jYW/WyjpzeT/XC8cqA1p/fbe5w/ytXjvr9k2LhJ2vVvWiS+IxeixEId9d1lgME5va3NvTfZCvWbRZDzvl3ZnA/L351yaMoh9hviBg+ULUIQAMAgKqiB7G+tutQ1QNQzmYN7ixO3nmgupfPL6gqB4979OxdxLUnThdfq4AAtN/l4Hr5i+/uPTJ2hmpuALUHzpqduS2Vc1y1fb+xxzDVgySz3A+d2jezLofRMoGU3bAnLDqEGGBQDkgYRdg1/qzd89enMAFSN6/SHZ18ylbc89rHqudtl589oHrRJBGQfePj6EFw9yCEndq0FP/+6o7i15mrd4LLRq3fnF+j/8Lbgwf0SzorvxyuhONqPIAANAAAqDIyA/LQKX0yGUsvnDcv8gEwgOL71vxoA5DJuqYzBnVK/NLtYqvVAmdrNnqXHvHSUwtwP3PubuLNC+aLfp0a1JTS2HtsT3H+fqPFt/ccLo6PmO2OfFEDrW5vL12nena6NNrXEG6oizb4W9igeH1t/nKQ5T+i8Ap8lnqvkkRANk4M2z0Iofxs5OCUe4zubrWc//Dw22Ldpq3ihqffE68tWW21vi1euUH1klEOsZxim78AACWRSURBVN9KG6sASAMBaAAAUFXa1NWIiw4YK3528DjRtt4+UwtA+Sp1AKhYWrbIf6eX3P266tm7cP/RmVIeMmj11xOmZW5rUhpYMAw5H0dN7ydO2mlQwYB1iKZWW1+Kwa+GuU5+H0cRN+M3asDW63Vl1m9a7v36zoE1q5MIQDdELIci3fTsB6qXvy+2OeG3ZNVG8ZM7F4izbnxB7P+rR61Oqv31iXdVLxlJx58bI6zXP7wtOPMbqHYEoAEAAACUDFcmN9FLcETRu0Nr8fi352bKksiyJqgOJ+xQmDX++MLlqldae4/toXr5ol6BVKrzJV6va6rNnpSBXdqIyw6bIBZdtJeaUiiJEhz7T+ylevG4Z+XEHYOvZJDZ09c8uijT37BlWyJ1y8OKv/TyucsJAbBHABoAAABAyRB/bpJEAFpq16pWdGtbr+6hGpw9f3hBoHftJv9sUr9641F0bGhZ8JqXHz7BaRPVvXxRA9A1HoMBhvH13bzHf+jqKiOy+6huqldYvianWAN7/viAMaqXL4kM6KSC6O456doYvI/Z5irfUSq9OiS7HcwfbT7hAsAfAWgAAAAARXH+vqNUr4lNaKVI8Z/EXHmEOSAXJKkANKqPLKMixzhwCwoqyoHikjR7WBfxgVafV9b29hK1BMd39o6fYfplZ1ldfOBYMaZXO7HbyKYgsyQzWHcc0lnMGNgpU5c8Z+7w/MflFGv3c8iUvqqXr0UCO8AksqgldzDe5jzB1k+bBjD0k9bApA0tW4gfGL534qgpQekboBrwCwcAAABAUXRqYz+AWSWbPyZahlzLGgIb8KYHETs0+I9zMLR7G9Xz9tODxqle8lq3jJZ1O29k91ADVXrVOD94ch9x65d3ECfuOFBNyZKZ3H/+wjRx7UnT87J4vQKqxTwBZspaTyAhPNR7kEFbL+7nsclUt4w/iw6tk6+zff3JM8QT5+wqerQLzoDu3aGV+Nqu+Sd4vNQlMPgn0Byx5QAAAAAoCtOV5DYXaBczAFRKZEDDj74djOnVXvXMbLJe9xvvPwBenpDVFMb18Z8/L3Jwu4On9Fb3goXNtPYaSNEr01hm/coBNHVdXKU8kmLKrk2iBEeY57ju5BmqV8i97Gwys20zoG92DXSYFFlqJcy6YZslXg6DugKViC0HAAAAQFHYDDjYuU3ymXCVggA0wgiKl9msT2GCaW8vW6d6djrGyGr1ChJH8T9tx+O13PyCtKYSEX6ZwlGZ5iGJ8hlhnmN0r3aqV8j9NDaZ2bY1oFdvbKotfm5Cg/xt2eYd/NazmH+43+hEAv0AvPELBwAAAEBR2MRA6g11bZMIwFQCAtDwU+qt4Nl3V6qenf6dG1Qv68L9zYPsmSQZC2ylBYqHdmtUvXx+gw021teKv504Td3L2mZzRi0k074uicBoUrtQ99PYlODYahmAdp8kGNs7Wua8zu+l5aCebeuz2dEHTuotdh7aJbFlBMCMXzgAAAAAisIUsLDJTkwqIFHuWhKARhkbH7KkxuCu+TWoB2gBaT9+weCw5ECEblGvspCDFsrAZY5tfeO4bEpdDOvWKE6dPUjdK5TGSTybDOit28IH6YuRiNyuVa146txdxbPf2S1TB12ub0kM9gjAG79wAAAAABTFzsO6qJ43U6AkTOCqkpnqvwJeUkjA9dW2lf+gh0H+F6KIdJKxQBlcvPfrO4sv7DAgc+sX3PYbOFH+3T7jmmpm25aXiEvWxNb99ujJmRIgMsh/6aHjM9nZX9t1qBjdq62xNEhSAegbnnlf9ewyoDf7lMHw8uqHq1Uvnk99NhD5T3U1LUSHhqaTEc3lShugVAhAAwAAACgKmxITzTkE0FKrSwq49WzfSvXi69uxtfjZQePUPTuNIQf7iyPpYODALm3Ed/Yembn1s9vIbqpn5i6HkUYJjjc/Xqt6TUyZuXI+n/nObuKu03cS+47vJTq1qcvsP2790g6Z6bo0soptnnOHwZ1Vz597USYV1/cNQKtbN1OgH0By+IUDAAAAoGh2HOIfkEjy0vtKQwkO+DHVR4/qwW/MEQdM6q3uecsFqWu2306cE3dwuBCBRb+9QJpxQj3wPbZ3fvkO979/smaT6qXLK9FYrg/6/lLeN9bRT2Gh2eyrh/cw19vWuYPFe4zurnrx+J0f0Es/ScSfgXTxCwcAAABA0cjLnv3oMYCbTp2petWva9s61QNshIjoRiSD1DKr9qFvzomdgb1pq305Br8MaPfghvW1yYY03l2+XvWyLjt0guplbYlQUsKLrClt44mFy1UvurAZ5Z3bJLMvWrl+i+r5c6/J8mRHEoJKcOiIPwPpIgANAAAAoGj0OIgeB9hleFfVE2JC3/ZO66DuVb+g4DyQrzghszG924ke7eKX/1i90S4YKfnFS0f2aCs+N65nZuC9606aoaYm45l3VqheVpp12b+1Z9OAhn6WrdusetGZMn797DayaT/s56qjJmU+By8bt2xTPXvuMidx+JXy6GQYiDLcEsoXMr4PNEsEoAEAAAAUTVBs4fTdhoqdh3YR4/u0F5cekp99CKBJ1DhdqYJlAzv7119285vHVrUtxC8PmyDuPH0nMc7ZT6RJLzORZBmUxvp4gzqGETaoa5sxPW9Ud3HtSdPVvUKPvrVM9fy5A+RJlQvxy4B2n+jMiRP4fuF788ReY3uoewBMCEADAAAAKBo9sDGqZ1vVy2qoqxF/PH6quPm0WaJvp9ZqKgBdlEByr/atxA0nJ5s17OcPx04W/Zzt+NiZ/TOZ1EmoKWKt9NUb8rO2OzYUZs5GtW7TVtVLX+uW4QaQDLNu+cVt9YxyL21cA1yGLRfixS/r21S/2rZciIk8mdAlobIlQLUiAA0AAACgaPTstq6N9aoHIIyhPqUPvDz8zTlicv+O6l76dhneTTxw1hxx3j6j1BQ7m33qRRdzrM6t2wqDmEmViNjqVyOixLbzKO9iqs9sMxhhkLN2bypH0sLwfI+evYvq2RsScvv402OLVC+apNYLoFoRgAYAAABQNElltwHN0Z+/MDWThTttQEdx+NS+aqq9JIKFpSavkkjLxL75JT1MQcWgQKOpvINJmvHK3x49WfWi8Zo3WSJJl8Qq1c01AOv2hihV+9a1YtFFe6l7dtqGLHESd9tIavBEoFoRgAYAAABQNM35EH1qETNPUZ12HNJFPHXOruK6k2dYlaK4+4ydVa+y+AUDt2xNL3NYr8s8okdhFq1fdrb01blDVK904u5rvJa/6QRiEicV3U9hyoAuRnax6XXDeHLRctUDYEIAGgAAAEDRNNckMRnb+MlBY9U9ILowwbjBXduI/Sf0yvSPmdEvc1vprnvqXdVLnr5so2TFNtQlN1BhVO1a14qvzB0iOrepEz/cb7Saau+IaebsetOql8w+velJjFnnMYPDZxgyt3Vxg9zPvrtS9QCYEIAGAAAAUDQn7DhQ9YQ4LEIJgUrxg32bat7uN76nWHD+fNGvU4OaYqcxxVIDaD4uOWS8eObcXcX39w0fiPTTtj699dMvFLhu8zbVS14S2bzbPhWib8fgAVS96iwnRQZdnzpnrjhyevgTD161+WsNWfdJvA937NcU9M8Fhzu3iTYI5NwRwWVRaloEv4/pA7OZ5ZceOj5zK/3lC9NUD4AfAtAAAAAAimZ0r3biyiMmirN2HybO3qNp4Klqc9T0fuJfX5olnjxnrvjFoRNEy5rwh143O38PJKFTm6Yau0lJcwg9vzjwoC7hTuSEkcQAh5/+739W2bTd2xUGeb/3uZGql4yodY1NdZgl034sgZh94Hzm/n2HwZ0zt2HZBMk/WLFB9bzlPte9x/bMfI9dfewUMWtwp8w0WZsdgDcC0AAAAACKav6YHuK0OYMzl4lXKxkwGdu7vWcmoZfXzt9DHDuzv/jT8VPFoC5t1FSgefELGP7rSzuoXvLilmGQtn36P6uc4C6NhScFjpnRX5w5L7hcRNq8MsF7dWilek38ssZtTxbYLvUDJ/VRvXAC4tsZW53PLUjuvcr1RH6PzRne9bPguE3WO9CcEYBunno77Q9OW+y0TU5b5LRfOK2D08KQ15/Iv5N/L59HPp98Xvn8umOdJvfofi29a6kAAACAClBf20Kct88osdPQLmoKUKbkEVxK6mvzQxXypMyjZ+8i3rxgvmhIsTSN3P7ikhnQUW2//XbiS7uUfhBDr6DyTkMK90t+wV3bgL5NgFiKciVJkvw+Wtv3ADRXBKCbn0FOe8ZpxzntSadd4rSFTvuq0x5zWvb6kWDycfLx8u/ecpp8Hvl88nnl8zcV98t6zmnf92j3Ok36t7oFAAAAAJSxFOPPomvb/CsHOjW0FD3btxI1SdTI8JFEDegBndMrEVIsXiU4TAFlv2Vmk1Us2daRbt0y2gkCm3MCvZz1K0idTwBcfwe50hwAsghANz9XOE1W4P+K0/Zz2tlO28VpMoA8zGkXOM3GhU6T1wbJv5vrNPk88vlkQFo+v3wdNxmAPs+j5a5VuUrdAgAAAACQkWaw2+31j9aoXnhT+ncQfzx+qmisry2MRlaYMIF4vyRnWY7ExtpNW1XP38gebVWvUE9DTe2c/1msQf06BZfQqPcJgI/smT9vx88aoHpCTBuQHbwQaM4IQDcvMit5ntNkyYxfyQku33PaOqcd5bSgU7by3+Xj5OPl37ld7jT5/Ls7Tc+CNpFDMU932gdOu01OAAAAAACUt//FKDURVrFe6oX3V6leeLJ0zs5VUjonTADabwDBDZuTrbIpS5T8+IAx6l6Txroa34E2bdaf2cOCPzu/pbKjVp6k1pWtX+rSIUA5YCtoXmSms/Qfp32a7X5Gnup9xGnytJ8MCPuZ4TR5fYp8vH6KWD6vfH5pjrr1c7K6/b3TqAENAAAAAMhjk8Faau4gZ0PL9OpUF4Nl6eZAH6+RQ0UFC/P5moK5fTq29q3BLP89yJT+wVnKZ+zmPUDkuN7tVU+IxvqavHIlW7eV//oLpI0AdPMiS2xIr6tb3RvqNmjY3aSeRwaxj3SaDFr/Tk6wJGtMm9pwpwEAAAAAUnDKbDmkUNZpuwxWvfQN69aoeuVLBh1zLj5wrOpVJr+s5mJr16pW9bJaGApUHz2jn1i5fou6V0g+xxVHTBR7je0h/nHKTDU1X/9OwbW7B3Zpo3qFurerF5ceOl7sP6GXuO6kGXlZ5NuKeLUAUK4IQDcv7dSt13VFuelNp+7Mknqeg50mHyMHH3xPTgAAAAAAlKcvzRksTtppoDh19qC8Grdp+MsXpmUGhpNBwz1Gd1dTy1c/VwBzhE+tYhTyi8/K9c2tRkvPlsHngyb3Ee8uX6+mmO05pof41eETxaR+HdSUfB0aWqpedPuO7yUuOWR8ph50TYum+fzUshY2UM0IQMMtt4eMu3e0fZ6T1O1v1K2tSR7tNacBAAAAAFLQUFcjvr3nCPGNPYaL+lrvAdmSsMOQzuLhb87JBA3LKSO32Lo0etc2LhedfeovJ+1TLVr99XnD8spdlAt3BvRWAtAAAehmJpeZnMtg1uVO03plNuck8TwjnSavfXnfabfLCQAAAAAA5JRj4Ll96/ySEGlrUaJlEOZlrzluiupF45cBvWbjVtXL0uspF3MwzDD6dmwtzt93lLhg/9GZKwaA5o4AdPOyQN161WYeom69ajvnJPE8DD4IAAAAACgbR0zrq3re6gyD4KVJz/gtljBh79G9vHLT7PRsX696hW57cbHqZdW2yF/+eo3ociEz14+a0d9Zp/qJeaPKv4QMkDYC0M3Lfep2ntP0z16O6jDLaRuc9ric4EP+u3ycfLw+GoR8Xvn8Uu71dPLb5SinycEHZQAaAAAAAICSat0yuKzIdqFCs2Z6HWM/parecO5e8qLl4ujQ2r7+shZ/LlqW/OEWJycAeCMA3by85bT/OK2/006TE1y+7zQ5asKfnLZOTlCGq+a21ml/dpp8/HlygsuXnCaf/06nLZQTDA5ymqz8L0tvMPggAAAAAKDk3HV7vWzeJvOoiqdUJSaOmF68gGuYGHKL7c1hrCe/PVf1hLj62GglQfzOC+w3vpfqAYiCAHTzc6rTPnbaZU672Wk/ctq9TjvdabJkxjlOc3tVNd23nSYff4bT7nGafB75fJc6TT6/HuB2yw0+eJW6BQAAAACgtCwCocvXbVa96MKElEtV4biuJt1BJm1N6d9R9bL0DOicrm3rxZsXzBev/GB3MWd4VzU1nMn98l/L7cUPgobKAuCHAHTzI7OgJzvtGqdNc9rXnSYr4suA9AynLXOaDfk4+Xj5d4OdJp9HPt/VTpvkNPk6JiOctoPTGHwQAAAAAFA2bDKgkxAmq7lUNaDDOnOe1xBRwfzKaPRq30r1svw+o5oW24vWLWvUvfB+dvA40aNdvejWtk6cu5cMXTQJUzYFQCEC0M2TLHtxnNN6OE0WW+rntK86bbnTdHIv67WnlY+Xfyf/Xj6PfL7jnSaDy15kNrV8vj5OY/BBAAAAAEBZGNe7veqVj09LVQQ6pBN2HCh+fMAYccH+o9WUZOjBiIa66AHmIH06thYPfWOOePibu4hBXdqoqVnbE4AGYiEADQAAAAAAmr3dR3UTB03qLYZ1axQ3flFe8JuceSO7qZ4Q80fL3C1vXRrrVE+Ifp3k0EulN7hrfkBWV1/bQhwypa/YaUgXNSUddTXphrFkFnWt0/SAc58O+ZnYAMIhAA0AAAAAAJo9WQriJweNE3eevpOYrNUe9rPriKbgspcf7jdaTO7XQUx1nve8fUapqWa/P2ZyJtDaumULcckh49XU0tpiOfhi0pnCenmOYpVJWbR0nepljezZVvUAREEAGgAAAAAAICLTwHiN9U2lImRdYTlI3o2nzBTXf3FGXoazydje7cXj35orHv/23MDM42LZvNUyAJ1AfHh8n6ZSKLuP6q56WcUKQOsB9+08K5MCsEEAGgAAAAAAICJTcPKmU2eKhpYtRH3t9uJ3x0xWU+11aGgp2tbXqnult8kyAN0igQDxLw+bII6Y1ldcfODYgszjIsWfCwLdlIAG4iEADQAAAAAAkKDBXRszGcxPnrOrGNWznZpauQ6b2kf1/OklM6KQgwFesP8YcfDkwtcsVgZ0Cy3iXKzXBaoVAWgAAAAAAAALVxwxUfWCNdbXllUWc1hnzx+uekKcOW+Y6vnbbFkrOqpiZSLrAWjiz0A8BKABAAAAAAAszB/dXZw5b6i6V92+uPMgsfDCPcWii/ayzmzuFlDfOq4kMqxtFAagiUADcRCABgAAAAAAsCADkV/aZYjo07GVmiLEDkM6q1712T5kyrEeuE1a0TKgtYAz8WcgHgLQAAAAAAAAIfz+mCliUr8OYv8JvcRhU/uqqZAB+jSDtd3b1ateyrT3QPwZiIcANAAAAAAAQAhDuzWKf5wyU1xyyPjUs34rjZ49nKTWLWvE746eLPYd3zOz/NPCJwokiwA0AAAAAAAAEhG2bEdYu47sJi49dEImAz0t/1O3AJJBABoAAAAAAACJCJMBfezM/qpX3hiEEIiHADQAAAAAAAASYVOS5Pv7jBK/PXqy+PaeI9SU8tKhdUvVy2pV20L1AERBABoAAAAAAACJsKnAIQcT3G1kN9GypjzDUjsN7ax6WdT5BuIhAA0AAAAAAIBE2ARrty/zkhZ1NS3EF3celOmfvuvQzC2A6AhAAwAAAAAAIBE2AehKyCc+e/5w8eYF88VXdx2ipgCIigA0AAAAAAAAEmETgH7zk7WqV95qWhA2A5LAlgQAAAAAAIBEtLAor3H/go9VD0BzQAAaAAAAAAAAidjeIgO6lsxioFlhiwcAAAAAAEAibEpwEIAGmhe2eAAAAAAAACTCpgTH5q2fqh6A5oAANAAAAAAAABJhkwHdo1296gFoDghAAwAAAAAAIBE2AeiWNYSjgOaELR4AAAAAAACJ2N6iBAcBaKB5YYsHAAAAAABAIsiABqBjiwcAAAAAAEAibALQdTUtVA9Ac0AAGgAAAAAAAImosQpAE44CmhO2eAAAAAAAACTirU/Wql6T7+w9UvWyCEADzQtbPAAAAAAAABKxYv0W1WsybUBH1cuqbUE4CmhO2OIBAAAAAACQmu23yy/L0bWxTvUANAcEoAEAAAAAAJAafWDCWUM6qx6A5oAANAAAAAAAAFKjj0toM1AhgOpBABoAAAAAAACp2U4rwaFnRAOobgSgAQAAAAAAkBo94NxCC0gDqG4EoAEAAAAAAJAaPeGZDGigeSEADQAAAAAAgNT873+qo+glOQBUNwLQAAAAAAAASI0WfwbQzBCABgAAAAAAQGr+p6dAA2hWCEADAAAAAAAgEVMHdFS9JoSfgeaNADQAAAAAAAAS0cJQ35kMaKB5IwANAAAAAACARJwxb6jqNenYUKd6AJojAtAAAAAAAABIxOR+HVSvSceGluLs+cPF4K5txGWHTVBTATQXBKABAAAAAACQiO0MJTikL+48SNx9xs5in3E91RQAzQUBaAAAAAAAAABAKghAAwAAAAAAIDGzBndSPQAgAA0AAAAAAIAEbef8BwA5BKABAAAAAAAAAKkgAA0AAAAAAAAASAUBaAAAAAAAACRmzvCuqifE8O6NqgeguSIADQAAAAAAgMQcPaOf2G98TzFtQEdxxRET1VQAzRUBaAAAAAAAACSmtsX24heHThDXnTxDDOzSRk0F0FwRgAYAAAAAAAAApIIANAAAAAAAAAAgFQSgAQAAAAAAAACpIAANAAAAAAAAAEgFAWgAAAAAAAAAQCoIQAMAAAAAAAAAUkEAGgAAAAAAAACQCgLQAAAAAAAAAIBUEIAGAAAAAAAAAKSCADQAAAAAAAAAIBUEoAEAAAAAAAAAqSAADQAAAAAAAABIBQFoAAAAAAAAAEAqCEADAAAAAAAAAFJBABoAAAAAAAAAkAoC0AAAAAAAAACAVBCABgAAAAAAAACkggA0AAAAAAAAACAVBKABAAAAAAAAAKkgAA0AAAAAAAAASAUBaAAAAAAAAABAKghAAwAAAAAAAABSQQAaAAAAAAAAAJAKAtAAAAAAAAAAgFQQgAYAAAAAAAAApIIANAAAAAAAAAAgFQSgAQAAAAAAAACpIAANAAAAAAAAAEgFAWgAAAAAAAAAQCoIQAMAAAAAAAAAUkEAGgAAAAAAAACQiu3ULVANlrVq1arjiBEj1F0AAAAAAADE8eqrr4oNGzYsd7qdslOAcAhAo5q87bS2TluUuVfZhqvb19QtACAc9qMAEA/7UQCIp5r2o/2dttppAzL3AABV4RnVAADRsB8FgHjYjwJAPOxHAYUa0AAAAAAAAACAVBCABgAAAAAAAACkggA0AAAAAAAAACAVBKABAAAAAAAAAKkgAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgLPR22h+ctthpm5y2yGm/cFoHpwEA/B3otF867SGnrXba/5z2F6cBAIJ1ctoJTrvJaW86bYPTVjntYad9wWnbOw0AEOzHTrvHae85Te5LlzvtWad9z2lyXwsAQMkMctpHTpMBk5uddpHT7lX3X3MaX1QA4O85p8l95hqnvar6BKABwM4XnSb3mzIR4q9O+5HTZGLESqfJ6Tc6bTunAQD8bXba406T+1B5XC8TJJ5ymtyXfuC0Pk4DAKAk7nSa/EL6cuZek587TU7/deYeAMDLHKcNcZoMkMx2mtx3EoAGADu7OO1zTtMznbs77V2nyX3qAXICAMBXvbrVXeA0uS+9InMPAIAiG+g0+UX0ttP0H/2NTlvrtHVOa5ATAACBCEADQHK+7TS5T5VZfACAaMY5Te5L78rcA5oR6ngB5UFmnEj/cdqn2e5n5KXkjzittdOmywkAAABAEW1Rt1vVLQAgPHmVifSCugWaDQLQQHkYpm5fV7e6N9TtUHULAAAAFEON047OdsUd6hYAEOxMp53ntEucJgfJPt9pMvgs60IDAFB0VzlNXoojRx43ydWK+lbmHgAgCCU4ACAZP3Wa3J/elrkHALC1xGly/5lr/3ZaN6cBzQ4Z0EBlyI04Lr+0AAAAgGL4itO+7rTXnHaUnAAAsCYHcZXH8vL2806TYz8967SJTgOaFQLQQHlYpW7bqVtdW3WbexwAAACQptOcdqnTXnHaHKctdxoAILyPnHaT0+Y5rZPT/uQ0oFkhAA2UhwXq1qvG8xB161UjGgAAAEjK15x2udNecpoMPsvLyAEA8bzjNHlSb5TTOssJAAAU0yCnyfIabztNPzHU6LS1TlvvtAY5AQAQiBrQABDNN50m95/yMnECJACQLJkNLfexHTL3AAAosjudJr+Ivpy51+TnTpPTf525BwCwQQAaAML7jtPkvvNpp3WUEwAAoQx3mqz5rJOJZhc4Te5jH5ETgOYkN7AZgNKTWdCPOq2r025x2qtOm+Y0edmjLL0x02nLnAYAMNtPNUn+8N/daQud9pCc4FjqtDOzXQCA5hinXeO0bU77pdNMY48scpp8DADATJYw+onTHnTaW06Tx/DdnLaz0+QghLKk0VynyVIcAACURB+nXe20D5222WmyRpQc/IUMFAAIdp7TZFaJV5OBEwCAWdA+VLb7nQYA8Dbaab9y2nNOk8kPW50mT+g95TS5n+XYHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJnq77T/Oe2azL3yVknzCgAAgGZoe3ULAAAAoHhk0Pj+bBcAAACoXgSgAQAAAAAAAACpIAANAAAAAAAAAEgFAWgAAADA23Cn3ey05U5b57SHnTbPaW7tnHaW0+512vtO2+y0T5z2L6dNd5rbsU6T5TeknZ0m+7l2ntPcpjrtOqd94LRNTvvQaf9x2sFOM5H1oP/utKVO2+i0p522t9MAAACAktlO3QIAAADIkoHct532oNPGOu0lp8nAcw+nHeK0lk473GkyOCzJILN8rGxvOW2F0/o6bR+n1Tntc067w2nSeKft57TvOe0dp7kHD5Q1oXN1oU902pVO2+Y0Gch+w2ldnTbZaSudNttpUm5e5d+NctpCpz3mtI5Ok/Na67RdnXaf0wAAAAAAAAAAJSaDurms5J/ICS4yALzFaTLI3FZOcMgM6M7Zbp7eTlvstFcz9/LJ5/YahHCk0+RryKxrGVTWyefNcc+rDGq77e40Of32zD0AAAAAAAAAQMnlgroy07hRTtDIrGX578dk7vm7zGnysTIj2k1O8wpA/9Jp8t9Pz9zzl5vXRU5rISdoZJa1LMkBAAAAlAQ1oAEAAACz/zptTbabJxc4nqBupVlOu95p7zlN1muWQWHZvuw0qZe6tZGrG/1vdWvjOafJch06OT8dsl0AAACg+AhAAwAAAGYfqVvdEnUrS29I+ztN1n/ey2nPOO1yp53vtO877QGnSbIWtK326lYOPmhLZmubbHUav/kBAABQMvwYBQAAAMy6qVtdd3W7St3KYPNmp8n60HKAwa877btOO89pC5wWVi6YHCZrGgAAAChLBKABAAAAs4lOM9WAnq1un1W3g532itP0wQblb+0dst0CnzrNVLNZelzdzle3AAAAAAAAAIAqkRvYT7afyAkuMst5i9NklnJbOcHxmtNWO61n5l7Wdk6TJThyz5MLWud87DQ5cKDJSKfJ11iu+rre6lbKzascGNFE1quW/w4AAAAAAAAAKAO5oK6s37zCabK+84+cJoO8G5wmB/s7xGk5JztNPl7WjL7CaZc67WmnrXfav5xmCkBf6zQ5/VanyVId5zptJ6flnOg0+TpyQEM5uOEFTvu10+Tz3ue0HALQAAAAAAAAAFBB3EHdEU67xWkyEC0Dyo84bXen6Y512nNOW+e0pU67yWljnCaDy6YAdFen/c1pMmgtA83yMfKxbjOc9g+nyWxpWWN6sdPucNqBTsshAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUSI/wft6luGn1BvSAAAAABJRU5ErkJggg==\" width=\"720\">"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "0d3134811c314b57823fe23ef34cdadb",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=3), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "ad2c7de40f0643b4beef26f93420108e",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=14047), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "54f3630d6560477692180593ce011778",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7024), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.08550577679430618, 'val_loss': 0.08310106061682729}\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "8f32ab80dca140d897468d9e6630258c",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=14047), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "d907b120240c4bf884f6387d03079db9",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7024), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.08331617299123732, 'val_loss': 0.0830357495301821}\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "6787c1055f1c41cfb4ad821ef0d023c3",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=14047), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "a3889add8e9242e287fd8ee9fc231458",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=7024), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'loss': 0.0699179216155444, 'val_loss': 0.08231438588885885}\n",
+      "\n",
+      "0.08231438588885885\n"
+     ]
+    }
+   ],
+   "source": [
+    "%matplotlib nbagg\n",
+    "\n",
+    "num_split=2\n",
+    "np.random.seed(SEED+num_split)\n",
+    "torch.manual_seed(SEED+num_split)\n",
+    "torch.cuda.manual_seed(SEED+num_split)\n",
+    "#torch.backends.cudnn.deterministic = True\n",
+    "idx_train = train_df[train_df.PID.isin(set(split_sid[splits[num_split][0]]))].index.values\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "idx_train.shape\n",
+    "idx_validate.shape\n",
+    "\n",
+    "klr=1\n",
+    "batch_size=32\n",
+    "num_workers=12\n",
+    "num_epochs=3\n",
+    "model_name,version = 'Densenet169_3' , 'classifier_splits'\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   )\n",
+    "\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,'basic_splits',num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "weights = torch.tensor([1.,1.,1.,1.,1.,2.],device=device)\n",
+    "loss_func=my_loss\n",
+    "targets_dataset=D.TensorDataset(torch.tensor(train_df[hemorrhage_types].values,dtype=torch.float))\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "imagedataset = ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                           window_eq=False,equalize=False,rescale=True)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "imagedataset_val = ImageDataset(train_df,transform=transform_val.random,base_path=train_images_dir,\n",
+    "                               window_eq=False,equalize=False,rescale=True)\n",
+    "combined_dataset=DatasetCat([imagedataset,targets_dataset])\n",
+    "combined_dataset_val=DatasetCat([imagedataset_val,targets_dataset])\n",
+    "optimizer_grouped_parameters=get_optimizer_parameters(model,klr)\n",
+    "sampling=simple_sampler(train_df[hemorrhage_types].values[idx_train],0.25)\n",
+    "sample_ratio=1.0\n",
+    "train_dataset=D.Subset(combined_dataset,idx_train)\n",
+    "validate_dataset=D.Subset(combined_dataset_val,idx_validate)\n",
+    "num_train_optimization_steps = num_epochs*(sample_ratio*len(train_dataset)//batch_size+int(len(train_dataset)%batch_size>0))\n",
+    "fig,ax = plt.subplots(figsize=(10,7))\n",
+    "gr=loss_graph(fig,ax,num_epochs,int(num_train_optimization_steps/num_epochs)+1,limits=(0.05,0.2))\n",
+    "sched=WarmupExpCosineWithWarmupRestartsSchedule( t_total=num_train_optimization_steps, cycles=num_epochs,tau=1.5)\n",
+    "optimizer = BertAdam(optimizer_grouped_parameters,lr=klr*1e-3,schedule=sched)\n",
+    "model, optimizer = amp.initialize(model, optimizer, opt_level=\"O1\",verbosity=0)\n",
+    "history,best_model= model_train(model,\n",
+    "                                optimizer,\n",
+    "                                train_dataset,\n",
+    "                                batch_size,\n",
+    "                                num_epochs,\n",
+    "                                loss_func,\n",
+    "                                weights=weights,\n",
+    "                                do_apex=False,\n",
+    "                                model_apexed=True,\n",
+    "                                validate_dataset=validate_dataset,\n",
+    "                                param_schedualer=None,\n",
+    "                                weights_data=None,\n",
+    "                                metric=None,\n",
+    "                                return_model=True,\n",
+    "                                num_workers=num_workers,\n",
+    "                                sampler=None,\n",
+    "                                pre_process = None,\n",
+    "                                graph=gr,\n",
+    "                                call_progress=sendmeemail)\n",
+    "\n",
+    "torch.save(model.state_dict(), models_dir+models_format.format(model_name,version,num_split))\n",
+    "torch.save(best_model.state_dict(), models_dir+models_format.format(model_name,version+'_best',num_split))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "ba44d09f922c4a8e97539f014013f71f",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=28094), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "tensor(0.0846)"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',0\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(mean_change=15,\n",
+    "                      std_change=0,\n",
+    "                      flip=True,\n",
+    "                      zoom=(0.2,0.2),\n",
+    "                      rotate=30,\n",
+    "                      out_size=512,\n",
+    "                      shift=10,\n",
+    "                      normal=False)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "d4d34f6ec3804dee8e8c090bb85d4d08",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=28094), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "tensor(0.0637)"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',0\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "ac31c31d4cd54ed783c0938c4d42bf84",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=28094), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "tensor(0.0837)"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',1\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(mean_change=15,\n",
+    "                      std_change=0,\n",
+    "                      flip=True,\n",
+    "                      zoom=(0.2,0.2),\n",
+    "                      rotate=30,\n",
+    "                      out_size=512,\n",
+    "                      shift=10,\n",
+    "                      normal=False)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',1\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "659f5f254f1c475098adb7cc9882aab8",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=28094), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "tensor(0.0809)"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "tensor(0.0809)"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',2\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(mean_change=15,\n",
+    "                      std_change=0,\n",
+    "                      flip=True,\n",
+    "                      zoom=(0.2,0.2),\n",
+    "                      rotate=30,\n",
+    "                      out_size=512,\n",
+    "                      shift=10,\n",
+    "                      normal=False)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "bec707fc646442b1a4342c7961450960",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=28094), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "tensor(0.0796)"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',2\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=6546), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',0\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "5228633d25f5479288450060305cfeff",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=6546), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',0\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(mean_change=5,\n",
+    "                      std_change=0,\n",
+    "                      flip=True,\n",
+    "                      zoom=(0.15,0),\n",
+    "                      rotate=20,\n",
+    "                      out_size=512,\n",
+    "                      shift=0,\n",
+    "                      normal=False)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "ec96873d08684d1ca62744d0121b1f5d",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=6546), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',1\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "bfc7bca9de484809b77e724e4ca933d6",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=6546), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',1\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(mean_change=5,\n",
+    "                      std_change=0,\n",
+    "                      flip=True,\n",
+    "                      zoom=(0.15,0),\n",
+    "                      rotate=20,\n",
+    "                      out_size=512,\n",
+    "                      shift=0,\n",
+    "                      normal=False)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=6546), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',2\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "90c7eb903cfb4b848ec3e705f8c6e0d7",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=6546), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet169_3' , 'classifier_splits',2\n",
+    "model = MyDenseNet(models.densenet169(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=8,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(mean_change=5,\n",
+    "                      std_change=0,\n",
+    "                      flip=True,\n",
+    "                      zoom=(0.15,0),\n",
+    "                      rotate=20,\n",
+    "                      out_size=512,\n",
+    "                      shift=0,\n",
+    "                      normal=False)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<All keys matched successfully>"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "6cd68a1a1624436e9b2a70691bfcfdae",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(IntProgress(value=0, max=28094), HTML(value='')))"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "ename": "KeyboardInterrupt",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
+      "\u001b[0;32m<ipython-input-11-48eeb3726659>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     19\u001b[0m train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n\u001b[1;32m     20\u001b[0m                           window_eq=False,equalize=False,rescale=True),indexes)\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0mpred\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfeatures\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel_run\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtrain_dataset\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdo_apex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m96\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mnum_workers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m14\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     23\u001b[0m \u001b[0mpickle_file\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs_dir\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0moutputs_format\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mversion\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'features_train_tta2'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mnum_split\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'wb'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/kaggle/RSNA/Production/helper/mytraining.py\u001b[0m in \u001b[0;36mmodel_run\u001b[0;34m(model, dataset, do_apex, batch_size, num_workers)\u001b[0m\n\u001b[1;32m    185\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0mbatchs\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm_notebook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_loader\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    186\u001b[0m         \u001b[0my_preds\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mbatchs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatchs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatchs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m         \u001b[0mres_list\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcpu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0my\u001b[0m \u001b[0;32min\u001b[0m \u001b[0my_preds\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_preds\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0my_preds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcpu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    188\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtens\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtens\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mres_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mres_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mres_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    189\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/kaggle/RSNA/Production/helper/mytraining.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    185\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0mbatchs\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm_notebook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_loader\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    186\u001b[0m         \u001b[0my_preds\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mbatchs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatchs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatchs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m         \u001b[0mres_list\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcpu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0my\u001b[0m \u001b[0;32min\u001b[0m \u001b[0my_preds\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_preds\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0my_preds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcpu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    188\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtens\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtens\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mres_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mres_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mres_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    189\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/envs/RSNA/lib/python3.6/site-packages/apex/amp/wrap.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     26\u001b[0m                                      \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     27\u001b[0m                                      kwargs)\n\u001b[0;32m---> 28\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0morig_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mnew_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     29\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     30\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+     ]
+    }
+   ],
+   "source": [
+    "model_name,version, num_split =  'Densenet161_3' , 'classifier_splits',0\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet161(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=4,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model_name,version, num_split =  'Densenet161_3' , 'classifier_splits',1\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet161(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=4,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model_name,version, num_split =  'Densenet161_3' , 'classifier_splits',2\n",
+    "idx_validate =  train_df[train_df.PID.isin(set(split_sid[splits[num_split][1]]))].index.values\n",
+    "model = MyDenseNet(models.densenet161(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=4,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(train_df.shape[0]).repeat(4)\n",
+    "train_dataset=D.Subset(ImageDataset(train_df,transform=transform.random,base_path=train_images_dir,\n",
+    "                          window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,train_dataset,do_apex=True,batch_size=96,num_workers=14)\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_train_tta2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_train_tta2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "\n",
+    "\n",
+    "my_loss(pred[(idx_validate*4+np.arange(4)[:,None]).transpose(1,0)].mean(1),\n",
+    "        torch.tensor(train_df[hemorrhage_types].values[idx_validate],dtype=torch.float),\n",
+    "        torch.tensor([1.,1.,1.,1.,1.,2.]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model_name,version, num_split =  'Densenet161_3' , 'classifier_splits',0\n",
+    "model = MyDenseNet(models.densenet161(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=4,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model_name,version, num_split =  'Densenet161_3' , 'classifier_splits',1\n",
+    "model = MyDenseNet(models.densenet161(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=4,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model_name,version, num_split =  'Densenet161_3' , 'classifier_splits',2\n",
+    "model = MyDenseNet(models.densenet161(pretrained=True),\n",
+    "                   len(hemorrhage_types),\n",
+    "                   num_channels=3,\n",
+    "                   drop_out=0.2,\n",
+    "                   wso=((40,80),(80,200),(600,2800)),\n",
+    "                   strategy='none',\n",
+    "                   dont_do_grad=[],\n",
+    "                   pool_type='max',\n",
+    "                   extra_pool=4,\n",
+    "                   return_features=True\n",
+    "                   )\n",
+    "model.load_state_dict(torch.load(models_dir+models_format.format(model_name,version,num_split),map_location=torch.device(device)))\n",
+    "_=model.to(device)\n",
+    "transform=MyTransform(flip=True,zoom=0.05,rotate=15,out_size=512,shift=40)\n",
+    "transform_val=MyTransform(out_size=512)\n",
+    "indexes=np.arange(test_df.shape[0]).repeat(8)\n",
+    "imagedataset_test=D.Subset(ImageDataset(test_df,transform=transform.random,base_path=test_images_dir,\n",
+    "                              window_eq=False,equalize=False,rescale=True),indexes)\n",
+    "pred,features = model_run(model,imagedataset_test,do_apex=True,batch_size=96,num_workers=18)\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'features_test2',num_split),'wb')\n",
+    "pickle.dump(features,pickle_file,protocol=4)\n",
+    "pickle_file.close()\n",
+    "pickle_file=open(outputs_dir+outputs_format.format(model_name,version,'predictions_test2',num_split),'wb')\n",
+    "pickle.dump(pred,pickle_file,protocol=4)\n",
+    "pickle_file.close()"
+   ]
+  },
+  {
+   "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.6.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}