diff --git a/benchmarks/gpu_benchmarks.ipynb b/benchmarks/gpu_benchmarks.ipynb new file mode 100644 index 000000000..eeda48edd --- /dev/null +++ b/benchmarks/gpu_benchmarks.ipynb @@ -0,0 +1,1494 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:23:28.917621Z", + "iopub.status.busy": "2025-01-09T00:23:28.917332Z", + "iopub.status.idle": "2025-01-09T00:23:29.477701Z", + "shell.execute_reply": "2025-01-09T00:23:29.477193Z", + "shell.execute_reply.started": "2025-01-09T00:23:28.917602Z" + } + }, + "source": [ + "# PyFixest on the GPU \n", + "\n", + "Through its JAX integration, it is possible to run PyFixest on the GPU. In this notebook, we benchmark the performance of PyFixest on the GPU via its \n", + "`jax` backend and compare it to the performance of PyFixest on the CPU (via the default `numba` backend). \n", + "\n", + "All dependencies to run this notebook are available in the `docs` environment. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import time\n", + "from itertools import product\n", + "\n", + "import jax\n", + "import jax.numpy as jnp\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.ticker as ticker\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "from scipy.stats import nbinom\n", + "from tqdm import tqdm\n", + "\n", + "import pyfixest as pf\n", + "from pyfixest.estimation.demean_ import demean\n", + "from pyfixest.estimation.demean_jax_ import demean_jax\n", + "\n", + "rng = np.random.default_rng(239291)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Last updated: 2025-01-10T22:33:11.321606+01:00\n", + "\n", + "Python implementation: CPython\n", + "Python version : 3.12.8\n", + "IPython version : 8.31.0\n", + "\n", + "Compiler : MSC v.1942 64 bit (AMD64)\n", + "OS : Windows\n", + "Release : 11\n", + "Machine : AMD64\n", + "Processor : Intel64 Family 6 Model 142 Stepping 12, GenuineIntel\n", + "CPU cores : 8\n", + "Architecture: 64bit\n", + "\n" + ] + } + ], + "source": [ + "%load_ext watermark\n", + "%watermark" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:2025-01-10 22:33:11,368:jax._src.xla_bridge:927: Unable to initialize backend 'rocm': module 'jaxlib.xla_extension' has no attribute 'GpuAllocatorConfig'\n", + "INFO:jax._src.xla_bridge:Unable to initialize backend 'rocm': module 'jaxlib.xla_extension' has no attribute 'GpuAllocatorConfig'\n", + "INFO:2025-01-10 22:33:11,374:jax._src.xla_bridge:927: Unable to initialize backend 'tpu': UNIMPLEMENTED: LoadPjrtPlugin is not implemented on windows yet.\n", + "INFO:jax._src.xla_bridge:Unable to initialize backend 'tpu': UNIMPLEMENTED: LoadPjrtPlugin is not implemented on windows yet.\n" + ] + }, + { + "data": { + "text/plain": [ + "[CpuDevice(id=0)]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# checking GPU connection\n", + "jax.devices()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:23:30.540594Z", + "iopub.status.busy": "2025-01-09T00:23:30.540228Z", + "iopub.status.idle": "2025-01-09T00:23:30.739685Z", + "shell.execute_reply": "2025-01-09T00:23:30.739213Z", + "shell.execute_reply.started": "2025-01-09T00:23:30.540574Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{CpuDevice(id=0)}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "jnp.ones(10).devices()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:26:29.239253Z", + "iopub.status.busy": "2025-01-09T00:26:29.238947Z", + "iopub.status.idle": "2025-01-09T00:26:29.754752Z", + "shell.execute_reply": "2025-01-09T00:26:29.754158Z", + "shell.execute_reply.started": "2025-01-09T00:26:29.239235Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "'nvidia-smi' is not recognized as an internal or external command,\n", + "operable program or batch file.\n" + ] + } + ], + "source": [ + "# checking GPU availability\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we define a function to simulate a test data set which closely mimics the data generating process in the original fixest benchmarks \n", + "that produced the data for [this figure](https://raw.githubusercontent.com/lrberge/fixest/refs/heads/master/vignettes/images/benchmark_gaussian.png).\n", + "\n", + "In one slight adjustment, we allow to vary the number of regressors `k`, which in the original fixest dgp is always set to 1. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "background_save": true + }, + "execution": { + "iopub.execute_input": "2025-01-09T00:23:49.545271Z", + "iopub.status.busy": "2025-01-09T00:23:49.545016Z", + "iopub.status.idle": "2025-01-09T00:23:49.552123Z", + "shell.execute_reply": "2025-01-09T00:23:49.551676Z", + "shell.execute_reply.started": "2025-01-09T00:23:49.545253Z" + }, + "id": "bxMmeyCxR3fb" + }, + "outputs": [], + "source": [ + "def generate_test_data(rng: np.random.Generator, size: int = 1, k: int = 2):\n", + " \"\"\"\n", + " Generate benchmark data for pyfixest on GPU (similar to the R fixest benchmark data).\n", + "\n", + " Args:\n", + " rng (np.random.Generator): A numpy random number generator.\n", + " size (int): The number of observations in the data frame.\n", + " k (int): The number of covariates in the data frame.\n", + "\n", + " Returns\n", + " -------\n", + " pd.DataFrame: The generated data frame for the given size.\n", + " \"\"\"\n", + " # Constants\n", + " all_n = [1000 * 10**i for i in range(5)]\n", + " a = 1\n", + " b = 0.05\n", + "\n", + " n = all_n[size - 1]\n", + "\n", + " dum_all = []\n", + " nb_dum = [n // 20, int(np.sqrt(n)), int(n**0.33)]\n", + "\n", + " dum_all = np.zeros((n, 3))\n", + " dum_all[:, 0] = rng.choice(nb_dum[0], n, replace=True)\n", + " dum_all[:, 1] = rng.choice(nb_dum[1], n, replace=True)\n", + " dum_all[:, 2] = rng.choice(nb_dum[2], n, replace=True)\n", + " dum_all = dum_all.astype(int)\n", + "\n", + " X1 = rng.normal(size=n)\n", + " X2 = X1**2\n", + "\n", + " mu = a * X1 + b * X2\n", + "\n", + " for m in range(3):\n", + " coef_dum = rng.normal(size=nb_dum[m])\n", + " mu += coef_dum[dum_all[:, m]]\n", + "\n", + " mu = np.exp(mu)\n", + " y = nbinom.rvs(0.5, 1 - (mu / (mu + 0.5)), size=n, random_state=rng)\n", + "\n", + " X_full = np.column_stack((X1, X2))\n", + " base = pd.DataFrame(\n", + " {\n", + " \"y\": y,\n", + " \"ln_y\": np.log1p(y),\n", + " \"X1\": X1,\n", + " \"X2\": X2,\n", + " }\n", + " )\n", + "\n", + " if k > 2:\n", + " X = rng.normal(size=(n, k - 2))\n", + " X_df = pd.DataFrame(X, columns=[f\"X{i}\" for i in range(3, k + 1, 1)])\n", + " base = pd.concat([base, X_df], axis=1)\n", + " X_full = np.column_stack((X_full, X))\n", + "\n", + " for m in range(3):\n", + " base[f\"dum_{m + 1}\"] = dum_all[:, m]\n", + "\n", + " weights = rng.uniform(0, 1, n)\n", + " return base, y, X_full, dum_all, weights" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:23:50.285297Z", + "iopub.status.busy": "2025-01-09T00:23:50.284967Z", + "iopub.status.idle": "2025-01-09T00:23:50.460957Z", + "shell.execute_reply": "2025-01-09T00:23:50.460501Z", + "shell.execute_reply.started": "2025-01-09T00:23:50.285276Z" + }, + "id": "nzynhbqwR81H" + }, + "outputs": [], + "source": [ + "df, Y, X, f, weights = generate_test_data(rng=rng, size=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now test the two backend based on the test data set:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:25:02.873750Z", + "iopub.status.busy": "2025-01-09T00:25:02.873239Z", + "iopub.status.idle": "2025-01-09T00:25:03.153458Z", + "shell.execute_reply": "2025-01-09T00:25:03.153005Z", + "shell.execute_reply.started": "2025-01-09T00:25:02.873732Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + " ln_y\n", + "
(1)(2)
coef
X10.257668***
(0.029134)
0.257668***
(0.029134)
fe
dum_1xx
stats
Observations10001000
S.E. typeby: dum_1by: dum_1
R20.2830800.283080
Significance levels: * p < 0.05, ** p < 0.01, *** p < 0.001. Format of coefficient cell:\n", + "Coefficient \n", + " (Std. Error)
\n", + "\n", + "
\n", + " " + ], + "text/plain": [ + "GT(_tbl_data= level_0 level_1 0 \\\n", + "0 coef X1 0.257668***
(0.029134) \n", + "1 fe dum_1 x \n", + "2 stats Observations 1000 \n", + "3 stats S.E. type by: dum_1 \n", + "4 stats R2 0.283080 \n", + "\n", + " 1 \n", + "0 0.257668***
(0.029134) \n", + "1 x \n", + "2 1000 \n", + "3 by: dum_1 \n", + "4 0.283080 , _body=, _boxhead=Boxhead([ColInfo(var='level_0', type=, column_label='level_0', column_align='center', column_width=None), ColInfo(var='level_1', type=, column_label='level_1', column_align='center', column_width=None), ColInfo(var='0', type=, column_label='(1)', column_align='center', column_width=None), ColInfo(var='1', type=, column_label='(2)', column_align='center', column_width=None)]), _stub=, _spanners=Spanners([SpannerInfo(spanner_id='ln_y', spanner_level=1, spanner_label='ln_y', spanner_units=None, spanner_pattern=None, vars=['0', '1'], built=None)]), _heading=Heading(title=None, subtitle=None, preheader=None), _stubhead=None, _source_notes=['Significance levels: * p < 0.05, ** p < 0.01, *** p < 0.001. Format of coefficient cell:\\nCoefficient \\n (Std. Error)'], _footnotes=[], _styles=[], _locale=, _formats=[], _substitutions=[], _options=Options(table_id=OptionsInfo(scss=False, category='table', type='value', value=None), table_caption=OptionsInfo(scss=False, category='table', type='value', value=None), table_width=OptionsInfo(scss=True, category='table', type='px', value='auto'), table_layout=OptionsInfo(scss=True, category='table', type='value', value='fixed'), table_margin_left=OptionsInfo(scss=True, category='table', type='px', value='auto'), table_margin_right=OptionsInfo(scss=True, category='table', type='px', value='auto'), table_background_color=OptionsInfo(scss=True, category='table', type='value', value='#FFFFFF'), table_additional_css=OptionsInfo(scss=False, category='table', type='values', value=[]), table_font_names=OptionsInfo(scss=False, category='table', type='values', value=['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Helvetica Neue', 'Fira Sans', 'Droid Sans', 'Arial', 'sans-serif']), table_font_size=OptionsInfo(scss=True, category='table', type='px', value='16px'), table_font_weight=OptionsInfo(scss=True, category='table', type='value', value='normal'), table_font_style=OptionsInfo(scss=True, category='table', type='value', value='normal'), table_font_color=OptionsInfo(scss=True, category='table', type='value', value='#333333'), table_font_color_light=OptionsInfo(scss=True, category='table', type='value', value='#FFFFFF'), table_border_top_include=OptionsInfo(scss=False, category='table', type='boolean', value=True), table_border_top_style=OptionsInfo(scss=True, category='table', type='value', value='solid'), table_border_top_width=OptionsInfo(scss=True, category='table', type='px', value='2px'), table_border_top_color=OptionsInfo(scss=True, category='table', type='value', value='#A8A8A8'), table_border_right_style=OptionsInfo(scss=True, category='table', type='value', value='none'), table_border_right_width=OptionsInfo(scss=True, category='table', type='px', value='2px'), table_border_right_color=OptionsInfo(scss=True, category='table', type='value', value='#D3D3D3'), table_border_bottom_include=OptionsInfo(scss=False, category='table', type='boolean', value=True), table_border_bottom_style=OptionsInfo(scss=True, category='table', type='value', value='hidden'), table_border_bottom_width=OptionsInfo(scss=True, category='table', type='px', value='2px'), table_border_bottom_color=OptionsInfo(scss=True, category='table', type='value', value='#A8A8A8'), table_border_left_style=OptionsInfo(scss=True, category='table', type='value', value='none'), table_border_left_width=OptionsInfo(scss=True, category='table', type='px', value='2px'), table_border_left_color=OptionsInfo(scss=True, category='table', type='value', value='#D3D3D3'), heading_background_color=OptionsInfo(scss=True, category='heading', type='value', value=None), heading_align=OptionsInfo(scss=True, category='heading', type='value', value='center'), heading_title_font_size=OptionsInfo(scss=True, category='heading', type='px', value='125%'), heading_title_font_weight=OptionsInfo(scss=True, category='heading', type='value', value='initial'), heading_subtitle_font_size=OptionsInfo(scss=True, category='heading', type='px', value='85%'), heading_subtitle_font_weight=OptionsInfo(scss=True, category='heading', type='value', value='initial'), heading_padding=OptionsInfo(scss=True, category='heading', type='px', value='4px'), heading_padding_horizontal=OptionsInfo(scss=True, category='heading', type='px', value='5px'), heading_border_bottom_style=OptionsInfo(scss=True, category='heading', type='value', value='solid'), heading_border_bottom_width=OptionsInfo(scss=True, category='heading', type='px', value='2px'), heading_border_bottom_color=OptionsInfo(scss=True, category='heading', type='value', value='#D3D3D3'), heading_border_lr_style=OptionsInfo(scss=True, category='heading', type='value', value='none'), heading_border_lr_width=OptionsInfo(scss=True, category='heading', type='px', value='1px'), heading_border_lr_color=OptionsInfo(scss=True, category='heading', type='value', value='#D3D3D3'), column_labels_background_color=OptionsInfo(scss=True, category='column_labels', type='value', value=None), column_labels_font_size=OptionsInfo(scss=True, category='column_labels', type='px', value='100%'), column_labels_font_weight=OptionsInfo(scss=True, category='column_labels', type='value', value='normal'), column_labels_text_transform=OptionsInfo(scss=True, category='column_labels', type='value', value='inherit'), column_labels_padding=OptionsInfo(scss=True, category='column_labels', type='px', value='4px'), column_labels_padding_horizontal=OptionsInfo(scss=True, category='column_labels', type='px', value='5px'), column_labels_vlines_style=OptionsInfo(scss=True, category='table_body', type='value', value='none'), column_labels_vlines_width=OptionsInfo(scss=True, category='table_body', type='px', value='0px'), column_labels_vlines_color=OptionsInfo(scss=True, category='table_body', type='value', value='white'), column_labels_border_top_style=OptionsInfo(scss=True, category='column_labels', type='value', value='solid'), column_labels_border_top_width=OptionsInfo(scss=True, category='column_labels', type='px', value='2px'), column_labels_border_top_color=OptionsInfo(scss=True, category='column_labels', type='value', value='black'), column_labels_border_bottom_style=OptionsInfo(scss=True, category='column_labels', type='value', value='solid'), column_labels_border_bottom_width=OptionsInfo(scss=True, category='column_labels', type='px', value='0.5px'), column_labels_border_bottom_color=OptionsInfo(scss=True, category='column_labels', type='value', value='black'), column_labels_border_lr_style=OptionsInfo(scss=True, category='column_labels', type='value', value='none'), column_labels_border_lr_width=OptionsInfo(scss=True, category='column_labels', type='px', value='1px'), column_labels_border_lr_color=OptionsInfo(scss=True, category='column_labels', type='value', value='#D3D3D3'), column_labels_hidden=OptionsInfo(scss=False, category='column_labels', type='boolean', value=False), row_group_background_color=OptionsInfo(scss=True, category='row_group', type='value', value=None), row_group_font_size=OptionsInfo(scss=True, category='row_group', type='px', value='0px'), row_group_font_weight=OptionsInfo(scss=True, category='row_group', type='value', value='initial'), row_group_text_transform=OptionsInfo(scss=True, category='row_group', type='value', value='inherit'), row_group_padding=OptionsInfo(scss=True, category='row_group', type='px', value='0px'), row_group_padding_horizontal=OptionsInfo(scss=True, category='row_group', type='px', value='5px'), row_group_border_top_style=OptionsInfo(scss=True, category='row_group', type='value', value='solid'), row_group_border_top_width=OptionsInfo(scss=True, category='row_group', type='px', value='0.5px'), row_group_border_top_color=OptionsInfo(scss=True, category='row_group', type='value', value='black'), row_group_border_right_style=OptionsInfo(scss=True, category='row_group', type='value', value='none'), row_group_border_right_width=OptionsInfo(scss=True, category='row_group', type='px', value='1px'), row_group_border_right_color=OptionsInfo(scss=True, category='row_group', type='value', value='white'), row_group_border_bottom_style=OptionsInfo(scss=True, category='row_group', type='value', value='solid'), row_group_border_bottom_width=OptionsInfo(scss=True, category='row_group', type='px', value='0.5px'), row_group_border_bottom_color=OptionsInfo(scss=True, category='row_group', type='value', value='black'), row_group_border_left_style=OptionsInfo(scss=True, category='row_group', type='value', value='none'), row_group_border_left_width=OptionsInfo(scss=True, category='row_group', type='px', value='1px'), row_group_border_left_color=OptionsInfo(scss=True, category='row_group', type='value', value='white'), row_group_as_column=OptionsInfo(scss=False, category='row_group', type='boolean', value=False), table_body_hlines_style=OptionsInfo(scss=True, category='table_body', type='value', value='none'), table_body_hlines_width=OptionsInfo(scss=True, category='table_body', type='px', value='1px'), table_body_hlines_color=OptionsInfo(scss=True, category='table_body', type='value', value='#D3D3D3'), table_body_vlines_style=OptionsInfo(scss=True, category='table_body', type='value', value='none'), table_body_vlines_width=OptionsInfo(scss=True, category='table_body', type='px', value='0px'), table_body_vlines_color=OptionsInfo(scss=True, category='table_body', type='value', value='white'), table_body_border_top_style=OptionsInfo(scss=True, category='table_body', type='value', value='solid'), table_body_border_top_width=OptionsInfo(scss=True, category='table_body', type='px', value='0.5px'), table_body_border_top_color=OptionsInfo(scss=True, category='table_body', type='value', value='black'), table_body_border_bottom_style=OptionsInfo(scss=True, category='table_body', type='value', value='solid'), table_body_border_bottom_width=OptionsInfo(scss=True, category='table_body', type='px', value='2px'), table_body_border_bottom_color=OptionsInfo(scss=True, category='table_body', type='value', value='black'), data_row_padding=OptionsInfo(scss=True, category='data_row', type='px', value='4px'), data_row_padding_horizontal=OptionsInfo(scss=True, category='data_row', type='px', value='5px'), stub_background_color=OptionsInfo(scss=True, category='stub', type='value', value=None), stub_font_size=OptionsInfo(scss=True, category='stub', type='px', value='100%'), stub_font_weight=OptionsInfo(scss=True, category='stub', type='value', value='initial'), stub_text_transform=OptionsInfo(scss=True, category='stub', type='value', value='inherit'), stub_border_style=OptionsInfo(scss=True, category='stub', type='value', value='hidden'), stub_border_width=OptionsInfo(scss=True, category='stub', type='px', value='2px'), stub_border_color=OptionsInfo(scss=True, category='stub', type='value', value='#D3D3D3'), stub_row_group_background_color=OptionsInfo(scss=True, category='stub', type='value', value=None), stub_row_group_font_size=OptionsInfo(scss=True, category='stub', type='px', value='100%'), stub_row_group_font_weight=OptionsInfo(scss=True, category='stub', type='value', value='initial'), stub_row_group_text_transform=OptionsInfo(scss=True, category='stub', type='value', value='inherit'), stub_row_group_border_style=OptionsInfo(scss=True, category='stub', type='value', value='solid'), stub_row_group_border_width=OptionsInfo(scss=True, category='stub', type='px', value='2px'), stub_row_group_border_color=OptionsInfo(scss=True, category='stub', type='value', value='#D3D3D3'), source_notes_padding=OptionsInfo(scss=True, category='source_notes', type='px', value='4px'), source_notes_padding_horizontal=OptionsInfo(scss=True, category='source_notes', type='px', value='5px'), source_notes_background_color=OptionsInfo(scss=True, category='source_notes', type='value', value=None), source_notes_font_size=OptionsInfo(scss=True, category='source_notes', type='px', value='90%'), source_notes_border_bottom_style=OptionsInfo(scss=True, category='source_notes', type='value', value='none'), source_notes_border_bottom_width=OptionsInfo(scss=True, category='source_notes', type='px', value='2px'), source_notes_border_bottom_color=OptionsInfo(scss=True, category='source_notes', type='value', value='#D3D3D3'), source_notes_border_lr_style=OptionsInfo(scss=True, category='source_notes', type='value', value='none'), source_notes_border_lr_width=OptionsInfo(scss=True, category='source_notes', type='px', value='2px'), source_notes_border_lr_color=OptionsInfo(scss=True, category='source_notes', type='value', value='#D3D3D3'), source_notes_multiline=OptionsInfo(scss=False, category='source_notes', type='boolean', value=True), source_notes_sep=OptionsInfo(scss=False, category='source_notes', type='value', value=' '), row_striping_background_color=OptionsInfo(scss=True, category='row', type='value', value='rgba(128,128,128,0.05)'), row_striping_include_stub=OptionsInfo(scss=False, category='row', type='boolean', value=False), row_striping_include_table_body=OptionsInfo(scss=False, category='row', type='boolean', value=False), container_width=OptionsInfo(scss=False, category='container', type='px', value='auto'), container_height=OptionsInfo(scss=False, category='container', type='px', value='auto'), container_padding_x=OptionsInfo(scss=False, category='container', type='px', value='0px'), container_padding_y=OptionsInfo(scss=False, category='container', type='px', value='10px'), container_overflow_x=OptionsInfo(scss=False, category='container', type='overflow', value='auto'), container_overflow_y=OptionsInfo(scss=False, category='container', type='overflow', value='auto'), quarto_disable_processing=OptionsInfo(scss=False, category='quarto', type='logical', value=False), quarto_use_bootstrap=OptionsInfo(scss=False, category='quarto', type='logical', value=False)), _has_built=False)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m0 = pf.feols(\"ln_y ~ X1 | dum_1\", df, demeaner_backend=\"numba\")\n", + "m1 = pf.feols(\"ln_y ~ X1 | dum_1\", df, demeaner_backend=\"jax\")\n", + "pf.etable([m0, m1], digits=6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We know define a single function to run a benchmark for a given sample size `size = i x 1000`, number of regressors `k`, solver, \n", + "and demeaning backend. Additionally, the function allows us to specify a set of fixed effects and if we want to run benchmarks only \n", + "for a full call to `pf.feols()`, or if we additionally want to benchmark the demeaning process. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:24:06.619552Z", + "iopub.status.busy": "2025-01-09T00:24:06.619273Z", + "iopub.status.idle": "2025-01-09T00:24:06.626298Z", + "shell.execute_reply": "2025-01-09T00:24:06.625727Z", + "shell.execute_reply.started": "2025-01-09T00:24:06.619534Z" + }, + "id": "29rZkULUR_A0" + }, + "outputs": [], + "source": [ + "def run_standard_benchmark(\n", + " rng,\n", + " fixed_effect,\n", + " demeaner_backend,\n", + " size=1,\n", + " k=1,\n", + " solver=\"np.linalg.lstsq\",\n", + " skip_demean_benchmark=True,\n", + "):\n", + " \"\"\"\n", + " Run the fixest standard benchmark fixed effect models. This is the function the benchmarks\n", + " will loop over.\n", + "\n", + " Args:\n", + " rng (np.random.Generator): A numpy random number generator.\n", + " fixed_effect (str): The fixed effect to use. Must be a list of variables as \"dum_1\", \"dum_1+dum_2\", or \"dum_1+dum_2+dum_3\", etc.\n", + " demeaner_backend (str): The backend to use for demeaning. Must be \"numba\" or \"jax\".\n", + " size (int): The size of the data to generate. Must be between 1 and 5. For 1, N = 1000, for 2, N = 10000, etc.\n", + " k_vals (int): The number of covariates to generate.\n", + " solver (str): The solver to use for the estimation. Must be \"np.linalg.lstsq\". \"jax\" currently throws an error.\n", + " skip_demean_benchmark (bool): Whether to skip the \"pure\" demean benchmark. Default is True. Only the full call\n", + " to feols is benchmarked.\n", + "\n", + " \"\"\"\n", + " assert fixed_effect in [\"dum_1\", \"dum_1+dum_2\", \"dum_1+dum_2+dum_3\"]\n", + "\n", + " # one fixed effect\n", + " res = []\n", + "\n", + " fml_base = \"ln_y ~ X1\"\n", + " fml = f\"{fml_base} | {fixed_effect}\"\n", + "\n", + " # warmup\n", + " df, y, X, f, weights = generate_test_data(rng=rng, size=1)\n", + " pf.feols(\n", + " fml,\n", + " data=df,\n", + " demeaner_backend=demeaner_backend,\n", + " store_data=False,\n", + " copy_data=False,\n", + " solver=solver,\n", + " )\n", + "\n", + " if not skip_demean_benchmark:\n", + " if demeaner_backend == \"jax\":\n", + " _, _ = demean_jax(X, f, weights, tol=1e-10)\n", + " else:\n", + " _, _ = demean(X, f, weights, tol=1e-10)\n", + "\n", + " if k > 1:\n", + " xfml = \"+\".join([f\"X{i}\" for i in range(2, k + 1, 1)])\n", + " fml = f\"{fml_base} + {xfml} | {fixed_effect}\"\n", + " else:\n", + " fml = f\"{fml_base} + X1 | {fixed_effect}\"\n", + "\n", + " for rep in range(1, 11):\n", + " df, Y, X, f, weights = generate_test_data(rng=rng, size=size, k=k)\n", + "\n", + " tic1 = time.time()\n", + " pf.feols(\n", + " fml,\n", + " data=df,\n", + " demeaner_backend=demeaner_backend,\n", + " store_data=False,\n", + " copy_data=False,\n", + " solver=solver,\n", + " )\n", + " tic2 = time.time()\n", + "\n", + " full_feols_timing = tic2 - tic1\n", + "\n", + " demean_timing = np.nan\n", + " if not skip_demean_benchmark:\n", + " YX = np.column_stack((Y.reshape(-1, 1), X))\n", + " tic3 = time.time()\n", + " if demeaner_backend == \"jax\":\n", + " _, _ = demean_jax(YX, f, weights, tol=1e-10)\n", + " else:\n", + " _, _ = demean(YX, f, weights, tol=1e-10)\n", + " tic4 = time.time()\n", + " demean_timing = tic4 - tic3\n", + "\n", + " res.append(\n", + " pd.Series(\n", + " {\n", + " \"method\": \"feols\",\n", + " \"solver\": solver,\n", + " \"demeaner_backend\": demeaner_backend,\n", + " \"n_obs\": df.shape[0],\n", + " \"k\": k,\n", + " \"G\": len(fixed_effect.split(\"+\")),\n", + " \"rep\": rep,\n", + " \"full_feols_timing\": full_feols_timing,\n", + " \"demean_timing\": demean_timing,\n", + " }\n", + " )\n", + " )\n", + "\n", + " return pd.concat(res, axis=1).T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A first simple benchmark " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a simple example, we see that `pf.feols()` does not spend a lot of time on the demeaning step." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:28:43.818536Z", + "iopub.status.busy": "2025-01-09T00:28:43.818246Z", + "iopub.status.idle": "2025-01-09T00:28:51.489202Z", + "shell.execute_reply": "2025-01-09T00:28:51.488591Z", + "shell.execute_reply.started": "2025-01-09T00:28:43.818520Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsolverdemeaner_backendn_obskGrepfull_feols_timingdemean_timing
0feolsnp.linalg.lstsqnumba10001110.1604290.0
1feolsnp.linalg.lstsqnumba10001120.1312250.0
2feolsnp.linalg.lstsqnumba10001130.1316260.0
3feolsnp.linalg.lstsqnumba10001140.1354970.001003
4feolsnp.linalg.lstsqnumba10001150.1301120.001006
5feolsnp.linalg.lstsqnumba10001160.1334290.0
6feolsnp.linalg.lstsqnumba10001170.1471660.0
7feolsnp.linalg.lstsqnumba10001180.1401050.000984
8feolsnp.linalg.lstsqnumba10001190.1586010.001009
9feolsnp.linalg.lstsqnumba100011100.1561010.000999
\n", + "
" + ], + "text/plain": [ + " method solver demeaner_backend n_obs k G rep full_feols_timing \\\n", + "0 feols np.linalg.lstsq numba 1000 1 1 1 0.160429 \n", + "1 feols np.linalg.lstsq numba 1000 1 1 2 0.131225 \n", + "2 feols np.linalg.lstsq numba 1000 1 1 3 0.131626 \n", + "3 feols np.linalg.lstsq numba 1000 1 1 4 0.135497 \n", + "4 feols np.linalg.lstsq numba 1000 1 1 5 0.130112 \n", + "5 feols np.linalg.lstsq numba 1000 1 1 6 0.133429 \n", + "6 feols np.linalg.lstsq numba 1000 1 1 7 0.147166 \n", + "7 feols np.linalg.lstsq numba 1000 1 1 8 0.140105 \n", + "8 feols np.linalg.lstsq numba 1000 1 1 9 0.158601 \n", + "9 feols np.linalg.lstsq numba 1000 1 1 10 0.156101 \n", + "\n", + " demean_timing \n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "3 0.001003 \n", + "4 0.001006 \n", + "5 0.0 \n", + "6 0.0 \n", + "7 0.000984 \n", + "8 0.001009 \n", + "9 0.000999 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# test run numba\n", + "run_standard_benchmark(\n", + " rng=rng,\n", + " fixed_effect=\"dum_1\",\n", + " demeaner_backend=\"numba\",\n", + " size=1,\n", + " k=1,\n", + " skip_demean_benchmark=False,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:28:43.818536Z", + "iopub.status.busy": "2025-01-09T00:28:43.818246Z", + "iopub.status.idle": "2025-01-09T00:28:51.489202Z", + "shell.execute_reply": "2025-01-09T00:28:51.488591Z", + "shell.execute_reply.started": "2025-01-09T00:28:43.818520Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsolverdemeaner_backendn_obskGrepfull_feols_timingdemean_timing
0feolsnp.linalg.lstsqjax10001110.1461620.196979
1feolsnp.linalg.lstsqjax10001120.1461270.011776
2feolsnp.linalg.lstsqjax10001130.1538950.012497
3feolsnp.linalg.lstsqjax10001140.1646960.012709
4feolsnp.linalg.lstsqjax10001150.1477780.012649
5feolsnp.linalg.lstsqjax10001160.1568420.012004
6feolsnp.linalg.lstsqjax10001170.1446830.012104
7feolsnp.linalg.lstsqjax10001180.1446660.011525
8feolsnp.linalg.lstsqjax10001190.1380090.009692
9feolsnp.linalg.lstsqjax100011100.133970.01277
\n", + "
" + ], + "text/plain": [ + " method solver demeaner_backend n_obs k G rep full_feols_timing \\\n", + "0 feols np.linalg.lstsq jax 1000 1 1 1 0.146162 \n", + "1 feols np.linalg.lstsq jax 1000 1 1 2 0.146127 \n", + "2 feols np.linalg.lstsq jax 1000 1 1 3 0.153895 \n", + "3 feols np.linalg.lstsq jax 1000 1 1 4 0.164696 \n", + "4 feols np.linalg.lstsq jax 1000 1 1 5 0.147778 \n", + "5 feols np.linalg.lstsq jax 1000 1 1 6 0.156842 \n", + "6 feols np.linalg.lstsq jax 1000 1 1 7 0.144683 \n", + "7 feols np.linalg.lstsq jax 1000 1 1 8 0.144666 \n", + "8 feols np.linalg.lstsq jax 1000 1 1 9 0.138009 \n", + "9 feols np.linalg.lstsq jax 1000 1 1 10 0.13397 \n", + "\n", + " demean_timing \n", + "0 0.196979 \n", + "1 0.011776 \n", + "2 0.012497 \n", + "3 0.012709 \n", + "4 0.012649 \n", + "5 0.012004 \n", + "6 0.012104 \n", + "7 0.011525 \n", + "8 0.009692 \n", + "9 0.01277 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# test run jax\n", + "run_standard_benchmark(\n", + " rng=rng,\n", + " fixed_effect=\"dum_1\",\n", + " demeaner_backend=\"jax\",\n", + " size=1,\n", + " k=1,\n", + " skip_demean_benchmark=False,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Systematic benchmarking\n", + "\n", + "We now want to run more systematic benchmarks on differences in performance on CPU vs GPU. \n", + "We will run benchmarks for different sets of fixed effects, sample sizes, and number of regressors. Our workhorse \n", + "function for the task is `run_all_benchmarks` defined below: " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-09T00:25:39.248695Z", + "iopub.status.busy": "2025-01-09T00:25:39.248317Z", + "iopub.status.idle": "2025-01-09T00:25:39.253652Z", + "shell.execute_reply": "2025-01-09T00:25:39.253000Z", + "shell.execute_reply.started": "2025-01-09T00:25:39.248671Z" + }, + "id": "HxsGRMSlR_jI" + }, + "outputs": [], + "source": [ + "def run_all_benchmarks(rng, size_list, k_list, skip_demean_benchmark):\n", + " \"\"\"\n", + " Run all the benchmarks.\n", + "\n", + " Args:\n", + " rng (np.random.Generator): A numpy random number generator.\n", + " size_list (list): The list of sizes to run the benchmarks on. 1-> 1000, 2-> 10000, ..., 5-> 10_000_000\n", + " k_list (list): The list of k values to run the benchmarks on.\n", + " skip_demean_benchmark (bool): Whether to skip the \"pure\" demean benchmark.\n", + " \"\"\"\n", + " res = pd.DataFrame()\n", + "\n", + " all_combinations = list(\n", + " product(\n", + " [\"numba\", \"jax\"], # demeaner_backend\n", + " [\"dum_1\", \"dum_1+dum_2\", \"dum_1+dum_2+dum_3\"], # fixef\n", + " size_list, # size\n", + " k_list, # k\n", + " [\"np.linalg.lstsq\"], # solver\n", + " )\n", + " )\n", + "\n", + " with tqdm(total=len(all_combinations), desc=\"Running Benchmarks\") as pbar:\n", + " for demeaner_backend, fixef, size, k, solver in all_combinations:\n", + " res = pd.concat(\n", + " [\n", + " res,\n", + " run_standard_benchmark(\n", + " rng=rng,\n", + " solver=solver,\n", + " fixed_effect=fixef,\n", + " demeaner_backend=demeaner_backend,\n", + " size=size,\n", + " k=k,\n", + " skip_demean_benchmark=skip_demean_benchmark,\n", + " ),\n", + " ],\n", + " axis=0,\n", + " )\n", + " pbar.update(1) # Update the progress bar after each iteration\n", + "\n", + " return res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run Benchmarks" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "background_save": true, + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-01-09T00:25:39.962554Z", + "iopub.status.busy": "2025-01-09T00:25:39.962039Z", + "iopub.status.idle": "2025-01-09T00:26:25.319310Z", + "shell.execute_reply": "2025-01-09T00:26:25.318687Z", + "shell.execute_reply.started": "2025-01-09T00:25:39.962536Z" + }, + "id": "gki1mlqvSEIi", + "outputId": "3cb40095-df81-4e78-99a6-2410da237884" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running Benchmarks: 100%|██████████| 24/24 [02:38<00:00, 6.59s/it]\n" + ] + } + ], + "source": [ + "res_all = run_all_benchmarks(\n", + " rng=rng,\n", + " size_list=[2, 3, 4, 5], # for N = 10_000, 100_000, 1_000_000, 10_000_000\n", + " k_list=[1, 10, 50, 100], # for k = 1, 10, 50, 100\n", + " skip_demean_benchmark=False,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "background_save": true, + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-01-09T00:26:25.320894Z", + "iopub.status.busy": "2025-01-09T00:26:25.320596Z", + "iopub.status.idle": "2025-01-09T00:26:26.391854Z", + "shell.execute_reply": "2025-01-09T00:26:26.391236Z", + "shell.execute_reply.started": "2025-01-09T00:26:25.320871Z" + }, + "id": "7zEIHj5nXXvq", + "outputId": "238dedce-a9f5-4a1b-b9a2-b84d4a89c091" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methoddemeaner_backendkGn_obsfull_feols_timingdemean_timing
0feolsjax11100000.228840.082133
1feolsjax111000000.2783820.659936
2feolsjax12100000.2594130.070082
3feolsjax121000000.5564650.676255
4feolsjax13100000.294520.080892
\n", + "
" + ], + "text/plain": [ + " method demeaner_backend k G n_obs full_feols_timing demean_timing\n", + "0 feols jax 1 1 10000 0.22884 0.082133\n", + "1 feols jax 1 1 100000 0.278382 0.659936\n", + "2 feols jax 1 2 10000 0.259413 0.070082\n", + "3 feols jax 1 2 100000 0.556465 0.676255\n", + "4 feols jax 1 3 10000 0.29452 0.080892" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = (\n", + " res_all.drop([\"rep\", \"solver\"], axis=1)\n", + " .groupby([\"method\", \"demeaner_backend\", \"k\", \"G\", \"n_obs\"])\n", + " .mean()\n", + " .reset_index()\n", + ")\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv(\"gpu_results.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": { + "background_save": true + }, + "id": "VCn6O5MMXlBw" + }, + "source": [ + "## Visualize Results" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def visualize_results(data, kpi):\n", + " \"\"\"\n", + " Visualize benchmark results.\n", + "\n", + " Args:\n", + " data (pd.DataFrame): The benchmark results data frame.\n", + " kpi (str): The key performance indicator to plot. Must be one of \"full_feols_timing\" or \"demean_timing\".\n", + " \"\"\"\n", + " df[\"G2\"] = df[\"G\"].map({1: \"n_fixef = 1\", 2: \"n_fixef = 2\", 3: \"n_fixef = 3\"})\n", + " df[\"n_obs\"] = df[\"n_obs\"].astype(str)\n", + "\n", + " n_obs_order = sorted(df[\"n_obs\"].unique(), key=lambda x: int(x))\n", + " demeaner_backend_order = df[\"demeaner_backend\"].unique()\n", + "\n", + " custom_palette = sns.color_palette(\"coolwarm\", n_colors=2)\n", + "\n", + " cat_plot = sns.catplot(\n", + " data=df,\n", + " x=\"n_obs\",\n", + " y=kpi,\n", + " hue=\"demeaner_backend\",\n", + " col=\"G2\",\n", + " row=\"k\",\n", + " kind=\"bar\",\n", + " palette=custom_palette,\n", + " order=n_obs_order,\n", + " hue_order=demeaner_backend_order,\n", + " height=4,\n", + " aspect=1.2,\n", + " col_order=[\"n_fixef = 1\", \"n_fixef = 2\", \"n_fixef = 3\"],\n", + " )\n", + "\n", + " # Set logarithmic scale on the y-axis\n", + " def log_scale(ax, y_label):\n", + " ax.set_yscale(\"log\")\n", + " ax.yaxis.set_major_formatter(ticker.ScalarFormatter())\n", + " ax.yaxis.set_major_locator(ticker.LogLocator(base=10.0, subs=None, numticks=10))\n", + " ax.set_ylabel(y_label)\n", + "\n", + " for ax in cat_plot.axes.flat:\n", + " log_scale(ax, \"Runtime (log seconds)\")\n", + "\n", + " cat_plot.set_axis_labels(\"Number of Observations\", \"Runtime (log seconds)\")\n", + " cat_plot.set_titles(row_template=\"k = {row_name}\", col_template=\"{col_name}\")\n", + " plt.subplots_adjust(top=0.9)\n", + " cat_plot.fig.suptitle(\n", + " f\"{kpi}: Runtime vs Number of Observations by n_fixef fixed effects and k regressors. Y Axis on the Log Scale\"\n", + " )\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:matplotlib.category:Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n", + "INFO:matplotlib.category:Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n" + ] + }, + { + "data": { + "image/png": "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7bfNxIkTzbPPPmsk2RwL8fHx5qWXXjLe3t6me/fuZsqUKaZLly7Gzc3NvPrqq/fcTj///LORZL788kub8piYGOPj42M6d+5sjDHmzJkzJnv27KZYsWJm5MiRZtq0aaZfv37mySefvOf8E7fvU089Za5cuWKyZ89u6tatm2Sbjhw5Msn2uFty53HBggVN8eLFTd68ec3AgQPN6NGjTVBQkPH19TXz5s0zTzzxhBk2bJgZNmyY8ff3N0WKFDHx8fHW6SMiIoynp6cpWrSoadmypRk/frz1GP/www9tlv/mm28aNzc30759ezN58mTTu3dv4+PjYypWrGjd94kxFSlSxGTPnt306dPHTJ482axduzbF7ZO4XhUrVjSjR482ffr0MV5eXiY4ONhcunTJGGPMqlWrTIcOHYwkM2jQIDN37lyzadOmFOeZL18+ExwcnOJwY4wJDg42+fPnt35O3O6lS5c2devWNePHjzdvvPGG9dxMtHv3buPu7m4qVKhgxo4dayZPnmzeffdd89xzz1nHceSYlGSefPJJExAQYKKiosyECRPMb7/9Ztq2bWuyZctmYmNjbcafM2eOzbl97tw5kzdvXhMZGWkmTZpkRowYYYoXL26yZMlifvvtN2OMMdeuXTOTJk0ykkyDBg2s5+SuXbts1v1OERERRpJp2LChmTBhgmnVqpWRZOrXr28zXuIxGBgYaN5//30zfvx4U758eWOxWMzu3but473//vvGYrGY9u3bm2nTpplPP/3UNGvWzAwbNuye+ynx+ChdurSpVq2a+eyzz0znzp2Ni4uLee6550xCQoIxxpgff/zRSDJLly61mf7UqVPG1dXVDBo06J7LqV69usmXL58pUKCA6datm5k4caJ54YUXjCSzbNmye057p7lz55pq1aoZDw8P63Y+dOiQdVvdWfccPnzY+Pr6mgYNGljL+vTpYywWi8017qOPPjIWi8U0adLETJw40URFRZlcuXLZnCPffPONadCggfX6fuf+vdu9zqe7r/txcXGmXLlypmDBgiY6OtoYY8yKFSuMJDN48GDreKtXrzbu7u6mSpUq5tNPPzWjR482ZcqUMe7u7mbLli3W8X7//Xfj5eVlnnjiCTN06FAzePBgExgYaMqUKZPsde9u9iwnpXuYe623vfGfPHnS5MuXz3puT5482Xz44YfmySefNJcuXTKHDh0yXbt2NZLM+++/bz0GTp8+/VD1SP369U3jxo3NyJEjzaRJk0yjRo2MJPPuu+/ajGfvcXz9+nVTrFgx4+npad577z0zZswYExYWZt0P97pmG/O/a8a5c+eMMcYcPHjQPPHEEyY0NNRadr9pS5YsaV599VUzceJEM2HCBGOMfce6McZMnDjRSLJeEyIjI02OHDlMSEiIzf3M2rVrrcsKDQ01o0aNMkOHDjUxMTF27/PmzZsbd3d3ExkZaaZPn26GDx9u6tata+bNm2eMMSY2NtYUKlTI5MuXz3z00Udm+vTpJioqylSsWNEcPXrUOh9HrqnJ1aH21D2OGjlypJFkVq1aZerXr2+yZctmTp06Zff0L7/8sqlZs6Yxxphjx44Zi8WS5H7KGGP+85//GH9/f3P8+HFjzL/XAXd3d9OuXTub8e6+P7zftk/J7t27jY+Pj8mbN68ZPHiwGTZsmClUqJDx8PAwv/zyi3W8xPqlXLly5oUXXjDjxo0zPXv2NK6urqZx48b3XMa97nXtvV9OjNWe71UpkWS9V01OQkKCeeGFF4zFYjFvvvmmGT9+vKlbt66RZLp3724zriPfR+42ZMgQI8nMnj37vjGvWrXKuLu7m4IFC5oBAwaYSZMmma5du5patWpZx/nkk09MtWrVzKBBg8zUqVNNt27djJeXl6lUqZK13jcm+Xvjzz//3FgsFvPyyy+bcePGmeHDh5vg4GCTLVs2u78LA8CjhmQFAKdK/GL11Vdf2ZSnZ7LiXnHUrFnTlC5d2ty8edNalpCQYJ555hlTtGhRa1n37t2NJPN///d/1rKrV6+aQoUKmeDgYOsD07uTFZcuXUry8PZBJH4BS26dU0pWhIeH29wAV6lSxVgsFtOxY0dr2e3bt03+/PmT7IuUHsC3bdvWZrwGDRqYnDlzWj9v37492S8MrVu3TpVkxU8//WTOnTtnTpw4YRYtWmQCAgKMh4eHOXHihHVcR5MVOXPmNBcvXrSWL1myJMlDws6dO6f44CmlbdWhQwdrWeJ2tlgsNg8zL126ZLy8vGz239y5c42Li4vNsWaMMZMnTzaSzMaNG1PcTgkJCSYoKMi8/vrrNuVffvmlkWR+/vlnY8y/DwKTS/7YIzFZYYwxUVFRRpLZvn27MSZ1khWSbB7cr1y50kgyXl5e5tixY9byKVOmJHkIlfjw5J133rHZJnXq1DHu7u7Wh07/93//ZySZ+fPn28SU+NDyzvLEmFasWHHfbRMXF2dy585tSpUqZW7cuGEt//77740k079//yTrf799cPnyZSPpvomqevXqGUnWB7CJ271evXo243Xq1MlIsj74HT16tM1DuuQ4ckxKMi4uLubPP/+0GTdxP9798L127dqmcOHC1s+3b99OktC4dOmSCQwMtLn+nDt3LsUHDncfczt37jSSzJtvvmkz3rvvvmskmTVr1ljLEvd34rlijDFnz541Hh4epmfPntaysmXLmjp16iRZ9v0k7vewsDCbBzwjRowwksySJUuMMf8miPLnz2+aNGliM/2oUaOMxWIxhw8fvudyqlevbiSZzz//3FoWGxtr8uTJk+T6cD8RERHGx8cnSfnddY8x/zsv582bZ3755Rfj6upqUx8cPXrUuLq6mo8//thmuj/++MO4ubnZlN/9APleUjqfkrun+OOPP4y7u7t58803zaVLl0xQUJCpUKGCuXXrljHm32tG0aJFk9Sh169fN4UKFTIvvviitax+/frG09PT5tq0Z88e4+rqet9khSPLSekeJrn1dmS+rVq1Mi4uLslehxKn/eqrr5J94P8w9cj169eTlL311lvG29vb5n7M3uN4zJgxSRL1MTExpkiRIg4nK/bu3Wvy5ctnKlasaHNvcL9pmzVrZlNu77EeGxtrcubMaSpWrGg9Bo0xZvbs2UnukRKPg8KFC9tsQ0f2ub+//z0fBv/222/JHmt3epBr6t11qD11j6Nu3bplQkNDTY4cOYwkM2XKFLunPXPmjHFzczPTpk2zlj3zzDPJ1r2nTp0yOXLkMC+++KKJjY015cqVM0888YS5cuWKzXh311H32/YpqV+/vnF3d7cmio0x5p9//jFZs2a1Se4kXg9q1aplcxz06NHDuLq6msuXL99zOSnd6zpyv2zv96qU3C9Z8e233xpJ5qOPPrIpb9iwobFYLObgwYPGGMe/j9zt9OnTJiAgwEgyJUqUMB07djRffPFFkm14+/ZtU6hQIVOwYEGbBKQxJsm5eLf//ve/Se437r43vnr1qsmWLZtp3759kvj8/f2TlANARkEzUACQgosXL2rNmjVq3Lixrl69qvPnz+v8+fO6cOGCwsPDdeDAAWvTLcuWLVOlSpVsXu339fVVhw4ddPToUe3ZsyfZZSS2871u3bok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tmXLlmTvbbZu3aoLFy5Ym+UqX768ChUqpDFjxiTZbonnfXLXPCnp+ZOc8PBw+fn5aciQIcn2DZQa2xQAnIE3KwA8ktq2batRo0YpPDxc7dq109mzZzV58mQ99dRTSTqKS0sTJkxQ1apVVbp0abVv316FCxfWmTNntHnzZv3999/atWuXJKlPnz7673//q1deeUVdu3ZVjhw5NGfOHB05ckRff/11iq9+//XXX6pZs6YaN26skiVLys3NTd98843OnDmjpk2b2h1nWFiYJKlfv35q2rSpsmTJorp161q/WDwqwsLC9Prrr2vMmDG6cOGCnn76aa1fv976Be7uX209+eSTql69ukOdbN+tV69eatSokWbPnq2OHTumybGVuP27du2q8PBwubq6OrT/HNGyZUt9+eWX6tixo9auXatnn31W8fHx2rdvn7788kutXLky2c5Q71S+fHkVKVJE/fr1U2xsbLJ9AkycOFENGjRQSEiIrl69qmnTpsnPzy/JL7vt4e/vr27duiXb0fZLL72kJ554Qu3atVOvXr3k6uqqmTNnKiAgIE0eQHh6emrFihWKiIhQ5cqVtXz5cv3www96//33rc07Va9eXW+99ZaGDh2qnTt36qWXXlKWLFl04MABffXVVxo7dqxNR632ypIli4YPH642bdqoevXqatasmc6cOaOxY8cqODhYPXr0eKB1Klq0qObMmaMWLVqodOnSateunQoVKqSjR49qxowZOn/+vP773/9aE0N3OnLkiOrVq6eXX35Zmzdv1rx589S8eXNr00uDBg3Szz//rDp16qhgwYI6e/asJk6cqPz581vf4kiNYzJRkyZNNG7cOA0YMEClS5e2+VWu9O9bJIsXL1aDBg1Up04dHTlyRJMnT1bJkiVtHsJ5eXmpZMmSWrhwoYoVK6YcOXKoVKlSybYbXbZsWUVERGjq1KnWJmi2bt2qOXPmqH79+ja/ZrZXyZIlVaNGDYWFhSlHjhz69ddftWjRIpvO3e8lLi7OWjfs379fEydOVNWqVVWvXj2b8QICAvTyyy/rq6++UrZs2R444ZUeZs2apR9++EGzZ8+2NhUzbtw4vfHGG5o0aZI6deqkkJAQffTRR+rbt6+OHj2q+vXrK2vWrDpy5Ii++eYbdejQQe+++26axbh37159+OGHat26terWrStJmj17tkJDQ9WpUyd9+eWXcnFx0fTp0/XKK6/oqaeeUps2bRQUFKSTJ09q7dq18vPz09KlSyVJUVFRWrFihapVq6ZOnTrp9u3bGjdunJ566qn7Nt3myHIc4ch8hwwZolWrVql69erq0KGDnnzySZ06dUpfffWVNmzYoGzZsik0NFSurq4aPny4rly5Ig8PD73wwgv64osvHqgeeeaZZ5Q9e3ZFRESoa9euslgsmjt37kM1UdO+fXuNHz9erVq10vbt25U3b17NnTvXmtR0dPvNmzdP9evXV+PGjbVs2bIkb8rZw95j3d3dXQMHDtQ777yjF154QY0bN9bRo0c1e/ZshYSE2PVrd3v3+dWrV5U/f341bNhQZcuWla+vr3766Sdt27ZNn376qSRpzZo16tKlixo1aqRixYrp9u3b1jcOEjufTo1rqj11j5Q694n3smXLFh08eDDFa3dQUJDKly+v+fPnq3fv3jp79qzefvttPf/889Zpxo8fr7Vr16p169basGFDst8J7Nn2Kfnoo4/0448/qmrVqurUqZPc3Nw0ZcoUxcbGasSIEQ+/Ef6/1LjXtfd71b38+uuv+uijj5KU16hRQ3Xr1tXzzz+vfv366ejRoypbtqxWrVqlJUuWqHv37tb7IEe/j9xt7ty5mj9/vho0aKCwsDC5u7tr7969mjlzpjw9PfX+++9L+vfcmzRpkurWravQ0FC1adNGefPm1b59+/Tnn39a+79J7LPw1q1bCgoK0qpVq+x6m8zPz0+TJk1Sy5YtVb58eTVt2tR6//zDDz/o2WefTZK4AYAMwQCAE61du9ZIMl999VWSYfPmzTOFCxc27u7uJjQ01KxcudJERESYggUL2ownyQwYMMD6edasWUaSOXLkSKrEcejQIdOqVSuTJ08ekyVLFhMUFGT+85//mEWLFiUZr2HDhiZbtmzG09PTVKpUyXz//fc24xw5csRIMrNmzTLGGHP+/HnTuXNnU6JECePj42P8/f1N5cqVzZdffml37IkGDx5sgoKCjIuLi836FyxY0ERERFjHS9w+27Zts5l+wIABRpI5d+6cTXlERITx8fGxKbt7m6c0bXL7IiYmxnTu3NnkyJHD+Pr6mvr165v9+/cbSWbYsGFJllO9evX7rntK62SMMfHx8SYkJMSEhISY27dvG2PsO7YS99XIkSOTzPPu9b99+7Z55513TEBAgLFYLObO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EhISoixZsmjLli164oknJEmXLl3SX3/9perVq6tcuXKKj4/X2bNnVa1atVRbrj3z3bhxo1599VW98cYbkv5t0uivv/5SyZIl7V5O+fLldfr0abm5uSk4ODg1QrfasmWLzedffvlFRYsWlaurq/bt26cLFy5o2LBhKlCggCTp119/tRm/TJkymjNnjm7dupXi2xW5cuXS4sWLVaNGDTVu3FhffvmlsmTJkirrdb99/6DoYBsAAAAAAAAA4BBfX1+1a9dOvXr10po1a7R79261bt1aLi7/PnIuVqyYWrRooVatWmnx4sU6cuSItm7dqqFDh+qHH3544OXaM9+iRYvqxx9/1KZNm7R371699dZbOnPmjEPLqVWrlqpUqaL69etr1apVOnr0qDZt2qR+/folSR446vjx44qMjNT+/fv13//+V+PGjVO3bt0kSU888YTc3d01btw4HT58WN99950GDx5sM32XLl0UHR2tpk2b6tdff9WBAwc0d+5c7d+/32a83Llza82aNdq3b5+aNWum27dvp8p63W/fPyiSFQAAAAAAAAAAh40cOVLVqlVT3bp1VatWLVWtWlVhYWHW4bNmzVKrVq3Us2dPFS9eXPXr19e2bdusv8Z/UPeb7wcffKDy5csrPDxcNWrUUJ48eWz6bbCHxWLRsmXL9Nxzz6lNmzYqVqyYmjZtqmPHjikwMPCh4m/VqpVu3LihSpUqqXPnzurWrZu1Y+uAgADNnj1bX331lUqWLKlhw4bpk08+sZk+Z86cWrNmja5du6bq1asrLCxM06ZNS/Ytizx58mjNmjX6448/1KJFCyUkJKTKet1v3z8IizHGPNQcMpjo6Gj5+/vrypUr8vPzS9V5L9t2LVXnB1uVo793dgiZVs6aTZ0dgkM419IO51naetTPNerIjInzNm096uft3TjX0g7nWtrJCOcZdWTGxHmbtjLCuZuI8yxtca6lnYx0ngGpgTcrAAAAAAAAAACAU5GsAAAAAAAAAADgIR0/fly+vr4p/h0/ftzZIT7S3JwdAAAAAAAAAAAAGV2+fPm0c+fOew5HykhWAAAAAAAAAADwkNzc3FSkSBFnh5FhPXbJisT+xKOjo1N93tev0WFTWroac93ZIWRaWdLgfEhLnGtph/MsbaXVuZY1a1ZZLJaHng91ZMbEeZu2qCORiHMt7aTleUYd+XjjvE1b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1vv1ABoLPbJ2jalHJsnxxx+fgQMHZtddd03Pnj0zbty4LFu2LE899VSDXA+2NK9NuXWTvig9YQU0oF/84hc57rjjcsstt2TIkCHrHdemTZv3fZ188skbVce0adNy8MEHp0WLFtXbBg0alDlz5uSNN97YqHMnyXnnnZfvfve7eeyxx9KsWbOMGDHiA48ZPHhw/vCHPyRJpk+fnnnz5qVr1641xlRUVOSWW27JT37yk/z617/O2rVrc8IJJ+Swww6rvsbYsWPz05/+NNddd13++te/5swzz8wJJ5yQhx56KF27ds28efPStm3bjB8/PvPmzVvvTw2dfPLJH/jnAED90SPXr7H3yKVLl6asrKzBfkoVYEunR65fY+6Rq1atyg033JB27dqld+/eG3wcQGPSrNQFQGM1YcKEnHfeefnNb36TQw455H3HftDzDdq2bbtRtcyfPz8f+chHamyrrKys3rfttttu1PkvvfTS6s947rnn5sgjj8w777yTioqK9R7TsmXL6mW6HTt2TKdOnWod16dPn3znO9/JV77ylXzpS1/Kyy+/nN/+9rdJkpUrV+ayyy7LH/7wh/Tv3z/Juz9d8/DDD+f666/PIYcckk6dOqWsrCzt2rVb7zWS5OKLL843v/nND/X5AagbPXLr7ZHvvPNOzjnnnBx33HEb/WcH0BjpkVtfj/ztb3+bL33pS3nrrbfSuXPn/P73v0+HDh026pzApjNgwIDss88+qaioyI033pgWLVrk5JNPzoUXXpiXXnopH/nIR/L4449Xr/5asmRJtt122zzwwAMZMGBAHnzwwXzqU5/K5MmTc+6552b27Nnp379/br311syYMSOjRo3Kq6++mv/3//5fbrzxxrRq1ar62mvWrMmpp56an/3sZ2nevHn+8z//MxdffHHKysqSJD/72c9yzTXXZM6cOWndunU+/elPZ/z48dlhhx1K8Vu1QYQV0ADuuOOOLFy4MFOnTs1+++33geN33333TVBVw9lnn32qf925c+ckycKFC7PzzjvXy/nPOuus/OpXv8q1116b++67r/rL6d/+9re89dZbOeyww2qMX7VqVfbdd986XWOHHXbYrP+yBmgs9Mitt0euXr06xx57bIqiyA9/+MONPh9AY6NHbp098lOf+lSeeOKJLF68OD/60Y9y7LHH5pFHHvHvU9iC/OQnP8moUaPyyCOPZNq0aTnxxBPziU98InvssccGn+PCCy/Mtddem1atWuXYY4/Nsccem/Ly8vziF7/I8uXL8/nPfz7f//73c84559S47kknnZTp06fnsccey1e/+tXsvPPOGTlyZJJ3v39fcskl6dGjRxYuXJhRo0blxBNPzKRJk+r996C+CCugAey7776ZOXNmJk6cmH79+lUnmuvzQUtDTzjhhFx33XUfup5OnTplwYIFNba99/79fkpkQzVv3rz61+991qqqqo0+73sWLlyY5557Lk2bNs3zzz+fz3zmM0mS5cuXJ3n3fq5dunSpcUx5eXmdrnHyySfn5z//+fuOee96AHx4euTW2SPfCypefvnl/PGPf7SqAqAWeuTW2SNbt26d3XffPbvvvns+/vGPZ4899shNN92U0aNH16kWoHT22WefjBkzJkmyxx575Nprr82UKVPqFFZ85zvfySc+8YkkyUknnZTRo0fnhRdeqH6u0Be+8IU88MADNcKKrl275uqrr05ZWVl69OiRp59+OldffXV1WPHvt9fbdddd873vfS/77bdfli9fvtne7lxYAQ1gt912y3e/+90MGDAgTZs2zbXXXvu+4xt6+W7//v1z3nnnZfXq1dVfCH//+9+nR48eG710d1MYMWJEevXqlZNOOikjR47MwIED89GPfjR77bVXysvLM3fu3A9cIv1B3AYKYNPQI+vXltAj3wsqnn/++TzwwAPVP9kKQE16ZP3aEnpkbaqqqrJy5cp6PSfQsP59pVjy7mqxhQsXfuhzVFZWplWrVtVBxXvbpk+fXuOYj3/84zWC7f79++e73/1u1q5dm6ZNm2bGjBm58MIL8+STT+aNN96oDoTnzp2bvfbaq071bSrCCmgg3bt3r77/XLNmzTJ+/Pj1jt3Y5bt/+9vfsnz58syfPz9vv/129ZfWvfbaKy1atMjxxx+fiy66KCeddFLOOeecPPPMM7nmmmty9dVXb9R1N4UJEyZk2rRpeeqpp9K1a9fce++9GTJkSP7yl79km222yTe/+c2ceeaZqaqqykEHHZSlS5dm6tSpadu2bYYNG7bB19nY5buvv/565s6dm3/+859Jkjlz5iR59yeO6uOnjgAaEz2yfmwJPXL16tX5whe+kJkzZ+a3v/1t1q5dm/nz5ydJtttuuxoPbQVAj6wvW0KPXLFiRS699NIcffTR6dy5cxYvXpwJEybk1VdfzRe/+MUPdU6gNP59pVjy7mqxqqqqNGnSJElSFEX1vtWrV3/gOcrKytZ7zg21YsWKDBo0KIMGDcott9ySjh07Zu7cuRk0aFBWrVq1wefZ1IQV0IB69OiRP/7xj9U/GfPd7363Qa7zla98JQ899FD1+/fus/niiy+mW7duadeuXX73u9/llFNOSd++fdOhQ4dccMEF+epXv9og9dSX2bNn5+yzz85NN92Url27Jkl+8IMfZJ999sn555+fK664Ipdcckk6duyYsWPH5u9//3vat2+fj33sY/mv//qvTVrrPffck+HDh1e//9KXvpQkGTNmTC688MJNWgvAlkCP3DhbSo989dVXc8899yRJ9UMF3/Pe/4wDoCY9cuNsKT2yadOmmT17dn7yk59k8eLF2X777bPffvvlf//3f9OzZ89NVgfQcDp27JgkmTdvXvXfsR+0Kq4uHnnkkRrv//KXv2SPPfao/vvltddey+WXX179d+Fjjz1Wb9duKGXFv0c7AP9mwIABOfHEE3PiiSeWuhQA2KzokQBQOz0SqC+vTbl1k15v+0O/VOdjBgwYkD59+tRYCXfMMcekffv2ufnmm9O/f/80b948119/fRYuXJhvfetbmT59evUP7jz44IP51Kc+lTfeeCPt27dPktx8880544wzsmTJkupzXnjhhfnVr35VHXYMGDAgM2bMyMiRI/O1r30tM2fOzMiRI/Pd7343X/va17Jo0aLstNNOOf3003PyySfnmWeeydlnn53nnnsujz/++Do/SLS5aFLqAgAAAAAAoLGZOHFi1qxZk759++aMM87Id77znXo799ChQ/P2229n//33zymnnJLTTz+9evVbx44dc/PNN+f222/PXnvtlcsvvzz//d//XW/XbihWVgDrtbE/EdOzZ8+8/PLLte67/vrrM2TIkI2oDgBKR48EgNrpkQB8WJ5ZAazXiSeeuFHLwiZNmrTeBwdVVlZ+6PMCQKnpkQBQOz0SgA/LygoAAAAAAKCkPLMCAAAAAAAoqa0urCiKIsuWLYsFJQBQkx4JALXTIwEAGt5WF1a8+eabadeuXd58881SlwIAmxU9EgBqp0cCADS8rS6sAAAAAAAANi/CCgAAAAAAoKSEFQAAAAAAQEkJKwAAAAAAgJISVgAAAAAAACUlrAAAAAAAAEpKWAEAAAAAAJSUsAIAAAAAACgpYQUAAAAAAFBSwgoAAAAAAKCkhBUAAAAAAEBJCSsAAAAAAICSElYAAAAAAAAl1azUBQAAAABAQ5n06PJSl9CoHbFfm1KXADQSVlYAAAAAAAAlJawAAAAAAABKSlgBAAAAAACUlLACAAAAAAAoKWEFAAAAAABQUiUPKyZMmJBu3bqloqIiBxxwQKZPn77esatXr87FF1+c3XbbLRUVFendu3cmT568CasFAAAAAADqW0nDittuuy2jRo3KmDFjMnPmzPTu3TuDBg3KwoULax3/7W9/O9dff32+//3v59lnn83JJ5+cz3/+83n88cc3ceUAAAAAAEB9KSuKoijVxQ844IDst99+ufbaa5MkVVVV6dq1a77xjW/k3HPPXWf8jjvumPPOOy+nnHJK9bb/7//7/9KyZcv8/Oc/r/UaK1euzMqVK6vfL1u2LF27ds3SpUvTtm3bev5EALDl0CMBoHZ6JDQukx5dXuoSGrUj9mtT6hKARqJkKytWrVqVGTNmZODAgf8qpkmTDBw4MNOmTav1mJUrV6aioqLGtpYtW+bhhx9e73XGjh2bdu3aVb+6du1aPx8AALZweiQA1E6PBADY9EoWVixevDhr165NZWVlje2VlZWZP39+rccMGjQo48aNy/PPP5+qqqr8/ve/z1133ZV58+at9zqjR4/O0qVLq1+vvPJKvX4OANhS6ZEAUDs9EgBg02tW6gLq4pprrsnIkSOz5557pqysLLvttluGDx+eiRMnrveY8vLylJeXb8IqAWDLoEcCQO30SACATa9kKys6dOiQpk2bZsGCBTW2L1iwIJ06dar1mI4dO+ZXv/pVVqxYkZdffjmzZ89OmzZtsuuuu26KkgEAAAAAgAZQsrCiRYsW6du3b6ZMmVK9raqqKlOmTEn//v3f99iKiop06dIla9asyZ133pnPfe5zDV0uAAAAAADQQEp6G6hRo0Zl2LBh6devX/bff/+MHz8+K1asyPDhw5MkQ4cOTZcuXTJ27NgkySOPPJJXX301ffr0yauvvpoLL7wwVVVV+da3vlXKjwEAAAAAAGyEkoYVgwcPzqJFi3LBBRdk/vz56dOnTyZPnlz90O25c+emSZN/Lf5455138u1vfzt///vf06ZNmxxxxBH52c9+lvbt25foEwAAAAAAABurrCiKotRFbErLli1Lu3btsnTp0rRt27bU5QDAZkOPBIDa6ZGwZZv06PJSl9CoHbFfm1KXADQSJXtmBQAAAAAAQCKsAAAAAAAASkxYAQAAAAAAlJSwAgAAAAAAKClhBQAAAAAAUFLCCgAAAAAAoKSEFQAAAAAAQEkJKwAAAAAAgJISVgAAAAAAACUlrAAAAAAAAEpKWAEAAAAAAJSUsAIAAAAAACipkocVEyZMSLdu3VJRUZEDDjgg06dPf9/x48ePT48ePdKyZct07do1Z555Zt55551NVC0AAAAAAFDfShpW3HbbbRk1alTGjBmTmTNnpnfv3hk0aFAWLlxY6/hf/OIXOffcczNmzJjMmjUrN910U2677bb813/91yauHAAAAAAAqC8lDSvGjRuXkSNHZvjw4dlrr71y3XXXpVWrVpk4cWKt4//85z/nE5/4RI4//vh069Ythx9+eI477rgPXI0BAAAAAABsvkoWVqxatSozZszIwIED/1VMkyYZOHBgpk2bVusxBx54YGbMmFEdTvz973/PpEmTcsQRR6z3OitXrsyyZctqvAAAPRIA1kePBADY9EoWVixevDhr165NZWVlje2VlZWZP39+rcccf/zxufjii3PQQQelefPm2W233TJgwID3vQ3U2LFj065du+pX165d6/VzAMCWSo8EgNrpkQAAm17JH7BdFw8++GAuu+yy/OAHP8jMmTNz11135d57780ll1yy3mNGjx6dpUuXVr9eeeWVTVgxAGy+9EgAqJ0eCQCw6TUr1YU7dOiQpk2bZsGCBTW2L1iwIJ06dar1mPPPPz9f/vKX85WvfCVJ0qtXr6xYsSJf/epXc95556VJk3Wzl/Ly8pSXl9f/BwCALZweCQC10yMBADa9kq2saNGiRfr27ZspU6ZUb6uqqsqUKVPSv3//Wo9566231gkkmjZtmiQpiqLhigUAAAAAABpMyVZWJMmoUaMybNiw9OvXL/vvv3/Gjx+fFStWZPjw4UmSoUOHpkuXLhk7dmyS5Kijjsq4ceOy77775oADDsjf/va3nH/++TnqqKOqQwsAAAAAAGDLUtKwYvDgwVm0aFEuuOCCzJ8/P3369MnkyZOrH7o9d+7cGispvv3tb6esrCzf/va38+qrr6Zjx4456qijcumll5bqIwAAAAAAABuprNjK7p+0bNmytGvXLkuXLk3btm1LXQ4AbDb0SAConR4JW7ZJjy4vdQmN2hH7tSl1CUAjUbJnVgAAAAAAACTCCgAAAAAAoMSEFQAAAAAAQEkJKwAAAAAAgJISVgAAAAAAACUlrAAAAAAAAEpKWAEAAAAAAJSUsAIAAAAAACgpYQUAAAAAAFBSwgoAAAAAAKCkhBUAAAAAAEBJCSsAAAAAAICSElYAAAAAAAAlJawAAAAAAABKqlmpCwAAAOrHpEeXl7qERuuI/dqUugQAAGjUrKwAAAAAAABKarMIKyZMmJBu3bqloqIiBxxwQKZPn77esQMGDEhZWdk6ryOPPHITVgwAAAAAANSXkocVt912W0aNGpUxY8Zk5syZ6d27dwYNGpSFCxfWOv6uu+7KvHnzql/PPPNMmjZtmi9+8YubuHIAAAAAAKA+lPyZFePGjcvIkSMzfPjwJMl1112Xe++9NxMnTsy55567zvjtttuuxvtbb701rVq1Wm9YsXLlyqxcubL6/bJly+qxegDYcumRAFA7PRIAYNMr6cqKVatWZcaMGRk4cGD1tiZNmmTgwIGZNm3aBp3jpptuype+9KW0bt261v1jx45Nu3btql9du3atl9oBYEunRwJA7fRIAIBNr6RhxeLFi7N27dpUVlbW2F5ZWZn58+d/4PHTp0/PM888k6985SvrHTN69OgsXbq0+vXKK69sdN0A0BjokQBQOz0SAGDTK/ltoDbGTTfdlF69emX//fdf75jy8vKUl5dvwqoAYMugRwJA7fRIAIBNr6QrKzp06JCmTZtmwYIFNbYvWLAgnTp1et9jV6xYkVtvvTUnnXRSQ5YIAAAAAAA0sJKGFS1atEjfvn0zZcqU6m1VVVWZMmVK+vfv/77H3n777Vm5cmVOOOGEhi4TAAAAAABoQCW/DdSoUaMybNiw9OvXL/vvv3/Gjx+fFStWZPjw4UmSoUOHpkuXLhk7dmyN42666aYcc8wx2X777UtRNgAAAAAAUE9KHlYMHjw4ixYtygUXXJD58+enT58+mTx5cvVDt+fOnZsmTWouAJkzZ04efvjh/O53vytFyQAAAAAAQD3aqLBi5cqV9fLQsVNPPTWnnnpqrfsefPDBdbb16NEjRVFs9HUBAAAAAIDSq9MzK+67774MGzYsu+66a5o3b55WrVqlbdu2OeSQQ3LppZfmn//8Z0PVCQAAAAAANFIbFFbcfffd6d69e0aMGJFmzZrlnHPOyV133ZX7778/N954Yw455JD84Q9/yK677pqTTz45ixYtaui6AQAAAACARmKDbgN15ZVX5uqrr85nP/vZdZ4fkSTHHntskuTVV1/N97///fz85z/PmWeeWb+VAgAAAAAAjdIGhRXTpk3boJN16dIll19++UYVBAAAAAAAbF3q9MyK2qxduzZPPPFE3njjjfqoBwAAAAAA2MrUOaw444wzctNNNyV5N6g45JBD8rGPfSxdu3bNgw8+WN/1AQAAAAAAjVydw4o77rgjvXv3TpL85je/yYsvvpjZs2fnzDPPzHnnnVfvBQIAAAAAAI1bncOKxYsXp1OnTkmSSZMm5Ytf/GK6d++eESNG5Omnn673AgEAAAAAgMatzmFFZWVlnn322axduzaTJ0/OYYcdliR566230rRp03ovEAAAAAAAaNya1fWA4cOH59hjj03nzp1TVlaWgQMHJkkeeeSR7LnnnvVeIAAAAAAA0LjVOay48MILs/fee+eVV17JF7/4xZSXlydJmjZtmnPPPbfeCwQAAAAAABq3OocVSfKFL3xhnW3Dhg3b6GIAAAAAAICtzwaFFd/73vc2+ISnnXbahy4GAAAAAADY+mxQWHH11VfXeL9o0aK89dZbad++fZJkyZIladWqVXbYYQdhBQAAAAAAUCdNNmTQiy++WP269NJL06dPn8yaNSuvv/56Xn/99cyaNSsf+9jHcskllzR0vQAAAAAAQCOzQWHFvzv//PPz/e9/Pz169Kje1qNHj1x99dX59re/Xa/FAQAAAAAAjV+dw4p58+ZlzZo162xfu3ZtFixYUC9FAQAAAAAAW486hxWHHnpovva1r2XmzJnV22bMmJH//M//zMCBA+u1OAAAAAAAoPGrc1gxceLEdOrUKf369Ut5eXnKy8uz//77p7KyMjfeeGND1AgAAAAAADRidQ4rOnbsmEmTJmX27Nm5/fbbc/vtt2fWrFmZNGlSdthhhzoXMGHChHTr1i0VFRU54IADMn369Pcdv2TJkpxyyinp3LlzysvL071790yaNKnO1wUAAAAAADYPzT7sgd27d0/37t036uK33XZbRo0aleuuuy4HHHBAxo8fn0GDBmXOnDm1Bh+rVq3KYYcdlh122CF33HFHunTpkpdffjnt27ffqDoAAAAAAIDSqXNYsXbt2tx8882ZMmVKFi5cmKqqqhr7//jHP27wucaNG5eRI0dm+PDhSZLrrrsu9957byZOnJhzzz13nfETJ07M66+/nj//+c9p3rx5kqRbt251/QgAAAAAAMBmpM5hxemnn56bb745Rx55ZPbee++UlZV9qAuvWrUqM2bMyOjRo6u3NWnSJAMHDsy0adNqPeaee+5J//79c8opp+TXv/51OnbsmOOPPz7nnHNOmjZtWusxK1euzMqVK6vfL1u27EPVCwCNjR4JALXTIwEANr06hxW33npr/ud//idHHHHERl148eLFWbt2bSorK2tsr6yszOzZs2s95u9//3v++Mc/ZsiQIZk0aVL+9re/5etf/3pWr16dMWPG1HrM2LFjc9FFF21UrQDQGOmRAFA7PRIAYNOr8wO2W7Rokd13370havlAVVVV2WGHHXLDDTekb9++GTx4cM4777xcd9116z1m9OjRWbp0afXrlVde2YQVA8DmS48EgNrpkQAAm16dV1acddZZueaaa3Lttdd+6FtAJUmHDh3StGnTLFiwoMb2BQsWpFOnTrUe07lz5zRv3rzGLZ8++tGPZv78+Vm1alVatGixzjHl5eUpLy//0HUCQGOlRwJA7fRIAIBNr85hxcMPP5wHHngg9913X3r27Fn9oOv33HXXXRt0nhYtWqRv376ZMmVKjjnmmCTvrpyYMmVKTj311FqP+cQnPpFf/OIXqaqqSpMm7y4Kee6559K5c+dagwoAAAAAAGDzV+ewon379vn85z9fLxcfNWpUhg0bln79+mX//ffP+PHjs2LFigwfPjxJMnTo0HTp0iVjx45Nkvznf/5nrr322px++un5xje+keeffz6XXXZZTjvttHqpBwAAAAAA2PTqHFb8+Mc/rreLDx48OIsWLcoFF1yQ+fPnp0+fPpk8eXL1Q7fnzp1bvYIiSbp27Zr7778/Z555ZvbZZ5906dIlp59+es4555x6qwkAAAAAANi0yoqiKD7MgYsWLcqcOXOSJD169EjHjh3rtbCGsmzZsrRr1y5Lly5N27ZtS10OAGw29EjY8k16dHmpS2i0jtivTalLoIT0SNiy6Y8NS48E6kuTDx5S04oVKzJixIh07tw5Bx98cA4++ODsuOOOOemkk/LWW281RI0AAAAAAEAjVuewYtSoUXnooYfym9/8JkuWLMmSJUvy61//Og899FDOOuushqgRAAAAAABoxOr8zIo777wzd9xxRwYMGFC97YgjjkjLli1z7LHH5oc//GF91gcAAAAAADRydV5Z8dZbb1U/APvf7bDDDm4DBQAAAAAA1Fmdw4r+/ftnzJgxeeedd6q3vf3227nooovSv3//ei0OAAAAAABo/Op8G6hrrrkmgwYNyk477ZTevXsnSZ588slUVFTk/vvvr/cCAQAAAACAxq3OYcXee++d559/Prfccktmz56dJDnuuOMyZMiQtGzZst4LBAAAAAAAGrc6hxVJ0qpVq4wcObK+awEAAAAAALZCdX5mxdixYzNx4sR1tk+cODFXXHFFvRQFAAAAAABsPeocVlx//fXZc88919nes2fPXHfddfVSFAAAAAAAsPWoc1gxf/78dO7ceZ3tHTt2zLx58+qlKAAAAAAAYOtR57Cia9eumTp16jrbp06dmh133LFeigIAAAAAALYedX7A9siRI3PGGWdk9erV+fSnP50kmTJlSr71rW/lrLPOqvcCAQAAAACAxq3OYcXZZ5+d1157LV//+tezatWqJElFRUXOOeecjB49ut4LBAAAAAAAGrc6hxVlZWW54oorcv7552fWrFlp2bJl9thjj5SXlzdEfQAAAAAAQCNX52dWvGf+/Pl5/fXXs9tuu6W8vDxFUdRnXQAAAAAAwFaizmHFa6+9lkMPPTTdu3fPEUcckXnz5iVJTjrpJM+sAAAAAAAA6qzOYcWZZ56Z5s2bZ+7cuWnVqlX19sGDB2fy5Mn1WhwAAAAAAND41fmZFb/73e9y//33Z6eddqqxfY899sjLL79cb4UBAAAAAABbhzqvrFixYkWNFRXvef311z1kGwAAAAAAqLM6hxWf/OQn89Of/rT6fVlZWaqqqnLllVfmU5/6VL0WBwAAAAAANH51vg3UlVdemUMPPTSPPfZYVq1alW9961v561//mtdffz1Tp05tiBoBAAAAAIBGrM4rK/bee+8899xzOeigg/K5z30uK1asyH/8x3/k8ccfz2677dYQNQIAAAAAAI1YnVdWJEm7du1y3nnn1XctAAAAAADAVqjOKysmT56chx9+uPr9hAkT0qdPnxx//PF544036rU4AAAAAACg8atzWHH22Wdn2bJlSZKnn346o0aNyhFHHJEXX3wxo0aNqvcCAQAAAACAxq3OYcWLL76YvfbaK0ly55135qijjspll12WCRMm5L777vtQRUyYMCHdunVLRUVFDjjggEyfPn29Y2+++eaUlZXVeFVUVHyo6wIAAAAAAKVX57CiRYsWeeutt5Ikf/jDH3L44YcnSbbbbrvqFRd1cdttt2XUqFEZM2ZMZs6cmd69e2fQoEFZuHDheo9p27Zt5s2bV/16+eWX63xdAAAAAABg81DnsOKggw7KqFGjcskll2T69Ok58sgjkyTPPfdcdtpppzoXMG7cuIwcOTLDhw/PXnvtleuuuy6tWrXKxIkT13tMWVlZOnXqVP2qrKys83UBAAAAAIDNQ53DimuvvTbNmjXLHXfckR/+8Ifp0qVLkuS+++7LZz7zmTqda9WqVZkxY0YGDhz4r4KaNMnAgQMzbdq09R63fPny7LLLLunatWs+97nP5a9//et6x65cuTLLli2r8QIA9EgAWB89EgBg02tW1wN23nnn/Pa3v11n+9VXX13niy9evDhr165dZ2VEZWVlZs+eXesxPXr0yMSJE7PPPvtk6dKl+e///u8ceOCB+etf/1rryo6xY8fmoosuqnNtANDY6ZEAUDs9EgBg06vzyopS69+/f4YOHZo+ffrkkEMOyV133ZWOHTvm+uuvr3X86NGjs3Tp0urXK6+8sokrBoDNkx4JALXTIwEANr06r6yoTx06dEjTpk2zYMGCGtsXLFiQTp06bdA5mjdvnn333Td/+9vfat1fXl6e8vLyja4VABobPRIAaqdHAgBseiVdWdGiRYv07ds3U6ZMqd5WVVWVKVOmpH///ht0jrVr1+bpp59O586dG6pMAAAAAACgAZV0ZUWSjBo1KsOGDUu/fv2y//77Z/z48VmxYkWGDx+eJBk6dGi6dOmSsWPHJkkuvvjifPzjH8/uu++eJUuW5KqrrsrLL7+cr3zlK6X8GAAAAAAAwIdU8rBi8ODBWbRoUS644ILMnz8/ffr0yeTJk6sfuj137tw0afKvBSBvvPFGRo4cmfnz52fbbbdN37598+c//zl77bVXqT4CAAAAAACwEcqKoijqcsDnP//5lJWVrXuisrJUVFRk9913z/HHH58ePXrUW5H1admyZWnXrl2WLl2atm3blrocANhs6JGw5Zv06PJSl9BoHbFfm1KXQAnpkbBl0x8blh4J1Jc6P7OiXbt2+eMf/5iZM2emrKwsZWVlefzxx/PHP/4xa9asyW233ZbevXtn6tSpDVEvAAAAAADQyNT5NlCdOnXK8ccfn2uvvbb69kxVVVU5/fTTs8022+TWW2/NySefnHPOOScPP/xwvRcMAAAAAAA0LnVeWXHTTTfljDPOqPEciSZNmuQb3/hGbrjhhpSVleXUU0/NM888U6+FAgAAAAAAjVOdw4o1a9Zk9uzZ62yfPXt21q5dmySpqKio9bkWAAAAAAAA/1edbwP15S9/OSeddFL+67/+K/vtt1+S5NFHH81ll12WoUOHJkkeeuih9OzZs34rBQAAAAAAGqU6hxVXX311Kisrc+WVV2bBggVJksrKypx55pk555xzkiSHH354PvOZz9RvpQAAAAAAQKNU57CiadOmOe+883Leeedl2bJlSZK2bdvWGLPzzjvXT3UAAAAAAECjV+ew4j2LFi3KnDlzkiR77rlnOnToUG9FAQAAAAAAW486P2B7xYoVGTFiRDp37pyDDz44Bx98cDp37pyTTjopb731VkPUCAAAAAAANGJ1DitGjRqVhx56KL/5zW+yZMmSLFmyJL/+9a/z0EMP5ayzzmqIGgEAAAAAgEaszreBuvPOO3PHHXdkwIAB1duOOOKItGzZMscee2x++MMf1md9AAAAAABAI1fnlRVvvfVWKisr19m+ww47uA0UAAAAAABQZ3UOK/r3758xY8bknXfeqd729ttv56KLLkr//v3rtTgAAAAAAKDxq/NtoK655poMGjQoO+20U3r37p0kefLJJ1NRUZH777+/3gsEAAAAAAAatzqHFXvvvXeef/753HLLLZk9e3aS5LjjjsuQIUPSsmXLei8QAAAAAABo3OocViRJq1atMnLkyPquBQAAAAAA2AptUFhxzz33bPAJjz766A9dDAAAAAAAsPXZoLDimGOO2aCTlZWVZe3atRtTDwAAAAAAsJXZoLCiqqqqoesAAAAAAAC2Uk1KXQAAAAAAALB126Cw4tZbb93gE77yyiuZOnXqhy4IAAAAAADYumxQWPHDH/4wH/3oR3PllVdm1qxZ6+xfunRpJk2alOOPPz4f+9jH8tprr9V7oQAAAAAAQOO0Qc+seOihh3LPPffk+9//fkaPHp3WrVunsrIyFRUVeeONNzJ//vx06NAhJ554Yp555plUVlY2dN0AAAAAAEAjsUFhRZIcffTROfroo7N48eI8/PDDefnll/P222+nQ4cO2XfffbPvvvumSROPwAAA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hhtuqB7z5z//Occdd1xOOumkPP744znmmGNyzDHH5Jlnnmm4Dw8NZEuaVxtSC2yttqS5DFuKLWle6ZGwflvSXIYtxZY0r/RIIAU0sCTF3XffXf2+qqqq6NSpU3HVVVdVb1uyZElRXl5e/PKXvyyKoiieffbZIknx6KOPVo+57777irKysuLVV18tiqIofvCDHxTbbrttsXLlyuox55xzTtGjR4/q98cee2xx5JFH1qjngAMOKL72ta/V62eETW1znlcbUgvwrs15LsOWanOeV3okbLjNeS7Dlmpznld6JFAURWFlBZvciy++mPnz52fgwIHV29q1a5cDDjgg06ZNS5JMmzYt7du3T79+/arHDBw4ME2aNMkjjzxSPebggw9OixYtqscMGjQoc+bMyRtvvFE95t+v896Y964DjcXmNK82pBagdpvTXIbGYnOaV3okfHib01yGxmJzmld6JJC4DRQlMH/+/CRJZWVlje2VlZXV++bPn58ddtihxv5mzZplu+22qzGmtnP8+zXWN+a9/dBYbE7zakNqAWq3Oc1laCw2p3mlR8KHtznNZWgsNqd5pUcCibACAAAAAAAoMWEFm1ynTp2SJAsWLKixfcGCBdX7OnXqlIULF9bYv2bNmrz++us1xtR2jn+/xvrGvLcfGovNaV5tSC1A7TanuQyNxeY0r/RI+PA2p7kMjcXmNK/0SCARVlACH/nIR9KpU6dMmTKletuyZcvyyCOPpH///kmS/v37Z8mSJZkxY0b1mD/+8Y+pqqrKAQccUD3mT3/6U1avXl095ve//3169OiRbbfdtnrMv1/nvTHvXQcai81pXm1ILUDtNqe5DI3F5jSv9Ej48DanuQyNxeY0r/RIIElS6id80zi9+eabxeOPP148/vjjRZJi3LhxxeOPP168/PLLRVEUxeWXX160b9+++PWvf1089dRTxec+97niIx/5SPH2229Xn+Mzn/lMse+++xaPPPJI8fDDDxd77LFHcdxxx1XvX7JkSVFZWVl8+ctfLp555pni1ltvLVq1alVcf/311WOmTp1aNGvWrPjv//7vYtasWcWYMWOK5s2bF08//fSm+82AerIlzasNqQW2VlvSXIYtxZY0r/RIWL8taS7DlmJLmld6JCCsoEE88MADRZJ1XsOGDSuKoiiqqqqK888/v6isrCzKy8uLQw89tJgzZ06Nc7z22mvFcccdV7Rp06Zo27ZtMXz48OLNN9+sMebJJ58sDjrooKK8vLzo0qVLcfnll69Ty//8z/8U3bt3L1q0aFH07NmzuPfeexvsc0ND2pLm1YbUAlurLWkuw5ZiS5pXeiSs35Y0l2FLsSXNKz0SKCuKomjYtRsAAAAAAADr55kVAAAAAABASQkrAAAAAACAkhJWAAAAAAAAJSWsAAAAAAAASkpYAQAAAAAAlJSwAgAAAAAAKClhBQAAAAAAUFLCCgAAAAAAoKSEFbAZeemll1JWVpYnnnii1KVUmz17dj7+8Y+noqIiffr02ejzdevWLePHj9/o82wuHnzwwZSVlWXJkiWlLgWgUdMjtzx6JMCmoUduefRIgNoJK+DfnHjiiSkrK8vll19eY/uvfvWrlJWVlaiq0hozZkxat26dOXPmZMqUKesd98orr2TEiBHZcccd06JFi+yyyy45/fTT89prr23CahvWgAEDcsYZZ9TYduCBB2bevHlp165daYoC2ET0yHXpkf+iRwJbMz1yXXrkv+iRABtOWAH/R0VFRa644oq88cYbpS6l3qxatepDH/vCCy/koIMOyi677JLtt9++1jF///vf069fvzz//PP55S9/mb/97W+57rrrMmXKlPTv3z+vv/76h77+xlq7dm2qqqoa7PwtWrRIp06dttp/hABbFz2yJj3y/emRwNZEj6xJj3x/eiRA7YQV8H8MHDgwnTp1ytixY9c75sILL1xnKev48ePTrVu36vcnnnhijjnmmFx22WWprKxM+/btc/HFF2fNmjU5++yzs91222WnnXbKj3/843XOP3v27Bx44IGpqKjI3nvvnYceeqjG/meeeSaf/exn06ZNm1RWVubLX/5yFi9eXL1/wIABOfXUU3PGGWekQ4cOGTRoUK2fo6qqKhdffHF22mmnlJeXp0+fPpk8eXL1/rKyssyYMSMXX3xxysrKcuGFF9Z6nlNOOSUtWrTI7373uxxyyCHZeeed89nPfjZ/+MMf8uqrr+a8886rMf7NN9/Mcccdl9atW6dLly6ZMGFC9b6iKHLhhRdm5513Tnl5eXbcccecdtpp1ftXrlyZb37zm+nSpUtat26dAw44IA8++GD1/ptvvjnt27fPPffck7322ivl5eW58cYbU1FRsc4S29NPPz2f/vSnkySvvfZajjvuuHTp0iWtWrVKr1698stf/rJ67IknnpiHHnoo11xzTcrKylJWVpaXXnqp1uW7d955Z3r27Jny8vJ069Yt3/3ud2tct1u3brnssssyYsSIbLPNNtl5551zww03VO9ftWpVTj311HTu3DkVFRXZZZdd3ve/R4BNRY/UI/VIgNrpkXqkHglQDwqg2rBhw4rPfe5zxV133VVUVFQUr7zySlEURXH33XcX/z5dxowZU/Tu3bvGsVdffXWxyy671DjXNttsU5xyyinF7Nmzi5tuuqlIUgwaNKi49NJLi+eee6645JJLiubNm1df58UXXyySFDvttFNxxx13FM8++2zxla98pdhmm22KxYsXF0VRFG+88UbRsWPHYvTo0cWsWbOKmTNnFocddljxqU99qvrahxxySNGmTZvi7LPPLmbPnl3Mnj271s87bty4om3btsUvf/nLYvbs2cW3vvWtonnz5sVzzz1XFEVRzJs3r+jZs2dx1llnFfPmzSvefPPNdc7x2muvFWVlZcVll11W6zVGjhxZbLvttkVVVVVRFEWxyy67FNtss00xduzYYs6cOcX3vve9omnTpsXvfve7oiiK4vbbby/atm1bTJo0qXj55ZeLRx55pLjhhhuqz/eVr3ylOPDAA4s//elPxd/+9rfiqquuKsrLy6tr/vGPf1w0b968OPDAA4upU6cWs2fPLpYvX15UVlYWN954Y/V51qxZU2PbP/7xj+Kqq64qHn/88eKFF16oruuRRx4piqIolixZUvTv378YOXJkMW/evGLevHnFmjVrigceeKBIUrzxxhtFURTFY489VjRp0qS4+OKLizlz5hQ//vGPi5YtWxY//vGPq6+9yy67FNttt10xYcKE4vnnny/Gjh1bNGnSpPrP6aqrriq6du1a/OlPfypeeuml4n//93+LX/ziF7X+/gJsKnqkHqlHAtROj9Qj9UiA+iGsgH/z3pfMoiiKj3/848WIESOKovjwXzJ32WWXYu3atdXbevToUXzyk5+sfr9mzZqidevWxS9/+cuiKP71JfPyyy+vHrN69epip512Kq644oqiKIrikksuKQ4//PAa137llVeKJMWcOXOKonj3S+a+++77gZ93xx13LC699NIa2/bbb7/i61//evX73r17F2PGjFnvOf7yl78USYq777671v3jxo0rkhQLFiwoiuLdL1if+cxnaowZPHhw8dnPfrYoiqL47ne/W3Tv3r1YtWrVOud6+eWXi6ZNmxavvvpqje2HHnpoMXr06KIo3v2SmaR44oknaow5/fTTi09/+tPV7++///6ivLy8+sthbY488sjirLPOqn5/yCGHFKeffnqNMf/3S+bxxx9fHHbYYTXGnH322cVee+1V/X6XXXYpTjjhhOr3VVVVxQ477FD88Ic/LIqiKL7xjW8Un/70p6u/mANsDvRIPfLf6ZEA/6JH6pH/To8E+PDcBgrW44orrshPfvKTzJo160Ofo2fPnmnS5F/TrLKyMr169ap+37Rp02y//fZZuHBhjeP69+9f/etmzZqlX79+1XU8+eSTeeCBB9KmTZvq15577pnk3fuCvqdv377vW9uyZcvyz3/+M5/4xCdqbP/EJz7xoT5zURQbPPbfP99779+75he/+MW8/fbb2XXXXTNy5MjcfffdWbNmTZLk6aefztq1a9O9e/can/+hhx6q8dlbtGiRffbZp8Y1hgwZkgcffDD//Oc/kyS33HJLjjzyyLRv3z7Ju/ckveSSS9KrV69st912adOmTe6///7MnTu3Tr8Ps2bNqvX39Pnnn8/atWurt/17fWVlZenUqVP1fwcnnnhinnjiifTo0SOnnXZafve739WpBoCGpkfWjR75Lj0S2BrokXWjR75LjwR4l7AC1uPggw/OoEGDMnr06HX2NWnSZJ0vVatXr15nXPPmzWu8Lysrq3VbXR7ctXz58hx11FF54oknaryef/75HHzwwdXjWrduvcHn3Bi77757ysrK1vvFdNasWdl2223TsWPHDTpf165dM2fOnPzgBz9Iy5Yt8/Wvfz0HH3xwVq9eneXLl6dp06aZMWNGjc8+a9asXHPNNdXnaNmy5ToPKttvv/2y22675dZbb83bb7+du+++O0OGDKnef9VVV+Waa67JOeeckwceeCBPPPFEBg0atFEPlXs/7/ffwcc+9rG8+OKLueSSS/L222/n2GOPzRe+8IUGqQPgw9AjN4we+eHokcCWTI/cMHrkh6NHAo1ds1IXAJuzyy+/PH369EmPHj1qbO/YsWPmz5+foiiqv8w88cQT9Xbdv/zlL9VfGNesWZMZM2bk1FNPTfLuF5A777wz3bp1S7NmH34Kt23bNjvuuGOmTp2aQw45pHr71KlTs//++2/webbffvscdthh+cEPfpAzzzwzLVu2rN43f/783HLLLRk6dGiNL31/+ctfapzjL3/5Sz760Y9Wv2/ZsmWOOuqoHHXUUTnllFOy55575umnn86+++6btWvXZuHChfnkJz9Z5888ZMiQ3HLLLdlpp53SpEmTHHnkkTU+9+c+97mccMIJSd59aNxzzz2Xvfbaq3pMixYtavxUS20++tGPZurUqTW2TZ06Nd27d0/Tpk03uNa2bdtm8ODBGTx4cL7whS/kM5/5TF5//fVst912G3wOgIakR34wPbImPRLYWuiRH0yPrEmPBHiXlRXwPnr16pUhQ4bke9/7Xo3tAwYMyKJFi3LllVfmhRdeyIQJE3LffffV23UnTJiQu+++O7Nnz84pp5ySN954IyNGjEiSnHLKKXn99ddz3HHH5dFHH80LL7yQ+++/P8OHD//AL0D/19lnn50rrrgit912W+bMmZNzzz03TzzxRE4//fQ6nefaa6/NypUrM2jQoPzpT3/KK6+8ksmTJ+ewww5Lly5dcumll9YYP3Xq1Fx55ZV57rnnMmHChNx+++3V17z55ptz00035Zlnnsnf//73/PznP0/Lli2zyy67pHv37hkyZEiGDh2au+66Ky+++GKmT5+esWPH5t577/3AOocMGZKZM2fm0ksvzRe+8IWUl5dX79tjjz3y+9//Pn/+858za9asfO1rX8uCBQtqHN+tW7c88sgjeemll7J48eJaf5LprLPOypQpU3LJJZfkueeey09+8pNce+21+eY3v7nBv5/jxo3LL3/5y8yePTvPPfdcbr/99nTq1Kl6qTHA5kCP3DB65L/okcDWQo/cMHrkv+iRAO8SVsAHuPjii9f5MvHRj340P/jBDzJhwoT07t0706dPr9OXiA9y+eWX5/LLL0/v3r3z8MMP55577kmHDh2SpPqnWNauXZvDDz88vXr1yhlnnJH27dvXuK/phjjttNMyatSonHXWWenVq1cmT56ce+65J3vssUedzrPHHnvksccey6677ppjjz02u+22W7761a/mU5/6VKZNm7bOT3GcddZZeeyxx7LvvvvmO9/5TsaNG5dBgwYlSdq3b58f/ehH+cQnPpF99tknf/jDH/Kb3/wm22+/fZLkxz/+cYYOHZqzzjorPXr0yDHHHJNHH300O++88wfWufvuu2f//ffPU089VWPpbpJ8+9vfzsc+9rEMGjQoAwYMSKdOnXLMMcfUGPPNb34zTZs2zV577ZWOHTvWeh/Sj33sY/mf//mf3Hrrrdl7771zwQUX5OKLL86JJ564wb+f22yzTa688sr069cv++23X1566aVMmjSpzn++AA1Nj/xgeuS/6JHA1kSP/GB65L/okQDvKivq8jQjAAAAAACAeiZeBQAAAAAASkpYAQAAAAAAlJSwAgAAAAAAKClhBQAAAAAAUFLCCgAAAAAAoKSEFQAAAAAAQEkJKwAAAAAAgJISVgAAAAAAACUlrAAAAAAAAEpKWAEAAAAAAJSUsAIAAAAAACip/x+UVQIB/WmVtwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_results(df, \"full_feols_timing\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:matplotlib.category:Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n", + "INFO:matplotlib.category:Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n" + ] + }, + { + "data": { + "image/png": "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P3funGndurWRZLp162amTJliEhISTKtWrczixYvNyZMnzfTp040kc++999rN25jLzyNjx441zZs3N6+88op5++23Tf/+/Y2Pj49p0qSJ3XHale344YcfNpLMgw8+aKZMmWLuu+8+2/swbNiwi8aTc8z4+OOPbe/rnXfeaUqWLJnrmJXXuLVq1TLh4eFm/PjxJiEhwZw6dcqpbd0YYzZs2GCsVqsJCwszo0ePNq+99popV66cqV+/fq7zGUmmZs2apkyZMmbEiBFm6tSpZuPGjU6/52+//baRZDp37mzeeustM2nSJPPoo4+aZ555xtbnwQcfNF5eXiYuLs7MmjXLjBkzxtx9993m/ffft/Vx5ZjqKIc6m3tc8cMPPxgPDw8zZMgQM3HiRCPJLFu2zOnxR48ebfz8/Gz5sXLlyg7Pp9544w0jyXz22WfGGGNOnjxpKleubGrVqmXOnj1r63fh+aEz696R06dPm5o1a5qiRYuagQMHmsmTJ5vmzZsbSWbixIm2flfyueNS57rOnC8bY8ypU6dMvXr1TOnSpc2QIUPMjBkzTExMjLFYLKZ///4XXc6cdXb+uaojOceFqKgo8+abb5p+/foZT09P07hxY7tldOXzyIXWrFljJJnevXubf/7556J99+3bZ8qVK2d8fX3NgAEDzIwZM8zLL79satasadsXfvzxR1O5cmUzePBg89Zbb5lXXnnF9ll03759tmk5OjfevHmzCQgIMLVq1TJjxowxU6ZMMS1atDAWi8V88sknF40NAK4VFCsAXBU6depkvL29ze7du21tv//+u/H09LT7YLZr1y7j6elpXnvtNbvxf/31V1OkSBG79pwvvj/88ENb29atW40k4+HhYfui0Bhjli9fnutk8NFHHzVly5Y1aWlpdvPq1q2bCQgIsH14OXfunMnIyLDrc/ToURMcHGx69epla8s54SxdurQ5cuSIrf2zzz4zkswXX3zh1Loy5t+T3AvjzZFXsaJMmTLm2LFjtvb4+HgjydSvX9/uxLt79+7Gy8vroh+wcj6M16xZ027ZJ02aZCSZX3/91Rjz7xefpUuXNo0bN7abx9y5c42kKy5WjBgxwhw6dMikpKSY//u//zONGze2+4LBGNeLFZLMd999Z2s7ePCgsVqtdl8Sfvzxx3l+8ZTXuqpTp47dh6bu3bsbi8Vi2rZtazd+RESE3fvnyjbvSPfu3U1QUJA5d+6cre3AgQPGw8PDvPLKK8aYf7dXR8UfZ5xfrFi1apWRZMaPH28bfqXFCklm1KhRtrajR48aHx8fY7FYzPz5823tOfv2+V9C5bzHDRs2tFv3r7/+ut0XCydOnDAlSpQwvXv3tospJSXFBAQE2LXnxDR48GCn1k+nTp2Ml5eXrZhozL9fhhYvXty0aNEi1/I78x6Eh4ebgICAi/YZP368kWQ+//xzY8x/6718+fJ2RdmPPvrISDKTJk0yxhizcePGXPvQhS7nODxjxgy7vunp6bn2K2P+fW8sFotdLji/+JUjOjraVKpUya6tdu3aDr9wuHCby8zMNEFBQaZOnTrmzJkztn5ffvmlkWSGDh1qa8t5v3P2lRw5hdoc/fv3N/7+/nb7mTNy3ncfHx/z999/29rXrl1rJJmBAwfa2rp3727KlStnsrKybG0bNmzIMxecL2c/PT8nGWPMvffea0qXLu1SzDn71Y8//mjXfmHuMebfbcLLy8s89thj5ujRo6Z8+fKmUaNGtnyQnZ1tqlataqKjo+2+lD59+rS5+eabzZ133mlru/AL5IvJa39ydNw/deqUqVKliqldu7Y5e/asad++vfH397fbBp09H8j5QvSjjz7KNX1nihXOzseYf7+k7tu3r1PL7ex0Z8+enesYniPn/Tl06JDDL/yvJI842sf/97//5crHzm7HmzZtMpJyfbGcU+h1pVhx4sQJExkZaQIDA+1+gHKpcStVqmS3XK5s63fffbfx9fW1+9Jy+/btpkiRIg6LFR4eHua3336za3f2Pb/nnnsu+WVwQEBArm3tfJdzTL0whzqTey5Hv379TNGiRY2fn5/p3r27S+PWrVvXPPTQQ7b/hwwZYgIDA3N9WZ2VlWVuv/12ExwcbNLS0mwF0AuPkReeHzqz7h3JOc6cXyzKzMw0ERERxs/Pz5bjr/Rzx8XOdZ09Xx45cqQpVqyY+eOPP+zGHzx4sPH09DR79uy5aAyXKlYcPHjQeHl5mbvuussuN06ZMsVIMrNnzzbGuP555ELZ2dm285ng4GDTvXt3M3XqVLs8kSMmJsZ4eHjkev9zpmOMMWfPnrWL15h/3y+r1Wp3vuHo3Lh169ambt26dp/TsrOzTbNmzUzVqlUvuhwAcK3gNlAA3C4rK0vLly9Xp06ddNNNN9naa9asqejoaLu+n3zyibKzs/XAAw8oLS3N9goJCVHVqlVz3XrJz89P3bp1s/1fvXp1lShRQjVr1rS7fUrO33/99ZckyRijRYsW6e6775Yxxm5e0dHRSk9Pt13+7unpabsPbXZ2to4cOaJz586pUaNGuS6Rl6SuXbuqZMmStv9zbl2UM++C0qVLFwUEBNj+z1nmhx9+WEWKFLFrz8zMvOgtRXLExsba3YP3wmX56aefdPjwYfXu3dtuHg899JDdOsiRlJQkY4zTyzRs2DCVKVNGISEhat68ubZs2aJx48apc+fOTk/jQrVq1bIthySVKVNG1atXv+L3JyYmxu6e7k2bNpUxRr169bLr17RpU+3du1fnzp2T5Po2f6GuXbvq4MGDdpfuL1y4UNnZ2bbnGfj4+MjLy0tJSUkOb4/krBYtWuiOO+7Q66+/rjNnzlz2dC50/sN0S5QooerVq6tYsWJ64IEHbO05+7aj9+nxxx+3W/dPPfWUihQpoiVLlkiSvv76ax07dkzdu3e3W8eenp5q2rSpw3X81FNPXTLurKwsrVixQp06dbK75VHZsmX14IMP6vvvv7fdGsQVJ06cUPHixS/aJ2f4hdOPiYmxG7dz584qW7asbV3kHCOWL1+e5+2BXN0mrVarYmNj7dpybnnw0Ucf2e3zCxYs0K233mqXC85/Bkp6errS0tIUGRmpv/7667JuD/LTTz/p4MGD6tOnj9193du3b68aNWroq6++yjXOk08+afd/8+bN7ba1EiVK6NSpU/r6669djkeSOnXqpPLly9v+b9KkiZo2bWp7X6R/37v9+/fbrd8PPvhAPj4+uv/++52aj6PlOHz48GVth86oU6eORowYoVmzZik6OlppaWl69913bflg06ZN2r59ux588EEdPnzYti2dOnVKrVu31nfffVegD+2WJF9fX82dO1dbtmxRixYt9NVXX2nChAm2bdCV84ElS5aobNmydjnI19dXjz/++CXjcGU+rnBluosWLVJgYKCefvrpXNNxdDvF811JHjl/Hz979qzS0tJ06623SpLDZb7Udpyz3zzzzDN2/QYMGOBSXOnp6brrrru0detWJSUlKTw83Olxe/ToYbdczm7rWVlZ+uabb9SpUyeVK1fONn6VKlXUtm1bh/OKjIxUrVq1bP+78p6XKFFCf//990VvC1SiRAmtXbtW+/fvdzj8co6pF+ZQZ3LP5XjttddUunRpeXh4aMKECU6P98svv+jXX39V9+7dbW055wjLly+36+vh4aG5c+fq5MmTatu2raZNm6b4+Hi72xk64sy6d2TJkiUKCQmxi61o0aJ65plndPLkyVy3/iyozx3OnC9//PHHat68uUqWLGm3HUZFRSkrK0vffffdFcXwzTffKDMzUwMGDLB7Jkzv3r3l7+9v2/Zc/TxyIYvFouXLl+vVV19VyZIl9b///U99+/ZVxYoV1bVrV9stp7Kzs7V48WLdfffdDt//nOOo1Wq1xZuVlaXDhw/Lz89P1atXv+hx/siRI/r222/1wAMP6MSJE7b1efjwYUVHR2v79u1OfX4DgKsdxQoAbnfo0CGdOXNGVatWzTWsevXqdv9v375dxhhVrVpVZcqUsXtt2bLF9gDOHBUqVMj1ATsgIEChoaG52iTZPmAfOnRIx44d09tvv51rPjlfup0/r3fffVf16tWTt7e3SpcurTJlyuirr75y+EXa+V/CSbKdJF/Jl8TOuHC+Oct8qXXhyjQvXJbdu3dL+vdD9vmKFCly0XvyO+vxxx/X119/rS+++EIDBw7UmTNnct1H3lUXLpP073Jd6fvjyvrPzs62bTuubvMXyrk39oIFC2xtCxYsUHh4uKpVqybp3w9NY8aM0dKlSxUcHKwWLVro9ddfV0pKisvLOXz4cKWkpGjGjBkuj+uIt7e37R7pOQICAvLctx29TxceW/z8/FS2bFnbfdS3b98uSWrVqlWudbxixYpc67hIkSKqUKHCJWM/dOiQTp8+nes4Jv1bjM3Ozr7kc0ccKV68uE6cOHHRPjnDLyxqXLguLBaLqlSpYlsXN998s+Li4jRr1iwFBgYqOjpaU6dOtTuWubpNli9f3uGDRbt27aq9e/cqOTlZ0r/3hF6/fn2uh4KvXr1aUVFRKlasmEqUKKEyZcrYHnB5OcWKnOOSo/elRo0atuE5HG2DFx4T+vTpo2rVqqlt27aqUKGCevXqZbtvvDMc5b9q1arZ3ev/zjvvVNmyZfXBBx9I+vdLkf/973+65557Llm8yuGO/DNo0CDVr19f69at07Bhw+y+VM3Z93r06JFrW5o1a5YyMjIu6z121W233aannnpK69atU3R0tF0R2ZXzgd27d6tKlSq5jk2OtrULuXre4SxXpvvnn3+qevXqdl/mOetK8siRI0fUv39/BQcHy8fHR2XKlNHNN98syfE+7sy5h4eHhypXrmzXz5n34XwDBgzQjz/+qG+++Ua1a9d2adyc+HM4u60fPHhQZ86cyXXeJOU+l8prXq685y+88IL8/PzUpEkTVa1aVX379s31DI3XX39dmzdvVmhoqJo0aaLhw4fbfSHt6jHVUQ51JvdcDn9/f1WvXl2hoaEKDg52erz3339fxYoVU6VKlbRjxw7t2LFD3t7eCgsLsx2Dz1e5cmUNHz5cP/74o2rXrq2XX375kvNwZt07snv3blWtWjXXA9tr1qxpG36+gjruO3O+vH37di1btizXdhgVFSXp8o5p58tr2/Py8lKlSpVsw/Pj84jVatWLL76oLVu2aP/+/frf//6nW2+9VR999JH69esn6d997/jx46pTp85Fp5Wdna0JEyaoatWqslqtCgwMVJkyZfTLL79cdJvfsWOHjDF6+eWXc63TnGexXOk6BYCrgetnogDgRtnZ2bJYLFq6dKk8PT1zDffz87P731Gfi7Xn/MI355ecDz/8sO1hoheqV6+epH8/0PTs2VOdOnXSoEGDFBQUJE9PTyUkJNg96NnZeReUy10XlzPNgl6WHFWrVrV94OnQoYM8PT01ePBg3XHHHbZfNOX1a9C8ihoFtUxXsi26ss1fyGq1qlOnTvr00081bdo0paamavXq1Ro1apRdvwEDBujuu+/W4sWLtXz5cr388stKSEjQt99+qwYNGjiziJL+vbqiZcuWev3113P9+lXKv/cjP9+nnP193rx5CgkJyTX8wi/uzv9FnDvUrFlTmzZt0p49exx+WSD9+6tQSXZfDDtr3Lhx6tmzpz777DOtWLFCzzzzjBISEvTDDz+oQoUKLm+T5/+6+Hx33323fH199dFHH6lZs2b66KOP5OHhYXuop/Tvl6etW7dWjRo1NH78eIWGhsrLy0tLlizRhAkTCvxX91Le29r5goKCtGnTJi1fvlxLly7V0qVLNWfOHMXExOR66OmVxPHggw9q5syZmjZtmlavXq39+/fr4YcfdmkajhTkMfuvv/6yfVH766+/2g3Lef/eeOONPH+1fqljXH7IyMiwXX32559/6vTp0/L19bWL0ZnzgStRUPMprPily88jDzzwgNasWaNBgwYpPDxcfn5+ys7OVps2bRzu44W1Hd9zzz2aP3++Ro8erffee8+l4/6Fxz1nt/WzZ8+6HGde83LmPa9Zs6a2bdumL7/8UsuWLdOiRYs0bdo0DR06VCNGjJD07/vTvHlzffrpp1qxYoXeeOMNjRkzRp988kmeV3tcTF459FK5p7AYY/S///1Pp06dcphDDx48qJMnT+Y6Nq1YsUKStH//fh0+fNjh+cT5nFn3+aGwz2vPn252drbuvPNOPf/88w775vxo5lpTtmxZdevWTffff79q166tjz76SHPnznV6/FGjRunll19Wr169NHLkSJUqVUoeHh4aMGDARc9rcoY999xzue4+kCOvoiYAXEsoVgBwuzJlysjHx8f2Zcb5tm3bZvd/5cqVZYzRzTffXKAnuGXKlFHx4sWVlZVl+zI8LwsXLlSlSpX0ySef2H0Rm/MLl4JwqdsxXC0qVqwo6d9fAt1xxx229nPnzmnXrl359gVJjhdffFEzZ87USy+9ZPtVc84vyI4dO6YSJUrY+l74yzNXFOb6z49tvmvXrnr33XeVmJioLVu2yBiT69frOfN69tln9eyzz2r79u0KDw/XuHHj9P7777s0v+HDh6tly5Z66623cg07//0435W8H5eyfft2u+3v5MmTOnDggNq1aydJtl/fBgUFXXJ/d0WZMmXk6+ub6zgmSVu3bpWHh0euK2uc0aFDB/3vf//Te++9p5deeinX8OPHj+uzzz5TjRo1cn1ovfA4a4zRjh07cu2LdevWVd26dfXSSy9pzZo1uu222zRjxgy9+uqr+XYcLlasmDp06KCPP/5Y48eP14IFC9S8eXO7W5988cUXysjI0Oeff25XmHF0ay5n98uc49K2bdvUqlUru2Hbtm2zDXeVl5eX7r77bt19993Kzs5Wnz599NZbb+nll1++5JcHjvLfH3/8kesXnzExMRo3bpy++OILLV26VGXKlMnzC4urQXZ2tnr27Cl/f38NGDBAo0aNUufOnXXfffdJ+m/f8/f3z9d9z1XDhg3Tli1bNHbsWL3wwgsaPHiwJk+eLMm184GKFStq8+bNMsbYbY+OjgEXcmU+rnBlupUrV9batWv1zz//2N0673yX2s9czSNHjx5VYmKiRowYoaFDh9raHe0TzqpYsaKys7NtV4rkcOZ9OF+nTp101113qWfPnipevLimT59+2TE5u60HBQXJ29tbO3bsyDXMUZsjrm5LxYoVU9euXdW1a1dlZmbqvvvu02uvvab4+HjbbZ3Kli2rPn36qE+fPjp48KBuueUWvfbaa2rbtm2+HlMvlnsKy6pVq/T333/rlVdesV2tkOPo0aN6/PHHtXjxYrtC8YwZM/T111/rtddeU0JCgp544gl99tlnl5yXM+v+QhUrVtQvv/yi7Oxsu6LP1q1bbcPzQ36c61auXFknT54ssOP7+dve+bfbzMzM1M6dO23zLajPI0WLFlW9evW0fft2paWlKSgoSP7+/tq8efNFx1u4cKHuuOMOvfPOO3btx44dU2BgYJ7j5Sxj0aJF3ZozAaCgcRsoAG7n6emp6OhoLV68WHv27LG1b9myJdd9Ye+77z55enpqxIgRuX4RZIzR4cOH8y2m+++/X4sWLXJ4wnno0CG7vjnzz7F27VrbrU0KQrFixSTl/sL3atOoUSOVLl1aM2fOtD2DQfr3PuuOLj/fs2eP7cPW5ShRooSeeOIJLV++XJs2bZL03xcE598X99SpU1f0a+fCXP/5sc1HRUWpVKlSWrBggRYsWKAmTZrY3Tbi9OnTuX7NWblyZRUvXlwZGRkuxxwZGamWLVtqzJgxuaZbsWJFeXp65rpP8bRp01yej7Pefvtt/fPPP7b/p0+frnPnztl+ERodHS1/f3+NGjXKrl+O8/d3V3h6euquu+7SZ599Znc7n9TUVH344Ye6/fbb5e/v7/J0O3furFq1amn06NH66aef7IZlZ2frqaee0tGjRx0WTN977z27W0gtXLhQBw4csK2L48eP2+2r0r9fHnl4eNi2hfw8Dnft2lX79+/XrFmz9PPPP+cqojk6vqanp2vOnDm5plWsWDGn9slGjRopKChIM2bMsNu+ly5dqi1btqh9+/ZOx5/jwmX28PCwffnhzD60ePFiu/tMr1u3TmvXrs31q+V69eqpXr16mjVrlhYtWqRu3bpd1i17Csv48eO1Zs0avf322xo5cqSaNWump556SmlpaZKkhg0bqnLlyho7dqxOnjyZa/zL3fdcsXbtWo0dO1YDBgzQs88+q0GDBmnKlCm2+767cj7Qrl077d+/XwsXLrS1nT59Wm+//fYl43BlPq5wZbr333+/0tLSNGXKlFz9cvbBnCtOLtzXLjePONrHJWnixIl5L9Ql5Ow3OQWnK5lmTEyMJk+erBkzZuiFF1647Jic3dY9PT0VFRWlxYsX2z0jYseOHVq6dKlT83LlPb/w2OXl5aVatWrJGKN//vlHWVlZuW5LExQUpHLlytne1/w4pjqTe6QrP090Rs4toAYNGqTOnTvbvXr37q2qVava3Qpq586dGjRokO6//34NGTJEY8eO1eeff6733nvvovO51LrPS7t27ZSSkmJ3e89z587pzTfflJ+fnyIjIy9zye3lx7nuAw88oOTk5Fyf53Kme+F77qqoqCh5eXlp8uTJdseQd955R+np6bZtz9XPIxfavn273WfU85chOTlZJUuWVJkyZeTh4aFOnTrpiy++yHV+Jv13nPP09Mx1zPv4448v+byJoKAg24+BDhw4kGt4YeRMACgMV++nGwA3lBEjRmjZsmVq3ry5+vTpYzvprl27tu12JtK/H3xfffVVxcfHa9euXerUqZOKFy+unTt36tNPP9Xjjz+u5557Ll9iGj16tFauXKmmTZuqd+/eqlWrlo4cOaINGzbom2++0ZEjRyT9+yvnTz75RPfee6/at2+vnTt3asaMGapVq5bDD6T5oXLlyipRooRmzJih4sWLq1ixYmratGmu+xa7m5eXl4YPH66nn35arVq10gMPPKBdu3Zp7ty5qly5cq5fbcXExGjVqlVXdGl6//79NXHiRI0ePVrz58/XXXfdpZtuukmPPvqoBg0aJE9PT82ePVtlypRx+MHDGeHh4fL09NSYMWOUnp4uq9WqVq1aKSgo6LLjzkt+bPNFixbVfffdp/nz5+vUqVMaO3as3fA//vhDrVu31gMPPKBatWqpSJEi+vTTT5Wammr3gHpXDBs2zO7XazkCAgLUpUsXvfnmm7JYLKpcubK+/PLLAr3HbmZmpm35tm3bpmnTpun2229Xx44dJf37S9fp06frkUce0S233KJu3brZto+vvvpKt912m8Mv75zx6quv6uuvv9btt9+uPn36qEiRInrrrbeUkZGh119//bKm6eXlpYULF6p169a6/fbbFRsbq0aNGunYsWP68MMPtWHDBj377LMO37tSpUrZxklNTdXEiRNVpUoV9e7dW5L07bffql+/furSpYuqVaumc+fOad68ebYvv6T8PQ63a9dOxYsX13PPPWc3jxx33XWX7YqFJ554QidPntTMmTMVFBSU64N6w4YNNX36dL366quqUqWKgoKCcv3KV/p3fxgzZoxiY2MVGRmp7t27KzU1VZMmTVJYWJgGDhzoVOzne+yxx3TkyBG1atVKFSpU0O7du/Xmm28qPDw81y9zHalSpYpuv/12PfXUU8rIyNDEiRNVunRph7fOiImJsa1fV24BVdi2bNmil19+WT179tTdd98tSZo7d67Cw8PVp08f222/Zs2apbZt26p27dqKjY1V+fLltW/fPq1cuVL+/v764osvCizGs2fPqkePHqpatapee+01Sf+ej3zxxReKjY3Vr7/+qmLFijl9PtC7d29NmTJFMTExWr9+vcqWLat58+bZvuC/FGfn4ypnpxsTE6P33ntPcXFxWrdunZo3b65Tp07pm2++UZ8+fXTPPffIx8dHtWrV0oIFC1StWjWVKlVKderU0blz5y4rj/j7+9ueb/HPP/+ofPnyWrFihXbu3HlZyyr9m6O7d++uadOmKT09Xc2aNVNiYqLTVyZcqF+/fjp+/LhefPFFBQQE2J6Z4wpXtvXhw4drxYoVtmepZGVlacqUKapTp47thxiX4ux7ftdddykkJES33XabgoODtWXLFk2ZMkXt27dX8eLFdezYMVWoUEGdO3dW/fr15efnp2+++UY//vijxo0bJyl/jqnO5B4pf84TLyYjI0OLFi3SnXfemeeVDR07dtSkSZN08OBBlSlTRr169ZKPj4/typsnnnhCixYtUv/+/RUVFWV3teD5LrXu8/L444/rrbfeUs+ePbV+/XqFhYVp4cKFWr16tSZOnOj0M4wuJT/OdQcNGqTPP/9cHTp0UM+ePdWwYUOdOnVKv/76qxYuXKhdu3Zd9EoC6d8v4B1dWXPzzTfroYceUnx8vEaMGKE2bdqoY8eOtvO8xo0b23Kkq59HLvTzzz/rwQcfVNu2bdW8eXOVKlVK+/bt07vvvqv9+/dr4sSJtsLrqFGjtGLFCkVGRurxxx9XzZo1deDAAX388cf6/vvvVaJECXXo0EGvvPKKYmNj1axZM/3666/64IMP7K4OycvUqVN1++23q27duurdu7cqVaqk1NRUJScn6++//9bPP/98yWkAwFXPAMBVYtWqVaZhw4bGy8vLVKpUycyYMcMMGzbMODpULVq0yNx+++2mWLFiplixYqZGjRqmb9++Ztu2bbY+kZGRpnbt2rnGrVixomnfvn2udkmmb9++dm2pqammb9++JjQ01BQtWtSEhISY1q1bm7ffftvWJzs724waNcpUrFjRWK1W06BBA/Pll1+aHj16mIoVK9r67dy500gyb7zxhsN5Dxs2zJnVZPPZZ5+ZWrVqmSJFihhJZs6cOcYY4/R8V65caSSZjz/+2K59zpw5RpL58ccfbW2RkZEmMjLykuPmzCsnlhyTJ0+2rZ8mTZqY1atXm4YNG5o2bdrY9YuMjHT4fl/oYuvSGGN69uxpPD09zY4dO4wxxqxfv940bdrUeHl5mZtuusmMHz/etpw7d+60jZfXtnHh8htjzMyZM02lSpWMp6enkWRWrlzpsK8r69kYY9vmDx06ZNfuzDZ/MV9//bWRZCwWi9m7d6/dsLS0NNO3b19To0YNU6xYMRMQEGCaNm1qPvroo0tON694jfnv/bxwnR46dMjcf//9xtfX15QsWdI88cQTZvPmzbm2nR49ephixYo5nK4z+3bOOl61apV5/PHHTcmSJY2fn5956KGHzOHDh3ONv3LlShMdHW0CAgKMt7e3qVy5sunZs6f56aefLhnTxWzYsMFER0cbPz8/4+vra+644w6zZs0auz6X2qYdOXjwoImLizNVqlQxVqvVlChRwkRFRZnPP//c4bJJMv/73/9MfHy8CQoKMj4+PqZ9+/Zm9+7dtn5//fWX6dWrl6lcubLx9vY2pUqVMnfccYf55ptvck3zSo7D53vooYeMJBMVFeVw+Oeff27q1atnvL29TVhYmBkzZoyZPXt2rv03JSXFtG/f3hQvXtxIsu2HOcues4/mWLBggWnQoIGxWq2mVKlS5qGHHjJ///23XZ+83u8Lc9PChQvNXXfdZYKCgmzHmSeeeMIcOHDgost+/vs+btw4ExoaaqxWq2nevLn5+eefHY5z4MAB4+npaapVq3bRaTuK98L91NFx8FLyOnadn3vOnTtnGjdubCpUqGCOHTtm12/SpElGklmwYIGtbePGjea+++4zpUuXNlar1VSsWNE88MADJjEx0dYnr2OpI3ntTxcu78CBA42np6dZu3atXb+ffvrJFClSxDz11FO2NmfOB4wxZvfu3aZjx47G19fXBAYGmv79+5tly5Y53AYdcXY+js5ZLnYccXa6p0+fNi+++KK5+eabbf06d+5s/vzzT1ufNWvW2M7Xcs5friSP/P333+bee+81JUqUMAEBAaZLly5m//79uc6NXNmOz5w5Y5555hlTunRpU6xYMXP33XebvXv3OnW+lde29vzz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uMaPH69p06Z5+xw8eFD33nuvXnvtNbndbiUmJmrWrFkaOHCgJGnatGlasWKFMjMz9fDDD2v37t2qq6v7xb+3Y8eOKTMzUy+++KJat26tO+64Qw899JBMJpMk6cUXX9Ts2bO1c+dOtW3bVr/5zW+Ul5fn8/vyTz75RJMnT9Y777wjj8ej+Ph4LVy4UD169Djhfh988IGuuuoq3XvvvZo8eXKDn+uee+7Rgw8+qAMHDujKK6/UggULdMYZZzTo3/5kGL6yIjc3V+PGjVNGRob69eun/Px8RUZGqqCgwG//2bNna/jw4Zo0aZL69u2rGTNmaNCgQZo7d26IIwcAAAAAAACA09ekSZO0fv16vfbaa3r77bdVWFioLVu2eM9nZmaqqKhIS5Ys0UcffaS0tDQNHz5cX3zxhbfP4cOHNWfOHC1ZskSrV69WYWGhrr32Wq1cuVIrV67Uiy++qGeeeUbLly9v8HV/+OEHJSQk6M0339T27dt122236ZZbbjnhjT6LFi1S27ZttXHjRj3++ON66KGHtGbNGu/5tLQ0lZeXa9WqVSouLtagQYN0+eWXa//+/d4+X375pV555RW9+uqr2rZtW4P+3hYtWqRWrVpp06ZNmj17tnJzc/Xss896zx89elQzZszQhx9+qBUrVmjXrl269dZbvef37Nmjyy67TBaLRWvXrlVxcbHGjBmjY8eOnXCvtWvX6re//a0efvhhTZ48ucHP9dVXX2nFihV644039MYbb2j9+vV69NFHved/6d/+ZBi6sqKmpkbFxcXKysrytpnNZiUnJ6uoqMjvmKKiIjkcDp+2lJQUrVixwm9/t9stt9vt/VxVVXXqgQMA0AKQIwEA8I8cCQDALzt06JCee+45vfTSS7r88ssl/feX8GeffbYkqaSkRM8//7xKSkrUtWtXSdK9996r1atX6/nnn9cjjzwi6b+/mH/66ae9KwKuu+46vfjiiyorK1O7du3Ur18//frXv9a6des0cuTIBl23W7duPt/0//Of/6y33npL//jHPzR48GBv+4ABA5SdnS1J6tmzp+bOnSun06nf/va3evfdd7Vp0yaVl5fLYrFIkp588kmtWLFCy5cv12233Sbpv7/jfuGFF9SpU6cG/93FxMRo1qxZMplM6t27tz7++GPNmjVL48aNkySNGTPG27d79+6aM2eOLrroIh06dEjt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UlNTg3ptAEDDkSMDQ44EgNMHOTIw5EgAaJkoVgAtwF133aWEhARZLJZ6f0D76KOPdOmllyoiIkIxMTF6/PHHQxukH1VVVcrMzNTkyZO1Z88e3Xbbbbr33nvldDqDeh+Hw6H4+Hh98803jfZD86uvvqorrrhCHTt2lMlk0rZt2xrlPgCAwJAjf15j58ijR49q8uTJ6t+/v9q2bauuXbsqPT1d3377bdDvBQAIDDny54Xi/yOnTZumPn36qG3btjrzzDOVnJysjRs3Nsq9AKA5oFgBtBBjxozRyJEj/Z6rqqrSFVdcoXPPPVfFxcV64oknNG3aNM2fPz/EUfoqKSnR0aNHNWLECHXp0kWRkZFq166dOnbsGNT7fPXVV/rNb36js88+Wx06dAjqtY+rrq7WJZdcoscee6xRrg8AOHnkyPo1do48fPiwtmzZogcffFBbtmzRq6++qp07d+qaa64J+r0AAIEjR9YvFP8f2atXL82dO1cff/yx3n33XcXGxuqKK67Qvn37GuV+AFqOlrQi76coVgCN7M0331RUVJRefvnlRrvHnDlzdOedd6p79+5+z7/88suqqalRQUGBLrjgAt1www266667lJube0r3LSwslMlkktPpVGJioiIjIzVkyBDt3LnzF8cuXLhQ/fv3lyR1795dJpNJu3bt8lm++8MPP+iCCy7Qbbfd5h331Vdf6YwzzlBBQYEkqa6uTjk5OTrvvPPUpk0bDRw4UMuXL5ck7dq1SyaTSd99953GjBkjk8nUaN+IueWWWzR16lQlJyc3yvUBoCUiR/rXknJkVFSU1qxZo+uvv169e/fWxRdfrLlz56q4uFglJSVBvx8AtBTkSP9aUo6UpBtvvFHJycnq3r27LrjgAuXm5qqqqkofffRRo9wPaG6+cy4J6QHjUawAGtHixYs1atQovfzyy7rpppvq7deuXbufPcaPH39KcRQVFemyyy5TeHi4ty0lJUU7d+7UgQMHTunakvTAAw9o5syZ2rx5s1q1aqUxY8b84piRI0fq3//+tyRp06ZN2rt3r2JiYnz6RERE6OWXX9aiRYv02muvqba2VjfffLN++9vfeu+Rk5OjF154Qfn5+frkk09099136+abb9b69esVExOjvXv3qn379srLy9PevXvr/dbQ+PHjf/HfAQAQPOTI+rX0HFlZWSmTydRo31IFgOaOHFm/lpwja2pqNH/+fEVFRWngwIENHgcALUkrowMAWqp58+bpgQce0Ouvv66hQ4f+bN9f2t+gffv2pxSLy+XSeeed59NmtVq9584888xTuv7DDz/sfcb77rtPI0aM0A8//KCIiIh6x7Rp08a7TLdTp06y2Wx++8XHx+uvf/2r/vjHP+qGG27Q7t279cYbb0iS3G63HnnkEf373/+W3W6X9N9v17z77rt65plnNHToUNlsNplMJkVFRdV7D0l66KGHdO+9957U8wMAAkOOPH1z5A8//KDJkydr1KhRp/xvBwAtETny9MuRb7zxhm644QYdPnxYXbp00Zo1axQdHX1K1wQQOsOGDdOAAQMUERGhZ599VuHh4Ro/frymTZumXbt26bzzztPWrVu9q78OHjyoM888U+vWrdOwYcNUWFioX//611q9erXuu+8+7dixQ3a7XUuWLFFxcbEcDof27Nmj3/3ud3r22WcVGRnpvfexY8eUmZmpF198Ua1bt9Ydd9yhhx56SCaTSZL04osvavbs2dq5c6fatm2r3/zmN8rLy1Pnzp2N+KtqEIoVQCNYvny5ysvL9d577+miiy76xf7nn39+CKJqPAMGDPD+uUuXLpKk8vJynXPOOUG5/j333KMVK1Zo7ty5WrVqlfeH0y+//FKHDx/Wb3/7W5/+NTU1uvDCCwO6R+fOnZv0f6wBoKUgR56+OfLo0aO6/vrr5fF49PTTT5/y9QCgpSFHnp458te//rW2bdumiooKLViwQNdff702btzI/58CzciiRYvkcDi0ceNGFRUV6dZbb9WvfvUr9ezZs8HXmDZtmubOnavIyEhdf/31uv7662WxWLR48WIdOnRI1157rZ566ilNnjzZ575jx47Vpk2btHnzZt12220655xzNG7cOEn//fl7xowZ6t27t8rLy+VwOHTrrbdq5cqVQf87CBaKFUAjuPDCC7VlyxYVFBQoMTHRW9Gszy8tDb355puVn59/0vHYbDaVlZX5tB3//HPfEmmo1q1be/98/Fnr6upO+brHlZeX6/PPP1dYWJi++OILDR8+XJJ06NAhSf99n2u3bt18xlgsloDuMX78eL300ks/2+f4/QAAJ48ceXrmyOOFit27d2vt2rWsqgAAP8iRp2eObNu2rc4//3ydf/75uvjii9WzZ08999xzysrKCigWAMYZMGCAsrOzJUk9e/bU3Llz5XQ6AypW/PWvf9WvfvUrSdLYsWOVlZWlr776yruv0HXXXad169b5FCtiYmI0a9YsmUwm9e7dWx9//LFmzZrlLVb89PV63bt315w5c3TRRRfp0KFDTfZ15xQrgEbQo0cPzZw5U8OGDVNYWJjmzp37s/0be/mu3W7XAw88oKNHj3p/IFyzZo169+59ykt3Q2HMmDHq37+/xo4dq3Hjxik5OVl9+/ZVv379ZLFYVFJS8otLpH8Jr4ECgNAgRwZXc8iRxwsVX3zxhdatW+f9ZisAwBc5MriaQ470p66uTm63O6jXBNC4frpSTPrvarHy8vKTvobValVkZKS3UHG8bdOmTT5jLr74Yp/Ctt1u18yZM1VbW6uwsDAVFxdr2rRp+vDDD3XgwAFvQbikpET9+vULKL5QoVgBNJJevXp53z/XqlUr5eXl1dv3VJfvfvnllzp06JBcLpeOHDni/aG1X79+Cg8P14033qjp06dr7Nixmjx5srZv367Zs2dr1qxZp3TfUJg3b56Kior00UcfKSYmRm+++aZuuukmvf/++zrjjDN077336u6771ZdXZ0uueQSVVZW6r333lP79u01evToBt/nVJfv7t+/XyUlJfr2228lSTt37pT0328cBeNbRwDQkpAjg6M55MijR4/quuuu05YtW/TGG2+otrZWLpdLknTWWWf5bNoKACBHBktzyJHV1dV6+OGHdc0116hLly6qqKjQvHnztGfPHqWlpZ3UNQEY46crxaT/rharq6uT2WyWJHk8Hu+5o0eP/uI1TCZTvddsqOrqaqWkpCglJUUvv/yyOnXqpJKSEqWkpKimpqbB1wk1ihVAI+rdu7fWrl3r/WbMzJkzG+U+f/zjH7V+/Xrv5+Pv2fzmm28UGxurqKgovf3227rzzjuVkJCg6OhoTZ06VbfddlujxBMsO3bs0KRJk/Tcc88pJiZGkvS3v/1NAwYM0IMPPqjHHntMM2bMUKdOnZSTk6Ovv/5aHTp00KBBg3T//feHNNZ//etfysjI8H6+4YYbJEnZ2dmaNm1aSGMBgOaAHHlqmkuO3LNnj/71r39JkndTweOO/zIOAOCLHHlqmkuODAsL044dO7Ro0SJVVFSoY8eOuuiii/T//t//0wUXXBCyOAA0nk6dOkmS9u7d6/1v7C+tigvExo0bfT6///776tmzp/e/L999950effRR738LN2/eHLR7NxaT56elHQD4iWHDhunWW2/VrbfeanQoAAA0KeRIAAD8I0cCCJbvnEtCer+Ol98Q8Jhhw4YpPj7eZyVcamqqOnTooIULF8put6t169Z65plnVF5err/85S/atGmT94s7hYWF+vWvf60DBw6oQ4cOkqSFCxdq4sSJOnjwoPea06ZN04oVK7zFjmHDhqm4uFjjxo3T7bffri1btmjcuHGaOXOmbr/9du3bt09nn322JkyYoPHjx2v79u2aNGmSPv/8c23duvWELxI1FWajAwAAAAAAAAAAoKUpKCjQsWPHlJCQoIkTJ+qvf/1r0K6dnp6uI0eOaPDgwbrzzjs1YcIE7+q3Tp06aeHChVq2bJn69eunRx99VE8++WTQ7t1YWFkBoF6n+o2YCy64QLt37/Z77plnntFNN910CtEBAGAcciQAAP6RIwEAJ4s9KwDU69Zbbz2lZWErV66sd+Mgq9V60tcFAMBo5EgAAPwjRwIAThYrKwAAAAAAAAAAgKHYswIAAAAAAAAAABjqtCtWeDweVVVViQUlAAD4IkcCAOAfORIAAKDxnXbFiu+//15RUVH6/vvvjQ4FAIAmhRwJAIB/5EgAAIDGd9oVKwAAAAAAAAAAQNNCsQIAAAAAAAAAABiKYgUAAAAAAAAAADAUxQoAAAAAAAAAAGAoihUAAAAAAAAAAMBQFCsAAAAAAAAAAIChKFYAAAAAAAAAAABDUawAAAAAAAAAAACGolgBAAAAAAAAAAAMZXixYt68eYqNjVVERISSkpK0adOmevsePXpUDz30kHr06KGIiAgNHDhQq1evDmG0AAAAAAAAAAAg2AwtVixdulQOh0PZ2dnasmWLBg4cqJSUFJWXl/vtP2XKFD3zzDN66qmn9Omnn2r8+PG69tprtXXr1hBHDgAAAAAAAAAAgsXk8Xg8Rt08KSlJF110kebOnStJqqurU0xMjP785z/rvvvuO6F/165d9cADD+jOO+/0tv3hD39QmzZt9NJLLzXonlVVVYqKilJlZaXat28fnAcBAKAFIEcCAOAfORIAAKDxtTLqxjU1NSouLlZWVpa3zWw2Kzk5WUVFRX7HuN1uRURE+LS1adNG7777br33cbvdcrvd3s9VVVWnGDkAAC0DORIAAP/IkQAAAKFnWLGioqJCtbW1slqtPu1Wq1U7duzwOyYlJUW5ubm67LLL1KNHDzmdTr366quqra2t9z45OTmaPn16UGMHAKAlIEcCAOAfORJoWVZ+cMjoEFq0qy5qZ3QIAFoIw14D9e2336pbt27asGGD7Ha7t/0vf/mL1q9fr40bN54wZt++fRo3bpxef/11mUwm9ejRQ8nJySooKNCRI0f83sffN2JiYmJYvgsAOO2RI4GWh1/GNB5+EXN6IUcCLQv5sXGRIwEEi2ErK6KjoxUWFqbnn39eo0aNksvl0sCBAxUdHS2bzeZ3TKdOnTRs2DB98sknKi0tVXV1tTZu3Kjzzjuv3vtYLBZZLJbGegwABuAHzcbDD5mnF3IkAAD+kSMBAABCz2zUjcPDwxUbG6vnnntO2dnZ2rJliwYMGKBVq1apf//+fscsXrxY9913n6ZPn64dO3Zo/vz52rZtm9q145drAAAAAAAAAAA0V4atrDjOZDLJbDbLZDLJZDJJko6/mSo9PV3dunVTTk6OJOnVV19Vz549dfHFF6u0tFQzZ85Uu3btZDbXX3NhYzQAAPwjRwIA4B85EgAAIPQMW1lRU1OjXbt2acyYMZo6dari4+P14Ycfavjw4dq+fbskqaSkRHv37vWO6du3rz799FP17dtX1157rdq3b6/o6Ghdc8019d4nJydHUVFR3iMmJqbRnw0AgOaAHAkAgH/kSAAAgNBrVhtsS9KcOXN07733yuPx6NixYxo/fryefvrpeu/DxmhAy8OeFY2HPStOL+RIoOUhRzYecuTphRwJtCzkx8ZFjgQQLIa/BioQhYWFeuSRR/S3v/1NSUlJ+vLLLzVhwgTNmDFDDz74oN8xbIwGAIB/5EgAAPwjRwIAAISeYcWK6OhohYWFqaysTPPmzdMTTzwhl8uldu3aqV+/fn7HPPjgg2rdurXGjRvn0z516lQVFRVp5cqVoQgdAAAAAAAAAAAEkWF7VoSHhyshIUH5+flyOBzKzs7W5s2b9cMPP+iDDz5QeXn5CWMOHz6sa6+9Vnv37vUejz/+uCTpuuuuC/UjAAAAAAAAAACAIDCsWCFJDodDb7/9ti699FJdfPHFeuqpp9S6dWtFRUWpoKBA6enpysrK8va/+uqrtXDhQhUWFurIkSP6+OOP9fjjj6tVq1YaOXKkgU8CAAAAAAAAAABOlqF7Vlx77bWSpI8++kjx8fGKj4/X6tWr9be//U1FRUWqrKyU2fxjPWXKlCkymUyaMmWK9uzZo06dOqmurk433nij2rZt6/ce/jZGAwAA5EgAAOpDjgQAAAg9Q1dWVFRUyOPx6LXXXpPb7dbGjRuVlJQkq9Uql8ulwsJCLVy40Nu/VatWys7O1pdffqkjR45o+fLl2r9/v+68885675GTk6OoqCjvERMTE4InAwCg6SNHAgDgHzkSAAAg9AwtVpyq5557Tv3799fgwYPr7ZOVlaXKykrvUVpaGsIIAQBousiRAAD4R44EAAAIPUNfAxUdHa2wsDCVlZX5tJeVlclms/3s2Orqai1ZskQPPfTQz/azWCyyWCynHCsAAC0NORIAAP/IkQAAAKFn6MqK8PBwnX322UpPT1dERISSkpL0/vvvy+l0ym63+x1z8OBB3Xnnneratauqqqo0Z84crVy5MsSRAwAAAAAAAACAYDF0ZcXSpUv1n//8RyaTSdOnT9fWrVs1dOhQtWnTRhkZGZKk9PR0devWTTk5OaqpqdFvf/tbde7cWbGxsTrnnHN07733qkOHDkY+BgAAAAAAAAAAOAWGFityc3M1fvx49enTR0888YRcLpc8Ho9uvPFGWa1WSVJJSYnM5v8uACkoKND+/fv1/PPPq3///nryySc1dOhQIx8BAAAAAAAAAACcIsOKFTU1NSouLlZWVpZSU1OVmZkpSRo9erT27Nnj7VdYWOj987/+9S/Z7XbNmTNHnTt31t13360bb7xRkydPVlhYmN/7uN1uud1u7+eqqqrGeSAAAJoZciQAAP6RIwEAAELPsD0rKioqVFtb611BcZzVapXL5fI75uuvv9by5ctVW1urlStX6sEHH9TMmTP117/+td775OTkKCoqynvExMQE9TkAAGiuyJEAAPhHjgQAAAg9QzfYDlRdXZ06d+6s+fPnKyEhQSNHjtQDDzyg/Pz8esdkZWWpsrLSe5SWloYwYgAAmi5yJAAA/pEjAQAAQs+w10BFR0crLCxMZWVlPu1lZWWy2Wx+x3Tp0kWtW7f2eeVT37595XK5VFNTo/Dw8BPGWCwWWSyW4AYPAEALQI4EAMA/ciQAAEDoGbayIjw8XAkJCXI6nd62uro6OZ1O2e12v2N+9atf6csvv1RdXZ237fPPP1eXLl38FioAAAAAAAAAAEDTZ+hroBwOhxYsWKBFixbps88+0x133KHq6mplZGRIktLT05WVleXtf8cdd2j//v2aMGGCPv/8c7355pt65JFHdOeddxr1CAAAAAAAAAAA4BQZ9hooSRo5cqT27dunu+++WwcOHJDJZFLfvn21e/duWa1WlZSUyGz+sZ4SExOju+66Sw8//LDmzp3rbX/ooYf0wAMPGPEIAAAAAAAAAADgFBlarJCkTp06qbq6WgUFBUpKSlJeXp5SUlK0c+dOFRYWntD//PPPV/v27bVz505vm8lkCmHEAAAAAAAAAAAgmAwvVuTm5mrcuHHeVz/l5+frzTffVEFBge677z6/Y0wmU72bcP8vt9stt9vt/VxVVXXqQQMA0AKQIwEA8I8cCQAAEHqG7llRU1Oj4uJiJScne9vMZrOSk5NVVFRU77hDhw7p3HPPVUxMjH7/+9/rk08+qbdvTk6OoqKivEdMTExQnwEAgOaKHAkAgH/kSAAAgNAztFhRUVGh2tpaWa1Wn3ar1SqXy+V3TO/evVVQUKDXXntNL730kurq6jRkyBD95z//8ds/KytLlZWV3qO0tDTozwEAQHNEjgQAwD9yJAAAQOgZ/hqoQNntdtntdu/nIUOGqG/fvnrmmWc0Y8aME/pbLBZZLJZQhggAQLNAjgQAwD9yJAAAQOgZurIiOjpaYWFhKisr82kvKytr8J4UrVu31oUXXqgvv/yyMUIEAAAAAAAAAACNzNBiRXh4uBISEuR0Or1tdXV1cjqdPqsnfk5tba0+/vhjdenSpbHCBAAAAAAAAAAAjcjw10A5HA6NHj1aiYmJGjx4sPLy8lRdXa2MjAxJUnp6urp166acnBxJ0kMPPaSLL75Y559/vg4ePKgnnnhCu3fv1h//+EcjHwMAAAAAAAAAAJwkw4sVI0eO1L59+zR16lS5XC7Fx8dr9erV3k23S0pKZDb/uADkwIEDGjdunFwul84880wlJCRow4YN6tevn1GPAAAAAAAAAAAAToHhxQpJMplM3uP45+MKCwt9+s6aNUuzZs2SJC1ZskSjRo1S69attWLFilCFCwAAAAAAAAAAgsjQPSskaenSpXI4HMrOztaWLVs0cOBApaSkqLy8/GfH7dq1S/fee68uvfTSEEUKAAAAAAAAAAAag+HFitzcXI0bN04ZGRnq16+f8vPzFRkZqYKCgnrH1NbW6qabbtL06dPVvXv3EEYLAAAAAAAAAACCzdBiRU1NjYqLi5WcnOxtM5vNSk5OVlFRUb3jHnroIXXu3Fljx479xXu43W5VVVX5HAAAgBwJAEB9yJEAAAChZ2ixoqKiQrW1td7NtI+zWq1yuVx+x7z77rt67rnntGDBggbdIycnR1FRUd4jJibmlOMGAKAlIEcCAOAfORIAACD0DH8NVCC+//573XLLLVqwYIGio6MbNCYrK0uVlZXeo7S0tJGjBACgeSBHAgDgHzkSAAAg9FoZefPo6GiFhYWprKzMp72srEw2m+2E/l999ZV27dqlq6++2ttWV1cnSWrVqpV27typHj16+IyxWCyyWCyNED0AAM0bORIAAP/IkQAAAKFn6MqK8PBwJSQkyOl0etvq6urkdDplt9tP6N+nTx99/PHH2rZtm/e45ppr9Otf/1rbtm1jaS4AAAAAAAAAAM2QoSsrJMnhcGj06NFKTEzU4MGDlZeXp+rqamVkZEiS0tPT1a1bN+Xk5CgiIkJxcXE+4zt06CBJJ7QDAAAAAAAAAIDmwfBixciRI7Vv3z5NnTpVLpdL8fHxWr16tXfT7ZKSEpnNzWprDQAAAAAAAAAAEADDixWSlJmZqczMTL/nCgsLf3bswoULgx8QAAAAAAAAAAAIGZYsAAAAAAAAAAAAQ1GsAAAAAAAAAAAAhqJYAQAAAAAAAAAADNUkihXz5s1TbGysIiIilJSUpE2bNtXb99VXX1ViYqI6dOigtm3bKj4+Xi+++GIIowUAAAAAAAAAAMFkeLFi6dKlcjgcys7O1pYtWzRw4EClpKSovLzcb/+zzjpLDzzwgIqKivTRRx8pIyNDGRkZeuutt0IcOQAAAAAAAAAACAbDixW5ubkaN26cMjIy1K9fP+Xn5ysyMlIFBQV++w8bNkzXXnut+vbtqx49emjChAkaMGCA3n33Xb/93W63qqqqfA4AAECOBACgPuRIAACA0DO0WFFTU6Pi4mIlJyd728xms5KTk1VUVPSL4z0ej5xOp3bu3KnLLrvMb5+cnBxFRUV5j5iYmKDFDwBAc0aOBADAP3IkAABA6BlarKioqFBtba2sVqtPu9VqlcvlqndcZWWl2rVrp/DwcI0YMUJPPfWUfvvb3/rtm5WVpcrKSu9RWloa1GcAAKC5IkcCAOAfORIAACD0WhkdwMk444wztG3bNh06dEhOp1MOh0Pdu3fXsGHDTuhrsVhksVhCHyQAAE0cORIAAP/IkQAAAKFnaLEiOjpaYWFhKisr82kvKyuTzWard5zZbNb5558vSYqPj9dnn32mnJwcv8UKAAAAAAAAAADQtBn6Gqjw8HAlJCTI6XR62+rq6uR0OmW32xt8nbq6Ornd7sYIEQAAAAAAAAAANDLDXwPlcDg0evRoJSYmavDgwcrLy1N1dbUyMjIkSenp6erWrZtycnIk/Xejs8TERPXo0UNut1srV67Uiy++qKefftrIxwAAAAAAAAAAACfJ8GLFyJEjtW/fPk2dOlUul0vx8fFavXq1d9PtkpISmc0/LgCprq7Wn/70J/3nP/9RmzZt1KdPH7300ksaOXKkUY8AAAAAAAAAAABOgcnj8XiMDiKUqqqqFBUVpcrKSrVv397ocACchJUfHDI6hBbrqovaGR0CDESOBJo/cmTjIUee3siRQPNGfmxc5EgAwWLonhUAAAAAAAAAAAAUKwAAAAAAAAAAgKEoVgAAAAAAAAAAAENRrAAAAAAAAAAAAIaiWAEAAAAAAAAAAAxFsQIAAAAAAAAAABiKYgUAAAAAAAAAADDUKRUr3G53UIKYN2+eYmNjFRERoaSkJG3atKnevgsWLNCll16qM888U2eeeaaSk5N/tj8AAAAAAAAAAGjaAipWrFq1SqNHj1b37t3VunVrRUZGqn379ho6dKgefvhhffvttwEHsHTpUjkcDmVnZ2vLli0aOHCgUlJSVF5e7rd/YWGhRo0apXXr1qmoqEgxMTG64oortGfPnoDvDQAAAAAAAAAAjNegYsU///lP9erVS2PGjFGrVq00efJkvfrqq3rrrbf07LPPaujQofr3v/+t7t27a/z48dq3b1+DA8jNzdW4ceOUkZGhfv36KT8/X5GRkSooKPDb/+WXX9af/vQnxcfHq0+fPnr22WdVV1cnp9PZ4HsCAAAAAAAAAICmo1VDOj3++OOaNWuWrrzySpnNJ9Y3rr/+eknSnj179NRTT+mll17S3Xff/YvXrampUXFxsbKysrxtZrNZycnJKioqatADHD58WEePHtVZZ53l97zb7fZ5XVVVVVWDrgsAQEtHjgQAwD9yJAAAQOg1qFjR0MJBt27d9Oijjzb45hUVFaqtrZXVavVpt1qt2rFjR4OuMXnyZHXt2lXJycl+z+fk5Gj69OkNjgkAgNMFORIAAP/IkQAAAKF3ShtsS1Jtba22bdumAwcOBCOegDz66KNasmSJ/vnPfyoiIsJvn6ysLFVWVnqP0tLSEEcJAEDTRI4EAMA/ciQAAEDoNWhlxU9NnDhR/fv319ixY1VbW6uhQ4dqw4YNioyM1BtvvKFhw4Y1+FrR0dEKCwtTWVmZT3tZWZlsNtvPjn3yySf16KOP6t///rcGDBhQbz+LxSKLxdLgmAAAOF2QIwEA8I8cCQAAEHoBr6xYvny5Bg4cKEl6/fXX9c0332jHjh26++679cADDwR0rfDwcCUkJPhsjn18s2y73V7vuMcff1wzZszQ6tWrlZiYGOgjAAAAAAAAAACAJiTgYkVFRYV31cPKlSuVlpamXr16acyYMfr4448DDsDhcGjBggVatGiRPvvsM91xxx2qrq5WRkaGJCk9Pd1nA+7HHntMDz74oAoKChQbGyuXyyWXy6VDhw4FfG8AAAAAAAAAAGC8gF8DZbVa9emnn6pLly5avXq1nn76aUnS4cOHFRYWFnAAI0eO1L59+zR16lS5XC7Fx8dr9erV3k23S0pKZDb/WFN5+umnVVNTo+uuu87nOtnZ2Zo2bVrA9wcAAAAAAAAAAMYKuFiRkZGh66+/Xl26dJHJZFJycrIkaePGjerTp89JBZGZmanMzEy/5woLC30+79q166TuAQAAAAAAAAAAmqaAixXTpk1TXFycSktLlZaW5t10LCwsTPfdd1/QAwQAAAAAAAAAAC1bwMUKSSe8gkmSRo8efcrBAAAAAAAAAACA00+DihVz5sxp8AXvuuuukw4GAAAAAAAAAACcfhpUrJg1a5bP53379unw4cPq0KGDJOngwYOKjIxU586dKVYAAAAAAAAAAICAmBvS6ZtvvvEeDz/8sOLj4/XZZ59p//792r9/vz777DMNGjRIM2bMaOx4AQAAAAAAAABAC9OgYsVPPfjgg3rqqafUu3dvb1vv3r01a9YsTZkyJajBAQAAAAAAAACAli/gYsXevXt17NixE9pra2tVVlYWlKAAAAAAAAAAAMDpI+BixeWXX67bb79dW7Zs8bYVFxfrjjvuUHJyclCDAwAAAAAAAAAALV/AxYqCggLZbDYlJibKYrHIYrFo8ODBslqtevbZZxsjRgAAAAAAAAAA0IK1CnRAp06dtHLlSn3++efasWOHJKlPnz7q1atX0IMDAAAAAAAAAAAtX8DFiuN69epFgQIAAAAAAAAAAJyygIsVtbW1WrhwoZxOp8rLy1VXV+dzfu3atUELDgAAAAAAAAAAtHwBFysmTJighQsXasSIEYqLi5PJZGqMuAAAAAAAAAAAwGki4GLFkiVL9I9//ENXXXVVY8QDAAAAAAAAAABOM+ZAB4SHh+v8889vjFgAAAAAAAAAAMBpKOBixT333KPZs2fL4/E0RjwAAAAAAAAAAOA0E/BroN59912tW7dOq1at0gUXXKDWrVv7nH/11VeDFhwAAAAAAAAAAGj5Ai5WdOjQQddee21jxAIAAAAAAAAAAE5DARcrnn/++caIAwAAAAAAAAAAnKYCLlYct2/fPu3cuVOS1Lt3b3Xq1CloQQEAAAAAAAAAgNNHwBtsV1dXa8yYMerSpYsuu+wyXXbZZeratavGjh2rw4cPN0aMAAAAAAAAAACgBQu4WOFwOLR+/Xq9/vrrOnjwoA4ePKjXXntN69ev1z333NMYMQIAAAAAAAAAgBYs4NdAvfLKK1q+fLmGDRvmbbvqqqvUpk0bXX/99Xr66aeDGR8AAAAAAAAAAGjhAl5ZcfjwYVmt1hPaO3fuzGugAAAAAAAAAABAwAIuVtjtdmVnZ+uHH37wth05ckTTp0+X3W4PanAAAAAAAAAAAKDlC/g1ULNnz1ZKSorOPvtsDRw4UJL04YcfKiIiQm+99VbQAwQAAAAAAAAAAC1bwMWKuLg4ffHFF3r55Ze1Y8cOSdKoUaN00003qU2bNkEPEAAAAAAAAAAAtGwBvwZKkiIjIzVu3DjNnDlTM2fO1B//+MeTLlTMmzdPsbGxioiIUFJSkjZt2lRv308++UR/+MMfFBsbK5PJpLy8vJO6JwAAAAAAAAAAaDoCLlbk5OSooKDghPaCggI99thjAV1r6dKlcjgcys7O1pYtWzRw4EClpKSovLzcb//Dhw+re/fuevTRR2Wz2QINHQAAAAAAAAAANEEBvwbqmWee0eLFi09ov+CCC3TDDTdo8uTJDb5Wbm6uxo0bp4yMDElSfn6+3nzzTRUUFOi+++47of9FF12kiy66SJL8nvfH7XbL7XZ7P1dVVTU4PgAAWjJyJAAA/oUyR6784FCjXft0d9VF7YwOAQAABCDglRUul0tdunQ5ob1Tp07au3dvg69TU1Oj4uJiJScn/xiM2azk5GQVFRUFGla9cnJyFBUV5T1iYmKCdm0AAJozciQAAP6RIwEAAEIv4JUVMTExeu+993Teeef5tL/33nvq2rVrg69TUVGh2tpaWa1Wn3ar1erduDsYsrKy5HA4vJ+rqqoa7QdNvhHTuPhWDAAEVyhzJAAAzQk5EgAAIPQCLlaMGzdOEydO1NGjR/Wb3/xGkuR0OvWXv/xF99xzT8ABLF++XKNGjZLL5dLAgQPVq1evevt+8sknmjp1qoqLi7V7926tX79eEydO/NnrWywWWSyWgOMCAKClI0cCQMN951xidAgtVsfLbzA6hBOQIwEAAEIv4GLFpEmT9N133+lPf/qTampqJEkRERGaPHmysrKyGnyd6Ohomc1mzZkzR/Pnz1dSUpLy8vK0cOFCbxHkfx3fYDstLU033XRToKEDAAAAAAAAAIAmKOBihclk0mOPPaYHH3xQn332mdq0aaOePXsG/K2T8PBwtWnTRt27d/dusP23v/1Nzz33XL1jfrrB9s033xxo6ACAX8C3RhtXU/zmKAAAAAAAQFMQcLHiOJfLpf379+uyyy6TxWKRx+ORyWRq8PiamhodPnxYO3bs0KJFizR48GDl5eWpVatW8ng8kqT09HR169ZNOTk53jGffvqp9xqVlZXatm2b2rVrp/PPP9/vfdxut9xut/dzVVXVyTwuAAAtDjkSAAD/yJEAAAChF3Cx4rvvvtP111+vdevWyWQy6YsvvlD37t01duxYnXnmmZo5c2aDrlNRUSGPx6M///nPmjp1qlwul+Lj45WWlqYvvvhCklRSUiKz2ewd8+233+rCCy/0fl63bp0uvPBCDR06VIWFhX7vk5OTo+nTpwf6mAAAtHihzJErPzgUkvucjq66qJ3RIQBAi8P/RwIAAISe+Ze7+Lr77rvVunVrlZSUKDIy0ts+cuRIrV69OuAArrvuOu3evVtut1sbN25U165dvecKCwu1cOFC7+fY2Fh5PB55PB6de+65mjVrljweT72FCknKyspSZWWl9ygtLQ04RgAAWiJyJAAA/pEjAQAAQi/glRVvv/223nrrLZ199tk+7T179tTu3bsbfJ3o6GiFhYWprKzMp72srEw2my3QsOplsVgC3k8DAIDTATkSAAD/yJEAAAChF/DKiurqap8VFcft378/oB/mwsPDlZCQoFmzZik2NlYREREaPHiwVq1aJbvd7nfMJ598oj/84Q+KjY3V7t27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K2pqarRz504dO3bslAJwOBxasGCBFi1apM8++0x33HGHqqurlZGRIUlKT0/32YB7woQJWr16tWbOnKkdO3Zo2rRp2rx5szIzM08pDgAAAAAAAAAAYIyAixWHDx/W2LFjFRkZqQsuuEAlJSWSpD//+c969NFHAw5g5MiRevLJJzV16lTFx8dr27ZtWr16tXcT7ZKSEu3du9fbf8iQIVq8eLHmz5+vgQMHavny5VqxYoXi4uICvjcAAAAAAAAAADBewMWKrKwsffjhhyosLFRERIS3PTk5WUuXLj2pIDIzM7V792653W5t3LhRSUlJ3nOFhYVauHChT/+0tDTt3LlTbrdb27dv11VXXXVS9wUAAAAAAAAAAMYLeIPtFStWaOnSpbr44otlMpm87RdccIG++uqroAYHAAAAAAAAAABavoBXVuzbt0+dO3c+ob26utqneAEAAAAAAAAAANAQARcrEhMT9eabb3o/Hy9QPPvss7Lb7cGLDAAAAAAAAAAAnBYCfg3UI488oiuvvFKffvqpjh07ptmzZ+vTTz/Vhg0btH79+saIEQAAAAAAAAAAtGABr6y45JJLtG3bNh07dkz9+/fX22+/rc6dO6uoqEgJCQmNESMAAAAAAAAAAGjBAl5ZIUk9evTQggULgh0LAAAAAAAAAAA4DZ1UsUKSysvLVV5errq6Op/2AQMGnHJQAAAAAAAAAADg9BFwsaK4uFijR4/WZ599Jo/H43POZDKptrY2aMEBAAAAAAAAAICWL+A9K8aMGaNevXppw4YN+vrrr/XNN994j6+//vqkgpg3b55iY2MVERGhpKQkbdq06Wf7L1u2TH369FFERIT69++vlStXntR9AQAAAAAAAACA8QJeWfH111/rlVde0fnnnx+UAJYuXSqHw6H8/HwlJSUpLy9PKSkp2rlzpzp37nxC/w0bNmjUqFHKycnR7373Oy1evFipqanasmWL4uLighITAAAAAAAAAAAInYBXVlx++eX68MMPgxZAbm6uxo0bp4yMDPXr10/5+fmKjIxUQUGB3/6zZ8/W8OHDNWnSJPXt21czZszQoEGDNHfu3KDFBAAAAAAAAAAAQifglRXPPvusRo8ere3btysuLk6tW7f2OX/NNdc0+Fo1NTUqLi5WVlaWt81sNis5OVlFRUV+xxQVFcnhcPi0paSkaMWKFX77u91uud1u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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_results(df, \"demean_timing\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "docs", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/benchmarks/gpu_big_benchmarks.ipynb b/benchmarks/gpu_big_benchmarks.ipynb new file mode 100644 index 000000000..890854c41 --- /dev/null +++ b/benchmarks/gpu_big_benchmarks.ipynb @@ -0,0 +1,1465 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `PyFixest` on professional-tier GPUs \n", + "\n", + "We test two back-ends for the iterative alternating-projections component of the fixed-effects regression on an Nvidia A100 GPU with 40 GB VRAM (a GPU that one typically wouldn't have installed to play graphics-intensive videogames on consumer hardware). `numba` benchmarks are run on a 12-core xeon CPU. \n", + "\n", + "The Jax backend exhibits major performance improvements over numba in large problems. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:32:45.604971Z", + "iopub.status.busy": "2025-01-12T17:32:45.604766Z", + "iopub.status.idle": "2025-01-12T17:32:46.391541Z", + "shell.execute_reply": "2025-01-12T17:32:46.390991Z", + "shell.execute_reply.started": "2025-01-12T17:32:45.604955Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[CudaDevice(id=0)]" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "\n", + "jax.devices()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:32:46.392674Z", + "iopub.status.busy": "2025-01-12T17:32:46.392347Z", + "iopub.status.idle": "2025-01-12T17:32:46.986455Z", + "shell.execute_reply": "2025-01-12T17:32:46.985981Z", + "shell.execute_reply.started": "2025-01-12T17:32:46.392647Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{CudaDevice(id=0)}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "jnp.ones(10).devices()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When jax is configured on a GPU-equipped machine, arrays are created on the GPU by default." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:32:46.987285Z", + "iopub.status.busy": "2025-01-12T17:32:46.987118Z", + "iopub.status.idle": "2025-01-12T17:32:47.542600Z", + "shell.execute_reply": "2025-01-12T17:32:47.542006Z", + "shell.execute_reply.started": "2025-01-12T17:32:46.987271Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sun Jan 12 15:23:01 2025 \n", + "+---------------------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 535.183.01 Driver Version: 535.183.01 CUDA Version: 12.2 |\n", + "|-----------------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|=========================================+======================+======================|\n", + "| 0 NVIDIA A100-SXM4-40GB On | 00000000:90:1C.0 Off | 0 |\n", + "| N/A 43C P0 79W / 400W | 30812MiB / 40960MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-----------------------------------------+----------------------+----------------------+\n", + " \n", + "+---------------------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=======================================================================================|\n", + "+---------------------------------------------------------------------------------------+\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/root/miniconda3/envs/jaxgpu/lib/python3.11/pty.py:89: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.\n", + " pid, fd = os.forkpty()\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jax pre-allocates 75% VRAM" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:32:47.543813Z", + "iopub.status.busy": "2025-01-12T17:32:47.543552Z", + "iopub.status.idle": "2025-01-12T17:32:48.268402Z", + "shell.execute_reply": "2025-01-12T17:32:48.267956Z", + "shell.execute_reply.started": "2025-01-12T17:32:47.543792Z" + }, + "id": "fHzEldNvR2_K" + }, + "outputs": [], + "source": [ + "import time\n", + "from itertools import product\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "from scipy.stats import nbinom\n", + "from tqdm import tqdm\n", + "\n", + "np.random.seed(42)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:32:48.269845Z", + "iopub.status.busy": "2025-01-12T17:32:48.269573Z", + "iopub.status.idle": "2025-01-12T17:32:48.686679Z", + "shell.execute_reply": "2025-01-12T17:32:48.686264Z", + "shell.execute_reply.started": "2025-01-12T17:32:48.269828Z" + }, + "id": "fHzEldNvR2_K" + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pyfixest as pf\n", + "from pyfixest.estimation.demean_ import demean\n", + "from pyfixest.estimation.demean_jax_ import demean_jax" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-01-12T17:32:48.687648Z", + "iopub.status.busy": "2025-01-12T17:32:48.687350Z", + "iopub.status.idle": "2025-01-12T17:32:48.807466Z", + "shell.execute_reply": "2025-01-12T17:32:48.807065Z", + "shell.execute_reply.started": "2025-01-12T17:32:48.687633Z" + }, + "id": "XQjP2889YJxs", + "outputId": "3e686d7b-0774-4bb5-c1b9-28e5b9f286a9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "seaborn : 0.13.2\n", + "tqdm : 4.67.1\n", + "numpy : 2.0.2\n", + "pyfixest : 0.27.0\n", + "jax : 0.4.35\n", + "matplotlib: 3.9.2\n", + "pandas : 2.2.3\n", + "\n" + ] + } + ], + "source": [ + "%load_ext watermark\n", + "%watermark --iversions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we define a function to simulate a test data set which closely mimics the data generating process in the original fixest benchmarks \n", + "that produced the data for [this figure](https://raw.githubusercontent.com/lrberge/fixest/refs/heads/master/vignettes/images/benchmark_gaussian.png).\n", + "\n", + "In one slight adjustment, we allow to vary the number of regressors `k`, which in the original fixest dgp is always set to 1. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "background_save": true + }, + "execution": { + "iopub.execute_input": "2025-01-12T17:32:57.667829Z", + "iopub.status.busy": "2025-01-12T17:32:57.667533Z", + "iopub.status.idle": "2025-01-12T17:32:57.674922Z", + "shell.execute_reply": "2025-01-12T17:32:57.674530Z", + "shell.execute_reply.started": "2025-01-12T17:32:57.667811Z" + }, + "id": "bxMmeyCxR3fb" + }, + "outputs": [], + "source": [ + "def generate_test_data(size: int, k: int = 2):\n", + " \"\"\"\n", + " Generate benchmark data for pyfixest on GPU (similar to the R fixest benchmark data).\n", + "\n", + " Args:\n", + " size (int): The number of observations in the data frame.\n", + " k (int): The number of covariates in the data frame.\n", + "\n", + " Returns\n", + " -------\n", + " pd.DataFrame: The generated data frame for the given size.\n", + " \"\"\"\n", + " # Constants\n", + " all_n = [1000 * 10**i for i in range(5)]\n", + " a = 1\n", + " b = 0.05\n", + "\n", + " n = all_n[size - 1]\n", + "\n", + " dum_all = []\n", + " nb_dum = [n // 20, int(np.sqrt(n)), int(n**0.33)]\n", + "\n", + " dum_all = np.zeros((n, 3))\n", + " dum_all[:, 0] = np.random.choice(nb_dum[0], n, replace=True)\n", + " dum_all[:, 1] = np.random.choice(nb_dum[1], n, replace=True)\n", + " dum_all[:, 2] = np.random.choice(nb_dum[2], n, replace=True)\n", + " dum_all = dum_all.astype(int)\n", + "\n", + " X1 = np.random.normal(size=n)\n", + " X2 = X1**2\n", + "\n", + " mu = a * X1 + b * X2\n", + "\n", + " for m in range(3):\n", + " coef_dum = np.random.normal(size=nb_dum[m])\n", + " mu += coef_dum[dum_all[:, m]]\n", + "\n", + " mu = np.exp(mu)\n", + " y = nbinom.rvs(0.5, 1 - (mu / (mu + 0.5)), size=n)\n", + "\n", + " X_full = np.column_stack((X1, X2))\n", + " base = pd.DataFrame(\n", + " {\n", + " \"y\": y,\n", + " \"ln_y\": np.log(y + 1),\n", + " \"X1\": X1,\n", + " \"X2\": X2,\n", + " }\n", + " )\n", + "\n", + " if k > 2:\n", + " X = np.random.normal(size=(n, k - 2))\n", + " X_df = pd.DataFrame(X, columns=[f\"X{i}\" for i in range(3, k + 1, 1)])\n", + " base = pd.concat([base, X_df], axis=1)\n", + " X_full = np.column_stack((X_full, X))\n", + "\n", + " for m in range(3):\n", + " base[f\"dum_{m + 1}\"] = dum_all[:, m]\n", + "\n", + " weights = np.random.uniform(0, 1, n)\n", + " return base, y, X_full, dum_all, weights" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:32:58.338155Z", + "iopub.status.busy": "2025-01-12T17:32:58.337681Z", + "iopub.status.idle": "2025-01-12T17:32:58.528238Z", + "shell.execute_reply": "2025-01-12T17:32:58.527784Z", + "shell.execute_reply.started": "2025-01-12T17:32:58.338135Z" + }, + "id": "nzynhbqwR81H" + }, + "outputs": [], + "source": [ + "df, Y, X, f, weights = generate_test_data(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:32:59.021156Z", + "iopub.status.busy": "2025-01-12T17:32:59.020661Z", + "iopub.status.idle": "2025-01-12T17:33:07.592808Z", + "shell.execute_reply": "2025-01-12T17:33:07.592338Z", + "shell.execute_reply.started": "2025-01-12T17:32:59.021136Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "###\n", + "\n", + "Estimation: OLS\n", + "Dep. var.: ln_y, Fixed effects: dum_1\n", + "Inference: CRV1\n", + "Observations: 1000\n", + "\n", + "| Coefficient | Estimate | Std. Error | t value | Pr(>|t|) | 2.5% | 97.5% |\n", + "|:--------------|-----------:|-------------:|----------:|-----------:|-------:|--------:|\n", + "| X1 | 0.500 | 0.052 | 9.691 | 0.000 | 0.396 | 0.603 |\n", + "---\n", + "RMSE: 1.095 R2: 0.298 R2 Within: 0.159 \n", + "CPU times: user 6.5 s, sys: 79.4 ms, total: 6.58 s\n", + "Wall time: 6.53 s\n" + ] + } + ], + "source": [ + "%%time\n", + "m0 = pf.feols(\"ln_y ~ X1 | dum_1\", df, demeaner_backend=\"numba\")\n", + "m0.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:33:07.593902Z", + "iopub.status.busy": "2025-01-12T17:33:07.593680Z", + "iopub.status.idle": "2025-01-12T17:33:08.654748Z", + "shell.execute_reply": "2025-01-12T17:33:08.654117Z", + "shell.execute_reply.started": "2025-01-12T17:33:07.593886Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "###\n", + "\n", + "Estimation: OLS\n", + "Dep. var.: ln_y, Fixed effects: dum_1\n", + "Inference: CRV1\n", + "Observations: 1000\n", + "\n", + "| Coefficient | Estimate | Std. Error | t value | Pr(>|t|) | 2.5% | 97.5% |\n", + "|:--------------|-----------:|-------------:|----------:|-----------:|-------:|--------:|\n", + "| X1 | 0.500 | 0.052 | 9.691 | 0.000 | 0.396 | 0.603 |\n", + "---\n", + "RMSE: 1.095 R2: 0.298 R2 Within: 0.159 \n", + "CPU times: user 239 ms, sys: 54.7 ms, total: 294 ms\n", + "Wall time: 366 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "m1 = pf.feols(\"ln_y ~ X1 | dum_1\", df, demeaner_backend=\"jax\")\n", + "m1.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first-compute time is considerably shorter for JAX; it doesn't have cold-start overheads to the same extent as numba." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Benchmark Function \n", + "\n", + "We know define a single function to run a benchmark for a given sample size `size = i x 1000`, number of regressors `k`, solver, \n", + "and demeaning backend. Additionally, the function allows us to specify a set of fixed effects and if we want to run benchmarks only \n", + "for a full call to `pf.feols()`, or if we additionally want to benchmark the demeaning process. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:33:12.478443Z", + "iopub.status.busy": "2025-01-12T17:33:12.478163Z", + "iopub.status.idle": "2025-01-12T17:33:12.485618Z", + "shell.execute_reply": "2025-01-12T17:33:12.485067Z", + "shell.execute_reply.started": "2025-01-12T17:33:12.478425Z" + }, + "id": "29rZkULUR_A0" + }, + "outputs": [], + "source": [ + "def run_standard_benchmark(\n", + " fixed_effect,\n", + " demeaner_backend,\n", + " size=1,\n", + " k=1,\n", + " solver=\"np.linalg.lstsq\",\n", + " skip_demean_benchmark=True,\n", + " nrep=5,\n", + "):\n", + " \"\"\"\n", + " Run the fixest standard benchmark fixed effect models. This is the function the benchmarks\n", + " will loop over.\n", + "\n", + " Args:\n", + " fixed_effect (str): The fixed effect to use. Must be a list of variables as \"dum_1\", \"dum_1+dum_2\", or \"dum_1+dum_2+dum_3\", etc.\n", + " demeaner_backend (str): The backend to use for demeaning. Must be \"numba\" or \"jax\".\n", + " size (int): The size of the data to generate. Must be between 1 and 5. For 1, N = 1000, for 2, N = 10000, etc.\n", + " k_vals (int): The number of covariates to generate.\n", + " solver (str): The solver to use for the estimation. Must be \"np.linalg.lstsq\". \"jax\" currently throws an error.\n", + " skip_demean_benchmark (bool): Whether to skip the \"pure\" demean benchmark. Default is True. Only the full call\n", + " to feols is benchmarked.\n", + "\n", + " \"\"\"\n", + " assert fixed_effect in [\"dum_1\", \"dum_1+dum_2\", \"dum_1+dum_2+dum_3\"]\n", + "\n", + " # one fixed effect\n", + " res = []\n", + "\n", + " fml_base = \"ln_y ~ X1\"\n", + " fml = f\"{fml_base} | {fixed_effect}\"\n", + "\n", + " # warmup\n", + " df, y, X, f, weights = generate_test_data(1)\n", + " pf.feols(\n", + " fml,\n", + " data=df,\n", + " demeaner_backend=demeaner_backend,\n", + " store_data=False,\n", + " copy_data=False,\n", + " solver=solver,\n", + " )\n", + "\n", + " if k > 1:\n", + " xfml = \"+\".join([f\"X{i}\" for i in range(2, k + 1, 1)])\n", + " fml = f\"{fml_base} + {xfml} | {fixed_effect}\"\n", + " else:\n", + " fml = f\"{fml_base} + X1 | {fixed_effect}\"\n", + "\n", + " for rep in range(nrep):\n", + " df, Y, X, f, weights = generate_test_data(size=size, k=k)\n", + "\n", + " tic1 = time.time()\n", + " pf.feols(\n", + " fml,\n", + " data=df,\n", + " demeaner_backend=demeaner_backend,\n", + " store_data=False,\n", + " copy_data=False,\n", + " solver=solver,\n", + " )\n", + " tic2 = time.time()\n", + "\n", + " full_feols_timing = tic2 - tic1\n", + "\n", + " demean_timing = np.nan\n", + " if not skip_demean_benchmark:\n", + " YX = np.column_stack((Y.reshape(-1, 1), X))\n", + " tic3 = time.time()\n", + " if demeaner_backend == \"jax\":\n", + " _, _ = demean_jax(YX, f, weights, tol=1e-10)\n", + " else:\n", + " _, _ = demean(YX, f, weights, tol=1e-10)\n", + " tic4 = time.time()\n", + " demean_timing = tic4 - tic3\n", + "\n", + " res.append(\n", + " pd.Series(\n", + " {\n", + " \"method\": \"feols\",\n", + " \"solver\": solver,\n", + " \"demeaner_backend\": demeaner_backend,\n", + " \"n_obs\": df.shape[0],\n", + " \"k\": k,\n", + " \"G\": len(fixed_effect.split(\"+\")),\n", + " \"rep\": rep + 1,\n", + " \"full_feols_timing\": full_feols_timing,\n", + " \"demean_timing\": demean_timing,\n", + " }\n", + " )\n", + " )\n", + "\n", + " return pd.concat(res, axis=1).T" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:33:13.195160Z", + "iopub.status.busy": "2025-01-12T17:33:13.194858Z", + "iopub.status.idle": "2025-01-12T17:33:14.970372Z", + "shell.execute_reply": "2025-01-12T17:33:14.969929Z", + "shell.execute_reply.started": "2025-01-12T17:33:13.195139Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsolverdemeaner_backendn_obskGrepfull_feols_timingdemean_timing
0feolsnp.linalg.lstsqnumba10001110.113831NaN
1feolsnp.linalg.lstsqnumba10001120.109568NaN
2feolsnp.linalg.lstsqnumba10001130.140634NaN
3feolsnp.linalg.lstsqnumba10001140.107976NaN
4feolsnp.linalg.lstsqnumba10001150.108512NaN
\n", + "
" + ], + "text/plain": [ + " method solver demeaner_backend n_obs k G rep full_feols_timing \\\n", + "0 feols np.linalg.lstsq numba 1000 1 1 1 0.113831 \n", + "1 feols np.linalg.lstsq numba 1000 1 1 2 0.109568 \n", + "2 feols np.linalg.lstsq numba 1000 1 1 3 0.140634 \n", + "3 feols np.linalg.lstsq numba 1000 1 1 4 0.107976 \n", + "4 feols np.linalg.lstsq numba 1000 1 1 5 0.108512 \n", + "\n", + " demean_timing \n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 NaN \n", + "4 NaN " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# test run numba\n", + "run_standard_benchmark(fixed_effect=\"dum_1\", demeaner_backend=\"numba\", size=1, k=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:33:14.971401Z", + "iopub.status.busy": "2025-01-12T17:33:14.971186Z", + "iopub.status.idle": "2025-01-12T17:33:16.344683Z", + "shell.execute_reply": "2025-01-12T17:33:16.344285Z", + "shell.execute_reply.started": "2025-01-12T17:33:14.971387Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsolverdemeaner_backendn_obskGrepfull_feols_timingdemean_timing
0feolsnp.linalg.lstsqjax10001110.123767NaN
1feolsnp.linalg.lstsqjax10001120.110617NaN
2feolsnp.linalg.lstsqjax10001130.111191NaN
3feolsnp.linalg.lstsqjax10001140.109355NaN
4feolsnp.linalg.lstsqjax10001150.110047NaN
\n", + "
" + ], + "text/plain": [ + " method solver demeaner_backend n_obs k G rep full_feols_timing \\\n", + "0 feols np.linalg.lstsq jax 1000 1 1 1 0.123767 \n", + "1 feols np.linalg.lstsq jax 1000 1 1 2 0.110617 \n", + "2 feols np.linalg.lstsq jax 1000 1 1 3 0.111191 \n", + "3 feols np.linalg.lstsq jax 1000 1 1 4 0.109355 \n", + "4 feols np.linalg.lstsq jax 1000 1 1 5 0.110047 \n", + "\n", + " demean_timing \n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 NaN \n", + "4 NaN " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# test run jax\n", + "run_standard_benchmark(fixed_effect=\"dum_1\", demeaner_backend=\"jax\", size=1, k=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T17:33:18.469235Z", + "iopub.status.busy": "2025-01-12T17:33:18.468934Z", + "iopub.status.idle": "2025-01-12T17:33:18.473353Z", + "shell.execute_reply": "2025-01-12T17:33:18.472915Z", + "shell.execute_reply.started": "2025-01-12T17:33:18.469217Z" + }, + "id": "HxsGRMSlR_jI" + }, + "outputs": [], + "source": [ + "def run_all_benchmarks(size_list, k_list):\n", + " \"\"\"\n", + " Run all the benchmarks.\n", + "\n", + " Args:\n", + " size_list (list): The list of sizes to run the benchmarks on. 1-> 1000, 2-> 10000, ..., 5-> 10_000_000\n", + " k_list (list): The list of k values to run the benchmarks on.\n", + " \"\"\"\n", + " res = pd.DataFrame()\n", + "\n", + " all_combinations = list(\n", + " product(\n", + " [\"numba\", \"jax\"], # demeaner_backend\n", + " [\"dum_1\", \"dum_1+dum_2\", \"dum_1+dum_2+dum_3\"], # fixef\n", + " size_list, # size\n", + " k_list, # k\n", + " [\"np.linalg.lstsq\"], # solver\n", + " )\n", + " )\n", + "\n", + " with tqdm(total=len(all_combinations), desc=\"Running Benchmarks\") as pbar:\n", + " for demeaner_backend, fixef, size, k, solver in all_combinations:\n", + " res = pd.concat(\n", + " [\n", + " res,\n", + " run_standard_benchmark(\n", + " solver=solver,\n", + " fixed_effect=fixef,\n", + " demeaner_backend=demeaner_backend,\n", + " size=size,\n", + " k=k,\n", + " ),\n", + " ],\n", + " axis=0,\n", + " )\n", + " pbar.update(1) # Update the progress bar after each iteration\n", + "\n", + " return res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run Benchmarks" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "background_save": true, + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-01-12T17:33:19.512756Z", + "iopub.status.busy": "2025-01-12T17:33:19.512476Z", + "iopub.status.idle": "2025-01-12T21:24:48.969147Z", + "shell.execute_reply": "2025-01-12T21:24:48.968541Z", + "shell.execute_reply.started": "2025-01-12T17:33:19.512740Z" + }, + "id": "gki1mlqvSEIi", + "outputId": "3cb40095-df81-4e78-99a6-2410da237884" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running Benchmarks: 82%|████████▎ | 99/120 [1:28:18<38:19, 109.52s/it] 2025-01-12 16:53:40.179560: W external/xla/xla/hlo/transforms/simplifiers/hlo_rematerialization.cc:3020] Can't reduce memory use below 13.75GiB (14764290646 bytes) by rematerialization; only reduced to 15.81GiB (16972000129 bytes), down from 15.81GiB (16972000129 bytes) originally\n", + "Running Benchmarks: 99%|█████████▉| 119/120 [1:45:29<01:50, 110.90s/it] 2025-01-12 17:10:50.500498: W external/xla/xla/hlo/transforms/simplifiers/hlo_rematerialization.cc:3020] Can't reduce memory use below 13.71GiB (14726290646 bytes) by rematerialization; only reduced to 15.81GiB (16972000137 bytes), down from 15.81GiB (16972000137 bytes) originally\n", + "Running Benchmarks: 100%|██████████| 120/120 [1:54:24<00:00, 57.20s/it] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 3h 18min 29s, sys: 26min 39s, total: 3h 45min 9s\n", + "Wall time: 1h 54min 24s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "%%time\n", + "res_all = run_all_benchmarks(\n", + " size_list=[1, 2, 3, 4, 5], # for N = 1000, 10_000, 100_000, 1_000_000, 10_000_000\n", + " k_list=[1, 10, 50, 100], # for k = 1, 10, 50, 100\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "background_save": true, + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-01-12T21:24:48.970311Z", + "iopub.status.busy": "2025-01-12T21:24:48.970134Z", + "iopub.status.idle": "2025-01-12T21:24:49.189456Z", + "shell.execute_reply": "2025-01-12T21:24:49.189064Z", + "shell.execute_reply.started": "2025-01-12T21:24:48.970295Z" + }, + "id": "7zEIHj5nXXvq", + "outputId": "238dedce-a9f5-4a1b-b9a2-b84d4a89c091" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methoddemeaner_backendkGn_obsfull_feols_timingdemean_timing
0feolsjax1110000.132004NaN
1feolsjax11100000.162957NaN
2feolsjax111000000.20829NaN
3feolsjax1110000000.428737NaN
4feolsjax11100000003.438257NaN
........................
115feolsnumba100310000.199722NaN
116feolsnumba1003100000.280761NaN
117feolsnumba10031000000.942488NaN
118feolsnumba100310000008.141236NaN
119feolsnumba100310000000109.2167NaN
\n", + "

120 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " method demeaner_backend k G n_obs full_feols_timing demean_timing\n", + "0 feols jax 1 1 1000 0.132004 NaN\n", + "1 feols jax 1 1 10000 0.162957 NaN\n", + "2 feols jax 1 1 100000 0.20829 NaN\n", + "3 feols jax 1 1 1000000 0.428737 NaN\n", + "4 feols jax 1 1 10000000 3.438257 NaN\n", + ".. ... ... ... .. ... ... ...\n", + "115 feols numba 100 3 1000 0.199722 NaN\n", + "116 feols numba 100 3 10000 0.280761 NaN\n", + "117 feols numba 100 3 100000 0.942488 NaN\n", + "118 feols numba 100 3 1000000 8.141236 NaN\n", + "119 feols numba 100 3 10000000 109.2167 NaN\n", + "\n", + "[120 rows x 7 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = (\n", + " res_all.drop([\"rep\", \"solver\"], axis=1)\n", + " .groupby([\"method\", \"demeaner_backend\", \"k\", \"G\", \"n_obs\"])\n", + " .mean()\n", + " .reset_index()\n", + ")\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T21:27:23.122324Z", + "iopub.status.busy": "2025-01-12T21:27:23.121966Z", + "iopub.status.idle": "2025-01-12T21:27:23.147368Z", + "shell.execute_reply": "2025-01-12T21:27:23.146834Z", + "shell.execute_reply.started": "2025-01-12T21:27:23.122298Z" + } + }, + "outputs": [], + "source": [ + "df.to_csv(\"gpu_runtime_res.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": { + "background_save": true + }, + "id": "VCn6O5MMXlBw" + }, + "source": [ + "## Visualize Results" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0methoddemeaner_backendkGn_obsfull_feols_timingdemean_timing
00feolsjax1110000.132004NaN
11feolsjax11100000.162957NaN
22feolsjax111000000.208290NaN
33feolsjax1110000000.428737NaN
44feolsjax11100000003.438257NaN
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 method demeaner_backend k G n_obs full_feols_timing \\\n", + "0 0 feols jax 1 1 1000 0.132004 \n", + "1 1 feols jax 1 1 10000 0.162957 \n", + "2 2 feols jax 1 1 100000 0.208290 \n", + "3 3 feols jax 1 1 1000000 0.428737 \n", + "4 4 feols jax 1 1 10000000 3.438257 \n", + "\n", + " demean_timing \n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 NaN \n", + "4 NaN " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv(\"gpu_runtime_res.csv\")\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2025-01-12T21:26:28.890365Z", + "iopub.status.busy": "2025-01-12T21:26:28.889830Z", + "iopub.status.idle": "2025-01-12T21:26:30.809435Z", + "shell.execute_reply": "2025-01-12T21:26:30.809015Z", + "shell.execute_reply.started": "2025-01-12T21:26:28.890345Z" + } + }, + "outputs": [], + "source": [ + "df[\"G\"] = df[\"G\"].map({1: \"n_fixef = 1\", 2: \"n_fixef = 2\", 3: \"n_fixef = 3\"})\n", + "df[\"n_obs\"] = df[\"n_obs\"].astype(str)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABisAAAYkCAYAAACbbjxsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5gV5fk//ntpC1IWUaogIKAIAiKWgEZAUUQEMVGUoGDXiAVJLFjBtpYoEjVgR6N+scReUCQgH0WNqBhLNKAomFCsuxRdhZ3fH/44cd2l7S4MC6/Xdc11Mc88M3OfOWd3dN/nmScrSZIkAAAAAAAAUlIp7QIAAAAAAIAtm7ACAAAAAABIlbACAAAAAABIlbACAAAAAABIlbACAAAAAABIlbACAAAAAABIlbACAAAAAABIlbACAAAAAABIlbACAAAAAABIlbACAGADysrKilGjRqVdBhFx7LHHRq1atdIuY51NmjQpdt1116hevXpkZWXFt99+W27HHjVqVGRlZcWXX35ZbsesKFa99k3RhAkTIisrK2bOnJl2Kevluuuuix122CEqV64cu+66a0REtGjRIo499tgNet6//vWv0bZt26hatWrUrVt3g55rXa3L7/xp06ZFVlZWPPLIIxunKACACkJYAQBUeKv+wLdqqVKlSmy33XZx7LHHxn/+858Nfv5nn31WIPH/69GjR2RlZUW/fv2Kbfv0008jKysr/vSnP6VQWcXy1VdfxcCBA6NGjRpxyy23xF//+teoWbPmGvd5//334+ijj47tttsusrOzo0mTJjF48OB4//33N1LVm47ly5fHqFGjYtq0aWmXstl74YUX4txzz42999477r777rjqqqs2ynk//PDDOPbYY6NVq1Zx++23x2233bZRzgsAwIZTJe0CAADKy2WXXRYtW7aM77//Pl577bWYMGFCvPzyy/Hee+9F9erVN9h5n3322bjllltKDCy+++67qFJly/tPrqeffjrefPPN6NKlS9qlVEhvvPFGLFmyJC6//PLo1avXWvs/+uijMWjQoKhXr16ccMIJ0bJly/j000/jzjvvjEceeSQmTpwYhx122EaofNOwfPnyGD16dET8FKD93EUXXRTnn39+ClVtnv7+979HpUqV4s4774xq1apl2j/66KOoVGnDfTdu2rRpUVhYGGPHjo3WrVtvsPMAALDxbHn/5wwAbLb69OkTu+++e0REnHjiibHtttvGNddcE08++WQMHDgwlZo2ZEiyqdp+++1jyZIlMXr06HjyySfTLmejSpIkvv/++6hRo0aZjrN48eKIiHV6tM3HH38cxxxzTOywww4xffr0qF+/fmbbWWedFb/+9a/jmGOOiX/+85+xww47lKmu8lZYWBg//PDDRv05qVKlyhYZIG4oixcvjho1ahQJKiIisrOzN/h5I9btZwQAgIrBY6AAgM3Wr3/964j46Y+5q/To0aPYN60jfprPoEWLFpn1nz+y6LbbbotWrVpFdnZ27LHHHvHGG28U2e+WW26JiCjyKKpVfvn88lXPy//3v/8dRx99dOTk5ET9+vXj4osvjiRJYv78+XHooYdGnTp1olGjRnH99dcXq7WgoCAuvfTSaN26dWRnZ0ezZs3i3HPPjYKCgjVej9NPPz1q1aoVy5cvL7Zt0KBB0ahRo1i5cmVERMycOTN69+4d2267bdSoUSNatmwZxx9//BqPv0rt2rXj7LPPjqeeeireeuutNfZd3fwBqx7t9emnn2baWrRoEYccckhMmzYtdt9996hRo0Z06NAh86ifRx99NDp06BDVq1ePLl26xNtvv13iOT/55JPo3bt31KxZM5o0aRKXXXZZJElSpE9hYWHceOON0b59+6hevXo0bNgwTjnllPjmm2+K9FtV0/PPP5+p6dZbb13ja3744YejS5cuUaNGjdh2223j6KOPLvK4sh49esTQoUMjImKPPfaIrKysNT77/7rrrovly5fHbbfdViSoiIjYdttt49Zbb41ly5bFtddeW2zfL7/8MgYOHBh16tSJbbbZJs4666z4/vvvi/SZPHly7LPPPlG3bt2oVatW7LTTTnHBBRcU6bOun8msrKw4/fTT4/7774/27dtHdnZ2PPXUU1GvXr047rjjitWXn58f1atXjz/+8Y8REfHDDz/EJZdcEl26dImcnJyoWbNm/PrXv46pU6dm9vn0008z12H06NGZn8lVP4clfeZWrFgRl19+eebnvEWLFnHBBRcUq3/V+/3yyy/HnnvuGdWrV48ddtgh7r333iL9fvzxxxg9enS0adMmqlevHttss03ss88+MXny5GKvsSTLly+PU045JbbZZpuoU6dODBkypMhnb+jQobHtttvGjz/+WGzfAw88MHbaaac1Hr9Hjx6xyy67xAcffBA9e/aMrbbaKrbbbrsSPyNrkpWVFXfffXcsW7Ysc50nTJgQEUXnrEiSJHr27Bn169fPhAwRP72fHTp0iFatWsWyZcsy7ffdd1/mZ6RevXpx1FFHxfz58zPbW7RoEZdeemlERNSvX3+t80T885//jGOPPTZ22GGHqF69ejRq1CiOP/74+Oqrr4r0W/XZmDNnThx77LFRt27dyMnJieOOO67Y782CgoI4++yzo379+lG7du3o379/fP755+t1/X55vEMOOSRycnJixowZpT4OAEBFJqwAADZbq/7QvfXWW5f6GA888EBcd911ccopp8QVV1wRn376afzmN7/J/JHwlFNOiQMOOCAifprsddWyNkceeWQUFhbG1VdfHXvttVdcccUVceONN8YBBxwQ2223XVxzzTXRunXr+OMf/xjTp0/P7FdYWBj9+/ePP/3pT9GvX7+46aabYsCAATFmzJg48sgj13rOZcuWxTPPPFOkffny5fHUU0/F4YcfHpUrV47FixfHgQceGJ9++mmcf/75cdNNN8XgwYPjtddeW+frdtZZZ8XWW29d7nN5zJkzJ373u99Fv379Ijc3N7755pvo169f3H///XH22WfH0UcfHaNHj46PP/44Bg4cGIWFhUX2X7lyZRx00EHRsGHDuPbaa6NLly5x6aWXZv7wucopp5wS55xzTuy9994xduzYOO644+L++++P3r17F/sD8UcffRSDBg2KAw44IMaOHZuZYLgkEyZMiIEDB0blypUjNzc3TjrppHj00Udjn332yUygfeGFF8bJJ58cET892uyvf/1rnHLKKas95lNPPRUtWrTIhHO/tO+++0aLFi2Kve8REQMHDozvv/8+cnNz4+CDD44///nPmXNH/DQPxiGHHBIFBQVx2WWXxfXXXx/9+/ePV155JdNnfT+Tf//73+Pss8+OI488MsaOHRtt2rSJww47LB5//PH44YcfivR9/PHHo6CgII466qiI+Cm8uOOOO6JHjx5xzTXXxKhRo+KLL76I3r17x6xZsyLipz9ejxs3LiIiDjvssMzP5G9+85vVXsMTTzwxLrnkkthtt91izJgx0b1798jNzc2c9+fmzJkThx9+eBxwwAFx/fXXx9Zbbx3HHntskblBRo0aFaNHj46ePXvGzTffHBdeeGFsv/32aw3vVjn99NPjX//6V4waNSqGDBkS999/fwwYMCATqh1zzDHx1VdfxfPPP19kv4ULF8bf//73OProo9d6jm+++SYOOuig6NSpU1x//fXRtm3bOO+88+K5555bpxojfvqd9+tf/zqys7Mz13nfffct1i8rKyvuuuuu+P777+PUU0/NtF966aXx/vvvx913352Zk+XKK6+MIUOGRJs2beKGG26I4cOHx5QpU2LffffN/IzceOONmceajRs3bq3v7+TJk+OTTz6J4447Lm666aY46qijYuLEiXHwwQcXCyojfvq5WLJkSeTm5sbAgQNjwoQJmceKrXLiiSfGjTfeGAceeGBcffXVUbVq1ejbt+86X7uf++6776Jfv34xY8aMePHFF6Nbt26lOg4AQIWXAABUcHfffXcSEcmLL76YfPHFF8n8+fOTRx55JKlfv36SnZ2dzJ8/P9O3e/fuSffu3YsdY+jQoUnz5s0z63Pnzk0iItlmm22Sr7/+OtP+xBNPJBGRPPXUU5m2YcOGJav7z6qISC699NLM+qWXXppERHLyySdn2lasWJE0bdo0ycrKSq6++upM+zfffJPUqFEjGTp0aKbtr3/9a1KpUqXk//7v/4qcZ/z48UlEJK+88spqr1NhYWGy3XbbJb/97W+LtD/00ENJRCTTp09PkiRJHnvssSQikjfeeGO1x1qd7t27J+3bt0+SJElGjx6dRETy5ptvJknyv2t63XXXZfqvuh6/tOo9nTt3bqatefPmSUQkM2bMyLQ9//zzSUQkNWrUSD777LNM+6233ppERDJ16tRM29ChQ5OISM4444wi16Rv375JtWrVki+++CJJkiT5v//7vyQikvvvv79ITZMmTSrWvqqmSZMmrfXa/PDDD0mDBg2SXXbZJfnuu+8y7U8//XQSEckll1xS7PWv7T349ttvk4hIDj300DX269+/fxIRSX5+fpIk/7vu/fv3L9LvtNNOSyIieeedd5IkSZIxY8YkEZG5NiVZn89kRCSVKlVK3n///SJ9V72PP/+5SpIkOfjgg5Mddtghs75ixYqkoKCgSJ9vvvkmadiwYXL88cdn2r744otiP3ur/PIzN2vWrCQikhNPPLFIvz/+8Y9JRCR///vfM22r3u9VPytJkiSLFy9OsrOzkz/84Q+Ztk6dOiV9+/Ytdu61WfW+d+nSJfnhhx8y7ddee20SEckTTzyRJEmSrFy5MmnatGly5JFHFtn/hhtuSLKyspJPPvlkjefp3r17EhHJvffem2krKChIGjVqVOz3w9oMHTo0qVmzZrH25s2bF/ndlST/+7m87777ktdeey2pXLlyMnz48Mz2Tz/9NKlcuXJy5ZVXFtnv3XffTapUqVKkfdX7uKbP5irLly8v1vb//t//K/Zerjrmzz9LSZIkhx12WLLNNttk1ld9Zk477bQi/X73u9+t9nP3c1OnTk0iInn44YeTJUuWJN27d0+23Xbb5O23317rawEA2JwZWQEAbDZ69eoV9evXj2bNmsXhhx8eNWvWjCeffDKaNm1a6mMeeeSRRUZmrPr2+ieffFKmWk888cTMvytXrhy77757JEkSJ5xwQqa9bt26sdNOOxU518MPPxw777xztG3bNr788svMst9++0VEFHkczi9lZWXFEUccEc8++2wsXbo00/7ggw/GdtttF/vss0/mvBE/TZJd0mNm1tWq0RW//EZyWbRr1y66du2aWd9rr70iImK//faL7bffvlh7Se/T6aefnvn3qscS/fDDD/Hiiy9GxE/XOCcnJw444IAi17hLly5Rq1atYte4ZcuW0bt377XWPnPmzFi8eHGcdtppReZo6Nu3b7Rt27bEkQ9rs2TJkoj46dFba7Jqe35+fpH2YcOGFVk/44wzIuKnSeMj/vdZeOKJJ4qNUlllfT+T3bt3j3bt2hVp22+//WLbbbeNBx98MNP2zTffxOTJk4uMzqhcuXJmboTCwsL4+uuvY8WKFbH77ruv86iFX1r1WkeMGFGk/Q9/+ENERLH3pV27dkVGsdSvX7/Yz2ndunXj/fffj9mzZ5eqppNPPjmqVq2aWf/9738fVapUydRaqVKlGDx4cDz55JOZz0BExP333x/dunWLli1brvUctWrVKjICo1q1arHnnnuW+Xfbmpx88snRu3fvOOOMM+KYY46JVq1axVVXXZXZ/uijj0ZhYWEMHDiwyGepUaNG0aZNmzX+fluTn88h8/3338eXX34Zv/rVryIiSvzc/Hz0R8RPv/e/+uqrzM/PqvfhzDPPLNJv+PDh61VXXl5eHHjggfHhhx/GtGnT1jgqCwBgSyCsAAA2G7fccktMnjw5HnnkkTj44IPjyy+/LPMkrz//A3jE/x4p9cu5C8p63JycnKhevXpsu+22xdp/fq7Zs2fH+++/H/Xr1y+y7LjjjhERRZ4HX5Ijjzwyvvvuu8zE10uXLo1nn302jjjiiMxz/Lt37x6//e1vY/To0bHtttvGoYceGnffffda58T4pZycnBg+fHg8+eSTq50/Yn2VdN0iIpo1a1Zi+y/fp0qVKhWbZHrVtVv12LDZs2dHXl5eNGjQoNh1Xrp0abFrvC5/GI6I+OyzzyIiSpxPoG3btpnt62NVCPHzP1iXZHWhRps2bYqst2rVKipVqpS5FkceeWTsvffeceKJJ0bDhg3jqKOOioceeqhIcLG+n8mSrleVKlXit7/9bTzxxBOZz9mjjz4aP/74Y7FHSd1zzz3RsWPHzFwQ9evXj2eeeSby8vLWeA1W57PPPotKlSpF69ati7Q3atQo6tatW+x9+eVnMOKn3ws//6xddtll8e2338aOO+4YHTp0iHPOOSf++c9/rnNNv3xfatWqFY0bNy4yh8uQIUPiu+++i8ceeywifnoc2ZtvvhnHHHPMOp2jadOmxebu+OXr2BDuvPPOWL58ecyePTsmTJhQJEiYPXt2JEkSbdq0KfZ5+te//rXW32+r8/XXX8dZZ50VDRs2jBo1akT9+vUzn8OSPjdr+72/6jPTqlWrIv3WNlfILw0fPjzeeOONePHFF6N9+/brtS8AwOaoStoFAACUlz333DN23333iIgYMGBA7LPPPvG73/0uPvroo6hVq1ZE/PRN+qSEZ5Svmlj6lypXrlxie0nHWB8lHXddzlVYWBgdOnSIG264ocS+v/yj/S/96le/ihYtWsRDDz0Uv/vd7+Kpp56K7777rsgfhLOysuKRRx6J1157LZ566ql4/vnn4/jjj4/rr78+Xnvttcy1XBdnnXVWjBkzJkaPHh033nhjse0lTa4dsf7vR3m+T4WFhdGgQYO4//77S9z+y0msf/7H1o0tJycnGjduvNY/hP/zn/+M7bbbLurUqbPGfr98P2rUqBHTp0+PqVOnxjPPPBOTJk2KBx98MPbbb7944YUXonLlyuv9mVzd9TrqqKPi1ltvjeeeey4GDBgQDz30ULRt2zY6deqU6XPffffFscceGwMGDIhzzjknGjRokJn/4+OPP17ja1ub1X0Wf2ldPmv77rtvfPzxx/HEE0/ECy+8EHfccUeMGTMmxo8fX2RUVVm0a9cuunTpEvfdd18MGTIk7rvvvqhWrVoMHDiw3F7HhjBt2rRMIPXuu+8WGSlVWFgYWVlZ8dxzz5VY3/r87vm5gQMHxowZM+Kcc86JXXfdNWrVqhWFhYVx0EEHlThiaGNdm0MPPTQmTpwYV199ddx7771RqZLvEgIAWzZhBQCwWVr1B8xVE9yef/75EfHTN2RLesxJab7Vvsq6/pGzPLRq1Sreeeed2H///Ut93oEDB8bYsWMjPz8/HnzwwWjRokXmkSg/96tf/Sp+9atfxZVXXhkPPPBADB48OCZOnLhef2xdNbpi1KhRMXTo0GLbV31j+dtvv808ciiibO/HmhQWFsYnn3yS+dZ/RMS///3viIho0aJFRPx0jV988cXYe++9yzWIaN68eUT89A34VY9IWuWjjz7KbF9fhxxySNx+++3x8ssvZx7l9XP/93//F59++mmJk3TPnj27yEiHOXPmRGFhYeZaRPw0GmX//feP/fffP2644Ya46qqr4sILL4ypU6dGr169yuUzGfHTH/gbN24cDz74YOyzzz7x97//PS688MIifR555JHYYYcd4tFHHy1yrl9OkL4+dTRv3jwKCwtj9uzZsfPOO2faFy1aFN9++22p35d69erFcccdF8cdd1wsXbo09t133xg1atQ6/fzMnj07evbsmVlfunRpLFiwIA4++OAi/YYMGRIjRoyIBQsWxAMPPBB9+/Yt8ti6Tc2CBQvijDPOiAMPPDCqVasWf/zjH6N3796Za9yqVatIkiRatmxZ5Ge0LL755puYMmVKjB49Oi655JJMe2kf0RXxv8/Mxx9/XGQ0xUcffbRexxkwYEAceOCBceyxx0bt2rUzE8MDAGypfHUDANhs9ejRI/bcc8+48cYb4/vvv4+In/4Y9uGHH8YXX3yR6ffOO+/EK6+8Uurz1KxZMyJ++oP7hjZw4MD4z3/+E7fffnuxbd99910sW7Zsrcc48sgjo6CgIO65556YNGlSsW9if/PNN8W+QbzqWerr+yioiJ8edVK3bt247LLLim1b9RiV6dOnZ9qWLVsW99xzz3qfZ13dfPPNmX8nSRI333xzVK1aNfbff/+I+Okar1y5Mi6//PJi+65YsaLU7/Puu+8eDRo0iPHjxxe5js8991z861//ir59+5bquOecc07UqFEjTjnllPjqq6+KbPv666/j1FNPja222irOOeecYvvecsstRdZvuummiIjo06dPZv9f+uVnoTw+kxE/hSKHH354PPXUU/HXv/41VqxYUewRUKu+8f7zz+frr78er776apF+W221VUSs28/kqgDglyN/Vo0UKc378sv3oVatWtG6det1/vm57bbbiswXM27cuFixYkXmfVll0KBBkZWVFWeddVZ88sknReag2BSddNJJUVhYGHfeeWfcdtttUaVKlTjhhBMy7+dvfvObqFy5cowePbrY76AkSYpd13VR0mcmovj7vT5WvQ9//vOfy3zMIUOGxJ///OcYP358nHfeeaWuCQBgc2BkBQCwWTvnnHPiiCOOiAkTJsSpp54axx9/fNxwww3Ru3fvOOGEE2Lx4sUxfvz4aN++fbHJh9dVly5dIuKnyVZ79+4dlStXjqOOOqo8X0bGMcccEw899FCceuqpMXXq1Nh7771j5cqV8eGHH8ZDDz0Uzz//fOZRWKuz2267RevWrePCCy+MgoKCEucE+Mtf/hKHHXZYtGrVKpYsWRK333571KlTp9g3u9dFTk5OnHXWWSVOtH3ggQfG9ttvHyeccEKcc845Ubly5bjrrruifv36MW/evPU+19pUr149Jk2aFEOHDo299tornnvuuXjmmWfiggsuyDzeqXv37nHKKadEbm5uzJo1Kw488MCoWrVqzJ49Ox5++OEYO3ZsHH744et97qpVq8Y111wTxx13XHTv3j0GDRoUixYtirFjx0aLFi3i7LPPLtVratOmTdxzzz0xePDg6NChQ5xwwgnRsmXL+PTTT+POO++ML7/8Mv7f//t/xZ6vHxExd+7c6N+/fxx00EHx6quvxn333Re/+93vMo9euuyyy2L69OnRt2/faN68eSxevDj+8pe/RNOmTTOjOMrjM7nKkUceGTfddFNceuml0aFDhyIjHSJ+GkXy6KOPxmGHHRZ9+/aNuXPnxvjx46Ndu3ZFJo2vUaNGtGvXLh588MHYcccdo169erHLLrvELrvsUuycnTp1iqFDh8Ztt90W3377bXTv3j3+8Y9/xD333BMDBgwoMsJhXbVr1y569OgRXbp0iXr16sXMmTPjkUceKTK5+5r88MMPsf/++8fAgQPjo48+ir/85S+xzz77RP/+/Yv0q1+/fhx00EHx8MMPR926dUsdeG0Md999dzzzzDMxYcKEaNq0aUT8FI4dffTRMW7cuDjttNOiVatWccUVV8TIkSPj008/jQEDBkTt2rVj7ty58dhjj8XJJ58cf/zjH9frvHXq1Il99903rr322vjxxx9ju+22ixdeeCHmzp1b6tey6667xqBBg+Ivf/lL5OXlRbdu3WLKlCkxZ86cUh3v9NNPj/z8/LjwwgsjJycnLrjgglLXBgBQoSUAABXc3XffnURE8sYbbxTbtnLlyqRVq1ZJq1atkhUrViRJkiT33XdfssMOOyTVqlVLdt111+T5559Phg4dmjRv3jyz39y5c5OISK677rpix4yI5NJLL82sr1ixIjnjjDOS+vXrJ1lZWcnP/xPrl30vvfTSJCKSL774osgxhw4dmtSsWbPYubp37560b9++SNsPP/yQXHPNNUn79u2T7OzsZOutt066dOmSjB49OsnLy1vjtVrlwgsvTCIiad26dbFtb731VjJo0KBk++23T7Kzs5MGDRokhxxySDJz5sy1HrekepMkSb755pskJyenxGv65ptvJnvttVdSrVq1ZPvtt09uuOGGzHs6d+7cTL/mzZsnffv2LXbsiEiGDRtWpK2k92/VNf7444+TAw88MNlqq62Shg0bJpdeemmycuXKYse97bbbki5duiQ1atRIateunXTo0CE599xzk//+979rrWlNHnzwwaRz585JdnZ2Uq9evWTw4MHJ559/XqTPmj7Tq/PPf/4zGTRoUNK4ceOkatWqSaNGjZJBgwYl7777brG+qz6HH3zwQXL44YcntWvXTrbeeuvk9NNPT7777rtMvylTpiSHHnpo0qRJk6RatWpJkyZNkkGDBiX//ve/ixxvXT+TJb1XP1dYWJg0a9YsiYjkiiuuKHH7VVddlTRv3jzJzs5OOnfunDz99NPFfn6TJElmzJiRdOnSJalWrVqRn8NVr/3nfvzxx2T06NFJy5Ytk6pVqybNmjVLRo4cmXz//fdF+q3u/e7evXvSvXv3zPoVV1yR7LnnnkndunWTGjVqJG3btk2uvPLK5Icffljta0+S/73vL730UnLyyScnW2+9dVKrVq1k8ODByVdffVXiPg899FASEcnJJ5+8xmP/st6Sfk5Luo5rs7rfXc2bN0+GDh2aJEmSzJ8/P8nJyUn69etXrN9hhx2W1KxZM/nkk08ybX/729+SffbZJ6lZs2ZSs2bNpG3btsmwYcOSjz76KNNndb9LS/L5558nhx12WFK3bt0kJycnOeKII5L//ve/6/z7uaTfR999911y5plnJttss01Ss2bNpF+/fsn8+fOLHbMkU6dOTSIiefjhh4u0n3vuuUlEJDfffPNaXxMAwOYoK0k28AxqAAAAbBBPPPFEDBgwIKZPnx6//vWv0y4HAABKTVgBAABQQR1yyCHxr3/9K+bMmVOmCc4BACBt5qwAAACoYCZOnBj//Oc/45lnnomxY8eWe1DxxRdfxMqVK1e7vVq1alGvXr1yPScAAFs2IysAAAAqmKysrKhVq1YceeSRMX78+KhSpXy/h9aiRYv47LPPVru9e/fuMW3atHI9JwAAWzYjKwAAACqYDf2ds/vvvz++++671W7feuutN+j5AQDY8hhZAQAAAAAApKpS2gUAAAAAAABbNmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFAAAAAACQKmEFVHALFy6MAw44IGrWrBl169aNiIisrKx4/PHHy+0cSZLEySefHPXq1YusrKyYNWtWuR0bAMrKvRCALZ17IQCbA2EFVHBjxoyJBQsWxKxZs+Lf//53REQsWLAg+vTpU27nmDRpUkyYMCGefvrpWLBgQeyyyy7lduxVvv/++zj22GOjQ4cOUaVKlRgwYEC5nwOAzdPmci+cNm1aHHroodG4ceOoWbNm7LrrrnH//feX+3kA2PxsLvfCjz76KHr27BkNGzaM6tWrxw477BAXXXRR/Pjjj+V+LgA2PVXSLgAom48//ji6dOkSbdq0ybQ1atSo3M/RuHHj6NatW7ke9+dWrlwZNWrUiDPPPDP+9re/bbDzALD52VzuhTNmzIiOHTvGeeedFw0bNoynn346hgwZEjk5OXHIIYdssPMCUPFtLvfCqlWrxpAhQ2K33XaLunXrxjvvvBMnnXRSFBYWxlVXXbXBzgvApsHICkhZjx494swzz4xzzz036tWrF40aNYpRo0at074tWrSIv/3tb3HvvfdGVlZWHHvssRFRdLjvvffeG7Vq1YrZs2dn9jvttNOibdu2sXz58oiIeO+996JPnz5Rq1ataNiwYRxzzDHx5ZdfRkTEscceG2eccUbMmzcvsrKyokWLFuX10ouoWbNmjBs3Lk466aRy/49qADZt7oU/ueCCC+Lyyy+Pbt26RatWreKss86Kgw46KB599NENcj4ANh3uhT/ZYYcd4rjjjotOnTpF8+bNo3///jF48OD4v//7vw1yPgA2LcIK2ATcc889UbNmzXj99dfj2muvjcsuuywmT5681v3eeOONOOigg2LgwIGxYMGCGDt2bLE+Q4YMiYMPPjgGDx4cK1asiGeeeSbuuOOOuP/++2OrrbaKb7/9Nvbbb7/o3LlzzJw5MyZNmhSLFi2KgQMHRkTE2LFj47LLLoumTZvGggUL4o033iixlnnz5kWtWrXWuPgmDACr415Ysry8vKhXr9567QNAxeReWNycOXNi0qRJ0b1793XeB4CKy2OgYBPQsWPHuPTSSyMiok2bNnHzzTfHlClT4oADDljjfvXr14/s7OyoUaPGGkcj3HrrrdGxY8c488wz49FHH41Ro0ZFly5dIiLi5ptvjs6dOxf5D8a77rormjVrFv/+979jxx13jNq1a0flypXXeI4mTZqsdYI1f2wBYHXcC4t76KGH4o033ohbb711nfcBoOJyL/yfbt26xVtvvRUFBQVx8sknx2WXXbbWfQCo+IQVsAno2LFjkfXGjRvH4sWLy+34W2+9ddx5553Ru3fv6NatW5x//vmZbe+8805MnTo1atWqVWy/jz/+OHbcccd1OkeVKlWidevW5VYzAFsW98Kipk6dGscdd1zcfvvt0b59+3I5JgCbNvfC/3nwwQdjyZIl8c4778Q555wTf/rTn+Lcc88t83EB2LQJK2ATULVq1SLrWVlZUVhYWK7nmD59elSuXDkWLFgQy5Yti9q1a0dExNKlS6Nfv35xzTXXFNuncePG63z8efPmRbt27dbY54ILLogLLrhg/QoHYIvgXvg/L730UvTr1y/GjBkTQ4YMWefzA1CxuRf+T7NmzSIiol27drFy5co4+eST4w9/+ENUrlx5nWsBoOIRVsAWYMaMGXHNNdfEU089Feedd16cfvrpcc8990RExG677RZ/+9vfokWLFlGlSul/JXgMFACbsopyL5w2bVoccsghcc0118TJJ59c6loA4Jcqyr3wlwoLC+PHH3+MwsJCYQXAZk5YAZu5JUuWxDHHHBNnnnlm9OnTJ5o2bRp77LFH9OvXLw4//PAYNmxY3H777TFo0KA499xzo169ejFnzpyYOHFi3HHHHev8H4PlMdz3gw8+iB9++CG+/vrrWLJkSeY/cnfdddcyHReALVtFuRdOnTo1DjnkkDjrrLPit7/9bSxcuDAiIqpVqybwB6BMKsq98P7774+qVatGhw4dIjs7O2bOnBkjR46MI488stjIEwA2P8IK2MydddZZUbNmzcxEaR06dIirrroqTjnllOjatWtst9128corr8R5550XBx54YBQUFETz5s3joIMOikqVKm3UWg8++OD47LPPMuudO3eOiIgkSTZqHQBsXirKvfCee+6J5cuXR25ubuTm5mbau3fvHtOmTdtodQCw+ako98IqVarENddcE//+978jSZJo3rx5nH766XH22WdvtBoASE9W4q+AAAAAAABAijbu16YBAAAAAAB+QVgBm7D7778/atWqVeLSvn37tMsDgA3OvRCALZ17IQBbCo+Bgk3YkiVLYtGiRSVuq1q1ajRv3nwjVwQAG5d7IQBbOvdCALYUwgoAAAAAACBVHgMFAAAAAACkaosLK5Ikifz8/DCgBIAtlXshAFs690IAgE3PFhdWLFmyJHJycmLJkiVplwIAqXAvBGBL514IALDp2eLCCgAAAAAAYNMirAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFIlrAAAAAAAAFJVJe0CAODnvpoyMdXzb7P/UameHwDcCwHY0rkXwpbJyAoAAAAAACBVwgoAAAAAACBVwgoAAAAAACBVwgoAqGBGjRoVWVlZRZa2bdumXRYAAABAqZlgGwAqoPbt28eLL76YWa9SxS0dAAAAqLj8ZQMAKqAqVapEo0aN1qlvQUFBFBQUZNbz8/M3VFkAAAAApeIxUABQAc2ePTuaNGkSO+ywQwwePDjmzZu32r65ubmRk5OTWZo1a7YRKwUAAABYO2EFAFQwe+21V0yYMCEmTZoU48aNi7lz58avf/3rWLJkSYn9R44cGXl5eZll/vz5G7liAAAAgDXzGCgAqGD69OmT+XfHjh1jr732iubNm8dDDz0UJ5xwQrH+2dnZkZ2dvTFLBAAAAFgvRlYAQAVXt27d2HHHHWPOnDlplwIAAABQKsIKAKjgli5dGh9//HE0btw47VIAAAAASkVYAQAVzB//+Md46aWX4tNPP40ZM2bEYYcdFpUrV45BgwalXRoAAABAqZizAgAqmM8//zwGDRoUX331VdSvXz/22WefeO2116J+/fpplwYAAABQKsIKAKhgJk6cmHYJAAAAAOXKY6AAAAAAAIBUCSsAAAAAAIBUCSsAAAAAAIBUCSsAAAAAAIBUCSsAAAAAAIBUCSsAAAAAAIBUpRpWjBs3Ljp27Bh16tSJOnXqRNeuXeO5555bbf8JEyZEVlZWkaV69eobsWIAAAAAAKC8VUnz5E2bNo2rr7462rRpE0mSxD333BOHHnpovP3229G+ffsS96lTp0589NFHmfWsrKyNVS4AAAAAALABpBpW9OvXr8j6lVdeGePGjYvXXntttWFFVlZWNGrUaJ3PUVBQEAUFBZn1/Pz80hULAAAAAABsEJvMnBUrV66MiRMnxrJly6Jr166r7bd06dJo3rx5NGvWLA499NB4//3313jc3NzcyMnJySzNmjUr79IBAAAAAIAySD2sePfdd6NWrVqRnZ0dp556ajz22GPRrl27EvvutNNOcdddd8UTTzwR9913XxQWFka3bt3i888/X+3xR44cGXl5eZll/vz5G+qlAAAAAAAApZDqY6AifgogZs2aFXl5efHII4/E0KFD46WXXioxsOjatWuRURfdunWLnXfeOW699da4/PLLSzx+dnZ2ZGdnb7D6AQAAAACAskk9rKhWrVq0bt06IiK6dOkSb7zxRowdOzZuvfXWte5btWrV6Ny5c8yZM2dDlwkAAAAAAGwgqT8G6pcKCwuLTIi9JitXrox33303GjduvIGrAgAAAAAANpRUR1aMHDky+vTpE9tvv30sWbIkHnjggZg2bVo8//zzERExZMiQ2G677SI3NzciIi677LL41a9+Fa1bt45vv/02rrvuuvjss8/ixBNPTPNlAGxWnn1jaarn3yvVswMAFcGoUaNi9OjRRdp22mmn+PDDD1OqCACAsko1rFi8eHEMGTIkFixYEDk5OdGxY8d4/vnn44ADDoiIiHnz5kWlSv8b/PHNN9/ESSedFAsXLoytt946unTpEjNmzFjthNwAAABsntq3bx8vvvhiZr1KldSfcgwAQBmk+l9zd9555xq3T5s2rcj6mDFjYsyYMRuwIgAAACqCKlWqRKNGjdIuAwCAcrLJzVkBAAAAazN79uxo0qRJ7LDDDjF48OCYN2/eavsWFBREfn5+kQUAgE2LsAIAAIAKZa+99ooJEybEpEmTYty4cTF37tz49a9/HUuWLCmxf25ubuTk5GSWZs2abeSKAQBYG2EFAAAAFUqfPn3iiCOOiI4dO0bv3r3j2WefjW+//TYeeuihEvuPHDky8vLyMsv8+fM3csUAAKyNGcgAAACo0OrWrRs77rhjzJkzp8Tt2dnZkZ2dvZGrAgBgfRhZAQAAQIW2dOnS+Pjjj6Nx48ZplwIAQCkJKwAAAKhQ/vjHP8ZL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7733Xrz88str7Ne1a9fo2rVrZr1bt26x8847x6233hqXX355sf4jR46MESNGZNbz8/MFFgAAAAAAsAkpVVhx7LHHRpUqVeLpp5+Oxo0bl3mC69NPPz2efvrpmD59ejRt2nS99q1atWp07tw55syZU+L27OzsyM7OLlN9AAAAAADAhlOqsGLWrFnx5ptvRtu2bct08iRJ4owzzojHHnsspk2bFi1btlzvY6xcuTLefffdOPjgg8tUCwAAAAAAkI5ShRXt2rWLL7/8sswnHzZsWDzwwAPxxBNPRO3atWPhwoUREZGTkxM1atSIiIghQ4bEdtttF7m5uRERcdlll8WvfvWraN26dXz77bdx3XXXxWeffRYnnnhimesBAAAAAAA2vlJNsH3NNdfEueeeG9OmTYuvvvoq8vPziyzraty4cZGXlxc9evSIxo0bZ5YHH3ww02fevHmxYMGCzPo333wTJ510Uuy8885x8MEHR35+fsyYMSPatWtXmpcCAAAAAACkrFQjK3r16hUREfvvv3+R9vWdYDtJkrX2mTZtWpH1MWPGxJgxY9atUAAAAAAAYJNXqrBi6tSp5V0HAAAAAACwhSpVWNG9e/fyrgMAAAAAANhClSqsiIj49ttv484774x//etfERHRvn37OP744yMnJ6fcigMAAAAAADZ/pZpge+bMmdGqVasYM2ZMfP311/H111/HDTfcEK1atYq33nqrvGsEAAAAAAA2Y6UaWXH22WdH//794/bbb48qVX46xIoVK+LEE0+M4cOHx/Tp08u1SAAAAAAAYPNVqrBi5syZRYKKiIgqVarEueeeG7vvvnu5FQcAAAAAAGz+SvUYqDp16sS8efOKtc+fPz9q165d5qIAAAAAAIAtR6nCiiOPPDJOOOGEePDBB2P+/Pkxf/78mDhxYpx44okxaNCg8q4RAAAAAADYjJXqMVB/+tOfIisrK4YMGRIrVqyIiIiqVavG73//+7j66qvLtUAAAAAAAGDzVqqwolq1ajF27NjIzc2Njz/+OCIiWrVqFVtttVW5FgcAAAAAAGz+ShVW5OXlxcqVK6NevXrRoUOHTPvXX38dVapUiTp16pRbgQAAAAAAwOatVHNWHHXUUTFx4sRi7Q899FAcddRRZS4KAAAAAADYcpQqrHj99dejZ8+exdp79OgRr7/+epmLAgBWb9y4cdGxY8eoU6dO1KlTJ7p27RrPPfdc2mUBAAAAlFqpwoqCgoLMxNo/9+OPP8Z3331X5qIAgNVr2rRpXH311fHmm2/GzJkzY7/99otDDz003n///bRLAwAAACiVUoUVe+65Z9x2223F2sePHx9dunQpc1EAwOr169cvDj744GjTpk3suOOOceWVV0atWrXitddeS7s0AAAAgFIp1QTbV1xxRfTq1Sveeeed2H///SMiYsqUKfHGG2/ECy+8UK4FAgCrt3Llynj44Ydj2bJl0bVr1xL7FBQUREFBQWY9Pz9/Y5UHAAAAsE5KNbJi7733jldffTWaNm0aDz30UDz11FPRunXr+Oc//xm//vWvy7tGAOAX3n333ahVq1ZkZ2fHqaeeGo899li0a9euxL65ubmRk5OTWZo1a7aRqwUAAABYs1KNrIiI2HXXXeOBBx4oz1oAgHW00047xaxZsyIvLy8eeeSRGDp0aLz00kslBhYjR46MESNGZNbz8/MFFgAAAMAmpdRhxccffxx33313fPLJJ3HjjTdGgwYN4rnnnovtt98+2rdvX541AgC/UK1atWjdunVERHTp0iXeeOONGDt2bNx6663F+mZnZ0d2dvbGLhEAAABgnZUqrHjppZeiT58+sffee8f06dPjiiuuiAYNGsQ777wTd955ZzzyyCPlXScAsAaFhYVF5qUAAABg07HffvtFkiTr1Hfq1KkbuBrYNJUqrDj//PPjiiuuiBEjRkTt2rUz7fvtt1/cfPPN5VYcAFDcyJEjo0+fPrH99tvHkiVL4oEHHohp06bF888/n3ZpAAAAlGDXXXfN/Pvjjz+Ot956K4444oj0CoJNUKnCinfffbfE+SoaNGgQX375ZZmLAgBWb/HixTFkyJBYsGBB5OTkRMeOHeP555+PAw44IO3SAAAAKMENN9wQERFz5syJnj17xhdffBGtW7eO0047LeXKYNNRqrCibt26sWDBgmjZsmWR9rfffju22267cikMACjZnXfemXYJAAAArKd///vf0bNnzzj00EPjhBNOiAMOOCDq1q0bv/vd79IuDTYJlUqz01FHHRXnnXdeLFy4MLKysqKwsDBeeeWV+OMf/xhDhgwp7xoBAAAAACqsDz/8MHr27Bm/+c1v4i9/+Ut06dIlnnzyyTjttNPimWeeSbs82CSUKqy46qqrom3bttGsWbNYunRptGvXLvbdd9/o1q1bXHTRReVdIwAAAABAhdWzZ88YOHBg3HTTTZm2ffbZJ/7f//t/MXjw4BQrg01HqR4DVa1atbj99tvjkksuiXfffTeWLl0anTt3jjZt2pR3fQAAAAAAFdrRRx8d1113XbH2Pn36xLhx41KoCDY9pQorVmnWrFk0a9YsVq5cGe+++2588803sfXWW5dXbQAAAAAAFV5JQcUqgwYN2oiVwKarVI+BGj58eGZyz5UrV0b37t1jt912i2bNmsW0adPKsz4AAAAoYty4cdGxY8eoU6dO1KlTJ7p27RrPPfdc2mUBAFAGpQorHnnkkejUqVNERDz11FPxySefxIcffhhnn312XHjhheVaIAAAAPxc06ZN4+qrr44333wzZs6cGfvtt18ceuih8f7776ddGgAApVSqsOLLL7+MRo0aRUTEs88+GwMHDowdd9wxjj/++Hj33XfLtUAAAAD4uX79+sXBBx8cbdq0iR133DGuvPLKqFWrVrz22mtplwYAQCmVKqxo2LBhfPDBB7Fy5cqYNGlSHHDAARERsXz58qhcuXK5FggAAACrs3Llypg4cWIsW7YsunbtWmKfgoKCyM/PL7IAALBpKVVYcdxxx8XAgQNjl112iaysrOjVq1dERLz++uvRtm3bdT5Obm5u7LHHHlG7du1o0KBBDBgwID766KO17vfwww9H27Zto3r16tGhQ4d49tlnS/MyAAAAqKDefffdqFWrVmRnZ8epp54ajz32WLRr167Evrm5uZGTk5NZmjVrtpGrBQBgbUoVVowaNSruuOOOOPnkk+OVV16J7OzsiIioXLlynH/++et8nJdeeimGDRsWr732WkyePDl+/PHHOPDAA2PZsmWr3WfGjBkxaNCgOOGEE+Ltt9+OAQMGxIABA+K9994rzUsBAACgAtppp51i1qxZ8frrr8fvf//7GDp0aHzwwQcl9h05cmTk5eVllvnz52/kagHgJ5988knUrl272L+BiCql3fHwww8v1jZ06ND1OsakSZOKrE+YMCEaNGgQb775Zuy7774l7jN27Ng46KCD4pxzzomIiMsvvzwmT54cN998c4wfP75Y/4KCgigoKMisG+4LAABQ8VWrVi1at24dERFdunSJN954I8aOHRu33nprsb7Z2dmZL9kBQNqysrJK/Dds6dZ5ZMXEiRPX+aDz58+PV155Zb2L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AAAAAECqhBUAAAAAAECqhBUAAAAAAECqhBUAAAAAAECqhBUAAAAAAECqhBUAAAAAAECqhBUAAAAAAECqhBUAAAAAAECqhBUAAAAAAECqUg0rpk+fHv369YsmTZpEVlZWPP7442vdZ9q0abHbbrtFdnZ2tG7dOiZMmLDB6wQAAAAAADacVMOKZcuWRadOneKWW25Zp/5z586Nvn37Rs+ePWPWrFkxfPjwOPHEE+P555/fwJUCAAAAAAAbSpU0T96nT5/o06fPOvcfP358tGzZMq6//vqIiNh5553j5ZdfjjFjxkTv3r03VJkAAAAAAMAGVKHmrHj11VejV69eRdp69+4dr7766mr3KSgoiPz8/CILAAAAAACw6ahQYcXChQujYcOGRdoaNmwY+fn58d1335W4T25ubuTk5GSWZs2abYxSAQAAAACAdVShworSGDlyZOTl5WWW+fPnp10SAAAAAADwM6nOWbG+GjVqFIsWLSrStmjRoqhTp07UqFGjxH2ys7MjOzt7Y5QHAAAAAACUQoUaWdG1a9eYMmVKkbbJkydH165dU6oIAAAAAAAoq1TDiqVLl8asWbNi1qxZERExd+7cmDVrVsybNy8ifnqE05AhQzL9Tz311Pjkk0/i3HPPjQ8//DD+8pe/xEMPPRRnn312GuUDAAAAAADlINWwYubMmdG5c+fo3LlzRESMGDEiOnfuHJdccklERCxYsCATXEREtGzZMp555pmYPHlydOrUKa6//vq44447onfv3qnUDwAAAAAAlF2qc1b06NEjkiRZ7fYJEyaUuM/bb7+9AasCAAAAAAA2pgo1ZwUAAAAAALD5EVYAAAAAAACpElYAAAAAAACpElYAAAAAAACpElYAAAAAAACpElYAAAAAAACpElYAAAAAAACpElYAAAAAAACpElYAAAAAAACpElYAAAAAAACpElYAAAAAAACpElYAQAUzffr06NevXzRp0iSysrLi8ccfT7skAAAAgDIRVgBABbNs2bLo1KlT3HLLLWmXAgAAAFAuqqRdAACwfvr06RN9+vRZ5/4FBQVRUFCQWc/Pz98QZQEAAACUmpEVALCZy83NjZycnMzSrFmztEsCAAAAKEJYAQCbuZEjR0ZeXl5mmT9/ftolAQAAABQhrACAzVx2dnbUqVOnyAIAFdn06dOjX79+0aRJk8jKyorHH3887ZIA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1qwZTZo0iSFDhsR///vf9AoGAAAAKCNhBQBsYpYtWxadOnWKW265pdi25cuXx1tvvRUXX3xxvPXWW/Hoo4/GRx99FP3790+hUgAAAIDyUSXtAgCAovr06RN9+vQpcVtOTk5Mnjy5SNvNN98ce+65Z8ybNy+23377jVEiAAAAQLkSVgBABZeXlxdZWVlRt27dErcXFBREQUFBZj0/P38jVQYAAACwbjwGCgAqsO+//z7OO++8GDRoUNSpU6fEPrm5uZGTk5NZmjVrtpGrBAAAAFgzYQUAVFA//vhjDBw4MJIkiXHjxq2238iRIyMvLy+zzJ8/fyNWCQAAALB2HgMFABXQqqDis88+i7///e+rHVUREZGdnR3Z2dkbsToAAACA9SOsAIAKZlVQMXv27Jg6dWpss802aZcEAAAAUCbCCgDYxCxdujTmzJmTWZ87d27MmjUr6tWrF40bN47DDz883nrrrXj66adj5cqVsXDhwoiIqFevXlSrVi2tsgEAAABKLStJkiTtIjam/Pz8yMnJiby8vDU+MgMA0jJt2rTo2bNnsfahQ4fGqFGjomXLliXuN3Xq1OjRo8daj+9eCMCWzr0QAGDTY2QFAGxievToEWv6LsEW9j0DAAAAYAtQKe0CAAAAAACALZuwAgAAAAAASJXHQAGwSflqysRUz7/N/kelen4AcC8EYEvnXghbJiMrAAAAAACAVAkrAAAAAACAVAkrAAAAAACAVAkrAAAAAACAVAkrAAAAAACAVAkrAAAAAACAVAkrAAAA2KRMnz49+vXrF02aNImsrKx4/PHHM9t+/PHHOO+886JDhw5Rs2bNaNKkSQwZMiT++9//plcwAABlJqwAAABgk7Js2bLo1KlT3HLLLcW2LV++PN566624+OKL46233opHH300Pvroo+jfv38KlQIAUF6qpF0AAAAA/FyfPn2iT58+JW7LycmJyZMnF2m7+eabY88994x58+bF9ttvX2yfgoKCKCgoyKzn5+eXb8EAAJSZkRUAAABUaHl5eZGVlRV169YtcXtubm7k5ORklmbNmm3cAgEAWCthBQAAABXW999/H+edd14MGjQo6tSpU2KfkSNHRl5eXmaZP3/+Rq4SAIC18RgoAAAAKqQff/wxBg4cGEmSxLhx41bbLzs7O7KzszdiZQAArC9hBQAAABXOqqDis88+i7///e+r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vXr1tEqG/4+9P4/zsqr/x//HsI0oMArKYoLiioCY4oaWoaBkrkmaqR9BUVNRA3qXTqW5o1bikmJuaCVh5m6ukcDbBUQUw0xyK6gE3m4zgjqyzO+Pvs3PCVRkXrxeM3C/327X7fa6znXmnOdcKJfOY865AIAGElYAAADQqPTv3z+1tbWfeL2srCznnXdezjvvvCJWBQDA6uSdFQAAAAAAQEkJKwAAAAAAgJISVgAAAAAAACUlrAAAAAAAAEpKWAEAAAAAAJSUsAIAAAAAACgpYQUAAAAAAFBSwgoAAAAAAKCkhBUAAAAAAEBJCSsAAAAAAICSElYAAAAAAAAlJawAAAAAAABKSlgBAAAAAACUlLACAAAAAAAoqRalLgAAAKAxeWD6wpLOv2tJZwcAgNKwsgIAAAAAACgpYQUAAAAAAFBSwgoAAAAAAKCkivbOipqamkybNi1///vf8/7772ejjTbKDjvskO7duxerBAAAAAAAoBFa7WHFE088kSuuuCL33XdfFi9enIqKirRu3Tpvv/12ampqsvnmm+fEE0/MSSedlLZt267ucgAAAAAAgEZmtYYVBx10UJ599tkceeSReeSRR7LTTjuldevWdddfe+21/O///m9+85vf5LLLLssvf/nL7LPPPquzJAAAAADgUzwwfWFJ59+1pLMDpbJaw4r9998/d9xxR1q2bLnC65tvvnk233zzDBkyJC+++GLeeOON1VkOAAAAAADQCK3WsOLb3/72Svft2bNnevbsuRqrAQAAAAAAGqNmxZpo7ty5+cc//lF3/vTTT2fEiBG57rrrilUCAAAAAADQCBUtrDjyyCPz2GOPJUnmzZuXffbZJ08//XR++MMf5rzzzitWGQAAAAAAQCNTtLDihRdeyC677JIk+e1vf5vevXvnySefzK233pqbb765WGUAAAAAAACNTNHCisWLF6e8vDxJ8oc//CEHHXRQkqRHjx5erA0AAAAAAGuxooUVvXr1yrXXXpv//d//zaOPPpqvfvWrSZJ//etf6dChQ7HKAIAmb+nSpTnrrLPSvXv3tG7dOltssUXOP//81NbWlro0AAAAgFXSolgTXXLJJfn617+en/zkJxkyZEi23377JMm9995btz0UAPDZLrnkkowdOza33HJLevXqlWeeeSbHHntsKioqcvrpp5e6PAAAAIDPrWhhRf/+/fPmm2+muro6G2ywQV37iSeemHXXXbdYZQBAk/fkk0/m4IMPzv77758k2WyzzfKb3/wmTz/99Ar719TUpKampu68urq6KHUCAAAArKyibQOVJM2bN68XVCT//gFLx44di1kGADRpu+++eyZOnJi//vWvSZLnn38+jz/+ePbbb78V9h89enQqKirqjq5duxazXAAAAIDPtFpXVuywww4pKytbqb7PPvvs6iwFANYYZ555Zqqrq9OjR480b948S5cuzYUXXpijjjpqhf0rKyszatSouvPq6mqBBQAAANCorNaw4pBDDqn7/OGHH+aaa65Jz549069fvyTJ1KlT8+c//zmnnHLK6iwDANYov/3tb3Prrbdm/Pjx6dWrV2bOnJkRI0Zk4403zpAhQ5brX15envLy8hJUCgAAALByVmtY8eMf/7ju8/HHH5/TTz89559//nJ95s6duzrLAIA1yve+972ceeaZOeKII5Ik2223Xf7+979n9OjRKwwrAAAAABq7or2z4vbbb88xxxyzXPvRRx+dO+64o1hlAECT9/7776dZs/qP8ObNm2fZsmUlqggAAACgYVbryoqPa926dZ544olstdVW9dqfeOKJrLPOOsUqAwCavAMPPDAXXnhhunXrll69euW5557LZZddluOOO67UpQEAAACskqKFFSNGjMjJJ5+cZ599NrvsskuSZNq0abnpppty1llnFasMAGjyrrrqqpx11lk55ZRTsmDBgmy88cb59re/nbPPPrvUpQEAAACskqKFFWeeeWY233zzXHHFFfn1r3+dJNl2220zbty4HH744cUqAwCavLZt2+byyy/P5ZdfXupSAAAAAAqiaGFFkhx++OGCCQAAAAAAoJ6ivWD7Pz766KP84x//yJw5c+odn8c///nPHH300enQoUNat26d7bbbLs8888xqqhgAAAAAAFidihZWvPzyy/nyl7+c1q1bZ9NNN0337t3TvXv3bLbZZunevftKj/POO+9kjz32SMuWLfPggw/mxRdfzM9+9rNssMEGq7F6AAAAGoulS5fmrLPOSvfu3dO6detsscUWOf/881NbW1vq0gAAWEVF2wZq6NChadGiRe6///506dIlZWVlqzTOJZdckq5du2bcuHF1bZ8n7AAAAKBpu+SSSzJ27Njccsst6dWrV5555pkce+yxqaioyOmnn17q8gAAWAVFCytmzpyZGTNmpEePHg0a5957782gQYNy2GGHZfLkyfnCF76QU045JSeccMIK+9fU1KSmpqbuvLq6ukHzAwAAUFpPPvlkDj744Oy///5Jks022yy/+c1v8vTTT6+wv/8vBABo/Iq2DVTPnj3z5ptvNnic1157LWPHjs1WW22Vhx9+OCeffHJOP/303HLLLSvsP3r06FRUVNQdXbt2bXANAAAAlM7uu++eiRMn5q9//WuS5Pnnn8/jjz+e/fbbb4X9/X8hAEDjV7Sw4pJLLsn3v//9TJo0KW+99Vaqq6vrHStr2bJl2XHHHXPRRRdlhx12yIknnpgTTjgh11577Qr7V1ZWpqqqqu6YO3duob4lAAAASuDMM8/MEUcckR49eqRly5bZYYcdMmLEiBx11FEr7O//CwEAGr+ibQM1cODAJMmAAQPqtdfW1qasrCxLly5dqXG6dOmSnj171mvbdtttc8cdd6ywf3l5ecrLy1ehYgAAABqj3/72t7n11lszfvz49OrVKzNnzsyIESOy8cYbZ8iQIcv19/+FAACNX9HCiscee6wg4+yxxx6ZPXt2vba//vWv2XTTTQsyPgAAAI3b9773vbrVFUmy3Xbb5e9//3tGjx69wrACAIDGr2hhxVe+8pWCjDNy5Mjsvvvuueiii3L44Yfn6aefznXXXZfrrruuIOMDAADQuL3//vtp1qz+rsbNmzfPsmXLSlQRAAANVbSwIknefffd3HjjjfnLX/6SJOnVq1eOO+64VFRUrPQYO++8c+66665UVlbmvPPOS/fu3XP55Zd/4t6kAAAArFkOPPDAXHjhhenWrVt69eqV5557LpdddlmOO+64UpcGAMAqKlpY8cwzz2TQoEFp3bp1dtlllyTJZZddlgsvvDCPPPJIdtxxx5Ue64ADDsgBBxywukoFAACgEbvqqqty1lln5ZRTTsmCBQuy8cYb59vf/nbOPvvsUpcGAMAqKlpYMXLkyBx00EG5/vrr06LFv6ddsmRJjj/++IwYMSJTpkwpVikAAAA0YW3bts3ll1+eyy+/vNSlAABQIEVdWfHxoCJJWrRoke9///vZaaedilUGAAAAAADQyDT77C6F0a5du8yZM2e59rlz56Zt27bFKgMAAAAAAGhkihZWfPOb38ywYcNy2223Ze7cuZk7d24mTJiQ448/Pt/61reKVQYAAAAAANDIFG0bqJ/+9KcpKyvLMccckyVLliRJWrZsmZNPPjkXX3xxscoAAAAAAAAamaKFFa1atcoVV1yR0aNH59VXX02SbLHFFll33XWLVQIAAAAAANAIFS2sqKqqytKlS9O+fftst912de1vv/12WrRokXbt2hWrFAAAAAAAoBEp2jsrjjjiiEyYMGG59t/+9rc54ogjilUGAAAAAADQyBQtrJg2bVr22muv5dr79++fadOmFasMAAAAAACgkSlaWFFTU1P3Yu2PW7x4cT744INilQEAAAAAADQyRXtnxS677JLrrrsuV111Vb32a6+9Nn379i1WGQAAAAAARbX33nuntrZ2pfo+9thjq7kaaJyKFlZccMEFGThwYJ5//vkMGDAgSTJx4sRMnz49jzzySLHKAAAAAAAoqi9+8Yt1n1999dU8++yzOeyww0pXEDRCRQsr9thjjzz11FO59NJL89vf/jatW7dOnz59cuONN2arrbYqVhkAAAAAAEV12WWXJUleeeWV7LXXXvm///u/bLnlljnllFNKXBk0HkULK5J/J4jjx48v5pQAAAAAACX317/+NXvttVcOPvjgDBs2LPvss0/WX3/9HHnkkaUuDRqFooYVr776asaNG5fXXnstl19+eTp27JgHH3ww3bp1S69evYpZCgAAAABAUbz00ksZMGBADj300Lp3+t5777054IADUlFRkf3337/EFULpNSvWRJMnT852222XadOm5Y477sjChQuTJM8//3x+/OMfF6sMAAAAAICi2muvvXL44YfXBRVJ8qUvfSm/+c1vctRRR5WwMmg8ihZWnHnmmbngggvy6KOPplWrVnXte++9d6ZOnVqsMgAAAAAAiuroo4/OmDFjlmvfb7/9Mnbs2BJUBI1P0cKKWbNm5etf//py7R07dsybb75ZrDIAAAAAAIrqJz/5ySde+9a3vlXESqDxKlpYsf766+eNN95Yrv25557LF77whWKVAQAAAAAANDJFCyuOOOKInHHGGZk3b17KysqybNmyPPHEE/mf//mfHHPMMcUqAwAAAAAAaGSKFlZcdNFF6dGjR7p27ZqFCxemZ8+e2XPPPbP77rvnRz/6UbHKAAAAAAAAGpkWxZqoVatWuf7663P22Wdn1qxZWbhwYXbYYYdstdVWxSoBAAAAAABohIoWVvxH165d07Vr1yxdujSzZs3KO++8kw022KDYZQAAAAAAAI1E0baBGjFiRG688cYkydKlS/OVr3wlO+64Y7p27ZpJkyYVqwwAAAAAgJJ47bXX0rZt2+U+A0UMK373u99l++23T5Lcd999ee211/LSSy9l5MiR+eEPf1isMgAAAAAASqasrGyFn2FtV7Sw4s0330znzp2TJA888EAOP/zwbL311jnuuOMya9asYpUBAAAAAFAytbW1K/wMa7uihRWdOnXKiy++mKVLl+ahhx7KPvvskyR5//3307x582KVAQAAAAAANDJFe8H2sccem8MPPzxdunRJWVlZBg4cmCSZNm1aevToUawyAAAAAACARqZoYcU555yT3r17Z+7cuTnssMNSXl6eJGnevHnOPPPMYpUBAAAAAAA0MkULK5LkG9/4xnJtQ4YMKWYJAAAAAABAI7Na31kxYcKEle47d+7cPPHEE6uxGgBYc/zzn//M0UcfnQ4dOqR169bZbrvt8swzz5S6LAAAAD5DWVnZCj/D2m61hhVjx47Ntttum0svvTR/+ctflrteVVWVBx54IEceeWR23HHHvPXWW6uzHABYI7zzzjvZY4890rJlyzz44IN58cUX87Of/SwbbLBBqUsDAADgU7Rr1y5HH330cp+B1bwN1OTJk3PvvffmqquuSmVlZdZbb7106tQp66yzTt55553MmzcvG264YYYOHZoXXnghnTp1Wp3lAMAa4ZJLLknXrl0zbty4urbu3buXsCIAAABWxoYbbphrrrlmuc9AEd5ZcdBBB+Wggw7Km2++mccffzx///vf88EHH2TDDTfMDjvskB122CHNmq3WBR4AsEa59957M2jQoBx22GGZPHlyvvCFL+SUU07JCSecsML+NTU1qampqTuvrq4uVqkAAAAAK6VoL9jecMMNc8ghhxRrOgBYY7322msZO3ZsRo0alR/84AeZPn16Tj/99LRq1SpDhgxZrv/o0aNz7rnnlqBSAAAAgJVjSQMANDHLli3LjjvumIsuuig77LBDTjzxxJxwwgm59tprV9i/srIyVVVVdcfcuXOLXDEAAADApxNWAEAT06VLl/Ts2bNe27bbbps5c+assH95eXnatWtX7wAAAABoTIQVANDE7LHHHpk9e3a9tr/+9a/ZdNNNS1QRAAAAQMMIKwCgiRk5cmSmTp2aiy66KK+88krGjx+f6667LsOHDy91aQAAAACrpOhhxUcffZTZs2dnyZIlxZ4aANYIO++8c+6666785je/Se/evXP++efn8ssvz1FHHVXq0gAAAFiBvfbaK6+++uonXh8xYkS+853vFLEiaHyKFla8//77GTZsWNZdd9306tWrbl/t0047LRdffHGxygCANcIBBxyQWbNm5cMPP8xf/vKXnHDCCaUuCQCK6p///GeOPvrodOjQIa1bt852222XZ555ptRlAcAKTZkyJe+9994nXt9mm23yxBNPFLEiaHxaFGuiysrKPP/885k0aVK++tWv1rUPHDgw55xzTs4888xilQIAAEAT9s4772SPPfbIXnvtlQcffDAbbbRRXn755WywwQalLg0APtG1116bLl26rPDa66+/nhdeeKHIFUHjUrSw4u67785tt92W3XbbLWVlZXXtvXr1+tQlUAAAAPBxl1xySbp27Zpx48bVtXXv3r2EFQHAZ5s8eXJat279idd79uxZxGqg8SlaWPF///d/6dix43LtixYtqhdeAAAAwKe59957M2jQoBx22GGZPHlyvvCFL+SUU075xG0Ra2pqUlNTU3deXV1drFIBoM6ECROy/fbbl7oMaLSK9s6KnXbaKb///e/rzv8TUNxwww3p169fscoAAACgiXvttdcyduzYbLXVVnn44Ydz8skn5/TTT88tt9yywv6jR49ORUVF3dG1a9ciVwwAwGcp2sqKiy66KPvtt19efPHFLFmyJFdccUVefPHFPPnkk5k8eXKxygAAAKCJW7ZsWXbaaadcdNFFSZIddtghL7zwQq699toMGTJkuf6VlZUZNWpU3Xl1dbXAAoCiev311z/xfRXAvxVtZcWXvvSlzJw5M0uWLMl2222XRx55JB07dsxTTz2Vvn37FqsMAAAAmrguXbost6/3tttumzlz5qywf3l5edq1a1fvAIBi6tatW1q2bFnqMqBRK9rKiiTZYostcv311xdzSgAAANYwe+yxR2bPnl2v7a9//Ws23XTTElUEAJ+turo648ePz1NPPZV58+YlSTp37pzddtstRx99dNq2bVviCqG0ihpWJMmCBQuyYMGCLFu2rF57nz59il0KAAAATdDIkSOz++6756KLLsrhhx+ep59+Otddd12uu+66UpcGACv0wgsvZN99981HH32UPffcM5tvvnmSZP78+TnrrLNy3nnn5eGHH/YzUtZqRQsrZsyYkSFDhuQvf/lLamtr610rKyvL0qVLi1UKAAAATdjOO++cu+66K5WVlTnvvPPSvXv3XH755TnqqKNKXRoArNDw4cOzzz775Kabbkrz5s3rXVuyZEmGDRuWU089NVOmTClRhVB6RQsrjjvuuGy99da58cYb06lTp5SVlRVragAAANYwBxxwQA444IBSlwEAK2X69OkZO3bsckFFkrRo0SJnnnlmdtxxxxJUBo1H0cKK1157LXfccUe23HLLYk0JAAAAAFByG264YWbNmpWePXuu8PqsWbPSsWPHIlcFjUvRwooBAwbk+eefF1YAAAAAAGuV008/PcOGDcvzzz+ffffdN506dUry73dWPPzww7nyyitzzjnnlLZIKLGihRU33HBDhgwZkhdeeCG9e/dOy5Yt610/6KCDilUKAAAAAEDR/M///E822GCD/OxnP8sll1xS79o222yTK664Iscff3yJqoPGoWhhxVNPPZUnnngiDz744HLXvGAbAAAAAFiTDRs2LMOGDUtVVVXmzZuXJOncuXMqKipKXBk0Ds2KNdFpp52Wo48+Om+88UaWLVtW7xBUAAAAAABrg4qKimyzzTbZZpttBBXwMUULK956662MHDmybj82AAAAAACApIhhxaGHHprHHnusoGNefPHFKSsry4gRIwo6LgAAAAAAUDxFe2fF1ltvncrKyjz++OPZbrvtlnvB9umnn/65xps+fXp+8YtfpE+fPoUsEwAAAAAAKLKihRU33HBD2rRpk8mTJ2fy5Mn1rpWVlX2usGLhwoU56qijcv311+eCCy741L41NTWpqampO6+urv58hQMAAAAAAKtV0cKK119/vWBjDR8+PPvvv38GDhz4mWHF6NGjc+655xZsbgAAAAAAoLCK9s6KQpkwYUKeffbZjB49eqX6V1ZWpqqqqu6YO3fuaq4QAAAAAAD4PFbryopRo0bl/PPPz3rrrZdRo0Z9at/LLrvsM8ebO3duvvOd7+TRRx/NOuuss1I1lJeXp7y8fKX6AgAAAAAAxbdaw4rnnnsuixcvrvvcUDNmzMiCBQuy44471rUtXbo0U6ZMyc9//vPU1NSkefPmDZ4HAAAAAAAontUaVjz22GMr/LyqBgwYkFmzZtVrO/bYY9OjR4+cccYZggoAAAAAAGiCivbOiuOOOy7vvffecu2LFi3Kcccdt1JjtG3bNr179653rLfeeunQoUN69+5d6JIBAAAAAIAiKFpYccstt+SDDz5Yrv2DDz7IL3/5y2KVAQAAAAAANDKrdRuoJKmurk5tbW1qa2vz3nvv1Xsx9tKlS/PAAw+kY8eOqzz+pEmTClAlAAAAAABQKqs9rFh//fVTVlaWsrKybL311stdLysry7nnnru6ywAAAAAAABqp1R5WPPbYY6mtrc3ee++dO+64I+3bt6+71qpVq2y66abZeOONV3cZAAAAAABAI7Xaw4qvfOUrSZLXX389Xbt2TbNmRXtNBgAAAAAA0ASs9rDiPzbddNO8++67efrpp7NgwYIsW7as3vVjjjmmWKUAAAAAAACNSNHCivvuuy9HHXVUFi5cmHbt2qWsrKzuWllZmbACAAAAAADWUkXbk+m73/1ujjvuuCxcuDDvvvtu3nnnnbrj7bffLlYZAAAAAABAI1O0sOKf//xnTj/99Ky77rrFmhIAAAAAAGgCihZWDBo0KM8880yxpgMAAAAAAJqIor2zYv/998/3vve9vPjii9luu+3SsmXLetcPOuigYpUCAAAAAAA0IkULK0444YQkyXnnnbfctbKysixdurRYpQAAAAAAAI1I0cKKZcuWFWsqAAAAAACgCSnaOysAAAAAAABWpGgrK1a0/dPHnX322UWqBAAAAAAAaEyKFlbcdddd9c4XL16c119/PS1atMgWW2whrAAAAAAAgLVU0cKK5557brm26urqDB06NF//+teLVQYAAAAAANDIlPSdFe3atcu5556bs846q5RlAAAAAAAAJVTyF2xXVVWlqqqq1GUAQJN18cUXp6ysLCNGjCh1KQAAAACrpGjbQF155ZX1zmtra/PGG2/kV7/6Vfbbb79ilQEAa5Tp06fnF7/4Rfr06VPqUgAAAABWWdHCijFjxtQ7b9asWTbaaKMMGTIklZWVxSoDANYYCxcuzFFHHZXrr78+F1xwQanLAQAAAFhlRQsrXn/99U+89sEHHxSrDABYYwwfPjz7779/Bg4c+KlhRU1NTWpqaurOq6uri1EeAAAAwEor6Tsrampqctlll6V79+6lLAMAmpwJEybk2WefzejRoz+z7+jRo1NRUVF3dO3atQgVAgAAAKy81R5W1NTUpLKyMjvttFN233333H333UmSm266Kd27d8+YMWMycuTI1V0GAKwx5s6dm+985zu59dZbs84663xm/8rKylRVVdUdc+fOLUKVAAAAACtvtW8DdfbZZ+cXv/hFBg4cmCeffDKHHXZYjj322EydOjWXXXZZDjvssDRv3nx1lwEAa4wZM2ZkwYIF2XHHHevali5dmilTpuTnP/95ampq6j1by8vLU15eXopSAQAAAFbKal9Zcfvtt+eXv/xlfve73+WRRx7J0qVLs2TJkjz//PM54ogjBBUA8DkNGDAgs2bNysyZM+uOnXbaKUcddVRmzpzp2QrAWufiiy9OWVlZRowYUepSAABYRat9ZcU//vGP9O3bN0nSu3fvlJeXZ+TIkSkrK1vdUwPAGqlt27bp3bt3vbb11lsvHTp0WK4dANZ006dPzy9+8Yv06dOn1KUAANAAq31lxdKlS9OqVau68xYtWqRNmzare1oAAADWcAsXLsxRRx2V66+/PhtssMEn9qupqUl1dXW9AwCAxmW1r6yora3N0KFD6/bK/vDDD3PSSSdlvfXWq9fvzjvvXN2lAMAaa9KkSaUuAQCKbvjw4dl///0zcODAXHDBBZ/Yb/To0Tn33HOLWBkAAJ/Xag8rhgwZUu/86KOPXt1TAgAAsIabMGFCnn322UyfPv0z+1ZWVmbUqFF159XV1enatevqLA8AgM9ptYcV48aNW91TAAAAsBaZO3duvvOd7+TRRx/NOuus85n9y8vL61b7AwDQOK32sAIAAAAKacaMGVmwYEF23HHHuralS5dmypQp+fnPf56ampo0b968hBUCAPB5CSsAAABoUgYMGJBZs2bVazv22GPTo0ePnHHGGYIKAIAmSFgBAABAk9K2bdv07t27Xtt6662XDh06LNcOAEDT0KzUBQAAAAAAAGs3KysAAABo8iZNmlTqEgAAaAArKwAAAAAAgJISVgAAAAAAACUlrAAAAAAAAEpKWAEAAAAAAJSUsAIAAAAAACgpYQUAAAAAAFBSwgoAAAAAAKCkhBUAAAAAAEBJCSsAAAAAAICSElYAAAAAAAAlJawAAAAAAABKSlgBAAAAAACUlLACAAAAAAAoKWEFAAAAAABQUsIKAAAAAACgpIQVAAAAAABASQkrAAAAAACAkhJWAAAAAAAAJSWsAAAAAAAASkpYAQAAAAAAlJSwAgAAAAAAKClhBQAAAAAAUFJNLqwYPXp0dt5557Rt2zYdO3bMIYccktmzZ5e6LAAAAAAAYBU1ubBi8uTJGT58eKZOnZpHH300ixcvzr777ptFixaVujQAAAAAAGAVtCh1AZ/XQw89VO/85ptvTseOHTNjxozsueeeJaoKAAAAAABYVU0urPhvVVVVSZL27duv8HpNTU1qamrqzqurq4tSFwAAAAAAsHKa3DZQH7ds2bKMGDEie+yxR3r37r3CPqNHj05FRUXd0bVr1yJXCQAAAAAAfJomHVYMHz48L7zwQiZMmPCJfSorK1NVVVV3zJ07t4gVAgAAAAAAn6XJbgN16qmn5v7778+UKVOyySabfGK/8vLylJeXF7EyAAAAAADg82hyYUVtbW1OO+203HXXXZk0aVK6d+9e6pIAAAAAAIAGaHJhxfDhwzN+/Pjcc889adu2bebNm5ckqaioSOvWrUtcHQAAAAAA8Hk1uXdWjB07NlVVVenfv3+6dOlSd9x2222lLg0AAAAAAFgFTW5lRW1tbalLAAAAAAAACqjJrawAAAAAAADWLMIKAAAAAABYgwwdOjSHHHJI0eft379/RowYsUpfK6wAAAAAAOBzGzp0aMrKylJWVpaWLVumU6dO2WeffXLTTTdl2bJlpS6vUbr55pvr7llZWVnatGmTvn375s477yx1aSUnrACAJmb06NHZeeed07Zt23Ts2DGHHHJIZs+eXeqyAAAAWAt99atfzRtvvJG//e1vefDBB7PXXnvlO9/5Tg444IAsWbKk1OWVzEcfffSJ19q1a5c33ngjb7zxRp577rkMGjQohx9++Fr///bCCgBoYiZPnpzhw4dn6tSpefTRR7N48eLsu+++WbRoUalLAwAAYC1TXl6ezp075wtf+EJ23HHH/OAHP8g999yTBx98MDfffHNdv3fffTfHH398Ntpoo7Rr1y577713nn/++brr55xzTr74xS/mpptuSrdu3dKmTZuccsopWbp0aS699NJ07tw5HTt2zIUXXlhv/s8a99VXX83BBx+cTp06pU2bNtl5553zhz/8od4Ym222WS666KIcd9xxadu2bbp165brrruuXp+5c+fm8MMPz/rrr5/27dvn4IMPzt/+9re66//ZdunCCy/MxhtvnG222eYT71lZWVk6d+6czp07Z6uttsoFF1yQZs2a5U9/+lNdn1/96lfZaaed0rZt23Tu3DlHHnlkFixYUG+cP//5zznggAPSrl27tG3bNl/+8pfz6quvrnDO6dOnZ6ONNsoll1zyuf48fvWrX2WzzTZLRUVFjjjiiLz33nt1fRYtWpRjjjkmbdq0SZcuXfKzn/3sE7/nlSGsAIAm5qGHHsrQoUPTq1evbL/99rn55pszZ86czJgxY4X9a2pqUl1dXe8AAACA1WXvvffO9ttvX29ro8MOOywLFizIgw8+mBkzZmTHHXfMgAED8vbbb9f1efXVV/Pggw/moYceym9+85vceOON2X///fOPf/wjkydPziWXXJIf/ehHmTZt2kqPu3Dhwnzta1/LxIkT89xzz+WrX/1qDjzwwMyZM6dezT/72c+y00475bnnnsspp5ySk08+uW6lw+LFizNo0KC0bds2//u//5snnngibdq0yVe/+tV6KygmTpyY2bNn59FHH83999+/Uvdq6dKlueWWW5IkO+64Y1374sWLc/755+f555/P3Xffnb/97W8ZOnRo3fV//vOf2XPPPVNeXp4//vGPmTFjRo477rgVrmb54x//mH322ScXXnhhzjjjjM/153H33Xfn/vvvz/3335/Jkyfn4osvrrv+ve99L5MnT84999yTRx55JJMmTcqzzz67Ut/3irRY5a8EABqFqqqqJEn79u1XeH306NE599xzi1kSAKxWo0ePzp133pmXXnoprVu3zu67755LLrnkU3+DEQAorh49etStFHj88cfz9NNPZ8GCBSkvL0+S/PSnP83dd9+d3/3udznxxBOTJMuWLctNN92Utm3bpmfPntlrr70ye/bsPPDAA2nWrFm22WabXHLJJXnsscey6667rtS422+/fbbffvu6us4///zcdddduffee3PqqafWtX/ta1/LKaeckiQ544wzMmbMmDz22GPZZpttctttt2XZsmW54YYbUlZWliQZN25c1l9//UyaNCn77rtvkmS99dbLDTfckFatWn3qvamqqkqbNm2SJB988EFatmyZ6667LltssUVdn+OOO67u8+abb54rr7wyO++8cxYuXJg2bdrk6quvTkVFRSZMmJCWLVsmSbbeeuvl5rrrrrtyzDHH5IYbbsg3v/nNz/3ncfPNN6dt27ZJkv/3//5fJk6cmAsvvDALFy7MjTfemF//+tcZMGBAkuSWW27JJpts8qnf+6cRVgBAE7Zs2bKMGDEie+yxR3r37r3CPpWVlRk1alTdeXV1dbp27VqsEgGg4P6zJeLOO++cJUuW5Ac/+EH23XffvPjii1lvvfVKXR4AkKS2trbuB/vPP/98Fi5cmA4dOtTr88EHH9TbtmizzTar+8F4knTq1CnNmzdPs2bN6rX9ZzuklRl34cKFOeecc/L73/8+b7zxRpYsWZIPPvhguZUVffr0qfv8n22aPj7PK6+8Uq+2JPnwww/r1b/ddtt9ZlCRJG3btq1bgfD+++/nD3/4Q0466aR06NAhBx54YJJkxowZOeecc/L888/nnXfeqXth+Zw5c9KzZ8/MnDkzX/7yl+uCihWZNm1a7r///vzud7/LIYccUte+qn8eXbp0qbsnr776aj766KPsuuuuddfbt2/foF8eEVYAQBM2fPjwvPDCC3n88cc/sU95eXndb0oAwJrgoYceqnd+8803p2PHjpkxY0b23HPPElUFAHzcX/7yl3Tv3j3JvwODLl26ZNKkScv1W3/99es+//cP3svKylbY9p8f3K/MuP/zP/+TRx99ND/96U+z5ZZbpnXr1vnGN76x3AuwP2uevn375tZbb11uno022qju88r+0kSzZs2y5ZZb1p336dMnjzzySC655JIceOCBWbRoUQYNGpRBgwbl1ltvzUYbbZQ5c+Zk0KBBdXW3bt36M+fZYost0qFDh9x0003Zf//9677Hhvx5/OeerA7CCgBook499dTcf//9mTJlSoOWWQJAU/dZWyLW1NSkpqam7tz7mwBg9frjH/+YWbNmZeTIkUn+/S6GefPmpUWLFtlss80KNs/KjPvEE09k6NCh+frXv57k3z+o//iLsVd2nttuuy0dO3ZMu3btGlj1ijVv3jwffPBBkuSll17KW2+9lYsvvrhuZ4RnnnmmXv8+ffrklltuyeLFiz9xdcWGG26YO++8M/3798/hhx+e3/72t2nZsmVB/jy22GKLtGzZMtOmTUu3bt2SJO+8807++te/5itf+coqjekF2wDQxNTW1ubUU0/NXXfdlT/+8Y91v6kCAGujldkScfTo0amoqKg7bIcIAIVTU1OTefPm5Z///GeeffbZXHTRRTn44INzwAEH5JhjjkmSDBw4MP369cshhxySRx55JH/729/y5JNP5oc//OFyP4T/PFZm3K222ip33nlnZs6cmeeffz5HHnnk514dcNRRR2XDDTfMwQcfnP/93//N66+/nkmTJuX000/PP/7xj89dd21tbebNm5d58+bl9ddfz3XXXZeHH344Bx98cJKkW7duadWqVa666qq89tpruffee3P++efXG+PUU09NdXV1jjjiiDzzzDN5+eWX86tf/arupeD/0bFjx/zxj3/MSy+9lG9961tZsmRJQf482rRpk2HDhuV73/te/vjHP+aFF17I0KFD623Z9XkJKwCgiRk+fHh+/etfZ/z48Wnbtm3df+D85zcwAGBt8p8tESdMmPCJfSorK1NVVVV3zJ07t4gVAsCa7aGHHkqXLl2y2Wab5atf/Woee+yxXHnllbnnnnvSvHnzJP/ePuiBBx7InnvumWOPPTZbb711jjjiiPz9739Pp06dVnnulRn3sssuywYbbJDdd989Bx54YAYNGpQdd9zxc82z7rrrZsqUKenWrVsOPfTQbLvtthk2bFg+/PDDVVppUV1dnS5duqRLly7Zdttt87Of/SznnXdefvjDHyb599ZSN998c26//fb07NkzF198cX7605/WG6NDhw754x//mIULF+YrX/lK+vbtm+uvv36Fqyw6d+5ct9rlqKOOyrJlywry5/GTn/wkX/7yl3PggQdm4MCB+dKXvpS+fft+7vvxH2W1tbW1q/zVTVB1dXUqKipSVVW12pbsADRlD0xfWNL5d62+v6TzdxhwREnnXxn/eUHZfxs3blyGDh36mV/vWQjw6TwLG/+z8D9OPfXU3HPPPZkyZcrnWmnoWQjw6TwLm86zENYk3lkBAE3MWvZ7BgCwnNra2px22mm56667MmnSJFsiAgCsAYQVAAAANCnDhw/P+PHjc88999RtiZgkFRUVad26dYmrAwBgVXhnBQAAAE3K2LFjU1VVlf79+9ft99ylS5fcdtttpS4NAIBVZGUFAAAATYotEQEA1jxWVgAAAAAAACUlrAAAAAAAAEpKWAEAAAAAAJSUsAIAAAAAACgpYQUAAAAAAFBSwgoAAAAAAPichg4dmkMOOaTUZawxWpS6AAAAAAAA+LgHpi8s6nxf27nN5/6aK664IrW1tauhmrWTsAIAAAAAAD6nioqKUpewRrENFAAAAAAAfE4f3wbqoYceype+9KWsv/766dChQw444IC8+uqrdX1/+ctfpk2bNnn55Zfr2k455ZT06NEj77//frFLb5SEFQAAAAAA0ACLFi3KqFGj8swzz2TixIlp1qxZvv71r2fZsmVJkmOOOSZf+9rXctRRR2XJkiX5/e9/nxtuuCG33npr1l133RJX3zjYBgoAAAAAABpg8ODB9c5vuummbLTRRnnxxRfTu3fvJMkvfvGL9OnTJ6effnruvPPOnHPOOenbt28pym2UhBXAGqfYL2D6b6vyQiYAAAAAmq6XX345Z599dqZNm5Y333yzbkXFnDlz6sKKDTbYIDfeeGMGDRqU3XffPWeeeWYpS250hBUAAAAAANAABx54YDbddNNcf/312XjjjbNs2bL07t07H330Ub1+U6ZMSfPmzfPGG29k0aJFadu2bYkqbnyEFQAF9tbECSWdv8OAI0o6PwAAAMDa5K233srs2bNz/fXX58tf/nKS5PHHH1+u35NPPplLLrkk9913X84444yceuqpueWWW4pdbqMlrAAAAAAAgFW0wQYbpEOHDrnuuuvSpUuXzJkzZ7ktnt577738v//3/3L66adnv/32yyabbJKdd945Bx54YL7xjW+UqPLGRVgBAAAUlFWGAACsTZo1a5YJEybk9NNPT+/evbPNNtvkyiuvTP/+/ev6fOc738l6662Xiy66KEmy3Xbb5aKLLsq3v/3t9OvXL1/4whdKVH3jIawAAAAAgAIS3EPDfW3nNqUu4TPV1NSkTZt/1zlw4MC8+OKL9a7X1tbWfb7pppuW+/pRo0Zl1KhRq7fIJkRYAQAAa5gHpi8s6fy7lnR2APAsBFavJUuW5K9//WueeuqpfPvb3y51OWuMZqUuAAAAAAAAmooXXnghO+20U3r16pWTTjqp1OWsMaysAAAAAACAlfTFL34x77//fqnLWONYWQEAAAAAAJSUsAIAAAAAACgpYQUAAAAAAFBSwgoAAAAAAKCkhBUAAAAAAEBJCSsAAAAAAICSElYAAAAAAEAT0b9//4wYMaLUZRRci1IXAAAAAAAAH/fWxAlFna/DgCOKOh/Ls7ICAAAAAAAoKWEFAAAAAAB8Tv3798/pp5+e73//+2nfvn06d+6cc845J0nyt7/9LWVlZZk5c2Zd/3fffTdlZWWZNGlSkmTSpEkpKyvLww8/nB122CGtW7fO3nvvnQULFuTBBx/Mtttum3bt2uXII4/M+++/X2/uJUuW5NRTT01FRUU23HDDnHXWWamtra27/qtf/So77bRT2rZtm86dO+fII4/MggULVvctaRBhBQAAAAAArIJbbrkl6623XqZNm5ZLL7005513Xh599NHPNcY555yTn//853nyySczd+7cHH744bn88sszfvz4/P73v88jjzySq666arl5W7RokaeffjpXXHFFLrvsstxwww111xcvXpzzzz8/zz//fO6+++787W9/y9ChQwvxLa823lnRCBV7P7b/Zn82AAAAAIDP1qdPn/z4xz9Okmy11Vb5+c9/nokTJ2arrbZa6TEuuOCC7LHHHkmSYcOGpbKyMq+++mo233zzJMk3vvGNPPbYYznjjDPqvqZr164ZM2ZMysrKss0222TWrFkZM2ZMTjjhhCTJcccdV9d38803z5VXXpmdd945CxcuTJs2bRr8fa8OVlYAAAAAAMAq6NOnT73zLl26fO7tlj4+RqdOnbLuuuvWBRX/afvvMXfbbbeUlZXVnffr1y8vv/xyli5dmiSZMWNGDjzwwHTr1i1t27bNV77ylSTJnDlzPldtxSSsAAAAAACAVdCyZct652VlZVm2bFmaNfv3j94//h6JxYsXf+YYZWVlnzjmylq0aFEGDRqUdu3a5dZbb8306dNz1113JUk++uijlR6n2GwDBY3QA9MXlnT+r+3cOJeCAQAAAEBTsNFGGyVJ3njjjeywww5JUu9l2w01bdq0eudTp07NVlttlebNm+ell17KW2+9lYsvvjhdu3ZNkjzzzDMFm3t1sbICAAAAAAAKqHXr1tltt91y8cUX5y9/+UsmT56cH/3oRwUbf86cORk1alRmz56d3/zmN7nqqqvyne98J0nSrVu3tGrVKldddVVee+213HvvvTn//PMLNvfqYmUFsBwveQeg1KwyBGBt51kI0PTddNNNGTZsWPr27Zttttkml156afbdd9+CjH3MMcfkgw8+yC677JLmzZvnO9/5Tk488cQk/17VcfPNN+cHP/hBrrzyyuy444756U9/moMOOqggc68uwooVKPV/EOxa0tkLo9T30H9UAQANIbgHYG3nWQiUWlP4e2DSpEnLtd199911n7fddts8+eST9a5//B0W/fv3r3eeJEOHDs3QoUPrtZ1zzjk555xzVjjv2LFjV1jbt771rXzrW9/6xLkbI2EFALAcoXPDuYcATZu/xxvOPQQAPg9hBWskvwEC0LSV+u/xpOn/XV7qe9jU7x8AAADF1WTDiquvvjo/+clPMm/evGy//fa56qqrsssuu5S6LAAoGs9CANZ2a/KzsNShc9L0g+dS38Omfv8AoNialbqAVXHbbbdl1KhR+fGPf5xnn30222+/fQYNGpQFCxaUujQAKArPQgDWdp6FAABrlia5suKyyy7LCSeckGOPPTZJcu211+b3v/99brrpppx55pn1+tbU1KSmpqbuvKqqKklSXV39ieO/v7C0+2q+t+j9ks7f8lPuzcpyDxt2D90/968h3L+GWZn717Zt25SVlRWhmk/mWbj6+XepYdy/hnH/Gsb9axjPwn9b2/85SPy71FDuX8O4fw3j/jXMyt6/xvA8hDVJWW1jfwX4f/noo4+y7rrr5ne/+10OOeSQuvYhQ4bk3XffzT333FOv/znnnJNzzz23yFUCsCarqqpKu3btSja/ZyEApeZZCAClfx7CmqbJrax48803s3Tp0nTq1Klee6dOnfLSSy8t17+ysjKjRo2qO1+2bFnefvvtdOjQoVEmn9XV1enatWvmzp3rL7tV5B42jPvXMO5fwzSV+9e2bduSzu9ZyGdxDxvG/WsY969hmsr98yxcvZrKPweNmXvYMO5fw7h/DdOU7l+pn4ewpmlyYcXnVV5envLy8npt66+/fmmK+RzatWvX6P9Cbuzcw4Zx/xrG/WsY96+wPAvXXu5hw7h/DeP+NYz7V1iehWsv97Bh3L+Gcf8axv2DtU+Te8H2hhtumObNm2f+/Pn12ufPn5/OnTuXqCoAKB7PQgDWdp6FAABrniYXVrRq1Sp9+/bNxIkT69qWLVuWiRMnpl+/fiWsDACKw7MQgLWdZyEAwJqnSW4DNWrUqAwZMiQ77bRTdtlll1x++eVZtGhRjj322FKX1mDl5eX58Y9/vNwSZVaee9gw7l/DuH8N4/6tPM9CPo172DDuX8O4fw3j/q08z0I+jXvYMO5fw7h/DeP+wdqrrLa2trbURayKn//85/nJT36SefPm5Ytf/GKuvPLK7LrrrqUuCwCKxrMQgLWdZyEAwJqjyYYVAAAAAADAmqHJvbMCAAAAAABYswgrAAAAAACAkhJWAAAAAAAAJSWsAAAAAAAASkpYAQAAAAAAlJSwAgAAAAAAKClhBQAAAAAAUFLCCgAAAAAAoKSEFQAAAAAAQEkJKwAAAAAAgJISVgAAAAAAACUlrAAAAAAAAEpKWAEAAAAAAJTUWhdW1NbWprq6OrW1taUuBQBKwrMQgLWdZyEAQOOz1oUV7733XioqKvLee++VuhQAKAnPQgDWdp6FAACNz1oXVgAAAAAAAI2LsAIAAAAAACgpYQUAAAAAAFBSwgoAAAAajXPOOSdlZWX1jh49etRd//DDDzN8+PB06NAhbdq0yeDBgzN//vwSVgwAQCEIKwAAAGhUevXqlTfeeKPuePzxx+uujRw5Mvfdd19uv/32TJ48Of/6179y6KGHlrBaAAAKoUWpCwAAAICPa9GiRTp37rxce1VVVW688caMHz8+e++9d5Jk3Lhx2XbbbTN16tTstttuKxyvpqYmNTU1defV1dWrp3AAAFaZlRUAAAA0Ki+//HI23njjbL755jnqqKMyZ86cJMmMGTOyePHiDBw4sK5vjx490q1btzz11FOfON7o0aNTUVFRd3Tt2nW1fw8AAHw+wgoAAAAajV133TU333xzHnrooYwdOzavv/56vvzlL+e9997LvHnz0qpVq6y//vr1vqZTp06ZN2/eJ45ZWVmZqqqqumPu3Lmr+bsAAODzsg0UAAAAjcZ+++1X97lPnz7Zdddds+mmm+a3v/1tWrduvUpjlpeXp7y8vFAlAgCwGlhZAQAAQKO1/vrrZ+utt84rr7ySzp0756OPPsq7775br8/8+fNX+I4LAACaDmEFAAAAjdbChQvz6quvpkuXLunbt29atmyZiRMn1l2fPXt25syZk379+pWwSgAAGso2UAAAADQa//M//5MDDzwwm266af71r3/lxz/+cZo3b55vfetbqaioyLBhwzJq1Ki0b98+7dq1y2mnnZZ+/fplt912K3XpAAA0gLACAACARuMf//hHvvWtb+Wtt97KRhttlC996UuZOnVqNtpooyTJmDFj0qxZswwePDg1NTUZNGhQrrnmmhJXDQBAQ5XV1tbWlrqIYqqurk5FRUWqqqrSrl27UpcDAEXnWQjA2s6zEACg8bGyAoBG5a2JE0o6f4cBR5R0fgDwLARgbedZCGsnL9gGAAAAAABKSlgBAAAAAACUlLACAAAAAAAoKWEFAAAAAABQUsIKAAAAAACgpIQVAAAAAABASQkrAAAAAACAkmpUYcXYsWPTp0+ftGvXLu3atUu/fv3y4IMP1l3v379/ysrK6h0nnXRSCSsGAAAAAAAaqkWpC/i4TTbZJBdffHG22mqr1NbW5pZbbsnBBx+c5557Lr169UqSnHDC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XUs6OwAAlMYqhxXf/va3V7pvz54907Nnz1WdCgAAAAAAWIOt8jZQHzd37tz84x//qDt/+umnM2LEiFx33XWFGB4AAAAAAFiDFSSsOPLII/PYY48lSebNm5d99tknTz/9dH74wx/mvPPOK8QUAAAAAADAGqogYcULL7yQXXbZJUny29/+Nr17986TTz6ZW2+9NTfffPNKjzN69OjsvPPOadu2bTp27JhDDjkks2fPrtenf//+KSsrq3ecdNJJhfg2AAAAAACAEihIWLF48eKUl5cnSf7whz/koIMOSpL06NHjc71Ye/LkyRk+fHimTp2aRx99NIsXL86+++6bRYsW1et3wgkn5I033qg7Lr300kJ8GwAAAAAAQAms8gu2P65Xr1659tprs//+++fRRx/N+eefnyT517/+lQ4dOqz0OA899FC985tvvjkdO3bMjBkzsueee9a1r7vuuuncuXMhSgcAAAAAAEqsIGHFJZdckq9//ev5yU9+kiFDhmT77bdPktx7771120OtiqqqqiRJ+/bt67Xfeuut+fWvf53OnTvnwAMPzFlnnZV11113hWPU1NSkpqam7ry6unqV6wEAAACANd0D0xeWdP5dSzo7UCoFCSv69++fN998M9XV1dlggw3q2k888cRPDBE+y7JlyzJixIjsscce6d27d137kUcemU033TQbb7xx/vSnP+WMM87I7Nmzc+edd65wnNGjR+fcc89dpRoAAAAAAIDVryBhRZI0b968XlCRJJttttkqjzd8+PC88MILefzxx+u1n3jiiXWft9tuu3Tp0iUDBgzIq6++mi222GK5cSorKzNq1Ki68+rq6nTt2nWV6wIAAAAAAAprlcOKHXbYIWVlZSvV99lnn/1cY5966qm5//77M2XKlGyyySaf2nfXXf+9MOyVV15ZYVhRXl5e9/JvAAAAAACg8VnlsOKQQw6p+/zhhx/mmmuuSc+ePdOvX78kydSpU/PnP/85p5xyykqPWVtbm9NOOy133XVXJk2alO7du3/m18ycOTNJ0qVLl89VPwAAAAAA0Discljx4x//uO7z8ccfn9NPPz3nn3/+cn3mzp270mMOHz4848ePzz333JO2bdtm3rx5SZKKioq0bt06r776asaPH5+vfe1r6dChQ/70pz9l5MiR2XPPPdOnT59V/VYAAAAAAIASalaIQW6//fYcc8wxy7UfffTRueOOO1Z6nLFjx6aqqir9+/dPly5d6o7bbrstSdKqVav84Q9/yL777psePXrku9/9bgYPHpz77ruvEN8GAAAAAABQAgV5wXbr1q3zxBNPZKuttqrX/sQTT2SdddZZ6XFqa2s/9XrXrl0zefLkVaoRAAAAAABonAoSVowYMSInn3xynn322eyyyy5JkmnTpuWmm27KWWedVYgpAAAAAACANVRBwoozzzwzm2++ea644or8+te/TpJsu+22GTduXA4//PBCTAEAAAAAAKyhChJWJMnhhx8umAAAAAAAAD63goUVSfLRRx9lwYIFWbZsWb32bt26FXIaAAAAAABgDdKsEIO8/PLL+fKXv5zWrVtn0003Tffu3dO9e/dsttlm6d69eyGmAIC1wtixY9OnT5+0a9cu7dq1S79+/fLggw/WXf/www8zfPjwdOjQIW3atMngwYMzf/78ElYMAAAA0HAFWVkxdOjQtGjRIvfff3+6dOmSsrKyQgwLAGudTTbZJBdffHG22mqr1NbW5pZbbsnBBx+c5557Lr169crIkSPz+9//PrfffnsqKipy6qmn5tBDD80TTzxR6tIBAAAAVllBwoqZM2dmxowZ6dGjRyGGA4C11oEHHljv/MILL8zYsWMzderUbLLJJrnxxhszfvz47L333kmScePGZdttt83UqVOz2267rXDMmpqa1NTU1J1XV1evvm8AAAAAYBUUZBuonj175s033yzEUADA/2fp0qWZMGFCFi1alH79+mXGjBlZvHhxBg4cWNenR48e6datW5566qlPHGf06NGpqKioO7p27VqM8gEAAABWWkHCiksuuSTf//73M2nSpLz11luprq6udwAAK2/WrFlp06ZNysvLc9JJJ+Wuu+5Kz549M2/evLRq1Srrr79+vf6dOnXKvHnzPnG8ysrKVFVV1R1z585dzd8BAAAAwOdTkG2g/vMbngMGDKjXXltbm7KysixdurQQ0wDAWmGbbbbJzJkzU1VVld/97ncZMmRIJk+evMrjlZeXp7y8vIAVAgAAABRWQcKKxx57rBDDAABJWrVqlS233DJJ0rdv30yfPj1XXHFFvvnNb+ajjz7Ku+++W291xfz589O5c+cSVQsAAADQcAUJK77yla8UYhgAYAWWLVuWmpqa9O3bNy1btszEiRMzePDgJMns2bMzZ86c9OvXr8RVAgAAAKy6gryzIknefffd/OxnP8vxxx+f448/PmPGjElVVVWhhgeAtUJlZWWmTJmSv/3tb5k1a1YqKyszadKkHHXUUamoqMiwYcMyatSoPPbYY5kxY0aOPfbY9OvXL7vttlupSweAghg7dmz69OmTdu3apV27dunXr18efPDBuusffvhhhg8fng4dOqRNmzYZPHhw5s+fX8KKAQAohIKEFc8880y22GKLjBkzJm+//XbefvvtXHbZZdliiy3y7LPPFmIKAFgrLFiwIMccc0y22WabDBgwINOnT8/DDz+cffbZJ0kyZsyYHHDAARk8eHD23HPPdO7cOXfeeWeJqwaAwtlkk01y8cUXZ8aMGXnmmWey99575+CDD86f//znJMnIkSNz33335fbbb8/kyZPzr3/9K4ceemiJqwYAoKHKamtraxs6yJe//OVsueWWuf7669Oixb93llqyZEmOP/74vPbaa5kyZUqDCy2U6urqVFRUpKqqKu3atSt1OQCNzgPTF5Z0/l2r7y/p/B0GHFHS+YvBsxDg03kWNr5nYfv27fOTn/wk3/jGN7LRRhtl/Pjx+cY3vpEkeemll7LtttvmqaeeWumVhp6FAJ/Os7DxPQthbVCwlRVnnHFGXVCRJC1atMj3v//9PPPMM4WYAgAAgLXM0qVLM2HChCxatCj9+vXLjBkzsnjx4gwcOLCuT48ePdKtW7c89dRTnzhOTU1Nqqur6x0AADQuBQkr2rVrlzlz5izXPnfu3LRt27YQUwAAALCWmDVrVtq0aZPy8vKcdNJJueuuu9KzZ8/MmzcvrVq1yvrrr1+vf6dOnTJv3rxPHG/06NGpqKioO7p27bqavwMAAD6vgoQV3/zmNzNs2LDcdtttmTt3bubOnZsJEybk+OOPz7e+9a1CTAEAAMBaYptttsnMmTMzbdq0nHzyyRkyZEhefPHFVR6vsrIyVVVVdcfcuXMLWC0AAIXQ4rO7fLaf/vSnKSsryzHHHJMlS5YkSVq2bJmTTz45F198cSGmAAAAYC3RqlWrbLnllkmSvn37Zvr06bniiivyzW9+Mx999FHefffdeqsr5s+fn86dO3/ieOXl5SkvL1/dZQMA0AAFWVnRqlWrXHHFFXnnnXcyc+bMzJw5M2+//XbGjBnjPwgBAABokGXLlqWmpiZ9+/ZNy5YtM3HixLprs2fPzpw5c9KvX78SVggAQEMVZGVFVVVVli5dmvbt22e77bara3/77bfTokWLtGvXrhDTAAAAsIarrKzMfvvtl27duuW9997L+PHjM2nSpDz88MOpqKjIsGHDMmrUqLRv3z7t2rXLaaedln79+mW33XYrdekAADRAQVZWHHHEEZkwYcJy7b/97W9zxBFHFGIKAAAA1gILFizIMccck2222SYDBgzI9OnT8/DDD2efffZJkowZMyYHHHBABg8enD333DOdO3fOnXfeWeKqAQBoqIKsrJg2bVouu+yy5dr79++fH/7wh4WYAgAAgLXAjTfe+KnX11lnnVx99dW5+uqri1QRAADFUJCVFTU1NXUv1v64xYsX54MPPijEFAAAAAAAwBqqICsrdtlll1x33XW56qqr6rVfe+216du3byGmAAAAAABokvbee+/U1tauVN/HHntsNVcDjVNBwooLLrggAwcOzPPPP58BAwYkSSZOnJjp06fnkUceKcQUAAAAAABN0he/+MW6z6+++mqeffbZHHbYYaUrCBqhgoQVe+yxR5566qlceuml+e1vf5vWrVunT58+ufHGG7PVVlsVYgoAAAAAgCbpP+/7feWVV7LXXnvl//7v/7LlllvmlFNOKXFl0HgUJKxI/p0Ojh8/vlDDAQAAAACsMf76179mr732ysEHH5xhw4Zln332yfrrr58jjzyy1KVBo1CwsOLVV1/NuHHj8tprr+Xyyy9Px44d8+CDD6Zbt27p1atXoaYBAAAAAGhSXnrppQwYMCCHHnpo3Xt/77333hxwwAGpqKjI/vvvX+IKofSaFWKQyZMnZ7vttsu0adNyxx13ZOHChUmS559/Pj/+8Y8LMQUAAAAAQJO011575fDDD68LKpLkS1/6Un7zm9/kqKOOKmFl0HgUJKw488wzc8EFF+TRRx9Nq1at6tr33nvvTJ06tRBTAAAAAAA0SUcffXTGjBmzXPt+++2XsWPHlqAiaHwKElbMmjUrX//615dr79ixY958881CTAEAAAAA0CT95Cc/+cRr3/rWt4pYCTReBQkr1l9//bzxxhvLtT/33HP5whe+sNLjjB49OjvvvHPatm2bjh075pBDDsns2bPr9fnwww8zfPjwdOjQIW3atMngwYMzf/78Bn8PAAAAAABAaRQkrDjiiCNyxhlnZN68eSkrK8uyZcvyxBNP5H/+539yzDHHrPQ4kydPzvDhwzN16tQ8+uijWbx4cfbdd98sWrSors/IkSNz33335fbbb8/kyZPzr3/9K4ceemghvg0AAAAAAKAEWhRikIsuuijDhw9P165ds3Tp0vTs2TNLly7NkUcemR/96EcrPc5DDz1U7/zmm29Ox44dM2PGjOy5556pqqrKjTfemPHjx2fvvfdOkowbNy7bbrttpk6dmt12260Q3w4AAAAAAFBEBQkrWrVqleuvvz5nn312Zs2alYULF2aHHXbIVltt1aBxq6qqkiTt27dPksyYMSOLFy/OwIED6/r06NEj3bp1y1NPPbXCsKKmpiY1NTV159XV1Q2qCQAAAAAAKKyChBX/0bVr17rVFbNmzco777yTDTbYYJXGWrZsWUaMGJE99tgjvXv3TpLMmzcvrVq1yvrrr1+vb6dOnTJv3rwVjjN69Oice+65q1QDAAAAAACw+hXknRUjRozIjTfemCRZunRpvvKVr2THHXdM165dM2nSpFUac/jw4XnhhRcyYcKEBtVWWVmZqqqqumPu3LkNGg8AAAAAYFW89tpradu27XKfgQKFFb/73e+y/fbbJ0nuu+++vPbaa3nppZcycuTI/PCHP/zc45166qm5//7789hjj2WTTTapa+/cuXM++uijvPvuu/X6z58/P507d17hWOXl5WnXrl29AwAAAACgFMrKylb4GdZ2BQkr3nzzzbqw4IEHHsjhhx+erbfeOscdd1xmzZq10uPU1tbm1FNPzV133ZU//vGP6d69e73rffv2TcuWLTNx4sS6ttmzZ2fOnDnp169fIb4VAAAAAIDVpra2doWfYW1XkHdWdOrUKS+++GK6dOmShx56KGPHjk2SvP/++2nevPlKjzN8+PCMHz8+99xzT9q2bVv3HoqKioq0bt06FRUVGTZsWEaNGpX27dunXbt2Oe2009KvX78VvlwbAAAAAABo/AoSVhx77LE5/PDD06VLl5SVlWXgwIFJkmnTpqVHjx4rPc5/Qo7+/fvXax83blyGDh2aJBkzZkyaNWuWwYMHp6amJoMGDco111xTiG8DAAAAAAAogYKEFeecc0569+6duXPn5rDDDkt5eXmSpHnz5jnzzDNXepyVWfa0zjrr5Oqrr87VV1+9yvUCAAAAAACNR0HCiiT5xje+sVzbkCFDCjU8AAAAAACwhlrlF2xPmDBhpfvOnTs3TzzxxKpOBQAAAACwRigrK1vhZ1jbrXJYMXbs2Gy77ba59NJL85e//GW561VVVXnggQdy5JFHZscdd8xbb73VoEIBAAAAAJqydu3a5eijj17uM9CAbaAmT56ce++9N1dddVUqKyuz3nrrpVOnTllnnXXyzjvvZN68edlwww0zdOjQvPDCC+nUqVMh6wYAAAAAaFI23HDDXHPNNct9Bhr4zoqDDjooBx10UN588808/vjj+fvf/54PPvggG264YXbYYYfssMMOadZslRdvAAAAAAAAa4GCvGB7ww03zCGHHFKIoQAAAAAAgLWMZQ8AAAAAAEBJCSsAAAAAAICSElYAAAAAAAAlJawAAAAAAFiNHn744dx///2lLgMatYKGFR999FFmz56dJUuWFHJYAAAAAIAmq7KyMvPnz6/XduGFF6ZZs2b1DlibFeTfgPfffz/Dhg3Luuuum169emXOnDlJktNOOy0XX3xxIaYAAAAAAGiSXn311ey222712vbee+984QtfyN13351bbrmlRJVB41GQsKKysjLPP/98Jk2alHXWWaeufeDAgbntttsKMQUAAAAAQJNUW1tb7+emSbLuuuvmww8/zEEHHZSvfvWrJaoMGo+ChBV33313fv7zn+dLX/pSysrK6tp79eqVV199tRBTAAAAAAA0SVtuuWUeeeSRem2PPPJINt988yT/DjNgbdeiEIP83//9Xzp27Lhc+6JFi+qFFwAAAAAAa5tTTjklI0aMyNtvv50ddtgh06ZNy6WXXpprrrmmro+fo7K2K0hYsdNOO+X3v/99TjvttCT//3+xbrjhhvTr168QUwAAAAAANEnHH398/vWvf2XMmDF55513sskmm+QnP/lJjj322CTJ+uuvn9/85jclrhJKqyBhxUUXXZT99tsvL774YpYsWZIrrrgiL774Yp588slMnjy5EFMAAAAAADRZZ599ds4+++wsXrw4LVu2rHetVatWOfzww0tUGTQOBXlnxZe+9KXMnDkzS5YsyXbbbZdHHnkkHTt2zFNPPZW+ffsWYgoAAAAAgCbvv4MK4N8KsrIiSbbYYotcf/31hRoOAAAAAGCN8be//S3XXnttnnrqqcybNy9J0rlz5+y22245+eSTs9lmm5W2QCixgoUVSbJgwYIsWLAgy5Ytq9fep0+fQk4DAAAAANBkTJkyJfvvv38233zzDBgwIJ06dUqSzJ8/Pw8++GCuvvrq3H///enfv39pC4USKkhYMWPGjAwZMiR/+ctfUltbW+9aWVlZli5dWohpAAAAAACanJEjR+aUU07JJZdcssLr3//+9/Pd7343M2bMKHJl0HgUJKw47rjjsvXWW+fGG29Mp06dUlZWVohhAQAAAACavBdffDHjx4//xOvDhg3LlVdeWcSKoPEpSFjx2muv5Y477siWW25ZiOEAAAAAANYYm2yySSZOnJhtttlmhdf/8Ic/pFu3bkWuChqXgoQVAwYMyPPPPy+sAAAAAAD4L2effXaGDRuWxx9/PPvuu2+9d1Y8/PDD+d3vfpcbbrihxFVCaRUkrLjhhhsyZMiQvPDCC+ndu3datmxZ7/pBBx1UiGkAAAAAAJqc//f//l+6dOmSyy67LCNHjkx1dXWSpF27dunXr18eeOCB7LPPPiWuEkqrIGHFU089lSeeeCIPPvjgcte8YBsAAAAAWNsNHDgwAwcOTJLU1NQkScrLy0tZEjQqzQoxyGmnnZajjz46b7zxRpYtW1bvEFQAAAAAAPz/lZeXCyrgvxQkrHjrrbcycuTIur3WAAAAAAAAVlZBwopDDz00jz32WCGGAoC12ujRo7Pzzjunbdu26dixYw455JDMnj27Xp8PP/www4cPT4cOHdKmTZsMHjw48+fPL1HFAAAAAA1XkHdWbL311qmsrMzjjz+e7bbbbrkXbJ9++umFmAYA1niTJ0/O8OHDs/POO2fJkiX5wQ9+kH333Tcvvvhi1ltvvSTJyJEj8/vf/z633357Kioqcuqpp+bQQw/NE088UeLqAQAAAFZNQcKKG264IW3atMnkyZMzefLketfKysqEFQCwkh566KF65zfffHM6duyYGTNmZM8990xVVVVuvPHGjB8/PnvvvXeSZNy4cdl2220zderU7LbbbqUoGwAAAKBBChJWvP7664UYBgD4L1VVVUmS9u3bJ0lmzJiRxYsXZ+DAgXV9evTokW7duuWpp55aYVhRU1OTmpqauvPq6urVXDUAAADA51OQd1YAAIW3bNmyjBgxInvssUd69+6dJJk3b15atWqV9ddfv17fTp06Zd68eSscZ/To0amoqKg7unbturpLBwAAAPhcVnllxahRo3L++ednvfXWy6hRoz6172WXXbZSY06ZMiU/+clPMmPGjLzxxhu56667csghh9RdHzp0aG655ZZ6XzNo0KDltswAgDXB8OHD88ILL+Txxx9v0DiVlZX1ntXV1dUCCwAAAKBRWeWw4rnnnsvixYvrPhfCokWLsv322+e4447LoYceusI+X/3qVzNu3Li68/Ly8oLMDQCNyamnnpr7778/U6ZMySabbFLX3rlz53z00Ud59913662umD9/fjp37rzCscrLyz0vAWgyRo8enTvvvDMvvfRSWrdund133z2XXHJJttlmm7o+H374Yb773e9mwoQJqampyaBBg3LNNdekU6dOJawcAICGWOWw4rHHHlvh54bYb7/9st9++31qn/Ly8k/8YcyK2KcbgKaktrY2p512Wu66665MmjQp3bt3r3e9b9++admyZSZOnJjBgwcnSWbPnp05c+akX79+pSgZAApq8uTJGT58eHbeeecsWbIkP/jBD7LvvvvmxRdfzHrrrZckGTlyZH7/+9/n9ttvT0VFRU499dQceuiheeKJJ0pcPQAAq6og76w47rjj8t577y3XvmjRohx33HGFmKLOpEmT0rFjx2yzzTY5+eST89Zbb31qf/t0A9CUDB8+PL/+9a8zfvz4tG3bNvPmzcu8efPywQcfJEkqKioybNiwjBo1Ko899lhmzJiRY489Nv369Vvhy7UBoKl56KGHMnTo0PTq1Svbb799br755syZMyczZsxIklRVVeXGG2/MZZddlr333jt9+/bNuHHj8uSTT2bq1KkrHLOmpibV1dX1DgAAGpeChBW33HJL3Q9RPu6DDz7IL3/5y0JMkeTfW0D98pe/zMSJE3PJJZdk8uTJ2W+//bJ06dJP/JrKyspUVVXVHXPnzi1YPQBQaGPHjk1VVVX69++fLl261B233XZbXZ8xY8bkgAMOyODBg7Pnnnumc+fOufPOO0tYNQCsPlVVVUmS9u3bJ0lmzJiRxYsXZ+DAgXV9evTokW7duuWpp55a4Rh+iQ0AoPFb5W2gkn9vqVRbW5va2tq89957WWeddequLV26NA888EA6duzY4CL/44gjjqj7vN1226VPnz7ZYostMmnSpAwYMGCFX2OfbgCaktra2s/ss8466+Tqq6/O1VdfXYSKAKB0li1blhEjRmSPPfZI7969kyTz5s1Lq1at6r27KUk6deqUefPmrXCcysrKjBo1qu68urpaYAEA0Mg0KKxYf/31U1ZWlrKysmy99dbLXS8rK8u5557bkCk+1eabb54NN9wwr7zyyieGFQAAADRNw4cPzwsvvJDHH3+8QeP4JTYAgMavQWHFY489ltra2uy9996544476pblJkmrVq2y6aabZuONN25wkZ/kH//4R95666106dJltc0BAABA8Z166qm5//77M2XKlGyyySZ17Z07d85HH32Ud999t97qivnz56dz584lqBQAgEJoUFjxla98JUny+uuvp2vXrmnWrGGvwFi4cGFeeeWVuvPXX389M2fOTPv27dO+ffuce+65GTx4cDp37pxXX3013//+97Pllltm0KBBDZoXAACAxqG2tjannXZa7rrrrkyaNCndu3evd71v375p2bJlJk6cmMGDBydJZs+enTlz5qRfv36lKBkAgAJoUFjxH5tuumnefffdPP3001mwYEGWLVtW7/oxxxyzUuM888wz2WuvverO/7On6JAhQzJ27Nj86U9/yi233JJ33303G2+8cfbdd9+cf/75lvMCAACsIYYPH57x48fnnnvuSdu2beveQ1FRUZHWrVunoqIiw4YNy6hRo9K+ffu0a9cup512Wvr165fddtutxNUDALCqChJW3HfffTnqqKOycOHCtGvXLmVlZXXXysrKVjqs6N+//6e+WPThhx9ucK0AAAA0XmPHjk3y7/8//Lhx48Zl6NChSZIxY8akWbNmGTx4cGpqajJo0KBcc801Ra4UAIBCKkhY8d3vfjfHHXdcLrrooqy77rqFGBIAAIC10Kf9Att/rLPOOrn66qtz9dVXF6EiAACKoWEvmfj//POf/8zpp58uqAAAAAAAAD63goQVgwYNyjPPPFOIoQAAAAAAgLVMQbaB2n///fO9730vL774Yrbbbru0bNmy3vWDDjqoENMAAAAAAABroIKEFSeccEKS5LzzzlvuWllZWZYuXVqIaQAAAAAAgDVQQcKKZcuWFWIYAAAAAABgLVSQd1YAAAAAAACsqoKsrFjR9k8fd/bZZxdiGgAAAAAAYA1UkLDirrvuqne+ePHivP7662nRokW22GILYQUAAAAAAPCJChJWPPfcc8u1VVdXZ+jQofn6179eiCkAAAAAAIA11Gp7Z0W7du1y7rnn5qyzzlpdUwAAAAAAAGuA1fqC7aqqqlRVVa3OKQAAAAAAgCauINtAXXnllfXOa2tr88Ybb+RXv/pV9ttvv0JMAQAAAAAArKEKElaMGTOm3nmzZs2y0UYbZciQIamsrCzEFAAAAAAAwBqqIGHF66+//onXPvjgg0JMAQAAAAAArKFW2zsrampqctlll6V79+6rawoAAAAAAGAN0KCwoqamJpWVldlpp52y++675+67706S3HTTTenevXvGjBmTkSNHFqJOAAAAAABgDdWgbaDOPvvs/OIXv8jAgQPz5JNP5rDDDsuxxx6bqVOn5rLLLsthhx2W5s2bF6pWAAAAAABgDdSgsOL222/PL3/5yxx00EF54YUX0qdPnyxZsiTPP/98ysrKClUjAAAAAACwBmvQNlD/+Mc/0rdv3yRJ7969U15enpEjRwoqAAAAAACAldagsGLp0qVp1apV3XmLFi3Spk2bBhcFAAAAAACsPRq0DVRtbW2GDh2a8vLyJMmHH36Yk046Keutt169fnfeeWdDpgEAAAAAANZgDQorhgwZUu/86KOPblAxAAAAAADA2qdBYcW4ceMKVQcAAAAAALCWatA7KwAAAAAAABpKWAEAAAAAAJSUsAIAAAAAACgpYQUAAAAAAFBSwgoAAAAAAKCkhBUAAAAAAEBJCSsAAAAAAICSElYAAAAAAAAl1ajCiilTpuTAAw/MxhtvnLKystx99931rtfW1ubss89Oly5d0rp16wwcODAvv/xyaYoFAAAAAAAKolGFFYsWLcr222+fq6++eoXXL7300lx55ZW59tprM23atKy33noZNGhQPvzwwyJXCgAAAAAAFEqLUhfwcfvtt1/222+/FV6rra3N5Zdfnh/96Ec5+OCDkyS//OUv06lTp9x999054ogjilkqAAAAAABQII1qZcWnef311zNv3rwMHDiwrq2ioiK77rprnnrqqU/8upqamlRXV9c7AAAAAACAxqPJhBXz5s1LknTq1Klee6dOnequrcjo0aNTUVFRd3Tt2nW11gkAAAAAAHw+TSasWFWVlZWpqqqqO+bOnVvqkgAAAAAAgI9pMmFF586dkyTz58+v1z5//vy6aytSXl6edu3a1TsAAAAAAIDGo8mEFd27d0/nzp0zceLEurbq6upMmzYt/fr1K2FlAAAAAABAQ7QodQEft3Dhwrzyyit156+//npmzpyZ9u3bp1u3bhkxYkQuuOCCbLXVVunevXvOOuusbLzxxjnkkENKVzQAAAAAANAgjSqseOaZZ7LXXnvVnY8aNSpJMmTIkNx88835/ve/n0WLFuXEE0/Mu+++my996Ut56KGHss4665SqZAAAAAAAoIEaVVjRv3//1NbWfuL1srKynHfeeTnvvPOKWBUAAAAAALA6NZl3VgAAAAAAAGsmYQUAAAAAAFBSwgoAAAAAAKCkhBUAAAAAAEBJCSsAAAAAAICSElYAAAAAAAAlJawAAAAAAABKSlgBAAAAAACUlLACABqZKVOm5MADD8zGG2+csrKy3H333fWu19bW5uyzz06XLl3SunXrDBw4MC+//HJpigUAAAAoAGEFADQyixYtyvbbb5+rr756hdcvvfTSXHnllbn22mszbdq0rLfeehk0aFA+/PDDIlcKAAAAUBgtSl0AAFDffvvtl/3222+F12pra3P55ZfnRz/6UQ4++OAkyS9/+ct06tQpd999d4444ohilgoAAABQEFZWAEAT8vrrr2fevHkZOHBgXVtFRUV23XXXPPXUUyv8mpqamlRXV9c7AKAxsyUiAMDaR1gBAE3IvHnzkiSdOnWq196pU6e6a/9t9OjRqaioqDu6du262usEgIawJSIAwNrHNlAAsIarrKzMqFGj6s6rq6sFFgA0arZEBABY+1hZAQBNSOfOnZMk8+fPr9c+f/78umv/rby8PO3atat3AEBTZUtEAIA1k7ACAJqQ7t27p3Pnzpk4cWJdW3V1daZNm5Z+/fqVsDIAKA5bIgIArJmEFQDQyCxcuDAzZ87MzJkzk/z7N0hnzpyZOXPmpKysLCNGjMgFF1yQe++9N7NmzcoxxxyTjTfeOIccckhJ6waAxqqysjJVVVV1x9y5c0tdEgAA/8U7KwCgkXnmmWey11571Z3/530TQ4YMyc0335zvf//7WbRoUU488cS8++67+dKXvpSHHnoo66yzTqlKBoCi+fiWiF26dKlrnz9/fr74xS+u8GvKy8tTXl5ejPIAAFhFwgoAaGT69++f2traT7xeVlaW8847L+edd14RqwKAxuHjWyL+J5z4z5aIJ598cmmLAwBglQkrAAAAaFQWLlyYV155pe78P1sitm/fPt26davbEnGrrbZK9+7dc9ZZZ9kSEQCgiRNWAAAA0KjYEhEAYO0jrPj/tXfvcVHV+R/H3wPIQCpDmA5SaGSa18y0lLQ0xcg1080uurRe034baojlyiO18oZaa2ah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2LhxoyHJWLZs2UX7Z8yYYUgy8vPzDcP48Qeye++912PMI488YnTr1s0wDMP4y1/+YjRq1Mg4e/bsBXN98803RnBwsPHdd995tHfp0sVIS0szDOPHH0olGdu3b/cY8+STTxqdO3d2v169erVhtVrdP0xeTPfu3Y1Ro0a5X3fs2NF48sknPcb8+ofSP/zhD0bXrl09xjz99NNG06ZN3a/r169vPProo+7XJSUlRp06dYw5c+YYhmEYw4cPNzp37uz+QR4AKhJ7IXvhL7EXAqiK2AvZC3+JvRAAAg+3gUKlM23aNC1YsEB79uwp8xzNmjVTUNDP3x52u10tWrRwvw4ODlatWrV09OhRj8+Lj493fxwSEqI2bdq449ixY4fWrl2rGjVquI/GjRtL+vE+oj9p3br1ZWNzOp06fPiw2rdv79Hevn37Mp2zYRilHvvL8/vp9U9rPvTQQzp9+rRuuOEGDRkyRMuWLdP58+clSTt37lRxcbEaNWrkcf7r1q3zOPfQ0FDdfPPNHmskJSXp008/1eHDhyVJb731lrp3767IyEhJP97DdOLEiWrRooWioqJUo0YNrV69WocOHbqiPOzZs+eiOT1w4ICKi4vdbb+Mz2KxKDo62v11MGDAAG3fvl033XSTRowYoY8//viKYgAAX2EvvDLshT9iLwRQmbAXXhn2wh+xFwKAuShWoNK56667lJiYqLS0tAv6goKCLvgh7Ny5cxeMq1atmsdri8Vy0bYredBXUVGRevTooe3bt3scBw4c0F133eUeV7169VLP6Y0bb7xRFovlkj/I7tmzR1dffbVq165dqvliY2O1b98+zZ49W+Hh4XriiSd011136dy5cyoqKlJwcLC2bNnice579uzRyy+/7J4jPDz8ggeb3XbbbWrQoIGWLFmi06dPa9myZUpKSnL3v/DCC3r55Zf15z//WWvXrtX27duVmJjo1UPoLudyXwe33nqrcnNzNXHiRJ0+fVoPP/ywHnzwwXKJAwAuh72wdNgLy4a9EEAgYC8sHfbCsmEvBIDyEWJ2AEB5mDp1qm655RbddNNNHu21a9eWw+GQYRjuH362b9/us3U3btzo/gHz/Pnz2rJli4YNGybpxx9Y3n33XV1//fUKCSn7t15ERIRiYmK0YcMGdezY0d2+YcMG3X777aWep1atWuratatmz56tkSNHKjw83N3ncDj01ltvqV+/fh4/JG7cuNFjjo0bN6pJkybu1+Hh4erRo4d69Oih5ORkNW7cWDt37lSrVq1UXFyso0eP6s4777zic05KStJbb72l6667TkFBQerevbvHeffs2VOPPvqopB8fMrd//341bdrUPSY0NNTjr2AupkmTJtqwYYNH24YNG9SoUSMFBweXOtaIiAg98sgjeuSRR/Tggw/q3nvv1fHjxxUVFVXqOQDAF9gLfxt7oSf2QgCVDXvhb2Mv9MReCADm4soKVEotWrRQUlKSZs2a5dHeqVMn/e9//9P06dN18OBBZWRk6KOPPvLZuhkZGVq2bJn27t2r5ORknThxQoMGDZIkJScn6/jx4+rbt682bdqkgwcPavXq1Ro4cOBv/sD0a08//bSmTZumt99+W/v27dOYMWO0fft2Pfnkk1c0z6uvviqXy6XExEStX79eeXl5WrVqlbp27aprr71WkydP9hi/YcMGTZ8+Xfv371dGRoaWLl3qXnP+/PmaN2+edu3apa+++kp///vfFR4ervr166tRo0ZKSkpSv3799N577yk3N1dffPGF0tPT9eGHH/5mnElJSdq6dasmT56sBx98UFar1d3XsGFDrVmzRp9//rn27Nmjxx9/XPn5+R6ff/311ysnJ0dff/21vv/++4v+5dOoUaOUlZWliRMnav/+/VqwYIFeffVVPfXUU6XO54wZM7R48WLt3btX+/fv19KlSxUdHe2+NBkAKhJ7YemwF/6MvRBAZcNeWDrshT9jLwQAc1GsQKU1YcKEC374aNKkiWbPnq2MjAy1bNlSX3zxxRX90PFbpk6dqqlTp6ply5b67LPPtGLFCl1zzTWS5P6rl+LiYt1zzz1q0aKFUlJSFBkZ6XEf1NIYMWKEUlNTNWrUKLVo0UKrVq3SihUr1LBhwyuap2HDhtq8ebNuuOEGPfzww2rQoIGGDh2qu+++W9nZ2Rf81ceoUaO0efNmtWrVSpMmTdKMGTOUmJgoSYqMjNQbb7yh9u3b6+abb9Ynn3yi999/X7Vq1ZIkZWZmql+/fho1apRuuukm9erVS5s2bVK9evV+M84bb7xRt99+u/7zn/94XOorSWPHjtWtt96qxMREderUSdHR0erVq5fHmKeeekrBwcFq2rSpateufdH7lt5666165513tGTJEjVv3lzjx4/XhAkTNGDAgFLns2bNmpo+fbratGmj2267TV9//bVWrlx5xf++AOAr7IW/jb3wZ+yFACoj9sLfxl74M/ZCADCXxbiSpygBAAAAAAAAAAD4GGVdAAAAAAAAAABgKooVAAAAAAAAAADAVBQrAAAAAAAAAACAqShWAAAAAAAAAAAAU1GsAAAAAAAAAAAApqJYAQAAAAAAAAAATEWxAgAAAAAAAAAAmIpiBQAAAAAAAAAAMBXFCgAAAAAAAAAAYCqKFQAAAAAAAAAAwFQUKwAAAAAAAAAAgKn+HwORHsLvRCXBAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Dynamically determine unique values for order and hue_order\n", + "n_obs_order = sorted(df[\"n_obs\"].unique(), key=lambda x: int(x)) # Sort as integers\n", + "demeaner_backend_order = df[\"demeaner_backend\"].unique()\n", + "\n", + "custom_palette = sns.color_palette(\"coolwarm\", n_colors=2)\n", + "\n", + "# Create the FacetGrid with reordered columns and rows\n", + "g = sns.FacetGrid(\n", + " df,\n", + " col=\"G\", # G (n_fixef) increases left to right\n", + " row=\"k\", # k increases top to bottom\n", + " margin_titles=True,\n", + " height=4,\n", + " aspect=1.2,\n", + " col_order=[\"n_fixef = 1\", \"n_fixef = 2\", \"n_fixef = 3\"], # Ensure correct order\n", + " sharey=False,\n", + ")\n", + "\n", + "# Plot the bar chart for each facet with the custom palette\n", + "g.map(\n", + " sns.barplot,\n", + " \"n_obs\",\n", + " \"full_feols_timing\",\n", + " \"demeaner_backend\",\n", + " order=n_obs_order, # Dynamic order for n_obs\n", + " hue_order=demeaner_backend_order, # Dynamic hue order for demeaner_backend\n", + " errorbar=None, # Suppress error bars\n", + " palette=custom_palette,\n", + ")\n", + "\n", + "# Add legend and adjust layout\n", + "g.add_legend(title=\"Demeaner Backend\")\n", + "g.set_axis_labels(\"Number of Observations\", \"Runtime (seconds)\")\n", + "g.set_titles(row_template=\"k = {row_name}\", col_template=\"{col_name}\")\n", + "plt.subplots_adjust(top=0.9)\n", + "g.fig.suptitle(\"Runtime vs Number of Observations by n_fixef and k\")\n", + "\n", + "# Show plot\n", + "plt.show()" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/benchmarks/gpu_results.csv b/benchmarks/gpu_results.csv new file mode 100644 index 000000000..1ab18b303 --- /dev/null +++ b/benchmarks/gpu_results.csv @@ -0,0 +1,25 @@ +,method,demeaner_backend,k,G,n_obs,full_feols_timing,demean_timing +0,feols,jax,1,1,10000,0.22883999347686768,0.08213257789611816 +1,feols,jax,1,1,100000,0.27838222980499266,0.6599355697631836 +2,feols,jax,1,2,10000,0.2594131946563721,0.07008242607116699 +3,feols,jax,1,2,100000,0.5564646482467651,0.6762551069259644 +4,feols,jax,1,3,10000,0.29452004432678225,0.08089225292205811 +5,feols,jax,1,3,100000,0.7971727609634399,0.7361236095428467 +6,feols,jax,10,1,10000,0.23609719276428223,0.08923766613006592 +7,feols,jax,10,1,100000,0.35655946731567384,0.8534042596817016 +8,feols,jax,10,2,10000,0.2677977800369263,0.07926526069641113 +9,feols,jax,10,2,100000,0.7200102090835572,0.880342435836792 +10,feols,jax,10,3,10000,0.30958850383758546,0.0926206350326538 +11,feols,jax,10,3,100000,0.9418511629104614,0.8934823036193847 +12,feols,numba,1,1,10000,0.2558188199996948,0.0025653839111328125 +13,feols,numba,1,1,100000,0.26205954551696775,0.025234317779541014 +14,feols,numba,1,2,10000,0.23201637268066405,0.0021322011947631837 +15,feols,numba,1,2,100000,0.33342432975769043,0.03563899993896484 +16,feols,numba,1,3,10000,0.23092274665832518,0.0023543596267700194 +17,feols,numba,1,3,100000,0.25670347213745115,0.021407365798950195 +18,feols,numba,10,1,10000,0.4105666160583496,0.0046176910400390625 +19,feols,numba,10,1,100000,0.32753868103027345,0.08355832099914551 +20,feols,numba,10,2,10000,0.23588848114013672,0.005055141448974609 +21,feols,numba,10,2,100000,0.3476848602294922,0.0862342357635498 +22,feols,numba,10,3,10000,0.25297954082489016,0.005847930908203125 +23,feols,numba,10,3,100000,0.3176179170608521,0.056423068046569824 diff --git a/benchmarks/gpu_runtime_res.csv b/benchmarks/gpu_runtime_res.csv new file mode 100644 index 000000000..ab1eb889f --- /dev/null +++ b/benchmarks/gpu_runtime_res.csv @@ -0,0 +1,121 @@ +,method,demeaner_backend,k,G,n_obs,full_feols_timing,demean_timing +0,feols,jax,1,1,1000,0.1320037841796875, +1,feols,jax,1,1,10000,0.16295738220214845, +2,feols,jax,1,1,100000,0.20828957557678224, +3,feols,jax,1,1,1000000,0.42873706817626955, +4,feols,jax,1,1,10000000,3.4382568836212157, +5,feols,jax,1,2,1000,0.1420374870300293, +6,feols,jax,1,2,10000,0.18153152465820313, +7,feols,jax,1,2,100000,0.2269190788269043, +8,feols,jax,1,2,1000000,0.45243015289306643, +9,feols,jax,1,2,10000000,3.5151084899902343, +10,feols,jax,1,3,1000,0.151939058303833, +11,feols,jax,1,3,10000,0.18758950233459473, +12,feols,jax,1,3,100000,0.2361727237701416, +13,feols,jax,1,3,1000000,0.4868768692016602, +14,feols,jax,1,3,10000000,3.8493817329406737, +15,feols,jax,10,1,1000,0.19514913558959962, +16,feols,jax,10,1,10000,0.17230439186096191, +17,feols,jax,10,1,100000,0.2664950370788574, +18,feols,jax,10,1,1000000,0.9469316005706787, +19,feols,jax,10,1,10000000,8.387261295318604, +20,feols,jax,10,2,1000,0.20477962493896484, +21,feols,jax,10,2,10000,0.18998703956604004, +22,feols,jax,10,2,100000,0.26862139701843263, +23,feols,jax,10,2,1000000,0.9852738380432129, +24,feols,jax,10,2,10000000,8.597736883163453, +25,feols,jax,10,3,1000,0.19365372657775878, +26,feols,jax,10,3,10000,0.2131319522857666, +27,feols,jax,10,3,100000,0.28316402435302734, +28,feols,jax,10,3,1000000,1.0177009105682373, +29,feols,jax,10,3,10000000,8.918838596343994, +30,feols,jax,50,1,1000,0.18034906387329103, +31,feols,jax,50,1,10000,0.2439594268798828, +32,feols,jax,50,1,100000,0.5509981155395508, +33,feols,jax,50,1,1000000,3.538271760940552, +34,feols,jax,50,1,10000000,33.43665189743042, +35,feols,jax,50,2,1000,0.20095858573913575, +36,feols,jax,50,2,10000,0.25174636840820314, +37,feols,jax,50,2,100000,0.5164000511169433, +38,feols,jax,50,2,1000000,3.4102453231811523, +39,feols,jax,50,2,10000000,33.30270967483521, +40,feols,jax,50,3,1000,0.20151491165161134, +41,feols,jax,50,3,10000,0.26232194900512695, +42,feols,jax,50,3,100000,0.529056167602539, +43,feols,jax,50,3,1000000,3.44671630859375, +44,feols,jax,50,3,10000000,33.779102373123166, +45,feols,jax,100,1,1000,0.24306898117065429, +46,feols,jax,100,1,10000,0.2974048137664795, +47,feols,jax,100,1,100000,1.0358835697174071, +48,feols,jax,100,1,1000000,6.931807231903076, +49,feols,jax,100,1,10000000,68.10868678092956, +50,feols,jax,100,2,1000,0.2459031581878662, +51,feols,jax,100,2,10000,0.3029839515686035, +52,feols,jax,100,2,100000,0.8705804347991943, +53,feols,jax,100,2,1000000,6.833173513412476, +54,feols,jax,100,2,10000000,67.79917821884155, +55,feols,jax,100,3,1000,0.25403652191162107, +56,feols,jax,100,3,10000,0.3005673885345459, +57,feols,jax,100,3,100000,0.8948062419891357, +58,feols,jax,100,3,1000000,6.897133874893188, +59,feols,jax,100,3,10000000,68.098957157135, +60,feols,numba,1,1,1000,0.1151197910308838, +61,feols,numba,1,1,10000,0.11886963844299317, +62,feols,numba,1,1,100000,0.17658085823059083, +63,feols,numba,1,1,1000000,0.38565616607666015, +64,feols,numba,1,1,10000000,3.7955574989318848, +65,feols,numba,1,2,1000,0.13867654800415039, +66,feols,numba,1,2,10000,0.12686729431152344, +67,feols,numba,1,2,100000,0.18665246963500975, +68,feols,numba,1,2,1000000,0.47369937896728515, +69,feols,numba,1,2,10000000,5.122746992111206, +70,feols,numba,1,3,1000,0.13739519119262694, +71,feols,numba,1,3,10000,0.1281270980834961, +72,feols,numba,1,3,100000,0.20229177474975585, +73,feols,numba,1,3,1000000,0.4988919734954834, +74,feols,numba,1,3,10000000,5.58708610534668, +75,feols,numba,10,1,1000,0.34712915420532225, +76,feols,numba,10,1,10000,0.12650370597839355, +77,feols,numba,10,1,100000,0.20991711616516112, +78,feols,numba,10,1,1000000,0.9024174690246582, +79,feols,numba,10,1,10000000,9.295429277420045, +80,feols,numba,10,2,1000,0.13671212196350097, +81,feols,numba,10,2,10000,0.14796338081359864, +82,feols,numba,10,2,100000,0.21911492347717285, +83,feols,numba,10,2,1000000,1.0395352363586425, +84,feols,numba,10,2,10000000,11.671601057052612, +85,feols,numba,10,3,1000,0.144820499420166, +86,feols,numba,10,3,10000,0.14316558837890625, +87,feols,numba,10,3,100000,0.23515863418579103, +88,feols,numba,10,3,1000000,1.0837657451629639, +89,feols,numba,10,3,10000000,12.424165201187133, +90,feols,numba,50,1,1000,0.13538317680358886, +91,feols,numba,50,1,10000,0.19253530502319335, +92,feols,numba,50,1,100000,0.47671823501586913, +93,feols,numba,50,1,1000000,3.326345920562744, +94,feols,numba,50,1,10000000,36.28279056549072, +95,feols,numba,50,2,1000,0.15496983528137206, +96,feols,numba,50,2,10000,0.2061081886291504, +97,feols,numba,50,2,100000,0.5060088634490967, +98,feols,numba,50,2,1000000,3.9241212368011475, +99,feols,numba,50,2,10000000,46.66024560928345, +100,feols,numba,50,3,1000,0.1508333683013916, +101,feols,numba,50,3,10000,0.21372389793395996, +102,feols,numba,50,3,100000,0.5096695899963379, +103,feols,numba,50,3,1000000,4.05219841003418, +104,feols,numba,50,3,10000000,48.755423641204835, +105,feols,numba,100,1,1000,0.18344516754150392, +106,feols,numba,100,1,10000,0.23093295097351074, +107,feols,numba,100,1,100000,0.8638255596160889, +108,feols,numba,100,1,1000000,6.876220750808716, +109,feols,numba,100,1,10000000,84.45749440193177, +110,feols,numba,100,2,1000,0.2027737617492676, +111,feols,numba,100,2,10000,0.244942045211792, +112,feols,numba,100,2,100000,0.9162676334381104, +113,feols,numba,100,2,1000000,7.880603408813476, +114,feols,numba,100,2,10000000,105.2484076499939, +115,feols,numba,100,3,1000,0.1997222423553467, +116,feols,numba,100,3,10000,0.2807606220245361, +117,feols,numba,100,3,100000,0.9424882888793945, +118,feols,numba,100,3,1000000,8.141235780715942, +119,feols,numba,100,3,10000000,109.21670022010804, diff --git a/docs/_quarto.yml b/docs/_quarto.yml index eb791b593..6cb4a1eaa 100644 --- a/docs/_quarto.yml +++ b/docs/_quarto.yml @@ -41,6 +41,8 @@ website: text: "Regression Decomposition" - text: "Compare fixest & PyFixest" file: compare-fixest-pyfixest.qmd + - text: "PyFixest on the GPU" + file: pyfixest_gpu.ipynb - text: "Replicating 'The Effect' with PyFixest" file: replicating-the-effect.qmd diff --git a/docs/figures/gpu_benchmarks.png b/docs/figures/gpu_benchmarks.png new file mode 100644 index 000000000..5ec7ae5a0 Binary files /dev/null and b/docs/figures/gpu_benchmarks.png differ diff --git a/docs/pyfixest_gpu.ipynb b/docs/pyfixest_gpu.ipynb new file mode 100644 index 000000000..ddc919643 --- /dev/null +++ b/docs/pyfixest_gpu.ipynb @@ -0,0 +1,53 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `PyFixest` on professional-tier GPUs \n", + "\n", + "`PyFixest` allows to run the fixed effects demeaning on the GPU via the `demeaner_backend` argument. \n", + "To do so, you will have to install `jax` and `jaxblib`, for example by typing `pip install pyfixest[jax]`.\n", + "\n", + "We test two back-ends for the iterative alternating-projections component of the fixed-effects regression on an Nvidia A100 GPU with 40 GB VRAM (a GPU that one typically wouldn't have installed to play graphics-intensive videogames on consumer hardware). `numba` benchmarks are run on a 12-core xeon CPU. \n", + "\n", + "The JAX backend exhibits major performance improvements **on the GPU** over numba in large problems. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](figures/gpu_benchmarks.png)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "On the **CPU** instead, we find that `numba` outperforms the JAX backend. You can find details in the [benchmark section](https://github.com/py-econometrics/pyfixest/tree/master/benchmarks) of the github repo. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "dev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pixi.lock b/pixi.lock index 3f8cd3f75..0696e4539 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1428,6 +1428,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/49/b4418a7a892c0dd64442bbbeef54e1cdfe722dfc5a7bf0d611d3f5f90e99/jax-0.4.38-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/cc/37fce5162f6b9070203fd76cc0f298d9b3bfdf01939a78935a6078d63621/jaxlib-0.4.38-cp312-cp312-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl @@ -1455,6 +1457,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/85/16e17e75831ec01808c5f07e578f1552df87a4f5c827caa8be28f97b4c19/mizani-0.13.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/a2/c91fedeb24e622b30d240e89e5ecf40cb3c2a8e50f61b5b28f0eb1fbb458/narwhals-1.20.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl @@ -1464,6 +1467,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8b/41/ac11cf33524def12aa5bd698226ae196a1185831c05ed29dc0c56eaa308b/numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/f7/3367feadd4ab56783b0971c9b7edfbdd68e0c70ce877949a5dd2117ed4a0/palettable-3.3.3-py2.py3-none-any.whl @@ -1727,6 +1731,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/49/b4418a7a892c0dd64442bbbeef54e1cdfe722dfc5a7bf0d611d3f5f90e99/jax-0.4.38-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/49/df/08b94c593c0867c7eaa334592807ba74495de4be90580f360db8b96221dc/jaxlib-0.4.38-cp312-cp312-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl @@ -1754,6 +1760,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/85/16e17e75831ec01808c5f07e578f1552df87a4f5c827caa8be28f97b4c19/mizani-0.13.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/b7/a067839f6e435785f34b09d96938dccb3a5d9502037de243cb84a2eb3f23/ml_dtypes-0.5.0-cp312-cp312-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/a2/c91fedeb24e622b30d240e89e5ecf40cb3c2a8e50f61b5b28f0eb1fbb458/narwhals-1.20.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl @@ -1763,6 +1770,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/eb/5c/b5ec752c475e78a6c3676b67c514220dbde2725896bbb0b6ec6ea54b2738/numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/f7/3367feadd4ab56783b0971c9b7edfbdd68e0c70ce877949a5dd2117ed4a0/palettable-3.3.3-py2.py3-none-any.whl @@ -2026,6 +2034,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/49/b4418a7a892c0dd64442bbbeef54e1cdfe722dfc5a7bf0d611d3f5f90e99/jax-0.4.38-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b1/c9d2a7ba9ebeabb7ac37082f4c466364f475dc7550a79358c0f0aa89fdf2/jaxlib-0.4.38-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl @@ -2053,6 +2063,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/85/16e17e75831ec01808c5f07e578f1552df87a4f5c827caa8be28f97b4c19/mizani-0.13.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/b7/a067839f6e435785f34b09d96938dccb3a5d9502037de243cb84a2eb3f23/ml_dtypes-0.5.0-cp312-cp312-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/a2/c91fedeb24e622b30d240e89e5ecf40cb3c2a8e50f61b5b28f0eb1fbb458/narwhals-1.20.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl @@ -2062,6 +2073,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/65/42/39559664b2e7c15689a638c2a38b3b74c6e69a04e2b3019b9f7742479188/numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/f7/3367feadd4ab56783b0971c9b7edfbdd68e0c70ce877949a5dd2117ed4a0/palettable-3.3.3-py2.py3-none-any.whl @@ -2293,6 +2305,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/49/b4418a7a892c0dd64442bbbeef54e1cdfe722dfc5a7bf0d611d3f5f90e99/jax-0.4.38-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/7a/8515950a60a4ea5b13cc98fc0a42e36553b2db5a6eedc00d3bd7836f77b5/jaxlib-0.4.38-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl @@ -2320,6 +2334,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/85/16e17e75831ec01808c5f07e578f1552df87a4f5c827caa8be28f97b4c19/mizani-0.13.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/3a/40c40b78a7eb456837817bfa2c5bc442db59aefdf21c5ecb94700037813d/ml_dtypes-0.5.0-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/a2/c91fedeb24e622b30d240e89e5ecf40cb3c2a8e50f61b5b28f0eb1fbb458/narwhals-1.20.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl @@ -2329,6 +2344,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/bd/0fe29fcd1b6a8de479a4ed25c6e56470e467e3611c079d55869ceef2b6d1/numba-0.60.0-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/f7/3367feadd4ab56783b0971c9b7edfbdd68e0c70ce877949a5dd2117ed4a0/palettable-3.3.3-py2.py3-none-any.whl @@ -9107,7 +9123,7 @@ packages: - pypi: . name: pyfixest version: 0.28.0 - sha256: 0ae8cab8729c169ad6108ccd16d0fb05008fc93e37fc61390fa957fdd1e32337 + sha256: 241d05c999dbe321ceda8985267399695e3cd4b18c572727896202dc9e2f1c5b requires_dist: - lets-plot>=4.0.0 - scipy>=1.6 @@ -9143,6 +9159,8 @@ packages: - pylatex>=1.4.2,<2 ; extra == 'docs' - marginaleffects>=0.0.10 ; extra == 'docs' - pyarrow>=14.0 ; extra == 'docs' + - jax>=0.4.15 ; extra == 'docs' + - jaxlib>=0.4.15 ; extra == 'docs' - jax>=0.4.15 ; extra == 'jax' - jaxlib>=0.4.15 ; extra == 'jax' requires_python: '>=3.9' diff --git a/pyproject.toml b/pyproject.toml index 4e0ce1179..a2534f275 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,9 @@ docs = [ "pylatex>=1.4.2,<2", "marginaleffects>=0.0.10", "pyarrow>=14.0", + "jax>=0.4.15", + "jaxlib>=0.4.15", + ] jax = [