Skip to content

Instantly share code, notes, and snippets.

@ricardoV94
Created September 11, 2023 09:16
Show Gist options
  • Save ricardoV94/eafd20ac47d63525253b0a8adf5e5d76 to your computer and use it in GitHub Desktop.
Save ricardoV94/eafd20ac47d63525253b0a8adf5e5d76 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import arviz as az\n",
"import blackjax\n",
"import jax\n",
"import jax.numpy as jnp\n",
"import numpy as np\n",
"import pymc as pm\n",
"\n",
"from pymc.blocking import DictToArrayBijection, RaveledVars\n",
"from pymc.sampling_jax import get_jaxified_graph\n",
"from pymc_experimental.inference.pathfinder import convert_flat_trace_to_idata\n",
"\n",
"rng = np.random.default_rng(123)\n",
"\n",
"# Model\n",
"J = 8\n",
"y = np.array([28.0, 8.0, -3.0, 7.0, -1.0, 1.0, 18.0, 12.0])\n",
"sigma = np.array([15.0, 10.0, 16.0, 11.0, 9.0, 11.0, 10.0, 18.0])\n",
"\n",
"with pm.Model() as model: \n",
" mu = pm.Normal(\"mu\", mu=0.0, sigma=10.0) # better when initval=6.0 is provided\n",
" tau = pm.HalfNormal(\"tau\", sigma=10.0) \n",
" \n",
" theta_raw = pm.Normal(\"theta_raw\", mu=0, sigma=1, shape=J)\n",
" theta = pm.Deterministic(\"theta\", mu + tau * theta_raw)\n",
" \n",
" obs = pm.Normal(\"obs\", mu=theta, sigma=sigma, shape=J, observed=y)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"<style>\n",
" /* Turns off some styling */\n",
" progress {\n",
" /* gets rid of default border in Firefox and Opera. */\n",
" border: none;\n",
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
" background-size: auto;\n",
" }\n",
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
" }\n",
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
" background: #F44336;\n",
" }\n",
"</style>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <progress value='21' class='' max='21' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
" 100.00% [21/21 00:00&lt;00:00 logp = -42.563, ||grad|| = 5.0418e-05]\n",
" </div>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Auto-assigning NUTS sampler...\n",
"Initializing NUTS using jitter+adapt_diag...\n",
"Multiprocess sampling (4 chains in 4 jobs)\n",
"NUTS: [mu, tau, theta_raw]\n"
]
},
{
"data": {
"text/html": [
"\n",
"<style>\n",
" /* Turns off some styling */\n",
" progress {\n",
" /* gets rid of default border in Firefox and Opera. */\n",
" border: none;\n",
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
" background-size: auto;\n",
" }\n",
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
" }\n",
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
" background: #F44336;\n",
" }\n",
"</style>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <progress value='8000' class='' max='8000' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
" 100.00% [8000/8000 00:05&lt;00:00 Sampling 4 chains, 0 divergences]\n",
" </div>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Sampling 4 chains for 1_000 tune and 1_000 draw iterations (4_000 + 4_000 draws total) took 6 seconds.\n"
]
}
],
"source": [
"# PyMC fitting and sampling\n",
"with model:\n",
" map_ref = pm.find_MAP(return_raw=True, seed=rng.integers(2**32))\n",
" idata_ref = pm.sample(target_accept=0.9, random_seed=rng)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"({'mu': array(6.17044505),\n",
" 'tau_log__': array(2.36321485),\n",
" 'theta_raw': array([ 0.6864453 , 0.09130718, -0.26413793, 0.03767689, -0.39294466,\n",
" -0.23488093, 0.59039012, 0.14175863]),\n",
" 'tau': array(10.62505452),\n",
" 'theta': array([13.46396377, 7.1405888 , 3.36396517, 6.57076402, 1.99538665,\n",
" 3.67482238, 12.44337228, 7.67663826])},\n",
" message: CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH\n",
" success: True\n",
" status: 0\n",
" fun: 42.56270339765779\n",
" x: [ 6.170e+00 2.363e+00 6.864e-01 9.131e-02 -2.641e-01\n",
" 3.768e-02 -3.929e-01 -2.349e-01 5.904e-01 1.418e-01]\n",
" nit: 17\n",
" jac: [-6.367e-06 -2.522e-05 1.784e-05 -5.730e-06 -7.159e-06\n",
" -1.448e-05 -2.927e-05 -3.790e-06 -4.603e-06 -1.900e-05]\n",
" nfev: 21\n",
" njev: 21\n",
" hess_inv: <10x10 LbfgsInvHessProduct with dtype=float64>)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_ref"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>mean</th>\n",
" <th>sd</th>\n",
" <th>hdi_3%</th>\n",
" <th>hdi_97%</th>\n",
" <th>mcse_mean</th>\n",
" <th>mcse_sd</th>\n",
" <th>ess_bulk</th>\n",
" <th>ess_tail</th>\n",
" <th>r_hat</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>mu</th>\n",
" <td>6.361</td>\n",
" <td>4.276</td>\n",
" <td>-1.455</td>\n",
" <td>14.508</td>\n",
" <td>0.074</td>\n",
" <td>0.052</td>\n",
" <td>3421.0</td>\n",
" <td>2415.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[0]</th>\n",
" <td>0.383</td>\n",
" <td>0.967</td>\n",
" <td>-1.433</td>\n",
" <td>2.216</td>\n",
" <td>0.015</td>\n",
" <td>0.014</td>\n",
" <td>4057.0</td>\n",
" <td>2774.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[1]</th>\n",
" <td>0.072</td>\n",
" <td>0.916</td>\n",
" <td>-1.680</td>\n",
" <td>1.724</td>\n",
" <td>0.013</td>\n",
" <td>0.014</td>\n",
" <td>4979.0</td>\n",
" <td>3081.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[2]</th>\n",
" <td>-0.124</td>\n",
" <td>0.939</td>\n",
" <td>-1.935</td>\n",
" <td>1.623</td>\n",
" <td>0.014</td>\n",
" <td>0.015</td>\n",
" <td>4449.0</td>\n",
" <td>2709.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[3]</th>\n",
" <td>0.033</td>\n",
" <td>0.917</td>\n",
" <td>-1.670</td>\n",
" <td>1.700</td>\n",
" <td>0.015</td>\n",
" <td>0.016</td>\n",
" <td>3922.0</td>\n",
" <td>2618.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[4]</th>\n",
" <td>-0.262</td>\n",
" <td>0.902</td>\n",
" <td>-1.938</td>\n",
" <td>1.451</td>\n",
" <td>0.014</td>\n",
" <td>0.014</td>\n",
" <td>4311.0</td>\n",
" <td>2964.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[5]</th>\n",
" <td>-0.150</td>\n",
" <td>0.910</td>\n",
" <td>-1.937</td>\n",
" <td>1.478</td>\n",
" <td>0.014</td>\n",
" <td>0.016</td>\n",
" <td>4353.0</td>\n",
" <td>2727.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[6]</th>\n",
" <td>0.362</td>\n",
" <td>0.933</td>\n",
" <td>-1.524</td>\n",
" <td>2.050</td>\n",
" <td>0.015</td>\n",
" <td>0.014</td>\n",
" <td>3744.0</td>\n",
" <td>2711.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[7]</th>\n",
" <td>0.069</td>\n",
" <td>0.961</td>\n",
" <td>-1.664</td>\n",
" <td>1.859</td>\n",
" <td>0.016</td>\n",
" <td>0.015</td>\n",
" <td>3772.0</td>\n",
" <td>3059.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tau</th>\n",
" <td>4.849</td>\n",
" <td>3.687</td>\n",
" <td>0.007</td>\n",
" <td>11.287</td>\n",
" <td>0.072</td>\n",
" <td>0.051</td>\n",
" <td>2110.0</td>\n",
" <td>1704.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_bulk \\\n",
"mu 6.361 4.276 -1.455 14.508 0.074 0.052 3421.0 \n",
"theta_raw[0] 0.383 0.967 -1.433 2.216 0.015 0.014 4057.0 \n",
"theta_raw[1] 0.072 0.916 -1.680 1.724 0.013 0.014 4979.0 \n",
"theta_raw[2] -0.124 0.939 -1.935 1.623 0.014 0.015 4449.0 \n",
"theta_raw[3] 0.033 0.917 -1.670 1.700 0.015 0.016 3922.0 \n",
"theta_raw[4] -0.262 0.902 -1.938 1.451 0.014 0.014 4311.0 \n",
"theta_raw[5] -0.150 0.910 -1.937 1.478 0.014 0.016 4353.0 \n",
"theta_raw[6] 0.362 0.933 -1.524 2.050 0.015 0.014 3744.0 \n",
"theta_raw[7] 0.069 0.961 -1.664 1.859 0.016 0.015 3772.0 \n",
"tau 4.849 3.687 0.007 11.287 0.072 0.051 2110.0 \n",
"\n",
" ess_tail r_hat \n",
"mu 2415.0 1.0 \n",
"theta_raw[0] 2774.0 1.0 \n",
"theta_raw[1] 3081.0 1.0 \n",
"theta_raw[2] 2709.0 1.0 \n",
"theta_raw[3] 2618.0 1.0 \n",
"theta_raw[4] 2964.0 1.0 \n",
"theta_raw[5] 2727.0 1.0 \n",
"theta_raw[6] 2711.0 1.0 \n",
"theta_raw[7] 3059.0 1.0 \n",
"tau 1704.0 1.0 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"az.summary(idata_ref, var_names=\"~theta\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"ELBO: [-96.30367881 -42.1617112 -35.39319509 -37.34728575 -37.22720685\n",
" -37.08487869 -37.31876792 -37.20594968 -39.39442528 -46.97901882\n",
" -44.28365355 -37.15917913 -37.74024406 -37.38734558 -35.94629954\n",
" -36.86317674 -36.33905531 -inf -inf -inf\n",
" -inf -inf -inf -inf -inf\n",
" -inf -inf -inf -inf -inf\n",
" -inf]\n",
"best position: {'mu': Array(0.39749273, dtype=float64), 'tau_log__': Array(2.54349883, dtype=float64), 'theta_raw': Array([ 0.85217592, 0.41273916, -0.08770297, 0.32551536, -0.07371391,\n",
" 0.03721374, 0.94505335, 0.26553907], dtype=float64)}\n"
]
}
],
"source": [
"# blackjax pathfinder\n",
"rvs = [rv.name for rv in model.value_vars]\n",
"ip = model.initial_point()\n",
"\n",
"new_logprob, new_input = pm.pytensorf.join_nonshared_inputs(\n",
" ip, (model.logp(),), model.value_vars, ()\n",
")\n",
"\n",
"logprob_fn_list = get_jaxified_graph([new_input], new_logprob)\n",
"\n",
"def logprob_fn(x):\n",
" return logprob_fn_list(x)[0]\n",
"\n",
"ip_map = DictToArrayBijection.map({rv: ip[rv] for rv in rvs})\n",
"\n",
"result = blackjax.vi.pathfinder.init(\n",
" jax.random.PRNGKey(10),\n",
" logprob_fn,\n",
" initial_position = ip_map.data,\n",
" return_path = True,\n",
")\n",
"\n",
"print(\"ELBO: \", result.elbo)\n",
"best_position = result.position[np.argmax(result.elbo)]\n",
"raveled_best_position = RaveledVars(best_position, ip_map.point_map_info)\n",
"print(\"best position:\", DictToArrayBijection.rmap(raveled_best_position, ip))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.39749273 2.54349883 0.85217592 0.41273916 -0.08770297 0.32551536\n",
" -0.07371391 0.03721374 0.94505335 0.26553907]\n"
]
}
],
"source": [
"# Get some samples\n",
"result = blackjax.vi.pathfinder.init(\n",
" jax.random.PRNGKey(10),\n",
" logprob_fn,\n",
" initial_position = ip_map.data,\n",
" return_path = False,\n",
")\n",
"print(result.position)\n",
"samples, _ = blackjax.vi.pathfinder.sample_from_state(jax.random.PRNGKey(2), result, num_samples=500)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Transforming variables...\n"
]
}
],
"source": [
"idata_path = convert_flat_trace_to_idata(\n",
" samples,\n",
" model=model\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"arviz - WARNING - Shape validation failed: input_shape: (1, 500), minimum_shape: (chains=2, draws=4)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>mean</th>\n",
" <th>sd</th>\n",
" <th>hdi_3%</th>\n",
" <th>hdi_97%</th>\n",
" <th>mcse_mean</th>\n",
" <th>mcse_sd</th>\n",
" <th>ess_bulk</th>\n",
" <th>ess_tail</th>\n",
" <th>r_hat</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>mu</th>\n",
" <td>0.271</td>\n",
" <td>0.743</td>\n",
" <td>-1.040</td>\n",
" <td>1.700</td>\n",
" <td>0.031</td>\n",
" <td>0.022</td>\n",
" <td>568.0</td>\n",
" <td>471.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[0]</th>\n",
" <td>0.845</td>\n",
" <td>0.801</td>\n",
" <td>-0.716</td>\n",
" <td>2.239</td>\n",
" <td>0.037</td>\n",
" <td>0.026</td>\n",
" <td>460.0</td>\n",
" <td>427.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[1]</th>\n",
" <td>0.622</td>\n",
" <td>0.721</td>\n",
" <td>-0.717</td>\n",
" <td>1.941</td>\n",
" <td>0.031</td>\n",
" <td>0.022</td>\n",
" <td>528.0</td>\n",
" <td>474.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[2]</th>\n",
" <td>-0.071</td>\n",
" <td>0.716</td>\n",
" <td>-1.451</td>\n",
" <td>1.131</td>\n",
" <td>0.031</td>\n",
" <td>0.024</td>\n",
" <td>522.0</td>\n",
" <td>502.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[3]</th>\n",
" <td>0.422</td>\n",
" <td>0.750</td>\n",
" <td>-0.874</td>\n",
" <td>1.782</td>\n",
" <td>0.040</td>\n",
" <td>0.028</td>\n",
" <td>356.0</td>\n",
" <td>421.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[4]</th>\n",
" <td>-0.099</td>\n",
" <td>0.716</td>\n",
" <td>-1.396</td>\n",
" <td>1.221</td>\n",
" <td>0.033</td>\n",
" <td>0.025</td>\n",
" <td>483.0</td>\n",
" <td>472.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[5]</th>\n",
" <td>0.075</td>\n",
" <td>0.696</td>\n",
" <td>-1.416</td>\n",
" <td>1.205</td>\n",
" <td>0.031</td>\n",
" <td>0.023</td>\n",
" <td>505.0</td>\n",
" <td>494.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[6]</th>\n",
" <td>1.318</td>\n",
" <td>0.737</td>\n",
" <td>0.078</td>\n",
" <td>2.623</td>\n",
" <td>0.031</td>\n",
" <td>0.022</td>\n",
" <td>563.0</td>\n",
" <td>498.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>theta_raw[7]</th>\n",
" <td>0.260</td>\n",
" <td>0.751</td>\n",
" <td>-1.134</td>\n",
" <td>1.624</td>\n",
" <td>0.040</td>\n",
" <td>0.028</td>\n",
" <td>355.0</td>\n",
" <td>408.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tau</th>\n",
" <td>7.911</td>\n",
" <td>11.707</td>\n",
" <td>0.432</td>\n",
" <td>19.173</td>\n",
" <td>0.508</td>\n",
" <td>0.368</td>\n",
" <td>506.0</td>\n",
" <td>513.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_bulk \\\n",
"mu 0.271 0.743 -1.040 1.700 0.031 0.022 568.0 \n",
"theta_raw[0] 0.845 0.801 -0.716 2.239 0.037 0.026 460.0 \n",
"theta_raw[1] 0.622 0.721 -0.717 1.941 0.031 0.022 528.0 \n",
"theta_raw[2] -0.071 0.716 -1.451 1.131 0.031 0.024 522.0 \n",
"theta_raw[3] 0.422 0.750 -0.874 1.782 0.040 0.028 356.0 \n",
"theta_raw[4] -0.099 0.716 -1.396 1.221 0.033 0.025 483.0 \n",
"theta_raw[5] 0.075 0.696 -1.416 1.205 0.031 0.023 505.0 \n",
"theta_raw[6] 1.318 0.737 0.078 2.623 0.031 0.022 563.0 \n",
"theta_raw[7] 0.260 0.751 -1.134 1.624 0.040 0.028 355.0 \n",
"tau 7.911 11.707 0.432 19.173 0.508 0.368 506.0 \n",
"\n",
" ess_tail r_hat \n",
"mu 471.0 NaN \n",
"theta_raw[0] 427.0 NaN \n",
"theta_raw[1] 474.0 NaN \n",
"theta_raw[2] 502.0 NaN \n",
"theta_raw[3] 421.0 NaN \n",
"theta_raw[4] 472.0 NaN \n",
"theta_raw[5] 494.0 NaN \n",
"theta_raw[6] 498.0 NaN \n",
"theta_raw[7] 408.0 NaN \n",
"tau 513.0 NaN "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"az.summary(idata_path, var_names=\"~theta\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAnMAAAOaCAYAAADzjNTwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABei0lEQVR4nO3deXgV5f3//9ckOVmAEBLWsGQTqEqgYVdRCCqgIgJ1ATckQN1KFa1US5UE96rUpW6fVkr4uRRXRERFowQFyqIgYmWVhICoCCQQ1pzkzO8PvjkQs5Kck8l98nxcVy6Ze+bc8z6EY16577lnLNu2bQEAAMBIQU4XAAAAgNojzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwB6BR++mnn3THHXeoS5cuCg8PV6tWrXTRRRdp0aJFp9TPSy+9JMuyZFmWJk2aVOt6NmzYoGuvvVaxsbEKDw/XaaedprvuuksFBQUVHl9SUqLp06erU6dOCgsLU48ePfTOO+9U2v+6desUEhKiqVOn1qq+7Oxs7/usSm5urve43NzcMvvGjx/v3Vf61aRJE8XGxuqss87S5MmT9emnn6qqp01mZGTIsiylpqbW6n0AgYQwB6DRWr9+vVJSUvTUU09px44dSk5OVnR0tBYtWqSLLrpIjz76aI36+eWXX3T33XfXuZ7Fixerd+/eeu2111RSUqJu3brpp59+0syZM9W7d2/9/PPP5V4zbdo0PfDAA9q/f79+85vfaMOGDbriiiv03nvvVXiOyZMnq02bNpo+fXqd662rNm3aaMCAARowYIB69OihqKgorVmzRs8995wuvPBC9ezZU+vXr3e6TKDBI8wBaJSKi4t1xRVX6Oeff1Zqaqp27NihL7/8Ulu2bNGnn36qyMhITZs2TZ9//nm1fd1xxx0qKCjQ8OHDa11PYWGhxowZoyNHjui2227TDz/8oK+++kp5eXkaMGCAtm3bpokTJ5Z5zZ49e/TMM88oPj5eW7Zs0TfffKNPP/1UlmVVGNZefvllLV26VI899pgiIyNrXauvXHzxxVq6dKmWLl2qFStWaOPGjdq/f7/efvttde/eXevWrdNZZ52ltWvXOl0q0KAR5gA0SgsXLtTmzZsVFhamzMxMtW7d2rvv/PPP11//+lfZtq0ZM2ZU2U9WVpZeffVV3XTTTerTp0+t63nxxRf1yy+/6IwzztDf//53uVwuSVLLli312muvKSQkRAsXLtSaNWu8r1m/fr2OHj2qtLQ0tW3bVpI0cOBAnXvuuVq3bp0KCwu9xxYWFuruu+/Wueeeq+uuu67WdfpbRESEfve732nlypW64IILdPjwYV111VUqKSlxujSgwSLMAWiUli1bJknq27ev4uPjy+2//PLLJR2/Rmz37t0V9nH06FHdcsstatOmjR5++OE61VN6ndv48eMVHBxcZl9cXJwuvPBCSdJbb73lbS+tqzTIlYqNjZUkHThwwNuWkZGh3bt36x//+Eed6qwvEREReuWVVxQWFqatW7fqzTffdLokoMEizAFolPLz8yVJHTp0qHB/abvH49Hq1asrPObBBx/U1q1b9fjjj6tFixa1rqW4uFhfffWVJGnAgAEVHlPavnLlSm9bXFycJGnz5s1ljt20aZNCQkLUsmVLSccXVfzjH//QTTfdpJSUlFrXWd/atWunUaNGSTo+kgqgYoQ5AI1SVFSUJOmHH36ocP/J7Zs2bSq3f8OGDXr88cd13nnnady4cXWqJTc3V263W5KUlJRU4TGl7Vu2bPG2/fa3v1WbNm00a9YsZWVlqbCwUE8//bS+/vprDRw4UOHh4ZKkP/7xj4qKitKDDz5YpzqdcO6550pSpYEagBTidAEA4IS+fftKkr788kvt2LFDnTp1KrP/5Nt7lI7ilbJtWzfddJM8Ho+ef/75Otdycv/R0dEVHlPafvKxTZo00SOPPKKJEydqyJAh3vZmzZpp5syZkqQ333xTn376qf75z396+3C73dqzZ49atmyp0NDQWtdd3e1JfKH0+1LZVDcAwhyARmrkyJFq3769du3apWuuuUZvvPGG91qzhQsX6qGHHvIee+TIkTKvnTVrlr744gvdddddSk5OrnMtR48e9f65snAVFhZWYS0TJkxQ+/btNXv2bP3yyy/q2rWr7rjjDv3mN7/R4cOHddddd6lPnz6aOHGibNvWvffeq6efflqHDh1S06ZNddttt+mhhx6qVTCrbEpYko4dO6Yvv/zylPv8taZNm0pSmcUcAMoizAFolMLDw/X666/rkksu0dKlSxUXF6ff/OY3ys/P165duxQXF6eUlBR9/vnnatasmfd1pfeU69ixo9LT031WS6mioqIy26WOHTsm6fjCgF+76KKLdNFFF5Vrf+ihh7Rjxw698cYbCgoK0oMPPqiHH35Yl156qa644gq98847euSRR9S0aVP99a9/PeW6ly5dWum+3NxcJSYmnnKfv3bw4EFJUvPmzevcFxCouGYOQKN17rnnas2aNZowYYLatWvnXUhw880368svv/TeDqNdu3be1/z5z3/Wvn379OSTT5YJeXVx8tTqr6d0f91e2TTsr33//feaOXOmxo8fr/79+8vtdmvmzJnq3Lmz5s+frxtuuEHz5s1T586dNXPmTBUXF9f9jfhBXl6epOM3GAZQMUbmADRqnTt31qxZs8q1FxcXa926dZKk3r17e9tLb2A7efJkTZ48ucxrSkeRXnvtNb3//vuSjj8urDoJCQlyuVxyu93atm2bd7r3ZNu2bZMkdenSpSZvS7fffrvCw8O9T7HYuHGjCgoKdM011ygo6Pjv8UFBQRo6dKief/55bdq0Sd26datR3/WpdPSvX79+DlcCNFyEOQCowKJFi3Tw4EG1b99evXr1Kre/okdrlTpy5Ei5a9uqEhISol69emnlypVatmxZhdeild4Xr3///tX29/7772vhwoV6+umnvSNapUHz109+KN2u7NmvTvrxxx+9jyWry9M1gEDHNCsA/EpRUZH3cVi33HJLmZv4fv3117Jtu8Kv0mvoShcbVPWg+F/73e9+J0nKzMws97SDvLw8ZWVlSTpxM+PKHDt2TFOmTFFycrJuvfVWb3vpqtDvv/++zPGl261atapxrfXhyJEjuv7663Xs2DF17dq12vcNNGaEOQCN1gcffFDmJryStGPHDo0aNUpr1qzRmWeeqalTp/rsfG+99ZYSEhK890472c0336xWrVppw4YNuvPOO733ndu7d6+uueYaFRcX6+KLLy4z5VuRxx57TN9//72effZZhYScmHzp0KGDOnXqpAULFuibb76RdPxxYAsWLFC7du1qPH3rb0eOHNG8efPUv39/ffrpp2ratKneeOONck/FAHAC06wAGq2PP/5YTz/9tKKjo5WQkKCjR49q48aNsm1bZ555pj7++GPvLUF84eDBg9q+fXuF+5o3b665c+fq0ksv1TPPPKP//Oc/iouL04YNG3T48GElJCTo3//+d5X95+Xl6dFHH9XYsWM1aNCgMvssy1JGRoYmTpyovn376je/+Y02b96s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rcr+/fslqdJVqaUjiaXHAQCAwODzBRC9epW/433Hjh0lSQUFBd62FStWqGnTppo1a1aF/URERGjjxo01Pm9RUZGeffZZzZ07Vxs3btTBgwdln3QLvV27dtW4r19LTExUq1atKtxXWFioJ554Qu+++66+//57HTp0qMz+k8/bokULpaSkeIOabdtaunSpJk2a5L0ecfHixUpLS/OGwJPvKwcAAPBrPg9zFY0MhYQcP83Jixr27dun4uJizZgxo9K+fh2MqnLFFVdowYIF6tq1q8aMGaM2bdrI5XKpoKBATz/9tI4dq9mjmSrStm3bCtuLioqUmpqqNWvWqGfPnrr++uvVsmVLhYSEeK8v/PV5Bw8erDVr1uirr75SSUmJDh48qMGDB+v0009XbGxsmTAXFRXlvbauOqV/75WNvJVel8f95AAACCyO3ZqkefPmsixLe/bsqf7gaqxevVoLFizQsGHDtHDhwjLToStWrNDTTz9dp/5PXjV7svnz52vNmjWaNGmSdyVpqblz52rOnDnlXjN48GDNnDlTixcvlsfjUVBQkAYOHCjp+CKTxYsXq6CgQF9//bWGDx9e4dRuRZo2barY2Fjl5OSopKSk3OtKbxp88hMfAACA+U7pmrnSgHDyCFtt9e/fX3v37q3wyQSneu7vv/9ekioMP1988UUdK61c6Xkvu+yycvsqO+95552n4OBgffbZZ1q8eLF69erlXQ18/vnna+fOnZo1a5Y8Hk+Nr5crNWjQIB06dEjLli0rt2/RokXeYwAAQOA4pTAXExMjSdq5c2edT3zbbbdJkiZMmKC9e/eW2//TTz9pw4YNNTp3fHy8JGnp0qVl2v/3v//pkUceqXOtlansvEuWLCk3UleqefPm6tWrl5YtW6Zly5aVuSau9M9/+9vfymzX1I033ihJuvfee1VUVORt//TTT7Vo0SINHDiQ25IAABBgTmma9fTTT1f79u01d+5cNWnSRB07dpRlWbrllltO+cQXXXSR7rvvPj3wwAPq3LmzLrroIsXHx2vv3r3aunWrvvjiCz344IM644wzJElnn322IiIi9NRTT+nAgQNq3bq1JOmee+5Rv3791K9fP73xxhv68ccfddZZZykvL0/vvfeehg8frrfeeuuU66uJESNGKCEhQY899pi+/fZbJScna9OmTXr//fc1atSoSu9tN3jwYK1evdr751KnnXaaOnXqpB07dig6Olq//e1vT6mewYMHa9KkSXrppZfUs2dPDR8+3Ps4r+bNm+uFF16o/ZsFAAAN06ney2TFihX2oEGD7MjISO892HJycrz3mcvJySn3mvT0dFuSvXjx4nL7PvnkE3vEiBF269atbZfLZbdr184+++yz7QceeMDOy8src+zChQvtvn372hEREd5zl9q9e7c9YcIEu3379nZ4eLjdvXt3+7nnnrO3bdtmS7JvuOGGU32rtm0fv8/coEGDKt2/bds2+/LLL7dbt25tN2nSxO7bt689d+7cKu8J9+GHH9qS7JCQELuwsLDMvnHjxtmS7JEjR5Z7XVV9liopKbGfeeYZu1u3bnZYWJjdsmVL+4orrrA3bdpU5fvkPnMAAJjJsu2T7t+BBi07O1uDBw9Wenq6MjIyfNp3QkKCJJV7NBt8bPdGad82KSZJanO609UAAAIAYc4gpWGuVP/+/bVixYpa97d169Yyq1vj4+MJc7V1qJpV2Yf3Se9PkbaftDglfoB06VNSk5jKX9e04vsbAgBQyrFbk+DUJSQkKD093btdejPm2oqJiSnT38nP2A14RTW/h2GNPH5a1futICmsuXRlphR3jpS3XFowRXq+v2R7Kn/dtNrf7NortGnd+wAANFiNbmQuMzOzRqNPo0aNUkpKit/rgUMyHLh58pWZUrfRJ7a/fUd6K83/583gEW4AEMga3chcZmamlixZUu1xCQkJhDn4Vtw5ZbfjBzhTBwAgoDS6MJedne10CWgIfDF9ebKH21d/TN7ysiNz28vf3LkcX9cJAAg4jW6aFfCL6hZAvDFO+mWTdMnjx0fkti+TPpgqtT5duqr8Y9+8WAABAKgGYQ6oD4f2Sm9PlLYtPtGWNFi6fJbUtKVzdQEAjEeYA+oT95kDAPgYYQ4AAMBgQU4XAAAAgNojzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgsBCnC4DZSkpK5PF4nC4DAADjuFwun/RDmEOd7NixQ0VFRU6XAQCAcbp27eqTfghzqJOioiIFBwcrJIR/SgAA1FRxcbHP+uInMOosJCTEZ0PFAADg1LAAAgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMFuJ0AYBpcvYe0c79ReoYFarElhFOlwMAaOQIc2j08g+7a3Tc/qPFenzxTq394aC3rWeHZpo6uKOiwqv+KEU3cdWpRgAAKkOYgzGOuEv80u/wl76t0XFBlhQZ7tJz1/RS38Rorc7J17R563Xdqxvlsat+7ae39PBBpWVFuIJ93icAwDyEORjjghe+cfT8Hlt6eHR3De8RK0ka3iNWtmxNfm1tta/1R+3Lb+vp8z4BAOZhAQRwCvomRpfZ7pcY41AlAAAcx8gcjOGPqUrp1EbNVufke0fmJGlVzr4avc5ftQMAQJiDMfx1jdjCSck1Ou7eD3N13/z1smWrX2KMVuXs0/T536pnh2Z68OKEKl/L9W0AAH+xbNuu5tJtoHKbN29WWFiYXK7AX61ZcKRYGYtytSqv0NvWLy5SGcMS1CKC34sAADXndrsVHx/vk774CQTUUIuIED01qjP3mQMANCgsgDBQZmamLMvyfo0dO7bWfWVlZZXpKzU11XeFBqjElhE6LymKIAcAaBAYmTPYyJEjlZKSouTkE9d8ff/993r55Ze1Zs0affXVV9q1a5fi4+OVm5tbYR9JSUlKT0+XJM2YMaM+ygYAAD5EmDPYqFGjNH78+DJtX3zxhWbMmKHg4GCdccYZ+umnn6rsIykpSRkZGZIIcwAAmIhp1gAzcOBA/fe//1VhYaHWr1/fKBYmAADQmDEyF2CSkpKUlJTkdBkAAKCeMDIHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMmwYHmD179uiuu+7ybrvdbu3Zs6fMY78yMzPrvzAAAOAXhLkAc/DgQc2ZM6dM26FDh8q0EebqT0j+VgXvz1NJVJyKozs7XQ4AIAAR5gJMQkKCbNt2uoxGIejIvkr3WUcL1GJphsJ+XO1tOxbbVwXnZsgOb1HueE9EjD9KBAA0AoQ5g6WlpSktLU1jxozR3Llza9VHVlaWhgwZ4uPKGj7LfbjOfbR7eUAVJwiSwppLV2ZKcedIecsVtmCK2r41QrI95Q7/Me2rOtdju5rUuQ8AgHkIcwZKSUlRenq6dzs5ObnWfSUlJZXpKyEhoS6lGSN2dm//nsD2SCOekrqNPr7dbbRk29JbaX6rZ9eNG+rcBwDAPIQ5A6WkpCglJcUnfSUlJSkjI8MnfeFX4s4pux1fxUgeAAC1RJhDo+SLac1qR9Pylp8YmZOk7cv8Wg8AoHEizKFR8sX1ZT9dX3k4i86aotCFf5Jl28dH5LYvk/3BXSqK7af8C5/0Sz0AgMbJsln6iDrYvHmzwsLC5HK5nC6lQQk6mq/oz+5S2M7l3rZjHc9R/vlPyBMe7WBlAICGwO12Kz4+3id9MTIH+IEnPFp7L5nFfeYAAH5HmAP8qDi6MyEOAOBXPJsVAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAwW4nQBMF9xcbHTJQAAYBRf/uwkzKFOQkNDVVRUpJKSEqdLAQCgUbJs27adLgLmKikpkcfjcboMAACM43K5fNIPYQ4AAMBgLIAAAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIOFOF0A0NBt+blQuXsPK6FlE3VpG+l0OQAAlEGYQ6Oz9+CxGh2Xf7hIf533rVbm7PO29U+M0UOjkxXdJLTK17ZsFlanGgEAqCnLtm3b6SKAkx0uKvZr/2dOX1Sj44IsKTLcpYdHd1ffxGitzsnXtHnrVXjULU81n5rv7h/mg0or1iSU38EAACcQ5tDgJNyz0OkSvJ67ppeG94j1br//zS5Nfm2tgxVJuY8Od/T8AICGhQUQQBX6JkaX2e6XGONQJQAAVIz5GjQ4/pyilGo+zSpJq3Pyy4zMrTrp+rmq+Ps9AABQimlWNDo1XQBx66trtGX3Qd0/spv6JcZoVc4+TZ//P3Vp00zPX9uryteyAAIAUF8Ic0Al9h0q0u1z1+qLLXu8bed1aaWnx/ZUTNOqV7MCAFBfCHNANbjPHACgIWMBhIEyMzNlWZb3a+zYsbXuKysrq0xfqampvis0QHRpG6khZ7YlyAEAGiQWQBhs5MiRSklJUXJysiTJtm199NFHeu+997Rs2TJt375dbrdbXbp00ZgxY3TnnXcqPDy8TB9JSUlKT0+XJM2YMaPe3wMAAKgbplkNlJmZqbS0NM2ePVvjx4/3th89elQREREKCwtTamqqunfvrqNHj2rRokXasmWL+vbtqyVLligiIqLCfi3L0qBBg5SdnV0/bwQAANQZI3MBJDg4WA899JBuvfVWtWjRwtvudrt1+eWXa8GCBXr22Wc1depU54oEAAA+xTVzAcTlcmnatGllglxp+1/+8hdJ0pIlSxyoDAAA+AthrpFwuVySpJAQBmMBAAgkhLlG4t///rckaejQoQ5XAgAAfIkw1wh89NFH+r//+z+dccYZmjhxotPlAAAAHyLMBbgvv/xSY8aMUVRUlN58802FhfGYKQAAAglhLoCtXbtWQ4cOlWVZWrRokbp16+Z0SQAAwMcIcwFqzZo1uvDCC1VSUqJFixapb9++TpcEAAD8gKWNAag0yBUXF2vRokXq37+/0yUBAAA/IcwFmNIg53a79dFHH+nss892uiQAAOBHhLkAsm/fPl144YXKz8/XRRddpE8++USffPJJmWNatGihKVOmOFMgAADwOcJcADlw4IDy8/MlHb8dyUcffVTumPj4eMJcbezeKO3bJsUkSW1Od7oaAAC8CHMBJCEhQbZtO12GeQ7tqXzf4X3S+1Ok7ctOtMUPkC59SmoSU/74pq18XR0AAFUizBksLS1NaWlpGjNmjObOnVurPrKysjRkyBAfV1ZPig75pp/HT6t8nxUkhTWXrsyU4s6R8pZLC6ZIz/eXbE/546ftqn0doU1r/1oAQKNFmDNQSkqK0tPTvdvJycm17ispKalMXwkJCXUprX493N7/57A90oinpG6jj293Gy3ZtvRWmu9rythf+9cCABoty2ZeDqbKiKqf8/xpsxTZ9sR24c/SzK6+Pw9hDgBQC4zMwVx1mdI8WXWjaXnLT4zMSWWvn/NXTQAA1BAjc0BVCyDeGCf9skm65PHjCx+2L5M+mCq1Pl26ak7541kAAQCoZ4Q5oCqH9kpvT5S2LT7RljRYunyW1LSlc3UBAPD/EOaAmuA+cwCABoowBwAAYLAgpwsAAABA7RHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADBYiNMFwGwlJSXyeDxOlwEAgHFcLpdP+iHMoU527NihoqIip8sAAMA4Xbt29Uk/hDnUSVFRkYKDgxUSwj8lAABqqri42Gd98RMYdRYSEuKzoWIAAHBqWAABAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYLcboAwCQ5e49o5/4idYwKVWLLCKfLAQCAMIfGLf+wu0bH7T9arMcX79TaHw5623p2aKapgzsqKrzqj1F0E1edagQAoCqEORjjiLvE530Of+nbGh0XZEmR4S49d00v9U2M1uqcfE2bt17XvbpRHrvq1356Sw8fVFpWhCvY530CAMxEmIMxLnjhG8fO7bGlh0d31/AesZKk4T1iZcvW5NfWVvtaf9S9/LaePu8TAGAmFkAANdQ3MbrMdr/EGIcqAQDgBEbmYAx/TFeeyqjZ6px878icJK3K2Vej1/mjbgAAShHmYAx/XCe2cFJyjY6798Nc3Td/vWzZ6pcYo1U5+zR9/rfq2aGZHrw4ocrXcn0bAMCfLNu2q7l8G6jc5s2bFRYWJpcrsFdsFhwpVsaiXK3KK/S29YuLVMawBLWI4HciAMCpcbvdio+P90lfXDNnoMzMTFmW5f0aO3ZsrfvKysoq01dqaqrvCg0gLSJC9NSoznr12tP1t0uT9Oq1p+upUZ0JcgAAx/GTyGAjR45USkqKkpNPTBW+8847eu2117Ru3Tr9/PPP8ng8io+P15AhQzR16lR16NChTB9JSUlKT0+XJM2YMaNe6zdRYssIbhYMAGhQCHMGGzVqlMaPH1+mbd68eVq3bp369u2r2NjjF+t//fXXeuaZZzRnzhwtXbpU3bp18x6flJSkjIwMSYQ5AABMRJgLMP/6178UHh5ern3WrFmaNGmSMjIy9OabbzpQGQAA8AeumQswFQU5SbryyislSVu3bq3PcgAAgJ8R5hqJhQsXSlKZ6+sAAID5mGYNUO+++66+/vprHT58WP/73/+0aNEiJSYm6v7773e6NAAA4EOEuQD17rvvas6cOd7tPn36aO7cuUpMTHSwKgAA4GtMswaozMxM2batgoICLV68WKGhoerdu7c+++wzp0sDAAA+RJgLcFFRUUpNTdWHH36oiIgIjRs3Tm632+myAACAjxDmGonmzZvrrLPO0g8//MCKVgAAAghhrhHZtWuXJCkkhEslAQAIFIS5AHLs2DGtWLGiwn2zZ8/WqlWr1LlzZ3Xp0qWeKwMAAP7CEE0AOXLkiM4++2wlJycrJSVFHTp00P79+7Vq1SqtWbNGzZo10+zZs50uEwAA+BBhLoA0bdpUM2bM0OLFi/Xpp59qz549crlcSkhI0JQpU3THHXcoLi7O6TIBAIAPEeYCiMvl0vTp0zV9+nSnS2m0QvK3Knh/nkqi4lQc3dnpcgAAjQDXzBksLS1NlmVp7Nixte4jKytLlmXJsiwfVhaYgo7sq/QrOH+bWi4YpzZvjlDLj/9w/L8Lxik4f1ulrwEAwBcYmTNQSkqK0tPTvdt1ed5qUlJSmb4SEhLqUlqDZrkP1+n17V4eUEXnQVJYc+nKTCnuHClvucIWTFHbt0ZItqfCl/yY9lWd6pEk29Wkzn0AAMxm2bZtO10EzLV582aFhYXJ5XI5XUq12v/zDP+e4MpMqdvoE9vfviO9lebXU+66cYNf+wcA+Ifb7VZ8fLxP+mKaFfCVuHPKbsdXMZIHAICPMM2KRqOu05qxs3tXfUDe8rIjc9uX+bUeAAAkwhwakbpeX/bT9ZWHs+isKQpd+CdZtn18RG77Mtkf3KWi2H7Kv/BJv9QDAIDENXOoI5OumfOnoKP5iv7sLoXtXO5tO9bxHOWf/4Q84dEOVgYAaIh8ec0cI3OAD3jCo7X3klncZw4AUO8Ic4APFUd3JsQBAOoVq1kBAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGAhThcA8xUXFztdAgAARvHlz07CHOokNDRURUVFKikpcboUAAAaJcu2bdvpImCukpISeTwep8sAAMA4LpfLJ/0Q5gAAAAzGAggAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMFiI0wUADdGWnwuVu/ewElo2UZe2kU6XAwBApQhzaDT2HjxW7TH5h4v013nfamXOPm9b/8QYPTQ6WdFNQqt8bctmYXWuEQCAU2XZtm07XQRwssNFxX7p98zpi6o9JsiSIsNdenh0d/VNjNbqnHxNm7dehUfd8lTzSfnu/mE+qrSsJqH8zgUAqBxhDg1Owj0LHT3/c9f00vAesd7t97/ZpcmvrXWsntxHhzt2bgBAw8cCCOBX+iZGl9nulxjjUCUAAFSP+Rs0OP6arqzJNKskrc7JLzMyt+qk6+eq4q+6AQCoCtOsaDRqsgDi1lfXaMvug7p/ZDf1S4zRqpx9mj7/f+rSppmev7ZXla9lAQQAwAmEOeAk+w4V6fa5a/XFlj3etvO6tNLTY3sqpmnVq1kBAHACYc5AmZmZSktL826PGTNGc+fOrVVfWVlZGjJkiHd70KBBys7OrmuJxuM+cwAAU3DNnMFGjhyplJQUJScnV3pMQUGBunXrpl27dmnYsGH66KOPyuxPSkpSenq6JGnGjBl+rdckXdpGEuIAAEYgzBls1KhRGj9+fJXH3Hbbbdq/f3+l+5OSkpSRkSGJMAcAgIm4NUkAW7BggV5++WU98sgjTpcCAAD8hDAXoPbt26cbb7xR11xzjUaMGOF0OQAAwE8IcwFq8uTJKikp0TPPPON0KQAAwI+4Zi4AzZs3T//5z3/0+uuvq2XLliosLHS6JAAA4CeMzAWYPXv26Oabb9aoUaN01VVXOV0OAADwM8JcgLn11lvldrv1wgsvOF0KAACoB0yzBpD58+frzTffVGZmptq1a+d0OQAAoB4wMhdA1q5dK0kaP368LMvyfiUmJkqSFi1aJMuylJKS4mCVAADAlxiZCyC9evXSxIkTy7UfPHhQr7/+ujp27Khhw4YpLi7OgeoAAIA/EOYCyGWXXabLLrusXHtubq5ef/11devWTS+99JIDlQEAAH9hmhUAAMBghDkAAACDMc3aCCQkJMi2bafLMNvujdK+bVJMktTmdKerAQDAi5E5g6WlpcmyLI0dO7bWfWRlZXlXvTZah/ZU/vXLZmn2JdLz/aW5Vx//7+xLjrdXdDwAAPWMkTkDpaSkKD093budnJxc676SkpLK9JWQkFCX0upf0aG69/H4aZXvs4KksObSlZlS3DlS3nJpwZTjoc72lD9+2q661xPatO59AAAaDctm/g0my4jy/zmuzJS6jT6x/e070ltp/jtfxn7/9Q0ACDhMswLViTun7Hb8AGfqAACgAkyzwmy+mNZ8uH3V+/OWlx2Z277Mv/UAAHAKmGYFqlq48MY46ZdN0iWPHx+R275M+mCq1Pp06ao55Y9v2sp/dQIAUAHCHFCVQ3ultydK2xafaEsaLF0+S2ra0rm6AAD4fwhzQE1wnzkAQANFmAMAADAYq1kBAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGAhThcAs5WUlMjj8ThdBgAAxnG5XD7phzCHOtmxY4eKioqcLgMAAON07drVJ/0Q5lAnRUVFCg4OVkgI/5QAAKip4uJin/XFT2DUWUhIiM+GigEAwKlhAQQAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABgtxugCgIcvZe0Q79xepY1SoEltGOF0OAADlEObQ6OQfdld7zP6jxXp88U6t/eGgt61nh2aaOrijosKr/thEN3HVuUYAAGqKMIcG54i7xK/9D3/p22qPCbKkyHCXnruml/omRmt1Tr6mzVuv617dKI9d9Ws/vaWHjyo9IcIV7PM+AQCBgTCHBueCF75xugR5bOnh0d01vEesJGl4j1jZsjX5tbXVvtYf9S+/rafP+wQABAYWQACV6JsYXWa7X2KMQ5UAAFA5RubQ4PhjmvJkNR05W52T7x2Zk6RVOftq9Dp/1w8AwMkIc2hw/H192MJJydUec++Hubpv/nrZstUvMUarcvZp+vxv1bNDMz14cUKVr+X6NgBAfbJs267mcm6gcps3b1ZYWJhcrsBawVlwpFgZi3K1Kq/Q29YvLlIZwxLUIoLfgQAAdeN2uxUfH++TvvipBFSgRUSInhrVmfvMAQAaPBZAGCgzM1OWZXm/xo4dW+u+srKyyvSVmprqu0IDQGLLCJ2XFEWQAwA0WIzMGWzkyJFKSUlRcvKJa8AyMzOVlpZW6Wt+/PFHtWvXzrudlJSk9PR0SdKMGTP8VywAAPALwpzBRo0apfHjx1e4rzTo/VqzZs3KbCclJSkjI0MSYQ4AABMR5gJUVUEPAAAEDq6ZAwAAMBgjcwHq66+/1t///ncVFxfrtNNO09ChQxUZGel0WQAAwMcIcwHq6aefLrMdFRWlZ599Vtddd51DFQEAAH9gmjXAJCUl6fnnn9fWrVt1+PBh5ebm6rnnnlNQUJDGjRunDz/80OkSAQCADxHmAszAgQN1yy236LTTTlNERITi4+N16623au7cubJtW9OnT3e6RAAA4EOEuUZi6NCh6tSpk7766isdO3bM6XIAAICPEOYakVatWsm2bR05csTpUgAAgI8Q5hqJAwcOaOPGjWrRooWioqKcLgcAAPgIYS7ALFu2rFzbkSNH9Pvf/15HjhzR2LFjZVmWA5UBAAB/4NYkAebcc8/VmWeeqd69e6t9+/bavXu3srKytGPHDv32t7/Vww8/7HSJAADAhwhzAebOO+/UihUrtGjRIuXn5yssLExnnHGGJk+erD/+8Y+KiIhwukQAAOBDhLkAM3PmTKdLCHgh+VsVvD9PJVFxKo7u7HQ5AIBGjmvmDJaWlibLsjR27Nha95GVlSXLsriO7iRBR/ZV+BWcv00tF4xTmzdHqOXHfzj+3wXjFJy/rcLjAQCoD4zMGSglJUXp6ene7eTk5Fr3lZSUVKavhISEupRW7yz3YZ/32e7lAZWcLEgKay5dmSnFnSPlLVfYgilq+9YIyfaUO/zHtK9O+dy2q8kpvwYA0LhZtm3bThcBc23evFlhYWFyuVyOnL/9P8+o3xNemSl1G31i+9t3pLfSfNb9rhs3+KwvAEDD5Xa7FR8f75O+mGYFTkXcOWW34ysZxQMAoJ4wzQqj1WYqszqxs3tXvjNvedmRue3l7+tXyh+1AQDwa4Q5GM0f15j9dH3FAS06a4pCF/5Jlm0fH5Hbvkz2B3epKLaf8i98sl5qAwDg17hmDnXi9DVz9SnoaL6iP7tLYTuXe9uOdTxH+ec/IU94tIOVAQBM48tr5hiZA2rIEx6tvZfM4j5zAIAGhTAHnKLi6M6EOABAg8FqVgAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwWIjTBcB8xcXFTpcAAIBRfPmzkzCHOgkNDVVRUZFKSkqcLgUAgEbJsm3bdroImKukpEQej8fpMgAAMI7L5fJJP4Q5AAAAg7EAAgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDhThdABAotvxcqNy9h5XQsom6tI10uhwAQCNBmAOqsPfgsWqPyT9cpL/O+1Yrc/Z52/onxuih0cmKbhJa5WtbNgurc40AgMbNsm3bdroI4FQdLiqul/OcOX1RtccEWVJkuEsPj+6uvonRWp2Tr2nz1qvwqFueaj5d390/zEeVntAklN/RAKAxIczBSAn3LHS6hDKeu6aXhveI9W6//80uTX5trSO15D463JHzAgCcwQIIwAf6JkaX2e6XGONQJQCAxob5GBjJH9OTFanJNKskrc7JLzMyt+qk6+eqUl/vAwAQuJhmBapQkwUQt766Rlt2H9T9I7upX2KMVuXs0/T5/1OXNs30/LW9qnwtCyAAAHVFmAPqaN+hIt0+d62+2LLH23Zel1Z6emxPxTStejUrAAB1RZgDfIT7zAEAnMACCANlZmbKsizv19ixY2vdV1ZWVpm+UlNTfVdoI9OlbaSGnNmWIAcAqFeEOYONHDlS6enpuuKKK8rt2717t+6880516dJF4eHhatmypc4++2y98MILZY5LSkpSenq60tPT66tsAADgQ0yzGigzM1NpaWmaPXu2xo8fX27/119/raFDhyo/P1/Dhw/XGWecoYMHD2rDhg0KDQ3VBx98UGG/lmVp0KBBys7O9u8bAAAAPsOtSQJMYWGhRo4cKUn66quv1KNHjzL7i4vr58kJAACgfhDmAszzzz+vvLw8zZo1q1yQk6SQEL7lAAAEEn6yB5jXX39dlmXp8ssv16ZNm/Txxx/ryJEjOv3003XRRRcpNJRbZQAAEEgIcwGkqKhI33zzjVq3bq1nn31W06dPl8fj8e5PSkrSu+++q+7duztYJQAA8CVWswaQffv2qaSkRHv37tWMGTP02GOP6eeff9bOnTt13333KScnRyNGjNDRo0edLhUAAPgIYS6AlI7ClZSU6NZbb9Wf/vQntWnTRh06dND999+vq666Stu3b9dbb73lcKUAAMBXCHMBJCoqyvvnyy67rNz+ESNGSJK+/PLLeqsJAAD4F2EugDRt2lQdOnSQJLVo0aLc/tK2I0eO1GNVAADAnwhzAeb888+XJH333Xfl9pW2JSQk1GdJAADAjwhzAebmm2+WJD366KMqKCjwtv/00096+umnFRQUpMsvv9yh6gAAgK9xa5IAc8455+jOO+/U3//+d/Xo0UMjRoyQ2+3W/PnztXv3bj388MPq2rWr02UCAAAfIcwFoJkzZ6p79+567rnnlJmZKcuy1LNnT7344osaPXq00+UBAAAfIswFqPHjx2v8+PFOl4Ha2r1R2rdNikmS2pzudDUAgAaMa+YMlpaWJsuyNHbs2Fr3kZWVJcuyZFmWDytDlQ7tqfzrl83S7Euk5/tLc68+/t/Zlxxvr+h4AECjx8icgVJSUpSenu7dTk5OrnVfSUlJZfpipWsNFR2q/WsfP63yfVaQFNZcujJTijtHylsuLZhyPNTZnvLHT9tV+zpKhTatex8AAMdYtm3bThcBGCcjqvpjauvKTKnbSdc2fvuO9Faa/86Xsd9/fQMA/I5pVqChiTun7Hb8AGfqAAAYgWlWoDbqMr35cPuq9+ctLzsyt32Zf+oAAAQEplmB+lbVwoU3xkm/bJIuefz4iNz2ZdIHU6XWp0tXzSl/fNNW/qsTAGAEwhzQkBzaK709Udq2+ERb0mDp8llS05bO1QUAaLAIc0BDxH3mAAA1RJgDAAAwGKtZAQAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADBYiNMFwGwlJSXyeDxOlwEAgHFcLpdP+iHMoU527NihoqIip8sAAMA4Xbt29Uk/hDnUSVFRkYKDgxUSwj8lAABqqri42Gd98RMYdRYSEuKzoWIAAHBqWAABAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYLcboAwCQ5e49o5/4idYwKVWLLCKfLAQCAMAfkH3ZXe8z+o8V6fPFOrf3hoLetZ4dmmjq4o6LCa/Yxim7iqnWNAABUhjAHYxxxl/il3+EvfVvtMUGWFBnu0nPX9FLfxGitzsnXtHnrdd2rG+Wxa3aeT2/pUcdKKxbhCvZLvwAAMxDmYIwLXvjGsXN7bOnh0d01vEesJGl4j1jZsjX5tbU17sNf9S+/radf+gUAmIEFEEAN9U2MLrPdLzHGoUoAADiBkTkYw1/TlDUdMVudk+8dmZOkVTn7Tuk8/qofANC4EeZgDH9dG7ZwUnK1x9z7Ya7um79etmz1S4zRqpx9mj7/W/Xs0EwPXpxQo/NwbRsAwB8s27ZrePk2UN7mzZsVFhYmlyuwV2oWHClWxqJcrcor9Lb1i4tUxrAEtYjgdyIAwKlxu92Kj4/3SV/8FAJqoEVEiJ4a1Zn7zAEAGhwWQBgoMzNTlmV5v8aOHVvrvrKyssr0lZqa6rtCA1BiywidlxRFkAMANBiMzBls5MiRSklJUXLyiWu+EhIStH379ipf9/nnn+u8886TJCUlJSk9PV2SNGPGDP8VCwAA/IIwZ7BRo0Zp/PjxZdqmTJmigoKCcsfu2bNHzz33nKKjo9W3b19ve1JSkjIyMiQR5gAAMBFhLsBMmTKlwvaZM2dKkq677jqFh4fXY0UAAMCfuGaukZg1a5YkaeLEiQ5XAgAAfIkw1wgsX75cGzZsUJ8+ffTb3/7W6XIAAIAPEeYagdJRuUmTJjlcCQAA8DXCXIA7ePCg3njjDTVp0kRXX3210+UAAAAfI8wFuNdff10HDx7UlVdeqebNmztdDgAA8DHCXIB76aWXJDHFCgBAoCLMBbDvvvtOK1as0Omnn65zzz3X6XIAAIAfEOYCGLcjAQAg8BHmApTb7dbLL78sl8ulcePGOV0OAADwE8JcgHrvvff0yy+/aMSIEWrTpo3T5QAAAD8hzAUo7i0HAEDjwLNZA9QHH3zgdAmNRkj+VgXvz1NJVJyKozs7XQ4AoJFhZM5gaWlpsixLY8eOrXUfWVlZsixLlmX5sLLAEHRkX5Vfwfnb1HLBOLV5c4RafvyH4/9dME7B+dsqPB4AAH9gZM5AKSkpSk9P924nJyfXuq+kpKQyfSUkJNSltAbBch/2ST/tXh5QzYmCpLDm0pWZUtw5Ut5yhS2YorZvjZBsT7nDf0z7yid12a4mPukHABAYLNu2baeLgLk2b96ssLAwuVwup0vxav/PM+rvZFdmSt1Gn9j+9h3prTS/nnLXjRv82j8AwP/cbrfi4+N90hfTrEBdxJ1Tdju+mtE8AAB8jGlWBBxfTWfGzu5d/UF5y8uOzG1fVumhvqoLAICTEeYQcHx1TdlP11cezCQpOmuKQhf+SZZtHx+R275M9gd3qSi2n/IvfNJvdQEAcDKumUOdNMRr5upL0NF8RX92l8J2Lve2Het4jvLPf0Ke8GgHKwMANHS+vGaOkTmgljzh0dp7ySzuMwcAcBRhDqij4ujOhDgAgGNYzQoAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYLcboAmK+4uNjpEgAAMIovf3YS5lAnoaGhKioqUklJidOlAADQKFm2bdtOFwFzlZSUyOPxOF0GAADGcblcPumHMAcAAGAwFkAAAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBCHMAAAAGI8wBAAAYjDAHAABgMMIcAACAwQhzAAAABiPMAQAAGIwwBwAAYDDCHAAAgMEIcwAAAAYjzAEAABiMMAcAAGAwwhwAAIDBQpwuAEDjsuXnQuXuPayElk3UpW2k0+UAgPEIc0AA2XvwmNMlVCr/cJH+Ou9brczZ523rnxijh0YnK7pJqIOV+UfLZmFOlwCgkbBs27adLgIwxeGiYqdLqNKZ0xc5XUKlgiwpMtylh0d3V9/EaK3Oyde0eetVeNQtTwD+X+i7+4c5XULAahLKOARwMsIccAoS7lnodAlGe+6aXhreI9a7/f43uzT5tbUOVgQT5T463OkSgAaFBRAA6k3fxOgy2/0SYxyqBAACB2PVwClo6FNnDXmaVZJW5+SXGZlbddL1c4Gmof9bARA4mGYFAkhDXgBx66trtGX3Qd0/spv6JcZoVc4+TZ//P3Vp00zPX9vL6fJ8jgUQAOoLYQ5Avdh3qEi3z12rL7bs8bad16WVnh7bUzFNA281KwDUF8IcgHrFfeYAwLdYANHAZWdny7IsZWRkOF0K4BNd2kZqyJltCXIA4COEOQAAAIMR5gAAAAxGmGvAMjIyNHjwYEnSjBkzZFmW9ys3N1ebN2/Wn//8Z/Xq1UstW7ZUeHi4unbtqnvuuUcHDx4s119CQoISEhIqPFdqaqosy/Ln2wEAAH7AfeYasNTUVOXm5mrOnDkaNGiQUlNTvftatGihF198UbNmzdLgwYOVmpoqj8ejFStW6G9/+5uWLFmizz//XC6Xy7k3AAAA/I4w14CVhrc5c+YoNTW13CKI66+/XnfeeadCQ8ve1uH+++9Xenq63njjDV177bX1VC0AAHAC06wG69ChQ7kgJ0mTJ0+WJGVlZdV3SQAAoJ4R5gxm27b+/e9/a+DAgYqJiVFwcLAsy1LLli0lSbt27XK4QgAA4G9Msxrstttu07PPPqtOnTrpsssuU2xsrMLCjj9CaMaMGTp2rOE+2gkAAPgGYc5Qu3fv1nPPPacePXrov//9r5o0aeLd99NPP2nGjBnlXhMUFKSioqIK+9u/f7/fagUAAP7DNGsDFxwcLEkqKSkp075t2zbZtq0LL7ywTJCTpC+++KLCvqKjo7V7924VFxeXaT906JC2bNniw6oBAEB9Icw1cDExMZKknTt3lmmPj4+XJC1fvlwej8fbvnPnTt1zzz0V9tWnTx+53W69+uqr3jbbtvWXv/xFhw4d8nXpAACgHli2bdtOF4HKlZSUKC4uTvv27dOECRPUsWNHWZalW265RRMnTtTbb7+tnj176oILLtDPP/+s999/X+eff77efvttDRo0SNnZ2d6+1q9fr969e8u2bY0ZM0atW7fWF198oYKCAjVr1kzr1q0T/xwAADALYc4AK1eu1N133601a9aosLBQkpSTk6NWrVopIyNDb7/9tn788UfFxcVp3LhxuvvuuxUaGlouzEnSZ599pmnTpunrr79Ws2bNdMkll+jxxx/XmDFjtGTJEsIcAACGIcwBaDx2b5T2bZNikqQ2pztdDQD4BKtZAdTeoT1OV1Azh/dJ70+Rti870RY/QLr0KalJjFNVBYamrZyuAGj0GJkDfK2oES0mebi90xXUjBUkhTWXRjwlxZ0j5S2XFkyRjh2QbE91r0ZVpnFzcjQSoU2drqBShDnA1zKinK4AFbkyU+o2+sT2t+9Ib6U5Vg4Aw2Q03PuxcmsSAI1D3Dllt+MHOFMHAPgY18wBvtaYpp1MmWaVjk+tnjwyd/L1c6i9xvTvHWigmGYFUHumLIB4Y5z0yybpksePj8htXyZ9MFVqfbp01RynqzMbCyAAxxHmAAS+Q3ultydK2xafaEsaLF0+S2ra0rm6AMAHCHMAGg/uMwcgABHmAAAADMZqVgAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYIQ5AAAAg4U4XQDMZdu2CgsLnS4DAABjRUZGyrKsOvVBmEOtFRYWKioqyukyAAAw1v79+9W8efM69WHZtm37qB40Mo1tZO7AgQPq1KmTduzYUecPHuqO70fDwvej4eF70rBU9v1gZA6OsiyrUf4Ponnz5o3yfTdUfD8aFr4fDQ/fk4bFH98PFkAAAAAYjDAHAABgMMIcUENhYWFKT09XWFiY06VAfD8aGr4fDQ/fk4bFn98PFkAAAAAYjJE5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOaAaq1ev1iWXXKLo6Gg1bdpU/fr102uvveZ0WY1WQkKCLMuq8Ovmm292uryA9Morr+imm25Snz59FBYWJsuylJmZWenxBw4c0J133qn4+HiFhYUpPj5ed955pw4cOFB/RQewU/l+ZGRkVPp5CQ8Pr9/CA9QPP/ygp556SkOHDlVcXJxCQ0PVrl07XX755Vq5cmWFr/H1Z4QnQABVyM7O1rBhwxQaGqqxY8cqKipK77zzjq699lrl5uZq2rRpTpfYKEVFRWnKlCnl2vv06VP/xTQC9957r7Zv365WrVopNjZW27dvr/TYQ4cOadCgQfr66681ZMgQXX311Vq3bp2efPJJLV68WEuXLlXTpk3rsfrAcyrfj1I33HCDEhISyrSFhBABfOEf//iH/va3v+m0007TkCFD1KZNG23ZskXvvvuu3n33Xf3nP//RVVdd5T3eL58RG0CF3G63fdppp9lhYWH2mjVrvO0HDhywu3XrZoeEhNibN292sMLGKT4+3o6Pj3e6jEblk08+sXNzc23btu1HHnnElmTPnj27wmOnT59uS7L//Oc/V9g+ffp0f5cb8E7l+5Genm5LshcvXlx/BTYyb7/9tv3555+Xa//8889tl8tlx8TE2EePHvW2++MzwjQrUInPPvtM33//va655hr17NnT2x4ZGan77rtPxcXFmj17toMVAvXjwgsvVHx8fLXH2batl156Sc2aNdP06dPL7PvLX/6i6OhozZo1Sza3N62Tmn4/UD9+97vf6bzzzivXft5552nw4MHat2+f1q9fL8l/nxHGWIFKZGdnS5KGDh1abl9p25IlS+qzJPw/x44d05w5c/TDDz8oOjpa55xzjn772986XVajt2XLFu3atUvDhg0rN00UHh6ugQMHav78+dq6dau6dOniUJWN0xdffKFVq1YpODhYp59+ui688EKeDFEPXC6XpBNT2v76jBDmgEps2bJFkir8QEVHR6tVq1beY1C/fvrpJ40fP75M20UXXaSXX35ZrVq1cqYoVPmZObl9y5YthLl69utRoNjYWM2ZM0dDhgxxqKLAl5eXp6ysLLVr107du3eX5L/PCNOsQCX2798v6fjF9hVp3ry59xjUnwkTJig7O1u//PKLDhw4oBUrVujiiy/WRx99pMsuu4wpPAfV5DNz8nHwv5SUFM2ZM0e5ubk6cuSItmzZogceeEAFBQW67LLLtG7dOqdLDEhut1vXX3+9jh07pscee0zBwcGS/PcZYWQOgFF+PcLQv39/vf/++xo0aJCWLl2qDz74QMOHD3eoOqBhGTVqVJntzp07695771Xbtm1144036sEHH9Sbb77pTHEByuPxaMKECfr888/1+9//Xtdff73fz8nIHFCJ0t+cKvsN6cCBA5X+doX6FRQUpLS0NEnSsmXLHK6m8arJZ+bk4+CcG264QSEhIXxefMy2bf3+97/XK6+8ouuuu04vvvhimf3++owQ5oBKnHztwq/l5+drz549XPfTgJReK3f48GGHK2m8qvrMnNzO58Z5oaGhioyM5PPiQx6PRxMnTtS///1vXX311crMzFRQUNmY5a/PCGEOqMSgQYMkSR9//HG5faVtpcfAeaV3Wv/1jVFRf7p06aL27dtr2bJlOnToUJl9R48e1eeff6727durc+fODlWIUlu2bFF+fj6fFx/xeDyaNGmSZs+erTFjxujll1/2Xid3Mn99RghzQCUuuOACJSUl6bXXXtPXX3/tbS8sLNQDDzygkJCQcisq4V/fffedCgoKyrUvXbpUf//73xUWFqbf/e539V8YJEmWZWnSpEk6ePCg7r///jL7HnnkEeXn52vSpEmyLMuhChuXwsJCffPNN+Xa8/PzNXHiREnS1VdfXd9lBZzSEbnZs2fryiuv1CuvvFJhkJP89xmxbJZ+AZVavHixhg0bprCwMF199dVq3ry53nnnHeXk5OjBBx/UX//6V6dLbFQyMjL02GOP6YILLlBCQoLCwsL07bff6uOPP1ZQUJBefPFFTZo0yekyA85LL72kpUuXSpLWr1+vNWvWaMCAAd7Rg1GjRnkvtD906JDOPfdc76OKevfurXXr1unDDz9USkoKj/PygZp+P3Jzc5WYmKg+ffqoe/fuatOmjX744Qd9+OGH2rt3r4YMGaL3339foaGhTr4d42VkZGjGjBlq1qyZbr/99gofkzZq1CilpKRI8tNn5JSfGQE0MitXrrQvuugiOyoqyo6IiLD79Oljv/LKK06X1ShlZ2fbV111ld25c2c7MjLSdrlcdseOHe2xY8faK1eudLq8gHXDDTfYkir9Sk9PL3N8QUGBfccdd9idOnWyXS6X3alTJ/uOO+6wCwoKnHkDAaam34/9+/fbf/jDH+zevXvbrVq1skNCQuyoqCj73HPPtV988UW7uLjY2TcSIKr7fqiCx635+jPCyBwAAIDBuGYOAADAYIQ5AAAAgxHmAAAADEaYAwAAMBhhDgAAwGCEOQAAAIMR5gAAAAxGmAMAADAYYQ4AAMBghDkAAACDEeYAAAAMRpgDAAAwGGEOAADAYP8/o9/y4nUL02gAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 600x1100 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"az.plot_forest(\n",
" [idata_ref, idata_path], \n",
" var_names=[\"~theta\"], \n",
" model_names=[\"ref\", \"path\"], \n",
" combined=True,\n",
");"
]
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "colgate-shelf-sow2",
"language": "python",
"name": "colgate-shelf-sow2"
},
"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.11.4"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment