Skip to content

Instantly share code, notes, and snippets.

@jskDr
Created March 2, 2016 23:00
Show Gist options
  • Save jskDr/e90ad5825eafdac33b93 to your computer and use it in GitHub Desktop.
Save jskDr/e90ad5825eafdac33b93 to your computer and use it in GitHub Desktop.
Performance of PyExecJS (Javascript vs. Python Families)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Performance Of PyExecJS "
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The cython extension is already loaded. To reload it, use:\n",
" %reload_ext cython\n"
]
}
],
"source": [
"%matplotlib inline\n",
"\n",
"import pandas as pd\n",
"import time\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import jpyx\n",
"\n",
"%load_ext cython"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Calling Javascript using PyExecJS"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import execjs\n",
"\n",
"myjs = execjs.get()\n",
"js_codes = \"\"\"\n",
"function addup( N) {\n",
" var s = 0.0;\n",
" var ii, jj, kk;\n",
" for( ii = 0; ii < N; ii++) {\n",
" for( jj = 0; jj < N; jj++) {\n",
" for( kk = 0; kk < N; kk++) {\n",
" s += ii * jj * kk;\n",
" }\n",
" }\n",
" }\n",
" return s;\n",
"}\n",
"\n",
"function addup_novar( N) {\n",
" var s = 0.0;\n",
" for( ii = 0; ii < N; ii++) {\n",
" for( jj = 0; jj < N; jj++) {\n",
" for( kk = 0; kk < N; kk++) {\n",
" s += ii * jj * kk;\n",
" }\n",
" }\n",
" }\n",
" return s;\n",
"}\n",
"\n",
"function addup_a( N) {\n",
" var s = 0;\n",
" var ii, jj, kk;\n",
" var data_ii = [], data_jj = [], data_kk = [];\n",
" // make an array\n",
" for( ii = 0; ii < N; ii++) {\n",
" data_ii.push( ii)\n",
" data_jj.push( ii)\n",
" data_kk.push( ii)\n",
" }\n",
" for( ii = 0; ii < N; ii++) {\n",
" for( jj = 0; jj < N; jj++) {\n",
" for( kk = 0; kk < N; kk++) {\n",
" s += data_ii[ii] * data_jj[jj] * data_kk[kk];\n",
" }\n",
" }\n",
" }\n",
" return s;\n",
"}\n",
"\n",
"function addup_a_mixed( N) {\n",
" var s = 0;\n",
" var ii, jj, kk;\n",
" var data_ii = ['ii'], data_jj = ['jj'], data_kk = ['kk'];\n",
" // make an array\n",
" for( ii = 1; ii < N; ii++) {\n",
" data_ii.push( ii)\n",
" data_jj.push( ii)\n",
" data_kk.push( ii)\n",
" }\n",
" for( ii = 1; ii < N; ii++) {\n",
" for( jj = 1; jj < N; jj++) {\n",
" for( kk = 1; kk < N; kk++) {\n",
" s += data_ii[ii] * data_jj[jj] * data_kk[kk];\n",
" }\n",
" }\n",
" }\n",
" return s;\n",
"}\n",
"\"\"\"\n",
"compjs = myjs.compile( js_codes)\n",
"\n",
"def addup( N):\n",
" \"\"\"\n",
" Python implementation of addup in javascript\n",
" \"\"\" \n",
" s = 0;\n",
" for ii in range( N):\n",
" for jj in range( N):\n",
" for kk in range( N):\n",
" s += ii * jj * kk\n",
" return s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cython codes"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%%cython\n",
"def addup_pyx( int N):\n",
" \"\"\"\n",
" Python implementation of addup in javascript\n",
" \"\"\" \n",
" cdef int s = 0\n",
" cdef int ii, jj, kk\n",
" for ii in range( N):\n",
" for jj in range( N):\n",
" for kk in range( N):\n",
" s += ii * jj * kk\n",
" return s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Performance Testing Code"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def elapsed_test( f, N_l = [100, 200, 400, 800, 1600]):\n",
" pdo = pd.DataFrame()\n",
" for N in N_l:\n",
" t = time.time()\n",
" val = f( N)\n",
" elapsed = time.time() - t\n",
" print N, val\n",
" \n",
" pdi = pd.DataFrame()\n",
" pdi[\"lang_func\"] = [ f.func_name]\n",
" pdi[\"N\"] = [N]\n",
" pdi[\"elasped(sec)\"] = [elapsed] \n",
" \n",
" pdo = pdo.append( pdi, ignore_index = True) \n",
" return pdo"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## For collecting data"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"pdall_d = dict()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Fast approaches"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 121287375000\n",
"200 7880599000000\n",
"400 508169592000000\n",
"800 32645273536001390\n",
"1600 2093222297088012800\n",
"100 121287375000\n",
"200 7880599000000\n",
"400 508169592000000\n",
"800 32645273536001390\n",
"1600 2093222297088012800\n",
"100 121287375000\n",
"200 7880599000000\n",
"400 508169592000000\n",
"800 32645273536001390\n",
"1600 2093222297088012800\n",
"100 1028290712\n",
"200 -665988160\n",
"400 1946439168\n",
"800 213217280\n",
"1600 -1109688320\n",
"100 1028290712\n",
"200 -665988160\n",
"400 1946439168\n",
"800 213217280\n",
"1600 -1109688320\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>lang_func</th>\n",
" <th>N</th>\n",
" <th>elasped(sec)</th>\n",
" <th>Type</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>js_addup</td>\n",
" <td>100</td>\n",
" <td>0.035256</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>js_addup</td>\n",
" <td>200</td>\n",
" <td>0.040445</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>js_addup</td>\n",
" <td>400</td>\n",
" <td>0.097165</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>js_addup</td>\n",
" <td>800</td>\n",
" <td>0.578643</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>js_addup</td>\n",
" <td>1600</td>\n",
" <td>3.848549</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>js_addup_a</td>\n",
" <td>100</td>\n",
" <td>0.035332</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>js_addup_a</td>\n",
" <td>200</td>\n",
" <td>0.045333</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>js_addup_a</td>\n",
" <td>400</td>\n",
" <td>0.122521</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>js_addup_a</td>\n",
" <td>800</td>\n",
" <td>0.717549</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>js_addup_a</td>\n",
" <td>1600</td>\n",
" <td>5.052639</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>js_addup_a_mixed</td>\n",
" <td>100</td>\n",
" <td>0.036889</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>js_addup_a_mixed</td>\n",
" <td>200</td>\n",
" <td>0.044741</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>js_addup_a_mixed</td>\n",
" <td>400</td>\n",
" <td>0.123442</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>js_addup_a_mixed</td>\n",
" <td>800</td>\n",
" <td>0.712154</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>js_addup_a_mixed</td>\n",
" <td>1600</td>\n",
" <td>4.963973</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>c_addup</td>\n",
" <td>100</td>\n",
" <td>0.000458</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>c_addup</td>\n",
" <td>200</td>\n",
" <td>0.003460</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>c_addup</td>\n",
" <td>400</td>\n",
" <td>0.024867</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>c_addup</td>\n",
" <td>800</td>\n",
" <td>0.193796</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>c_addup</td>\n",
" <td>1600</td>\n",
" <td>1.431050</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>cython_addup</td>\n",
" <td>100</td>\n",
" <td>0.000389</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>cython_addup</td>\n",
" <td>200</td>\n",
" <td>0.003210</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>cython_addup</td>\n",
" <td>400</td>\n",
" <td>0.025044</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>cython_addup</td>\n",
" <td>800</td>\n",
" <td>0.173679</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>cython_addup</td>\n",
" <td>1600</td>\n",
" <td>1.386212</td>\n",
" <td>Fast</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" lang_func N elasped(sec) Type\n",
"0 js_addup 100 0.035256 Fast\n",
"1 js_addup 200 0.040445 Fast\n",
"2 js_addup 400 0.097165 Fast\n",
"3 js_addup 800 0.578643 Fast\n",
"4 js_addup 1600 3.848549 Fast\n",
"5 js_addup_a 100 0.035332 Fast\n",
"6 js_addup_a 200 0.045333 Fast\n",
"7 js_addup_a 400 0.122521 Fast\n",
"8 js_addup_a 800 0.717549 Fast\n",
"9 js_addup_a 1600 5.052639 Fast\n",
"10 js_addup_a_mixed 100 0.036889 Fast\n",
"11 js_addup_a_mixed 200 0.044741 Fast\n",
"12 js_addup_a_mixed 400 0.123442 Fast\n",
"13 js_addup_a_mixed 800 0.712154 Fast\n",
"14 js_addup_a_mixed 1600 4.963973 Fast\n",
"15 c_addup 100 0.000458 Fast\n",
"16 c_addup 200 0.003460 Fast\n",
"17 c_addup 400 0.024867 Fast\n",
"18 c_addup 800 0.193796 Fast\n",
"19 c_addup 1600 1.431050 Fast\n",
"20 cython_addup 100 0.000389 Fast\n",
"21 cython_addup 200 0.003210 Fast\n",
"22 cython_addup 400 0.025044 Fast\n",
"23 cython_addup 800 0.173679 Fast\n",
"24 cython_addup 1600 1.386212 Fast"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def js_addup( N):\n",
" return compjs.call(\"addup\", N)\n",
"def js_addup_a( N):\n",
" return compjs.call(\"addup_a\", N)\n",
"def js_addup_a_mixed( N):\n",
" return compjs.call(\"addup_a_mixed\", N)\n",
"def c_addup(N):\n",
" return jpyx.sumup_c(N)\n",
"def cython_addup(N):\n",
" return addup_pyx(N)\n",
"\n",
"f_l = [ js_addup, js_addup_a, js_addup_a_mixed, c_addup, cython_addup]\n",
"\n",
"pdo = pd.DataFrame()\n",
"for f in f_l:\n",
" pdi = elapsed_test( f, N_l = [100, 200,400,800,1600])\n",
" pdo = pdo.append( pdi, ignore_index = True)\n",
"\n",
"pdo[\"Type\"] = [\"Fast\"] * pdo.shape[0]\n",
"pdall_d[\"Fast\"] = pdo\n",
"pdall_d[\"Fast\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Slow approaches: execjs(novar), python"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 121287375000\n",
"200 7880599000000\n",
"400 508169592000000\n",
"100 121287375000\n",
"200 7880599000000\n",
"400 508169592000000\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>lang_func</th>\n",
" <th>N</th>\n",
" <th>elasped(sec)</th>\n",
" <th>Type</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>js_addup_novar</td>\n",
" <td>100</td>\n",
" <td>0.174426</td>\n",
" <td>Slow</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>js_addup_novar</td>\n",
" <td>200</td>\n",
" <td>1.003724</td>\n",
" <td>Slow</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>js_addup_novar</td>\n",
" <td>400</td>\n",
" <td>8.354202</td>\n",
" <td>Slow</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>py_addup</td>\n",
" <td>100</td>\n",
" <td>0.051169</td>\n",
" <td>Slow</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>py_addup</td>\n",
" <td>200</td>\n",
" <td>0.377667</td>\n",
" <td>Slow</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>py_addup</td>\n",
" <td>400</td>\n",
" <td>3.030748</td>\n",
" <td>Slow</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" lang_func N elasped(sec) Type\n",
"0 js_addup_novar 100 0.174426 Slow\n",
"1 js_addup_novar 200 1.003724 Slow\n",
"2 js_addup_novar 400 8.354202 Slow\n",
"3 py_addup 100 0.051169 Slow\n",
"4 py_addup 200 0.377667 Slow\n",
"5 py_addup 400 3.030748 Slow"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def js_addup_novar( N):\n",
" return compjs.call(\"addup_novar\", N)\n",
"def py_addup( N):\n",
" return addup( N)\n",
"\n",
"f_l = [ js_addup_novar, py_addup]\n",
"\n",
"pdo = pd.DataFrame()\n",
"for f in f_l:\n",
" pdi = elapsed_test( f, N_l = [100, 200, 400])\n",
" pdo = pdo.append( pdi, ignore_index = True)\n",
"\n",
"pdo[\"Type\"] = [\"Slow\"] * pdo.shape[0]\n",
"pdall_d[\"Slow\"] = pdo\n",
"pdall_d[\"Slow\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Collect all data into pdall and save it"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"pdall = pd.concat( pdall_d.values(), ignore_index=True)\n",
"pdall.to_csv( 'sheet/addup.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# Comprision"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"pv = pdall.pivot( index = \"N\", columns=\"lang_func\", values=\"elasped(sec)\")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>lang_func</th>\n",
" <th>c_addup</th>\n",
" <th>cython_addup</th>\n",
" <th>js_addup</th>\n",
" <th>js_addup_a</th>\n",
" <th>js_addup_a_mixed</th>\n",
" <th>js_addup_novar</th>\n",
" <th>py_addup</th>\n",
" </tr>\n",
" <tr>\n",
" <th>N</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>0.000458</td>\n",
" <td>0.000389</td>\n",
" <td>0.035256</td>\n",
" <td>0.035332</td>\n",
" <td>0.036889</td>\n",
" <td>0.174426</td>\n",
" <td>0.051169</td>\n",
" </tr>\n",
" <tr>\n",
" <th>200</th>\n",
" <td>0.003460</td>\n",
" <td>0.003210</td>\n",
" <td>0.040445</td>\n",
" <td>0.045333</td>\n",
" <td>0.044741</td>\n",
" <td>1.003724</td>\n",
" <td>0.377667</td>\n",
" </tr>\n",
" <tr>\n",
" <th>400</th>\n",
" <td>0.024867</td>\n",
" <td>0.025044</td>\n",
" <td>0.097165</td>\n",
" <td>0.122521</td>\n",
" <td>0.123442</td>\n",
" <td>8.354202</td>\n",
" <td>3.030748</td>\n",
" </tr>\n",
" <tr>\n",
" <th>800</th>\n",
" <td>0.193796</td>\n",
" <td>0.173679</td>\n",
" <td>0.578643</td>\n",
" <td>0.717549</td>\n",
" <td>0.712154</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1600</th>\n",
" <td>1.431050</td>\n",
" <td>1.386212</td>\n",
" <td>3.848549</td>\n",
" <td>5.052639</td>\n",
" <td>4.963973</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"lang_func c_addup cython_addup js_addup js_addup_a js_addup_a_mixed \\\n",
"N \n",
"100 0.000458 0.000389 0.035256 0.035332 0.036889 \n",
"200 0.003460 0.003210 0.040445 0.045333 0.044741 \n",
"400 0.024867 0.025044 0.097165 0.122521 0.123442 \n",
"800 0.193796 0.173679 0.578643 0.717549 0.712154 \n",
"1600 1.431050 1.386212 3.848549 5.052639 4.963973 \n",
"\n",
"lang_func js_addup_novar py_addup \n",
"N \n",
"100 0.174426 0.051169 \n",
"200 1.003724 0.377667 \n",
"400 8.354202 3.030748 \n",
"800 NaN NaN \n",
"1600 NaN NaN "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pv"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7fc8fddcfc50>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYMAAAEPCAYAAACgFqixAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VMX6wPHvhARIQhqQCIE0QpEk9GoBg+i1oGKl2BDF\nhiLotSBKV6+CDbFdfvRmwYsFRSxIIAhKbwk1QEJVAmSz6dns+/tjk0iAJJuwNZnP8+yT3eyZM28O\ny5k9M2fmVSKCpmmaVrt5ODsATdM0zfl0Y6BpmqbpxkDTNE3TjYGmaZqGbgw0TdM0dGOgaZqm4YDG\nQCk1Uim1s/jxjL3r0zRN06rOro2BUioWeAToCnQEblFKtbBnnZqmaVrV2fvKoC3wp4jki0gRsAa4\n0851apqmaVVk78ZgF9BLKRWklPIBbgbC7FynpmmaVkWe9ty5iOxRSr0F/AJkAVuBInvWqWmaplWd\ncuTaREqp14EjIvLpeb/XCyRpmqZVkYgoW+3LEXcTBRf/DAfuABZfbDsRsflj/PjxdtmvPR/uFrO7\nxeuOMbtbvDpmxzxsza7dRMX+p5RqCBQCw0Uk0wF1apqmaVVg98ZARHrbuw5N0zTt0tToGcjx8fHO\nDqHK3C1md4sX3C9md4sXdMzuyKEDyOUGoZS4QhyapmnuQimF2HAA2RFjBpqLiIyMJDU11dlhaDVc\nREQEhw8fdnYYWhXpK4NapPibhLPD0Go4/TlzDFtfGdToMQNN0zTNOrox0DRN03RjoGmapunGQNM0\nTUM3BloN4Ofn57C6Bg8eTMeOHZk2bZrD6tQ0R9C3lmpuTymb3VBRoZMnT7Jp0yb279/vkPo0zZH0\nlYELMZmMGAzrMZmMzg7FLWVnZ3PdddfRtWtXOnTowHfffQdAamoqMTExPPbYY8TFxXHjjTeSn58P\nwMaNG+nQoQOdO3fmxRdfpF27duXu/4YbbuD48eN07tyZtWvX0qdPH7Zs2QLA6dOniYqKAmDevHnc\ndddd3HTTTbRp04aXXnqpdB8rVqygS5cudOrUieuvv95eh0LTqs7ZK+8V348stV1BwVlJSKgnq1Z5\nyoYNHaSwMNPmddTU4+zn5yciIiaTSYxGo4iIpKenS8uWLUVE5PDhw+Ll5SU7duwQEZEBAwbIokWL\nREQkLi5O/vzzTxERGT16tLRr167ceg4fPlzm/fj4eNm8eXNpfVFRUSIiMnfuXImOjhaj0Sh5eXkS\nEREhR48elVOnTklYWJikpqaKiMjZs2dtdgxcSU39nLma4uNss/OwvjJwEenpXyOSD5jIyUkmOzvJ\n2SG5HRHh5ZdfpkOHDlx33XUcP36cv//+G4CoqKjSb/1dunTh8OHDGAwGsrKy6N69OwD33nuvzWLp\n27cvDRo0oF69esTGxpKamsoff/zBNddcQ3h4OACBgYE2q0/TLpUeM3ARBQUn8PRsRFFRJj4+Mfj6\nxjo7JLezaNEi0tPT2bp1Kx4eHkRFRZGXlwdAvXr1SrerU6dO6e/lEmbKenp6YjabAUr3V+Lc+jw8\nPDCZTJdcn6bZk74ycBGZmX/SosVUOnZcQ6dOiXh6Ou4OGXdXcoI1GAyEhITg4eHBqlWryqzDdLGT\ncEBAAP7+/mzcuBGAzz//3Oq6wHK1sWnTJgCWLFlSadmePXuSmJhYGtfZs2crLaNpjqIbAxcgYsZg\nSKRRoxsICOipG4IqKrmb6L777isdEF64cCFt27a9YJvzzZw5k2HDhtG5c2dycnIICAiwqi6Af//7\n33zyySd06dKFM2fOVFqmcePGzJgxgzvuuINOnToxaNAgq/9GTbM3uy9Up5R6GbgfKAJ2AkNFpOC8\nbaQ2Xz5nZe0gKekuevSw7y2LegGxC2VnZ+Pr6wvAW2+9xcmTJ3nvvfecHJV7058zx3CrheqUUhHA\no0AnEWmPZYxCfx06T0bGagICrnF2GLXSDz/8QKdOnWjXrh1r167l1VdfdXZImuYU9h5AzgQKAF+l\nlBnwAY7buU63YzCsoVGj25wdRq00YMAABgwYUOZ3P//8My+99FJp946I0KJFC/73v/85I0RNcwhH\ndBM9CrwL5AA/i8gDF9mm1nYTiQjr1jWhS5cN1K8fYde69OW75gj6c+YYbpXpTCnVAngWiAAMwFdK\nqXtFZPH5206YMKH0eXx8fK3JR5qTswcPD2+7NwSaprm3hIQEEhIS7LZ/u14ZKKUGANeLyKPFrx8A\neojI0+dtV2uvDI4f/y8Gwzratp1n97r0NzbNEfTnzDHcagAZ2Av0VErVV5YO2L7AbjvX6VYyMlYT\nGNjb2WFomlbL2bUxEJHtwHxgM7AdUMAMe9bpTkRE30mkaZpLsPukMxGZKiKxItJeRIaISKG963QX\neXkHAfD2jnZyJDXf0KFDGTduXLnve3h4cPDgQQdGpGmuRc9AdiJLF9E1DluPXyuf/jfQajvdGDiR\npYtIjxe4Aj3gqdV2ujFwIoNhDYGBrjNeYDTC+vWWn84of/ToUe666y5CQkIIDg7mmWeeKXfbgwcP\n0rdvXxo3bkxISAj3338/mZmZpe9v3bqVLl26EBAQwKBBgy5YVXTq1KmEhobSvHlz5syZU+bKoE+f\nPsyePbv09bx58+jVq1fpaw8PD6ZPn050dDQhISG8+OKL1fuDNc2F6MbASfLy0igqysbH53JnhwJY\nTuC9ekHv3pafVT2hX2p5s9nMLbfcQlRUFGlpaRw7dqzChdxEhDFjxnDy5El2797N0aNHS+eqFBYW\ncscddzBkyBDOnDnDPffcU2b28IoVK3j33XdZuXIl+/fv59dff600vvO7kb755hu2bNnCli1b+Pbb\nb8s0HprmjnRj4CQlXUSu0le9axckJYHJBNu3g78/KGX9w9/fUs5kguRky76qYsOGDZw4cYIpU6ZQ\nv3596taty5VXXlnu9tHR0fTt2xdPT08aNWrEs88+y+rVqwFYv349JpOJZ555hjp16nDXXXfRrVu3\n0rJLlixh6NChtG3bFm9v7zITHq01evRoAgICaN68OaNGjeKzzz6r8j40zZXoxsBJSgaPXUVcHMTG\ngpcXdOgAmZkgYv0jM9NSzssLYmIs+6qKI0eOEBERgYeHdR/Jv//+m8GDB9O8eXMCAwO5//77SU9P\nB+DEiRM0a9aszPYREf/M8D5+/DhhYWFl3qvqmEHz5s3LlD9+XC+5pbk33Rg4iauNF/j5QWIirFlj\n+elXxZQKl1o+LCyMtLS00sxhlRkzZgweHh4kJSWRkZHBwoULS0/oTZs25dixY2W2T0tLK33etGlT\njhw5Uvo6NTW1zBWar68vOTk5pa9Pnjx5Qf3nlk9LSyM0NNSquDXNVenGwAny809QWJiOr2+cs0Mp\nw88Pevas+oncFuW7d+9O06ZNGT16NDk5OeTn57Nu3bpytzcajTRo0AA/Pz+OHTvG1KlTS9+74oor\n8PT0ZPr06ZhMJpYuXcqGDRtK3x8wYABz585l9+7d5OTkMGnSpDL77tixI0uXLiU3N5cDBw4wa9as\nC+qfOnUqGRkZHDlyhGnTpulENZrb042BE1jGC3qhlD78JTw8PFi2bBn79+8nPDycsLAwvvzyy3K3\nHz9+PJs3byYwMJBbb72Vu+66q/Q9Ly8vli5dypw5c2jUqBFLliwp8/6NN97IqFGjuPbaa2ndujV9\n+/Yts+9nn30WLy8vmjRpwtChQ7n//vsvqL9///506dKFzp07c+utt/Lwww/b4ChomvPYfQlrq4Ko\nZQvV7ds3HG/vloSFPefQevUCYrbh4eHBgQMHaNGihbNDcUn6c+YY7rZQnXYRerKZpmmuRjcGDlZQ\ncIr8/KM0aNDR2aG4vCeffBI/Pz/8/f3x9/cvfT58+HCnxuUqtwNrmi3pbiIHO3VqKSdOzKR9++UO\nr1tfvmuOoD9njqG7idycq80v0DRNA90YOJweL9A0zRXpxsCBCgvPkpeXgp9fV2eHommaVoZdGwOl\nVGul1Fal1JbinwalVPlLUdZwBsNa/P174uHh5exQNE3TyvC0585FZB/QCUBZZlgdBb62Z52uTHcR\naZrmqhzZTXQdkCIiRyrdsoYyGPTgsb1NnDiRBx54wNlhlGv16tVlFsk7X2XpOTXNXhzZGAwEau06\nvyaTkezs3fj5dXd2KDVGeSdWV58H4OrxabWTXbuJSiilvIDbgNHlbXPumvLx8fHEx8fbPS5HMhh+\nx8+vC3Xq1Hd2KDWGiOgTq1ZrJCQkkJCQYL8KRMTuDywNwYoK3peaLiVltBw8ONapMVR2nDPzMmVd\n2jrJzMus1v4vtfyRI0fkzjvvlODgYGncuLEMHz5cGjZsKLt27Srd5q+//hIfHx9JS0sTb29vqVOn\njjRo0ED8/PzkxIkTMmHCBBkwYIA8+OCD4ufnJ3FxcbJ58+bS8rt375b4+HgJDAyUuLg4+e6770rf\ne+ihh+Spp56Sfv36iZ+fn/Ts2VMOHjxYadwjR46UsLAw8ff3l65du0piYmLpe7m5uTJkyBAJCgqS\n2NhYmTp1qoSFhZW+v2XLFuncubP4+/vLwIEDZdCgQTJ2rOVzMnfuXLn66qvL1KWUkpSUlNJ4n3ji\nCbn++uvFz89P4uPjJTU1tYpH3fZqw/9nV1B8nG12nnZUN9FganEXEUBGhmvlLzifMd9Irzm96D23\nN73m9MKYX7W8lZda/ty0l6mpqRw7doz77ruPwYMHs2DBgtLtPv/8c6677jrCwsL48ccfCQ0NxWg0\nkpmZSZMmTQBYtmwZ9957LwaDgVtvvZWnnnoKAJPJxK233sqNN97IqVOn+OCDD7jvvvvYv39/6f6/\n+OILJk6cSEZGBtHR0bzyyiuVxt69e3d27NjB2bNnuffee7nnnnsoKCgALFe8hw4d4tChQ/z000/M\nmzevtFxl6Tnhwi6l818vXryY8ePHc/r0aTp06MB9991nzeHWtAvZsmW52APwAU4BfhVsY+tG06WY\nTNmyerWPmExZTo2jouO8Lm2deE7yFCZwyQ+vSV6y/sj6KsW2fv16CQkJkaKiojK//+OPPyQ8PLz0\nddeuXWXJkiUiIpKQkFDmW7aIyIQJE+T6668vfZ2cnCw+Pj4iIrJmzRpp2rRpme0HDx4sEydOFBHL\nN+1HH3209L3ly5dL27Ztq/R3iIgEBQXJjh07RESkRYsW8vPPP5e+N2PGjNKYV69eLc2aNStT9sor\nryxzZdCrV68y759/ZTB48ODS97KysqROnTpy9OjRKsdsSzX9/7OrwMZXBnYfMxCRHCDY3vW4sszM\n9TRo0IE6dXydHUq54kLiiA2OJflUMjHBMSQOTcSvnvVZakquDErKxwZXLe9leWkve/TogY+PD6tX\nr6ZJkyakpKRw2223VbivkisEAB8fH/Ly8jCbzZw4ceKCAeeIiIgyWdHOL5uVlVVp7G+//TazZ8/m\nxIkTgCXxTkkKzuPHj1+QIrNEZek5rXHu3+Pr60vDhg05fvz4BfvVtMo4ZAC5tnP1LiIAv3p+JA5N\nJOlUErHBsVVqCGxR/ty0l+c3CEOGDGHBggU0adKEu+++m7p16wJVvysnNDS0TLpKsKSsbNOmTZX2\nc661a9cydepUVq1aRUxMDAANGzYsk4LzyJEjtG3bFrCk2CxRXnrOli1bAlVPv5mVlcWZM2d0Ck6t\nWvRyFA5gmWzm2o0BWE7oPZv3rPKJ3BblK0p7ed999/H111+zaNEiHnzwwdIyl112GadPnyYzM7PC\nfZecmEuuMqZMmYLJZCIhIYHvv/+ewYMHVzneEkajES8vLxo1akRBQQGTJk3CaPxnvGTAgAH85z//\nISMjg6NHj/Lhhx+WvldZes4OHTqQlJTEjh07yM/PZ+LEiRc0gMuXL2fdunUUFBQwduxYrrjiCn1V\noFWLbgzsrKgoD6NxEwEBVzo7FJdWUdrLsLAwOnXqhFKKq6++urRMmzZtGDx4MC1atKBhw4YX/eYM\n/1xBeHl5sWzZMpYvX07jxo15+umnWbBgAa1atSqzXVXccMMN3HDDDbRu3ZqoqCh8fHzKdN2MHz+e\n8PBwoqKiuPHGG8s0ZpWl52zVqhXjxo2jb9++tG7dml69el1Q/7333suECRNo1KgRW7duZeHChVX+\nGzQNdD4Du8vISCQl5Tm6dNno7FDcep35YcOGERoaekHy+tps6NChhIWFudwxcefPmTuxdT4DPWZg\nZ+7SReTKUlNTWbp0KVu3bnV2KJpWY+luIjuzrEekF6errnHjxtGuXTtefPHFKt9pYytr164tk37z\n3BSczqRnX2u2pLuJ7MhsLuT33xvSs2caXl5Bzg5HX75rDqE/Z46h0166EaNxM/XrR7tEQ6BpmlYR\n3RjYke4i0jTNXejGwI4yMnT+Ak3T3INuDOxEpAiDYZ3ObKZpmlvQjYGdZGVto169ZtStW6uXZdI0\nzU3oxsBOLF1E+qqgKuLi4lizZo3d65k3b95FZ/OW6NOnD7Nnz7Z7HJrmSiqcdKaUCgbuAXoDkYAA\nqUAisERE/rZ3gO4qI2MNISGDnB2GW9m1a5fD6tL36GtaWeU2BkqpWUALYAXwX+A4oICmQHfgS6XU\nAREZ5ohA3YmIGYMhkdatP3Z2KJqmaVapqJtomoj0EZG3RGSViOwVkT3Fz98SkXjgAwfF6Vays3fh\n5dWQevXcbClhoxHWr7f8dEL5qKgofvvtNzZu3Ei3bt0ICAigadOmPP/885WWHTBgAE2bNiUoKIj4\n+HiSk5NL3ztz5gy33XYbAQEB9OzZk5SUlDJlf/nlF9q2bUtQUBAjRowoM2Fq4sSJPPDAA6WvU1NT\n8fDwwGw2A5YupTFjxtCjRw8CAgK44447yMjIqNbfr2nOVG5jICI7AJRSvkqp0u2UUh5KKZ9zt6mI\nUipAKbVEKbVbKZWklOphi8BdWUbGGvdbj8hohF69oHdvy8+qntAvtTz/dN2MHDmSUaNGYTAYSElJ\nYcCAAZWWvfnmm0lJSeHvv/+mc+fOZdI/Dh8+HB8fH/766y9mzZpVZjwgPT2du+66izfeeIP09HSi\no6P5/fffLxpXea8XLFjA3LlzOXnyJHXq1GHEiBFV/ts1zdmsGUBeiSV1ZQkf4Ncq1DENWC4ibYEO\nwO4qlHVLlslmbtYY7NoFSUlgMsH27eDvD0pZ//D3t5QzmSA52bKvKir5Rl63bl0OHDjA6dOn8fHx\noXv37pWWfeihh/Dx8cHLy4tx48axfft2jEYjZrOZpUuXMnnyZOrXr09sbCxDhgwpLffjjz8SFxfH\nHXfcQZ06dRg1alSZbGfWeOCBB2jbti3e3t5MnjyZJUuW6OUYNLdjTWNQX0RKc/8VP/epYPtSSil/\noJeIzCkuaxKRijORuDkRKc5s5mZ3EsXFQWwseHlBhw6QmQki1j8yMy3lvLwgJsayr2qaNWsWe/fu\n5fLLL6dHjx788MMPFW5vNpsZPXo0LVu2JDAwkKioKJRSpKenc+rUKYqKispNPXn8+PELUmGe/7oy\n524fERFBQUFBadpLTXMX1ixhna2U6iwiWwCUUl2AXCv3HwWkK6XmYLkq2ASMFBFry7udnJy9eHh4\nU7++c1bYrDY/P0hMtHyjj421vHZk+XNER0ezePFiAP73v/9x9913c+bMGby9vS+6/eLFi1m2bBm/\n/fYb4eHhGAwGgoKCEBGCg4Px9PTkyJEjtG7dGrCklizRtGnTMq+hbCrJ81NPluQ5Lm/71NRU6tat\nS+PGjavxl2ua81jTGIwCliilSu4magIMrML+OwNPicgmpdT7wGhg/PkbTpgwofR5fHw88fHxVlbh\nWtyyi6iEnx/07Om88sUWLVrEDTfcQOPGjQkICEApdUFe5HMZjUbq1atHUFAQ2dnZvPzyy6X9+h4e\nHtx5551MmDCBWbNmcejQIebNm0dUVBQA/fr1Y8SIEXzzzTfceuutfPjhh2UypnXs2JEpU6Zw5MgR\n/P39efPNNy+of+HChTz44IOEh4czfvx47rnnHn3rqmZzCQkJJCQk2K8CEan0AXgBccUPL2vKFJe7\nDDh4zuurgWUX2U5qiqSkwXL8+Exnh3FRrn6cIyMjZeXKlXL//fdLSEiI+Pn5SVxcnHz33XcVlsvK\nypL+/fuLn5+fREZGyoIFC8TDw0NSUlJEROTUqVNyyy23SEBAgPTo0UPGjRsnvXr1Ki3/008/SevW\nrSUwMFBGjBgh8fHxMmvWrNL3n376aQkMDJRWrVrJzJkzxcPDQ4qKikREJD4+XsaMGSPdu3eXgIAA\n6d+/v5w+fdoOR8d9uPrnrKYoPs5WnYuteVSaz6D4zqHngAgReVQp1QpoIyLfW9PYKKVWA4+KyD6l\n1HjAR0ReOm8bqSwOdyAirF/fnI4dV+Pj09LZ4VzA1deZj4iIYNGiRWXyHLu6Pn368MADD/Dwww87\nOxSX4eqfs5rCGfkM5gAFwBXFr48Br1WhjmeARUqpbVjGDd6oUoRuJC/vIADe3tFOjsT9nDp1ivT0\ndCIjI50diqbVStY0BtEiMgUoBBCRHCxjB1YRke0i0k1EOorInSJiqGasLq9kyWrdX1w1mzZtonXr\n1jzzzDNl7vo51+LFiy+aerJdu3YOjrYs/W+t1RTWdBOtA/oCv4tIZ6VUNPCZiFR+87e1QdSQbqLd\nu4fg738FzZo94exQLkpfvmuOoD9njuGMbqLxWNYnClNKLcIyCe1FWwVQkxgMa9z3TiJN02q1Sm8t\nFZFflFJbgJ5YuodGioieUXOevLw0ioqy8fG53NmhaJqmVVmlVwZKqauAPBH5AQgExiil3GxGlf1l\nZKwmIKC37kPWNM0tWdNN9AmQo5TqgOUW0xRgvl2jckO6i0jTNHdmTWNgKh7d7Q98JCIfAdVfa6CG\nKrmTSNM0zR1Z0xgYlVIvA/cDPxQvZ+1l37DcS37+CQoL0/H1jXN2KG5Np73UNOexZm2igcC9wCMi\nclIpFQ5MtW9Y7sVgWENAQC/OSfugVYNOe6lpzlNR2ktVvATGSeDdkt+LSBrFYwaqpkwQuES6i0jT\nNHdX0VfZBKXUC0qp1ue/oZRqrZR6CUiwW2RupOROIndnNJlYbzBgNJmcUr42pb2sKF5Nc4aKGoPr\ngXTgI6XUCaXUXqXUvuKlrD8EThZvU6sVFJwiP/8oDRp0dHYol8RoMtFr61Z6b91Kr61bq3xCv9Ty\nULvSXlYUr6Y5Q7ndRCJSgGWRujnFg8Yl2TrSRcTsiODcgcGQSEDAVXh4WDP84rp2ZWeTlJ2NCdie\nnY3/2rXV3ldyTg5J2dn0DAioUrmSb+Tnpr1s1KiR1WkvS4wbN473338fo9GIr68vS5cuJSkpqUza\ny8TERKBs2kuAUaNG8c4771Qp7pK0lwCTJ0+mU6dOzJ8/v8JxifLi9buEpECadimsOoMVn/z/tnMs\nbqmmjBfE+foS6+tLck4OMT4+JHbqhJ+n9Q1cyZVBSflYX99qxzJr1izGjh3L5ZdfTosWLRg3bhz9\n+vUrd3uz2cyYMWP46quvSE9PRylVmvYyJyfnomkvSxoDe6a9DA4OrnK8ujHQnMW9v866gIyM1bRu\n/Ymzw7hkfp6eJHbqRFJ2NrG+vlVqCGxR/lw1Pe1lRfFqmrPoeyEvQWHhWfLyUvDz6+rsUGzCz9OT\nngEB1T6RX2r5EosWLSpNKG/LtJe5ubkkJyczb9680rL9+vUjOTmZb775hqKiIqZNm3ZB2ss1a9Zw\n5MgRDAZDuWkv9+zZQ05OjlVpLyuKV9OcxarGQCkVoZS6rvi5t1LK6mtZpdRhpdR2pdRWpdSG6gbq\nigyGtfj798TDQ8/Bs6UVK1YQGxuLv78/zz77LF988QX16tUrd/uS/MPNmjUjLi6OK6+8ssz706dP\nx2g00rRpUx5++OEyWckaNWrEkiVLeOmll2jcuDEpKSllMq1dd911DBw4kPbt29OtWzduvfXWC+p/\n4IEHGDJkCKGhoRQUFDBt2rQK/77K4tU0Z7Amn8GjwGNAQxGJLk57+amI9LWqAqUOAl1E5GwF27jl\ndIUDB57H0zOAyMixzg7FKq6+zrxOe1kzuPrnrCYwmkz4e3k5PJ/BU8BVQCaAiOwHQqpQh7KyHrej\nF6ezHZ32UtOsU3Kzhq1Zc5LOL77NFACllCdQlWZfgF+UUhuLrzJqBJPJSHZ2Mn5+Nkv4VmvVxLSX\nrhqv5v7+yMxkZ3a2zfdrTTfRFCADeBAYAQwHkkXkFasqUKqpiJxQSgUDvwBPi8ja87Zxu26i06dX\nkJb2Hzp1Wu3sUKymL981R9CfM/sQERb+9RcvpKRQJ9vM8Rt627SbyJrbPkYDjwA7gceB5cBMaysQ\nkRPFP08ppb4GugMXzGiaMGFC6fP4+Hji4+OtrcIpdBeRpmmOsjMri/s++4xTGzfSzzcImZXOHBvX\nUemVwSXtXCkfwENEspRSvsDPwEQR+fm87dzuymDLlquIippEUJBV4+guQX9j0xxBf85sJ9NkYsLh\nwyz86y8mRkYy+IQf+x7aQ05SDn3o49gBZKXULcW3hZ5RSmUqpYxKqUwr938ZsFYptRX4A1h2fkPg\njoqKcsjK2oa/f09nh6JpWg0kIiz+6y/abtiAwWRie1RHrp2YRfKtu2g2vBm+7as/w7881nQTvQ/c\nCeys6td3ETkEuPcKbheRmfkHDRp0oE4d2/+DaJpWuyVlZ/P0/v1kmEwsaRND+GdZHJy0jZB7Q+i2\nuxtegV5c9sBl4G/beq1pDI4Cu9yuH8eOasp6RJqmuQ6jycSk1FTmnjzJhMhIBh/wIeXa/aQ38qLD\nbx1oENegdFtPP9uvJGTNraUvAT8qpV5WSj1X8rB5JG7Ekr9ANwa2ptNe2pa9jmdNOT6uQkT44u+/\nabthA6cKCtga2p4+LxjY+8AeIl6JoMPKsg2BvVjTvEwGsoD6QF37huP6ioryMBo3ERCglxCwNZ32\n0rYceTy16tld3CWUXljIZ9GXEz7HyOG3txP6RCht/q8NdXzrOCwWaxqDUBHRmd6LGY0b8fVti6en\njTvsNE2rNbJMJianpjL75EnGRkQwaFt9Dt23n8zLfejyZxe8oy++Qq89WdNNtFwp9S+7R+ImanIX\nkclowrC094hkAAAgAElEQVTegMlYvbSVl1pep72s2NChQ3nqqae4+eab8fPzo3fv3pw8eZJRo0YR\nFBRETEwM27dvL92+5HiCZXXWc4/joEGDGDZsWOnr2bNnExMTQ6NGjbjpppvKLOtd0fHRqkZE+Orv\nv4nZuJETBQVsDoqjz5NnOfRcCi2ntaTdd+2c0hCAdY3Bk8AKpVRuNW4trXEMhtUEBrp/vuPzmYwm\ntvbaytbeW9naa2uVT+iXWh502ktrLFmyhDfeeIPTp0/j5eVFz5496datG2fOnOGuu+7i2WefvWi5\n2bNns3DhQhISEli0aBGbNm3igw8+AODbb7/lzTff5JtvvuHUqVP06tWLwYMHW318NOvszcnhhh07\nmJiayoLw1kxYVI+03jvxv8qfbju70eimRs4NUESc/rCE4fqKigpkzZoGUlBwxtmhVEtFxzljXYas\n8lwlq7j0R4JXgmSsz6hyfJGRkbJy5Uq55pprZMKECZKenl6tv/Ps2bOilJLMzEwpKioSLy8v2bdv\nX+n7Y8aMkV69eomIyPz58+WKK64oU7558+Yya9YsERGZMGGCPPDAA6XvHT58WDw8PKSoqEhEROLj\n4+Xll18ufT85OVnq1asnZrO5WvFW5KGHHpLHHnus9PX06dMlJiam9PXOnTslKCio9HXJ8SyxdOlS\nCQsLk+DgYFm3bl3p72+66SaZPXt26euioiLx8fGRtLS0So/PxbjL/2dHyTKZ5OWUFGmUmCjvpqbK\n8c9OyrqwdZI0OEnyjuZVe7/Fx9lm5+FyxwyUUpeLyB6lVOdyGpEtdmmdXJjRuJn69aPx8gpydig2\n5xvni2+sLznJOfjE+NApsVOVbl8ruTIoKe8bq9Ne2iPt5WWXXVb63Nvb+4LXWVlZ5Za95ZZbePrp\np2nTpg1XXHFF6e9TU1MZOXIk//73vwHLF0SlFMeOHbPJ8amtRISv09N59sABrg4IYKNPLIaHUjl6\nupC2C9sS2DvQ2SGWUdH/9uew5DG4WHZwAa61S0QurKZ2EYHlvuVOiZ3ITsrGN9a3yvcxX2r5c+m0\nl/YxZswYYmJiOHToEJ9//jmDBg0CIDw8nFdffbW0a+hc+/btq/D4aBe3PyeHEfv3cyQ/n3lNW9Hs\n/bMcX5xM5PhImj7eFA9P11vVv9yIROSx4qc3iUifcx/AzY4Jz7VkZNTsxek8/TwJ6BlQ7RP5pZYv\nodNeVl95DcqaNWuYN29e6fjGiBEjShu2xx9/nDfeeKN0ENtgMPDVV18BFz8+f/31l01irYlyiooY\ne+gQV2zZwnUBgfy0ozl1r9iHOcdMt6RuNHuqmUs2BGDdAPI6K39Xo4kUYTD8TkBAzbwycCU67eXF\nWdNgnLtNyXOj0ciQIUP46KOPaNKkCVdffTXDhg1j6NChANx+++2MHj2aQYMGERgYSPv27VmxYgVw\n8eNz1VVXWRVvbSIifJueTuzGjezPyeFPLqfPwHT+nnWSuGVxtJnRhrrBrj1Nq9xVS5VSTYBmwELg\nXiwZy8CyIsanInK5zYJwg1VLjcbN7N79IN27Jzk7lGpz9dUkddrLmsHVP2e2lpKbyzP793MwL48P\nAyNpNuUMZ344Q9R/omjyYBOUh30mOBYfZ4fkM7gBeAhojmXcoKTSTGCMrQJwF5YuIn1VYC867aXm\nbnKLingzLY2Pjh3jxdAwPl4VxNHX9uP5wGV039MdzwDbrx9kTxWNGcwrHh94SESuPWfMoL+ILHVg\njC6hJk82czad9vIfcXFxF5Tx9/fns88+s0f4WjV9X9wllJyTw7qcVvTp/zdnl52m4+qOtHy3pds1\nBGDn5DZWB+Hi3UQiZn7/PZhu3XZSr16os8Opttp2+a45R03+nB3KzWXkgQPszclhuk8EzV47TeYf\nmbR8tyWN72zs0DWvbN1N5JrD2i4mO3sXXl4N3boh0DSt+vKKiph0+DDdNm/mynp+LP/1Mnz6HMCn\njQ/dd3cn+K5gt1/80CHXMkopD2ATcFREbnNEnbaUkbFGdxFpWi314+nTjNi/nw4NGpD4dzSGh1LJ\nifOly4YueLdwzjpC9lDRDOQ7KypYxXGDkUAyNs/N4xgGw2oaNXK7NkzTtEtwODeXZ1NS2JWdzUce\n4TR9KZ3MA2m0/qg1DW9o6OzwbK6ibqJbix+PALOA+4ofMwGr76NTSjXHMkltZvXDdB4R0XcSaVot\nkm8283pqKl02b6ab8uGHrxvje/NBAuMD6bazW41sCKCCKwMRGQqglPoZiBGRE8WvmwJzq1DHe8AL\nQED1w3SenJy9eHh4U79+hLND0TTNzn46c4an9+8n1tub1QcjMb5yBNM1AXTb0Y16oeVPfKwJrBlA\nDitpCIr9BYRbs3OlVD/gLxHZhmWegtuNsFjWI9LjBY6g015qzpKWl8ddu3YxfN8+puU3Y/wzReS9\nd5K2n7UlZmFMjW8IwLoB5JVKqZ+AkhudBwK/Wrn/q4DblFI3A96An1Jqvog8eP6GEyZMKH0eHx9P\nfHy8lVXYV0bGaoKC+jo7jFpBp73UHK3AbObdI0d4+8gRnvNryuuL6nL6i1RCJkYS+lgoqo7rfE4S\nEhJISEiw2/4rbQxE5Gml1B1ASaf5DBH52pqdi8gYimcrK6WuAf59sYYAyjYGrqJkvCAycpKzQ9E0\nmzObzRUuAFjT/VrcJdSqvje/7QjDOOko6vbGdEvuRt3GrreOUJkvyUYjEydOtOn+rf0kbAF+EJFn\ngZ+UUhUvul5D5OUdBARv72hnh+IQJpMRg2E9JpPRKeVrS9rLkn3Mnz+fiIgIQkJCeOONN0rfLygo\nYNSoUTRr1ozmzZvz7LPPUlhYCEBMTAzLly8v3baoqIiQkBC2bdtW6XEYOnQow4cPp1+/fvj5+dn1\nW6YrO5qXx4CkJB7dt493MpoyYVghpkWnab+8PW0+beOSDUEZRiPYYf2uShsDpdSjwFfAf4t/1Qz4\npqoVichqd5tjkJFhGS+oDV0KJpORrVt7sXVrb7Zu7VXlE/qllofalfYS4Pfff2f//v38+uuvTJo0\nib179wLw2muvsWHDBnbs2MH27dvZsGEDr732GgCDBw8uzfUAlhVeg4OD6dixY6XHAeCzzz5j7Nix\nGI1Gt1oQ0BYKzGampKXRcdMm2mfX4/v/BhD08FGaPdOMTms74dfZDb7jmkzw3nuwY4ft911ZKjRg\nG1AX2HrO73baMt0aLpomLzl5iBw9+omzw7CZio5zRsY6WbXKU1at4pIfCQlekpGxvsrx1Za0lyX7\nOH78eOnvunfvLl988YWIiERHR8uKFStK3/vpp58kMjJSREQOHDggfn5+kpubKyIi9913n0yePLnS\n4yBiSZs5ZMiQcuOyFVf8/7zyzBm5/M8/pd+mbbLlrRRZ23itHHj+gBQaCp0dmnUyM0Xee08kIkLk\nyitFIiMdl/byHPkiUlDybUgp5Ykl01mNZzCsJjz8JWeH4RC+vnH4+saSk5OMj08MnTol4ulp/Tel\nkiuDkvK+vrHVjqWmp70scW7KSh8fn9KUlcePHyc8/J8b9iIiIkoT0URHRxMTE8OyZcu45ZZb+O67\n75g0aVKlx6EknWZtS1l5LD+f51NSWG8w8OHJpoSM/RuPUOi4piO+baufmtVhjh+H6dPh//4P+vaF\nL7+E7t0tXUX+tp3Da01jsFopNQbwVkpdDwwHltk0CheUl5dGUVE2Pj42S9vg0jw9/ejUKZHs7CR8\nfWOr1BDYovy5anray8qEhoaSmppK27ZtS/cZGvrPuliDBg1i8eLFFBUVERsbS4sWLSo9DiVqQ5cn\nQKHZzAfHjvGf1FRGEsLo9/3I3XySqHejaXy7YxeUq5Zdu+Cdd+Dbb+H++2HDBij+dwagklzZ1WHN\nAPJo4BSwE3gcWA68avNIXIxlPaLerv+hsSFPTz8CAnpW+0R+qeVL1PS0l1B+ekqwjAu89tprpKen\nk56ezuTJk8sMYg8aNIiff/6ZTz75hHvvvdeq41CbJJw9S8dNm1h54jQ//XIZfW7/m4B2DeiW3I3g\nO1x4QTkR+O03uPlmuP56aNUKDhyADz4o2xDYSaWNgYiYgXnAZGAiME8q+iTXEHqymfPU9LSXUPGg\n9KuvvkrXrl1p3749HTp0oGvXrrzyyiul7zdp0oQrrriCP/74g4EDB1p9HGq6E/n53JeczIO7d/Pm\n3kaMG5xHvZ35dNnUhcjxkdTxruPsEC+usBAWL4YuXeCpp+Cuu+DQIRgzBho6bumLSvMZFM8i/hRI\nwTKDOAp4XER+tFkQLpjP4M8/WxMb+xUNGrR3dig24+rrzOu0lzWDoz9nJrOZ6ceO8XpqKiPzg7ll\nah6Fqfm0/KAlDa934XWEjEaYORPefx+iouCFF+Cmm8DKuR+OTHtZ4h2gj4gcKA4gGvgBsFlj4Gry\n809QWJiOr2+cs0OpNXTaS606EjMyeGr/fsIKvfhxaTD580/R+OUImo1ohkddF51Qd+yYZVB45ky4\n7jr46ivo1s3ZUVk1ZmAsaQiKHQSqN6vITRgMawgI6IUlDYNmbzrtpVZVJ/PzeXD3bu5NTua1TYG8\nMiCHBulmuu3sRti/w1yzIdi5Ex56CNq1g9xc2LgRPv/cJRoCsK6b6BMgAvgSyy2l9wBpFK9PJDbI\nh+xq3UT79g3H27slYWHPOTsUm3L1biKtZrDn58xkNvPx8eNMTk1l5NmG3PhWLmSbafVhKwKudMGF\nkUsGhd9+G7ZvhxEj4PHHbTIW4IxuovpYViotGU09hWXRuVuxNA6X3Bi4moyM1TRpovuANc2V/G4w\nMHzfPprl1OH7RUGYvj1D6KQomg5r6lILygGWQeElSyyNQF4ePP88fPMNVHAjhLNZs1DdUEcE4ioK\nCk6Rn3+UBg06OjsUTdOAvwsKeDElhZXpZ/jwz0Y0nnqaoLsbELW7O14NvZwdXlmZmf8MCkdHw2uv\nwY03Wj0o7EzWrE00RSnlr5TyUkqtVEqdUkrd74jgnMFgSCQg4Co8PBySHlrTtHIUifDRsWPEbtxI\ny11m/jeyLuHf5tL+p/a0/qi1azUEx47Biy9a7grauBGWLoVVqyxzBtygIQDruon+JSIvFi9jfRi4\nE1gDLLRnYM5SsjidpmnOs95g4Kn9+wk9q/hujj+y2kDElGhC7g1xrUljO3ZYZgovWwYPPgibN4Ob\n3hFnTWNQsk0/YImIGFzqH8PGDIY1tGr1sbPD0LRa6VRBAaMPHuSXv08zfVUQjaafIeSRQCL2tMXT\nz0Wu1kVg5UrLeMCOHfDMM5ZuoaAgZ0d2Say5fvleKbUH6IIl61kwkGffsJyjsPAsubkp+Pl1dXYo\nmoPpVJjOVSTCJ8VdQtF/mvjyCU8i1xfS+ffORL8V7RoNQWEhLFwInTrByJEwcKBlpvDo0W7fEIB1\nA8ijlVJTAIOIFCmlsoH+9g/N8QyGtfj798DDw4X6IjWHqclXvK5sQ2Ymw/fto8lfiq9n+FJnZxYt\n32tJo9sauca/SWamZdXQadOgZUv4z38sg8KuEJsNWdvchgLXKaXqn/O7+ZUVUkrVwzK+ULf48a1Y\nUmG6JMtks96Vb6hp2iVLLyhgzKFDrDiezvTlATSanUGzUc0J+zzMNdYROnrU0gDMng033ABff21Z\nP6iGsuZuovHA9OJHH2AKYFXGMhHJx7KURSegPXCtUuqq6odrX7V98NhoNLJ+/XqMxupNML/U8lFR\nUbz55pvExsbSqFEjHnnkEfLz82nXrh0//PBD6XYmk4ng4GC2b99e4f7cKRVmbWIWYcbx48Ru2ECL\nlfl8/rAH0Yeg65auRI51gQXltm+3DAa3b2/JLLZlyz8LydVg1owZ3A30BU4WzznoAFg91U9EShaD\nr1dc39mqBukIJpOR7Oxk/Py6Oy2GzMzMSzqZXgqj0UivXr3o3bs3vXr1qnIMl1q+xOLFi/nll19I\nSUlh7969vPbaawwZMoQFCxaUbvPDDz8QGhpKhw4dKtyXO6bCrOk2ZWbSc8sWflh/jP9N8OHaD/No\nO/Ny4r6Ko35E/cp3YC8i8Msv8K9/WW4HjY2FlBRLismICOfF5UiVpUIDNhT/3Az4Y1m5dI+1qdSw\nNABbgUxgSjnbVCMPnG2lp/8oW7b0dlr9hw4dkvr164unp6d06NChNFWhLVV0nNetWyeenp6CZVb5\nJT28vLxk/frqpb2cMWNG6evly5dLy5Yt5cSJE9KgQQMxGo0iInL33XfL1KlTq7RvV0+FWZNc7HN2\nuqBAnti7VyJ/XivfPLld1jZeK2nvpklRQZETIjxHfr7I/Pki7duLxMaKzJkjkpfn3JishBPSXm5S\nSgUC/1fcIGQB66vQ2JiBTkopf+BnpdQ1IrL6/O0mTJhQ+jw+Pp74+Hhrq7AJg2GNU7uIhg0bRkFB\nAWazmeTkZJKSkujZs6fD6o+LiyM2Npbk5GRiYmJITEwsTZVojZIrg5LysbHVS3t5fnrK48eP06RJ\nE6666ir+97//cfvtt/Pjjz/ywQcfVLgfd02FWdOYRZhz8iSvpKTw3PoGLHhf0fhfdYna2ZV6TZy4\nNIPB8M+gcJs28NZblnEBFx4UTkhIICEhwW77t+ZuouHFTz9VSq0A/EVkR1UrEpFMpdQPQFegwsbA\nGTIyVhMVNckpdX/xxRekpaURGxvLnj17LulkWl1+fn4kJiaSlJREbGxslRoCW5QvcX4KyZJ0j0OG\nDGHWrFkUFhZy5ZVX0rRp0wr3U9NSYbqjLUYjw/ftI3SvmSXT6+FdaKLVV7EEXOHEBeWOHLE0AHPm\nWO4I+vZb6NzZefFUwflfkidOnGjbCsq7ZAA6V/Sw5rIDaAwEFD/3xnJnUd+LbGeHiyjrmUzZsnq1\nj5hMWQ6v+8SJExISEiJ//vmnZGZmyvr16+3SRSRScTeRK4iMjJT27dvL0aNH5fTp03L11VfLq6++\nKiIiubm5EhQUJO3atZMFCxZUuq+PP/5YOnXqJJmZmZKVlSVPPvmkeHh4SEpKioiIDBo0SAYPHiw5\nOTmSlJQkzZs3L+0mSk9PF39/f/n666/FZDLJ+++/L56enqXdRL/88osEBwdLWlqaZGRkSP/+/S/o\nJgoLC5Pdu3dLdna23HPPPXL//ffb45C5JECG790r0T8kyrcPbpG1IWvl2IxjYjY5sZts61aR++8X\nCQoSefZZkdRU58ViI9i4m6iiE/mqCh6/WbVzaAdswTJmsB14vpzt7HfErHDmzErZvPmKyje0MbPZ\nLLfddpuMGTPGIfU5+zhXJjIyUt58802JiYmRoKAgGTp0qOTm5pa+/8gjj0iDBg0kOzu70n1lZWVJ\n//79xc/PTyIjI2XBggVlGoNTp07JLbfcIgEBAdKjRw8ZN25caWMgIvLTTz9J69atJTAwUEaMGCHx\n8fGljYGIyNNPPy2BgYHSqlUrmTlz5gWNwZgxY6R79+4SEBAg/fv3l9OnT9vqMLk8QN6esEUSQ9bK\nvqf3ScGZAucEYjaL/PSTyHXXiYSGirz1lsjZs86JxQ4c1hg48uHsk9TBg+MkJWW0w+udO3eutG/f\nXvIcNGDl7ONcmcjISFm5cmW570+ePLnMwK2rOr/hqG0A2dJrixi3GZ0TQH6+yLx5Iu3aicTFicyd\na/ldDWPrxqDcW0uVUi+e8/ye8957o2qdUa4tI2M1AQGOHTw+cuQIzz//PPPnz68w2btmcebMGWbN\nmsVjjz3m7FA0K3Rc3ZEGHRo4tlKDAaZOhRYtYP58y/MdO2DIEKhb17GxuKGK5hkMOuf5y+e9d6Md\nYnEKszkfo3ETAQFXOqxOEeGRRx5h5MiRld4rX5uUt/TAzJkzCQ8P5+abb+bqq68u/b2rppZ0iSUU\nnMyhxyAtDf79b0sjsH27ZQXRX391+buDXE25aS+VUlvFMnO4zPOLvb7kIJyY9jIjI5GUlOfo0mWj\nw+r89NNPmT17NuvWrcPT03ELcOm0l5ojOOxztnWrZfno5cth6FDL4nHh4fav10U4Mu2llPP8Yq/d\nlqO7iFJSUnj11VdJTEx0aEOgaTWCCPz8s6ULaM8eSwPw4YcQGOjsyNxeRWejDkqpTCwzjr2Ln1P8\n2onzxm3LYFhDs2ZPO6Qus9nM0KFDGTNmDG3btnVInZpWIxQUwGefWXIIKGXJKTxokB4LsKFyGwMR\ncYFlA+3LbC4kM/MPYmK+cEh906ZNQ0QYOXKkQ+rTNLeXkQEzZsAHH0DbtpZuoeuv12MBdlCr+ymM\nxs3Ur98CLy/7J6bYvXs3r7/+On/++Sd16jinnY2IiNCDm5rdRdhiYbfUVMtM4blzoV8/+P576Njx\n0verlatWNwYGw2oCA+2fv8BkMjFkyBAmT55MdHS03esrz+HDh51Wt+YeRITP//6bsTsO8OxiL9p/\nX0DUq5GEDg/Fw8sBid23bLF8+1+xAh5+2HJ3UBXXhdKqp1Y3BhkZa2ja9GG71zNlyhQCAgJ44okn\n7F6XplVXcnY2T+/dR/S3ucycITS52Z8WSS2oG2LnfnkRy8n/7bdh3z7LoPDHH0OAE9cwqoVqbWMg\nUoTB8DuXXz7XrvVs376d9957j82bN+suGs0lZZlMTEpNJWH1CcZ/7MllHvVo/U0r/Hv427fi/HzL\noPA774CHh2VQeOBAPSjsJLW2McjK2ka9es2oW9d+SwoXFBTw4IMPMnXqVMJr0f3PmnsQEZacOsX4\nzQcYNacOt65RtHw9giZDm6A87PjFJSMDPv0Upk+HuDh491247jo9KOxktbYxyMhYY/fxgsmTJxMe\nHs6QIUPsWo+mVdWe7Gye2bOfVl/k8MkcM83uDSZyTyRegV72qzQ1Fd5/H+bNg1tusUwW0zPwXUYt\nbgxWExIyqPINq2nDhg3MmDGDbdu26e4hzWVkFxXxWmoqa388xpiP63BZsDetf2tFg3Z2XEdoyxbL\neMBPP8Ejj1jWCzonsZDmGmplYyBixmBIpHXrj+2y/9zcXIYMGcIHH3xQaRIWTXMEEWFpejqT1u9n\nxAxFv211aP1OS4IHBNvny4oI/PijpRHYvx9GjYJPPtGDwi6sVjYG2dlJeHk1pF69ULvsf+zYsbRr\n146BAwfaZf+aVhX7cnIYlbSP1vOymfaZmfAnmhHxRQR1fO0w3yU/HxYvtjQCXl7/DAp72bH7SbOJ\nWtkY2HM9osTERBYvXsyOHVXODKppNpVTVMTrqan8+fVRnv+oDk3b+tHqz5b4tPSxfWVnz8J//2uZ\nKdy+vWXCWN++elDYjdi1MVBKNQfmA5cBZuD/RKTiTOYOYDCsplGj22y+36ysLB566CE+/fTTWpfv\nVnMdIsK36em8vno/T30MN6fV5fLprWjUr5HtKzt82DIoPH8+3HqrZb5A+/a2r0ezu3KXsLbJzpVq\nAjQRkW1KqQbAZqC/iOw5bzuHLWEtIqxb14QuXTZQv74Nps2fY/jw4WRnZzNv3jyb7lfTrHUgJ4fn\ndu7n8v8auelbocXz4YQ9F4ZHPRvPHt682bJy6C+/WAaFn3lGDwo7mCOXsL5kInISOFn8PEsptRto\nBuypsKAd5eTsxcPD2+YNwS+//ML333+vu4c0p8gpKuLN1FS2LjrK0//1IPSqIFpti6Z+mA0XGDab\n/xkUTkmxDArPmAH+dp6cpjmEw8YMlFKRQEfgT0fVeTGW9YhsO15gMBh45JFHmDlzJoF6XXXNwb5L\nT+etn/fx5AfCjVn1aLuwNUHxNlx8MT8fFi2yzBSuW9cyKDxggB4UrmEc0hgUdxF9BYwUkayLbTNh\nwoTS5/Hx8cTHx9slloyMNQQFXWvTfY4aNYp+/frxr3/9y6b71bSKHMzN5YWt+4iZnslrv0Cr8VGE\nPhmKh6eNuoTOnrXcDjp9umXF0A8+gGuv1YPCTpKQkEBCQoLd9m/XMQMApZQn8D3wo4hMK2cbh4wZ\niAjr14fRsWMCPj4tbbLPZcuWMXLkSHbs2EGDBg5OAK7VSrlFRUxJTWPX/x3h0VmK5rcF0/I/Lagb\nbKM1fQ4dsgwKL1gAt91myS/s5LzS2oXcasyg2GwgubyGwJHy8g4Cgre3bZaRPn36NI8//jifffaZ\nbgg0h/jh9Gne/XYvj04z86+63sT+0Ab/bjbqs9+0yTIo/OuvMGwY7NwJzZrZZt+ay7P3raVXAfcB\nO5VSW7HkTh4jIivsWW95MjIs4wW2mnH51FNPMWjQIK65xnE5lLXa6VBuLi9v2Efsu5m8+qfi8v9E\n02SIDRaUM5stawS9/bblimDUKPi//9ODwrWQve8m+h1wmfSZGRlrCAiwzeJ0X375Jdu2bWPOnDk2\n2Z+mXUxeURFTD6Wx98MjPLIAwh9oSot5NlhQLi/vn0Hh+vXhhRfg7rv1oHAtVqtmIBsMqwkPf+mS\n93Py5ElGjBjBd999h7e3tw0i07QLrTh9mulf7mXoe0VcH9qAdmva4Bvre2k7PXPGMij84YfQqZPl\nZ58+elBYqz2NQV5eGkVF2fj4XH5J+xERHn/8cYYNG0aPHj1sFJ2m/SM1L4+xa/cSO8XAv3fXIe7d\nNgTffYkLyh06BO+9BwsXQv/+lslicXG2C1pze7WmMSjpIrrU8YIFCxZw6NAhvvzySxtFpmkW+WYz\n7x5I4+A7aTywBCKfbEaLryMvbUG5jRst4wErV8Kjj8KuXRBqnwUaNfdWaxoDW0w2O3LkCM8//zw/\n//wz9erVs1FkmgY/nznDf+fu4f5pJq6N86f9xjZ4R1ezC9Jshh9+sDQChw/Ds8/CzJng52fTmLWa\npdY0BhkZq2nWbES1y4sIw4YN45lnnqFjx442jEyrzY7k5TFx1T7iXs/gqROedPg0lkY3VXNBubw8\nSzfQO++Aj49lpvA994Bnrflvrl2CWvEpyc8/QWFhOr6+1e8jnTFjBmfOnGH06NE2jEyrrQrMZqbt\nSyPtjVQGfq9o8UI4Uc+FV29BudOnLYPCH30EnTvDxx9DfLweFNaqpFY0BgbDGgICeqFU9abpHzx4\nkEiXH2cAAB1fSURBVFdeeYU1a9bgqb9laZdo5ZkzzP54NwM/KuKaaxrSYWdr6jWrRrfjwYOWQeFF\ni+D22y2TxWJjbR+wVivUijNbyWSz6jCbzTz00EO8/PLLxMTE2DgyrTY5lp/Pa8v30P41Aw/n16Xz\n5zEEXVONBeU2bLDMFF61Ch57TA8K10JGo+33WUsagzU0afJwtcpOmzYNs9nMqFGjbByVVlsUms18\nmJTK8Ulp3LFK0Wp8FBFPNqvagnJmM3z/vWVQOC3NMig8e7YeFK6FjEbo0dv2rUGNbwwKCtLJzz9K\ngwZVH/Tds2cPr7/+On/88Qd16rjMRGrNjaw6fYZF7+3h9k8Luap/YzruaUXdxlVYUC4vz7Jg3Dvv\nQIMGlpnCd92lB4Vridxc2LPHcvFX8ti4w8ipW66Gbbatq8Z/oizjBVfi4VG1P9VkMjFkyBAmTZpE\ny5a2WeFUqz2O5+fz1td76DApg0E+9em+Ig7/rlVY7yc9/Z9B4a5d4dNP4Zpr9KBwDWUywf79ZU/6\nu3ZBapoQGXeCpu2T8IlMovDGJPz7/sGpzF02j6HGNwbVHS+YMmUK/v7+PPHEE3aISqupCs1mPtme\nyqmxady80YPL32xF+JCm1i8ol5Lyz6DwnXfCb7+BHquqMcxmSE298KS/d5/QtOXfNOuYRIOoJEy9\nd+HbJwnv7CROe3jSJDiWyOBYYkM6ERV4J8/99AJ7SLJpbHbPZ2BVEHbMZ7BpUydatfqYgIArrC6z\nY8cO+vbty+bNmwkPD7dLXFrNs/rUWZa8uZub5xQSfP9ldJrcEs8AK79v/fGHZTwgIQEefxyefhqa\nNrVrvJr9iMDJkxee9JOTwa/JKZp3TsI/OglpnESGVxKpuUmYxUxcSByxwbHEhsSW/gzxDblg/8Z8\nI/71/d0un4HTFBaeJTc3BT+/rlaXKSgo4MEHH2TKlCm6IdCscjI/n3c/20P7SRnc1tyHKxPb0yDW\nivwWZjMsW2ZpBI4etQwKz51rGRvQ3MbZsxee9HftAql/hohuSQS2SoLLkzB1SMI7L4kccz5eIbG0\nCC454d9JbHAsTRo0sXq5HL96tr9xoEY3BgbDWvz9e+DhYf2yvJMnTyYsLIyHHnrIfoFpNYLJbGbG\nxlQyXk6jzz4P4t5tQ/N7Lqv8P3RuLsyfD+++a8kb8MILli4hPSjs0rKzLd/szz/pG/IMRHZPIqhN\nEh7NkzC22oXnLUnkmrKpFxxjOemHxBIbfAtxIXGE+oXaLKeKLdXoT59l8Nj6/AUbN25kxowZbNu2\nzSX/sTTXkXjyDN9O3M21n5kIfrIpnb+Ppo5PJXecpadbZgd/9BF07w4zZkDv3npQ2MUUFMDevRee\n9I+fziSsczKNLk/CMzSJ7BuTMF+XBIUZeAe3pWVJF0/wDcSGxBLmH+ZW5xF7ZzqbBdwC/CUi7e1Z\n18VkZKwmOvptq7bNzc1lyJAhTJs2jaa6r1Yrx8n8fD6ctZt2b2RwfXs/em1pi08Ln4oLHThgGRRe\nvNhyW+iqVXpQ2AUUFVkmcZ9/0k85kk2TdskExyRRt3kSub2TyLs6CY/CdPwaX06r0u6da4kNjiUi\nMAKPaq5u4ErsfWUwB5gOzLdzPRcwmYxkZyfj59fdqu3Hjh1LXFwcAwcOtHNkmjsymc3M/v0wWS8e\noedfdeg4I5bmNwdXXGj9est4wJo1lkHh3buhSRPHBKyVErEMyZx/0t99IJfAlru5LC6J+uFJ5HdN\nIqPrLjwK/iKwUWtaFw/ixoU8QWxwLJGBkdTxqLnzjeyd9nKtUirCnnWU5+zZX/H2boVIIVC/wm3X\nrl3L4sWL/7+9M4+Oq7rz/OfWqqrSLmuzZFnW4kVly7KJDQmk8YRAaEInbpKmAx1Ns/Q5k5yZJNOk\nCaQ7pP0HnU5nnEM4Z5IwfchkwIbgBnraQKY7wHS7bcwA5mC7pKfFkmxj2diyrK327b07f7wnJNmS\nkRdZVdL9nPNOvXfrVdW3tPx+997f7/4ugUAgq4Z1imvD/lPD/PNfdfKZ3WlK/6KK6x6uw+aaoSeo\n6xNB4VOn4KGHzPiA7wp3KFPMisHBC41+W2cc19JuKprb8S7XSDVpnFurIROnWFLSyOrxzJ3SB/CX\n+akrqsNxieuSFgJznlpqOYNXLzZNdLVTS9PpEO+8s4J0egSfbx0bNuzD4Zg++h4Oh2lpaWH79u1s\n3br1qmlQZD8DiQT/47934P/JGJ7fy+dzP2sip2qGjkUsBs88YwaFCwvNoPAf/qEKCs8RwSBo2nlG\nvyNJ3NfN0hYN3woNvVhj2K4xmDxBXXGdZfAn0jYbihtw2rN3z2chxMJMLd22bdvH51u2bGHLli2X\n9T5SSnp7HyKdHgIgGu0gEtEoKLhh2vsfeeQRbrzxRuUIFB+jS8kzbx4j/r1+1iccbNq1jqVbZthj\nYHDQDAr/4hdw/fXmJjKf/awKCl8lpivH0KalGDR6WNqikVevIUs1Rr+gEfwPR6ktrJ3I0S/9Y9aW\nraWxpBGX/RJKgGQoe/bsYc+ePXP2/gtqZCClQW/vf2Vk5N8Ag1isB6+3acaRwZtvvsn9999PW1sb\nhYWFV/z5iuznnQ+HefN7nbS8kab8h8v41LdWIOzTGPaeHjMo/JvfwFe/Ct/9Lqy+sv21FzOplBln\nn2r003wY6qN8rUZBYzuUaQTdGgOpPmoKlk0y+mZvf1XJKtyOxbMDYTaODIR1zCmGkaKr6z4SiX42\nbNiHEHYiEQ2fzz+tIxgbG+PBBx/k6aefVo5AwWAswa+2d7D6Z2O03FnIbUeapi8o9/bbZjxg3z74\nxjdUUPgSma4cQ1u7TvfgUYpXWbn65RqhTRpnN/RQlVfJ2o9X4/4B/tJHWb1kNR7nZW4JqpiROR0Z\nCCGeB7YAJcAA8NdSyl9Pc98VjQx0PYqmfRUhHDQ17cJu/+Q/lAceeACXy8VTTz112Z+ryH50Kdn5\n2lHSD5+k0OfkM79sonLzeZ0DXYdXXjH3EDhzxgwK33+/CgpfhOnKMbS1G7SfPI63VjNz9Ss1Ij6N\nM+kuynPLWFs+nr1j5uuvXrIan0v9jGfiao8Msr42USo1QlvbnXg8Daxa9fSsVhu/9tprfPvb3+bw\n4cPkqXrwi5Z3e4bY91AnK9/RqfhRLZv+rGZqNlk0OhEULi6eCAqrcuZTGB6eGsxta5cEPjyBUaJR\n6tdwVrUTy9UYlF0Ue4pZVzF1emfNkjVzUl5hoaOcwSQSidMEAl+gqOgW6ut/OqttLYeGhmhubub5\n55/n5psvb/czRfYyOhLn3f1naf+/A6z8dQR5bzG//7drcBZM6kQMDpqrhH/5S7jhBnNj+ZtuWvRB\n4fPLMbS1SwLHThLMMY1+zjKNeL7GIB0UuPMnjL41zdNU2kRBTsF8f40Fg3IGFrFYH4cP30Zl5YPU\n1Hx/1usD7rnnHioqKnjiiScuR6oiCzGk5EQ4xsF3Bkm3HmPJAMQ80PiGn8YbJy0cO3LEHAXs2gV3\n320WjluEQeFEYqIcg6aZRv9w32nOGBpLmjS8NRrJQo1zNg2v00NzhWnwx6d3mkqbKPJcxnaeiksi\nGwPIV51w+DCBwB3U1v6QpUv/06xf9+KLL3Lw4EEOHjw4h+oU84UhJcfHonQFRvioLUi4I4I4kqCw\nL03lKRAFUDJoZjM4UzAYS9EIsH+/GRR+6y345jfNXMby8nn+NnPP+eUYAm2Swz1nOR41A7m+Fe2k\nizWGP6Xh/rSTT1f4rWDuRvxlrfhL/ZR4Z0i5VWQdWTcyGB3dh6Z9hcbGn1NW9kez/oyBgQHWr1/P\n7t27uf766y9XqiID0KWkbyjMkcAop9uCRDui2I7EKerTKRuAYJWNZKObnDUeStflUd9cSPnafELx\nFL/d/C5lxyVnawVf3DZE4c+3w8CAGRS+774FGRSWEvr7J4y+psHBI4N0D2vk1mnk1WkYSzRGHBp2\nu2RtuZ915Z9cU18xvyzqaaJz516ju/sB1qx5juLiW2f9/lJKtm7dit/v50c/+tGVSFVcQ3Qp6Tkb\npufQMGfaQkQ7ojh6EhT36ZQMwehyO6mVLjxrvJSvzaOhpYjSNXkzl4oIhRi9+ffpGC2kaeh9Clcu\ng0cfha1bF0xQ+OzZqRk8B7uH6Rg0M3cKGjQo0xhzaRi2BP4yP80V/ikbqpT7ZlGCW5ERLFpncObM\nDvr6HmbdulfIz59d8blxnn32WbZv386BAwdwuxfPopRsIWUY9HwUovfQKANtQWKdUZxHkpQc0ykI\nwsgKO/pKN941XirW5dPQUkTJSh82xzRGX0oYGjLnP44eNbeRHD/v7DRHAWCWidi7Fz49+x3wMomx\nsakZPIc6x2gb0EgUaBSt1BDl7YQ8GmkRoWmJn/VLpwZzM7WmvmL2LEpncPLkk/T3/5Tm5t/h8625\npPc+efIkGzdu5PXXX6elpeVKpSqugISu03MiRN+hEc62h4h3RXEdSVJ61MATh9F6B/pKF7lNPirX\nFdC4oYiiOu+F+wcnk3DixFRDP9nwOxxQVzdx1Nebj2Vl8PWvm06hqclcOJbhqcWxmCn3455+Z5DA\nRx2Mukyjb6/UiHg1EmKU1SVNtCydOr2TbTX1FbNnUTkDKSXHj/+Qs2f/gfXrXycn59IKoEopuf32\n27npppt47LHHrpZcxScQ13W6+8Y4eniUwfYQyc4YOT1JSo8ZOKRp9OVKN7n+XJauy2flhiIKajwT\nRktKM3l9OkN/9CicPg1VVRca+/Gj6CKZLKGQ2aX2+zPKEaRSZoWLj3v6HREOnezgtGFum+hcqhHL\n1YjZztFQuJoNVX7WlU9M79QU1CyImvqK2bNonIGUOkeO/GdCofdpbv5nXK5PqB1/HqFQiMcff5w3\n3niDd999F6cze6sTZiqxVJqunjGOHRplSAuT7Izi6UlSfkyiuyDY4IRVbvKafFStL2BlSxF5lTmm\n0U+lzN79dMb+6FHTIdTXX2jo6+qgpgay9PdpGHD8+CSjr8U42N/Jh1EzmOuu1ojntxO1DVBXsMoy\n+hO9/YVeU18xexaFMzCMJJ2draRSg6xd+084HPmX9H6hUIjNmzfT1dXFqlWrOHDggFppfAVEk2k6\nO0Y4HhhjuD1EuituGv3jknieINTgQKzKocCfS3VzPis3FJNb6jZ3Cp/J2J86BZWVFxr78euioqxe\n5CWlOYD52Oi3x/ngw256g+24qjU8yzWSBRoR+ymW5zbSUuVnfeXE9E59Ub0y+oqLsuCdQTodRtO+\ngt3uY82a57HbL74xzWSklOzfv5/t27eze/duAJxOJ3v37uWGG6YvYa2YIBxP0dE+wolDo4xoEfSu\nGN6+FGUnJOFiQaTBiW21afSXry+g0Z+HNzww89y9rs9s7GtqwJX9ZYXBnNEaN/qH25O8f6yb7hEz\nXdNXq5Eu1ojYT1Dlq6NlqZ8NVRPTOw3FDYtyIxXFlbOgnUEqNUQg8EV8vrWsXPkUtln+k/T09LBj\nxw527tyJx+Ph7rvvZteuXfT29tLU1MS+ffvUyGASwXCSzsAwJwJBxrQweneM3N40S05JxsoFkUYn\n9tUeivy51NY7afSdI+fM8QuN/cmTZsXO6Yx9XR2UlGR17/58wuGJcgyH21Mc6Ouhc0gj6jOneIwS\njYjzGJWeWpor/WysnpjeWSg19RWZw4J1BrFYP4HAbZSU/AF1dT/+xAyIc+fO8cILL7Bz506OHz/O\nPffcQ2trKxs2bEAIQSgUQtM0/H7/onUEI2MJug6N0N82SlCLILvj5PWmKRqQjFTZiDY6ca7KoXiZ\nQW3hGI3pY7hO9E7t5SeTMwdqly+HBZiqO7kcQ6A9zXs9fWiDGsMOjdy6dmSpRsTVR5l7GevK/VxX\nY63MXYQ19RXzx4J1Bvv3L6O6+lvU1Dw8433xeJxXX32VHTt2sHfvXu644w5aW1u59dZbcSzi7QWH\nh+N0HhzmVCBIUAtDd5yCvjR5wzBUYyPe4MBVbVBSHGSFrZ+GoQDO45bRP3HCTLmcztjX18OSJQuq\nd//RUIjX3mvnzs1rKS/Mo69vvBSDzns9x2gbaOeMruGt1RDlGtGcHopdlfhL17Jp+UQwd1XJKlVT\nXzGvLFhn8Pbb1Wza1HHBRjSGYbBv3z527tzJyy+/zMaNG2ltbeWuu+5adD3+wYEoXQdH+CgwZtbd\n6Tbr7njCcG65ILHMwF0WZYn7DHVhjYZjb2M/2msmq89k7Jcvh5zZx2UylWTSnMa52HFqMMTfnLkJ\nvagDQtXY2+4jZ2kv9kqNmKebQmcZq0v8bK7102wFc9eUrsHr9M7311MoLiDrCtUJIW4HfgbYgF9J\nKf9uuvuSyYEpexV3dXWxY8cOnnvuOfLy8mhtbSUQCFBdXT3XkueN0f4h2n/bQfl1dZw+Y/BRIEik\nI4q9xzT6zgScq5EkKxLk5A9TWtxLQ+L/saLj37GHiiFeB446WF4HdRuh/o8mFltlSO9eStM3zWSw\ngyGD4XCUkXCE0UiUsWiEYCxKKB4hnIgSSUWIpCLE0lHieoSEESUpI0hnFKc3gt0TweaOYnNHwBlF\nOiNIexTdHiElQuglcbNSXf6H3HxXN1//9K34y75FU2kTua7c+f7xKBTzxlzvdGYDjgC3AB8BB4Cv\nSSm7zrtPvvfeeqqq/pGXXnqNHTt2cPLkSe69915aW1tZv379Za2i3LNnD1u2bLkK3+STSSV1QsEU\n4WCSSChFNJQmFkoTD6dJhNIkImlSIZ10JI0e0dEjBjJqIMM6IqIjxtJUthl0Jg7RbGvhRGOaVFkY\nj+MU5aOHaRx4l+WFBrb6aebva2vBc/WnLHTdrGE/2ViPBtMMh6IMBSMMhyMEDv87BUubCMaiBMcN\ndjJCJBUllo4Qm2SwkzJK2mYaa3tOBOGOIMYNtsM02IZI4JBeXMKLS/hw27x47D48Di9ep49cl49c\nt5e8HB/5Hi+FXh8FPi8FOT58Lh9epxef03qcdO1z+RgL6jT/5Hbi5zRylqyl7wf7WFqS+aPLa/l3\nfLVQmueebBsZbAZ6pJQfAgghXgC+DHSdf+Mjf1HAB4c3cuedd/L4449zyy23XFEcYLR/iGe3P0NL\n/ToKl5UgpSSRMggFk4SDKdNgh9PExpLER+MkxhIkg0lSoTSpcBo9rGNEdGRUImMSEZPY4mCLgT0h\ncMbBGRe44+COg82AeA4kPJKkW5J2GaRdBrpTx7CnkI4U2JIIkcBGDLsRxWlEcBhRXLYkQXsljtQm\nDnOYtbYWVm16n8/cVg11G6DuK2bWzkUcojlNIhkeSzE4FmEoaBrskXCUkUiEsWiEsajZww4looST\nEaLJKNF0hLgeIa5HScgIKaKkiKDbohh2y2C7omAZbGlLYzd8OAwvLnyk20MUldaR4/bh8XnxOnzk\nurxUuH3k5XjJ9/go9CylwOelONdHUa6XPPfMhtvj8FyW458NZT7o+8FbfOM7f85TP3giKxwBZJ+R\nAqU5G5lrZ1AF9E+6PonpIC6gbW8njzU/SVFvCaceS/HsD34HEvMwhHVuPopJ10ICBojx56RApKH0\ntAM9aXBgRYCYB3ISYNch4YaEW5JyGaRcOmlnGsOpYzjSSEcaHCmEM43NkcbpSONwpnE4dJxFKZxO\nA6dTx+3UcTkN3C4Dl8vA7QK7y4budJF0OEg5nCQdTpIOB0m7g4TdQcLhIG53Ere7SdiLCdnsxOw2\nUkBa1wmfHsI+kEQ/KTlTmeSlSoNg73EinR1EU1YP2zLYSWka7LQtim6LYNhNY40rAghsad/HBtuJ\nDyde3DYfOXazl+31+vAVeCl2m73sfM8S8j1einw+88jzsiTfNNy5rglj7XP6cNldU4z1tm3b2LZt\n29z89cwBS0vy2NhQnTWOQKG4VmRMCs4oI3SikVech8RACsN8HD+EPuXaEAagY2Ag0TGE+SiFQWW4\nls/3b0FgGq3f3biL90veIuKMEXMaxJySmN0g5tRJ2XWkzQChI4UONh2EddisA8Cwg+EwH6UdIc3H\n8XORskPSjsCOkA6zDfvHjzYmrsfPbTjMc2EnbozhvruDwteL+ZfbfotX/zzLbQ0sycsn111Bfo6P\nfK85LVJo9bJL8n2U5HspLTDbcl0+nPbsLNOgUCjml7mOGdwAbJNS3m5dPwrI84PIQoj5T2lSKBSK\nLCNrUkuFEHagGzOAfBp4D7hHStk5Zx+qUCgUiktmTqeJpJS6EOK/AK8zkVqqHIFCoVBkGBmx6Eyh\nUCgU80vW7oYhhKgWQvyrEEITQrQJIb5ttRcJIV4XQnQLIX4nhCiY9JrvCyF6hBCdQojb5km3TQjx\ngRDilSzRWyCEeNHSoAkhrs8Czd+3tAaEEM8JIVyZplkI8SshxIAQIjCp7ZI1CiE2Wt/ziBDiZ9dY\n708sPYeEEC8LIfInPTevemfSPOm57wohDCFEcTZoFkJ8y9LVJoT48ZxollJm5QFUAC3WeS5mbGI1\n8HfA96z2R4AfW+dNwEHMqbFaoBdrZHSNdf85sBN4xbrOdL3/C7jfOncABZmsGVgOHAVc1vUu4E8z\nTTNwE9ACBCa1XbJG4F1gk3X+f4AvXEO9nwds1vmPgb/NFL0zabbaq4F/AY4BxVbbmkzVDGzBnGp3\nWNdL5kJz1o4MpJRnpJSHrPMw0In5S/4y8Ix12zPAVuv8S8ALUsq0lPI40MMMax7mCiFENXAH8PSk\n5kzWmw98Vkr5awBLy1gmawaCQBLwCSEcgAc4RYZpllK+BYyc13xJGoUQFUCelPKAdd+zk14z53ql\nlG9KKQ3r8h3M/7+M0DuTZosngPMrYn6ZzNX8TcyOQdq659xcaM5aZzAZIUQtpjd9ByiXUg6A6TCA\nMuu28xfAnbLariXjf4STAzWZrHcFcE4I8WtrauvvhRBeMlizlHIE+Clwwvr8MSnlm2Sw5kmUXaLG\nKsyFnOOcZP60P4DZA4UM1iuE+BLQL6VsO++pjNUMrAR+TwjxjhDi34QQ11ntV1Vz1jsDIUQu8BLw\nHWuEcH5EPCMi5EKILwID1mjmYrnBGaHXwgFsBH4updwIRIBHydCfMYAQog5zKm45sBRzhPAnZLDm\ni5ANGhFC/BWQklL+Zr61XAwhhAf4S+Cv51vLJeIAiqSUNwDfA16ciw/JamdgTQO8BOyQUu62mgeE\nEOXW8xXAWav9FLBs0surrbZrxY3Al4QQR4HfAJ8TQuwAzmSoXjB7FP1Syvet65cxnUOm/owBPgXs\nl1IOSyl14H8DnyGzNY9zqRrnXbsQ4j7Mqc97JzVnqt56zLn1w0KIY9bnfyCEKLN01Eyjbb41g9n7\n/0cAa+pHF0KUcJU1Z7UzAP4n0CGlfHJS2yvAfdb5nwK7J7V/zcosWQE0YC6CuyZIKf9SSlkjpawD\nvgb8q5SyFXg1E/VamgeAfiHESqvpFkAjQ3/GFt3ADUKIHCGEwNTcQWZqFkwdJV6SRmsqaUwIsdn6\nrv9x0mvmXK8wy9M/DHxJSpk473tkgt4pmqWU7VLKCillnZRyBWZnZ4OU8qyl+Y8zTbPFPwGfA7D+\nF11SyqGrrnmuouJzfWD2tHXgEGZE/QPgdqAYeBPTKLwOFE56zfcxI+6dwG3zqP1mJrKJMlovsB6z\n9PghzN5JQRZofhjTaQUwA7HOTNMMPI9Z1j2BGd+4Hyi6VI3AdUAbZvDwyWustwf40Prf+wD4Rabo\nnUnzec8fxcomymTNmNNEOywN7wM3z4VmtehMoVAoFFk/TaRQKBSKq4ByBgqFQqFQzkChUCgUyhko\nFAqFAuUMFAqFQoFyBgqFQqFAOQOF4gKs0sb/bdL1d4UQP5xPTQrFXKOcgUJxIQngrsm17hWKhY5y\nBgrFhaSBvwcemm8hCsW1QjkDheJCJPBz4E+EEHnzLUahuBYoZ6BQTIM0y6E/A3xnvrUoFNcC5QwU\nipl5EngQ8M63EIVirlHOQKG4kPGSxyPAPwB/Nr9yFIq5RzkDheJCJpfy/SlQQpbsOqZQXC6qhLVC\noVAo1MhAoVAoFMoZKBQKhQLlDBQKhUKBcgYKhUKhQDkDhUKhUKCcgUKhUChQzkChUCgUKGegUCgU\nCuD/A5dxcewBXQfEAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc8fde4c210>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"pv.plot( kind = \"line\", style = '.-')\n",
"plt.ylabel( 'Elasped time (sec)')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment