Created
September 9, 2020 06:42
-
-
Save jinglescode/3d74fe165dee44e2f794e56ce0a2a958 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## About this notebook\n", | |
"\n", | |
"This notebook contains experiment results from the paper, [Deep Multi-Task Learning for SSVEP Detection and Visual Response Mapping](https://jinglescode.github.io/ssvep-multi-task-learning/). Using multi-task learning to capture signals simultaneously from the fovea efficiently and the neighboring targets in the peripheral vision generate a visual response map. A calibration-free user-independent solution, desirable for clinical diagnostics. A stepping stone for an objective assessment of glaucoma patients’ visual field.\n", | |
"\n", | |
"\n", | |
"\n", | |
"## torchsignal\n", | |
"\n", | |
"This notebook uses [torchsignal](https://github.com/jinglescode/torchsignal), a package for common signal processing tasks for PyTorch. Use Git or checkout with SVN, and install the dependencies:\n", | |
"\n", | |
"```\n", | |
"git clone https://github.com/jinglescode/torchsignal.git\n", | |
"pip install -r requirements.txt\n", | |
"```\n", | |
"\n", | |
"## Dataset\n", | |
"\n", | |
"We used an open-access dataset by Tsinghua University, HS-SSVEP, a 40-classes dataset for visual spelling tasks.\n", | |
"This dataset is by Yijun Wang, Xiaogang Chen, Xiaorong Gao, Shangkai Gao\n", | |
"\n", | |
"[[Paper]((https://ieeexplore.ieee.org/document/7740878))] [[Dataset website](http://bci.med.tsinghua.edu.cn/download.html)]\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Init and Config" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"D:\\workspace\\github\\torchsignal\n" | |
] | |
} | |
], | |
"source": [ | |
"%cd ../torchsignal" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from torchsignal.datasets.hsssvep import HSSSVEP\n", | |
"from torchsignal.datasets.multiplesubjects import MultipleSubjects\n", | |
"from torchsignal.trainer.multitask import Multitask_Trainer\n", | |
"\n", | |
"import numpy as np\n", | |
"import torch\n", | |
"from torch import nn\n", | |
"import matplotlib.pyplot as plt\n", | |
"from matplotlib.pyplot import figure" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"device cuda:0\n" | |
] | |
} | |
], | |
"source": [ | |
"config = {\n", | |
" \"exp_name\": \"model\",\n", | |
" \"seed\": 12,\n", | |
" \"segment_config\": {\n", | |
" \"window_len\": 4,\n", | |
" \"shift_len\": 250,\n", | |
" \"sample_rate\": 250,\n", | |
" \"add_segment_axis\": True\n", | |
" },\n", | |
" \"bandpass_config\": {\n", | |
" \"sample_rate\": 250,\n", | |
" \"lowcut\": 1,\n", | |
" \"highcut\": 40,\n", | |
" \"order\": 6\n", | |
" },\n", | |
" \"train_subject_ids\": {\n", | |
" \"low\": 1,\n", | |
" \"high\": 35\n", | |
" },\n", | |
" \"test_subject_ids\": {\n", | |
" \"low\": 1,\n", | |
" \"high\": 35\n", | |
" },\n", | |
" \"root\": \"../data/hsssvep\",\n", | |
" \"selected_channels\": ['PZ', 'PO5', 'PO3', 'POz', 'PO4', 'PO6', 'O1', 'Oz', 'O2', 'PO7', 'PO8'],\n", | |
" \"num_classes\": 40,\n", | |
" \"num_channel\": 11,\n", | |
" \"batchsize\": 64,\n", | |
" \"learning_rate\": 0.001,\n", | |
" \"epochs\": 100,\n", | |
" \"patience\": 5,\n", | |
" \"early_stopping\": 10,\n", | |
" \"model\": {\n", | |
" \"n1\": 4,\n", | |
" \"kernel_window_ssvep\": 59,\n", | |
" \"kernel_window\": 19,\n", | |
" \"conv_3_dilation\": 4,\n", | |
" \"conv_4_dilation\": 4\n", | |
" },\n", | |
" \"gpu\": 0,\n", | |
" \"multitask\": True,\n", | |
" \"runkfold\": 3,\n", | |
"}\n", | |
"\n", | |
"device = torch.device(\"cuda:\"+str(config['gpu']) if torch.cuda.is_available() else \"cpu\")\n", | |
"print('device', device)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Load Subjects Data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Load subject: 1\n", | |
"Load subject: 2\n", | |
"Load subject: 3\n", | |
"Load subject: 4\n", | |
"Load subject: 5\n", | |
"Load subject: 6\n", | |
"Load subject: 7\n", | |
"Load subject: 8\n", | |
"Load subject: 9\n", | |
"Load subject: 10\n", | |
"Load subject: 11\n", | |
"Load subject: 12\n", | |
"Load subject: 13\n", | |
"Load subject: 14\n", | |
"Load subject: 15\n", | |
"Load subject: 16\n", | |
"Load subject: 17\n", | |
"Load subject: 18\n", | |
"Load subject: 19\n", | |
"Load subject: 20\n", | |
"Load subject: 21\n", | |
"Load subject: 22\n", | |
"Load subject: 23\n", | |
"Load subject: 24\n", | |
"Load subject: 25\n", | |
"Load subject: 26\n", | |
"Load subject: 27\n", | |
"Load subject: 28\n", | |
"Load subject: 29\n", | |
"Load subject: 30\n", | |
"Load subject: 31\n", | |
"Load subject: 32\n", | |
"Load subject: 33\n", | |
"Load subject: 34\n", | |
"Load subject: 35\n" | |
] | |
} | |
], | |
"source": [ | |
"subject_ids = list(np.arange(config['train_subject_ids']['low'], config['train_subject_ids']['high']+1, dtype=int))\n", | |
"\n", | |
"data = MultipleSubjects(\n", | |
" dataset=HSSSVEP, \n", | |
" root=config['root'], \n", | |
" subject_ids=subject_ids, \n", | |
" selected_channels=config['selected_channels'],\n", | |
" segment_config=config['segment_config'],\n", | |
" bandpass_config=config['bandpass_config'],\n", | |
" one_hot_labels=True,\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Input data shape: (240, 11, 1000)\n", | |
"Target shape: (240,)\n" | |
] | |
} | |
], | |
"source": [ | |
"print(\"Input data shape:\", data.data_by_subjects[1].data.shape)\n", | |
"print(\"Target shape:\", data.data_by_subjects[1].targets.shape)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Multi-task Learning Model\n", | |
"\n", | |
"\n", | |
"\n", | |
"" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class Multitask_Model(nn.Module):\n", | |
" def __init__(self, num_channel=10, num_classes=4, signal_length=1000, filters_n1=4, kernel_window_ssvep=59, kernel_window=19, conv_3_dilation=4, conv_4_dilation=4):\n", | |
" super().__init__()\n", | |
"\n", | |
" filters = [filters_n1, filters_n1 * 2]\n", | |
"\n", | |
" self.conv_1 = conv_block(in_ch=1, out_ch=filters[0], kernel_size=(1, kernel_window_ssvep), w_in=signal_length)\n", | |
" self.conv_2 = conv_block(in_ch=filters[0], out_ch=filters[0], kernel_size=(num_channel, 1))\n", | |
" self.conv_3 = conv_block(in_ch=filters[0], out_ch=filters[1], kernel_size=(1, kernel_window), padding=(0,conv_3_dilation-1), dilation=(1,conv_3_dilation), w_in=self.conv_1.w_out)\n", | |
" self.conv_4 = conv_block(in_ch=filters[1], out_ch=filters[1], kernel_size=(1, kernel_window), padding=(0,conv_4_dilation-1), dilation=(1,conv_4_dilation), w_in=self.conv_3.w_out)\n", | |
" self.conv_mtl = multitask_block(filters[1]*num_classes, num_classes, kernel_size=(1, self.conv_4.w_out))\n", | |
" \n", | |
" self.dropout = nn.Dropout(p=0.5)\n", | |
"\n", | |
" def forward(self, x):\n", | |
" x = torch.unsqueeze(x,1)\n", | |
"\n", | |
" x = self.conv_1(x)\n", | |
" x = self.conv_2(x)\n", | |
" x = self.dropout(x)\n", | |
"\n", | |
" x = self.conv_3(x)\n", | |
" x = self.conv_4(x)\n", | |
" x = self.dropout(x)\n", | |
"\n", | |
" x = self.conv_mtl(x)\n", | |
"\n", | |
" return x\n", | |
"\n", | |
"\n", | |
"class conv_block(nn.Module):\n", | |
" def __init__(self, in_ch, out_ch, kernel_size, padding=(0,0), dilation=(1,1), groups=1, w_in=None):\n", | |
" super(conv_block, self).__init__()\n", | |
" self.conv = nn.Sequential(\n", | |
" nn.Conv2d(in_ch, out_ch, kernel_size=kernel_size, padding=padding, dilation=dilation, groups=groups),\n", | |
" nn.BatchNorm2d(out_ch),\n", | |
" nn.ELU(inplace=True)\n", | |
" )\n", | |
"\n", | |
" if w_in is not None:\n", | |
" self.w_out = int( ((w_in + 2 * padding[1] - dilation[1] * (kernel_size[1]-1)-1) / 1) + 1 )\n", | |
"\n", | |
" def forward(self, x):\n", | |
" return self.conv(x)\n", | |
"\n", | |
" \n", | |
"class multitask_block(nn.Module):\n", | |
" def __init__(self, in_ch, num_classes, kernel_size):\n", | |
" super(multitask_block, self).__init__()\n", | |
" self.num_classes = num_classes\n", | |
" self.conv_mtl = nn.Conv2d(in_ch, num_classes*2, kernel_size=kernel_size, groups=num_classes)\n", | |
"\n", | |
" def forward(self, x):\n", | |
" x = torch.cat(self.num_classes*[x], 1)\n", | |
" x = self.conv_mtl(x)\n", | |
" x = x.squeeze()\n", | |
" x = x.view(-1, self.num_classes, 2)\n", | |
" return x" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Input shape: torch.Size([40, 11, 1000])\n", | |
"Output shape: torch.Size([40, 40, 2])\n", | |
"Model size: 520788\n" | |
] | |
} | |
], | |
"source": [ | |
"model = Multitask_Model(num_channel=config['num_channel'],\n", | |
" num_classes=config['num_classes'],\n", | |
" signal_length=config['segment_config']['window_len'] * config['bandpass_config']['sample_rate'],\n", | |
" filters_n1=config['model']['n1'],\n", | |
" kernel_window_ssvep=config['model']['kernel_window_ssvep'],\n", | |
" kernel_window=config['model']['kernel_window'],\n", | |
" conv_3_dilation=config['model']['conv_3_dilation'],\n", | |
" conv_4_dilation=config['model']['conv_4_dilation'],\n", | |
").to(device)\n", | |
"\n", | |
"x = torch.ones((40, config['num_channel'], config['segment_config']['window_len'] * config['bandpass_config']['sample_rate'])).to(device)\n", | |
"print(\"Input shape:\", x.shape)\n", | |
"y = model(x)\n", | |
"print(\"Output shape:\", y.shape)\n", | |
"\n", | |
"def count_params(model):\n", | |
" return sum(p.numel() for p in model.parameters() if p.requires_grad)\n", | |
"print('Model size:', count_params(model))\n", | |
"\n", | |
"del model" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### K-fold Train Test" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Subject 1\n", | |
"Testset (k=1) -> loss:188.74998, acc:0.97500, f1:0.98700\n", | |
"Testset (k=2) -> loss:193.91165, acc:0.95800, f1:0.97900\n", | |
"Testset (k=3) -> loss:187.81735, acc:0.97100, f1:0.98500\n", | |
"\n", | |
"Subject 2\n", | |
"Testset (k=1) -> loss:331.29451, acc:0.87100, f1:0.93100\n", | |
"Testset (k=2) -> loss:291.48574, acc:0.92500, f1:0.96100\n", | |
"Testset (k=3) -> loss:256.26734, acc:0.93300, f1:0.96600\n", | |
"\n", | |
"Subject 3\n", | |
"Testset (k=1) -> loss:206.96071, acc:0.97900, f1:0.98900\n", | |
"Testset (k=2) -> loss:162.33227, acc:0.97500, f1:0.98700\n", | |
"Testset (k=3) -> loss:180.66558, acc:0.97100, f1:0.98500\n", | |
"\n", | |
"Subject 4\n", | |
"Testset (k=1) -> loss:174.48073, acc:0.96200, f1:0.98100\n", | |
"Testset (k=2) -> loss:232.94080, acc:0.95800, f1:0.97900\n", | |
"Testset (k=3) -> loss:270.03450, acc:0.94600, f1:0.97200\n", | |
"\n", | |
"Subject 5\n", | |
"Testset (k=1) -> loss:127.74273, acc:0.97100, f1:0.98500\n", | |
"Testset (k=2) -> loss:143.89437, acc:0.97500, f1:0.98700\n", | |
"Testset (k=3) -> loss:57.84045, acc:0.99200, f1:0.99600\n", | |
"\n", | |
"Subject 6\n", | |
"Testset (k=1) -> loss:21.39448, acc:1.00000, f1:1.00000\n", | |
"Testset (k=2) -> loss:93.60008, acc:0.99600, f1:0.99800\n", | |
"Testset (k=3) -> loss:17.91428, acc:1.00000, f1:1.00000\n", | |
"\n", | |
"Subject 7\n", | |
"Testset (k=1) -> loss:74.47636, acc:0.98300, f1:0.99200\n", | |
"Testset (k=2) -> loss:44.35627, acc:0.99200, f1:0.99600\n", | |
"Testset (k=3) -> loss:28.39367, acc:0.99600, f1:0.99800\n", | |
"\n", | |
"Subject 8\n", | |
"Testset (k=1) -> loss:57.87742, acc:0.98300, f1:0.99200\n", | |
"Testset (k=2) -> loss:77.61116, acc:0.99200, f1:0.99600\n", | |
"Testset (k=3) -> loss:34.80030, acc:0.99200, f1:0.99600\n", | |
"\n", | |
"Subject 9\n", | |
"Testset (k=1) -> loss:503.45080, acc:0.86700, f1:0.92900\n", | |
"Testset (k=2) -> loss:332.91187, acc:0.92100, f1:0.95900\n", | |
"Testset (k=3) -> loss:500.69362, acc:0.91200, f1:0.95400\n", | |
"\n", | |
"Subject 10\n", | |
"Testset (k=1) -> loss:95.43929, acc:0.98300, f1:0.99200\n", | |
"Testset (k=2) -> loss:63.05887, acc:0.99600, f1:0.99800\n", | |
"Testset (k=3) -> loss:50.55933, acc:0.98800, f1:0.99400\n", | |
"\n", | |
"Subject 11\n", | |
"Testset (k=1) -> loss:1257.64726, acc:0.62900, f1:0.77200\n", | |
"Testset (k=2) -> loss:1331.62918, acc:0.71700, f1:0.83500\n", | |
"Testset (k=3) -> loss:1490.11542, acc:0.70400, f1:0.82600\n", | |
"\n", | |
"Subject 12\n", | |
"Testset (k=1) -> loss:268.94772, acc:0.91200, f1:0.95400\n", | |
"Testset (k=2) -> loss:307.18995, acc:0.92900, f1:0.96300\n", | |
"Testset (k=3) -> loss:306.92382, acc:0.92500, f1:0.96100\n", | |
"\n", | |
"Subject 13\n", | |
"Testset (k=1) -> loss:202.50304, acc:0.97100, f1:0.98500\n", | |
"Testset (k=2) -> loss:239.51154, acc:0.95800, f1:0.97900\n", | |
"Testset (k=3) -> loss:156.35091, acc:0.98800, f1:0.99400\n", | |
"\n", | |
"Subject 14\n", | |
"Testset (k=1) -> loss:771.26937, acc:0.72500, f1:0.84100\n", | |
"Testset (k=2) -> loss:248.82687, acc:0.89200, f1:0.94300\n", | |
"Testset (k=3) -> loss:997.31989, acc:0.67100, f1:0.80300\n", | |
"\n", | |
"Subject 15\n", | |
"Testset (k=1) -> loss:69.18132, acc:0.99200, f1:0.99600\n", | |
"Testset (k=2) -> loss:42.89391, acc:1.00000, f1:1.00000\n", | |
"Testset (k=3) -> loss:58.45049, acc:1.00000, f1:1.00000\n", | |
"\n", | |
"Subject 16\n", | |
"Testset (k=1) -> loss:368.10800, acc:0.87900, f1:0.93600\n", | |
"Testset (k=2) -> loss:450.54668, acc:0.87100, f1:0.93100\n", | |
"Testset (k=3) -> loss:169.58333, acc:0.95000, f1:0.97400\n", | |
"\n", | |
"Subject 17\n", | |
"Testset (k=1) -> loss:281.98041, acc:0.91200, f1:0.95400\n", | |
"Testset (k=2) -> loss:228.10710, acc:0.95000, f1:0.97400\n", | |
"Testset (k=3) -> loss:213.85165, acc:0.95000, f1:0.97400\n", | |
"\n", | |
"Subject 18\n", | |
"Testset (k=1) -> loss:205.05946, acc:0.94200, f1:0.97000\n", | |
"Testset (k=2) -> loss:245.93236, acc:0.91200, f1:0.95400\n", | |
"Testset (k=3) -> loss:270.88770, acc:0.91700, f1:0.95700\n", | |
"\n", | |
"Subject 19\n", | |
"Testset (k=1) -> loss:406.17362, acc:0.90000, f1:0.94700\n", | |
"Testset (k=2) -> loss:312.60645, acc:0.88800, f1:0.94000\n", | |
"Testset (k=3) -> loss:293.51207, acc:0.92900, f1:0.96300\n", | |
"\n", | |
"Subject 20\n", | |
"Testset (k=1) -> loss:129.03853, acc:0.97900, f1:0.98900\n", | |
"Testset (k=2) -> loss:75.31107, acc:0.97900, f1:0.98900\n", | |
"Testset (k=3) -> loss:115.66236, acc:0.97900, f1:0.98900\n", | |
"\n", | |
"Subject 21\n", | |
"Testset (k=1) -> loss:134.52794, acc:0.98800, f1:0.99400\n", | |
"Testset (k=2) -> loss:102.81293, acc:0.99200, f1:0.99600\n", | |
"Testset (k=3) -> loss:167.56123, acc:0.97100, f1:0.98500\n", | |
"\n", | |
"Subject 22\n", | |
"Testset (k=1) -> loss:81.92417, acc:0.97900, f1:0.98900\n", | |
"Testset (k=2) -> loss:98.01273, acc:0.97900, f1:0.98900\n", | |
"Testset (k=3) -> loss:96.40839, acc:0.97500, f1:0.98700\n", | |
"\n", | |
"Subject 23\n", | |
"Testset (k=1) -> loss:898.46012, acc:0.77500, f1:0.87300\n", | |
"Testset (k=2) -> loss:1047.61428, acc:0.73300, f1:0.84600\n", | |
"Testset (k=3) -> loss:1356.07404, acc:0.71700, f1:0.83500\n", | |
"\n", | |
"Subject 24\n", | |
"Testset (k=1) -> loss:149.35310, acc:0.95400, f1:0.97700\n", | |
"Testset (k=2) -> loss:181.79922, acc:0.94200, f1:0.97000\n", | |
"Testset (k=3) -> loss:122.52186, acc:0.96200, f1:0.98100\n", | |
"\n", | |
"Subject 25\n", | |
"Testset (k=1) -> loss:91.05842, acc:0.98800, f1:0.99400\n", | |
"Testset (k=2) -> loss:87.67783, acc:0.98800, f1:0.99400\n", | |
"Testset (k=3) -> loss:83.14720, acc:0.98800, f1:0.99400\n", | |
"\n", | |
"Subject 26\n", | |
"Testset (k=1) -> loss:71.79207, acc:0.98800, f1:0.99400\n", | |
"Testset (k=2) -> loss:71.81904, acc:0.98300, f1:0.99200\n", | |
"Testset (k=3) -> loss:62.54865, acc:0.98800, f1:0.99400\n", | |
"\n", | |
"Subject 27\n", | |
"Testset (k=1) -> loss:96.06630, acc:0.98800, f1:0.99400\n", | |
"Testset (k=2) -> loss:79.96426, acc:0.99200, f1:0.99600\n", | |
"Testset (k=3) -> loss:69.28564, acc:0.99200, f1:0.99600\n", | |
"\n", | |
"Subject 28\n", | |
"Testset (k=1) -> loss:92.65504, acc:0.97900, f1:0.98900\n", | |
"Testset (k=2) -> loss:90.20345, acc:0.99200, f1:0.99600\n", | |
"Testset (k=3) -> loss:85.43065, acc:0.99200, f1:0.99600\n", | |
"\n", | |
"Subject 29\n", | |
"Testset (k=1) -> loss:257.87436, acc:0.92900, f1:0.96300\n", | |
"Testset (k=2) -> loss:257.13014, acc:0.91200, f1:0.95400\n", | |
"Testset (k=3) -> loss:265.96695, acc:0.94200, f1:0.97000\n", | |
"\n", | |
"Subject 30\n", | |
"Testset (k=1) -> loss:279.95839, acc:0.91200, f1:0.95400\n", | |
"Testset (k=2) -> loss:248.10902, acc:0.92500, f1:0.96100\n", | |
"Testset (k=3) -> loss:328.65070, acc:0.88800, f1:0.94000\n", | |
"\n", | |
"Subject 31\n", | |
"Testset (k=1) -> loss:59.83165, acc:0.99600, f1:0.99800\n", | |
"Testset (k=2) -> loss:80.62144, acc:0.99600, f1:0.99800\n", | |
"Testset (k=3) -> loss:73.09656, acc:0.99600, f1:0.99800\n", | |
"\n", | |
"Subject 32\n", | |
"Testset (k=1) -> loss:22.67306, acc:1.00000, f1:1.00000\n", | |
"Testset (k=2) -> loss:7.84253, acc:1.00000, f1:1.00000\n", | |
"Testset (k=3) -> loss:18.87836, acc:1.00000, f1:1.00000\n", | |
"\n", | |
"Subject 33\n", | |
"Testset (k=1) -> loss:1732.01200, acc:0.30000, f1:0.46200\n", | |
"Testset (k=2) -> loss:2058.71688, acc:0.22100, f1:0.36200\n", | |
"Testset (k=3) -> loss:1738.65306, acc:0.22500, f1:0.36700\n", | |
"\n", | |
"Subject 34\n", | |
"Testset (k=1) -> loss:160.38269, acc:0.97100, f1:0.98500\n", | |
"Testset (k=2) -> loss:162.28150, acc:0.95000, f1:0.97400\n", | |
"Testset (k=3) -> loss:102.67094, acc:0.98800, f1:0.99400\n", | |
"\n", | |
"Subject 35\n", | |
"Testset (k=1) -> loss:131.01311, acc:0.98300, f1:0.99200\n", | |
"Testset (k=2) -> loss:141.71847, acc:0.98800, f1:0.99400\n", | |
"Testset (k=3) -> loss:98.87959, acc:0.99600, f1:0.99800\n", | |
"\n", | |
"Results\n", | |
"subject_kfold_acc {1: [0.975, 0.958, 0.971], 2: [0.871, 0.925, 0.933], 3: [0.979, 0.975, 0.971], 4: [0.962, 0.958, 0.946], 5: [0.971, 0.975, 0.992], 6: [1.0, 0.996, 1.0], 7: [0.983, 0.992, 0.996], 8: [0.983, 0.992, 0.992], 9: [0.867, 0.921, 0.912], 10: [0.983, 0.996, 0.988], 11: [0.629, 0.717, 0.704], 12: [0.912, 0.929, 0.925], 13: [0.971, 0.958, 0.988], 14: [0.725, 0.892, 0.671], 15: [0.992, 1.0, 1.0], 16: [0.879, 0.871, 0.95], 17: [0.912, 0.95, 0.95], 18: [0.942, 0.912, 0.917], 19: [0.9, 0.888, 0.929], 20: [0.979, 0.979, 0.979], 21: [0.988, 0.992, 0.971], 22: [0.979, 0.979, 0.975], 23: [0.775, 0.733, 0.717], 24: [0.954, 0.942, 0.962], 25: [0.988, 0.988, 0.988], 26: [0.988, 0.983, 0.988], 27: [0.988, 0.992, 0.992], 28: [0.979, 0.992, 0.992], 29: [0.929, 0.912, 0.942], 30: [0.912, 0.925, 0.888], 31: [0.996, 0.996, 0.996], 32: [1.0, 1.0, 1.0], 33: [0.3, 0.221, 0.225], 34: [0.971, 0.95, 0.988], 35: [0.983, 0.988, 0.996]}\n", | |
"subject_kfold_f1 {1: [0.987, 0.979, 0.985], 2: [0.931, 0.961, 0.966], 3: [0.989, 0.987, 0.985], 4: [0.981, 0.979, 0.972], 5: [0.985, 0.987, 0.996], 6: [1.0, 0.998, 1.0], 7: [0.992, 0.996, 0.998], 8: [0.992, 0.996, 0.996], 9: [0.929, 0.959, 0.954], 10: [0.992, 0.998, 0.994], 11: [0.772, 0.835, 0.826], 12: [0.954, 0.963, 0.961], 13: [0.985, 0.979, 0.994], 14: [0.841, 0.943, 0.803], 15: [0.996, 1.0, 1.0], 16: [0.936, 0.931, 0.974], 17: [0.954, 0.974, 0.974], 18: [0.97, 0.954, 0.957], 19: [0.947, 0.94, 0.963], 20: [0.989, 0.989, 0.989], 21: [0.994, 0.996, 0.985], 22: [0.989, 0.989, 0.987], 23: [0.873, 0.846, 0.835], 24: [0.977, 0.97, 0.981], 25: [0.994, 0.994, 0.994], 26: [0.994, 0.992, 0.994], 27: [0.994, 0.996, 0.996], 28: [0.989, 0.996, 0.996], 29: [0.963, 0.954, 0.97], 30: [0.954, 0.961, 0.94], 31: [0.998, 0.998, 0.998], 32: [1.0, 1.0, 1.0], 33: [0.462, 0.362, 0.367], 34: [0.985, 0.974, 0.994], 35: [0.992, 0.994, 0.998]}\n" | |
] | |
} | |
], | |
"source": [ | |
"subject_kfold_acc = {}\n", | |
"subject_kfold_f1 = {}\n", | |
"\n", | |
"test_subject_ids = list(np.arange(config['test_subject_ids']['low'], config['test_subject_ids']['high']+1, dtype=int))\n", | |
"\n", | |
"for subject_id in test_subject_ids:\n", | |
" print('Subject', subject_id)\n", | |
" kfold_acc = []\n", | |
" kfold_f1 = []\n", | |
" \n", | |
" for k in range(config['runkfold']):\n", | |
" data.split_by_kfold(kfold_k=k, kfold_split=config['runkfold'])\n", | |
" train_loader, val_loader, test_loader = data.leave_one_subject_out(selected_subject_id=subject_id, dataloader_batchsize=config['batchsize'])\n", | |
" dataloaders_dict = {\n", | |
" 'train': train_loader,\n", | |
" 'val': val_loader\n", | |
" }\n", | |
" \n", | |
" model = Multitask_Model(num_channel=config['num_channel'],\n", | |
" num_classes=config['num_classes'],\n", | |
" signal_length=config['segment_config']['window_len'] * config['bandpass_config']['sample_rate'],\n", | |
" filters_n1=config['model']['n1'],\n", | |
" kernel_window_ssvep=config['model']['kernel_window_ssvep'],\n", | |
" kernel_window=config['model']['kernel_window'],\n", | |
" conv_3_dilation=config['model']['conv_3_dilation'],\n", | |
" conv_4_dilation=config['model']['conv_4_dilation'],\n", | |
" ).to(device)\n", | |
"\n", | |
" epochs=config['epochs'] if 'epochs' in config else 50\n", | |
" patience=config['patience'] if 'patience' in config else 20\n", | |
" early_stopping=config['early_stopping'] if 'early_stopping' in config else 40\n", | |
"\n", | |
" trainer = Multitask_Trainer(model, model_name=\"model\", device=device, num_classes=config['num_classes'], multitask_learning=True, patience=patience, verbose=False)\n", | |
"\n", | |
" trainer.fit(dataloaders_dict, num_epochs=epochs, early_stopping=early_stopping, topk_accuracy=1, save_model=True)\n", | |
" \n", | |
" test_loss, test_acc, test_metric = trainer.validate(test_loader, 1)\n", | |
" print('Testset (k={}) -> loss:{:.5f}, acc:{:.5f}, f1:{:.5f}'.format(k+1, test_loss, test_acc, test_metric))\n", | |
" kfold_acc.append(test_acc)\n", | |
" kfold_f1.append(test_metric)\n", | |
" \n", | |
" subject_kfold_acc[subject_id] = kfold_acc\n", | |
" subject_kfold_f1[subject_id] = kfold_f1\n", | |
" print()\n", | |
"\n", | |
"print('Results')\n", | |
"print('subject_kfold_acc', subject_kfold_acc)\n", | |
"print('subject_kfold_f1', subject_kfold_f1)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Plot Results" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9kAAAD3CAYAAAAJ+pcxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3de1yUZf7/8ffoKKCkZgquHCQVUEEcPKCipXkoo7TysLmJZllarWtlqx3sYFbqVmq1Wy2VZ6s1o4MWWVro1qYpKR7ClAwCTBMtU1JU5Pr+4c/5MXJw1PsGqdfz8ZiH3jPXfK7Pfc9c3POZ+7rvcRhjjAAAAAAAwHmrUdUJAAAAAADwe0GRDQAAAACARSiyAQAAAACwCEU2AAAAAAAWocgGAAAAAMAiFNkAAAAAAFiEIhsAAAAAAItQZAMA/nB69uyphx9++Kyek5KSopYtW6pmzZqaPHnyGdvPmzdPwcHBFbYJDg7WvHnzziqP6s6b7XKuVq1aJYfDoaKiIlviny1v8jmX9yIA4MJGkQ0AcJs3b55q1qypKVOmVHUqF5yxY8dqyJAhys3N1d///vdK7Xvy5MmqWbOmFixYUKn92uHGG2/Uxo0bqzqNC8Y777yjBx54wJJYr732msLCwiyJBQA4dxTZAAC3BQsW6J577qmUYu7o0aO292GV4uJiZWdn68orr1TTpk3l7+9fqf0vXLhQ99xzj+bPn1+p/Z7OitfMz89PjRs3tiCb34eGDRtW+vsJAGAvimwAgCQpJydHaWlpeuKJJ2SM0RdffOF+7N1331WDBg107Ngxj+dER0drxowZkqQTJ07okUceUXBwsC666CL17NlTmzdvdredPHmyunfvrlmzZikoKEgdO3aUJE2bNk2tW7dWnTp1FB4erhdeeMGjj59//lnXX3+9/Pz8FBERoQ8//FAOh0OrVq1yt9mwYYN69uwpPz8/hYWF6bHHHjurKcP//Oc/FRAQoPT09FKPZWdnq2bNmjLGqFevXh59P/PMMwoJCZGPj4+6dOmidevWldvHsWPHNHr0aPn7+yskJEQLFy70KrfPP/9ckvTEE09o/fr1ysnJ8Xi8qKhIjz76qEJDQ+Xr66vWrVtr2bJl7sdXrFihzp07y9fXV4GBgbrrrrvc6+VwOPTdd9+5254+vflcX7OKcipruvgLL7yg5s2bq06dOurUqZPHa/v999+rX79+qlevnurVq6fOnTt75FyWTz75RBEREfLz89PAgQN14MABSdL06dMVFxfn0fbQoUOqW7euR58lrVixQrGxsfLz81OjRo10zTXXuB8LCwvTa6+95tHe4XBo5cqVXuUjlZ4unp+fr2HDhqlBgwZq1KiRhg0bpv3797sfL2/brlq1Srfffrt++OEHORwO9/u0sLBQt99+uwICAuTn56dWrVrpvffeq3D7AQDOD0U2AEDSyaPY/fv3V506dXTjjTd6HDVNSEiQMUYff/yx+75t27YpIyNDf/7znyVJjz/+uFJSUvTmm29q48aN6tatm/r27auDBw+6n5Oenq6vvvpKn3zyid566y1Jko+Pj1599VV98803euqpp/TQQw8pJSXF/Zxx48bpu+++U2pqqhYuXFhqKvv+/fvVt29fJSQkaMuWLZo3b57eeOMNd/F/Jk8//bSmTp2q1NRUuVyuUo+HhIQoLy9PkpScnKzdu3crPj5eb7zxhiZPnqzp06crPT1dMTExSkhI8FjfkqZNm6Zly5bpnXfe0QcffKDZs2d7FE/lmT9/voYOHao6dero2muvLVWcP/bYY3r11Vf13HPP6ZtvvtHMmTNVq1YtSVJGRoauueYa9enTRxs3btRHH32k1q1be7VdTjmX16yinE43Z84cPf/883rppZe0detWjRgxQgkJCcrOzpZ0cpp+YGCg1q9fr7S0NI0bN041alT88eWxxx7T/PnzlZqaqm+//Vb33HOPJGn48OHasGGDtm/f7m6bnJysxo0bq0ePHqXiFBUVafDgwRo5cqS+/fZbffbZZ+rbt+9Zbb+K8inL4MGDJZ38cmXVqlU6cOCAEhMTPWKVtW3j4+M1Y8YMBQcHa/fu3e736QsvvKCvv/5aH330kTIyMjRr1izVq1fvrNcBAHAWDAAAxpjw8HCzdOlSY4wxmzZtMvXq1TOHDx92Pz58+HAzbNgw9/Jjjz1munXrZowx5siRI8bPz89s2bKlVMyFCxe62/v7+5tDhw5VmMeYMWPMLbfcYowx5sCBA8bpdJoVK1a4H//444+NJJOammqMMebxxx83gwYN8ojx+uuvmxYtWpTbR48ePcykSZPM448/boKCgsz27dsrzOn48eMefRpjTOfOnc2ECRM82gQHB5t//etfxhhj5s6da4KCgtyPBwQEmJdfftm9vG3bNiPJzJ07t9x+Dx8+bOrVq2c2b95sjDHm/fffNxERER6P+/j4mCVLlpT5/BEjRphrrrmmzMeysrKMJJOZmem+LzU11Ugyx48fN8ac22t2ppxO3y6XXnqpWbZsmUebvn37mieeeMIYY0x0dLRZsGBBhf2fnv9HH33kvm/FihXG6XSaX375xRhjzFVXXWUeeugh9+NXXHGFmTRpUpnx9u3bZySZnJycMh9v1qyZefXVVz3uk+R+v3qTz6n3ojHGrF692gQGBrq3vzHG7Nq1y0gyubm5Z9y2r776qmnWrJnHfWPHjjW33nprme0BAPbgSDYAQF9++aXy8/N11VVXSZJiYmIUHBys999/391m6NChWrp0qQoLCyVJS5Ys0Y033ihJ2rlzp44cOaIuXbrI39/ffdu5c6e+//57d4zw8PBS559++OGH6t69uwIDA+Xv7685c+YoNzdXkpSVlaWioiJ16NDB3f7UlOVTtmzZoqVLl3r0O2rUKGVnZ6u4uLjcdZ43b55mzZql//73v4qIiHDfP3XqVI9Y5dm+fbu6dOniXnY6nerYsaPHUdJTfv31V+3du9djqnKrVq100UUXlRtfOjlNPzg4WG3btpUk9evXT3v37tXatWslSd99952OHj2qnj17lvn8rVu3lvuYt872NTtTTiUVFBQoKytLN954o8c2T01Ndb9v7rrrLt1222266qqr9Oyzz7r7qUjJ7RwXF6eioiLt3LlTkjRy5EgtWrRIxhjl5uZq9erVGjFiRJlxLrnkEg0dOlTR0dEaOnSo5s6dq4KCgjP2fzb5lLRlyxbl5+erQYMG7m1x6r35/fffn9W2PWX48OF6++231aFDBz300EP6+uuvzzp/AMDZocgGAGjBggU6cOCA6tSpI6fTKafTqW3btnlMGe/bt69q1aqllJQUbdmyRd9++62GDBkiSe7CY9WqVUpPT3fftm/frrFjx7pj1KlTx6Pf77//XgMHDlSvXr304YcfauPGjRoxYoSOHz8uSTLGSDp5nmt5CgoKNHToUI9+T+VX0bTiTp06qUaNGkpOTva4/4477vCIZQVv1qMsCxYs0LZt29yvSZ06dXTgwAH363Iq7pn6LcupbVOyzantXtK5vmbe+O233yRJb7zxhsc237Ztm6ZNmyZJuvPOO7Vt2zYlJCRo+fLlatWqlfs89fKU3M6nb/Prr79eBw8e1OrVq7Vo0SLFxcV5fMlyujfffFOffPKJIiMj9eyzzyo6Oto9zb9GjRpn3H5nyqekgoICtWzZ0mNbpKenKzMzU506dTqrbXtKXFycsrKydM899+iHH35Qt27d9Oyzz551HACA9yiyAeAP7ujRo1q8eLHmzZvn8cF+5cqVWrFihXbv3i1JqlWrlgYOHKjFixfrrbfeUo8ePdSkSRNJUuvWrVW7dm3t3r1bLVu29Lg1bNiw3L43bNggPz8/TZkyRR07dlR4eLiysrLcjzdv3lw1a9b0OPp2+pG4du3aKSMjo1S/LVu2rHC9o6KitHz5cj355JN6+eWX3fc3bNjQqxiRkZHuI8rSyfN309LS1KpVq1JtGzRooICAAI8Lo23fvl2HDh0qN/6PP/6olStX6uOPP/Z4XRYsWKDFixfr6NGjCg8Pl4+PT7kX7Wrbtm25j526wveePXvc923ZsqXcfE4502t2ppxKCggIUJMmTZSTk1PqtQsMDHS3a968ue6++26tXLlSPXr00Jtvvllh3JLbed26dXI6nWrRooUkydfXV0OHDtXChQu1cOHCco9il9S5c2c9/vjj2rhxow4cOKBPP/1U0slt6M32qyifktq1a6ecnBzVq1ev1Pbw8/M747atVauWTpw4Uer+hg0bavjw4Xr99dc1ZcoUzZkz54zrDAA4d86qTgAAULVOTQm/6aabSl2cqnXr1lq0aJEmTJgg6eRvHF933XVq0qSJ7r//fne7evXqaezYsbrzzjt17NgxtW/fXnv27NGyZcs0bNgwRUVFldl3ixYtdPDgQc2bN0/du3fXf/7zH61fv17t27eXJNWvX19Dhw7Vvffeq9dee03GGD366KOS/v8Rwb/+9a9KSkrS7bffrrFjx8rX11ebNm3Sjh07PK7aXJZOnTpp2bJlSkhIkL+/v4YPH+71drv77rt1++23y+VyqX379po5c6aOHDnicZGqku644w49/vjjatGihRo3bqx7771Xvr6+5cZftGiRWrVqVepCW61atdLdd9+tpUuXasiQIbrvvvvcFwOLjY1VZmamiouL1a9fP91///1yuVyaNGmShg8frqNHj+rzzz/X2LFj5efnp44dO2ratGkKCAjQjh079NJLL51xvc/0mvn5+VWYU0kOh0MPPfSQHnnkEfn7++vyyy/X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69WsWTNJ0oYNG+RwOM455muvvXZeOb333nvq2LGj4uLizisOAAC/FxzJBgCgmti9e7ecTqcuueQS933t27eXw+FQWFiYtm7d6r6/Y8eOWrVqlXt55cqV6tmzp8LDwzVhwgQZYyR5HuU+dOiQbr/9dsXFxSkmJkZ33HGHjh8/LknatWuXBg8erJiYGMXExOiRRx5RSkqKli5dqunTp8vlcp13wQ4AwO8BRTYAANVEu3bt1LVrV4WGhuqGG27QM888o127dnn13IyMDK1YsUKbNm1SamqqlixZUqrNfffdp8svv1zr1q3Tpk2bVFRUpH/961+SpMTERHXu3FmbN2/W5s2bNW7cOCUkJGjAgAF64IEHlJ6erttuu83S9QUAoDpiujgAANVEjRo1lJycrG+//VarV6/WRx99pKeeekppaWlnfO7NN9+sWrVqqVatWkpMTNTKlSv15z//2aPNe++9p7Vr12rGjBmSpCNHjqh27doqKCjQl19+qRUrVrjbNm7c2NqVAwDgd4IiGwCAaqZVq1Zq1aqVxowZo379+mnp0qVyOp06ceKEu01hYWGFMco6j9sYo/fee0/Nmzf3uL+goMCaxAEA+ANgujgAANXErl279L///c+9/MsvvygrK0stWrRQixYt9NVXX0mS1q1bp+3bt3s8d+HChSoqKtKRI0f0xhtvqE+fPqXiDxgwQNOnT1dRUZE7/nfffSd/f391795ds2bNcrfNz8+XJNWrV0+//vqr5esKAEB1RZENAEA1UVRUpClTpigiIkIul0uXXXaZbr75Zl133XV66qmn9Pzzz6tz586aO3euoqKiPJ7bvn179enTRzExMerRo4cGDx7sfuzUUe3nnntOTqdTLpdLMTEx6tOnj7KzsyWdLNLXrl2rqKgotWvXzn2u9vDhw/XGG29w4TMAAP4fhzl1eVEAAPCHExUVpdmzZ6tLly5VnQoAAL8LHMkGAOAPKjIyUuHh4fzGNQAAFuJINgAAAAAAFuFINgAAAAAAFqHIBgAAAADAIhTZAAAAAABYhCIbAAAAAACLUGQDAAAAAGARimwAAAAAACxCkQ0AAAAAgEX+D275bldECAWlAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<Figure size 1200x240 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"image/png": "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v79Gjx6tl19+Wb6+vpKkgwcPKjAwUNL5mejLzae4Tp06ac+ePWW+1h06dNAbb7yhkydPljqbXatWLZ07d67E/REREYqIiNC0adMUHh6uVatWaerUqeWuNwCg+qDIBgBUqguHhI8YMUK1atVyeywsLEzLli3TlClTJEnDhg3TXXfdpRYtWujxxx93tWvQoIEmTJig8ePH68yZM+rcubMOHjyo9957TyNHjlR4eHipfbdu3VrHjx/X4sWL1atXL/3zn//U1q1b1blzZ0lSw4YNNXz4cD366KP6xz/+IWOMnn76aUn//wzo7373OyUlJenBBx/UhAkT5OXlpe3bt2vv3r166qmnyl33bt266b333lNsbKx8fHx07733erzdHnnkET344IOKjIxU586dlZiYqFOnTikuLq7U9uPGjdOMGTPUunVr+fr66tFHH5WXl5fH/ZXmwkz7mTNnlJOTo/T0dDVu3FhBQUFlPufYsWN65JFH9PDDD+u///2vVqxY4XZBOy8vLw0fPlx/+MMfdNddd6lRo0Zlxnr99ddljFH37t1Vs2ZNrV692lUgt2nTRn5+fpo+fbqeeOIJbdq0SW+99ZbboeGe5FPclClTFBMTo6eeekojRoyQMUZbt27VyZMn9dBDD2nEiBGaNWuWhg0bpunTp6t+/fpKTU3V4MGD1bRpU7Vs2VKbNm3S/v375e3tLS8vLz3++OMaOnSogoKC9OWXXyo7O7vMIh8AUE1V3engAIBfotjYWLcLmhX35JNPmvDwcNdyYWGhad68uXE6nSYvL8+t7blz58zs2bNNcHCwqVWrlgkICDBxcXHmwIEDxhj3C6UVN2fOHOPr62vq169vxowZYx577DHTu3dv1+OHDx82d955p6lTp45p06aNeeedd4wks3HjRlebHTt2mFtvvdXUq1fP1K9f33Tr1s28/vrrZa7zhQufXfDhhx8ab29vk5ycXGr70i58Zowxc+fONf7+/qZ27dqme/fuZvPmza7HLr7IV0FBgfntb39rvL29jZ+fn+vxS134rLwLmkkqcRs1alSZ7UeNGmVGjBhhHnnkEdOgQQPj6+tr5s+fX6Ldxo0bjSTXhfDKsmrVKtOtWzfj4+NjGjZsaG699Vbz9ddfux7/5JNPTFhYmKlbt665++67TWJiYokLn5WXz8UXPjPGmPXr15tevXoZLy8v06hRI3PTTTeZDz74wPV4RkaGiY2NNd7e3qZBgwZmwIAB5ujRo8YYY3bu3GmioqJM7dq1TcuWLc3p06fNsGHDXK/h9ddfb+bOnVvuOgMAqh+HMVdwQhEAAL8QGzZs0I033qgffvhBzZo1q+p0rkkrV67U+PHjtX///hIzz5Vpz549ateunb7//nv96le/qrI8AADVG4eLAwBQzNatW5Wdna2oqCjl5OS4rgZNgW2906dP67vvvlNCQoLGjBlTpQX2sWPHtGrVKjVp0uSyf3sbAIDiuLo4AADFFBUVaebMmYqIiNDw4cMVFRWl5cuXV3Va16Tly5erffv28vLy0rRp06o0l0cffVQLFizQK6+8Uu5V4gEAuBQOFwcAAAAAwCJ8VQsAAAAAgEUosgEAAAAAsAhFNgAAAAAAFqn2VxevU6eOfH19qzoNAAAAAMAvRF5enk6fPl3qY7YX2RMnTtSaNWv03XffaefOnYqIiCi13axZs7Ro0SJJ0ogRI/Tss896FN/X11e5ubmW5QsAAAAAQHkCAgLKfMz2w8WHDBmiDRs2qGXLlmW2+fTTT7V8+XLt2LFDu3fv1r/+9S999NFHdqcGAAAAAIClbC+yb7rppnKrfElasWKFRo8erXr16qlOnTr67W9/y2+SAgAAAACqnaviwmfZ2dluM93BwcHKzs6uwowAAAAAALh8V82FzxwOh+tvY0yZ7RITE5WYmOhazs/PtzUv4HIkfHHYsljToppaFgsAAACXz8rPdhKf734prooiOygoSFlZWa7l7777TkFBQaW2nTRpkiZNmuRavtSh6ACAawsfeAAAFzDBgavRVVFkDx06VBMmTNBDDz0kp9Op1157TbNmzarqtICrjt07kmuheGFnCwDVg937nMrYp7FfBniflsb2Ivt3v/ud3n33XR08eFD9+vWTj4+PvvnmG8XGxmrmzJnq2rWr+vTpo3vuuUcdOnSQJA0fPly33Xab3anhF4Z/AABQfVSn4oX9AQCgONuL7AULFmjBggUl7k9JSXFbfvrpp/X000/bnQ4qgA8kwLWBsQzYjy92AeCX66o4XPyXgJ0tAAAAgMrGl+uV76r4CS8AAAAAAK4FzGTjqsG3bAAAXD3YLwPAlWEmGwAAAAAAizCTDQBAJWOGEACAaxcz2QAAAAAAWISZbAAArjH8ogUAT/C/ArAHRTYAXEX4wAMAAFC9cbg4AAAAAAAWYSb7GsHsFwCgsrDPAeApLvSIXyKKbACVhg/mqC74UAgAAK4Uh4sDAAAAAGARimwAAAAAACxCkQ0AAAAAgEUosgEAAAAAsAhFNgAAAAAAFqHIBgAAAADAIhTZAAAAAABYhCIbAAAAAACL2F5kZ2RkKCYmRiEhIYqOjtbu3btLtPn55591//33q0OHDgoNDdW0adNkjLE7NQAAAAAALGV7kR0fH6+xY8dq7969mjp1qsaMGVOizZw5cyRJO3bs0K5du/TFF1/onXfesTs1AAAAAAAsZWuRfejQIW3btk1xcXGSpMGDByszM1NZWVlu7bZv367bb79dDodDtWrV0oABA7R06VI7UwMAAAAAwHK2Ftk5OTny8/OT0+mUJDkcDgUFBSk7O9utXbdu3fTWW2/pzJkzOnHihFatWlWiEAcAAAAA4Gpn++HiDofDbbm0c60ff/xxBQYGKjo6WnfeeadiYmJUq1atUuMlJiYqICDAdcvPz7clbwAAAAAALpetRXZgYKByc3NVWFgo6XyBnZOTo6CgILd2Xl5emj9/vtLT05WamqrGjRurffv2pcacNGmScnNzXTcfHx87VwEAAAAAAI/ZWmQ3a9ZMUVFRWrZsmSQpOTlZwcHBCg4Odmt3/PhxnTx5UpKUmZmpV199VZMnT7YzNQAAAAAALGf74eJJSUlKSkpSSEiIEhIStHDhQklSbGys0tLSJEnffvutIiMj1b59e911112aP3++IiMj7U4NAAAAAABLOe3uIDQ0VBs3bixxf0pKiuvvyMhI7d271+5UAAAAAACwle0z2QAAAAAA/FJQZAMAAAAAYBGKbAAAAAAALEKRDQAAAACARSiyAQAAAACwCEU2AAAAAAAWsf0nvAAAvywJXxy2LNa0qKaWxQIAAKgMzGQDAAAAAGARimwAAAAAACzC4eIAAADVEKdmAMDViZlsAAAAAAAsQpENAAAAAIBFKLIBAAAAALAIRTYAAAAAABahyAYAAAAAwCIU2QAAAAAAWIQiGwAAAAAAi1BkAwAAAABgEYpsAAAAAAAsQpENAAAAAIBFnHZ3kJGRoVGjRunw4cNq1KiRFi9erPbt27u1KSgo0Lhx4/T555/LGKNWrVrptddeU9OmTe1ODwAuS8IXhy2NNy2K/3MAAADXEttnsuPj4zV27Fjt3btXU6dO1ZgxY0q0SUpKUn5+vnbs2KFdu3apefPmmjt3rt2pAQAAAABgKVuL7EOHDmnbtm2Ki4uTJA0ePFiZmZnKysoq0fbkyZM6e/asCgsLlZ+fr4CAADtTAwAAAADAcrYW2Tk5OfLz85PTef6odIfDoaCgIGVnZ7u1i4+PV4MGDdSsWTM1b95cP/30kyZMmGBnagAAAAAAWM6jIvu9997T8ePHJUl//vOfNWTIEO3atcujDhwOh9uyMaZEm7Vr18rhcOjgwYM6cOCAGjVqpJkzZ5YaLzExUQEBAa5bfn6+R3kAAAAAAGA3j4rsJ598Ug0aNND27du1bNky9e/fX+PHj7/k8wIDA5Wbm6vCwkJJ5wvsnJwcBQUFubX761//ql//+tfy8vJS7dq1NXLkSKWmppYac9KkScrNzXXdfHx8PFkFAAAAAABs51GRfeFw73//+98aO3as4uPj9fPPP1/yec2aNVNUVJSWLVsmSUpOTlZwcLCCg4Pd2rVq1UofffSRjDEyxuj9999XRETEZa4KAAAAAABVy6Mi+9y5c9q0aZOSk5N18803S5LOnj3rUQdJSUlKSkpSSEiIEhIStHDhQklSbGys0tLSJEnTp0/XTz/9pPDwcEVEROjw4cN69tlnr2R9AAAAAACoMh79TvasWbM0btw49e3bV2FhYdqzZ4/atm3rUQehoaHauHFjiftTUlJcfzdu3FjvvPOOhykDAAAAAHB18qjIHjhwoAYOHOhaDg0N1cqVK21LCgAAAACA6sijw8X379+vu+++W126dJEkpaen64UXXrA1MQAAAAAAqhuPiuz4+HgNGTLEdZXwiIgI17nVAAAAAADgPI+K7IMHDyouLk41apxv7nQ6XVccBwAAAAAA53n8E17GGNfy0aNHVVRUZFtSAAAAAABURx4V2UOHDtW4ceN04sQJLV68WLfeeqvGjBljd24AAAAAAFQrHh3zPXnyZC1fvlzHjh1TSkqKJk6cqLi4OLtzAwAAAACgWvH4xOrf/OY3+s1vfmNnLgAAAAAAVGvlFtkvvviiHnnkEU2ZMkUOh6PE43PnzrUtMQAAAAAAqptyi2wvLy9Jko+PT6UkAwAAAABAdVZukR0fHy9JeuaZZyolGQAAAAAAqjOPri7+wAMP6MiRI67lw4cPuwpwAAAAAABwnkdF9ueff64mTZq4lps2baqtW7falhQAAAAAANWRR0X2uXPn3JaNMTp9+rQtCQEAAAAAUF15VGR3795djzzyiPbv36/c3Fz9/ve/1w033GB3bgAAAAAAVCseFdnz5s3TiRMnFBUVpS5duujkyZOaP3++3bkBAAAAAFCtlHt18QsaNGig1157ze5cAAAAAACo1jwqsiVp27ZtSk9PV0FBgeu+hx56yJakAAAAAACojjwqsv/0pz9pxYoVys7OVu/evfXxxx+rb9++FNkAAAAAABTj0TnZS5cu1WeffaaAgAAlJydr69atql27tkcdZGRkKCYmRiEhIYqOjtbu3btLtElISFBkZKTr1qBBA02aNOny1gQAAAAAgCrmUZHt5eUlLy8vFRUVyRij0NBQZWVledRBfHy8xo4dq71792rq1KkaM2ZMiTbTpk1Tenq60tPTtWXLFtWuXVsjR468rBUBAAAAAKCqeVRke3t76+zZs4qMjNTjjz+ul156SSdPnrzk8w4dOqRt27YpLi5OkjR48GBlZmaWW6CvXr1aAQEB6tKli2drAAAAAADAVcKjIvuVV17RmTNnNG/ePB09elSffvqpli5desnn5eTkyM/PT07n+VO/HQ6HgoKClJ2dXeZzFi5cWOpsNwAAAAAAV7tLXvjs3LlzWrp0qf70pz+pXr16+vvf/35ZHTgcDrdlY0yZbXNycrRhwwYtX768zDaJiYlKTEx0Lefn519WPgAAAAAA2OWSM9k1a9bUli1brih4YGCgcnNzVVhYKOl8gZ2Tk6OgoKBS2y9atEh33nmnGjduXGbMSZMmKTc313Xz8fG5otwAAAAAALCaR4eLDxw4UH/605906NAhnTx50nW7lGbNmikqKkrLli2TJCUnJys4OFjBwcEl2hpjtHjxYg4VBwAAAABUWx4V2Y899pieeOIJtWjRQvXr15ePj4/q16/vUQdJSUlKSkpSSEiIEhIStHDhQklSbGys0tLSXO0++eQTGWPUt2/fK1gNAAAAAACq3iXPyZakoqKiK+4gNDRUGzduLHF/SkqK23Lfvn2VmZl5xf0AAAAAAFDVPJrJBgAAAAAAl+bRTHaNGjVKXCVcOn/lcQAAAAAAcJ5HRfaJEydcf586dUpLlizRmTNnbEsKAAAAAIDqyKPDxevVq+e6NW3aVJMmTdKHH35od24AAAAAAFQrV3ROdkZGhnJycqzOBQAAAACAas2jw8V9fX1d52SfO3dOhYWFeumll2xNDAAAAACA6sajIrv471k7nU61aNFCNWvWtC0pAAAAAACqI4+KbIfDoWbNmsnLy0uSVFBQoO+//16BgYG2JgcAAAAAQHXi0TnZQ4YMcVs2xpS4DwAAAACAXzqPiuwzZ864ZrElqW7dujp9+rRtSQEAAAAAUB15VGQ7HA4dOnTItfzDDz/IGGNbUgAAAAAAVEcenZM9ceJE9erVS/fdd58kacmSJXrqqadsTQwAAAAAgOrGoyL7/vvv1/XXX6+UlBRJ0sKFC3XjjTfamhgAAAAAANWNR0V2QUGBevfurT59+kiSioqKVFBQ4HaeNgAAAAAAv3QenZN9yy236Pjx467lEydOqF+/frYlBQAAAABAdeRRkX3y5Ek1bNjQtdywYUP9/PPPtiUFAAAAAEB15FGRXVRU5FZUnzhxQmfPnrUtKQAAAAAAqiOPzskeOXKkBgwYoPHjx0uSXn31VY0aNcrWxAAAAAAAqG48KrIff/xxtWjRQmvWrJHD4dBDDz2kevXq2Z0bAAAAAADVikeHi0vSqFGjNHPmTLVs2VKTJ0/Ws88+69HzMjIyFBMTo5CQEEVHR2v37t2ltlu/fr26deum8PBwtWvXThs3bvQ0NQAAAAAArgqXnMk+efKk3nrrLS1cuFD79u3TqVOntGHDBoWHh3vUQXx8vMaOHavRo0frnXfe0ZgxY0oU0N9//71GjRqlf/3rXwoLC1NBQYEKCgqubI0AAAAAAKgi5c5kjx07VoGBgVq9erWmTJmi7OxsNWrUyOMC+9ChQ9q2bZvi4uIkSYMHD1ZmZqaysrLc2r3yyiuKi4tTWFiYJMnLy0uNGjW6gtUBAAAAAKDqlFtkL1++XB06dFB8fLwGDhwop9Mph8PhcfCcnBz5+fnJ6Tw/Ye5wOBQUFKTs7Gy3drt379apU6fUr18/RUZG6uGHH9bJkyevYHUAAAAAAKg65RbZBw4cUFxcnGbOnKmgoCA9+eSTl/3TXRcX5caYEm3Onj2rdevW6e2331ZaWpp++uknTZ8+vdR4iYmJCggIcN3y8/MvKx8AAAAAAOxSbpHt4+OjBx54QBs3btSHH36ogoICnTlzRjExMXrllVcuGTwwMFC5ubkqLCyUdL7AzsnJUVBQkFu7li1b6v/+7/903XXXyel0avjw4dqyZUupMSdNmqTc3FzXzcfHx9N1BQAAAADAVh5fXTw8PFzz5s3T/v37NWnSJL3//vuXfE6zZs0UFRWlZcuWSZKSk5MVHBys4OBgt3YjRoxQamqqTp8+LUn68MMP1alTp8tYDQAAAAAAqp7HRfYFTqdTQ4YMUUpKikftk5KSlJSUpJCQECUkJGjhwoWSpNjYWKWlpUmSYmJiNHDgQEVGRqpDhw7Ky8vTzJkzLzc1AAAAAACq1CV/wquiQkNDS/3N64uL9KlTp2rq1Kl2pwMAAAAAgG0ueyYbAAAAAACUjiIbAAAAAACLUGQDAAAAAGARimwAAAAAACxCkQ0AAAAAgHw04EsAABapSURBVEUosgEAAAAAsAhFNgAAAAAAFqHIBgAAAADAIhTZAAAAAABYhCIbAAAAAACLUGQDAAAAAGARimwAAAAAACxCkQ0AAAAAgEUosgEAAAAAsAhFNgAAAAAAFqHIBgAAAADAIhTZAAAAAABYhCIbAAAAAACLUGQDAAAAAGAR24vsjIwMxcTEKCQkRNHR0dq9e3eJNosXL1ajRo0UGRmpyMhI3XzzzXanBQAAAACA5WwvsuPj4zV27Fjt3btXU6dO1ZgxY0pt169fP6Wnpys9PV2pqal2pwUAAAAAgOVsLbIPHTqkbdu2KS4uTpI0ePBgZWZmKisry85uAQAAAACoErYW2Tk5OfLz85PT6ZQkORwOBQUFKTs7u0Tb9evXKzIyUj179tQ777xjZ1oAAAAAANjCaXcHDofDbdkYU6LNHXfcoXvuuUfe3t766quvNGDAAAUEBKhHjx4l2iYmJioxMdG1nJ+fb33SAAAAAABcAVtnsgMDA5Wbm6vCwkJJ5wvsnJwcBQUFubVr2rSpvL29JUlhYWGKjY3V//73v1JjTpo0Sbm5ua6bj4+PnasAAAAAAIDHbC2ymzVrpqioKC1btkySlJycrODgYAUHB7u1279/v+vvH374QZ988omioqLsTA0AAAAAAMvZfnXxpKQkJSUlKSQkRAkJCVq4cKEkKTY2VmlpaZKkBQsWKDw8XJGRkerfv78effRR3XLLLXanBgAAAACApWw/Jzs0NFQbN24scX9KSorr7zlz5mjOnDl2pwIAAAAAgK1sn8kGAAAAAOCXgiIbAAAAAACLUGQDAAAAAGARimwAAAAAACxCkQ0AAAAAgEUosgEAAAAAsAhFNgAAAAAAFqHIBgAAAADAIhTZAAAAAABYhCIbAAAAAACLUGQDAAAAAGARimwAAAAAACxCkQ0AAAAAgEUosgEAAAAAsAhFNgAAAAAAFqHIBgAAAADAIhTZAAAAAABYhCIbAAAAAACLUGQDAAAAAGAR24vsjIwMxcTEKCQkRNHR0dq9e3eZbfPy8tS8eXMNGTLE7rQAAAAAALCc7UV2fHy8xo4dq71792rq1KkaM2ZMmW0feughxcbG2p0SAAAAAAC2sLXIPnTokLZt26a4uDhJ0uDBg5WZmamsrKwSbd944w01b95cvXv3tjMlAAAAAABsY2uRnZOTIz8/PzmdTkmSw+FQUFCQsrOz3dp9//33SkxMVEJCgp3pAAAAAABgK9sPF3c4HG7LxpgSbR588EHNnTtXPj4+l4yXmJiogIAA1y0/P9+yXAEAAAAAqAinncEDAwOVm5urwsJCOZ1OGWOUk5OjoKAgt3YbN250naudn5+vU6dO6dZbb9VHH31UIuakSZM0adIk13JAQICdqwAAAAAAtkn44rBlsaZFNbUsFq6crTPZzZo1U1RUlJYtWyZJSk5OVnBwsIKDg93a/fjjj8rKylJWVpb+/Oc/6/bbby+1wAYAAAAA4Gpm++HiSUlJSkpKUkhIiBISErRw4UJJUmxsrNLS0uzuHgAAAACASmPr4eKSFBoaqo0bN5a4PyUlpdT2o0eP1ujRo23OCgAAAAAA69k+kw0AAAAAwC8FRTYAAAAAABZxmNJ+U6saqVOnjnx9fas6Dcvk5+d79FNmv9T4ldFHdY9fGX0Qv+r7qO7xK6OP6h6/MvogftX3Ud3jV0YfxK/6Pqp7/Mroo7rHr4w+KmMdKlNeXp5Onz5d6mPVvsi+1gQEBCg3N5f4VdhHdY9fGX0Qv+r7qO7xK6OP6h6/MvogftX3Ud3jV0YfxK/6Pqp7/Mroo7rHr4w+KmMdrhYcLg4AAAAAgEUosgEAAAAAsEjN6dOnT6/qJODuhhtuIH4V91Hd41dGH8Sv+j6qe/zK6KO6x6+MPohf9X1U9/iV0Qfxq76P6h6/Mvqo7vEro4/KWIerAedkAwAAAABgEQ4XBwAAAADAIhTZAAAAAABYhCL7KjFx4kQFBwfL4XBo165dlsYuKCjQ3XffrZCQEEVGRuq2225TVlaWpX1I0oABA9SxY0dFRkbqxhtvVHp6uuV9SNKMGTNs2U7BwcFq166dIiMjFRkZqRUrVlgaX5JOnz6tCRMmqG3btgoPD1dcXJxlsY8dO+bKPTIyUiEhIXI6nfrxxx8t6+Ojjz5Sly5dFBUVpYiICL3++uuWxZakDz/8UF27dlXHjh3Vo0cPbd++vcIxyxpbGRkZiomJUUhIiKKjo7V7925L41s1pkuLY/WYLitXq8b0pbZFRcd0WfGtGtNlxbdyPJfWh5Vjuqx1sGpMlxXfqjFd3nv+0KFDuu2229S2bVtFRERow4YNlvcxZ84chYaGqkaNGnr//fctj//b3/5WoaGhioyM1E033XRFY628+Pfff79rLHfr1k3/+c9/LI1/weuvvy6Hw2HLNurTp49atWrlGg/z58+3NL4xRtOnT1dISIgiIiLUp08fS+PHxMS4co+IiJDD4dCOHTss7SMtLU033HCDoqKiFBYWprlz51oaf+vWrerZs6frvfTJJ59cdnyp7H2LVfvl8vqwat9cWnwr981l5W/VfvlScaz4rF1WH5XxefuqYHBVWL9+vcnJyTEtW7Y0O3futDT2qVOnzAcffGCKioqMMca8/PLLpn///pb2YYwxR48edf29atUqExUVZXkfn3/+ubnttttMUFCQ5dvJjm1/sd///vfm4Ycfdr0W33//vW19Pf/88+aOO+6wLF5RUZFp3Lix2b59uzHGmMzMTFOnTh1z/PhxS+L/+OOPpkmTJmb37t3GGGPWrVtnwsPDKxy3rLF18803m0WLFhljjHn77bdNjx49LI1v1ZguLY7VY7qsXK0a0+VtCyvGdFnxrRrTZcW3cjx78n6pyJguLb6VY7q0+FaO6fLe8/fff7955plnjDHGbNmyxQQFBZmzZ89a2semTZvMN998Y3r37m3ee+89y9fh3XffdeX83nvvmbZt21oav/hY/uKLL0yTJk1c7ayIb4wxOTk55oYbbjA9evSwZRtVZNt7Ev+FF14wgwYNMqdPnzbGXNl49vR/89tvv20iIiIsX4fIyEjz7rvvGmOMOXLkiPH19TVffvmlJfGLioqMv7+/+eSTT4wxxnz11VcmICDAnDx58rLXoax9i1X75fL6sGrfXFp8K/fNZeVv1X65vDhWfdYuq4/K+Lx9NaDIvspUxhtv69atpnXr1rb2sXjxYtOlSxdLYxYUFJgePXqYb7/91pbtZPe2z8/PNw0bNjQnTpywrY/i2rdvb1atWmVZvAsfyNevX2+MMWb79u3Gz8/P9YGkorZu3WrCwsLc7vPx8TGff/65JfGLv74//PCDadiwoetDbVFRkWnevLnJzMy0JL4n91sV3xjrxnR5fVgxpi+Ob/WYtqvILi2eXeO5vJytGNOlFdlWjuni8e0c08Xf8/Xq1TOHDh1yPdatWzeTmppqaR8XWFHolRffGGPy8vJM7dq1zblz52yJn5qaapo2bXrZRfal4t9+++1m06ZNtm0jK+OWFt/f399kZGTYFr+422+/3cyfP9/yPiIjI83rr79ujDEmOzvb+Pv7mwMHDlgSPy8vz9StW9ftsYiICJOcnFyh+Bf2LXbsly/uozgr9w9l7R+t2jeXFd+qz9rF49j1Wbt4H7+UIttZ1TPpqHwvvfSSBg4caEvs++67T6mpqZLOHyZopaefflpxcXG6/vrrLY1b3MiRI1VUVKTu3bvrueeek6+vr2Wx9+3bpyZNmmjWrFlau3at6tatq+nTp6tv376W9XHBxo0bdeTIEd1xxx2WxXQ4HHrrrbc0aNAg1atXT0ePHtXKlStVu3ZtS+K3bdtWeXl52rRpk3r06KFVq1YpPz9fWVlZ6ty5syV9XJCTkyM/Pz85nef/BTocDgUFBSk7O1vBwcGW9lUZGNNls2tMV+Z4lhjTF7vwnj9y5IiKiorcXtfg4GBlZ2dXNH1bx1V58V988UXFxsaqRo2KndF3cfxp06bp7bffdr3ODofDsvivvvqqwsPD1b179wrFLK8PSZoyZYqeeOIJtW/fXs8995xatWplSfzjx48rLy9Pq1atUnJysiTp0Ucf1bBhwyzNX5L279+vdevWacmSJRWKXVofixYt0l133aWnnnpKeXl5+tvf/qYWLVpYEr9p06Zq3ry5kpOTNXjwYG3evFl79+694sOhL9632LFftnP/5Un8iv4PKSu+VetVWhyr98tl5Wrn5+2rRlVX+XBn97c7s2fPNj169DA///yzbX0Yc/4bq9tvv92yeJ999pm5+eabXd+827GdvvvuO2OMMWfOnDFTp061NH9jjElLSzOSXN8yp6enm6ZNm7rNwFjlgQceMFOmTLE05tmzZ03fvn3Nhg0bjDHnD8v08/MzR44csayP9evXm969e5vOnTubiRMnmvbt25s1a9ZYErv4eyYtLc20b9/e7fGuXbu6ZvQqGt+T+62Kb+WYvtRMdkXHRPH4dozpi2NYPaYvfg/ZMZ7L2g5Wjeni8e0Y06WdNmH1mC7+nj98+LDx9vZ2e3zIkCGu18WKPoqzaja1rPhLly41ISEh5ocffrAlvjHGfPzxx6Zr164VOmKhePxvv/3WREVFuQ4btmsbZWdnG2POz3C+/PLLJY6SqEj8w4cPG0lmxowZxpjz/zv8/Pwq9D+prNdg1qxZZujQoRXKvaw+RowYYVasWGGMMWbfvn0mMDDQfP3115bF3759u7nttttMVFSUue+++8wtt9xiXnrppQqtw4V9ix375Yv7KM7qWdqL41u5by5r/2vVZ+0Lcez8rF08V7s/b18tKLKvMnYW2c8//7zp0qWL2zkSdvLy8jKHDx+2JNZzzz1nfvWrX5mWLVuali1bmpo1axo/Pz+TkpJiSfyLff/998bHx8fSmHl5eaZGjRqmsLDQdZ9VhzUWl5+fb+rXr2+++uorS+OWduhn165dXednWa2goMA0atTIssP3Lj5cvEGDBtX+cHGrx/Slcq3omC4e344xXV7+Vozp4vHtGs+lrYOVY/pSh3NXdEyX9xpYMaZLe897e3tberh4eePKigKyrPj//Oc/TZs2bVwfQK2OX1xoaKhJS0uzJP4bb7xhmjdv7hrLderUMc2aNTN/+9vfrih+aX2Upk6dOlf8/6i0+D4+Pmbfvn2u5aFDh7rOD7YivjHn9zWtW7c2H3744RXFLa+P0g7nHjJkiHnttdcsiV+adu3ambVr115R/OK8vLzMwYMHLd8vX9xH8feL1Z+3i8e34/N2Wftfqz5re3l5mVmzZtn6Wbu0XO34vH21oMi+ythVZM+bN8907tzZ/Pjjj5bHNsaYn376yezfv9+1vHLlSuPv71/hc77KYvV2ys/Pd/tnOG/ePHPjjTdaFv+C/v37mw8++MAYY0xWVpZp2rSp5Rc/W7RokenZs6elMY0x5uDBg6Z+/fqub8UzMjLMddddZ3Jzcy3ro/i2ePLJJ82gQYMsi33xe6Z3795uF1jp3r27pfEvdX9F49sxpov3YceYLm9bWD2TbceYvjhHO8ZzadvByjFdPL4dY/ri/K0c02W950eNGuV24bPAwMAruvBZeX1cUNEiu6z4K1asMG3atDFZWVlXHLus+GfPnjV79+51LW/evNlcd911V/S/w5P/O3Zso7Nnz5qDBw+6lt955x0TFBRkWXxjjHnwwQfNggULjDHnL9rXsmXLK7p+QHnbKDU11QQGBlb4fPvS+igsLDTXXXedWbdunTHmfNEdEBBgtmzZYkl8Y4zb+d1/+9vfTJcuXS57n1DevsWq/bIn+6+K7HPKi2/Fvrms+MeOHbNkv+zp/t2ObVRZn7evBhTZV4mHHnrI+Pv7m5o1a5rmzZtbemGynJwcI8m0atXKdOrUyXTq1MlER0dbFt+Y84dxdevWzURERJiOHTuavn37mi+++MLSPoqzusjet2+fiYyMNB06dDARERHmzjvvtOzb04v76d27t4mIiDCdOnUyK1eutLyPXr16XfE315fy5ptvul7jDh06mOXLl1saf8yYMSY0NNS0bt3axMXFWfItcFlj6+uvvzY9evQwbdu2NV26dDG7du2yNL5VY7q0OFaP6dL6sHJMe7ItKjKmS4tv5ZguK38rx3N528iKMV1WfKvGdFnxrRrT5b3nDx48aPr372/atGlj2rdv7yoyrOxjzpw5xt/f39SuXds0adLE+Pv7X/apAeXFdzqdJiAgwHV/p06dLnt2qqz4BQUFJiYmxoSHh5uOHTuaG264wfznP/+5rNiXyr+4ihTZZfWRn59vunTp4nqv3nLLLSY9Pd3SdcjLyzN33HGHCQ8PN+Hh4eavf/2rpfGNMSYuLs48/fTTlx3X0z4+/vhj07lzZ9OxY0cTFhZmXnjhBUvjT58+3bRt29a0adPGDBw40HUI/+Uob99i1X65vD6s2DeXFd+qfXNZ8a3aL3sapyL75bL6qKzP21cDhzHGVP6Z4AAAAAAAXHsqdulKAAAAAADgQpENAAAAAIBFKLIBAAAAALAIRTYAAAAAABahyAYAAAAAwCIU2QAAVCMrV65Uly5dFBkZqbCwMPXt21dFRUXlPqdPnz56//33S33sgQce0H//+98rzmf16tXasmXLFT8fAIBrjbOqEwAAAJ45ePCgxo0bp61bt6ply5aSpG3btsnhcFxxzH/84x8Vymn16tXq2rWroqOjKxQHAIBrBTPZAABUEwcOHJDT6VSTJk1c93Xu3FkOh0PBwcHatWuX6/6uXbtq3bp1ruW1a9eqT58+atu2raZMmSJjjCT3We4TJ07owQcfVHR0tDp27Khx48bp7NmzkqT9+/dryJAh6tixozp27Kg//vGPSklJ0Zo1a5SQkKDIyMgKF+wAAFwLKLIBAKgmOnXqpBtuuEFBQUH69a9/reeff1779+/36Lm7d+/Wxx9/rO3btys1NVVvv/12iTaTJ0/WTTfdpC1btmj79u0qLCzUX/7yF0lSXFycunfvrh07dmjHjh2aOHGiYmNjdeedd2ratGlKT0/XAw88YOn6AgBQHXG4OAAA1USNGjWUnJysr7/+WuvXr9e//vUvzZ49W2lpaZd87qhRo1SrVi3VqlVLcXFxWrt2re655x63NqtXr9amTZs0b948SdKpU6dUu3Zt5efn67PPPtPHH3/sauvr62vtygEAcI2gyAYAoJpp166d2rVrp/j4eN12221as2aNnE6nzp0752pTUFBQbozSzuM2xmj16tVq1aqV2/35+fnWJA4AwC8Ah4sDAFBN7N+/X//73/9cy0ePHlVmZqZat26t1q1ba/PmzZKkLVu2aM+ePW7PXbp0qQoLC3Xq1Cm9+eab6tevX4n4d955pxISElRYWOiK/80338jHx0e9evXS/PnzXW3z8vIkSQ0aNNBPP/1k+boCAFBdUWQDAFBNFBYWaubMmQoJCVFkZKRuvPFGjRo1SnfddZdmz56tF198Ud27d9eiRYsUHh7u9tzOnTurX79+6tixo3r37q0hQ4a4Hrswq/3CCy/I6XQqMjJSHTt2VL9+/ZSVlSXpfJG+adMmhYeHq1OnTq5zte+99169+eabXPgMAID/j8NcuLwoAAD4xQkPD9fChQvVo0ePqk4FAIBrAjPZAAD8QoWGhqpt27b8xjUAABZiJhsAAAAAAIswkw0AAAAAgEUosgEAAAAAsAhFNgAAAAAAFqHIBgAAAADAIhTZAAAAAABYhCIbAAAAAACLUGQDAAAAAGCR/wfVZvAaEYqJfAAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<Figure size 1200x240 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Average acc: 0.9224380952380953\n", | |
"Average f1: 0.9521142857142857\n" | |
] | |
} | |
], | |
"source": [ | |
"# acc\n", | |
"subjects = []\n", | |
"acc = []\n", | |
"acc_min = 1.0\n", | |
"acc_max = 0.0\n", | |
"\n", | |
"for subject_id in subject_kfold_acc:\n", | |
" subjects.append(subject_id)\n", | |
" avg_acc = np.mean(subject_kfold_acc[subject_id])\n", | |
" if avg_acc < acc_min:\n", | |
" acc_min = avg_acc\n", | |
" if avg_acc > acc_max:\n", | |
" acc_max = avg_acc\n", | |
" acc.append(avg_acc)\n", | |
"\n", | |
"\n", | |
"x_pos = [i for i, _ in enumerate(subjects)]\n", | |
"figure(num=None, figsize=(15, 3), dpi=80, facecolor='w', edgecolor='k')\n", | |
"plt.bar(x_pos, acc, color='skyblue')\n", | |
"plt.xlabel(\"Subject\")\n", | |
"plt.ylabel(\"Accuracies\")\n", | |
"plt.title(\"Average k-fold Accuracies by subjects\")\n", | |
"plt.xticks(x_pos, subjects)\n", | |
"plt.ylim([acc_min-0.02, acc_max+0.02])\n", | |
"plt.show()\n", | |
"\n", | |
"# f1\n", | |
"subjects = []\n", | |
"f1 = []\n", | |
"f1_min = 1.0\n", | |
"f1_max = 0.0\n", | |
"\n", | |
"for subject_id in subject_kfold_f1:\n", | |
" subjects.append(subject_id)\n", | |
" avg_f1 = np.mean(subject_kfold_f1[subject_id])\n", | |
" if avg_f1 < f1_min:\n", | |
" f1_min = avg_f1\n", | |
" if avg_f1 > f1_max:\n", | |
" f1_max = avg_f1\n", | |
" f1.append(avg_f1)\n", | |
"\n", | |
"\n", | |
"x_pos = [i for i, _ in enumerate(subjects)]\n", | |
"figure(num=None, figsize=(15, 3), dpi=80, facecolor='w', edgecolor='k')\n", | |
"plt.bar(x_pos, f1, color='skyblue')\n", | |
"plt.xlabel(\"Subject\")\n", | |
"plt.ylabel(\"Accuracies\")\n", | |
"plt.title(\"Average k-fold F1 by subjects\")\n", | |
"plt.xticks(x_pos, subjects)\n", | |
"plt.ylim([f1_min-0.02, f1_max+0.02])\n", | |
"plt.show()\n", | |
"\n", | |
"\n", | |
"print('Average acc:', np.mean(acc))\n", | |
"print('Average f1:', np.mean(f1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"cca_based_acc = {\n", | |
" 1:\t{\"itcca\": 0.92, \"trca\": 0.93, \"cca\": 0.51, \"fbcca\": 0.78},\n", | |
" 2:\t{\"itcca\": 0.94, \"trca\": 0.98, \"cca\": 0.7, \"fbcca\": 0.88},\n", | |
" 3:\t{\"itcca\": 0.99, \"trca\": 0.99, \"cca\": 0.95, \"fbcca\": 0.98},\n", | |
" 4:\t{\"itcca\": 0.97, \"trca\": 0.96, \"cca\": 0.84, \"fbcca\": 0.88},\n", | |
" 5:\t{\"itcca\": 0.99, \"trca\": 0.98, \"cca\": 0.71, \"fbcca\": 0.89},\n", | |
" 6:\t{\"itcca\": 0.88, \"trca\": 0.9, \"cca\": 0.56, \"fbcca\": 0.74},\n", | |
" 7:\t{\"itcca\": 0.89, \"trca\": 0.95, \"cca\": 0.48, \"fbcca\": 0.68},\n", | |
" 8:\t{\"itcca\": 0.81, \"trca\": 0.86, \"cca\": 0.37, \"fbcca\": 0.48},\n", | |
" 9:\t{\"itcca\": 0.8, \"trca\": 0.78, \"cca\": .56, \"fbcca\": 0.73},\n", | |
" 10:\t{\"itcca\": 0.91, \"trca\": 0.9, \"cca\": 0.66, \"fbcca\": 0.76},\n", | |
" 11:\t{\"itcca\": 0.54, \"trca\": 0.54, \"cca\": 0.2, \"fbcca\": 0.28},\n", | |
" 12:\t{\"itcca\": 0.99, \"trca\": 0.98, \"cca\": 0.9, \"fbcca\": 0.93},\n", | |
" 13:\t{\"itcca\": 0.96, \"trca\": 0.95, \"cca\": 0.49, \"fbcca\": 0.68},\n", | |
" 14:\t{\"itcca\": 0.99, \"trca\": 0.99, \"cca\": 0.83, \"fbcca\": 0.88},\n", | |
" 15:\t{\"itcca\": 0.78, \"trca\": 0.83, \"cca\": 0.41, \"fbcca\": 0.46},\n", | |
" 16:\t{\"itcca\": 0.55, \"trca\": 0.74, \"cca\": 0.18, \"fbcca\": 0.55},\n", | |
" 17:\t{\"itcca\": 0.9, \"trca\": 0.92, \"cca\": 0.48, \"fbcca\": 0.54},\n", | |
" 18:\t{\"itcca\": 0.76, \"trca\": 0.78, \"cca\": 0.46, \"fbcca\": 0.65},\n", | |
" 19:\t{\"itcca\": 0.32, \"trca\": 0.37, \"cca\": 0.15, \"fbcca\": 0.25},\n", | |
" 20:\t{\"itcca\": 0.95, \"trca\": 0.95, \"cca\": .63, \"fbcca\": 0.87},\n", | |
" 21:\t{\"itcca\": 0.83, \"trca\": 0.95, \"cca\": 0.39, \"fbcca\": 0.57},\n", | |
" 22:\t{\"itcca\": 0.93, \"trca\": 0.95, \"cca\": 0.68, \"fbcca\": 0.94},\n", | |
" 23:\t{\"itcca\": 0.89, \"trca\": 0.88, \"cca\": 0.62, \"fbcca\": 0.9},\n", | |
" 24:\t{\"itcca\": 0.95, \"trca\": 0.96, \"cca\": 0.66, \"fbcca\": 0.84},\n", | |
" 25:\t{\"itcca\": 0.97, \"trca\": 0.98, \"cca\": 0.86, \"fbcca\": 0.8},\n", | |
" 26:\t{\"itcca\": 0.99, \"trca\": 1,\t\"cca\": 0.87, \"fbcca\": 0.83},\n", | |
" 27:\t{\"itcca\": 0.98, \"trca\": 1, \"cca\": 0.79, \"fbcca\": 0.88},\n", | |
" 28:\t{\"itcca\": 0.92, \"trca\": 0.95, \"cca\": .58, \"fbcca\": 0.9},\n", | |
" 29:\t{\"itcca\": 0.6, \"trca\": 0.52, \"cca\": 0.15, \"fbcca\": 0.4},\n", | |
" 30:\t{\"itcca\": 0.88, \"trca\": 0.86, \"cca\": 0.6, \"fbcca\": 0.72},\n", | |
" 31:\t{\"itcca\": 1, \"trca\": 1, \"cca\": 0.9, \"fbcca\": 0.98},\n", | |
" 32:\t{\"itcca\": 1, \"trca\": 1, \"cca\": 0.86, \"fbcca\": 0.92},\n", | |
" 33:\t{\"itcca\": 0.36, \"trca\": 0.42, \"cca\": 0.2, \"fbcca\": 0.26},\n", | |
" 34:\t{\"itcca\": 0.97, \"trca\": 0.98, \"cca\": 0.8, \"fbcca\": 0.86},\n", | |
" 35:\t{\"itcca\": 0.94, \"trca\": 0.93, \"cca\": 0.63, \"fbcca\": 0.57}\n", | |
"}\n", | |
"\n", | |
"fbcca = []\n", | |
"trca = []\n", | |
"cca = []\n", | |
"subjects_id = list(cca_based_acc.keys())\n", | |
"\n", | |
"for subject in cca_based_acc:\n", | |
" fbcca.append(cca_based_acc[subject][\"fbcca\"])\n", | |
" trca.append(cca_based_acc[subject][\"trca\"])\n", | |
" cca.append(cca_based_acc[subject][\"cca\"])\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAABl0AAAE2CAYAAADrgFStAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOz9e5yVZaE3/n/WAM4wQOIGikAUDIswkgxJ26kpHogyBVNUNE0fdJvlgdFyu78WaB723ooT0kEMT0C0QyozrEhTe/JIFkqGPsojIKggKCoOKDDr90c/54k4OAtmYA2836/Xer1a131d9/qsiRlwPuu670KxWCwGAAAAAACArVKxvQMAAAAAAADsCJQuAAAAAAAATUDpAgAAAAAA0ASULgAAAAAAAE1A6QIAAAAAANAElC4AAAAAAABNoPX2DlDOKisr06VLl+0dAwAAAAAAKAOvvPJK3n777U0eV7psRpcuXbJo0aLtHQMAAAAAACgDu++++2aPu7wYAAAAAABAE1C6AAAAAAAANAGlCwAAAAAAQBNwTxcAAAAAANhJ1NfXp1gsbu8YZa1QKKSiYsv2rChdAAAAAABgB/fOO+9k4cKFWbNmzfaO0iK0adMme+yxR3bZZZeS1pVl6XL11Vfn8ccfz5/+9KcsWLAg++67b2bPnl3SOerr6/Pd7343N954Y55//vm8//3vz4knnpgxY8akurq6mZIDAAAAAED5WbhwYTp06JBOnTqlUChs7zhlrVgsZvny5Vm4cGF69+5d0tqyLF0uvfTS/Mu//EsGDBiQ5cuXb9E5LrzwwowbNy5Dhw5NTU1N5s6dm9ra2syePTszZ870hwoAAAAAgJ1CfX191qxZk06dOqV167KsBcpOp06d8uqrr6a+vr6kS42V5Vd33rx52WuvvZIkPXv2LHn9U089lRtuuCHDhg3L9OnTG8Z79eqV8847L9OmTcsJJ5zQVHEBAAAAAKBsvXsPF5sRGu/dr1Wp978py9Ll3cJlS02dOjXFYjEXXHDBeuMjR47MJZdcksmTJytdAAAAAADYafW8ZEaznHf+NZ9vlvO2FGVZumytWbNmpaKiIgMHDlxvvKqqKv3798+sWbO2UzIAAAAAAKBnz56pq6vL4sWL06ZNmyTJ73//+wwaNCif+MQnUl9fnyR5+eWXU19fn27duiVJLr744jz77LNZuXJlrr322u2Wf1N2yNLlxRdfTOfOnVNZWbnBse7du+ehhx7KunXr0qpVq/WOjR07NmPHjm14vnLlymbPCuzYGvuJgZ39EwAA5cDPbADYiNG7NnLe682bY5OvW+b52Hlspz+Ljf43bNXJjTuh7xW2sT322CO//OUvc9xxxyVJbr755gwYMCCHHHJIQ6EyevToDQqW0aNHb4+4jbJDli51dXUbLVySv+92SZJVq1alffv26x0bNWpURo0a1fB89913b76QAAAAAEDZKuXSS/OrmjEI7MDOOOOM3HzzzTnuuOPy+uuv55FHHslJJ52UVatWbe9oW2yHLF2qq6uzdOnSjR5bvXp1kqRt27bbMhJsOZ/aoRm1hE91t4SM5c7XkBbF33sA7AD8+2vrNf7T+80cBKAM7Mh/rxx88MG54YYbsnjx4tx11105/vjjN7hCVUuzQ5Yu3bp1y9/+9re8/fbbG+x4Wbx4cbp27dri/48DAABgQzvyLyWgKSk1tp6fNwBN49RTT81tt92WX/ziF5kyZUqmTJmyvSNtlR2ydNl///0zc+bMPPbYYznooIMaxlevXp3Zs2fnsMMO247pKDs7yCdq+93Wr1Hz5pw2p5mTbDuuWwqUnR3k7xQAYBvxbwfY6eyMv7/ZYfiZ3WxOP/307Lfffvnwhz+cvffee3vH2WotvnRZuHBh6urq8qEPfSht2rRJkgwfPjxXXXVVamtr1ytdbrrpptTV1WXEiBHbKy408KkiAABampKube+T3RvlawgAsL5u3brl6quvTp8+fbZ3lCZRlqXLpEmTsmDBgiTJ66+/nrfffjvf+c53kiR77rlnTj311Ia5X/7yl/PAAw/k+eefT8+ePZMk/fr1y7nnnpvx48dn2LBhGTJkSObOnZtx48blsMMOy/Dhw7f5ewIAaE4ubwEAAEApyum/D7/yla+UvObGG2/MT37yk4bno0aNyqhRo5oy1hYpy9Jl4sSJeeCBB9Ybu+yyy5IkhxxyyHqly6bU1tamZ8+emTBhQmbMmJEuXbrk/PPPz5gxY1IoFJol987EL3YAAAAAgJbO1Wi2n/nz5290fPTo0Zt9/u7YxsbLQVmWLvfff/9Wz23VqlVqampSU1PTNKEAAAAAAAA2oyxLF6CFcSMxAACgHPlvFQBgG1O6AJtkeyUAAAAAQOMpXQB4bz4hCDsO38/AtlLuP2/KPV/SMjJuJz4gRoviexlgp1KxvQMAAAAAAADsCOx0AQAAgBas3239GjVvzmlzmjkJAABKFwAAoEk0+nI/13y+mZMAAADvqbGXPyz5vDv35RJdXgwAAAAAANhm+vfvn/79+6dv375p3bp1w/Phw4dn/vz5DWP77rtv9t1338yYsf4HvB5//PEMHjw4e+21Vz72sY/lwAMPzC9+8Yv15hx88MHZe++9UywWt+Vbs9OFZuZmcQCwAZeBAQCgudmBCjuhzf0utlVVcvjtyUurkt3323aZNmH27NlJkvnz52fAgAENz98d69ixY8PY3XffnRNPPDGvvfZaWrVqlaeeeipHHXVUbrnllhx99NFJksWLF+eee+5pOMezzz6bZ599Nrvttlv+8Ic/5JBDDtlm703pAgAA7BT88gkAAFqeQw89NG+++WZeffXVdOnSJddcc03OOOOMhsIlSbp3757TTjut4fnEiRNzyimn5IMf/GAmTpyodAEAKCeN/kVtVTMHgR2F3dAAAGXJrnzK0bRp03LYYYelS5cuSf5+abErr7xyk/PXrl2b22+/Pffee286d+6cyy+/PK+//np23bWZ7mHzT5QuAAAAAABA2VixYkX69++fV199NcuWLcvvf//7Rq+9++67s+eee+ajH/1okuTwww/P1KlT82//9m/NFXc9Shd2SI39RHLiU8kAAAAAAOXk3Xu6FIvFXHHFFTnxxBPz9NNPp6qqKp/85Cfz8MMPZ+jQoRtdO3HixDz77LPp2bNnkmTVqlVZsGCB0gUAAGBn474zAOxM/L0HvJdCoZDLLrssv/zlL/ODH/wgF154Yb7xjW/k0EMPzSGHHJLPf/7vPx8WLVqUu+++O1/84hdz7733ZtGiRenYsWOSZN26denevXuefPLJfPzjH2/2zEoXAAAAAADY2bSQeygWCoVcd911GT58eM4+++z069cvv/71r/Mf//Ef+frXv5527drlfe97X775zW/mtttuy1FHHdVQuCRJq1atctJJJ+VHP/pRxo0b1+x5lS4A5cANhVusHeqTWf4cQlnboX7eADsVN2WGxvG9AuyMevbsmWXLlr3n2CGHHJKXX3654fn++++fmTNnbnC+L37xixt9neuvv74J0jZOxTZ7JQAAAAAAgB2YnS4A/3+N/VRR4pNFAAAAAMCG7HQBAAAAAABoAna6QCO5turW8zUEoKn4OwWgDDT2fnC99mjeHNAIrmwAwLZipwsAAAAAAEATULoAAAAAAAA0AZcXAwAAYLtxuUAAgO2jlEsvlqKx/27r2bNnqqqqUlVVlSQ54IAD0rVr13z/+99Pt27dkiRt2rTJd7/73Xz6059OkqxduzZXXXVVfvzjH6dVq1ZZt25dDj744PzXf/1XOnbsmKVLl+ab3/xmHnjggbRr1y5JctJJJ+XSSy9teN1vfetbufLKK/N//+//zZ577tmUbz2JnS4AAAAAAMB2cMcdd2T27NmZPXt2fvjDHyZJvvzlLzeMXXzxxTn//PMb5p955pmZNWtWHn744Tz11FP529/+liOOOCKvvvpqVq1alUMOOSR77rlnnn322cyZMyePPPJIQ/mSJPX19bn11ltz8MEH59Zbb22W92SnCwA7hsbeyHX0682bAwAAgKblv/doQezibVqvvfZadttttyTJc889l2nTpmXhwoUNYxUVFTn++OOTJBMnTkyHDh0yevTohvXt2rVbr7SZOXNmPvCBD+S6667LsGHDctlll6Wiomn3pihdAAAAAACAbe5LX/pSw+XFvv3tbydJbr/99txzzz15/fXX88Ybb+S3v/1tkuTPf/5z9t5773Tu3Hmj53r88cdz4IEHbvb1Jk6cmDPOOCP77bdfdtttt9x777054ogjmvAdubwYAAAAAACwHfzj5cWGDh2a5P9dXuz555/PT3/60wwbNiyrVq3a6tdatmxZfve73+Wkk05K8vdLlU2cOHGrz/vP7HQBAAAAAADKzqBBg7J69er89a9/zX777Zdnn302y5cvT6dOnTaY+8lPfjITJkzY5LkmTZqUtWvXpn///kmSdevWZfny5Zs835ay0wUAAADYqfW7rV+jHgDAtvXEE09k5cqV6dmzZ3r37p3jjjsuZ555ZlasWJEkKRaLuf322zNv3rycdNJJWbFiRa644oqsW7cuSVJXV5drrrkmSXLzzTfnjjvuyPz58zN//vy88MILGTJkSKZMmdKkme10AQAAAACAncyc0+Zs7wgb9e49XYrFYgqFQiZNmpQuXbok+Xtx8p3vfCef+tSn0rp16xSLxRx88MH54he/mOrq6jzwwAO55JJL0rt377Rv3z6FQiEnn3xyHn300SxdujSHH374eq916qmn5lvf+lbOO++8JsuvdAEAAAAAALap+fPnbzA2evTojB49epNr2rRpkzFjxmTMmDEbPd61a9fceuutGz22ZMmSDcaOOeaYHHPMMY2J22hKFwAAKMXoXRs57/XmzQEAZaSxl18r109VA0BTcU8XAAAAAACAJlC2pUt9fX2uv/769OnTJ5WVlenRo0cuvvji1NXVNWr9Cy+8kH/7t39L796907Zt2/To0SNDhw7No48+2szJAQAAAACAnVHZXl7swgsvzLhx4zJ06NDU1NRk7ty5qa2tzezZszNz5swUCoVNrl2yZEkGDBiQd955p6F4WbRoUW688cZ85jOfyb333puDDz54G74bAAAAAADYPgrF+iRJcTvnaEmKxb9/tTbXRWxMWZYuTz31VG644YYMGzYs06dPbxjv1atXzjvvvEybNi0nnHDCJtdPmjQpS5cuzS9+8Yv1boJzzDHH5BOf+ERuvvlmpQsAAAAAADuFivp30uatF7P8rd3Sae3akouEnU2xWMzy5cvTpk2bVFSUdsGwsixdpk6dmmKxmAsuuGC98ZEjR+aSSy7J5MmTN1u6rFixIknSrVu39cbffV5dXd3EiQEAAAAAoHzt8fhVWZhL82p9h+0dpUVo06ZN9thjj5LXlWXpMmvWrFRUVGTgwIHrjVdVVaV///6ZNWvWZtcffvjhufLKK3Puuefmv//7vxsuL3bZZZelU6dOOf/885szPgAAAAAAlJVdVi1N7z9ekPpvvdZw6Sw2rlAolLzD5V1lWbq8+OKL6dy5cyorKzc41r179zz00ENZt25dWrVqtdH1n/3sZzNu3Lh8+9vfzmc/+9mG8b59++aRRx5J7969N7pu7NixGTt2bMPzlStXbt0bAQAAANhK/W7r1+i5c06b04xJANgRbGmZQOOU5Ve3rq5uo4VL8vfdLkmyatWqzZ5jzz33zL777pvLL788d955Z8aNG5eVK1fmyCOPzPPPP7/RNaNGjcqiRYsaHu3bt9+6NwIAAAAAAOw0ynKnS3V1dZYuXbrRY6tXr06StG3bdpPr77zzzgwdOjS/+c1vcuSRRzaMH3300enbt29qamrys5/9rGlDAwAAAAAAO7Wy3OnSrVu3LFu2LG+//fYGxxYvXpyuXbtu8tJiSVJbW5v27duvV7gkSc+ePfPJT34y999/f1NHBgAAAAAAdnJludNl//33z8yZM/PYY4/loIMOahhfvXp1Zs+encMOO2yz61988cXU19enWCymUCisd2zt2rVZs2ZNs+RmyzX2+rSuTQu0WKN3LWHu682XA4D35mc2AACwhcpyp8vw4cNTKBRSW1u73vhNN92Uurq6jBgxomFs3rx5efrpp9eb17dv37z11luZPn36euN//etf8/jjj2f//fdvvvAAAAAAAMBOqcl3uixZsiQvvvhiPvKRj6S6unqLztGvX7+ce+65GT9+fIYNG5YhQ4Zk7ty5GTduXA477LAMHz68Ye6gQYOyYMGCFIvFhrF///d/z69//euMGDEi999/fz7+8Y9nwYIF+f73v58kufzyy7fuTQIAAAAAAPyTkne6PProoxk1alRmzJix3vgbb7yRY445Jt26dcuAAQPStWvX3HLLLVscrLa2Ntdee22eeuqpnHvuufmf//mfnH/++fnlL3+5wSXD/tnAgQPzl7/8Jccdd1x+/etf5+tf/3p++MMf5qCDDsof//jHfOYzn9niXAAAAAAAABtT8k6XH/3oR7n55ptz7LHHrjd+8cUX56677kpFRUV23XXXvPbaaxk5cmQGDBiQfv0ad7+Of9SqVavU1NSkpqZms/Pmz5+/0fGPfvSj+fGPf1zy6wIA0PR6XjLjvSclmV/VzEEAAACgGZVcujz44INp165dDj744IaxlStXZtKkSenQoUMeffTR9OnTJ+PGjcsFF1yQ6667LrfeemtTZgYAtqN+tzXuwxRzTpvTzEkAAAAAykvJlxdbsmRJevTosd7YAw88kNWrV2f48OHp06dPkuRrX/taOnfunEcffbRpkgIAAAAAAJSxkkuXN998M9XV1euN/fGPf0yhUMgRRxzx/05cUZGePXvmhRde2PqUAAAAAAAAZa7k0qVTp05ZsGBBisViw9g999yTJDnkkEPWm7tmzZrssssuWxkRAAAAAACg/JV8T5cDDjggv/zlL3PTTTflrLPOyj333JPHH388/fv3z/vf//6GecViMc8991z22GOPJg0MAAAANJ+el8xo1Lz5Vc0cBACgBSq5dKmpqcldd92Vc845J5deemlWrFiRQqGQmpqa9eb94Q9/yFtvvZX999+/ycIC7OzcwByA9zR610bOe715cwAAAOyESr682Gc+85lMnz49ffv2zVtvvZW99tor48ePz4gRI9ab98Mf/jBJcuSRRzZNUgAAAAAAgDJW8k6XJDnmmGNyzDHHbHbOhAkT8sMf/jAdOnTYomAAsLOyowkAAACgZdqi0qUxlC0AAAAAAMDOZKtKlwcffDAPPPBAFi9enNWrV2fixIkNx+bPn5933nknH/7wh7c6JAAAAADA5rhqAFAOtqh0ee655zJixIj86U9/SpIUi8UUCoX1Spf/+q//yo033pj7778/Bx10UNOkBQAAAAAAKFMVpS5YsmRJDjnkkMyaNSsDBgzI6NGj07t37w3mnX766SkWi5k+fXqTBAUAAAAAAChnJZcuV111VV566aWce+65eeSRR3LZZZflAx/4wAbzBg4cmA4dOuShhx5qkqAAAAAAAADlrOTS5Ve/+lXatWuXa6+9NoVCYbNz99prr7zwwgtbHA4AAAAAAKClKLl0Wbx4cfbee+9UVla+59zKysq89tprWxQMAAAAAACgJSm5dGnfvn1eeeWVRs1duHBhOnXqVHIoAAAAAACAlqbk0uUTn/hEXnzxxcyZM2ez8x544IG8/PLLOeCAA7Y4HAAAAAAAQEtRculy5plnplgs5owzzshLL7200Tnz5s3LGWeckUKhkJEjR251SAAAAAAAgHLXutQFJ554Yn72s5/ljjvuSN++fXPUUUdl4cKFSZJvfetb+etf/5q7774777zzTk499dQMHjy4yUMDUJ763dav0XPnnLb5HZPsPHpeMqPRc+df8/lmTMI/auz3s+9lAAAA+H9KLl2S5Mc//nE+9KEPpba2Nj/96U8bxq+88soUi8Xssssu+cY3vpErr7yyyYICAAAAAACUsy0qXVq3bp2rr746NTU1ufvuuzNnzpy8/vrrad++ffr27ZvPf/7z+eAHP9jUWQEAAAAAAMrWFpUu7+rcuXO+/OUvN1UWAAAAAACAFqtiewcAAAAAAADYEShdAAAAAAAAmsBmS5dWrVqlVatW2WeffTYYa+yjdeutuoIZAAAAAABAi7DZRqRYLCZJ6uvrNxhrrFLnAwAAtBT9buvXqHlzTpvTzEkAAIBysNnS5R/Lls2NAQAAAAAA7Ozc0wUAAAAAAKAJKF0AAAAAAACaQMmly3PPPZfLL788M2bM2Oy8GTNm5PLLL8/zzz+/xeEAAAAAAABaipJLlxtvvDFjxoxJRcXml1ZUVGTMmDGZMGHCFocDAAAAAABoKUouXX7729+muro6n/vc5zY7b/Dgwamurs5vfvObLQ4HAAAAAADQUpRcuixcuDB77bXXe84rFArZa6+9snDhwi0KVl9fn+uvvz59+vRJZWVlevTokYsvvjh1dXWNPseiRYty1llnZY899khlZWW6du2az33uc/nb3/62RZkAAAAAAAA2pXWpC9auXfuelxZ7V0VFRVatWlVyqCS58MILM27cuAwdOjQ1NTWZO3duamtrM3v27MycOTOFQmGz6//yl7/k8MMPT+fOnTNy5Mh07949y5cvz5/+9Ke88sorW5QJAAAAAABgU0ouXfbcc8/MnTs3K1asSMeOHTc5b8WKFfnb3/6Wnj17lhzqqaeeyg033JBhw4Zl+vTpDeO9evXKeeedl2nTpuWEE07Y5PrVq1fnhBNOSP/+/TNjxoxUVVWVnAEAAAAAAKAUJV9e7Kijjso777yTUaNGbXbeRRddlLVr12bw4MElh5o6dWqKxWIuuOCC9cZHjhyZ6urqTJ48ebPrf/rTn+a5557Lddddl6qqqqxatSrvvPNOyTkAAAAAAAAaq+TS5aKLLsr73ve+3HbbbTnqqKNyzz335M0330ySvPnmm/nd736XwYMH55ZbbkmHDh1y8cUXlxxq1qxZqaioyMCBA9cbr6qqSv/+/TNr1qzNrr/77rvToUOHrFq1KgMHDkx1dXWqqqoycODA3HvvvSXnAQAAAAAAeC8lly7dunXL9OnT8773vS+/+93vctRRR6Vjx45p1apVOnbsmMGDB2fmzJl53/vel+nTp2f33XcvOdSLL76Yzp07p7KycoNj3bt3z8svv5x169Ztcv0zzzyTdevW5Ygjjsjee++dadOm5YYbbsiiRYty1FFH5b777tvourFjx2b33XdveKxcubLk7AAAAAAAwM6p5NIlSQYNGpQnn3wy55xzTrp165Zisdjw6N69e772ta/lySefzKBBg7YoVF1d3UYLlyQN92dZtWrVJte/+eabqaury9FHH50pU6bkS1/6Us4999zcd999KRQKufTSSze6btSoUVm0aFHDo3379luUHwAAAAAA2Pm03tKFPXr0yPe+971873vfy8qVK/PGG2+kQ4cO6dChw1aHqq6uztKlSzd6bPXq1UmStm3bbnL9u8fOOOOM9cY/8pGP5NOf/nT++Mc/pq6uLtXV1VudFQAAAAAAINnCnS7/rH379unWrVuTFC7J3y9htmzZsrz99tsbHFu8eHG6du2aVq1abXL9u5c0++AHP7jBsQ9+8IOpr6/PihUrmiQrAAAAAABA0kSlS1Pbf//9U19fn8cee2y98dWrV2f27NkZMGDAZtcPHDgwSfLCCy9scGzhwoVp3bp1/uVf/qXpAgMAAAAAADu9Lb682FtvvZW77rorTzzxRF599dWsWbNmo/MKhUImTpxY0rmHDx+eq666KrW1tTnooIMaxm+66abU1dVlxIgRDWPz5s3LmjVr0qdPn4axk08+OVdeeWXGjx+fwYMHp1AoJEn+9Kc/5ZFHHsnhhx/ecG8YAAAAAACAprBFpctPfvKTnHPOOXnjjTcaxorFYpI0FBzvjm1J6dKvX7+ce+65GT9+fIYNG5YhQ4Zk7ty5GTduXA477LAMHz68Ye6gQYOyYMGChtdP/n7vlm984xu5+uqrc+SRR+bYY4/NkiVLMm7cuLRr1y7XXnvtlrxtAAAAAACATSq5dHn44Ydz6qmnpm3btvmP//iP/M///E+ee+653HTTTXnhhRfyxBNP5K677kplZWX+v//v/0u3bt22KFhtbW169uyZCRMmZMaMGenSpUvOP//8jBkzZr1iZ1Ouuuqq9OzZM9/73vdSU1OTtm3b5rDDDssVV1yRffbZZ4syAQAAsHPpd1u/Rs2bc9qcZk4CANA0/PumeZVculx77bWpr6/PlClTcvTRR+e+++7Lc889lzPPPLNhztNPP53jjz8+3/ve9/L4449vUbBWrVqlpqYmNTU1m503f/78TR4766yzctZZZ23R6wMAAAAAAJSiotQFDz/8cDp37pyjjz56k3P69OmT6dOn56WXXsq3v/3trQoIAAAAAADQEpRcuixfvjx77LFHw/NddtklSfLWW2+tN+/DH/5w9tlnn/z617/eyogAAAAAAADlr+TLi3Xq1CmrVq1qeN65c+ckybx58/Lxj398vbnr1q3LkiVLtjIiAADQ1Bp7HefEtZwBAAAaq+SdLj179sxLL73U8Hy//fZLsVjMlClT1pv3xBNP5P/8n/+TLl26bH1KAAAAAACAMldy6XLEEUdkxYoVeeqpp5IkJ598cqqqqnLttdfmlFNOyfe+971861vfyqBBg1JfX5/jjjuuyUMDAAAAAACUm5IvL3bCCSfkoYceyjPPPJN99tknPXr0yA9+8IOcddZZ+fGPf5ypU6cmSYrFYg444IB85zvfafLQAMBOavSujZz3evPmALaJxl4CzeXPAACAclFy6bLPPvvkd7/73Xpjp512Wg466KD89Kc/zfz589O2bdt85jOfybHHHptWrVo1WVgAAAAAAIByVXLpsil77bVXLrnkkqY6HQAAAAAAQItS8j1devXqlX333TfvvPNOc+QBAAAAAABokUre6bJ06dJ06dIlu+yyS3PkAQAAAAC2lcbeNzFx70SARih5p8uHPvShrFixojmyAAAAAAAAtFglly6nnHJK5s2bl8cee6w58gAAAAAAALRIJZcuNTU1GTJkSI455uUzVeoAACAASURBVJjceeedKRaLzZELAAAAAACgRSn5ni5HHHFEisVili1blmHDhmXXXXfN3nvvnXbt2m10fqFQyL333rvVQQEAAAAAAMpZyaXL/fffv97zFStWZNasWZucXygUSg4FAAAAAADQ0pRcutx3333NkQMAAAAAAKBFK7l0OeSQQ5ojBwAAAAAAQItWsb0DAAAAAAAA7AhK3ukCAC1Zv9v6NWrenNPmNHMSAAAAAHY0JZcuhx12WEnzC4VC7r333lJfBgAAAAAAoEUpuXS5//7733NOoVBIkhSLxYb/DQAAAAAAsCMruXS57777NnnsrbfeynPPPZebb745Tz/9dK6++urst99+WxUQAAAAAACgJSi5dDnkkEPec87Xv/71nH/++Rk9enQeffTRLQoGAAAAAADQkpRcujRGoVDIf//3f+f222/PZZddlmnTpjXHywAAQNnqd1u/Rs2bc9qcZk4CAADAtlLRXCeurKzMhz/84UbdAwYAAAAAAKCla7bSJUkWLFiQurq65nwJAAAAAACAstAspUt9fX0uu+yyvPLKK9lnn32a4yUAAAAAAADKSsn3dDnjjDM2eaxYLOaVV17J7Nmz89JLL6VQKOSb3/zmVgUEAAAAAABoCUouXW699dZGzevWrVv+8z//M8cdd1ypLwEAAAAAANDilFy63HLLLZs8VigU0q5du+y1117Zd999U1HRrLeMAQAAAAAAKBslly6nnXZac+QAAAAAAABo0WxFAQAAAAAAaAIl73RZsmRJfvvb36Z379759Kc/vcl5Dz74YObNm5fBgwfn/e9/f8nB6uvr893vfjc33nhjnn/++bz//e/PiSeemDFjxqS6urqkc82ZMyf77bdf1q5dm5///Oc59thjS84DAAAAAEAzGb1rI+e93rw5YCuVvNPlBz/4Qb7yla9k0aJFm523ePHifOUrX8mECRO2KNiFF16YUaNGpW/fvhk/fnyOP/741NbW5phjjkmxWGz0eYrFYs4+++xUVVVtUQ4AAAAAAIDGKLl0+dWvfpXKysocd9xxm503bNiwVFZW5pe//GXJoZ566qnccMMNGTZsWH72s59l5MiRGTt2bMaOHZt77rkn06ZNa/S5fvjDH+aJJ57IRRddVHIOAAAAAACAxiq5dJk/f3569eqVVq1abXZe69at06tXryxYsKDkUFOnTk2xWMwFF1yw3vjIkSNTXV2dyZMnN+o8L730Uv793/89l112Wfbcc8+ScwAAAAAAADRWyaVLXV1do++p0rZt27zxxhslh5o1a1YqKioycODA9carqqrSv3//zJo1q1HnOf/889OtW7fU1NSUnAEAAAAAAKAUrUtd0L1798ydOzerVq1K27ZtNzlv1apVefrpp9O1a9eSQ7344ovp3LlzKisrN/r6Dz30UNatW7fZ3TZ33313pk2blvvuuy9t2rRp1Ou+ewmzd61cubLk7AAAAACwI+p3W79GzZtz2pxmTgJQvkre6XLooYdm1apVueKKKzY77zvf+U7q6uoyaNCgkkPV1dVttHBJ/r7bJfl7qbMpb731Vr761a/mlFNOyWc/+9lGv+6oUaOyaNGihkf79u1Lyg0AAAAAAOy8Si5dLrroorRp0yb/+Z//mbPOOivPPvvsesefffbZnH322bnmmmuyyy67bNEN7Kurq/P2229v9Njq1auTZLO7bL797W/n9ddfz7XXXlvyawMAAAAAAGyJkkuXD3/4w5k4cWJat26diRMnpk+fPunUqVM+9KEPpVOnTunTp09uuumm9Y6Xqlu3blm2bNlGi5fFixena9eum7y02HPPPZfvfve7+epXv5pVq1Zl/vz5mT9/fpYtW5YkWbp0aebPn581a9aUnAsAAAAAAGBTSi5dkmTEiBF58MEHM3jw4LRu3TqvvfZann/++bz22mtp06ZNvvCFL+Shhx7KiBEjtijU/vvvn/r6+jz22GPrja9evTqzZ8/OgAEDNrl20aJFWbt2ba666qr06tWr4XHxxRcnSc4+++z06tUr8+bN26JsAAAAAAAAG9N6SxcOGDAgM2bMyOrVq/Pcc8/ljTfeSIcOHbL33ns33HdlSw0fPjxXXXVVamtrc9BBBzWM33TTTamrq1uvzJk3b17WrFnTsKPmYx/7WH7+859vcM7f//73ueGGG3LJJZfkU5/6VHbfffetyggAAAAAAPCPtrh0eVdVVVU+9rGPNUWWBv369cu5556b8ePHZ9iwYRkyZEjmzp2bcePG5bDDDsvw4cMb5g4aNCgLFixIsVhMknTu3DnHHnvsBudcsWJFkuRTn/rURo8DAAAAAABsjZJLlzVr1uSll15Ku3bt0qlTp03OW758ed56661069YtrVuX3u3U1tamZ8+emTBhQmbMmJEuXbrk/PPPz5gxY1IoFEo+HwAAwA5j9K6NnPd68+YAAADWU/I9XW666ab06tUrkyZN2uy8SZMmpVevXrn55pu3KFirVq1SU1OTZ555Jm+//XYWLVqUa6+9Nu3atVtv3vz58xt2uWzO6aefnmKxaJcLAAAAAADQLEouXe64445UVFTk9NNP3+y8008/PRUVFZk2bdqWZgMAAAAAAGgxSi5dnnnmmfTo0SMdO3bc7LyOHTumR48eeeaZZ7Y4HAAAAAAAQEtRcumyfPnydOnSpVFzu3TpkldeeaXkUAAAAAAAAC1NyaVLp06d8vzzzzdq7vPPP59dd23kDR4BAAAAAABasJJLl0996lNZvnx5pk6dutl5P/nJT7Js2bJ86lOf2uJwAAAAAAAALUXJpcs555yTYrGYs846Kz/+8Y83Omfq1KkZOXJkCoVCzjnnnK0OCQAAAAAAUO5al7rgiCOOyFe/+tV8//vfz6mnnppvfvObGThwYDp27JgVK1Zk1qxZWbx4cYrFYr761a9m8ODBzZEbAAAAAACgrJRcuiTJ+PHjs/fee+c73/lOFi9enJ///OfrHe/cuXMuu+yyfP3rX2+SkAAAAAAAAOVui0qXJDn//PNz9tln58EHH8zcuXPzxhtvpEOHDtlnn33yr//6r6msrGzKnAAAAAAAAGVti0uXJKmqqsqgQYMyaNCgDY4tXrw4U6ZMyeTJk/Pkk09uzcsAAAAAAACUva0qXf7ZypUrM3369EyaNCn3339/isViU54eAAAAAACgbG116VJfX5+ZM2dm0qRJufPOO7Nq1aqGsuUTn/hETjnllK0OCQAAAAAAUO62uHT5y1/+kkmTJmXq1KlZunRpQ9FSWVmZUaNG5ZRTTslHP/rRJgsKAAAAAABQzkoqXRYtWpQpU6Zk0qRJmTt3bpKkWCxmt912y/HHH58JEyZkt912y5VXXtksYQEAAAAAAMrVe5YuK1euzB133JFJkyblgQceSLFYTLFYTNu2bfOFL3whI0aMyOc+97m0adMmEyZM2BaZAQAAAAAAys57li4f+MAHsnr16hSLxbRq1SqDBg3KiBEjMmzYsLRv335bZAQAAAAAACh771m6rFq1KoVCIbvttlvGjx+fE088MYVCYVtkAwAAAAAAaDEq3mvCPvvsk2KxmNdeey2nnHJKevTokZqamjz++OPbIh8AAAAAAECL8J47XebMmZMnnngit99+e37yk5/kxRdfTG1tbWpra9O7d++MGDEiJ598cnr37r0t8gIAvKd+t/Vr1Lw5p81p5iQAAADAzuQ9d7okyb777pvrrrsuL7zwQn7zm9/kxBNPTNu2bfPss89mzJgx+chHPpL999+/ubMCAAAAAACUrUaVLg2TKypy5JFHZsqUKVmyZEluueWWHHrooSkUCg2XG1u6dGkGDRqUW2+9NW+++WazhAYAAAAAACg3JZUu/6hdu3Y57bTTcs8992ThwoW55ppr8rGPfSz19fW57777cuaZZ6Zr16456aSTmjIvAAAAAABAWdri0uUfdevWLd/4xjfy5JNP5s9//nMuuOCCfOADH8iqVavy05/+tCleAgAAAAAAoKy1buoT9u/fP/3798+1116bmTNnZvLkyU39EgAAAAAA7IT63davUfPmnDanmZPAxjV56fKuioqKDB48OIMHD26ulwAAAAAAACgbzVa6AAAAsH35JCgAAGxbShcAAAAAAJpFz0tmNGre/KpmDgLbSMX2DgAAAAAAALAjULoAAAAAAAA0AaULAAAAAABAE1C6AAAAAAAANAGlCwAAAAAAQBMo29Klvr4+119/ffr06ZPKysr06NEjF198cerq6t5z7f33359zzjkn++yzT9q3b5+uXbvm0EMPzYwZM7ZBcgAAAAAAYGdUtqXLhRdemFGjRqVv374ZP358jj/++NTW1uaYY45JsVjc7NpLLrkkd911VwYNGpTrr78+F110UZYuXZovfOELueKKK7bROwAAAAAAAHYmrbd3gI156qmncsMNN2TYsGGZPn16w3ivXr1y3nnnZdq0aTnhhBM2uf6aa67JQQcdlFatWjWMnXvuuenfv3+uuOKKfO1rX8tuu+3WrO8BAAAAAADYuZTlTpepU6emWCzmggsuWG985MiRqa6uzuTJkze7/rOf/ex6hUuStG3bNl/4wheyZs2aPPPMM02eGQAAAAAA2LmVZekya9asVFRUZODAgeuNV1VVpX///pk1a9YWnXfRokVJki5dumx1RgAAAAAAgH9UlqXLiy++mM6dO6eysnKDY927d8/LL7+cdevWlXTOOXPm5Oc//3kOOOCAfOhDH9ronLFjx2b33XdveKxcuXKL8gMAAAAAADufsixd6urqNlq4JH/f7ZIkq1atavT5li9fnmHDhqV169a56aabNjlv1KhRWbRoUcOjffv2pQUHAAAAAAB2WmVZulRXV+ftt9/e6LHVq1cn+fs9WhrjjTfeyODBg7Nw4cLccccd+djHPtZkOQEAAAAAAN5VlqVLt27dsmzZso0WL4sXL07Xrl3TqlWr9zzPypUr87nPfS6zZ8/OT37ykwwZMqQ54gIAAAAAAJRn6bL//vunvr4+jz322Hrjq1evzuzZszNgwID3PEddXV0+//nP59FHH82UKVMydOjQ5ooLAAAAAABQnqXL8OHDUygUUltbu974TTfdlLq6uowYMaJhbN68eXn66afXm7d69ep88YtfzB//+MfcdtttOeGEE7ZJbgAAAAAAYOfVensH2Jh+/frl3HPPzfjx4zNs2LAMGTIkc+fOzbhx43LYYYdl+PDhDXMHDRqUBQsWpFgsNoyNGDEi9957b4YMGZJisZjJkyevd/5Pf/rT2WuvvbbZ+wEAAAAAAHZ8ZVm6JEltbW169uyZCRMmZMaMGenSpUvOP//8jBkzJoVCYbNrH3/88STJ3XffnbvvvnuD47fccovSBQAAAAAAaFJlW7q0atUqNTU1qamp2ey8+fPnN2oMAAAAAACgOZXlPV0AAAAAAABaGqULAAAAAABAE1C6AAAAAAAANAGlCwAAAAAAQBNQugAAAAAAADQBpQsAAAAAAEATULoAAAAAAAA0AaULAAAAAABAE1C6AAAAAAAANAGlCwAAAAAAQBNQugAAAAAAADQBpQsAAAAAAEATULoAAAAAAAA0AaULAAAAAABAE1C6AAAAAAAANAGlCwAAAAAAQBNQugAAAAAAADQBpQsAAAAAAEATULoAAAAAAAA0AaULAAAAAABAE1C6AAAAAAAANAGlCwAAAAAAQBNQugAAAAAAADQBpQsAAAAAAEATULoAAAAAAAA0AaULAAAAAABAE1C6AAAAAAAANAGlCwAAAAAAQBNQugAAAAAAADQBpQsAAAAAAEATULoAAAAAAAA0AaULAAAAAABAEyjb0qW+vj7XX399+vTpk8rKyvTo0SMXX3xx6urqGrX+7bffzmWXXZZevXqlqqoqvXv3ztVXX521a9c2c3IAAAAAAGBn1Hp7B9iUCy+8MOPGjcvQoUNTU1OTuXPnpra2NrNnz87MmTNTKBQ2u3748OG58847c8YZZ+TAAw/Mww8/nEsvvTTz5s3Lj370o230LgAAAAAAgJ1FWZYuTz31VG644YYMGzYs06dPbxjv1atXzjvvvEybNi0nnHDCJtf/+te/zp133plRo0bluuuuS5L8r//1v9KxY8eMHTs2Z511VgYOHNjs7wMAAAAAANh5lOXlxaZOnZpisZgLLrhgvfGRI0emuro6kydP3uz6KVOmJMkG6999/l7rAQAAAAAASlWWpcusWbNSUVGxwW6Uqqqq9O/fP7NmzXrP9d27d0+PHj3WG+/Ro0e6dev2nusBAAAAAABKVSgWi8XtHeKf9evXL0uXLs2SJUs2OHbCCSdk2rRpWbt2bVq1arXR9R06dEjfvn3z6KOPbnBs4MCBefnll7Nw4cINjo0dOzZjx45teP7yyy+na9euW/FO2JiVK1emffv22zvGZpV7xnLPl5R/xnLPl5R/xnLPl8jYFMo9X1L+Gcs9X1L+Gcs9X1L+Gcs9X1L+Gcs9XyJjUyj3fEn5Zyz3fEn5Zyz3fEn5Zyz3fImMTaHc8yXln7Hc8yXln7Hc8yUtI2NL88orr+Ttt9/e5PGyvKdLXV1dKisrN3qsqqoqSbJq1apN/mF5r/V1dXUbPTZq1KiMGjVqCxJTit133z2LFi3a3jE2q9wzlnu+pPwzlnu+pPwzlnu+RMamUO75kvLPWO75kvLPWO75kvLPWO75kvLPWO75EhmbQrnnS8o/Y7nnS8o/Y7nnS8o/Y7nnS2RsCuWeLyn/jOWeLyn/jOWeL2kZGXc0ZXl5serq6k02RatXr06StG3bdovXV1dXb31IAAAAAACAf1CWpUu3bt2ybNmyjRYnixcvTteuXTd5abF31y9evHijxxYvXpzu3bs3WVYAAAAAAIAkaTV69OjR2zvEP3vmmWfyhz/8IUceeWT23HPPhvHVq1dn1KhR+dd//decfPLJm1z/6KOP5sEHH8yZZ56ZXXfdtWH8hRdeyOWXX55jjz02Q4YMadb3wOYdeOCB2zvCeyr3jOWeLyn/jOWeLyn/jOWeL5GxKZR7vqT8M5Z7vqT8M5Z7vqT8M5Z7vqT8M5Z7vkTGplDu+ZLyz1ju+ZLyz1ju+ZLyz1ju+RIZm0K550vKP2O550vKP2O550taRsYdSaFYLBa3d4h/NmfOnOy7774ZOnRopk+f3jB+ww035LzzzsvUqVNz4oknJknmzZuXNWvWpE+fPg3zZsyYkS984QsZNWpUrrvuuobxmpqajB07Ng8//HAOOOCAbfeGAAAAAACAHV5Zli5J8vWvfz3jx4/P0KFDM2TIkMydOzfjxo3LwQcfnHvuuSeFQiFJ0rNnzyxYsCD//DaOPvro/OpXv8qZZ56ZAw88MA8//HAmTpyY008/Pbfccsv2eEsAAAAAAMAOrGxLl3Xr1qW2tjYTJkzI/Pnz06VLl5x44okZM2ZM2rVr1zBvU6XL6tWrc8UVV2Ty5Ml5+eWXs/vuu+eMM87IN77xjbRp02Zbvx0AAAAAAGAHV7alCwAAAAAAQEtSsb0DsOO7+uqr86UvfSk9e/ZMoVBI//79t3ek9fz5z39OTU1NPvGJT6Rjx47p1KlTDjzwwEyePHmDHVTby8KFC3Pqqaemb9++6dixY6qrq9OnT5/U1NRkyZIl2zveRr388svp2LFjCoVCamtrt3eczJ8/P4VCYaOPz3zmM9s7XoNXX301F110UXr37p2qqqp06dIlhx56aP73//7f2ztaRo8evcmvYaFQyN577729Iyb5+9fwm9/8Zvr06ZPq6up88IMfzFFHHZXf/va32ztakuSll17KyJEj071791RWVqZXr1659NJLU1dXt82zlPrz+ZFHHsnhhx+eDh06ZNddd82QIUPy5JNPlkW+mTNn5uyzz84n/3/t3XlYlPX+//HXsO8IRxRS2VRCMSQVTXBBTQXccEtSRPS4HC2PWpkdT25RmqVfczuaGxqae7hFoqWY61FzwSUti0UREVIQkZ3P7w9+M8k+o8x8puPrcV1c1zn3DMwzhHnf3GvbtjA1NYVCocClS5e01qZp48OHD/HFF1+gZ8+eaNSoESwsLNCiRQtMmzYNmZmZ0vsA4KOPPkKnTp3QsGFDmJqaonHjxujbt6/W33+eZz1h2LBhOlm30KQxICCg2vfJW7duSe9Tio6Ohr+/P2xsbGBlZYVWrVohMjJSK32aNNY0r5UfJ0+elNantG3bNvj5+aF+/fqwsbGBt7c3Fi5cqNX3ck0ahRBYuXIlWrduDTMzM9jZ2WHAgAG4du2a1vo0XaeOjY1Fx44dYWlpib/97W8YNmwYkpOT9aJvx44diIiIwCuvvAIjIyMoFApkZWVprU3TxtTUVMyfPx+dO3eGo6MjrKys4O3tjXnz5uHx48fS+4Cyy4X7+vrCwcEBpqamcHV1RWhoqFbXGzRtfJoQAn5+flAoFAgJCdGLPuXvelUfxcXFetEIAMXFxVi2bBnatGkDS0tL2Nraok2bNvjyyy+l9sXHx9c6T1JTU6U2AmXfv1WrVqFt27aoV68e7Ozs0K5dO6xatQolJSXS+woLCxEZGYmXX34ZpqamcHBwQFhYGFJSUrTSpqTpNhBdzxRNG2XMFXX7ZM0UTRoBOXPlWbfF6WqmaNooa668qHimC2mdQqGAvb092rVrh1OnTqFp06Y62RCmrtDQUBw+fBiDBg1C27ZtUVBQgB07duDUqVMYM2YM1q9fLzsR586dw3vvvYeOHTuiSZMmMDY2xtWrV7FhwwbY2dnh4sWLqF+/vuzMcoYNG4bY2Fg8fvwYS5YswdSpU6X2JCUlwc3NDQMHDsSgQYPKPdagQQP06tVLUtmfkpOTERAQgKKiIkRERMDd3R1ZWVlISEhAYGAgQkNDpfYlJCRUuUJz/PhxrFmzBlOnTsWSJUsklP0pLy8Pbdq0QVJSEsaNGwdvb29kZmZi/fr1uHXrFrZs2YLhw4dL60tPT4evry/S09MxceJEtGjRAufOnUNUVBS6deuGQ4cOwcBAd8dDaPL+fObMGQQEBKBRo0Z4++23AQArVqxARkYGzpw5g5YtW0rti4iIwNatW9GqVSsUFRXhypUruHjxotY3xqvbePDgQfTt2xc9evRAjx49YGdnh/Pnz2PDhg1o2LAhzp8/D0dHR2l9ANC3b184OTnB09MTdnZ2SE9PR3R0NG7cuIEtW7bgzTffrPM+TRufdvDgQfTp0wempqbw8PDQ6rqFJo0BAQG4du1ale+HISEhsLKyktoHAGPGjEF0dDRCQ0Ph7+8PAPj999/x4MEDrFu3rs77NGnMzc1FTExMpeXFxcUYP3486tWrh9TU1Dq/XLAm38M5c+bgo48+Qvfu3TFw4EAYGhri8OHDiImJQa9evbS2k1+TxvHjx2Pt2rXo0aMHBg4ciIcPH2LlypXIzc3FyZMn8corr9R5nybr1N988w2GDBmC1q1bY9y4ccjOzsYXX3wBY2Njrb0fatIXEBCAs2fPwsfHB/fv38dvv/2Ghw8fol69enXe9SyNq1evxpQpUxAcHIwuXbrAwsICx44dw7Zt2+Dl5YX//ve/sLCwkNYHAL6+vujQoQOaNm0KW1tbpKSkYMOGDUhPT8fhw4fRpUuXOu/TtPFpq1atwvTp05Gbm4sBAwZgz5490vtcXV1hbm6Of//735W+zogRI1T3uZXZWFhYiP79++P48eMIDw9H27ZtkZ+fj1u3bsHc3BwLFiyQ1qf8WasoMzMT06ZNg4+PDy5evFjnfZo0AsCoUaPw1VdfYfDgwejRowdKSkrwzTff4OjRoxg/frxWdl6p2yeEQFBQEOLi4lR9d+7cwYoVK2BtbY2zZ8/ipZdeqvM+QLNtIDJmiqaNMuaKun2yZoomjYCcufKs2+J0NVM0bZQ1V15YgkjLfvvtN9X/dnFxEa1bt5ZYU9mJEydEXl5euWUlJSWia9euAoC4cuWKpLLabd++XQAQixcvlp1STmxsrDAwMBALFy4UAMSSJUtkJ4nExEQBQMyZM0d2SrU6deokWrVqJR48eCA7RSMDBgwQAERCQoLsFLFz504BQHzxxRfllt+/f18YGxuLrl27ygn7/6ZMmSIAiO3bt5db/tlnnwkAYtOmTTrt0eT9uX379sLa2lrcuXNHtezOnTvC2tpaBAUFSe+7c+eOyM/PF0IIMWfOHAFAXLx4UStdz9KYmJgobt26VWn5+vXrBQDx7rvvSu2rTk5OjmjQoIF45ZVX6jpN5Vkac3NzhZubm3jrrbd0sm6hSWPXrl2Fi4uLVnsq0qRv3bp1wsDAQBw8eFAXaSrP+7MYExMjAIh33nmnrtOEEOr3lZSUCGtra9GmTRtRUlJS7jHlPExMTJTaePHiRQFABAcHl1uelJQkLCwsRLdu3bTSp+46dWFhoWjUqJFwdnYWOTk55boNDAzExIkTpfYJIURycrIoKioSQggxatQoAUA8fPhQK13P0nj16lWRlpZW6fNnzZolAIjly5dL7atOamqqMDQ0FP369dNK37M2pqWlCVtbW/H5558LAGLAgAF60efi4iJl3VWTxg8//FBYWFiIS5cu6WVfVZYsWSIAiGXLlklvTE9PFwqFQoSEhFR67quvviqMjY1FYWGhtD7l7K34vnzmzBlhYGAgRo8eXedttam4DUTWTNGkUQh5c0WdPlkzpSbqbuvSxVypSk19upwpNamqUdZceVHx8mKkde7u7rITauTv7w8zM7NyywwMDDB48GAAwNWrV2VkqcXNzQ1A2WVr9MWTJ08wadIkjBs3Du3bt5edU6X8/Hwpl3KqyY8//ogTJ04gMjISdnZ2KCwsRF5enuysWt2/fx+xsbHw9fXVylGzmlKeol3xiCt7e3uYmZlp7QgddcXHx8Pc3BxDhw4ttzwiIgIAsHHjRp32qPv+fOvWLZw9exZDhw5Fo0aNVMsbNWqEoUOHIi4uDhkZGdL6lC2mpqZ13lAbdRtdXV3Ru+6QngAAIABJREFUtGnTSsuVPwvamjXPO4OtrKxQv359rc6ZZ2mcO3cunjx5gk8++UQLRZU9S2NpaSkePXqkk0uVqtsnhMCCBQvQr18/9O7dG0II5OTkaLmuzPP+LEZFRQEoO0tHG9TtKy4uRm5uLhwdHSudmaicPdqaNeo2xsfHAwBGjhxZbrmLiwsCAgJw9OhRrVxyRd116mPHjiE1NRVjx44td+aXj48PAgICsG3bNq1cUkeTdX5nZ2cYGRnVeUNt1G308vKq8shtbc+U5/27ydHRERYWFlqdKc/S+M9//hNNmjTRyZn5z9JXXFyss/dqQP3G3NxcLF26FOPGjUPr1q1RWlqq9UsRadJXnaioKJiammLEiBHSG5XrCRX/djEwMICjoyNMTExgaGgorU85T8LDw8s9t0OHDvD09MT27dt1/jdrxW0gsmaKJo2AvLlSlYp9smZKTdTd1qWLuVKVmvp0OVNqUlOjrufKi4o7XYiqcefOHQCAg4OD5JI/FRQUIDMzE6mpqfjhhx8wadIkAEBgYKDksj/NnTsXubm5WjmVvC4sXrwY5ubmsLS0hIuLCyIjI1FUVCQ7C7GxsQDKft569uyp2kHQsmVLbN++XXJd9aKjo1FUVKS1jWCaCggIgJGREWbOnInvvvsOd+7cweXLlxEeHo7i4mJ88MEHUvvy8/NhZmZW6bRd5Qa6c+fO6c29pJ527tw5AEDHjh0rPfbaa6+htLQUFy5c0HXW/wR9nDWZmZm4f/8+rly5gnfeeQfXr19HUFCQ7CyVhIQELFmyBIsXL4atra3snCqlpqbCysoKtra2sLa2xtChQ/Hbb7/JzsLNmzfx22+/oX379nj//fdhZ2cHGxsb2NvbY/LkyXp3QIJSeno6YmNj0aFDB3h5eUltMTExQefOnXHw4EF89tlnuHXrFpKSkrB27VpERUXhrbfeQoMGDaQ25ufnA6h6549y2dmzZ3XWU/F9rraZ8vDhQ63d/0idPn2kbqOs/5bqXre0tBSZmZlIT0/HTz/9hPDwcOTk5EiZKdU1xsbGYteuXfjPf/4jdYNodX3Ky/rY2NjAzs4Of//733H//n0ZiZUajx8/jpycHHh7e6s2eFtbW8PR0RFz587V+f0B1Pn5/+mnn5CQkICQkBDY29vrKk2lYqObmxvc3d0RFRWFdevWISkpCbdu3cKnn36KuLg4zJ07V6eXHq7YV9s8efLkidY3yNe2DUQfZoq+b6d51j5dzhR1G2XNFXX7ZM4UdRv1aa78z5N6ng29cPTx8mJVSUtLE3Z2dsLFxUUUFBTIzlGJiooSAFQfzs7OIjo6WnaWyuXLl4WRkZHYuHGjEEKIo0eP6s3lxZKTk0X37t3FsmXLxL59+8TatWtFt27dBADRv39/UVpaKrUvJCREABAODg4iMDBQbN26Vaxbt068/PLLUi47pS4vLy9hbm4usrKyZKeo7NixQzg5OZX7XWncuLE4e/as7DQxcOBAAUBcvny53PL9+/erWv/44w8pbTW9Py9atEgAELGxsZUe+/bbbwUAsX79eml9Feny8mJPe5YZFxoaKgDo5FJP6vY9/btjamoqxo4dKx4/fqz1PiFqbywpKREdOnQod3kkXa9b1PZ6ERERYubMmWLbtm1i586dYurUqcLExETY29uLX3/9VWrfnj17VLPG0dFRLFu2TOzatUuEhYUJAKJHjx46mYea/pspL8/w5ZdfarHqT7X1paSkiICAgHK/KwYGBiIyMlInfbU17t27VwAQ06ZNK7c8Ly9PNG7cWKeXpq1qnfrtt98WAMT169crPX/lypUCgPjhhx+k9VUk+zIw6v5dUlJSIvz9/YWhoaG4du2aXvQpL++r/LC2thYzZsxQXWJHdmNubq5wdXUVERERqmWQcCmY6vqCg4NFZGSk2LVrl9iyZYsYM2aMUCgUws3NTWRmZkpv/OKLL1QzpXnz5mLt2rVi27ZtIjg4WAAQY8aMkdpXlbfeeksAEHFxcTprU6qu8cqVK8LHx6fS+pe2163V6Vu6dKkAIJYuXVruuenp6cLCwkIAELt379ZqV23bQPRhpmi6nUbXc+VZtiPpeqao2yhrrqjTJ3umqNOoT3PlRaAf57YR6ZH8/HwMGjQI2dnZ2LFjB0xMTGQnqfTu3RuHDx9GTk4Ozp07hwMHDuDRo0eyswCUHXEwfvx4dOzYEaNGjZKdU4mzszN++OGHcsvGjh2LESNG4Ouvv8aBAwfQr18/SXVQndrZvHlzxMbGqs6ECAkJQdOmTfGvf/0LYWFhOj3SqTZnz57FtWvXEBYWpldHm7/00kvw9vZGWFgY/Pz8kJGRgWXLlqluAtm2bVtpbVOmTMHevXsxbNgwLF26FJ6enjh//jwmT54MY2NjFBUV4cmTJ1KOvKuJ8uj3qi7fpbw0gb4eIa/Pli1bhm3btmHkyJHo3bu37ByVw4cPo7i4GImJidi0aRMKCwtRWFgIS0tL2WlYtWoVLly4gMuXL8tOqZbyMlhKQ4YMQWBgIAIDAzFjxgzs3r1bUtmfs+bBgwdISEhAy5YtAUB1OZHNmzfj0KFDevXzCJR9Ty0sLBAaGio7BQBgbW2NFi1awNbWFkOGDIGZmRkOHDiA2bNno7i4GHPnzpXaFxQUBE9PT6xYsQKNGzfGgAEDkJWVhblz5yI9PR2Abt6zq1un1peZos/r/EqaNL733ns4efIkZs2apfrdlt3n6OiIw4cPo7CwEDdv3kR0dDTy8vJQXFyssyOAa2qcM2cOsrOz8dlnn+mkRdO+b7/9ttxzhw8fjg4dOmDChAmYP38+Fi9eLLVROVMKCgpw8uRJ1dHwb7zxBrp27YoNGzZg+vTp8PT0lNJXUUFBAb7++ms4Ozvj9ddf12qTJo12dnbw8vJCy5Yt0b9/f5SUlGD79u0YN24chBD4+9//Lq0vLCwMH3/8MWbNmgUrKyt0794dqampmD59uupqEdp+v65tG4g+zBR93k4DPFufrmeKuo2y5oo6fbJnijqN+jJXXhiy9/rQi0Xfz3QpLCwUffr0EQqFQqxZs0Z2Tq3i4+MFALF27VrZKWL58uXCyMhIXL16VbVMn850qc61a9eqvDmgrvXt21cAqPLnLjw8XAAQP//8s4Sy6k2YMEEAEEeOHJGdonLu3DlhbGxc6WjorKws4ejoKF599VVJZX/6+uuvhYODg+oIFBMTEzF79mzh6+srAIjs7GwpXTzT5flp0hgdHS0MDAxEjx49Kt3IVFueZQY/efJEtGzZUnTq1ElLVeXV1JiamipsbGzEv/71L7U/Rxue9fV8fX2FhYWFForKq6lv165dAoDw8/Or9NiRI0cEADFjxgxtJ2r0PTx9+rQAIMLDw7Vc9aea+kpKSkS7du2En59fpbOCJk6cKBQKhU5uKF3b9zAxMVF06tSp3BGPnTt3Vt0Ut+JRy3WtpnVqfTgqWZN1fllnumjSOH/+fAFAjBw5Umdnbz/L3033798XDRo0ECNGjNByXZmaGi9duiSMjIwqrTNCh0clP+vfng4ODqJFixZaLPtTTY3K9cPhw4dX+rwNGzYIAGLVqlXS+iraunWrACBmz56t1aaKamrMyckRzs7O4s0336z0eUFBQcLc3Fzcu3dPWp8QZTekb9WqVbl5EhISIiZOnCgAiL1792q1r6KK20D0YabU1liR7DMoa+uTMVMqUndbl67nilLFPn2YKRVpsr1Ql3PlRaI/h0wTSVZcXIzQ0FB8++23qhsC6ruuXbuicePGlY6q1bXs7Gz8+9//xvDhw2FpaYmkpCQkJSXh3r17AMqOqE1KStLLG8O7uLgAKLuHgUyNGzcGADg5OVV6TLnswYMHOm2qSX5+PrZt2wZ3d3cEBATIzlFZuXIlioqKMGTIkHLLbW1t8frrr+PixYvIzs6WVFfmzTffxN27d3HhwgUcP34caWlpmDdvHlJSUuDk5AQbGxupfVVR3twzNTW10mPKZY0aNdJp01/Zzp07ERERAX9/f+zbt6/SjUz1ibm5OQYNGoQTJ07g119/ldoyc+ZMmJiYICwsTDVnkpKSUFxcjMLCQiQlJSEjI0NqY01cXFzw5MkTqWeF/dVmDfDnmUO6ONJXHcePH8f58+cxePDgSvfnGjx4MIQQqhsPy+Tq6orjx48jMTERx44dw82bN/Hjjz+isLAQALR65Hlt69SyZ8pfYZ1fk8b/+7//w8yZM/HGG28gKiqq0s+l7L6nOTg4oFevXti6davqXhGyGqdMmYJmzZqhZ8+e5WYKUHZUfFJSklZvzPw8P4cuLi46+dultkbZM0XT76Hy92P06NFaa6qotsbdu3cjJSWl0t8uQNlMycvLw5kzZ6T1AWU3pL9y5Qpu3ryJY8eOISkpCTExMap/W22fyVRRxW0gsmdKVfRlO011auqTMVOqou73UJdz5WkV+2TPFHUaa6KrufKi4U4XIgAlJSUICwvDN998g0WLFmHy5Mmyk9SWl5en8zfvih4+fIhHjx7hq6++gpubm+rjzTffBABERkbCzc0Nx44dk9pZFeVGxIYNG0rtaN++PQDg9u3blR5LSUkBAOk35n3a7t27kZ2djdGjR0tbEavK3bt3AZT9TlekvJmnrm/qWRUjIyO8+uqr6NSpE+zt7XHp0iWkp6fr1c3Kn+br6wsAOH36dKXHzpw5AwMDA7Rp00bXWX9Je/bswfDhw9G+fXvExsZWeWNSfaPcYS571iQlJSEzMxNeXl7lZk1qaip+/vlnuLm56fX8/vXXX2FlZSX13/yVV16Bubn5X2bW5OXlYfv27WjWrBm6dOkiOwfAX2fOKLm6uqJLly7w8PAAABw8eBA2Njbw9/fXyuups05d20ypV68emjVrJq1PNk0aV6xYgXfffRcDBw7Eli1bYGhoqFd9VcnLy0NpaalWL72jTmNSUhJu3LgBd3f3cjMFKLvMppubGxYuXCitrzqlpaX4/ffftf63izqNMv9+0fR7ePv2bXz//ffo3r07XF1dtdL0LI0yZ4qm30MPDw906dIFLi4uKCoqwpEjR9C0aVM0b95cK301eXobiMyZUhN92E5Tk6r6ZMyUmqj7PdTFXKnudZV9MmeKuo3V0dVceSHJPtWGXiz6eHmxkpISMXLkSAFAzJ8/X3ZOlao7pVh5ivTTN+qSITc3V8TExFT6iIyMVN1EMSYmRqSnp0trrOp7WFxcrLqsl4ybKT7twYMHwtraWrRu3brcjRVTUlKEhYWFaN68ucS6ynr06CEMDAzE7du3ZaeUM3XqVAFAfP755+WWK28M6ebmJqmsegUFBaJbt27CxMREpze+rai29+d27doJa2trkZqaqlqWmpoqrK2tRe/evaX3PU1fLy/27bffChMTE+Hr6yvlMnI19WVnZ1d5mbOMjAzRuHFjYWlpKXJzc7WdWGPj8ePHq5w1Dg4OwtXVVcTExIhz585JbXzw4EGVN/Ddvn27AFDl5UPqWm0/hyNGjBAKhUKcPn1atay0tFT0799fABAnT56U3qgUHR0tZf2spr5Lly4JAMLHx6fSTVtDQ0MFAHHs2DGpjdVZs2aNACA+/PBDrTSpu05dWFgonJychLOzs8jJyVEtv3TpkjAwMBATJkyQ2leRLi8Do0njmjVrhEKhEH379hWFhYVab9OkLzMzs8qbGv/yyy/C2tpaq+tj6jbGxcVVOVMAiPbt24uYmBitrJep25eRkSFKSkoqLf/0008FgEqX2pTRKIQQ/v7+wszMTCQlJamWFRYWijZt2ggjIyORnJwstU9J+Xfp119/Xec9VVG3cc+ePQKA6Nu3b6XP9/f3FwqFotz3Vtd91Zk5c6YAINatW1fnbUrqbgORNVM0aaxIV3NFkz4ZM0UI9RtlzRV1+2TNFE0aZc6VF5Vu7l5HL7To6GgkJycDKLsMVUFBAT7++GMAZaewjRw5UmYepk+fjujoaPj6+qJJkybYvHlzuce9vb3h7e0tqa7MjBkzcPXqVfTq1Quurq7Izc3FmTNnsGvXLjg5OUm/YauFhQVCQkIqLa9Xrx6AsiNrq3pcl/7xj38gIyMD3bt3R5MmTXD//n3s2LEDCQkJGDlyJHr16iW1z87ODosWLcKECRPg7++PsLAw5Obmqi6XtWLFCql9T0tOTsaRI0fQu3dv1WUF9MU///lPbNq0Ce+//z6uXLkCPz8/ZGRkYPXq1Xj48CFWrVolte/x48fo0KEDBg0aBFdXV2RmZuKrr77CjRs3sG7dOp3d+FZJk/fnpUuXolu3bujcubPqSLjly5dDCIFFixZJ70tISMC+ffsAAD/++CMAYN26dXB0dAQATJ48Gba2ttIalZcjMjQ0xMiRI1WtSlZWVlp5n1S378KFCxgyZAiGDh0KDw8PWFpa4tatW9i4cSMyMjLw5Zdfau0MDXUbO3XqVOXnT506Fba2tlqdM+o2Hjt2DBMnTsQbb7yBpk2bwsDAAKdPn8bWrVvRqFEjrR3hpsnvyvz58/H999+jd+/emDx5MpycnLBv3z4cOnQI4eHh8PPzk96otGHDBhgaGmLUqFFaaXqWvtatWyMkJAR79uyBr68vwsLCYGpqiv379+PQoUMICgrS2lk5mnwPx44dC6DssjDGxsb44YcfsGvXLvTu3RuzZs3SSp+669TGxsZYunQphg0bhs6dO2PcuHF49OgRlixZgoYNG2LOnDlS+4CyOaKcJQkJCQCARYsWqS4H+eGHH0pt3LdvHyZMmAB7e3uEhIRg+/bt5Z7XsGFD9OzZU1rf/v37MWvWLAwePBhNmzaFkZERrl+/jk2bNiE/Px/Lly+v8zZNG2ta93dyctLaTFG3b/PmzVi+fDkGDRoENzc3FBQU4MiRIzhw4ABatWqFGTNmaKVPk0agbF2wc+fOeO211/DWW2/BxsYGW7ZswYULFzB79mw4OztL7QMAIQQ2btyIevXqYeDAgXXe8zyNffr0Qbt27XDgwAEEBARg0KBBKCkpwbZt23D27FlMnDhRdTlsGX0A0KdPH7i7u6Nly5YoLS3F/v37ERcXh9GjR2v10p/qbgORNVM0aQTkzBV1+2TNFE0aZc0VdftkzRRNGmXOlReW7L0+9L+va9eu5W669vRH165dZefV2AdAzJkzR3ai2Ldvn+jfv79o3LixMDU1Febm5qJFixbi3XfflXr2SG2OHj0qAIglS5bIThHr1q0TXbt2FQ0bNhTGxsbC2tpa+Pn5ifXr10u7OVxVdu/eLTp06CAsLCyElZWV6Nmzpzhx4oTsrHLmzp0rAIgdO3bITqlSSkqKGD9+vPDw8BBmZmbCxsZGdO/eXRw8eFB2migoKBDDhg0TLi4uwsTERNjb24t+/frp5Mjyqmj6/nzy5EnRrVs3YWlpKaytrUVgYKBWzybRpC8qKqrG9/LExESpjbX1ubi4SO27ffu2GD9+vGjZsqWwsbERRkZGwsnJSQwcOFDEx8drpU3Txuro4ixadRuvX78uhgwZItzd3YWFhYUwMTERzZo1E1OmTNHqvNb0e5iYmCiGDx8u6tevL4yNjYWnp6f4/PPPqzz6TWajQqEQwcHBWmt61r7CwkKxcuVK0a5dO2FnZydMTEyEp6enmDdvnsjPz9eLxtWrVwsfHx9hbW0tzM3NhY+Pj1i6dGmVR4nqoq+qder9+/eLDh06CHNzc1GvXj0xdOhQ8fvvv+tFn/KMyeo+ZDfW1qetv7HU7bt69aoIDw8XzZs3F5aWlsLY2Fg4OzuLESNGaP0s1Of92w7Q7k2P1e07ceKE6Nevn2jSpIkwMzMTZmZmwsvLS8yaNavc0fwyG5UuX74s+vXrJ2xtbYWpqanw8fERUVFRetOnvJn0pEmTtNb0PI2PHz8Wn3zyifD29hY2NjbCzMxM+Pj4iGXLlmltLmvSN2/ePNGiRQthYWEhLC0tRceOHcWmTZu0/je0pttAdD1TNG2UMVfU7ZM1UzRplDVXnndbnLZniiaNMufKi0ohhBAgIiIiIiIiIiIiIiKi52IgO4CIiIiIiIiIiIiIiOh/AXe6EBERERERERERERER1QHudCEiIiIiIiIiIiIiIqoD3OlCRERERERERERERERUB7jThYiIiIiIiIiIiIiIqA5wpwsREREREREREREREVEd4E4XIiIiIiIiIiIiIiKiOsCdLkRERERERERERERERHWAO12IiIiIiOiF4+rqCoVCgaSkJI0+LyIiAgqFAhs3btRKFxERERER/bVxpwsREREREemNlJQUvPPOO2jVqhUsLS1hbm4OZ2dn+Pn5Yfr06YiLi5OdKFV8fDzmzp2L+Ph42SlERERERFQFI9kBREREREREAHDkyBGEhIQgJycHhoaGaNKkCRo0aIAHDx7gzJkzOH36NKKiopCZmSmt0cnJCS+//DJsbW2lvH58fDzmzZsHAAgICJDSQERERERE1eNOFyIiIiIiku7Ro0cYNmwYcnJy0KdPH6xcuRIuLi6qx7OysrB3717s2LFDYiWwYMECLFiwQGoDERERERHpL+50ISIiIiIi6WJjY5GZmQkbGxvs2LEDFhYW5R6vV68eRo0ahVGjRkkqJCIiIiIiqh3v6UJERERERNL9/vvvAAAPD49KO1xqolAooFAoqn3c1dUVCoUCSUlJ1T4nLi4OAQEBsLW1hY2NDXr27Injx49X+dyIiAgoFAps3Lixysdv3LiBMWPGwNXVFaampvjb3/6GPn364MiRI9W+vhACO3fuRHBwMBo0aABTU1M4OzsjKCio3OsoFArVpcXmzZun+m9XKBSIiIio9usTEREREZHucKcLERERERFJZ2NjAwD49ddfkZWVpbPX3bZtG4KCgnDlyhV4eHjAxMQE33//PQICArBz506NvtaOHTvQunVrREVF4cGDB2jZsiVMTEwQGxuL119/HcuXL6/0OYWFhRg8eDDeeOMNfPfddzAyMkLr1q1RWlqKuLg4jB49WvVcf39/NGnSBADQpEkT+Pv7qz48PDye7xtBRERERER1gjtdiIiIiIhIul69esHAwADZ2dl4/fXXsXv3bmRnZ2v9dWfNmoVp06bh3r17OHfuHO7du4f3338fpaWlGDt2LNLS0tT6OgkJCQgPD4eBgQHWrFmDrKwsXLx4EWlpadi3bx+sra0xbdo0XL58udznzZgxAzExMahfvz6+++473L17F2fPnsWdO3dw584dzJkzR/XcEydOYMyYMQCAMWPG4MSJE6qPmTNn1t03hYiIiIiInhl3uhARERERkXQeHh6IjIwEAPz0008YMmQI7Ozs4OnpidGjR2P79u0oKCio89f18vLC4sWLYWxsDAAwMjLCwoUL0aZNGzx69AirV69W6+vMmzcPBQUFWLhwIcaNGwcDgz//1OrXrx8++eQTlJSUYNmyZarld+/excqVKwEA33zzDQIDA8t9zZdeeglz5859zv9CIiIiIiLSJe50ISIiIiIivTBz5kwcOXIEwcHBMDExgRACN2/exMaNGxEaGgoPDw/Ex8fX6WtOmjSpxuVxcXG1fo3CwkLExsbC0NCw2nur9O/fHwBw7Ngx1bLY2FgUFRXhtddeQ+fOnTUsJyIiIiIifWQkO4CIiIiIiEipW7du6NatG/Ly8nD+/Hn897//RWxsLOLj45GSkoLg4GBcuHABnp6edfJ6LVq0qHH5L7/8UuvX+OWXX5Cfnw8TExMEBwdX+RwhBAAgNTVVteznn38GALz22msaNRMRERERkf7iThciIiIiItI75ubm6Ny5Mzp37oz33nsPJ06cQGBgIHJzc7F48WKsXbu2Tl6nQYMGVS5v2LAhACAnJ6fWr6G890xhYSFOnjxZ43Pz8/NV//vRo0cAgHr16qnVSkRERERE+o+XFyMiIiIiIr3XqVMn1SW/zp49W+lx5ZkkFeXm5tb4dTMyMqpcfv/+fQCAtbV1rW1WVlYAgEaNGkEIUeuHkvJrZ2Vl1foaRERERET018CdLkRERERE9Jfg7u4OoOyMEiVLS0sAVe88yc7ORmZmZo1fU3mJr+qWe3h41NrVvHlzGBsbIy0tDQ8ePKj1+UpeXl4AgDNnzqj9OQqFQu3nEhERERGR7nGnCxERERERSZeZmVnt2SpKp06dAlC2k0NJuSPm3LlzlZ6/bt26Wl/3P//5T43Le/XqVevXsLCwQO/evVFaWoply5bV+nyl4OBgGBsb48yZM7VelkzJ3NwcAJCXl6f26xARERERke5wpwsREREREUm3efNm+Pj4YO3atfjjjz/KPZaVlYXZs2dj8+bNAIDRo0erHgsKCgIAfPjhh0hPT1ctP3jwID766CMYGdV8G8urV6/i/fffR1FREQCguLgYM2fOxE8//QRra2v84x//UKs/MjISpqam+Pjjj/Hpp59W2imSlpaGpUuXYvXq1aplTk5OePvttwEAgwYNwqFDh8p9zt27d/HRRx+VW6bcyXTq1CkUFxer1UZERERERLqjELUdTkZERERERKRlS5cuxdSpU1X/383NDQ4ODnj48CGSk5NVlxR777338Pnnn6uel5GRAW9vb9y7dw+mpqZo0aIFsrKykJSUhA8++ABbt25FcnIyEhMT4erqqvo8V1dXJCcnY8GCBZg5cybs7e3h7u6OxMREZGZmwsDAAFu2bEFoaGi5zoiICGzatAlRUVGIiIgo91hMTAzCwsLw5MkTmJmZwdPTEyYmJkhLS8Pt27cBADNmzMCnn36q+pyCggIMGzYMe/fuBQC89NJLaNSoEdLS0pCamlrpPjCPHj2Cq6srHj58CCcnJ7i7u8PIyAiBgYH44IMPnu8fgYiIiIiInhvPdCEiIiIiIukmTZqEI0eOYPr06fDz80NJSQkuXbqE1NRUuLi4IDw8HMePHy+3wwUAHBwccPLkSQwdOhQWFha4efMm7OzsEBUVhQULFtT6uqGhofjuu+/g5eWFGzduID8/H927d8fRo0cr7XDbbjoqAAABjUlEQVSpzcCBA3H9+nVMmTIFrq6uuHnzJq5fvw4LCwsMHDgQmzZtqrRjxNTUFDExMdiyZQt69OiB/Px8XL58GQYGBggODsZXX31V7vk2NjY4dOgQgoKCUFBQgNOnT+PYsWO4ceOGRq1ERERERKQdPNOFiIiIiIhITeHh4YiOjkZ0dDTCwsJk5xARERERkZ7hmS5ERERERERqysrKAgDY2dlJLiEiIiIiIn3EnS5ERERERERqSE9Px6lTpwAA3t7ekmuIiIiIiEgfcacLERERERFRDe7du4f27dujWbNm+OOPPxAcHIwmTZrIziIiIiIiIj3EnS5EREREREQ1yM/Px/nz52FmZobRo0djy5YtspOIiIiIiEhPKYQQQnYEERERERERERERERHRXx3PdCEiIiIiIiIiIiIiIqoD3OlCRERERERERERERERUB7jThYiIiIiIiIiIiIiIqA5wpwsREREREREREREREVEd4E4XIiIiIiIiIiIiIiKiOsCdLkRERERERERERERERHXg/wGnRfnqH9HcgwAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<Figure size 2000x320 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"ind = np.arange(len(subjects_id)) # the x locations for the groups\n", | |
"bar_width = 0.25\n", | |
"width = 0.25\n", | |
"\n", | |
"plt.rcParams.update({'font.size': 10})\n", | |
"plt.rc('xtick',labelsize=16)\n", | |
"plt.rc('ytick',labelsize=16)\n", | |
"\n", | |
"fig, ax = plt.subplots(figsize=(25, 4), dpi=80, facecolor='w', edgecolor='k')\n", | |
"\n", | |
"rects1 = ax.bar(ind - bar_width, acc, width, label='MTL')\n", | |
"rects2 = ax.bar(ind, trca, width, label='TRCA')\n", | |
"rects3 = ax.bar(ind + bar_width, fbcca, width, label='FBCCA')\n", | |
"# rects4 = ax.bar(ind + bar_width*1.5, cca, width, label='CCA')\n", | |
"\n", | |
"ax.set_xlabel(\"Subject\", fontsize=20)\n", | |
"ax.set_ylabel('Accuracies', fontsize=20)\n", | |
"# ax.set_title('Compare Accuracies by Methods')\n", | |
"ax.set_xticks(ind)\n", | |
"ax.set_xticklabels(subjects_id)\n", | |
"ax.legend()\n", | |
"\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"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.7.6" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment