diff --git a/docs/source/examples/notebooks/models/saving_custom_models.ipynb b/docs/source/examples/notebooks/models/saving_custom_models.ipynb new file mode 100644 index 0000000000..2ba5a86273 --- /dev/null +++ b/docs/source/examples/notebooks/models/saving_custom_models.ipynb @@ -0,0 +1,247 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1111490e", + "metadata": {}, + "source": [ + "# Saving and Loading Custom Models in PyBaMM\n", + "\n", + "This notebook demonstrates how to create, save, and load custom models in PyBaMM. This notebook demonstrates how to:\n", + "1. Create a custom model\n", + "2. Save the model to a JSON file\n", + "3. Load the model from a JSON file\n", + "4. Use the loaded model for simulations\n", + "5. Load models from URLs" + ] + }, + { + "cell_type": "markdown", + "id": "1d84b2cf", + "metadata": {}, + "source": [ + "## Creating a Custom Diffusion Model\n", + "\n", + "PyBaMM provides tutorials that demonstrate how to create different types of custom models.\n", + "In this notebook, we will build on one of those examples of creating a [Simple PDE Model.](https://docs.pybamm.org/en/v23.5_a/source/examples/notebooks/creating_models/2-a-pde-model.html)\n", + "\n", + "\n", + "Here, we implement a simple one-dimensional diffusion model inside a spherical particle, which will serve as the basis for demonstrating how to save and reload custom models." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5229ddfc", + "metadata": {}, + "outputs": [], + "source": [ + "#\n", + "# definig a cuatom model\n", + "\n", + "import os\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "import pybamm\n", + "from pybamm.expression_tree.operations.serialise import Serialise\n", + "\n", + "\n", + "class DiffusionModel(pybamm.BaseModel):\n", + " def __init__(self, name=\"1D Diffusion Model\"):\n", + " super().__init__(name)\n", + "\n", + " # Define variables\n", + " c = pybamm.Variable(\"Concentration\", domain=\"negative particle\")\n", + "\n", + " # Define flux and PDE\n", + " N = -pybamm.grad(c) # flux\n", + " dcdt = -pybamm.div(N) # RHS equation\n", + "\n", + " # Equations\n", + " self.rhs = {c: dcdt}\n", + " self.initial_conditions = {c: pybamm.Scalar(1)}\n", + "\n", + " # Boundary conditions\n", + " lbc = pybamm.Scalar(0)\n", + " rbc = pybamm.Scalar(2)\n", + " self.boundary_conditions = {\n", + " c: {\"left\": (lbc, \"Neumann\"), \"right\": (rbc, \"Neumann\")}\n", + " }\n", + "\n", + " # Expose variables\n", + " self.variables = {\"Concentration\": c, \"Flux\": N}" + ] + }, + { + "cell_type": "markdown", + "id": "d35dbd48", + "metadata": {}, + "source": [ + "## Saving and Loading the Model\n", + "\n", + "PyBaMM provides functionality to save custom models to JSON files and load them back.\n", + "\n", + "- `Serialise.save_custom_model()` to save our model to a JSON file\n", + "- `Serialise.load_custom_model()` to load it back" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "381a5e01", + "metadata": {}, + "outputs": [], + "source": [ + "# serilaising the model\n", + "model = DiffusionModel()\n", + "\n", + "Serialise.save_custom_model(model, \"custom_model.json\")\n", + "\n", + "\n", + "# loading the model\n", + "loaded_model = Serialise.load_custom_model(\"custom_model.json\")\n", + "os.remove(\"custom_model.json\") # Clean up" + ] + }, + { + "cell_type": "markdown", + "id": "14374388", + "metadata": {}, + "source": [ + "## Using the Loaded Model\n", + "\n", + "Once the model has been reloaded, it can be simulated in the same way as the original. \n", + "\n", + "- Define the geometry and generate the mesh for the simulation. \n", + "- Specify the spatial discretisation methods and apply them to the model. \n", + "- Solve the resulting system of equations. \n", + "- Visualize the results with two plots: \n", + "\n", + "These results confirm that the loaded model preserves its full functionality and behaves exactly as the original model.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "23bd164e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABQkAAAGGCAYAAADYVwfrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAicBJREFUeJzs3Xd8VFXCxvHfpCekECCBEBIS0ui9I71EsetrQRRQREUUlKLi2rCBIthQRFDUVcTurjV0EJDeWxolIYSEAOmkzdz3j+yymwU1A0luyvP9fPbzZu69M/PAu0vOPHPuORbDMAxERERERERERESkznIwO4CIiIiIiIiIiIiYSyWhiIiIiIiIiIhIHaeSUEREREREREREpI5TSSgiIiIiIiIiIlLHqSQUERERERERERGp41QSioiIiIiIiIiI1HEqCUVEREREREREROo4lYQiIiIiIiIiIiJ1nJPZAS6HzWbjxIkTeHl5YbFYzI4jIiIiYirDMMjJyaFp06Y4ONTd74I1RhQRERH5j/KOEWt0SXjixAmCgoLMjiEiIiJSrSQnJ9OsWTOzY5hGY0QRERGRC/3VGLFGl4ReXl5A6R/S29vb5DQiIiIi5srOziYoKOj8GKmu0hhRRERE5D/KO0as0SXhv28f8fb21gBQRERE5F/q+i22GiOKiIiIXOivxoh1d7EaERERERERERERAVQSioiIiIiIiIiI1HkqCUVEREREREREROo4lYQiIiIiIiIiIiJ1nEpCERERERERERGROk4loYiIiIiIiIiISB2nklBERERERERERKSOU0koIiIiIlVi1qxZWCwWHnnkkXJdv3TpUiwWCzfccEOl5hIRERERlYQiIiIiUgW2bt3KggULaN++fbmuP3r0KFOnTqVv376VnExEREREQCWhiIiIiFSy3NxcRo4cycKFC/H19f3L661WKyNHjmTGjBm0aNGiChKKiIiIiEpCERERkUpktRn8sPsEBcVWs6OYZsKECVx99dUMGTKkXNc///zz+Pv7M3bs2EpOJiIiImIOm83gq23J2GyG2VHOczI7gIiIiEhtZBgGyw+kMWdZHLFpOTx9TWvGXhFqdqwqt3TpUnbs2MHWrVvLdf369ev54IMP2LVrV7nfo7CwkMLCwvOPs7Oz7Y0pIiIiUmUMw+Dpf+zjs81JbD5yhtdu6WB2JEAloYiIiEiF25iYweyYWHYmZQLg7eaEs6PF3FAmSE5OZtKkSSxfvhw3N7e/vD4nJ4e77rqLhQsX0qhRo3K/z8yZM5kxY8blRBURERGpMq/8Gstnm5OwWKB/pJ/Zcc6zGIZRfeY12ik7OxsfHx+ysrLw9vY2O46IiIjUcbuTM5kdE8v6hAwA3J0dubtPCPf3C8PHw7nS37+6jY2+//57brzxRhwdHc8fs1qtWCwWHBwcKCwsLHNu165ddOrUqcwxm80GgIODA7GxsYSFhV3wPhebSRgUFFRt/h5ERERE/u3dNQm8+mssALNuasft3YMr/T3LO0bUTEIRERGRyxSflsNry2KJ2Z8GgLOjhTu6BzNhUDj+Xn89g662Gjx4MHv37i1z7O6776Zly5Y8/vjjZcpAgJYtW15w/VNPPUVOTg5vvvkmQUFBF30fV1dXXF1dKza8iIiISAX7++9HzxeEfxveqkoKQnuoJBQRERG5RMln8nl9RRzf70zBZoDFAjd2CuTRIZEENfAwO57pvLy8aNu2bZlj9erVo2HDhuePjxo1isDAQGbOnImbm9sF19evXx/gguMiIiIiNcl3O4/z9D/2A/DwoHDG9WthcqILqSQUERERsVN6TgHvrEpgyZYkiq2lK7dEt2nMlGFRRDb2MjldzZKUlISDg4PZMUREREQqzfIDaUz9ag8AY3qHMHlopMmJLk4loYiIiEg5ZeUXs2BdIos3HOVcsRWAK8IbMS06ig5B9c0NV0OsWbPmTx//r48++qjSsoiIiIhUtg0JGUxYsgOrzeCmzoE8c01rLJbquaGdSkIRERGRv5BfVMLiDUd5b20iOQUlAHQMqs9j0VH0Di//LrwiIiIiUnfsTDrLuE+2UVRiI7pNY169uT0ODtWzIASVhCIiIiJ/qLDEytItyby9KoGM3NLdc6MaezE1Ooohrfyr7bfAIiIiImKuQyezGbN4K/lFVvpGNOKtEZ1wcqzeS6yoJBQRERH5H1abwXc7U3h9eRwpmecACG7gweShkVzboSmO1fgbYBEREREx19GMPO76YAtZ54rpHFyfBXd1wdXJ0exYf0kloYiIiMi/GIZBzP6TvLYsjoT0XAD8vVx5eHAEt3UNwsWpen/7KyIiIiLmSs06x8hFmzmVU0irAG8Wj+mOh0vNqN9qRkoRERGRSmQYBusTMpgdE8ue41kA+Lg7M35AGKN7heDuUv2/+RURERERc53OLeTORZtJyTxHaKN6fHJPd3w8nM2OVW4qCUVERKRO25F0lld/PcSmw2cA8HBxZOwVoYzr1wJvt5ozqBMRERER82QXFDN68RYST+XR1MeNT+/tgZ+Xq9mx7KKSUEREROqk2JM5zI6JZcXBNABcHB0Y2TOYCQPDaeRZswZ0IiIiImKec0VWxn60lX0p2TSs58Lf7+1BYH13s2PZTSWhiIiI1CnHTufxxop4vt+VgmGAgwX+r0szJg6OoJmvh9nxRERERKQGKSqx8cCn29l69Cxebk58MrY7YX6eZse6JKaWhCEhIRw7duyC4w8++CDvvPOOCYlERESktkrLLuCtlfF8sTWZEpsBwPB2TZg8NIpw/5o5kBMRERER81htBo9+sYu1cadwd3Zk8ZhutGnqY3asS2ZqSbh161asVuv5x/v27WPo0KHccsstJqYSERGR2iQzv4j5axP5eONRCoptAPSL9GPasCjaNau5gzgRERERMY9hGDz57V5+2puKi6MDC+7qQteQBmbHuiymloR+fn5lHs+aNYuwsDD69+9vUiIRERGpLfIKS/hw/RHeX3eYnMISALo092VadBQ9WzQ0OZ2IiIiI1FSGYfDiTwf5YlsyDhZ4a0RH+kX6/fUTq7lqsyZhUVERn376KZMnT8ZisVz0msLCQgoLC88/zs7Orqp4IiIiUkMUFFtZsjmJd1YncDqvCICWTbyYFh3FoJb+fzjOEBEREREpj7dWJvDB+iMAvHJze65sG2ByoopRbUrC77//nszMTMaMGfOH18ycOZMZM2ZUXSgRERGpMUqsNr7dkcIbK+I4kVUAQEhDDx4dGsm17Zvi4KByUEREREQuz4frj/D6ijgAnr22Nbd0DTI5UcWxGIZhmB0CIDo6GhcXF3744Yc/vOZiMwmDgoLIysrC29u7KmKKiIhINWOzGfyy7yRzlsdy+FQeAE283Zg4OIJbujbD2dHB5IRVJzs7Gx8fnzo/NtLfg4iIiFSGr7YlM+3rPQBMHhrJxMERJicqn/KOjarFTMJjx46xYsUKvv322z+9ztXVFVdX1ypKJSIiItWZYRisjTvFa8ti2ZdSugSJr4czDw4I565ezXFzdjQ5oYiIiIjUFr/uS+Xxb0oLwnuvCOXhQeEmJ6p41aIkXLx4Mf7+/lx99dVmRxEREZEaYNvRM7waE8uWI2cAqOfiyL19W3Bv31C83JxNTiciIiIitcm6uFM8/PlObAbc1jWIv13dqlauc216SWiz2Vi8eDGjR4/Gycn0OCIiIlKN7T+RxZxlcaw6lA6Ai5MDo3o2Z/yAMBp66m4DEREREalY246e4f6/b6fYanB1uwBevqldrSwIoRqUhCtWrCApKYl77rnH7CgiIiJSTR3JyGPu8jh+2H0CAEcHC7d2bcbDgyJoWt/d5HQiIiIiUhvtP5HF3R9t5Vyxlf6Rfrx+W0cca/FmeKaXhMOGDaOa7J0iIiIi1Uxq1jneWhnPl9uOY7WVjheu7dCUyUMjCW1Uz+R0IiIiIlJbJZ7KZdQHW8gpKKFbiC/v3dkFF6favSGe6SWhiIiIyP86nVvI/DWJfLLpGEUlNgAGtfRnyrBI2jT1MTmdiIiIiNRmKZnnuGvRZk7nFdGmqTcfjOmGu0vt3xRPJaGIiIhUGzkFxSz67QiLfjtMXpEVgO4hDZh2ZRTdQhqYnE5EREREartTOYXcuWgzJ7IKCPOrxyf3dMe7jmyMp5JQRERETFdQbOXvvx/j3TUJnM0vBqBNU2+mRUfRP9Kv1i4OLSIiIiLVR1Z+MXd9sJkjGXkE1nfn03t71KnN8VQSioiIiGmKrTa+2nact1bGczK7AIAWjeoxZVgUV7VtgkMtXhhaRERERKqPvMIS7v5oC4dO5uDn5cpn9/YgwKdubZCnklBERESqnM1m8MOeE7y+PI6jp/MBaOrjxiNDIrmpcyBOjrV7UWgRERERqT4KS6zc//ft7EjKxMfdmb+P7U5IHdwkTyWhiIiIVBnDMFgdm87smDgOpmYD0LCeCxMGhnNHj2DcnGv/gtAiIiIiUn2UWG1M/Hwn6xMy8HBx5KO7u9GyibfZsUyhklBERESqxObDp5kdE8u2Y2cB8HJ1Yly/FtxzRSierhqSiIiIiEjVstkMHvtmDzH703BxcmDRqK50CvY1O5ZpNCIXERGRSrUvJYvZMbGsjTsFgKuTA2N6h/BA/zB867mYnE5ERERE6iLDMHj+xwN8uyMFRwcL80Z0ond4I7NjmUoloYiIiFSKxFO5zF0Wx097UwFwcrBwW7cgJg6OoLG3m8npRERERKQue315HB9tPArAa7e0Z1ibJuYGqgZUEoqIiEiFSsk8x5sr4vh6+3FsBlgscF2Hpjw6JLJOLgAtIiIiItXLwnWHeWtVAgAvXN+GGzs1MzlR9aCSUERERCpERm4h76xO4LNNSRRZbQAMadWYKcMiaRVQNxd/FhEREZHq5fMtSbz080EApkVHcVevEHMDVSMqCUVEROSyZBcUs3DdYT5Yf4T8IisAPVs0YFp0S7o0r7sLP4uIiIhI9fLD7hM8+d1eAO7v34IHB4SZnKh6UUkoIiIil+RckZVPfj/K/LWJZOYXA9C+mQ9Th0XRN6IRFovF5IQiIiIiIqVWHUrj0S92YRhwR49gnriypcar/0MloYiIiNil2Grji63JvLUynvScQgDC/T2ZOiyS6DZNNNgSERERkWpl0+HTjP90ByU2g+s6NOWF69tqzHoRKglFRESkXKw2gx92n2Du8jiSzuQDEFjfnUeHRnJjp0AcHTTQEhEREZHqZWfSWe79eBuFJTYGt/Rnzq0dNG79AyoJRURE5E8ZhsGKg+m8FhNLbFoOAI08XXhoYDgjegTj6uRockIRERERkQvtS8li1IdbyC0soVeLhrwzsjPOjg5mx6q2VBKKiIjIH9qYmMHsmFh2JmUC4O3mxP39w7i7TwgeLhpGiIiIiEj1dOhkNnd9sJmcghK6Nvdl0eiuuDnry+0/o9G9iIiIXGB3ciazY2JZn5ABgJuzA3f3CeWBfmH4eDibnE5ERERE5I8lpOdy56LNnM0vpkNQfRbf3Y16rqrA/or+hkREROS8+LQcXlsWS8z+NACcHS3c0T2YCYPC8fdyMzmdiIiIiMifO3Y6j5GLNpGRW0TrAG8+ubs7Xm76krs8VBKKiIgIyWfyeX1FHN/vTMFmgMUCN3YK5NEhkQQ18DA7noiIiIjIX0o+k88dCzeTll1IZGNPPr23h+6CsYNKQhERkTosPaeAd1YlsGRLEsVWA4DoNo2ZMiyKyMZeJqcTERERESmf42fzGbFwEymZ52jhV4/P7u1Jg3ouZseqUVQSioiI1EFZ+cUsWJfI4g1HOVdsBeCK8EZMi46iQ1B9c8OJiIiIiNjhROY5RizcxPGz5whp6MGSe3vi5+VqdqwaRyWhiIhIHZJfVMLiDUdZsDaR7IISADoG1eex6Ch6hzcyOZ2IiIiIiH1Ss85x+/ubSD5zjuYNPfj8vp408dFa2pdCJaGIiEgdUFRi4/MtSby9KoGM3EIAIht7MnVYFENbN8ZisZicUERERETEPiezCrj9/U0kncknuIEHn4/rSYCPu9mxaiyVhCIiIrWY1Wbw3c4U3lgRx/Gz5wAIauDO5KGRXNchEEcHlYMiIiIiUvOkZRcwYuEmjp3OJ6iBO5/f15Om9VUQXg6VhCIiIrWQYRjE7D/Ja8viSEjPBcDfy5WHB0dwW9cgXJwcTE4oIiIiInJp0rMLGPH+Jo5k5NHM153Px/UkUAXhZVNJKCIiUsusj89gdswhdh/PAsDH3ZnxA8IY3SsEdxdHk9OJiIiIiFy69JwCbl+4icMZeQTWLy0Im/l6mB2rVlBJKCIiUkvsSDrLazGxbEw8DYCHiyNjrwjl3r4t8HF3NjmdiIiIiMjlOZVTyIj3N3H4VB5Nfdz4fFxPghqoIKwoKglFRERquNiTOby2LJblB9IAcHF04I4ewUwYGI6fl6vJ6URERERELl9GbiF3LNxE4qk8Anzc+Py+ngQ3VEFYkVQSioiI1FBJp/N5fUUc3+9KwTDAwQI3d27GpCERuuVCRERERGqN0/8qCOPTc2niXTqDsHnDembHqnW0armIiEgNk55dwFPf72XQnDV8t7O0IBzergnLHu3H7Fs6qCCUamvWrFlYLBYeeeSRP7xm4cKF9O3bF19fX3x9fRkyZAhbtmypupAiIiJSrZzJK2Lkos3EpeXS2NuVz+/rSUgjFYSVQTMJRUREaojM/CLmr03k441HKSi2AdAv0o9pw6Jo18zH5HQif27r1q0sWLCA9u3b/+l1a9asYcSIEfTu3Rs3NzdeeeUVhg0bxv79+wkMDKyitCIiIlIdnM0r4o6Fmzh0Mgc/L1eWjOtJqArCSqOSUEREpJrLKyzhw/VHeH/dYXIKSwDoHFyfadEt6RXW0OR0In8tNzeXkSNHsnDhQl588cU/vfazzz4r83jRokV88803rFy5klGjRlVmTBEREalGMvNLZxD+uyD8fFxPwvw8zY5Vq6kkFBERqaYKiq0s2ZzEO6sTOJ1XBEDLJl5Mi45iUEt/LBaLyQlFymfChAlcffXVDBky5C9Lwv+Vn59PcXExDRo0+MNrCgsLKSwsPP84Ozv7krOKiIiI+f5dEB5IzaaRpyufj+tBuL8KwsqmklBERKSaKbHa+HZHCm+siONEVgEAzRt6MHloJNe2b4qDg8pBqTmWLl3Kjh072Lp16yU9//HHH6dp06YMGTLkD6+ZOXMmM2bMuNSIIiIiUo1k5Rdz1wdb2H8im4b1XP5VEHqZHatOMH3jkpSUFO68804aNmyIu7s77dq1Y9u2bWbHEhERqXI2m8FPe1IZ9sY6HvtmDyeyCmji7cbLN7ZjxeT+XN8xUAWh1CjJyclMmjSJzz77DDc3N7ufP2vWLJYuXcp33333p8+fPn06WVlZ5/+TnJx8ObFFRETEJFnnihn14Wb2pmTRoJ4LS8b1JKKxCsKqYupMwrNnz9KnTx8GDhzIL7/8gp+fH/Hx8fj6+poZS0REpEoZhsHauFO8tiyWfSmlt0n6ejjz4IBw7urVHDdnR5MTilya7du3k56eTufOnc8fs1qtrFu3jnnz5lFYWIij48X/+/3aa68xa9YsVqxY8Zebnbi6uuLq6lqh2UVERKRqZRcUM+rDLew+noWvhzNLxvUgqokKwqpkakn4yiuvEBQUxOLFi88fCw0NNTGRiIhI1dp29AyvxsSy5cgZAOq5ODK2bwvG9Q3Fy83Z5HQil2fw4MHs3bu3zLG7776bli1b8vjjj/9hQfjqq6/y0ksvERMTQ9euXasiqoiIiJgop6CYUR9sYXdyJvU9nPns3p60bOJtdqw6x9SS8J///CfR0dHccsstrF27lsDAQB588EHGjRtnZiwREZFKd+BENq8ti2XVoXQAXJwcGNWzOeMHhNHQUzOipHbw8vKibdu2ZY7Vq1ePhg0bnj8+atQoAgMDmTlzJlD6JfIzzzzDkiVLCAkJ4eTJkwB4enri6akFy0VERGqb3MISRn+4hV3nC8IetG6qgtAMppaEhw8fZv78+UyePJknn3ySrVu3MnHiRFxcXBg9evQF12vnOhERqemOZOQxd3kcP+w+AYCjg4Vbuzbj4UERNK3vbnI6kaqXlJSEg8N/lsmeP38+RUVF/N///V+Z65599lmee+65Kk4nIiIilSm3sIQxH25hR1ImPu7OfDq2B22a+pgdq86yGIZhmPXmLi4udO3alY0bN54/NnHiRLZu3crvv/9+wfXPPffcRXeuy8rKwttbLbOIiFRfqVnneGtlPF9uO47VVvqr95r2AUweGkkLP82OkoqRnZ2Nj49PnR8b6e9BRESk+ssrLGHM4i1sPXoWbzcnPru3J+2aqSCsDOUdG5k6kzAgIIDWrVuXOdaqVSu++eabi14/ffp0Jk+efP5xdnY2QUFBlZpRRETkcpzJK+Ld1Ql8sukYRSU2AAZG+TE1OkrfkoqIiIhInZRbWMI9i7ey9ehZvNyc+PTeHioIqwFTS8I+ffoQGxtb5lhcXBzNmze/6PXauU5ERGqKnIJiFv12hEW/HSavyApA95AGTLsyim4hDUxOJyIiIiJijqxzxYxZvIWdSZl4uTnx97E9aN+svtmxBJNLwkcffZTevXvz8ssvc+utt7Jlyxbef/993n//fTNjiYiIXLKCYit///0Y765J4Gx+MQBtmnozLTqK/pF+WCwWkxOKiIiIiJgjM7+Iuz7Ywt6ULOp7OPP3ezSDsDoxtSTs1q0b3333HdOnT+f5558nNDSUN954g5EjR5oZS0RExG7FVhtfbz/OmyviOZldAEALv3pMGRrFVW2b4OCgclBqruLiYpydnc2OISIiIjXY6dxC7vxgCwdTs2lQz4VPx2oX4+rG1JIQ4JprruGaa64xO4aIiMglsdkMftybyuvL4ziSkQdAUx83HhkSyU2dA3FydPiLVxCpPr788ktuuOEGXFxcAJg3bx6zZ8/m+PHj+Pr6MnHiRJ555hmTU4qIiEhNk55TwJ2LNhOXlksjT1eWjOtBZGMvs2PJ/zC9JBQREamJDMNgdWw6s2PiOJiaDUCDei5MGBjOyB7BuDk7mpxQxH4jRowgNTUVf39/Fi9ezLRp03jsscfo0aMHO3fuZObMmTRt2pR7773X7KgiIiJSQ6RmnWPkos0cPpVHY29XlozrSZifp9mx5CJUEoqIiNhpy5EzzI45xNajZwHwcnViXL8W3HNFKJ6u+tUqNZdhGOd/fu+993j++eeZNm0aAMOHD6dBgwa8++67KglFRESkXJJO53PHok0cP3uOpj5uLBnXk5BG9cyOJX/gkj7JxMfHs3r1atLT07HZbGXO6RYUERGprfalZDE7Jpa1cacAcHVyYHTvEMb3D8O3novJ6UQqxr831zl8+DDDhg0rc27YsGE8/vjjZsQSERGRGiYhPZc7F23mZHYBzRt68Nm9PWjm62F2LPkTdpeECxcuZPz48TRq1IgmTZqU2aXRYrGoJBQRkVon8VQuc5fF8dPeVACcHCzc2i2IiYMiaOLjZnI6kYr166+/4uPjg5ubG/n5+WXOFRQUaIduERER+UsHTmRz1webOZ1XRIS/J5/d2wN/b42bqzu7S8IXX3yRl156Sd8ii4hIrZeSeY43V8Tx9fbj2AywWOD6Dk15ZEikbpOQWmv06NHnf161ahW9evU6/3jTpk2EhYWZEUtERERqiF3JmYz6YDPZBSW0DfTmk3t60EB33dQIdpeEZ8+e5ZZbbqmMLCIiItVCRm4h76xO4LNNSRRZS5fVGNLKnynDomgV4G1yOpHK87/LyPyvxo0bM3PmzCpKIyIiIjXN5sOnueejreQVWenS3JfFd3fD283Z7FhSTnaXhLfccgvLli3jgQceqIw8IiIipskuKGbhusN8sP4I+UVWAHq2aMC06JZ0ae5rcjoR811zzTVmRxAREZFqam3cKe7/+zYKim30DmvIwlFdqadN/WoUu/+/FR4eztNPP82mTZto164dzs5lG+GJEydWWDgREZGqcK7Iyie/H2X+2kQy84sBaN/Mh2nRUVwR3khrsImIiIiI/Ilf953k4c93UGw1GNzSn3dGdsbN2dHsWGIni2EYhj1PCA0N/eMXs1g4fPjwZYcqr+zsbHx8fMjKysLbW7d/iYiIfYqtNr7YmsxbK+NJzykEIMyvHlOHRXFl2yYqB6XGqeyxUatWrYiLi8NqtVb4a1ckjRFFRESqzvc7U5jy1W6sNoOr2wfwxm0dcXZ0MDuW/Jfyjo3snkl45MiRywomIiJiNqvN4IfdJ5i7PI6kM6W7twbWd+fRoZHc2CkQRweVgyIXM3PmTLKyssyOISIiItXEks1J/O37vRgG/F+XZrxyc3uNpWuwy7o5/N+TEDXTQkREagLDMFhxMJ3XYmKJTcsBoJGnCw8NDGdEj2BcnXRLhMifueGGG8yOICIiItXEB+uP8MKPBwAY1as5z13bBgcVhDXaJZWEn3zyCbNnzyY+Ph6AyMhIpk2bxl133VWh4URERCrKxsQMZsfEsjMpEwAvNyce6B/G3X1C8HDRgsoi/ysrK4uTJ08C0KRJE3x8fExOJCIiItWBYRjMW5XAnOVxANzfvwVPXNlSE8hqAbs/Fc2dO5enn36ahx56iD59+gCwfv16HnjgATIyMnj00UcrPKSIiMil2p2cyWvLYvktPgMAN2cH7u4TygP9wvDxcP6LZ4vUPYsWLWLu3LnExsaWOR4VFcWUKVMYO3asSclERETEbIZh8Mqvsby3NhGAyUMjeXhQuArCWsLukvDtt99m/vz5jBo16vyx6667jjZt2vDcc8+pJBQRkWohPi2H15bFErM/DQBnRwsjugfz0MBw/L3dTE4nUj3Nnj2b5557jokTJxIdHU3jxo0BSEtLY9myZUyaNImzZ88ydepUk5OKiIhIVbPZDJ77YT+f/H4MgKeubsW9fVuYnEoqkt0lYWpqKr17977geO/evUlNTa2QUCIiIpcq+Uw+r6+I4/udKdgMsFjgxk6BPDokkqAGHmbHE6nW5s2bx+LFi7n11lvLHG/VqhUDBgygQ4cOTJs2TSWhiIhIHWO1GTz+zR6+3n4ciwVeuqEdd/QINjuWVDC7S8Lw8HC+/PJLnnzyyTLHv/jiCyIiIiosmIiIiD3Scwp4Z1UCS7YkUWwt3Vgruk1jpgyLIrKxl8npRGqG9PR02rVr94fn27VrR0ZGRhUmEhEREbMVldh49Mtd/LQnFUcHC6/d0p4bOzUzO5ZUArtLwhkzZnDbbbexbt2682sSbtiwgZUrV/Lll19WeEAREZE/k5VfzIJ1iSzecJRzxVYA+oQ3ZFp0SzoG1Tc3nEgN061bN2bNmsUHH3yAk1PZYaLVauWVV16hW7duJqUTERGRqlZQbGXCZztYeSgdZ0cLb4/ozJVtm5gdSyqJ3SXhzTffzObNm3n99df5/vvvgdJbULZs2UKnTp0qOp+IiMhF5ReVsHjDURasTSS7oASAjkH1eSw6it7hjUxOJ1IzzZs3j+joaJo0aUK/fv3KrEm4bt06XFxcWLZsmckpRUREpCrkFZYw7pNtbEw8jauTAwvu6sKAKH+zY0klshiGYZgd4lJlZ2fj4+NDVlYW3t7eZscREZEqUFRi4/MtSby9KoGM3EIAIht7MnVYFENbN9bOalKnVcTYKCcnh08//ZRNmzZx8uRJAJo0aUKvXr244447asSYS2NEERGRy5N1rpi7F29hR1Im9Vwc+WBMN3q2aGh2LLlE5R0blWsmYXZ29vkXyc7O/tNrNRATEZHKYLUZfLczhTdWxHH87DkAghq4M3loJNd1CMTRQeWgSEXw8vJi/PjxjB8/3uwoIiIiYoLTuYWM+nAL+09k4+3mxMf3dKdTsK/ZsaQKlKsk9PX1JTU1FX9/f+rXr3/RWRqGYWCxWLBarRUeUkRE6i7DMIjZn8acZbHEp+cC4O/lysODI7itaxAuTg4mJxQRERERqR3Ssgu4c9Fm4tNzaVjPhb+P7UHrppoMVleUqyRctWoVDRo0AGD16tWVGkhEROTf1sdnMDvmELuPZwHg4+7M+AFhjO4VgruLo8npRGq3du3a8fPPPxMUFFTmZxEREamdjmTkceeizaRknqOJtxuf3tuDcH9Ps2NJFSpXSdi/f//zP4eGhhIUFHTBbELDMEhOTq7YdCIiUiftSDrLazGxbEw8DYCHiyP39AllXL8W+Lg7m5xOpG44evQoxcXFF/wsIiIitc++lCxGf7iF03lFhDT04O9jexDUwMPsWFLF7N7dODQ09Pytx//tzJkzhIaG6nZjERG5ZLEnc3htWSzLD6QB4OLowB09gpkwMBw/L1eT04mIiIiI1D4bEzO475Pt5BaW0KapNx/d3V1j7zrK7pLw32sP/q/c3Fzc3NwqJJSIiNQtSafzeX1FHN/vSsEwwMECN3duxqQhETTz1TeYIiIiIiKV4dd9qUz8fBdFVhs9WzRg4aiueLnpzp26qtwl4eTJkwGwWCw8/fTTeHj850Ob1Wpl8+bNdOzYscIDiohI7ZWWXcDbq+JZuiWZEpsBwFVtmzBlWCTh/l4mpxMRERERqb0+35LE377bi82A6DaNefP2Trg5a93vuqzcJeHOnTuB0pmEe/fuxcXF5fw5FxcXOnTowNSpUys+oYiI1DqZ+UXMX5vIxxuPUlBsA6BfpB/ThkXRrpmPyelERERERGovwzB4c2U8b6yIB+D2bkG8dGM7HB0uvGtU6pZyl4T/3tX47rvv5s0338TbW1tgi4iIffIKS/hw/RHeX3eYnMISADoH1+exK1vSs0VDk9OJiIiIiNRuJVYbT/9jP59vSQLgoYHhTBkWedFl5aTusXtNwsWLF1dGDhERqcUKS6x8timJd1YncDqvCICWTbyYFh3FoJb+GpSIiIiIiFSyc0VWHv58JysOpmGxwPPXteGuXiFmx5JqxO6SEGDbtm18+eWXJCUlUVRUVObct99+WyHBRESk5iux2vh2RwpvrownJfMcAM0bejB5aCTXtm+Kg25pEKm2+vbti7u7+wU/i4iISM2TmV/E2I+3sf3YWVycHHjr9o5c2TbA7FhSzdhdEi5dupRRo0YRHR3NsmXLGDZsGHFxcaSlpXHjjTdWRkYREalhbDaDX/adZM7yWA6fygOgibcbEwdHcEvXZjg7OpicUET+ys8//3zRn0VERKRmSck8x+gPt5CQnou3mxOLRneje2gDs2NJNWT3p7SXX36Z119/nR9++AEXFxfefPNNDh06xK233kpwcHBlZBQRkRrCMAzWxKZz3TvrmbBkB4dP5eHr4czfhrdizbQB3NEjWAWhSA3wySefUFhYeMHxoqIiPvnkExMSiYiIyKU4dDKbm97dQEJ6Lk283fjqgd4qCOUPWQzDMOx5Qr169di/fz8hISE0bNiQNWvW0K5dOw4ePMigQYNITU2trKwXyM7OxsfHh6ysLG2kIiJism1Hz/BqTCxbjpwBoJ6LI/f2bcG9fUPxcnM2OZ1I3VBRYyNHR0dSU1Px9/cvc/z06dP4+/tjtVovN2ql0hhRREQEfk88zX2fbCOnsIQIf08+vqc7Tetr+ZC6qLxjI7tvN/b19SUnJweAwMBA9u3bR7t27cjMzCQ/P//SE4uISI104EQ2ry2LZdWhdABcnBwY1bM54weE0dDT1eR0InIpDMO46IZCx48fx8fHx4REIiIiYo+f9qTy6Be7KLLa6Bbiy6JR3fDx0Bf38ufsLgn79evH8uXLadeuHbfccguTJk1i1apVLF++nMGDB1dGRhERqYaOZOQxd3kcP+w+AYCjg4Vbuzbj4UER+oZSpIbq1KkTFosFi8XC4MGDcXL6z1DRarVy5MgRrrzyShMTioiIyF/5aMMRZvx4AMOA6DaNefP2Trg5O5odS2oAu0vCefPmUVBQAMDf/vY3nJ2d2bhxIzfffDNPPfVUhQcUEZHqJTXrHG+tjOfLbcex2kpXrLi2Q1MeHRJBCz9Pk9OJyOW44YYbANi1axfR0dF4ev7nf9MuLi6EhIRw8803m5RORERE/oxhGLwaE8v8NYkA3NkzmBnXtcXR4cK7A0Quxq6SsKSkhB9//JHo6GgAHBwceOKJJy75zZ977jlmzJhR5lhUVBSHDh265NcUEZHKcSaviHdXJ/DJpmMUldgAGBjlx9ToKNo01e2HIrXBs88+C0BISAi33XYbbm5uJicSERGR8ii22nj8mz18uyMFgMlDI3l4UPhFlw8R+SN2lYROTk488MADHDx4sMICtGnThhUrVpR5DxERqT5yCor5YP0RFv12hNzCEgC6hzRg2pVRdAvRzmgitdHo0aPNjiAiIiLllFdYwvjPdrAu7hSODhZevrEtt3ULNjuW1EB2N3Ldu3dn165dNG/evGICODnRpEmTCnktERGpOAXFVj7ddIx3VidwNr8YgDZNvZkWHUX/SD99KykiIiIiYrKM3ELu+Wgre45n4ebswLsjOzOoZWOzY0kNZXdJ+OCDDzJ58mSSk5Pp0qUL9erVK3O+ffv2dr1efHw8TZs2xc3NjV69ejFz5kyCgy/eeBcWFlJYWHj+cXZ2tr3xRUTkL5RYbXy1/ThvrojnZHbpGrQtGtVj8rBIhrcNwEFrmoiIiIiImO7Y6TxGf7iFo6fz8fVw5oMx3egc7Gt2LKnBLIZhGPY8wcHB4cIXsVgwDAOLxYLVai33a/3yyy/k5uYSFRVFamoqM2bMICUlhX379uHl5XXB9RdbwxAgKysLb29ve/4YIiLyP2w2g5/2pjJ3eRxHMvIAaOrjxqQhEdzcuRlOjhf++y8i1Ut2djY+Pj51fmykvwcREant9h7P4u6PtpCRW0QzX3c+vqc7YdpEUP5AecdGdpeEx44d+9Pzl3MbcmZmJs2bN2fu3LmMHTv2gvMXm0kYFBSkAaCIyGUwDIM1saeYHRPLgdTSGdoN6rkwYWA4I3sE4+bsaHJCESmviirHnn/+eaZOnYqHh0eZ4+fOnWP27Nk888wzlxu1UqkkFBGR2uy3+FM88Pft5BVZaRXgzcd3d8PfW5uNyR8r79jI7tuNjx07Ru/evS/YYKSkpISNGzdeVklYv359IiMjSUhIuOh5V1dXXF1dL/n1RUSkrC1HzjA75hBbj54FwNPViXF9WzC2byiertpISqSumjFjBg888MAFJWF+fj4zZsyo9iWhiIhIbfX9zhSmfrWbEptBn/CGvHdnF7zcnM2OJbWE3feODRw4kDNnzlxwPCsri4EDB15WmNzcXBITEwkICLis1xERkT+3LyWL0R9u4dYFv7P16FlcnRy4r18LfntsIJOGRKggFKnj/r2MzP/avXs3DRpc+q7ms2bNwmKx8Mgjj/zpdV999RUtW7bEzc2Ndu3a8fPPP1/ye4qIiNQGhmHw/rpEHvliFyU2g+s6NGXxmO4qCKVC2f0p8I8GjadPn75gE5O/MnXqVK699lqaN2/OiRMnePbZZ3F0dGTEiBH2xhIRkXJIPJXL3GVx/LQ3FQAnBwu3dgti4qAImvjoFgWRus7X1xeLxYLFYiEyMrLMmM9qtZKbm8sDDzxwSa+9detWFixY8Jeb3G3cuJERI0Ywc+ZMrrnmGpYsWcINN9zAjh07aNu27SW9t4iISE1msxm89PNBPlh/BIB7rwjlyeGttKGgVLhyl4Q33XQTULpJyZgxY8rc9mu1WtmzZw+9e/e2682PHz/OiBEjOH36NH5+flxxxRVs2rQJPz8/u15HRET+XErmOd5aEc/XO45jtRlYLHBdh6Y8OiSSkEb2fcEjIrXXG2+8gWEY3HPPPcyYMQMfH5/z51xcXAgJCaFXr152v25ubi4jR45k4cKFvPjii3967ZtvvsmVV17JtGnTAHjhhRdYvnw58+bN47333rP7vUVERGqyc0VWHv1iF7/uPwnA34a3Yly/Fianktqq3CXhvweJhmHg5eWFu7v7+XMuLi707NmTcePG2fXmS5cutet6ERGxT0ZuIe+uTuTTTccostoAGNLKnynDomgVoMX8RaSs0aNHAxAaGkrv3r1xdq6YW5gmTJjA1VdfzZAhQ/6yJPz999+ZPHlymWPR0dF8//33f/ici21uJyIiUtOl5xQw7uNt7D6ehYujA7Nvac/1HQPNjiW1WLlLwsWLFwMQEhLC1KlT7b61WEREqk52QTEL1x3mg/VHyC+yAtAjtAGPXRlFl+aXvp6YiNQN/fv3P/9zQUEBRUVFZc7bs2Pw0qVL2bFjB1u3bi3X9SdPnqRx48ZljjVu3JiTJ0/+4XNmzpzJjBkzyp1JRESkuos9mcM9H20lJfMcvh7OvD+qK91CNI6XymX3moTPPvtsZeQQEZEKcK7Iyie/H2X+2kQy84sBaN/Mh2nRUVwR3uiia8qKiPyv/Px8HnvsMb788ktOnz59wXmr1Vqu10lOTmbSpEksX74cN7fKW/d0+vTpZWYfZmdnExQUVGnvJyIiUpnWxZ1iwmc7yCksoUWjenw4ppuWCJIqYXdJmJaWxtSpU1m5ciXp6ekYhlHmfHkHjSIiUnGKrTa+2JrMWyvjSc8pveUu3N+TqcMiiW7TROWgiNhl2rRprF69mvnz53PXXXfxzjvvkJKSwoIFC5g1a1a5X2f79u2kp6fTuXPn88esVivr1q1j3rx5FBYW4ujoWOY5TZo0IS0trcyxtLQ0mjRp8ofv4+rqWma9bBERkZrqs83HeOYf+7HaDHqENmDBXV2o7+FidiypI+wuCceMGUNSUhJPP/00AQEB+uApImIiq83gh90nmLs8jqQz+QAE1nfnkSER3NS5GY7a8UxELsEPP/zAJ598woABA7j77rvp27cv4eHhNG/enM8++4yRI0eW63UGDx7M3r17yxy7++67admyJY8//vgFBSFAr169WLlyJY888sj5Y8uXL7+kDVNERERqihKrjZd+PsjiDUcBuKlzILNuao+Lk4O5waROsbskXL9+Pb/99hsdO3ashDgiIlIehmGw4mA6r8XEEpuWA0AjTxceGhjOiB7BuDpd+MFbRKS8zpw5Q4sWpTsnent7c+bMGQCuuOIKxo8fX+7X8fLyom3btmWO1atXj4YNG54/PmrUKAIDA5k5cyYAkyZNon///syZM4err76apUuXsm3bNt5///2K+KOJiIhUOzkFxTz8+U7WxJ4CYFp0FA8OCNOkLKlydpeEQUFBF9xiLCIiVWdjYgazY2LZmZQJgJebEw/0D+PuPiF4uNj9z7qIyAVatGjBkSNHCA4OpmXLlnz55Zd0796dH374gfr161foeyUlJeHg8J9ZEr1792bJkiU89dRTPPnkk0RERPD9999fUDaKiIjUBsln8hn78Vbi0nJxc3Zg7q0dGd4uwOxYUkdZDDsbv2XLljFnzhwWLFhASEhIJcUqn+zsbHx8fMjKyrJrlz0RkZpod3Imry2L5bf4DADcnB24u08oD/QLw8fD2eR0IlIdVNTY6PXXX8fR0ZGJEyeyYsUKrr32WgzDoLi4mLlz5zJp0qQKTF3xNEYUEZGaYNvRM9z/9+2cziuisbcrC0d1pX2z+mbHklqovGMju0tCX19f8vPzKSkpwcPDA2fnsh9M/307SlXQAFBE6oL4tBzmLIvj1/0nAXB2tDCiezAPDQzH37vydgsVkZqnssZGx44dY/v27YSHh9O+ffsKe93KojGiiIhUd9/uOM4T3+ylyGqjbaA3i0Z1o4mPxvZSOco7NrL7vrQ33njjcnKJiEg5JZ/J540V8Xy38zg2AywWuLFTII8OiSSogYfZ8USkDmnevDnNmzc3O4aIiEiNZ7MZzFkeyzurEwGIbtOY12/rqGWDpFqw+7+Fo0eProwcIiLyL+k5BbyzKoElW5IotpZO9o5u05gpw6KIbOxlcjoREREREbkU+UUlTPlyN7/sK71D6MEBYUwdFoWDgzYokerhkqrqxMREFi9eTGJiIm+++Sb+/v788ssvBAcH06ZNm4rOKCJSJ2TlF7NgXSKLNxzlXLEVgCvCGzE1OoqOQfXNDSciIiIiIpfsZFYB4z7Zxt6ULJwdLcy6qT03d2lmdiyRMhz++pKy1q5dS7t27di8eTPffvstubm5AOzevZtnn322wgOKiNR2+UUlvLM6gb6vruLdNYmcK7bSIag+S+7twaf39lBBKCIiIiJSg+09nsX176xnb0oWDeq5sGRcTxWEUi3ZPZPwiSee4MUXX2Ty5Ml4ef3ntrdBgwYxb968Cg0nIlKbFZXYWLo1ibdWJpCRWwhAZGNPpgyLYljrxlgsuu1ARERERKQm+3VfKo98sYuCYhsR/p58MLobwQ21vrhUT3aXhHv37mXJkiUXHPf39ycjI6NCQomI1GZWm8H3O1N4fUUcx8+eAyCogTuPDonk+o6BOGpNEhGpBmw2GwkJCaSnp2Oz2cqc69evn0mpREREagbDMHh3TSKzY2IB6Bfpx7w7OuHt5mxyMpE/ZndJWL9+fVJTUwkNDS1zfOfOnQQGBlZYMBGR2sYwDGL2pzFnWSzx6aVLNfh5uTJxUDi3dQvGxcnuFSBERCrFpk2buOOOOzh27BiGYZQ5Z7FYsFqtJiUTERGp/gpLrEz/Zi/f7kwBYEzvEJ66uhVOjhrvS/Vmd0l4++238/jjj/PVV19hsViw2Wxs2LCBqVOnMmrUqMrIKCJS462Pz2B2zCF2H88CwMfdmQf6hzG6d3M8XC5pDykRkUrzwAMP0LVrV3766ScCAgK0/IGIiEg5nc4t5P6/b2fbsbM4Olh47trW3NUrxOxYIuVi9yfTl19+mQkTJhAUFITVaqV169ZYrVbuuOMOnnrqqcrIKCJSY+1IOstrMbFsTDwNgLuzI2OvCGVcvxb4uOtWAxGpnuLj4/n6668JDw83O4qIiEiNEZeWwz0fbeX42XN4uTnx7sjO9I3wMzuWSLnZXRK6uLiwcOFCnnnmGfbu3Utubi6dOnUiIiKiMvKJiNRIsSdzeG1ZLMsPpAHg4ujAHT2CmTAwHD8vV5PTiYj8uR49epCQkKCSUEREpJzWxKbz0JKd5BaW0LyhBx+M7ka4v6fZsUTscsn3uAUFBREUFFSRWUREaryk0/m8viKO73elYBjgYIGbOzdj0pAImvlqFzMRqRkefvhhpkyZwsmTJ2nXrh3OzmVnPrdv396kZCIiItWLYRh8vPEoz/94AJsB3UMb8N6dXWhQz8XsaCJ2s7skvPnmm+nevTuPP/54meOvvvoqW7du5auvvqqwcCIiNUVadgFvr4pn6ZZkSmyli/wPb9eEyUMjCff3MjmdiIh9br75ZgDuueee88csFguGYWjjEhERkX8pttqY8cN+Pt2UBMAtXZrx0o3ttCGh1Fh2l4Tr1q3jueeeu+D4VVddxZw5cyoik4hIjZGZX8T8tYl8vPEoBcU2APpGNOKx6Ja0a+ZjcjoRkUtz5MgRsyOIiIhUa2fzinj4852sT8jAYoEnrmzJff1aaLMvqdHsLglzc3Nxcblw2qyzszPZ2dkVEkpEpLrLKyzhw/VHeH/dYXIKSwDoHFyfx65sSc8WDU1OJyJyeZo3b252BBERkWrrwIls7v90G8lnzuHu7Mibt3dkWJsmZscSuWx2l4Tt2rXjiy++4JlnnilzfOnSpbRu3brCgomIVEeFJVY+25TEO6sTOJ1XBEDLJl5Mi45iUEt/fXMoIrVGYmIib7zxBgcPHgSgdevWTJo0ibCwMJOTiYiImOcfu1J4/Js9FBTbCG7gwYK7utAqwNvsWCIVwu6S8Omnn+amm24iMTGRQYMGAbBy5Uo+//xzrUcoIrVWidXGtztSeHNlPCmZ5wBo3tCDyUMjubZ9UxwcVA6KSO0RExPDddddR8eOHenTpw8AGzZsoE2bNvzwww8MHTrU5IQiIiJVq8Rq45VfD7Hwt9IlOfpF+vHW7R2p76ENSqT2sBiGYdj7pJ9++omXX36ZXbt24e7uTvv27Xn22Wfp379/ZWT8Q9nZ2fj4+JCVlYW3t5p7Eal4NpvBr/tPMmdZLImn8gBo7O3KpMGR3NK1Gc6OWpRYRKqPihobderUiejoaGbNmlXm+BNPPMGyZcvYsWPH5UatVBojiohIRTqdW8jEpTvZkHAagAcHhDFlWBSOmiggNUR5x0aXVBJWFxoAikhlMQyDdfEZzI45xL6U0vVWfT2ceXBAOHf1ao6bs6PJCUVELlRRYyM3Nzf27t1LREREmeNxcXG0b9+egoKCy41aqTRGFBGRirI7OZPxn27nRFYBHi6OvHZLB4a3CzA7lohdyjs2svt2438rKioiPT0dm81W5nhwcPClvqSISLWw7egZXo2JZcuRMwDUc3Hk3r4tGNs3FG83Z5PTiYhUPj8/P3bt2nVBSbhr1y78/f1NSiUiIlK1lm5J4pl/7KfIaiO0UT0W3NWFyMZeZscSqTR2l4Tx8fHcc889bNy4scxxwzCwWCxYrdYKCyciUpUOnMjmtWWxrDqUDoCLkwOjejZn/IAwGnq6mpxORKTqjBs3jvvuu4/Dhw/Tu3dvoHRNwldeeYXJkyebnE5ERKRyFRRbee6f+1m6NRmAoa0bM+fWDpowILWe3SXhmDFjcHJy4scffyQgIEA7eYpIjXckI4/Xl8fxz90nAHB0sHBr12Y8PCiCpvXdTU4nIlL1nn76aby8vJgzZw7Tp08HoGnTpjz33HNMnDjR5HQiIiKVJyXzHOM/3c6e41lYLDB1WBTj+4dpo0KpE+xek7BevXps376dli1bVlamctN6MyJyOU5mFfDmyni+3JaM1Vb6T+E17QOYPDSSFn6eJqcTEbFfZYyNcnJyAPDyqjm3V2mMKCIil2JDQgYPf76TM3lF1Pdw5q3bO9Ev0s/sWCKXrdLWJGzdujUZGRmXFU5ExExn8op4b20iH288SmFJ6bqqA6P8mDIsiraBPianExGpXmpSOSgiInIpDMPgvbWHmR1zCJsBbQO9mT+yC0ENPMyOJlKl7C4JX3nlFR577DFefvll2rVrh7Nz2Xvy9W2tiFRXuYUlfPDbERb+dpjcwhIAuoX4Mi26Jd1DG5icTkTEXJ07d2blypX4+vrSqVOnP11SZseOHVWYTEREpPLkFBQz9avdxOxPA+DWrs14/vq2uDk7mpxMpOrZXRIOGTIEgMGDB5c5ro1LRKS6Kii28ummY7y7JpEzeUUAtA7wZtqVUQyI9NPaqiIiwPXXX4+rq+v5n/Vvo4iI1HYJ6Tnc9/ftHD6Vh4ujA89d14YR3YP0O1DqLLtLwtWrV1dGDhGRClditfH19uO8uTKe1KwCAEIb1WPy0EiubhegxYdFRP7Ls88+e/7n5557zrwgIiIiVeDnvalM+2o3eUVWAnzcmH9nFzoG1Tc7loip7C4J+/fvXxk5REQqjM1m8OPeVF5fHseRjDwAAnzcmDQ4gv/r0gwnRweTE4qIVG8tWrRg69atNGzYsMzxzMxMOnfuzOHDh01KJiIicnlKrDZmx8SyYF3p77JeLRry9h2daOTpanIyEfPZXRJC6QDxgw8+4ODBgwC0adOGe+65Bx+fS1/wf9asWUyfPp1JkybxxhtvXPLriEjdZRgGa2JPMTsmlgOp2QA0qOfChIHhjOwRrHVFRETK6ejRoxddQqawsJDjx4+bkEhEROTyZeQW8vCSnfx++DQA9/drwbToKE0iEPkXu0vCbdu2ER0djbu7O927dwdg7ty5vPTSSyxbtozOnTvbHWLr1q0sWLCA9u3b2/1cERGALUfOMDvmEFuPngXAy9WJcf1acM8VoXi6XtL3ISIidc4///nP8z/HxMSU+QLYarWycuVKQkNDzYgmIiJyWXYmneXBz3aQmlVAPRdHZt/SgeHtAsyOJVKt2P3J+dFHH+W6665j4cKFODmVPr2kpIR7772XRx55hHXr1tn1erm5uYwcOZKFCxfy4osv2htHROq4fSlZzI6JZW3cKQBcnRwY3TuE8f3D8K3nYnI6EZGa5YYbbgDAYrEwevToMuecnZ0JCQlhzpw5JiQTERG5NIZhsGRLEjP+eYAiq40WfvV4/64uhPt7mR1NpNq5pJmE/10QAjg5OfHYY4/RtWtXuwNMmDCBq6++miFDhqgkFJFySzyVy9zlcfy0JxUAJwcLt3YLYuKgCJr4uJmcTkSkZrLZbACEhoaydetWGjVqZHIiERGRS1dQbOXp7/fx1fbSpTKi2zTmtVs64OXmbHIykerJ7pLQ29ubpKQkWrZsWeZ4cnIyXl72NfFLly5lx44dbN26tVzXFxYWUlhYeP5xdna2Xe8nIjVfSuY53loRz9c7jmO1GVgscF2Hpjw6JJKQRvXMjiciUiscOXLE7AgiIiKXJflMPuM/286+lGwcLDAtuiUP9G+BxWIxO5pItWV3SXjbbbcxduxYXnvtNXr37g3Ahg0bmDZtGiNGjCj36yQnJzNp0iSWL1+Om1v5Zv3MnDmTGTNm2BtZRGqBjNxC3l2dyKebjlFkLZ3pMqSVP1OGRdEqwNvkdCIitU9eXh5r164lKSmJoqKiMucmTpxoUioREZG/ti7uFBOX7iQzv5gG9Vx4e0Qn+oRrdrzIX7EYhmHY84SioiKmTZvGe++9R0lJCVC6Rs348eOZNWsWrq7l2zb8+++/58Ybb8TR8T+7jVqtViwWCw4ODhQWFpY5BxefSRgUFERWVhbe3ioJRGqj7IJiFq07zAfrj5BXVLrTZo/QBjx2ZRRdmjcwOZ2ISPWSnZ2Nj4/PZY+Ndu7cyfDhw8nPzycvL48GDRqQkZGBh4cH/v7+HD58uAJTV7yK+nsQEZGaxWozeHd1AnNXxGEY0L6ZD/Pv7EJgfXezo4mYqrxjI7tLwn/Lz88nMTERgLCwMDw8POx6fk5ODseOHStz7O6776Zly5Y8/vjjtG3b9i9fQwNAkdqroNjKxxuPMn9tIpn5xQC0C/RhWnQUfSMa6TYBEZGLqKix0YABA4iMjOS9997Dx8eH3bt34+zszJ133smkSZO46aabKjB1xdMYUUSk7knPLuCRL3axMfE0ACO6B/HstW1wc3b8i2eK1H7lHRvZfbtxVlYWVquVBg0a0K5du/PHz5w5g5OTU7kHYl5eXhcUgfXq1aNhw4blKghFpHYqttr4clsyb62MJy27dOZwmF89pgyL4qq2TVQOiohUgV27drFgwQIcHBxwdHSksLCQFi1a8OqrrzJ69OhqXxKKiEjdsjbuFFO+3EVGbhEeLo48f31b/q9LM7NjidQ4dpeEt99+O9deey0PPvhgmeNffvkl//znP/n5558rLJyI1B02m8EPe04wd3kcx07nAxBY351JQyK4qVMgTo4OJicUEak7nJ2dcXAo/XfX39+fpKQkWrVqhY+PD8nJySanExERKVVstTF3eRzz15Te5diyiRfz7uhMuL+nyclEaia7S8LNmzczd+7cC44PGDCAv/3tb5cVZs2aNZf1fBGpeQzDYOXBdF5bFsuhkzkANPJ0YcLAcO7oEYyrk24PEBGpap06dWLr1q1ERETQv39/nnnmGTIyMvj73/+uOz5ERKRaSD6Tz6SlO9mRlAnAnT2Deerq1rq9WOQy2F0SFhYWnt+w5L8VFxdz7ty5CgklInXD74mnmR1z6Pwvdi83J+7v14K7+4RSz9Xuf55ERKSCvPzyy+TklH5x89JLLzFq1CjGjx9PREQEH374ocnpRESkrvtpTypPfLuHnIISvNycePXm9lzVLsDsWCI1nt2fwrt3787777/P22+/Xeb4e++9R5cuXSosmIjUXnuOZzI7Jpbf4jMAcHN2YEzvUB7o34L6Hi4mpxMRqdsMw8Df3//8jEF/f39+/fVXk1OJiIjAuSIrz/+4n8+3lC590Sm4Pm/d3omgBvZtpCoiF2d3Sfjiiy8yZMgQdu/ezeDBgwFYuXIlW7duZdmyZRUeUERqj4T0HOYsi+OXfScBcHKwcHv3ICYOisDf283kdCIiAqUlYXh4OPv37yciIsLsOCIiIgAcTM3m4c93kpCei8UCDw4I45EhkThr7XKRCmN3SdinTx9+//13Zs+ezZdffom7uzvt27fngw8+0EBSRC7q+Nl83lgRz7c7jmMzwGKBGzsG8siQSIIb6ls/EZHqxMHBgYiICE6fPq2xnYiImM4wDP6+6Rgv/nSQohIb/l6uvH5bR/qENzI7mkitc0mLfnXs2JHPPvusorOISC1zKqeQd1Yn8NnmYxRbDQCGtW7MlGFRRDXxMjmdiIj8kVmzZjFt2jTmz5+vjUpERMQ0Z/OKeOybPSw/kAbAwCg/XrulAw09XU1OJlI7aWcAEalwWeeKeX9dIh+uP8q5YisAvcMaMi06ik7BvianExGRvzJq1Cjy8/Pp0KEDLi4uuLu7lzl/5swZk5KJiEhdsfnwaR75YhepWQU4O1p44qpW3NMnBIvFYnY0kVpLJaGIVJhzRVY+2niU99YmknWuGIAOQfV5LDpKtwOIiNQgr7/+uj6EiYiIKUqsNt5alcC8VfHYDAhtVI+3R3SibaCP2dFEaj2VhCJy2YpKbHyxNYm3ViVwKqcQgAh/T6YMiyK6TWN90BQRqWHGjBljdgQREamDUjLP8cjSnWw9ehaAmzs34/nr21DPVdWFSFXQ/9JE5JJZbQb/2JXC6yviSD5zDoBmvu48OiSSGzoF4uigclBEpCZydHQkNTUVf3//MsdPnz6Nv78/VqvVpGQiIlJb/brvJI9/s4esc8XUc3HkpRvbcUOnQLNjidQpl7xXeEJCAjExMZw7V1oMGIZRYaFEpHozDINl+09y1ZvrmPzlbpLPnKORpyvPX9+GVVMGcHOXZioIRURqsD8a1xUWFuLi4mLXa82fP5/27dvj7e2Nt7c3vXr14pdffvnT57zxxhtERUXh7u5OUFAQjz76KAUFBXa9r4iI1AwFxVae+n4vD3y6naxzxbRv5sPPk/qqIBQxgd0zCU+fPs1tt93GqlWrsFgsxMfH06JFC8aOHYuvry9z5sypjJwiUk1sTMjg1ZhYdiVnAuDt5sQDA8IY0zsEDxdNThYRqcneeustACwWC4sWLcLT0/P8OavVyrp162jZsqVdr9msWTNmzZpFREQEhmHw8ccfc/3117Nz507atGlzwfVLlizhiSee4MMPP6R3797ExcUxZswYLBYLc+fOvbw/oIiIVCtxaTk8vGQnsWk5ANzfrwVThkXh4nTJ85lE5DLY/Yn+0UcfxcnJiaSkJFq1anX++G233cbkyZNVEorUUruSM5kdc4gNCacBcHd25J4rQrivbxg+Hs4mpxMRkYrw+uuvA6UzCd977z0cHR3Pn3NxcSEkJIT33nvPrte89tpryzx+6aWXmD9/Pps2bbpoSbhx40b69OnDHXfcAUBISAgjRoxg8+bN9v5xRESkmjIMg8+3JPP8j/spKLbRyNOFubd2pF+kn9nRROo0u0vCZcuWERMTQ7Nmzcocj4iI4NixYxUWTESqh7i0HF6LiWXZgTQAnB0tjOzRnAcHhuHv5WZyOhERqUhHjhwBYODAgXz77bf4+vpW6OtbrVa++uor8vLy6NWr10Wv6d27N59++ilbtmyhe/fuHD58mJ9//pm77rqrQrOIiIg5svKLmf7dHn7eexKAvhGNmHtrR/y8XE1OJiJ2l4R5eXl4eHhccPzMmTO4uup/1CK1RfKZfF5fHsd3u1IwDHCwwI2dmvHIkAiCGlz4b4CIiNQeq1evrtDX27t3L7169aKgoABPT0++++47WrdufdFr77jjDjIyMrjiiiswDIOSkhIeeOABnnzyyT98/cLCQgoLC88/zs7OrtD8IiJSMbYfO8PEz3eRknkOJwcLj10Zxb1XtMBB65mLVAt2l4R9+/blk08+4YUXXgBK16yx2Wy8+uqrDBw4sMIDikjVSs8pYN6qBD7fkkSxtXTh+ivbNGHKsEgiGnuZnE5ERKqC1Wrlo48+YuXKlaSnp2Oz2cqcX7VqlV2vFxUVxa5du8jKyuLrr79m9OjRrF279qJF4Zo1a3j55Zd599136dGjBwkJCUyaNIkXXniBp59++qKvP3PmTGbMmGFXJhERqTpWm8H8NQm8viIeq82geUMP3rq9Ex2C6psdTUT+i8Wwc1viffv2MXjwYDp37syqVau47rrr2L9/P2fOnGHDhg2EhYVVVtYLZGdn4+PjQ1ZWFt7e3lX2viK1UVZ+Me+tS2TxhiMUFJd+GOwb0Yipw6L0y1tEpIaoqLHRQw89xEcffcTVV19NQEAAFkvZGR7/XrvwUg0ZMoSwsDAWLFhwwbm+ffvSs2dPZs+eff7Yp59+yn333Udubi4ODhcuZn+xmYRBQUEaI4qIVANHM/KY+tVuth07C8ANHZvywg1t8XLTuuYiVaW8Y0S7ZxK2bduWuLg45s2bh5eXF7m5udx0001MmDCBgICAywotIlUvv6iExRuOsmBtItkFJQB0DKrPY1dG0TuskcnpRETEDEuXLuXLL79k+PDhlfL6NputTKn33/Lz8y8oAv+9gcoffbft6uqqZW9ERKoZm83gs83HePnnQ5wrtlLPxZHnr2/LzV2a/fWTRcQUdpeEAD4+Pvztb3+r6CwiUoWKSmx8viWJt1clkJFb+kEtqrEXU6OjGNLK/4JZIyIiUne4uLgQHh5eIa81ffp0rrrqKoKDg8nJyWHJkiWsWbOGmJgYAEaNGkVgYCAzZ84ESndDnjt3Lp06dTp/u/HTTz/NtddeW2a3ZRERqb5SMs/x+Nd7WJ+QAUCvFg159f/aa21zkWrO7pJw8eLFeHp6csstt5Q5/tVXX5Gfn8/o0aMrLJyIVDyrzeD7nSm8viKO42fPARDUwJ3JQyO5rkMgjlo0WESkzpsyZQpvvvkm8+bNu+wvjdLT0xk1ahSpqan4+PjQvn17YmJiGDp0KABJSUllZg4+9dRTWCwWnnrqKVJSUvDz8+Paa6/lpZdeuqwcIiJS+QzD4Kvtx3nhhwPkFJbg5uzAE1e2ZFSvEG1OIlID2L0mYWRkJAsWLLhgk5K1a9dy3333ERsbW6EB/4zWJBQpP8MwiNmfxpxlscSn5wLg5+XKxEHh3NYtGBenC9d4EhGRmqWixkY33ngjq1evpkGDBrRp0wZn57LrRn377beXG7VSaYwoIlL10rILmP7tXlYdSgegU3B95tzSgRZ+niYnE5FKW5MwKSmJ0NDQC443b96cpKQke19ORKrA+vgMZsccYvfxLAB83J15oH8YY3qH4O6iW7dERKSs+vXrc+ONN5odQ0REagDDMPh+VwrP/mM/2QUluDg68MjQCO7vF6a7lERqGLtLQn9/f/bs2UNISEiZ47t376Zhw4YVlUtEKsCOpLO8FhPLxsTTAHi4ODL2ilDu7dsCH3ftJiYiIhe3ePFisyOIiEgNcCqnkL99t5dlB9IAaBfow5xbOxDZ2MvkZCJyKewuCUeMGMHEiRPx8vKiX79+QOmtxpMmTeL222+v8IAiYr/Ykzm8tiyW5f/6Ze3i6MAdPYKZMDAcPy/t/igiIn+tpKSENWvWkJiYyB133IGXlxcnTpzA29sbT0/dOiYiUtf9uOcET3+/j7P5xTg7Wpg0OIIH+ofh5KhljERqKrtLwhdeeIGjR48yePBgnJxKn26z2Rg1ahQvv/xyhQcUkfJLOp3P6yvi+H5XCoYBDha4uXMzJg2JoJmvdhITEZHyOXbsGFdeeSVJSUkUFhYydOhQvLy8eOWVVygsLOS9994zO6KIiJjkdG4hz/xjPz/tTQWgdYA3c27tQKsArQErUtPZXRK6uLjwxRdf8MILL7B7927c3d1p164dzZs3r4x8IlIO6dkFvL0qgc+3JFFiK92L6Kq2TZgyLJJwf031FxER+0yaNImuXbtesJzMjTfeyLhx40xMJiIiZvp130me+n4vGblFODlYmDAwnIcGheOs2YMitYLdJeG/RUZGEhkZWZFZRMROWfnFzF+byEcbj1BQbAOgb0QjpkVH0b5ZfXPDiYhIjfXbb7+xceNGXFxcyhwPCQkhJSXFpFQiImKWs3lFPPfDfv6x6wQAUY29mHNrB9oG+picTEQq0iWVhMePH+ef//wnSUlJFBUVlTk3d+7cCgkmIn8sr7CEjzYe5b21ieQUlADQKbg+j0W3pFeYNhASEZHLY7PZsFqtFxw/fvw4Xl6aoS4iUpcsP5DGk9/t5VROIQ4WGD8gjImDI3B1cjQ7mohUMLtLwpUrV3LdddfRokULDh06RNu2bTl69CiGYdC5c+fKyCgi/1JYYuXzzUnMW51ARm5pQd+yiRdTh0UxuJU/FovF5IQiIlIbDBs2jDfeeIP3338fAIvFQm5uLs8++yzDhw83OZ2IiFSFrPxiZvy4n293lM4gD/f3ZM4tHegQVN/cYCJSaewuCadPn87UqVOZMWMGXl5efPPNN/j7+zNy5EiuvPLKysgoUudZbQbf7Uzh9eVxpGSeAyC4gQeTh0ZybYemODqoHBQRkYozZ84coqOjad26NQUFBdxxxx3Ex8fTqFEjPv/8c7PjiYhIJVsdm84T3+whLbt09uC4fi14dEgkbs6aPShSm9ldEh48ePD84NDJyYlz587h6enJ888/z/XXX8/48eMrPKRIXWUYBjH7T/LasjgS0nMB8PdyZeLgCG7rFqQFgkVEpFI0a9aM3bt388UXX7B7925yc3MZO3YsI0eOxN3d3ex4IiJSSbILinnpx4N8sS0ZgBaN6jH7lg50ae5rcjIRqQp2l4T16tU7vw5hQEAAiYmJtGnTBoCMjIyKTSdSh62Pz2B2zCF2H88CwMfdmfEDwhjdKwR3F32DJyIilcvJyYmRI0cycuRIs6OIiEgV+C3+FI9/vYcTWQVYLDC2TyhTo6M0e1CkDrG7JOzZsyfr16+nVatWDB8+nClTprB3716+/fZbevbsWRkZReqUXcmZvPrrITYmngbAw8WRsVeEMq5fC7zdnE1OJyIidcHMmTNp3Lgx99xzT5njH374IadOneLxxx83KZmIiFS03MISXv75IEs2JwHQvKEHs/+vA91DG5icTESqmt0l4dy5c8nNLb3tccaMGeTm5vLFF18QERGhnY1FLkPsyRzmLItl2YE0AFwcHRjZM5gHB4Tj5+VqcjoREalLFixYwJIlSy443qZNG26//XaVhCIitcTGxAwe+3oPx8+Wrns+uldzHr+qJR4udlcFIlILlOt/+W+99Rb33Xcfbm5uODk50a5dO6D01uP33nuvUgOK1HbJZ/J5fXkc3+1KwTDAwQI3d27GpCERNPP1MDueiIjUQSdPniQgIOCC435+fqSmppqQSEREKtLZvCJm/XLo/NqDzXzdefX/2tM7rJHJyUTETOUqCSdPnsztt9+Om5sboaGhpKam4u/vX9nZRGq19JwC5q1K4PMtSRRbDQCuatuEKcMiCff3MjmdiIjUZUFBQWzYsIHQ0NAyxzds2EDTpk1NSiUiIpfLMAy+3ZHCSz8f5Exe6V4DI3sEM314KzxdNXtQpK4r178CTZs25ZtvvmH48OEYhsHx48cpKCi46LXBwcEVGlCktsnKL+a9dYks3nCEgmIbAH0jGjEtOor2zeqbG05ERAQYN24cjzzyCMXFxQwaNAiAlStX8thjjzFlyhST04mIyKVISM/lqe/3sunwGQCiGnvx0o1t6RqitQdFpFS5SsKnnnqKhx9+mIceegiLxUK3bt0uuMYwDCwWC1artdxvPn/+fObPn8/Ro0eB0nVunnnmGa666qpyv4ZITZFfVMLiDUdZsDaR7IISADoG1eexK6M0rV9ERKqVadOmcfr0aR588EGKikpnmri5ufH4448zffp0k9OJiIg9CoqtvLsmkffWJFJkteHm7MCkwZHc2zcUZ0cHs+OJSDViMQzDKM+FOTk5HDt2jPbt27NixQoaNmx40es6dOhQ7jf/4YcfcHR0JCIiAsMw+Pjjj5k9ezY7d+6kTZs2f/n87OxsfHx8yMrKwtvbu9zvK1KVikpsLN2axFsrE8jILQRKv7WbGh3FkFb+WCwWkxOKiEhtUdFjo9zcXA4ePIi7uzsRERG4utaMjbQ0RhQRKbU27hTP/GMfx07nAzAwyo/nr29LUAOtfS5Sl5R3bFTukhDAarXy6aefMmzYsIsuZl0RGjRowOzZsxk7duxfXqsBoFRnVpvBP3al8PqKOJLPlO4WFtTAnclDI7muQyCODioHRUSkYmlsVEp/DyJS16VlF/DCjwf4cU/pZlONvV159to2XNW2iSYpiNRB5R0b2bUyqaOjI/fffz8HDx687ID/y2q18tVXX5GXl0evXr0uek1hYSGFhYXnH2dnZ1d4DpHLZRgGyw+kMWdZHLFpOQD4ebkycVA4t3ULxsVJU/pFRKR6y8vLY9asWaxcuZL09HRsNluZ84cPHzYpmYiI/BmrzeDTTcd4LSaWnMISHCwwpncok4dFamMSEflLdv8r0bZtWw4fPnzBbneXau/evfTq1YuCggI8PT357rvvaN269UWvnTlzJjNmzKiQ9xWpDBsTM5gdE8vOpEwAvN2ceGBAGGN6h+Dhol/KIiJSM9x7772sXbuWu+66i4CAAM06ERGpAfYcz+Rv3+1jb0oWAB2C6vPSDW1pG+hjcjIRqSnsut0Y4Ndff2X69Om88MILdOnShXr16pU5b+8tHUVFRSQlJZGVlcXXX3/NokWLWLt27UWLwovNJAwKCtKtJGK6PcczmR0Ty2/xGQC4Oztyd58Q7u8Xho+Hs8npRESkrqio22zr16/PTz/9RJ8+fSowXdXR7cYiUpdkFxQzJyaWTzYdwzDAy82Jx65syR3dg7XEkYgAlXS7McDw4cMBuO6668p8q3wpuxsDuLi4EB4eDkCXLl3YunUrb775JgsWLLjgWldX1xqzYLbUDQnpucxdHsvPe08C4OxoYUT3YB4aFI6/l5vJ6URERC6Nr68vDRo0MDuGiIj8CcMw+HFPKs//eIBTOaWTaW7o2JQnr26lzyIicknsLglXr15dGTnOs9lsZWYLilRHKZnneHNFHF9vP47NAIsFbuwYyKNDI7VTmIiI1HgvvPACzzzzDB9//DEeHvq9JiJS3RzNyOPpf+w7fydTi0b1eOGGtvQJb2RyMhGpyewuCfv3719hbz59+nSuuuoqgoODycnJYcmSJaxZs4aYmJgKew+RinQ6t5B3Vify6aZjFFlLF3Ef2roxU4dFEdXEy+R0IiIiFWPOnDkkJibSuHFjQkJCcHYuu3TGjh07TEomIlK3FZZYWbD2MPNWJ1BUYsPFyYGHBoZzf/8WuDo5mh1PRGo4u0vCdevW/en5fv36lfu10tPTGTVqFKmpqfj4+NC+fXtiYmIYOnSovbFEKlVOQTGLfjvCot8Ok1dUekt9zxYNeOzKlnQO9jU5nYiISMW64YYbzI4gIiL/Y2NCBk99v4/DGXkA9I1oxAvXtyWkUb2/eKaISPnYvXGJg4PDhS/yX2sT2rsm4eXQotRS2QqKrXy66RjvrE7gbH4xAO0CfZgWHUXfiEba7VFERKoVjY1K6e9BRGqTUzmFvPTTAb7fdQIAPy9XnrmmNde01+7zIlI+lbZxydmzZ8s8Li4uZufOnTz99NO89NJL9icVqYZKrDa+3n6cN1fGk5pVAJSu8zE1Ooqr2jbRL2MREakTtm/fzsGDBwFo06YNnTp1MjmRiEjdYbMZLNmSxCu/HiKnoASLBUb1bM6U6Ci83Zz/+gVEROxkd0no4+NzwbGhQ4fi4uLC5MmT2b59e4UEEzGDzWbwy76TzFkey+FTpdP4A3zceGRIBDd3boaT44UzaUVERGqb9PR0br/9dtasWUP9+vUByMzMZODAgSxduhQ/Pz9zA4qI1HL7T2Txt+/2sSs5E4C2gd68dEM7OgTVNzWXiNRudpeEf6Rx48bExsZW1MuJVCnDMPgtPoPZMbHsTckCwNfDmQkDw7mzZ3PcnLUIsIiI1B0PP/wwOTk57N+/n1atWgFw4MABRo8ezcSJE/n8889NTigiUjtl5Rfzxso4Pt54FJsBnq5OTB0WyV29QnB00N1MIlK57C4J9+zZU+axYRikpqYya9YsOnbsWFG5RKrMzqSzvPprLL8fPg1APRdHxvZtwbi+oXhpGr+IiNRBv/76KytWrDhfEAK0bt2ad955h2HDhpmYTESkdiq22vh00zHeXBlP5r/WQr+6fQDPXNOaxt5uJqcTkbrC7pKwY8eOWCwW/ne/k549e/Lhhx9WWDCRyhaflsNry2KJ2Z8GgIujA3f2bM6EgWE09HQ1OZ2IiIh5bDYbzs4XflHm7OyMzWYzIZGISO1kGAbLD6Qx65dD53ctjmzsyVNXt6ZfpJZ2EJGqZXdJeOTIkTKPHRwc8PPzw81N325IzXD8bD5vrIjn2x3HsRngYIGbOzdj0pAImvl6mB1PRETEdIMGDWLSpEl8/vnnNG3aFICUlBQeffRRBg8ebHI6EZHaYV9KFi/+dIBNh88A0MjThclDo7i1q9ZCFxFz2F0SNm/evDJyiFS6jNxC3lmdwGebkiiyls6CiG7TmGnRUYT7e5mcTkREpPqYN28e1113HSEhIQQFBQGQnJxM27Zt+fTTT01OJyJSs53MKmB2TCzf7jyOYYCLkwPj+obyQP8wLXckIqYqd0n4+++/c/r0aa655przxz755BOeffZZ8vLyuOGGG3j77bdxddVtmlK95BQUs+i3Iyz67TB5RVYAeoc15LErW9JRu4OJiIhcICgoiB07drBixQoOHToEQKtWrRgyZIjJyUREaq68whIWrDvM++sSKSgunbRwfcemTIuO0h1NIlItlLskfP755xkwYMD5knDv3r2MHTuWMWPG0KpVK2bPnk3Tpk157rnnKiuriF0Kiq18uukY76xO4Oy/Fv9tF+jD41e25IqIRianExERqd4sFgtDhw5l6NChZkcREanRrDaDb7Yf57VlsaTnFALQtbkvT13TWpMWRKRaKXdJuGvXLl544YXzj5cuXUqPHj1YuHAhUPqN87PPPquSUExXYrXx7c4U3lgex4msAgBaNKrH1OgormrbBIvFYnJCERGR6mnVqlU89NBDbNq0CW9v7zLnsrKy6N27N++99x59+/Y1KaGISM2yISGDF386yMHUbACCG3gw/aqWXKnPJSJSDZW7JDx79iyNGzc+/3jt2rVcddVV5x9369aN5OTkik0nYgfDMFh2II3ZMbEkpOcC0MTbjUeHRnBzZy3+KyIi8lfeeOMNxo0bd0FBCODj48P999/P3LlzVRKKiPyFhPRcZv58kJWH0gHwcnNi4qAIRvVujquTo8npREQurtwlYePGjTly5AhBQUEUFRWxY8cOZsyYcf58Tk4Ozs5aZFXM8XviaV759RC7kjMB8HF3ZsLAMEb1CsHNWb+ERUREymP37t288sorf3h+2LBhvPbaa1WYSESkZjmdW8ibK+P5bHMSVpuBk4OFO3s2Z9LgCHzruZgdT0TkT5W7JBw+fDhPPPEEr7zyCt9//z0eHh5lvkXes2cPYWFhlRJS5I/sS8ni1ZhY1sWdAsDd2ZGxV4Qyrl8LfNxVWouIiNgjLS3tT7/0dXJy4tSpU1WYSESkZigotvLxxqPMW5VATmEJAENbN2b6VS1p4edpcjoRkfIpd0n4wgsvcNNNN9G/f388PT35+OOPcXH5zzchH374IcOGDauUkCL/62hGHnOWx/HD7hMAODlYuKNHMA8NCsffy83kdCIiIjVTYGAg+/btIzw8/KLn9+zZQ0BAQBWnEhGpvgzD4Ke9qcz65RDHz54DoE1Tb/52dSt6h2mzRBGpWcpdEjZq1Ih169aRlZWFp6cnjo5lb+H86quv8PTUNyRSudJzCnhrZTxLtyRTYjMAuL5jUyYPjaR5w3ompxMREanZhg8fztNPP82VV16Jm1vZL93OnTvHs88+yzXXXGNSOhGR6mVH0lle/PEAO5IyAWjs7cq06Jbc1CkQBwdtSiIiNY/FMAzD7BCXKjs7Gx8fH7Kysi66wLbUHtkFxby/9jAfrD/CuWIrAAOi/JgWHUWbpj4mpxMREakeLndslJaWRufOnXF0dOShhx4iKioKgEOHDvHOO+9gtVrZsWNHmc3sqiONEUWkMiWfyWfWr4f4aU8qULrk0QP9wxjXLxQPl3LPwxERqTLlHRvpXzCp1gqKrXy66RjzVieQmV8MQMeg+jxxVUt6tmhocjoREZHapXHjxmzcuJHx48czffp0/v1dssViITo6mnfeeafaF4QiIpUl61wx765OYPGGoxRZbVgscEuXZkwZFkVjby15JCI1n0pCqZasNoNvdxzn9eVxnMgqACDMrx7TolsS3aYxFoum74uIiFSG5s2b8/PPP3P27FkSEhIwDIOIiAh8fX3NjiYiYoqCYitLNifx9qp4zv5r4kKf8Ib8bXhrWjfVbGURqT1UEkq1YhgGKw+m82rMIeLScgFo4u3G5KGR3NQ5ECdHB5MTioiI1A2+vr5069bN7BgiIqYpKLaydEsS765JJD2nEIBwf0+eHN6SgVH+mrggIrWOSkKpNrYdPcOsXw6x7dhZAHzcnXlwQBije4fg5uz4F88WERERERG5fIUlVr7cmsw7qxM5mV16V1NgfXcmDAzn1q7NNHFBRGotlYRiuvi0HF75NZYVB9MAcHN24O4+oTzQPwwfd2eT04mIiIiISF1QVGLjy23JvLs64fySRwE+bkwYGM4tXZvh6qSJCyJSu6kkFNOkZp3j9eVxfL39ODYDHB0s3No1iEeGRGjhXxERERERqRJFJTa+3n6cd1YnkJJ5DoDG3q5MGBjObd2CVA6KSJ2hedJS5bLyi5n5y0EGzF7Dl9tKC8Ir2zQh5pF+zLypnQpCERGRWmT+/Pm0b98eb29vvL296dWrF7/88sufPiczM5MJEyYQEBCAq6srkZGR/Pzzz1WUWETqimKrjS+2JjFozhqe/G4vKZnn8Pdy5blrW7N22kBG9QpRQSgidYpmEkqVKSi28snvR3lndSJZ50p3Bese0oAnhrekc7B2TBQREamNmjVrxqxZs4iIiMAwDD7++GOuv/56du7cSZs2bS64vqioiKFDh+Lv78/XX39NYGAgx44do379+lUfXkRqpRKrjW93pvD2qniSz5TOHPTzcmV8/zDu6BGs9dBFpM5SSSiVzmoz+G5nCnOXxZ5f2yOysSePX9mSQS21K5iIiEhtdu2115Z5/NJLLzF//nw2bdp00ZLwww8/5MyZM2zcuBFn59K1iUNCQqoiqojUciVWG9/vOsHbq+I5djofgEaeLjzQP4yRPZrj7qJyUETqNpWEUmkMw2Bt3Clm/XKIQydzgNKFfx8dGsnNnZvh6KByUEREpC6xWq189dVX5OXl0atXr4te889//pNevXoxYcIE/vGPf+Dn58cdd9zB448/jqPjxT/AFxYWUlhYeP5xdnZ2peQXkZrJajP4x64U3l6VwJGMPAAa1nPh/v4tuLNnczxc9LFYRARUEkol2Xs8i5m/HGRj4mkAvNycmDAwnDG9QzR9X0REpI7Zu3cvvXr1oqCgAE9PT7777jtat2590WsPHz7MqlWrGDlyJD///DMJCQk8+OCDFBcX8+yzz170OTNnzmTGjBmV+UcQkRrIajP4cc8J3lwZz+FTpeWgr4cz9/ULY1Sv5tRz1cdhEZH/ZjEMwzA7xKXKzs7Gx8eHrKwsvL29zY4jQPKZfF5bFss/dp0AwMXRgdG9mzNhYDj1PVxMTiciIlK7VdexUVFREUlJSWRlZfH111+zaNEi1q5de9GiMDIykoKCAo4cOXJ+5uDcuXOZPXs2qampF339i80kDAoKqnZ/DyJSNWw2g5/2pvLmyngS0nMBqO/hzLi+LRjdOwRPlYMiUseUd4yofx2lQmTmFzFvVQKf/H6MIqsNgBs7BTJ5aCRBDTxMTiciIiJmcnFxITw8HIAuXbqwdetW3nzzTRYsWHDBtQEBATg7O5e5tbhVq1acPHmSoqIiXFwu/NLR1dUVV1fXyvsDiEiNYLMZ/LLvJG+ujCMurbQc9HF3ZlzfUEb3DsHLzdnkhCIi1ZtKQrks/96xeN6qBLILSgC4IrwRT1zVkraBPianExERkerIZrOVmfn33/r06cOSJUuw2Ww4ODgAEBcXR0BAwEULQhGRi5WD3m5O3Nu3BWP6hOCtclBEpFxUEsolsdkM/rn7BLNjYknJPAdAyyZeTB/ein4RjbRjsYiIiAAwffp0rrrqKoKDg8nJyWHJkiWsWbOGmJgYAEaNGkVgYCAzZ84EYPz48cybN49Jkybx8MMPEx8fz8svv8zEiRPN/GOISDVktRn8si+Vt1bGny8HvdycGHtFKHf3CcXHXeWgiIg9VBKK3X5PPM3LPx9kb0oWAE283ZgyLJKbtGOxiIiI/I/09HRGjRpFamoqPj4+tG/fnpiYGIYOHQpAUlLS+RmDAEFBQcTExPDoo4/Svn17AgMDmTRpEo8//rhZfwQRqWbyi0r4ZvtxPlh/hKOn8wGVgyIiFUEbl0i5JaTnMOuXQ6w4mA6Ap6sT4weEMfaKUO1YLCIiUg1obFRKfw8itVN6dgEf/36UzzYnkZlfDJTeVnyPykERkT+ljUukwmTkFvLGijg+35KM1Wbg6GBhZI9gJg6OoJGnFgkXEREREZHKc+hkNot+O8I/d504v0licAMP7ukTwi1dg6in3YpFRCqE/jWVP1RQbOXDDUd4d3UiuYWlm5IMbd2YJ65qSZifp8npRERERESktjIMg9/iM1j422F+i884f7xLc1/G9Q1laOsmWupIRKSCmVoSzpw5k2+//ZZDhw7h7u5O7969eeWVV4iKijIzVp1nGAY/7EnllV8Ond+UpF2gD3+7uhU9WzQ0OZ2IiIiIiNRWhSVW/rnrBIt+O0JsWg4ADha4sm0Txl7Rgi7NfU1OKCJSe5laEq5du5YJEybQrVs3SkpKePLJJxk2bBgHDhygXr16Zkars7YfO8uLPx1gZ1ImAAE+bjx2ZRTXdwjEQd/UiYiIiIhIJTibV8Rnm4/x8e/HOJVTCICHiyO3dQvinj6hBDXwMDmhiEjtZ2pJ+Ouvv5Z5/NFHH+Hv78/27dvp16+fSanqpuNn83nl11h+2H0CKP2FPL5/GPf2bYG7izYlERERERGRinckI48P1h/m6+3HKSguXW+wibcbY/qEMKJ7sDYjERGpQtVqTcKsrCwAGjRocNHzhYWFFBYWnn+cnZ1dJblqs7zCEuavSWThb4cpLLFhscCtXYKYMiwSf283s+OJiIiIiEgtYxgGW4+eZeFvh1lxMA3DKD3eOsCbcf1CubpdU1ycHMwNKSJSB1WbktBms/HII4/Qp08f2rZte9FrZs6cyYwZM6o4We1ksxl8s+M4s2NiSf/XdP6eLRrw9DWtadPUx+R0IiIiIiJS25RYbfy87ySLfjvMnuNZ548PjPJjXN8W9ApriMWiJY5ERMxSbUrCCRMmsG/fPtavX/+H10yfPp3Jkyeff5ydnU1QUFBVxKtVth87y4wf9p//xdy8oQdPDm/FsNaN9UtZREREREQqVHZBMV9uTWbxhqPnN0Z0cXLg5s6BjL0ilHB/L5MTiogIVJOS8KGHHuLHH39k3bp1NGvW7A+vc3V1xdXVtQqT1S4nswp45ddDfLczBQBPVyceHhTOmD4huDpp3UEREREREak4SafzWbzxCF9tO05uYQkADeq5cFfP5tzVqzmNPPXZTkSkOjG1JDQMg4cffpjvvvuONWvWEBoaamacWqug2Mqi3w7zzupEzhVbz687ODU6Cj8v/WIWEREREZGKYRgG246d5YPfjrDswEls/1pvMNzfk3v6hHJT50DcnDVBQUSkOjK1JJwwYQJLlizhH//4B15eXpw8eRIAHx8f3N3dzYxWKxiGwYqD6bzw4wGSzuQD0LW5L89e24Z2zbTuoIiIiIiIVIwzeUV8u+M4X2xNJj499/zxfpF+jL0ilH4RjbS0kYhINWdqSTh//nwABgwYUOb44sWLGTNmTNUHqkUOn8plxg8HWBt3CoDG3q48ObwV13Voql/OIiIiIiJy2Ww2g42Jp1m6NYll+9MostoAcHN24MZOgdzTJ5SIxlpvUESkpjD9dmOpWHmFJby9KoEP1h+m2Grg7Gjh3r4teGhgOPVcq8USlCIiIiIiUoOlZRfw1bZkvtiWTPKZc+ePtwv04bZuQVzXsSnebs4mJhQRkUuh1qiWMAyDX/ed5PkfD5CaVQDAgCg/nrmmNS38PE1OJyIiIiIiNVmJ1caa2FMs3ZrEqkPp59ca9HJz4oaOgdzWLYi2gVrSSESkJlNJWAscycjj2X/uZ92/bi1u5uvOc9e2YXArf91aLCIiIiIilyzpdD5fbkvmq+3JpGUXnj/eLcSX27oFc3W7ANxdtBGJiEhtoJKwBisotvLumkTeW5NIkdWGi6MDD/RvwYMDw7VjmIiIiIiIXJLCEisx+9P4YmsSGxJOnz/esJ4LN3dpxq1dgwj3191KIiK1jUrCGmp9fAZ/+34vx06X7lrcN6IRM65ro1uLRURERETkksSl5bB0SzLf7jxOZn4xABYLXBHeiBHdgxnSqjEuTg4mpxQRkcqikrCGycgt5KWfDvLdzhSgdNfiZ65pw/B2TXRrsYiIiIiI2CW/qIQfd6eydGsSO5Iyzx8P8HHjlq5B3NKlGUENPMwLKCIiVUYlYQ1hGAZfbTvOy78cJDO/GIsFRvcKYcqwSLy0c5iIiIiIiJSTYRjsTM7kq23H+WH3CXILSwBwdLAwqKU/I7oH0T/SH0cHTUIQEalLVBLWAEcz8nji2z1sOnwGgFYB3sy8qR0dg+qbG0xERERERGqMUzmFfLfzOF9uO05Ceu75480benBbtyD+r0sz/L3cTEwoIiJmUklYjVltBos3HOG1ZbEUFNtwc3bg0SGR3HNFKM6OWgtERERERET+XE5BMSsPpvPjnhOsiT1Fic0AwM3ZgeFtA/i/rs3oGdoQB80aFBGp81QSVlPxaTlM+3oPu5IzAegd1pBZN7UnuKHWAxERERERkT+WV1jCykPp/LTnBKtjT1FUYjt/rmNQfW7tGsQ1HQLw1rJFIiLyX1QSVjPFVhvvrzvMmyviKbLa8HR14m9Xt+L2bkHamERERERERC4qv6iEVYfS+WlPKqsOpVP4X8Vgi0b1uKZ9ANd2aEpEYy8TU4qISHWmkrAaSTyVy+QvdrH7eBYAA6P8eOnGdjSt725yMhERERERqW7OFVlZE5vOj3tSWXkojYLi/xSDIQ09uLp9ANe0b0rLJl6acCAiIn9JJWE1YBgGn246xks/H6Sg2Ia3mxPPXdeGGzsF6pe5iIiIiIicV1BsZU3sKX7am8rKg2nkF1nPnwtuUFoMXt0ugDZNvfVZQkRE7KKS0GRp2QVM+3oP6+JOAXBFeCNm39KeAB/NHhQRERERkdJi8Lf4DH7ac4LlB9LI+69iMLC+O9e0D+Dq9gG0C/RRMSgiIpdMJaGJftmbyvTv9pKZX4yrkwPTr2rJqF4h2llMRERERKSOKyyxsj4+g5/2pLL8QBo5hSXnzzX1cSudMdi+KR2aqRgUEZGKoZLQBIUlVl766SCf/H4MgLaB3rx+a0ctIiwiIiIiUocVFJcWgz/v+1cxWPCfYrCJ97+LwQA6NquviQUiIlLhVBJWsaTT+Ty4ZDv7UrIBeKB/GJOHRuLi5GByMhERERERqWr5RSWsiT3FL/tOsupg2VuJ/b1cGd4ugGvaB9A52FfFoIiIVCqVhFXo132pTPt6DzkFJfh6ODP3to4MjPI3O5aIiIiIiFShY6fzWBt3inVxp1ifkFFmV+Im3m5c2bYJw9sF0LW5ikEREak6KgmrQLHVxss/H2TxhqMAdGnuy9sjOtG0vjYnERERERGp7fIKS9h0+PT5YvDo6fwy54MbeHBV2yZc2bYJHXQrsYiImEQlYSXLyi9m/Gfb2Zh4GoD7+7VganQUzo66vVhEREREpDYyDIPYtBzWxp5iXfwpth45S5H1P7MFnRwsdA3xpX+kP/0j/WgV4KXNR0RExHQqCSvR0Yw87vl4K4dP5VHPxZHXb+vIsDZNzI4lIiIiIiIVLDO/iPUJGayLO8XauFOkZReWOd/M151+kX4MiPSjV1hDvNycTUoqIiJycSoJK8mWI2e47+/byMwvpqmPGx+M6UarAG+zY4mIiIiISAWw2gz2HM9kXVwGa+PS2ZWcic34z3k3Zwd6tmhI/0g/+kf6EdqonmYLiohItaaSsBJ8s/04T3y7h2KrQYdmPiwc1RV/bzezY4mIiIiIyGVIzy5gXXwGa+NO8Vv8KTLzi8ucj/D3pH+kH/0i/ege2gA3Z0eTkoqIiNhPJWEFe2d1ArNjYgG4qm0T5t7aEXcXDQ5ERERERGqa/KISthw5w4aEDNYnnOZganaZ816uTvQJb0T/qNJiMFAbE4qISA2mkrACLVx3+HxBOH5AGNOGRWlnMhERERGRGiK/qITdyVlsPVpaDO5IOkux9T/3EFss0C7Q5/xswY5B9bUhoYiI1BoqCSvI3zcd46WfDwIwZWgkDw+OMDmRiIiIiIj8EcMwOH72HNuPnWVHUul/DqbmYP3vhQWBwPruXBHeiD4RjegT1pCGnq4mJRYREalcKgkrwNfbj/P09/uA0hmEDw0KNzmRiIiIiIj8t4JiK3tTsthx7Oy/isFMMnILL7guwMeNzs196R3WkCvCGxHcwEMbjoiISJ2gkvAy/bD7BI99vRuAMb1DeCw6SoMIERERERGTncg8x46k/xSCB05klbl1GMDZ0ULrpj50CfalS3NfOjevT4CP1hUUEZG6SSXhZVhxII1Hv9iFzYDbuwXxzDWtVRCKiIiIiFSxohIb+09ksf3YWXYmZbL92FlOZhdccJ2flyudg+uXFoLBvrQN9NEOxCIiIv+ikvASpecU8PDnOymxGVzfsSkv3dhOm5SIiIiIiFQywzBIOpPPnuNZ7Dmeyc6kTPakZFFUYitznaODhVYBXnQJ9qXzv0rBZr7u+lJfRETkD6gkvEQf/HaEc8VWOjTzYc4tHXBUQSgiIiIiUqEKiq0cPpVHfHoOcWk57Dmexd6ULDLziy+41tfDmc7/KgQ7BdenY1B9PFz0cUdERKS89FvzEmTmF/HppmMATBwcgZOjg8mJRERERERqrqISG0cy8ohNyyE+rbQQjE/L5ejpPP5ns2EAXBwdaNXUm/aBPnQIKr19OKShNhgRERG5HCoJL8HiDUfJK7LSsokXg1r6mx1HRERERKRGKLbaOJqRR1xabmkRmJ5DXFouRzPyKLlYGwh4uzkR2diLiMZetGnqTYdm9Ylq4oWLk76oFxERqUgqCe2UW1jCRxuPAjBhYLi+rRQRERER+R8lVhtHT+f/a1ZgLnHppTMEj2TkXbDD8L95uToR0djzfCEY+a+f/b1cNeYWERGpAioJ7fTZpmNknSumRaN6DG8XYHYcERERERFTWG0Gp3IKSTqTz5GMXA5n5HHkVB5HT+dxNCOfIqvtos+r5+JIeGMvIv3/XQiW/t8AHzeVgSIiIiZSSWiHgmIrC387AsADA8K0WYmIiIiI1Eo2m0FGbiGpWQWkZp371/8t4ERm6c8nswpIyy74w1uEAdydHYlo7EmE/39mBUY09iSwvnYYFhERqY5MLQnXrVvH7Nmz2b59O6mpqXz33XfccMMNZkb6U19uSybj/9u719io6nWP47922pkp0AvsUtpCkU3lIjcvENgFCWBqCBjE4wuIkFIiigq+EIKKglZAoCHESAhWRRQS0UYIECM9oCJVQNCI7UmPIATbim4pnu4InRZ6nf95AS0UKHRaO2sW6/tJmun8WavrmT4M/PLMmlmVNeoZF6X/uren1eUAAACEvJycHOXk5Ki0tFSSNHjwYL366quaNGnSLffNzc3VY489pqlTp2rXrl0dW6iDGGP0n6panTlXrT/OX1TZ+Uu3Z85dGQierahu8W3BV3OFhykp1qu+3buob3xn9flHJ/3z8vc946IUzovqAADYhqVDwqqqKt199916/PHH9eijj1pZyi3VNfj1ztfFkqSnxvVVJFc0BgAAuKVevXopOztb/fr1kzFGW7Zs0dSpU1VQUKDBgwe3uF9paakWLVqksWPHBrFae6pv8Kuypl6+6ktflTX1OnehVuWVtfpPZY3KK2tUXlWr//PVqOzyWYAtvRX4auFhUkK0V0lxXiXFepUYE6XkOK+SYqOa1rp38SiCXAwAwG3B0iHhpEmTWvUqcijYWfBv/fvcRcV38WjaiBSrywEAALCFKVOmNLu/cuVK5eTk6MiRIy0OCRsaGjRz5kwtW7ZMBw4c0Llz54JQafA1+I0qay4N9Sqr61VZU6eK6sbvL936quvkuzwAbFy/du1iXUPAxw4Lk7p38Sgp9srQLzk2Somx3qZBYEI0A0AAAJyEzyRshQa/UU7+L5KkJ8f+U95Il8UVAQAA2E9DQ4O2bdumqqoqpaWltbjd8uXLlZCQoDlz5ujAgQNBrDAwlTX1OnPuonxNA71Lg76rz+jzVdddd5afr7pOldX1qqoNfLh3M97IcHXxRCrGG6HoqEh17+LWPzp7FB/deOtRYsylMwB7xHjljmAACAAArrDVkLCmpkY1NTVN9ysqKoJy3P/+3zMqKa9SbFSkZv7rjqAcEwAA4HZRVFSktLQ0VVdXq0uXLtq5c6cGDRp0w20PHjyoTZs2qbCwsNU/36qM+PlPZVr4yf+0++dEusIU7Y1UtDdCXTwRV91GNvu+i8d1g7XL23sj+DgcAADQLrYaEq5evVrLli0L+nGr6/zq1tmtjH/doS4eW/3KAAAALDdgwAAVFhbq/Pnz2r59uzIzM/X1119fNyj0+XzKyMjQxo0bFR8f3+qfb1VGjI2KVFynxqHdpdtoz6WB3fVDvgh1vnwbc3m417gd71IBAAChIMwYc+vLlgVBWFjYLa9ufKNXiVNSUnT+/HnFxMR0aH0XautljNSZISEAAAhRFRUVio2NDUo2ao/09HSlpqbqnXfeabZeWFioe++9Vy7XlaGZ33/pAhvh4eE6ceKEUlNTr/t5VmZEAACAUNfajGiriZfH45HH47Hk2J3ctvpVAQAAhCy/399sqNdo4MCBKioqara2dOlS+Xw+rVu3TikpN754nJUZEQAA4HZh6eSrsrJSp06darpfUlKiwsJCdevWTb1797awMgAAAPwdXnrpJU2aNEm9e/eWz+fTRx99pPz8fO3du1eSNGvWLPXs2VOrV6+W1+vVkCFDmu0fFxcnSdetAwAA4O9l6ZDwhx9+0IQJE5ruL1y4UJKUmZmpzZs3W1QVAAAA/i5//vmnZs2apTNnzig2NlbDhg3T3r179eCDD0qSTp8+rfBwLrgBAABgtZD5TMK2sMvn7gAAAAQD2egSfg8AAABXtDYb8bItAAAAAAAA4HAMCQEAAAAAAACHY0gIAAAAAAAAOBxDQgAAAAAAAMDhGBICAAAAAAAADseQEAAAAAAAAHA4hoQAAAAAAACAwzEkBAAAAAAAABwuwuoC2sMYI0mqqKiwuBIAAADrNWaixozkVGREAACAK1qbEW09JPT5fJKklJQUiysBAAAIHT6fT7GxsVaXYRkyIgAAwPVulRHDjI1favb7/frjjz8UHR2tsLCwDj1WRUWFUlJS9NtvvykmJqZDj4W2o0/2QJ/sgT6FPnpkD8HskzFGPp9PycnJCg937qfKkBFxLfpkD/TJHuiTPdAnewhWn1qbEW19JmF4eLh69eoV1GPGxMTwBLMB+mQP9Mke6FPoo0f2EKw+OfkMwkZkRLSEPtkDfbIH+mQP9MkegtGn1mRE577EDAAAAAAAAEASQ0IAAAAAAADA8RgStpLH41FWVpY8Ho/VpeAm6JM90Cd7oE+hjx7ZA326vdFfe6BP9kCf7IE+2QN9sodQ65OtL1wCAAAAAAAAoP04kxAAAAAAAABwOIaEAAAAAAAAgMMxJAQAAAAAAAAcjiHhVTZs2KA+ffrI6/Vq1KhR+v7772+6/bZt2zRw4EB5vV4NHTpUeXl5QarU2QLp08aNGzV27Fh17dpVXbt2VXp6+i37ir9HoM+nRrm5uQoLC9MjjzzSsQUi4B6dO3dO8+fPV1JSkjwej/r378+/e0EQaJ/efPNNDRgwQFFRUUpJSdGCBQtUXV0dpGqd6ZtvvtGUKVOUnJyssLAw7dq165b75Ofn67777pPH49Gdd96pzZs3d3idaDsyoj2QEe2BjBj6yIj2QEYMfbbMiAbGGGNyc3ON2+0277//vvnpp5/Mk08+aeLi4szZs2dvuP2hQ4eMy+Uya9asMceOHTNLly41kZGRpqioKMiVO0ugfZoxY4bZsGGDKSgoMMePHzezZ882sbGx5vfffw9y5c4SaJ8alZSUmJ49e5qxY8eaqVOnBqdYhwq0RzU1NWbEiBFm8uTJ5uDBg6akpMTk5+ebwsLCIFfuLIH2aevWrcbj8ZitW7eakpISs3fvXpOUlGQWLFgQ5MqdJS8vzyxZssTs2LHDSDI7d+686fbFxcWmU6dOZuHChebYsWNm/fr1xuVymT179gSnYASEjGgPZER7ICOGPjKiPZAR7cGOGZEh4WUjR4408+fPb7rf0NBgkpOTzerVq2+4/bRp08xDDz3UbG3UqFHmqaee6tA6nS7QPl2rvr7eREdHmy1btnRUiTBt61N9fb0ZPXq0ee+990xmZiYBsIMF2qOcnBzTt29fU1tbG6wSYQLv0/z5880DDzzQbG3hwoVmzJgxHVonrmhNAHzhhRfM4MGDm61Nnz7dTJw4sQMrQ1uREe2BjGgPZMTQR0a0BzKi/dglI/J2Y0m1tbU6evSo0tPTm9bCw8OVnp6uw4cP33Cfw4cPN9tekiZOnNji9mi/tvTpWhcuXFBdXZ26devWUWU6Xlv7tHz5ciUkJGjOnDnBKNPR2tKjTz/9VGlpaZo/f7569OihIUOGaNWqVWpoaAhW2Y7Tlj6NHj1aR48ebXq7SXFxsfLy8jR58uSg1IzWIUPYBxnRHsiI9kBGDH1kRHsgI96+QiFDRATtSCGsvLxcDQ0N6tGjR7P1Hj166Oeff77hPmVlZTfcvqysrMPqdLq29OlaL774opKTk6974uHv05Y+HTx4UJs2bVJhYWEQKkRbelRcXKyvvvpKM2fOVF5enk6dOqV58+aprq5OWVlZwSjbcdrSpxkzZqi8vFz333+/jDGqr6/X008/rZdffjkYJaOVWsoQFRUVunjxoqKioiyqDNciI9oDGdEeyIihj4xoD2TE21coZETOJIRjZGdnKzc3Vzt37pTX67W6HFzm8/mUkZGhjRs3Kj4+3upy0AK/36+EhAS9++67Gj58uKZPn64lS5bo7bfftro0XCU/P1+rVq3SW2+9pR9//FE7duzQ7t27tWLFCqtLA4CQRUYMTWREeyAj2gMZEa3FmYSS4uPj5XK5dPbs2WbrZ8+eVWJi4g33SUxMDGh7tF9b+tRo7dq1ys7O1pdffqlhw4Z1ZJmOF2iffvnlF5WWlmrKlClNa36/X5IUERGhEydOKDU1tWOLdpi2PJeSkpIUGRkpl8vVtHbXXXeprKxMtbW1crvdHVqzE7WlT6+88ooyMjL0xBNPSJKGDh2qqqoqzZ07V0uWLFF4OK8NhoKWMkRMTAxnEYYYMqI9kBHtgYwY+siI9kBGvH2FQkbkb4Ikt9ut4cOHa9++fU1rfr9f+/btU1pa2g33SUtLa7a9JH3xxRctbo/2a0ufJGnNmjVasWKF9uzZoxEjRgSjVEcLtE8DBw5UUVGRCgsLm74efvhhTZgwQYWFhUpJSQlm+Y7QlufSmDFjdOrUqaZwLkknT55UUlIS4a+DtKVPFy5cuC7kNYZ2Y0zHFYuAkCHsg4xoD2REeyAjhj4yoj2QEW9fIZEhgnaJlBCXm5trPB6P2bx5szl27JiZO3euiYuLM2VlZcYYYzIyMszixYubtj906JCJiIgwa9euNcePHzdZWVkmMjLSFBUVWfUQHCHQPmVnZxu32222b99uzpw50/Tl8/msegiOEGifrsWV6zpeoD06ffq0iY6ONs8++6w5ceKE+eyzz0xCQoJ5/fXXrXoIjhBon7Kyskx0dLT5+OOPTXFxsfn8889NamqqmTZtmlUPwRF8Pp8pKCgwBQUFRpJ54403TEFBgfn111+NMcYsXrzYZGRkNG1fXFxsOnXqZJ5//nlz/Phxs2HDBuNyucyePXusegi4CTKiPZAR7YGMGPrIiPZARrQHO2ZEhoRXWb9+vendu7dxu91m5MiR5siRI01/Nm7cOJOZmdls+08++cT079/fuN1uM3jwYLN79+4gV+xMgfTpjjvuMJKu+8rKygp+4Q4T6PPpagTA4Ai0R99++60ZNWqU8Xg8pm/fvmblypWmvr4+yFU7TyB9qqurM6+99ppJTU01Xq/XpKSkmHnz5pm//vor+IU7yP79+2/4f01jbzIzM824ceOu2+eee+4xbrfb9O3b13zwwQdBrxutR0a0BzKiPZARQx8Z0R7IiKHPjhkxzBjOLQUAAAAAAACcjM8kBAAAAAAAAByOISEAAAAAAADgcAwJAQAAAAAAAIdjSAgAAAAAAAA4HENCAAAAAAAAwOEYEgIAAAAAAAAOx5AQAAAAAAAAcDiGhAAAAAAAAIDDMSQEAAAAAAAAHI4hIQC00/jx4/Xcc89ZXQYAAAAAAG3GkBAAAAAAgA5WW1trdQkAcFNhxhhjdREAYFezZ8/Wli1bmq2VlJSoT58+1hQEAACAkDB+/HgNGTJEERER+vDDDzV06FDt37/f6rIAoEURVhcAAHa2bt06nTx5UkOGDNHy5cslSd27d7e4KgAAAISCLVu26JlnntGhQ4esLgUAbokhIQC0Q2xsrNxutzp16qTExESrywEAAEAI6devn9asWWN1GQDQKnwmIQAAAAAAHWD48OFWlwAArcaQEAAAAACADtC5c2erSwCAVmNICADt5Ha71dDQYHUZAAAAAAC0GUNCAGinPn366LvvvlNpaanKy8vl9/utLgkAAAAAgIAwJASAdlq0aJFcLpcGDRqk7t276/Tp01aXBAAAAABAQMKMMcbqIgAAAAAAAABYhzMJAQAAAAAAAIdjSAgAAAAAAAA4HENCAAAAAAAAwOEYEgIAAAAAAAAOx5AQAAAAAAAAcDiGhAAAAAAAAIDDMSQEAAAAAAAAHI4hIQAAAAAAAOBwDAkBAAAAAAAAh2NICAAAAAAAADgcQ0IAAAAAAADA4RgSAgAAAAAAAA73/z146uak0xN9AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# using loaded_model\n", + "\n", + "r = pybamm.SpatialVariable(\n", + " \"r\", domain=[\"negative particle\"], coord_sys=\"spherical polar\"\n", + ")\n", + "geometry = {\n", + " \"negative particle\": {r: {\"min\": pybamm.Scalar(0), \"max\": pybamm.Scalar(1)}}\n", + "}\n", + "\n", + "\n", + "submesh_types = {\"negative particle\": pybamm.Uniform1DSubMesh}\n", + "var_pts = {r: 20}\n", + "mesh = pybamm.Mesh(geometry, submesh_types, var_pts)\n", + "spatial_methods = {\"negative particle\": pybamm.FiniteVolume()}\n", + "disc = pybamm.Discretisation(mesh, spatial_methods)\n", + "disc.process_model(loaded_model)\n", + "\n", + "\n", + "solver = pybamm.ScipySolver()\n", + "t = np.linspace(0, 1, 100)\n", + "solution = solver.solve(loaded_model, t)\n", + "\n", + "c = solution[\"Concentration\"]\n", + "\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13, 4))\n", + "\n", + "ax1.plot(solution.t, c(solution.t, r=1))\n", + "ax1.set_xlabel(\"t\")\n", + "ax1.set_ylabel(\"Surface concentration\")\n", + "\n", + "r_vals = np.linspace(0, 1, 100)\n", + "ax2.plot(r_vals, c(t=0.5, r=r_vals))\n", + "ax2.set_xlabel(\"r\")\n", + "ax2.set_ylabel(\"Concentration at t=0.5\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "332e2a5d", + "metadata": {}, + "source": [ + "## Loading Models from URLs\n", + "\n", + "PyBaMM also supports loading models directly from remote URLs. \n", + "This functionality is particularly useful for sharing models via GitHub or other hosting platforms. \n", + "\n", + "In the example below, we demonstrate how to load a Doyle–Fuller–Newman (DFN) model from a GitHub repository and run a simulation.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "23bd164e", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "Model() missing 1 required positional argument: 'model'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mTypeError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# loadinng models with urls of json\u001b[39;00m\n\u001b[32m 3\u001b[39m url = url = \u001b[33m\"\u001b[39m\u001b[33mhttps://raw.githubusercontent.com/medha-14/model_json/refs/heads/main/dfn.json\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m model = \u001b[43mpybamm\u001b[49m\u001b[43m.\u001b[49m\u001b[43mModel\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 5\u001b[39m sim = pybamm.Simulation(model)\n\u001b[32m 6\u001b[39m sim.solve([\u001b[32m0\u001b[39m, \u001b[32m3600\u001b[39m])\n", + "\u001b[31mTypeError\u001b[39m: Model() missing 1 required positional argument: 'model'" + ] + } + ], + "source": [ + "# loadinng models with urls of json\n", + "\n", + "url = url = (\n", + " \"https://raw.githubusercontent.com/medha-14/model_json/refs/heads/main/dfn.json\"\n", + ")\n", + "model = pybamm.Model(url=url)\n", + "sim = pybamm.Simulation(model)\n", + "sim.solve([0, 3600])\n", + "sim.plot(show_plot=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pybamm", + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}