{ "cells": [ { "cell_type": "markdown", "id": "d512ff36-4561-406a-88ff-ad32c2fbc897", "metadata": {}, "source": [ "# Quickstart" ] }, { "cell_type": "markdown", "id": "be2cb84b-97cb-4f91-bab2-23660432153c", "metadata": {}, "source": [ "### Install MAEnvs4VRP " ] }, { "cell_type": "markdown", "id": "8651e80e-538d-4f80-bf84-e04fbbc07116", "metadata": {}, "source": [ "Uncomment the following cells:" ] }, { "cell_type": "code", "execution_count": 1, "id": "75a9a503-3e8f-409c-800d-588dc13abb17", "metadata": {}, "outputs": [], "source": [ "#!git clone https://github.com/ricgama/maenvs4vrp.git" ] }, { "cell_type": "code", "execution_count": 2, "id": "c347d0e4-eea3-47c4-8200-b1b1a2ee5acd", "metadata": {}, "outputs": [], "source": [ "# When using Colab\n", "#%cd maenvs4vrp\n", "#%mv maenvs4vrp/ repo_temp/\n", "#%mv repo_temp/ ..\n", "#%cd ..\n", "#%cp maenvs4vrp/setup.py repo_temp/\n", "#%rm -r maenvs4vrp\n", "#%mv repo_temp/ maenvs4vrp/\n", "#%cd maenvs4vrp/\n", "#!pip install ." ] }, { "cell_type": "markdown", "id": "12564b1d", "metadata": {}, "source": [ "Let's begin exploring the **MAEnvs4VRP** library using the **CVRPTW** (Capacitated Vehicle Routing Problem with Time Windows) environment as our working example. The library’s **API design** is inspired by the [**PettingZoo**](https://pettingzoo.farama.org/), which adopts the **Agent Environment Cycle (AEC)** paradigm—where agents act in a defined sequence within a shared environment. Additionally, the library draws influence from the [**Flatland**](https://flatland.aicrowd.com/intro.html) environment, adopting several of its design principlesy.\n" ] }, { "cell_type": "markdown", "id": "f60cd1bd", "metadata": {}, "source": [ "## Basic usage" ] }, { "cell_type": "code", "execution_count": 3, "id": "23a2e7e9", "metadata": {}, "outputs": [], "source": [ "from maenvs4vrp.environments.cvrptw.env import Environment\n", "from maenvs4vrp.environments.cvrptw.env_agent_selector import AgentSelector\n", "from maenvs4vrp.environments.cvrptw.observations import Observations\n", "from maenvs4vrp.environments.cvrptw.instances_generator import InstanceGenerator\n", "from maenvs4vrp.environments.cvrptw.env_agent_reward import DenseReward" ] }, { "cell_type": "code", "execution_count": 4, "id": "bed5fbdd", "metadata": {}, "outputs": [], "source": [ "gen = InstanceGenerator(batch_size = 8)\n", "obs = Observations()\n", "sel = AgentSelector()\n", "rew = DenseReward()\n", "\n", "env = Environment(instance_generator_object=gen, \n", " obs_builder_object=obs,\n", " agent_selector_object=sel,\n", " reward_evaluator=rew,\n", " seed=0)" ] }, { "cell_type": "code", "execution_count": 5, "id": "f300c7c5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TensorDict(\n", " fields={\n", " agent_step: Tensor(shape=torch.Size([8, 1]), device=cpu, dtype=torch.int32, is_shared=False),\n", " cur_agent_idx: Tensor(shape=torch.Size([8, 1]), device=cpu, dtype=torch.int64, is_shared=False),\n", " cur_node_idx: Tensor(shape=torch.Size([8, 1]), device=cpu, dtype=torch.int64, is_shared=False),\n", " done: Tensor(shape=torch.Size([8]), device=cpu, dtype=torch.bool, is_shared=False),\n", " observations: TensorDict(\n", " fields={\n", " action_mask: Tensor(shape=torch.Size([8, 16]), device=cpu, dtype=torch.bool, is_shared=False),\n", " agent_obs: Tensor(shape=torch.Size([8, 6]), device=cpu, dtype=torch.float32, is_shared=False),\n", " agents_mask: Tensor(shape=torch.Size([8, 4]), device=cpu, dtype=torch.bool, is_shared=False),\n", " global_obs: Tensor(shape=torch.Size([8, 2]), device=cpu, dtype=torch.float32, is_shared=False),\n", " node_dynamic_obs: Tensor(shape=torch.Size([8, 16, 8]), device=cpu, dtype=torch.float32, is_shared=False),\n", " node_static_obs: Tensor(shape=torch.Size([8, 16, 7]), device=cpu, dtype=torch.float32, is_shared=False),\n", " other_agents_obs: Tensor(shape=torch.Size([8, 4, 8]), device=cpu, dtype=torch.float32, is_shared=False)},\n", " batch_size=torch.Size([8]),\n", " device=cpu,\n", " is_shared=False),\n", " penalty: Tensor(shape=torch.Size([8]), device=cpu, dtype=torch.float32, is_shared=False),\n", " reward: Tensor(shape=torch.Size([8]), device=cpu, dtype=torch.float32, is_shared=False)},\n", " batch_size=torch.Size([8]),\n", " device=cpu,\n", " is_shared=False)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "td = env.reset(batch_size = 8, num_agents=4, num_nodes=16)\n", "td" ] }, { "cell_type": "code", "execution_count": 6, "id": "29da80bd", "metadata": {}, "outputs": [], "source": [ "while not td[\"done\"].all(): \n", " td = env.sample_action(td) # this is where we insert our policy\n", " td = env.step(td)" ] }, { "cell_type": "markdown", "id": "113d31a1-ff53-4902-87fd-f7fd53b6953e", "metadata": {}, "source": [ "## Basic usage in more detail" ] }, { "cell_type": "code", "execution_count": 7, "id": "2829ed7a-2447-4c10-81d2-a3e1f0625e07", "metadata": {}, "outputs": [], "source": [ "from maenvs4vrp.utils.plotting import (plot_instance_coords, plot_random_batch_instances, plot_env_instance_coords, plot_env_random_batch_instances, plot_solution)\n", "from maenvs4vrp.utils.utils import get_solution" ] }, { "cell_type": "code", "execution_count": 8, "id": "8828c135-1e7b-42b8-a133-b39752d4d29c", "metadata": {}, "outputs": [], "source": [ "# Import the main Environment class for the CVRPTW (Capacitated Vehicle Routing Problem with Time Windows) environment\n", "from maenvs4vrp.environments.cvrptw.env import Environment\n", "# Import the AgentSelector which handles agent selection logic in the environment\n", "from maenvs4vrp.environments.cvrptw.env_agent_selector import AgentSelector\n", "# Import the Observations class that defines how observations are structured and generated\n", "from maenvs4vrp.environments.cvrptw.observations import Observations\n", "# Import the InstanceGenerator for creating CVRPTW problem instances\n", "from maenvs4vrp.environments.cvrptw.instances_generator import InstanceGenerator\n", "# Import the DenseReward class which provides detailed reward signals during training\n", "from maenvs4vrp.environments.cvrptw.env_agent_reward import DenseReward" ] }, { "cell_type": "code", "execution_count": 9, "id": "db2d6369-105b-4b4d-a6ef-52da0fde3d37", "metadata": {}, "outputs": [], "source": [ "gen = InstanceGenerator(batch_size = 8)\n", "obs = Observations()\n", "sel = AgentSelector()\n", "rew = DenseReward()\n", "\n", "env = Environment(instance_generator_object=gen, \n", " obs_builder_object=obs,\n", " agent_selector_object=sel,\n", " reward_evaluator=rew,\n", " seed=0)" ] }, { "cell_type": "markdown", "id": "de707225-a4ba-4adb-9a62-378404717d4c", "metadata": {}, "source": [ "After instantiating the environment we have to reset it:" ] }, { "cell_type": "code", "execution_count": 10, "id": "f6c6017a-4f47-4165-8596-17733c4acb1f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TensorDict(\n", " fields={\n", " agent_step: Tensor(shape=torch.Size([8, 1]), device=cpu, dtype=torch.int32, is_shared=False),\n", " cur_agent_idx: Tensor(shape=torch.Size([8, 1]), device=cpu, dtype=torch.int64, is_shared=False),\n", " cur_node_idx: Tensor(shape=torch.Size([8, 1]), device=cpu, dtype=torch.int64, is_shared=False),\n", " done: Tensor(shape=torch.Size([8]), device=cpu, dtype=torch.bool, is_shared=False),\n", " observations: TensorDict(\n", " fields={\n", " action_mask: Tensor(shape=torch.Size([8, 16]), device=cpu, dtype=torch.bool, is_shared=False),\n", " agent_obs: Tensor(shape=torch.Size([8, 6]), device=cpu, dtype=torch.float32, is_shared=False),\n", " agents_mask: Tensor(shape=torch.Size([8, 4]), device=cpu, dtype=torch.bool, is_shared=False),\n", " global_obs: Tensor(shape=torch.Size([8, 2]), device=cpu, dtype=torch.float32, is_shared=False),\n", " node_dynamic_obs: Tensor(shape=torch.Size([8, 16, 8]), device=cpu, dtype=torch.float32, is_shared=False),\n", " node_static_obs: Tensor(shape=torch.Size([8, 16, 7]), device=cpu, dtype=torch.float32, is_shared=False),\n", " other_agents_obs: Tensor(shape=torch.Size([8, 4, 8]), device=cpu, dtype=torch.float32, is_shared=False)},\n", " batch_size=torch.Size([8]),\n", " device=cpu,\n", " is_shared=False),\n", " penalty: Tensor(shape=torch.Size([8]), device=cpu, dtype=torch.float32, is_shared=False),\n", " reward: Tensor(shape=torch.Size([8]), device=cpu, dtype=torch.float32, is_shared=False)},\n", " batch_size=torch.Size([8]),\n", " device=cpu,\n", " is_shared=False)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "td = env.reset(batch_size = 8, num_agents=4, num_nodes=16)\n", "td" ] }, { "cell_type": "markdown", "id": "dab0f5e1-e764-4905-b5dc-02282d5d7bda", "metadata": {}, "source": [ "**Understanding the `TensorDict` Keys**\n", "\n", "The `TensorDict` acts like a dictionary of tensors holding all the state, observation, and reward information for a batch of agents in your environment. In this case, the batch size is **8**, meaning it holds data for 8 parallel environments. \n", "\n", "**Top-Level Keys**\n", "\n", "| Key | Shape | Description |\n", "|------|--------|-------------|\n", "| `agent_step` | `[8, 1]` | Current step number of each agent in the environment. |\n", "| `cur_agent_idx` | `[8, 1]` | Index of the agent currently taking an action. |\n", "| `cur_node_idx` | `[8, 1]` | Index of the node (location) the agent is currently at. |\n", "| `done` | `[8]` (bool) | Whether each environment/episode is finished (`True` = done). |\n", "| `penalty` | `[8]` (float) | step Penalty. |\n", "| `reward` | `[8]` (float) | step Reward signal. |\n", "\n", "---\n", "\n", "**Nested `observations` TensorDict**\n", "\n", "This contains all the observation-related tensors provided to the agent at each step.\n", "\n", "| Key (inside `observations`) | Shape | Description |\n", "|------------------------------|--------|-------------|\n", "| `action_mask` | `[8, 16]` (bool) | Mask of valid/invalid actions for each agent at each step. |\n", "| `agent_obs` | `[8, 6]` (float) | Individual agent’s features/observations. |\n", "| `agents_mask` | `[8, 4]` (bool) | Mask showing which agents are active/available. |\n", "| `global_obs` | `[8, 2]` (float) | Global environment features shared by all agents. |\n", "| `node_dynamic_obs` | `[8, 16, 8]` (float) | Dynamic (changing) features of each node/location. |\n", "| `node_static_obs` | `[8, 16, 7]` (float) | Static (fixed) features of each node/location. |\n", "| `other_agents_obs` | `[8, 4, 8]` (float) | Observations of other agents (relative states, positions, etc.). |\n", "\n" ] }, { "cell_type": "markdown", "id": "014422af-14a7-4deb-b7df-e1352c1741fe", "metadata": {}, "source": [ "Let's visualize some environments instances:" ] }, { "cell_type": "code", "execution_count": 11, "id": "fcd663cd-f19f-4de5-96ca-2904ad52a4cc", "metadata": {}, "outputs": [ { "data": { "image/png": "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B09ERERERNIxuZhYsWIFZs6cienTpyM4OBgZGRno3LkzNm7c2Gz7Dz74AM899xxCQkIwaNAgrF+/HjqdDrm5uXccPBERERERScekfSbq6upw+PBhJCcnG47JZDJERUWhoKCgXc9x8+ZN1NfXw8ur5Z04a2trUVtba3hcUVEBABBFEaIomhKyQ9BftzNee3OYD2PMhzHmo5GzXz8REVmHScXE1atXodVq4ePjY3Tcx8cHp06datdzzJ8/H7169UJUVFSLbdLS0rB48eImx8vLy53yDVIURVRVVQEANyAC83E75sMY89FIfxOGiIjIkqy6A/by5cuxdetW5OXlQalUttguOTkZSUlJhscVFRUIDAyEh4cHunbtao1QbYq+gPLw8HDqD0d6zIcx5sMY89HIma+diIisx6RiwtvbG3K5HKWlpUbHS0tL4evr2+q56enpWL58Ofbs2YNhw4a12lahUEChUDQ5LgiC075B6q/dWa//dsyHMebDGPPBYoKIiKzDpAnYbm5uCA0NNZo8rZ9MHRER0eJ5b775JpYuXYqcnByEhYWZHy0REREREdkMk4c5JSUlIT4+HmFhYRg9ejRWrlyJ6upqTJ8+HQAQFxcHf39/pKWlAQDeeOMNpKSk4MMPP4RKpYJGowEAdOnSBV26dOnASyEiIiIiImsyuZiIjY3FlStXkJKSAo1Gg5CQEOTk5BgmZZeUlEAm+63DY82aNairq8PkyZONnic1NRWvvfbanUVPRERERESSMWsCdmJiIhITE5v9Xl5entFjtVptzksQEREREZGNM3nTOiIiIiIiIoDFBBERERERmYnFBBERERERmYXFBBERERERmYXFBBERERERmYXFBBERERERmYXFBBERERERmYXFBBERERERmYXFBAEA5s6dC5VKBUEQUFhYaDj+008/4d5778WAAQMwatQonDhxQrogiYiIiMimsJggAMDkyZORn5+PPn36GB2fPXs2Zs2ahR9//BHz58/HM888I02ARERERGRzWEwQAGD8+PEICAgwOlZWVoZDhw5h2rRpAIDHH38cFy5cwJkzZ6QIkYiIiMimqFQqDBw4ECEhIQgJCUFWVpbUIVkdiwlq0YULF+Dn5wcXFxcAgCAI6N27N0pKSiSOjKjjtDTET+/dd9+FIAjIzs62emxERGT7srKyUFhYiMLCQsTGxkodjtWx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yH5xNIrtM6vvJjExscVhTbcXCCqVqsOWKNRvdd7WhiK37m7LO5JERERE9oejUeyDrO0mtqOKW50TEREROQX9aJTW6EejkHTsqpjowt1tbYb8rrss2p6IiIicl340SmvD2gHj0SgkDbv6tH3rVuet/XBxq3PLc1OpcHfOF9BWV7fZVn7XXXBTqSwfFBERETmESjNGo/BznzTsqpgAuNW5LWGBQERERJbg/utolPYUFByNIi27GuYE/LbVuYDGHohbyWUCBIBbnRMRERHZMf1olNs/691OLhPwwBBf9kpIyO6KCaBxq/OPn43AxGAfwxwK/ZrDHz8bwSXCiIiIiOxcQmQQdG10TXA0ivTstk8oTOWFMJUXd7clIiIickD60SiLft1n4tb5snKZAJ1O5GgUG2C3xYQed7clIiIickzTxvTBIF93rM8/j10nNEY7YCeM68tCwgbYfTFBRAQAc+fOxfbt21FcXIyvv/4a48aNAwA88MAD0Gg0kMlkcHd3xz//+U+MGDFC4miJiKi9OBrFttnlnAkiottNnjwZ+fn56NPHeM7URx99hB9++AGFhYVISkrCM888I02ARER0R5SucvRwV7CQsDEsJojIIYwfPx4BAQFNjnt6ehr+v7y8HILQzp0viYiIrGju3LlQqVQQBAGFhYVtHrcVLCaIyOHFxcUhMDAQixYtwpYtW6QOh4iIqImWethbOm4rOGeCiBzee++9BwDYvHkz5s+fj507d0ocERERkbHx48ebdNxWsGeCiJxGfHw89u7di2vXrkkdChERkUNgMUFEDuvGjRu4dOmS4XF2dja6d+8OLy8uJUhERNQROMyJiOxCW0sCzp49Gzt27IBGo8Hjjz+Orl27Ijc3F1OmTMF///tfyGQy9OjRA59//jknYRMREXUQFhNEZNMOqq9j/b5z2H2y1GizopmRQUabFa1duxYAIIoiysvL4eHhAUEQcODAAalCJyIicngc5kRENmvL/mI8kVGAPUVl0ImNx3QisKeoDFMyCvD+/mJpAyQiImqnmnotrlTWoqZe2+z3Z8+ejYCAAFy8eBHR0dHo169fq8dtBXsmiMgmHVRfR0r2cYgAtPpK4lf6x4uyj2OQr7tRDwUREZEtMbWH/XYtHbcV7JkgIpu0ft85yGStz22QyQSszz9vpYiIiIhM4ww97CwmiMjm1NRrsftkaZMeidtpdSJ2ndC02GVMREQklbZ62EU09rAfUl+XJL6OwmKCiGxOZU0D2qgjDHRiY3siIiJb4iw97CwmiMjmuCtd0MbfXwOZ0NieiIjIVjhTD7tZxcTq1auhUqmgVCoRHh7e5tKLH3/8MQYNGgSlUol77rkHO3fuNCtYInIOSlc5Jgb7QN5GRSGXCXhgiG+z+04QERFJxZl62E0uJrKyspCUlITU1FQcOXIEw4cPR3R0NMrKyppt/+233+Kpp57CjBkzcPToUcTExCAmJgbHjx+/4+CJyHElRAZB18ZfYp1ORMK4vlaKiIiIqH2cqYfd5GJixYoVmDlzJqZPn47g4GBkZGSgc+fO2LhxY7Pt//GPf+DBBx/E//7v/2Lw4MFYunQpRo4ciVWrVt1x8ETkuEapvLA0ZigEoEkPhVwmQACwNGYol4UlIiKb40w97CaVQXV1dTh8+DCSk5MNx2QyGaKiolBQUNDsOQUFBUhKSjI6Fh0djezs7BZfp7a2FrW1tYbH5eXlhv+KYjv7jByIfkdfABCEdpa5Doz5MObI+Zg02BP+nYdgy3dq7P11WT2ZANw3uCeeDldhZB9Pw7XrOXI+TFFRUQEATvk3k4jIFiREBmHXidJW2zhCD7tJxcTVq1eh1Wrh4+NjdNzHxwenTp1q9hyNRtNse41G0+LrpKWlYfHixU2O9+7d25RwichBvfvrF7WtsrISHh4eUodBROR09D3si7KPQyYTjCZjy2UCdDrRIXrYbXKAVnJyslFvhk6nw/Xr19G9e3envNNYUVGBwMBAXLhwAV27dpU6HMkxH8aYD2PMRyNRFFFZWYlevXpJHQoRkdOaNqYPBvm6Y33+eew6oTHaATthXF+7LyQAE4sJb29vyOVylJYad9mUlpbC19e32XN8fX1Nag8ACoUCCoXC6Jinp6cpoTqkrl27OvWHo9sxH8aYD2PMB9gjQURkA8JUXghTeaGmXovKmga4K13seo7E7UyagO3m5obQ0FDk5uYajul0OuTm5iIiIqLZcyIiIozaA8Du3btbbE9ERERE5GiUrnL0cFc4VCEBmDHMKSkpCfHx8QgLC8Po0aOxcuVKVFdXY/r06QCAuLg4+Pv7Iy0tDQAwb9483HfffXjrrbfwhz/8AVu3bsWhQ4ewbt26jr0SIiIiIiKyKpOLidjYWFy5cgUpKSnQaDQICQlBTk6OYZJ1SUkJZLLfOjzuvfdefPjhh1i4cCFeeeUV9O/fH9nZ2Rg6dGjHXYWDUygUSE1NbTL0y1kxH8aYD2PMBxERkfUIItcNJCIiJ1RRUQEPDw+Ul5c71Pwa/fLIHh4eTrloSUuYl6aYk+bZc16k+Ltm8qZ1REREREREAIsJIiIiInIyc+fOhUqlgiAIKCwsNBz/6aefMHbsWMPc4BMnTkgXpJ1gMUFERERETmXy5MnIz89Hnz59jI7Pnj0bM2fOxKFDh/DXv/4VzzzzjDQB2hEWE0RERETkVMaPH4+AgACjY2VlZTh06BCmTZsGAHj88cdx4cIFnDlzRooQ7QaLCSIiIiJyehcuXICfnx9cXBoXOxUEAb1790ZJSYnEkdk2FhM2YvXq1VCpVFAqlQgPD8eBAwdabJuZmYnIyEh069YN3bp1Q1RUVKvt7ZEp+bjV1q1bIQgCYmJiLBuglZmajxs3buD555+Hn58fFAoFBgwYgJ07d1opWsszNR8rV67EwIED0alTJwQGBuLFF19ETU2NlaIlIiJyXCwmbEBWVhaSkpKQmpqKI0eOYPjw4YiOjkZZWVmz7fPy8vDUU09h7969KCgoQGBgIB544AH8/PPPVo7cMkzNh55arcbLL7+MyMhIK0VqHabmo66uDhMnToRarca2bdtw+vRpZGZmwt/f38qRW4ap+fjwww+xYMECpKamoqioCBs2bEBWVhZeeeUVK0dORES2LDAwEJcvX0ZDQwOAxiViS0pK0Lt3b4kjs3EiSW706NHi888/b3is1WrFXr16iWlpae06v6GhQXR3dxc3b95sqRCtypx8NDQ0iPfee6+4fv16MT4+XnzsscesEKl1mJqPNWvWiEFBQWJdXZ21QrQqU/Px/PPPi/fff7/RsaSkJHHs2LEWjZNsX3l5uQhALC8vlzqUDqXT6cRffvlF1Ol0UodiU5iXphw5J/+taxDLKmrE/9Y1tNquT58+4tGjRw2P77vvPnHjxo3iL7/8In700UdiaGiohSPtWFL8XWPPhMTq6upw+PBhREVFGY7JZDJERUWhoKCgXc9x8+ZN1NfXw8vLy1JhWo25+ViyZAl69uyJGTNmWCNMqzEnH9u3b0dERASef/55+Pj4YOjQoVi2bBm0Wq21wrYYc/Jx77334vDhw4ahUOfOncPOnTvx8MMPWyVmIiKynoPq65i95RCCU3Iw6m97EJySg9lbDuGQ+rpRu9mzZyMgIAAXL15EdHQ0+vXrBwBYu3Yt1q1bh7CwMLzxxht49913pbgMu+IidQDO7urVq9BqtfDx8TE67uPjg1OnTrXrOebPn49evXoZfcCyV+bkIz8/Hxs2bDBaJ9pRmJOPc+fO4auvvsLUqVOxc+dOnDlzBs899xzq6+uRmppqjbAtxpx8/OlPf8LVq1cxbtw4iKKIhoYGPPvssxzmRETkYLbsL0ZK9nHIZAJ0YuMxnQjsKSrDrhOlWBozFNPGNC4Fu3bt2mafY+DAgfj222/tdgdsKbBnws4tX74cW7duxWeffQalUil1OFZXWVmJp59+GpmZmfD29pY6HJug0+nQs2dPrFu3DqGhoYiNjcWrr76KjIwMqUOTRF5eHpYtW4Z//etfOHLkCD799FPs2LEDS5culTo0IiLqIAfV15GSfRwiAK2+kviVVidCBLAo+3iTHgq6c+yZkJi3tzfkcjlKS0uNjpeWlsLX17fVc9PT07F8+XLs2bMHw4YNs2SYVmNqPs6ePQu1Wo1JkyYZjul0OgCAi4sLTp8+jbvvvtuyQVuQOT8ffn5+cHV1hVwuNxwbPHgwNBoN6urq4ObmZtGYLcmcfCxatAhPP/00EhISAAD33HMPqqurMWvWLLz66quQyXhPhYjI3q3fdw4ymdCkkLiVTCZgff55hKnsf1i4LeG7qMTc3NwQGhqK3NxcwzGdTofc3FxERES0eN6bb76JpUuXIicnB2FhYdYI1SpMzcegQYNw7NgxFBYWGr4effRRTJgwAYWFhQgMDLRm+B3OnJ+PsWPH4syZM4aiCgB+/PFH+Pn52XUhAZiXj5s3bzYpGPSFlii2/KZDRET2oaZei90nS1stJIDGHopdJzSoqbf/OYS2hD0TNiApKQnx8fEICwvD6NGjsXLlSlRXV2P69OkAgLi4OPj7+yMtLQ0A8MYbbyAlJQUffvghVCoVNBoNAKBLly7o0qWLZNfRUUzJh1KpxNChQ43O9/T0BIAmx+2VqT8fc+bMwapVqzBv3jz85S9/wU8//YRly5Zh7ty5Ul5GhzE1H5MmTcKKFSswYsQIhIeH48yZM1i0aBEmTZpk1HtDRET2qbKmAW3UEQY6sbG90pV//zsKiwkbEBsbiytXriAlJQUajQYhISHIyckxTDItKSkxurO6Zs0a1NXVYfLkyUbPk5qaitdee82aoVuEqflwdKbmIzAwEF9++SVefPFFDBs2DP7+/pg3bx7mz58v1SV0KFPzsXDhQgiCgIULF+Lnn39Gjx49MGnSJPztb3+T6hKIiKgDuStdIBPQroJCJjS2p44jiOznJyIiG7B69Wr8/e9/h0ajwfDhw/HOO+9g9OjRLbb/+OOPsWjRIqjVavTv3x9vvPGGSUv+VlRUwMPDA+Xl5ejatWtHXIJNEEWRK9E0g3lpypFyMnvLIewpKmt1qJNcJmBisA8ypoW2+lz2nBcp/q45z+1dIiKyWabubP7tt9/iqaeewowZM3D06FHExMQgJiYGx48ft3LkRGQLEiKDoGuja0KnE5Ewrq+VInIe7JkgIiLJhYeHY9SoUVi1ahWAxon1gYGB+Mtf/oIFCxY0aR8bG4vq6mp8/vnnhmNjxoxBSEhIu5dBZs+Ec2FemnK0nLy/vxiLft1n4tYeCrlMgE4nGu0z0Rp7zosUf9c4aIyIiCSl39k8OTnZcKytnc0LCgqQlJRkdCw6OhrZ2dktvk5tbS1qa2sNjysqKgA0fnBwpPtq+utxpGvqCMxLU46Wk6nhvTHQpws2fHMeu09ooBMb50hMDPbBjLF9Eabyate12nNepIiZxQQREUnKnJ3NNRpNs+31q9s1Jy0tDYsXL25y/OLFi3B3dzcjctskiiKqq6tRUVFhd3dVLYl5acoRc+IjB14Z3xMvj/XGzVotOivkcJPLAFTjwoXqdj2HPeelsrISgHWLChYTRETkFJKTk416M37++WcEBwc7zDLSRER6lZWV8PDwsMprsZggIiJJmbOzua+vr0ntAUChUEChUBged+nSBRcuXIC7u7vd3X1sTUVFBQIDA3HhwgWHmgtyp5iXppiT5tlzXkRRRGVlJXr16mW112QxQUREkrp1Z/OYmBgAv+1snpiY2Ow5ERERyM3NxQsvvGA4tnv37hZ3Qm+OTCZDQEDAnYRu07p27Wp3H4SsgXlpijlpnr3mxVo9EnosJoiISHKm7mw+b9483HfffXjrrbfwhz/8AVu3bsWhQ4ewbt06KS+DiMjpsJggIiLJmbqz+b333osPP/wQCxcuxCuvvIL+/fsjOzub8x+IiKyMxQQREdmExMTEFoc15eXlNTk2ZcoUTJkyxcJR2R+FQoHU1FSj+SHEvDSHOWke82IablpHRERERERmkbXdhIiIiIiIqCkWE0REREREZBYWE0REREREZBYWE0REREREZBYWE0REREREZBYWE0RERHZm9erVUKlUUCqVCA8Px4EDB1psm5mZicjISHTr1g3dunVDVFRUq+3tlSk5udXWrVshCIJh93VHY2pebty4geeffx5+fn5QKBQYMGAAdu7caaVorcfUvKxcuRIDBw5Ep06dEBgYiBdffBE1NTVWita2sZggIiKyI1lZWUhKSkJqaiqOHDmC4cOHIzo6GmVlZc22z8vLw1NPPYW9e/eioKAAgYGBeOCBB/Dzzz9bOXLLMTUnemq1Gi+//DIiIyOtFKl1mZqXuro6TJw4EWq1Gtu2bcPp06eRmZkJf39/K0duWabm5cMPP8SCBQuQmpqKoqIibNiwAVlZWXjllVesHLlt4j4TREREdiQ8PByjRo3CqlWrAAA6nQ6BgYH4y1/+ggULFrR5vlarRbdu3bBq1SrExcVZOlyrMCcnWq0W48ePx5///Gfs27cPN27cQHZ2thWjtjxT85KRkYG///3vOHXqFFxdXa0drtWYmpfExEQUFRUhNzfXcOyll17Cd999h/z8fKvFbavYM0FERGQn6urqcPjwYURFRRmOyWQyREVFoaCgoF3PcfPmTdTX18PLy8tSYVqVuTlZsmQJevbsiRkzZlgjTKszJy/bt29HREQEnn/+efj4+GDo0KFYtmwZtFqttcK2OHPycu+99+Lw4cOGoVDnzp3Dzp078fDDD1slZlvnInUARERE1D5Xr16FVquFj4+P0XEfHx+cOnWqXc8xf/589OrVy+jDlD0zJyf5+fnYsGEDCgsLrRChNMzJy7lz5/DVV19h6tSp2LlzJ86cOYPnnnsO9fX1SE1NtUbYFmdOXv70pz/h6tWrGDduHERRRENDA5599lkOc/oVeyaIiIicxPLly7F161Z89tlnUCqVUocjicrKSjz99NPIzMyEt7e31OHYFJ1Oh549e2LdunUIDQ1FbGwsXn31VWRkZEgdmqTy8vKwbNky/Otf/8KRI0fw6aefYseOHVi6dKnUodkE9kwQERHZCW9vb8jlcpSWlhodLy0tha+vb6vnpqenY/ny5dizZw+GDRtmyTCtytScnD17Fmq1GpMmTTIc0+l0AAAXFxecPn0ad999t2WDtgJzflb8/Pzg6uoKuVxuODZ48GBoNBrU1dXBzc3NojFbgzl5WbRoEZ5++mkkJCQAAO655x5UV1dj1qxZePXVVyGTOfe9eee+eiIiIjvi5uaG0NBQo4mgOp0Oubm5iIiIaPG8N998E0uXLkVOTg7CwsKsEarVmJqTQYMG4dixYygsLDR8Pfroo5gwYQIKCwsRGBhozfAtxpyflbFjx+LMmTOG4goAfvzxR/j5+TlEIQGYl5ebN282KRj0BRfXMQIgEhERkd3YunWrqFAoxE2bNoknT54UZ82aJXp6eooajUYURVF8+umnxQULFhjaL1++XHRzcxO3bdsmXr582fBVWVkp1SV0OFNzcrv4+Hjxscces1K01mNqXkpKSkR3d3cxMTFRPH36tPj555+LPXv2FF9//XWpLsEiTM1Lamqq6O7uLv773/8Wz507J+7atUu8++67xSeeeEKqS7ApHOZERERkR2JjY3HlyhWkpKRAo9EgJCQEOTk5hgmlJSUlRndR16xZg7q6OkyePNnoeVJTU/Haa69ZM3SLMTUnzsLUvAQGBuLLL7/Eiy++iGHDhsHf3x/z5s3D/PnzpboEizA1LwsXLoQgCFi4cCF+/vln9OjRA5MmTcLf/vY3qS7BpnCfCSIiIiIiMovzlelERERERNQhWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZXKQOgIhIT6vVor6+XuowiOyKq6sr5HK51GEQkZNiMUFEkhNFERqNBjdu3JA6FCK75OnpCV9fXwiCIHUoRORkWEwQkeT0hUTPnj3RuXNnfiAiaidRFHHz5k2UlZUBAPz8/CSOiIicDYsJIpKUVqs1FBLdu3eXOhwiu9Op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9fX1CAwMxMyZM/HKK69AEATs3LkTr776KqZPn44rV67A19cX48ePh4+PT5vPf//998PLywunT5/Gn/70p1bbxsfHo6amBm+//TZefvlleHt7Y/LkyQBwx3E4q5ycHPj5+cHFxQXdunXD8OHD8c9//hPx8fGGuSvtyWu/fv3wxz/+EQ8//DCuX7+ORx55BP/6178M3587dy7Ky8vx0ksvoaysDMHBwdi+fTv69+8PoHGi/z//+U8sWbIEKSkpiIyMbHZoFRGRVARRFNs56piIqOPV1NTg/Pnzhn0WTPX+/mIsyj4OmUww6qGQywTodCKWxgzFtDF9OjJksqD/njgB9eOT291e9ck2dBoyxIIRme+1115Ddna2VXavvtPfIyIic7Fngojs2rQxfTDI1x3r889j1wmN0Q7YCeP6WnQHbOp48mYmpHdkeyIi6lgsJojI7oWpvBCm8kJNvRaVNQ1wV7pYZOUmsjw3lQp353zRrp2t5XfdBTdOKicikhSHORGRpDg8g+jO8feIiKTCTeuIiIiIiMgsLCaIyCawk5TIfPz9ISKpsJggIkm5uroCAG7evClxJET2S//7o/99IiKyFk7AJiJJyeVyeHp6oqysDADQuXNnCIIgcVRE9kEURdy8eRNlZWXw9PSEXM6FB4jIujgBm4gkJ4oiNBoNbty4IXUoRHbJ09MTvr6+LMSJyOpYTBCRzdBqtaivr5c6DCK74urqyh4JIpIMiwkiIiIiIjILJ2ATEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZWEwQEREREZFZ/j9r4wMEBkWCdAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_env_random_batch_instances(env, n=4)" ] }, { "cell_type": "markdown", "id": "3de655c8-3832-43fc-99eb-d5aca741773f", "metadata": {}, "source": [ "and now, perform an episode rollover:" ] }, { "cell_type": "code", "execution_count": 12, "id": "f4f58ca2-4a3b-48a4-ad24-761e55b03ed2", "metadata": {}, "outputs": [], "source": [ "while not td[\"done\"].all(): \n", " td = env.sample_action(td) # this is where we insert our policy\n", " td = env.step(td)" ] }, { "cell_type": "markdown", "id": "0a061195-e496-49e4-bd7b-5226e05cd468", "metadata": {}, "source": [ "and we can visualize the solution:" ] }, { "cell_type": "code", "execution_count": 13, "id": "2b1499f6-15a7-47ca-8b6a-6faefa63e29d", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlkAAAJkCAYAAAAiHDQ0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA0GxJREFUeJzs3Xd4FVX6wPHv3JreCwlpJKGEGgglJICIIgoiCri2FXt31XV/ruuuNHtfV9e17erqrrhYsFBEpSm9F+kJISQhvffbZn5/XBOMCRAgyU3I+3keHmDmzMyZDLm8Oeed9yiapmkIIYQQQog2pXN1B4QQQgghzkcSZAkhhBBCtAMJsoQQQggh2oEEWUIIIYQQ7UCCLCGEEEKIdiBBlhBCCCFEO5AgSwghhBCiHUiQJYQQQgjRDiTIEkIIIYRoBxJkCSGE4N///jeKopCZmdmm5x0/fjzjx49v03MK0VVIkCUEcOTIEe666y5iY2Nxc3PDx8eH1NRU/va3v1FXV8eOHTtQFIXHH3/8pOdIS0tDURQefvhhAObNm4eiKI2/jEYjMTExPPDAA5SXlzc7PiYmpkn7kJAQxo4dyxdffAGc+E/wdL9iYmJ44YUXUBSFnTt3NrmGpmn4+/ujKApHjx5tsq++vh6z2cz1119/yq/V+PHjGThwYGu+rGdlwYIFvPrqq+12/vNFdXU1c+fOZeDAgXh6ehIYGEhiYiIPPvggubm5HdqX/fv3M2/evDYP0ITo6gyu7oAQrrZ06VKuvvpqzGYzs2bNYuDAgVitVtatW8cjjzzCvn37eOedd+jXrx8ff/wxTz31VIvnWbBgAQC//e1vm2x/88038fLyoqamhpUrV/L666+zY8cO1q1b1+wciYmJ/OEPfwAgNzeXt99+m+nTp/Pmm29yySWX8J///KdJ+9tvv52RI0dy5513Nm7z8vIiJCQEgHXr1jF06NDGffv27aO8vByDwcD69evp1atX476tW7ditVoZM2bMmXz52tyCBQvYu3cvDz30kEv70ZnZbDbGjRvHwYMHuemmm/jd735HdXU1+/btY8GCBVx11VWEh4d3WH/279/P/PnzGT9+PDExMU32fffddx3WDyE6GwmyRLd29OhRrr32WqKjo1m1ahVhYWGN++677z7S09NZunQpADfccAOzZ89m06ZNJCcnNzvXxx9/TL9+/Rg2bFiT7TNnziQoKAiAu+66i2uvvZaFCxeyZcsWRo4c2aRtz549mwRps2bNIj4+nr/+9a/cfffdxMbGNmnfsO3XgZ3VasXNzY1169bxu9/9rnH7+vXrCQwMZPjw4axbt67JcQ1Bn6uDLHF6X375JTt37uSjjz5qNvJYX1+P1Wp1Uc+aM5lMru6CEC4j04WiW3vhhReorq7mX//6V5MAq0F8fDwPPvgg4Ayy4MSI1S9t376dQ4cONbY5lbFjxwLOKcrT6dGjBwkJCc2m9k7HZDIxYsQI1q9f32T7+vXrGT16NKmpqS3u8/PzO6upQEVRuP/++/nyyy8ZOHAgZrOZAQMGsHz58ibtqqqqeOihh4iJicFsNhMSEsLEiRPZsWMH4JyKXLp0KceOHWsy/QnOwHHOnDkkJSXh6+uLp6cnY8eOZfXq1U2ukZmZiaIovPTSS7zzzjvExcVhNpsZMWIEW7dubdb3gwcP8pvf/Ibg4GDc3d3p27cvf/nLX5q0OX78OLfeeiuhoaGN9/bee++d8deprTT820lNTW22r2G6+5dWrVrF2LFj8fT0xM/Pj2nTpnHgwIHTXkdRFObNm9dse0xMDDfffDPgnMa++uqrAbjwwgsbn9uaNWuAlnOyCgsLue222wgNDcXNzY0hQ4bwwQcfNGlzps9RiM5IRrJEt7Z48WJiY2NJSUk5bdtevXqRkpLCJ598wl//+lf0en3jvobA63T5TEBj3oq/v/9p29psNrKzswkMDDxt218bM2YMa9euJTMzszFQWb9+feMU49y5cykvL8fPzw9N09iwYQOjR49Gpzu7n73WrVvHokWLuPfee/H29ua1115jxowZZGVlNfb/7rvv5rPPPuP++++nf//+lJSUsG7dOg4cOMCwYcP4y1/+QkVFBTk5Ofz1r38FnNOfAJWVlfzzn//kuuuu44477qCqqop//etfTJo0iS1btpCYmNikPwsWLKCqqoq77roLRVF44YUXmD59OhkZGRiNRgD27NnD2LFjMRqN3HnnncTExHDkyBEWL17M008/DUBBQQHJycmNgWRwcDDffPMNt912G5WVlS6Z1oyOjgbgww8/5PHHH0dRlJO2XbFiBZdddhmxsbHMmzePuro6Xn/9dVJTU9mxY0ez6b0zNW7cOB544AFee+01/vznP5OQkADQ+Puv1dXVMX78eNLT07n//vvp1asXn376KTfffDPl5eWNP9Q0aM1zFKLT0oTopioqKjRAmzZtWquPeeONNzRA+/bbbxu3ORwOrWfPntro0aObtJ07d64GaIcOHdKKioq0zMxM7b333tPc3d214OBgraampkn76Oho7ZJLLtGKioq0oqIibffu3dq1116rAdrvfve7Fvvj6emp3XTTTS3uW7p0qQZo//nPfzRN07S8vDwN0H744QetqqpK0+v12tKlSzVN07S9e/dqgPb000+f9mtwwQUXaAMGDGiyDdBMJpOWnp7euG337t0aoL3++uuN23x9fbX77rvvlOefMmWKFh0d3Wy73W7XLBZLk21lZWVaaGioduuttzZuO3r0qAZogYGBWmlpaeP2r776SgO0xYsXN24bN26c5u3trR07dqzJeVVVbfzzbbfdpoWFhWnFxcVN2lx77bWar6+vVltbe8r7aQ+1tbVa3759NUCLjo7Wbr75Zu1f//qXVlBQ0KxtYmKiFhISopWUlDRu2717t6bT6bRZs2Y1bnv//fc1QDt69GjjNkCbO3dus3NGR0c3+Xf36aefaoC2evXqZm0vuOAC7YILLmj8+6uvvqoB2n//+9/GbVarVRs9erTm5eWlVVZWapp2Zs9RiM5KpgtFt1VZWQmAt7d3q4+55pprMBqNTaYMf/jhB44fP37SqcK+ffsSHBxMTEwMt956K/Hx8XzzzTd4eHg0a/vdd98RHBxMcHAwQ4YM4dNPP+XGG2/k+eefP8O7g5SUFHQ6XWOu1fr16zEajYwYMQIvLy8GDx7cOGXY8Pu55GNdfPHFxMXFNf598ODB+Pj4kJGR0bjNz8+PzZs3n9Xbb3q9vjG/R1VVSktLsdvtDB8+vHG68ZeuueaaJqOFDdO0Df0pKirixx9/5NZbbyUqKqrJsQ0jQ5qm8fnnnzN16lQ0TaO4uLjx16RJk6ioqGjx2u3N3d2dzZs388gjjwDOKbvbbruNsLAwfve732GxWADIy8tj165d3HzzzQQEBDQeP3jwYCZOnMiyZcs6vO/Lli2jR48eXHfddY3bjEYjDzzwANXV1fzwww9N2p/uOQrRmcl0oei2GvJWqqqqWn1MYGAgkyZN4osvvuCtt97Czc2NBQsWYDAY+M1vftPiMZ9//jk+Pj4UFRXx2muvcfToUdzd3VtsO2rUKJ566ikURcHDw4OEhAT8/PzO+N7AGdAMGDCgSSA1dOjQxmunpKQ02WcymRoT8aurq6murm48l16vJzg4+JTX+3WgAs4p0bKyssa/v/DCC9x0001ERkaSlJTE5MmTmTVrVrOE/pP54IMPePnllzl48CA2m61x+y/fkjxZfxr+o27oT8N/0qfKQSsqKqK8vJx33nmHd955p8U2hYWFJz2+tLT0rJPQAwICTpk07uvrywsvvMALL7zAsWPHWLlyJS+99BJ///vf8fX15amnnuLYsWOAM9D/tYSEBL799ltqamrw9PQ8qz6ejWPHjtG7d+9m09IN04sNfW5wuucoRGcmQZbotnx8fAgPD2fv3r1ndNxvf/tblixZwpIlS7jiiiv4/PPPueSSS04ahIwbN67x7cKpU6cyaNAgbrjhBrZv397sP5qgoCAuvvjis7uhFowZM4a33nqL8vJy1q9f3yT3LCUlhffeew+bzca6detISkrCzc0NgJdeeon58+c3to2Ojj5tDaRf5qj9kqZpjX/+zW9+01j767vvvuPFF1/k+eefZ9GiRVx22WWnPP9///tfbr75Zq688koeeeQRQkJC0Ov1PPvssy2+RNCa/pyOqqqA85nfdNNNLbYZPHjwSY+fPn16s5GZ1lq9enWri3hGR0dz6623ctVVVxEbG8tHH3100lIjbcHhcLTbuX+tLZ6jEK4iQZbo1i6//HLeeecdNm7cyOjRo1t1zBVXXIG3tzcLFizAaDRSVlbWqrcKwZnEPXfuXG655RY++eQTrr322nPp/mmNGTOGN998kxUrVrBz587G6SVwBll1dXUsXbqUjIwMZsyY0bhv1qxZTaYOTzbydjbCwsK49957uffeeyksLGTYsGE8/fTTjUHWyZK4P/vsM2JjY1m0aFGTNnPnzj2rfjSMnp0qyA4ODsbb2xuHw3FWwe/LL7981iMuQ4YMOeNj/P39iYuLa7ynhgT5Q4cONWt78OBBgoKCTjmK5e/v36xwrtVqJS8vr8m2UyXe/1p0dDR79uxBVdUmP2QcPHiwSZ+FOB9IkCW6tT/+8Y989NFH3H777axatYrQ0NAm+48cOcKSJUuavPHk7u7OVVddxcKFC6mtrcXT05Np06a1+poN9baef/75DgmyAF555RVsNluTkayYmBjCwsJ44YUXmrQFZwDS2im81nI4HFRXV+Pr69u4LSQkhPDw8MYcIgBPT08qKiqaHd8woqFpWuN/6ps3b2bjxo0tTlWeTnBwMOPGjeO9997j4YcfbnKOhmvo9XpmzJjRWCD111OLRUVFp5xGTUpKOuN+tcbu3bvp2bNn4whpg2PHjrF///7G6cGwsDASExP54IMPeOyxxxqnnvfu3ct3333XrL7ar8XFxfHjjz822fbOO+80G8lqCNRaWsng1yZPnsx3333HwoULG/Oy7HY7r7/+Ol5eXlxwwQWnPYcQXYUEWaJbi4uLY8GCBVxzzTUkJCQ0qfi+YcOGxlfLf+23v/0tH374Id9++y033HDDGeW0GI1GHnzwQR555BGWL1/OpZde2oZ31FRUVBSRkZFs3LiRmJiYZlXAU1JS+Pzzz1EUpcWaS22pqqqKiIgIZs6cyZAhQ/Dy8mLFihVs3bqVl19+ubFdUlISCxcu5OGHH25M0p86dSqXX345ixYt4qqrrmLKlCkcPXqUt956i/79+zfJHzsTr732GmPGjGHYsGHceeed9OrVi8zMTJYuXcquXbsAeO6551i9ejWjRo3ijjvuoH///pSWlrJjxw5WrFhBaWlpW3x5zsj333/P3LlzueKKK0hOTsbLy4uMjAzee+89LBZLk9pWL774IpdddhmjR4/mtttuayzh4Ovr22INrF+6/fbbufvuu5kxYwYTJ05k9+7dfPvtt82Cu8TERPR6Pc8//zwVFRWYzWYmTJjQuPLAL9155528/fbb3HzzzWzfvp2YmBg+++wz1q9fz6uvvnpGL6II0em58M1GITqNw4cPa3fccYcWExOjmUwmzdvbW0tNTdVef/11rb6+vll7u92uhYWFaYC2bNmyFs/ZUMKhqKio2b6KigrN19e3yavt0dHR2pQpU86o36cq4dDguuuu0wDt+uuvb7bvlVde0QAtISGh1dc8WQmHlkoz/PJVf4vFoj3yyCPakCFDNG9vb83T01MbMmSI9o9//KPJMdXV1dr111+v+fn5NZYo0DRnWYVnnnlGi46O1sxmszZ06FBtyZIl2k033dSk5EPDq/8vvvhis/7QQkmCvXv3aldddZXm5+enubm5aX379tVmz57dpE1BQYF23333aZGRkZrRaNR69OihXXTRRdo777zTyq9a28rIyNDmzJmjJScnayEhIZrBYNCCg4O1KVOmaKtWrWrWfsWKFVpqaqrm7u6u+fj4aFOnTtX279/fpE1LJRwcDof26KOPakFBQZqHh4c2adIkLT09vVkJB03TtHfffVeLjY3V9Hp9k3IOvy7hoGnOr+ctt9yiBQUFaSaTSRs0aJD2/vvvN2lzps9RiM5I0TTJHhRCCCGEaGtSJ0sIIYQQoh1IkCWEEEII0Q4kyBJCCCGEaAcSZAkhhBBCtAMJsoRwoQceeICYmBgURWksGQDOGlZ9+/YlMTGRxMREFi5c6LpOCiGEOCvdrk6Wqqrk5ubi7e19RlWKhWgPl112Gffccw+XXnop1dXVjYtWa5rGv/71ryZLtjTsE0II4aRpGlVVVYSHhzdbpqwz6HYlHHJycoiMjHR1N4QQQgjRRrKzs4mIiHB1N5rpdiNZDdWEs7Oz8fHxcXFvRANN06ioqMDX17dbjjAOGjSIjz76qHHkatCgQXh7e6NpGsOGDWP+/PnNqmx3lO7+bDo7eT6dlzyb9ldZWUlkZGSnXSmg2wVZDf/QfXx8JMjqRDRNQ9M0fHx8uuWHkaIoeHl5Nf6bXLt2LVFRUdhsNh5//HHuv/9+li1b5pK+dfdn09nJ8+m85Nl0nM769e12QZYQXUHDYsVGo5GHHnqIPn36uLhHQgghzlTnyxITopurqamhvLy88e8ff/wxQ4cOdV2HhBBCnBUZyRLChe666y6WLl1Kfn4+kyZNwtvbm++++44ZM2bgcDjQNI3Y2Fg+/PBDV3dVCCHEGZIgSwgXevvtt1vcvnPnzg7uiRBCiLYm04VCtJOiKgtv/3CE2V/u5e0fjlBUZXF1l4TotE5WmDctLY2UlBT69OnDiBEj2Ldvn+s6KcQZkiBLiHawYn8Bqc+v4vnlB/l4SxbPLz9I6vOrWHmgwNVdE6JTmjlzJuvWrSM6OrrJ9rvuuos777yTw4cP8+ijj3LzzTe7poNCnAUJsoRoY0VVFu5dsAObXUXVwK5qqBrY7Cr3fLRDRrSEaMG4ceOaFZMsLCxk27Zt/Pa3vwVgxowZZGdnk56e7oouCnHGJMgSoo0t2pGD3aHy66UUNMDuUPliZ44ruiVEl5OdnU1YWBgGgzN9WFEUoqKiyMrKcnHPhGgdCbKEaGM5ZXXoTlIYT6coZJfWdXCPhBBCuIIEWUK0sQh/d9STLAmqahqRAe4d3CMhuqbIyEjy8vKw2+2As4J6VlZWY7FeITo7CbKEaGPTh0Vg0Ov49ViWAhj0OqYP63yLmArRGYWEhDBs2DD++9//AvD5558TERFBfHy8i3smROtIkCVEGwv2NvPmDcMwGnToFDDoFHQKGA063rxhGEFeZld3UYhO56677iIiIoKcnBwmTZrUGEi9/fbbvP322/Tp04fnnnuO999/38U9FaL1FE07ybzGeaqyshJfX18qKipkgehO5Hxcrb6oysIXO3PILq0jMsCd6cMiumSAdT4+m/OJPJ/OS55N++vs/6dLxXch2kmwt5k7x8W5uhviFC655BLy8/PR6XR4e3vz2muvyTqR7aCoysKiHTnklNUR4e/8gSPYu+v9wCHEmZIgSwjRbX3yySf4+fkB8MUXX3DzzTeze/du13bqPLNifwH3LtiB3aGiUxRUTePl7w/z5g3DuCgh1NXdE6JdSU6WEKLbagiwACoqKmRKp41JYV7R3clIlhCiW5s1axarV68GYNmyZS7uzfmlNYV5ZUpdnM9kJEsI0a19+OGHZGdn89RTT/Hoo4+6ujvnFSnMK7o7CbKEEAK46aabWL16NSUlJa7uynlDCvOK7k6CLCFEt1ReXk5ubm7j37/88ksCAwMJCAhwYa/OL1KYV3R3kpMlhOiWKioquPrqq6mrq0On0xEcHMySJUsk+b0NNRTmveejpm8XGvRSmFd0DxJkCSG6pejoaLZs2eLqbpz3LkoIZf2jE86LwrxCnCkJsoQQ5yUpgNl5SGFe0V1JkCWEOO9IAUwhRGcgie9CiK7nwGL4+0hYcC388CKkr4TaUkAKYAohOg8JsoQQZ+2BBx4gJiYGRVHYtWvXabe3maJDUJ0PGathw2uw6A74RzK8dxn5//sdd7AIHyqZbfgP9+q/BJoWwBRCiI4gQZYQ4qzNnDmTdevWER0d3artbSZ8KOgM4LA5f9VXQHUhZG1k4PFP+IP+U/5reo7L9RuZZfgeHSogBTCFEB1LgiwhxFkbN24cERHNax2dbPs50zQoz4LKPLDVgeYAez1oakMDQMOOju8cSQAoaLhhBaQAphCiY0niuxCi81JVKEmDnG1wfBvkbIXqop/32U+0U/SAA/RmHJ49uKVkFhscfbnesBodKh5YqMNNCmAKITqUBFlCiM7DYYOCfc5g6vh256/6yqZt9EYIHQCWSji+0zmKpdnB5A3BfTFc9Ra3Fnqx9aMd1GlmPJU6PJV6KvX+UgBTCNGhJMgSQriOrQ5yd/08SrUN8naBrb5pG6ObMwer53CIGA5hQ8DoDgeXwlf3O/Ox3HwhOgWm/R3c/bkoENY/OgHlbV9M9VbuHxXOheMulABLCNGhJMgSQnSc+grn6FTOdmdglb+36bQfOAOmnknOgCpiOIT0d45e/VrECNCbwMMfBv0GJj7RpF2wtxkC/KG0nKsHBYAEWEKIDiZBlhDirN11110sXbqU/Px8Jk2ahLe3N+np6U23X3wh3mYd6c+kQHGaM3n9l7xCnAFTxHDn7wFxoGvFOzleITDlJVAd0H8atLTmoNHD+bu15txvVgghzpAEWUKIs/b222+f+EvDm38/fcbbVwXAiAQo9zyxv+iw83f/mBOjVD2Hg29EywFSayRMPfV+08/Xt0nZBiFEx5MgSwjRohNr/9US460wdYQbIT5uJxqoKhQfPvHWX852qClqehJFgeB+JwKqiOHgGdRxN9EQZMlIlhDCBSTIEkI088u1//QKhHlovLI6g/cv82Ck8ejPJRW2g6Wq6YF6I/QYdCKoCh8Kbj6uuQlwJsgD2CTIEkJ0PAmyhBBN/HLtv1jlOBcpOxltTyNOl4n5OzsOLxP6huk9k8cv3vwb4QywjG6nvkBHahzJqnVtP4QQ3ZIEWUKIJhbtyMHuUDFj4UPTcxhwoAccCpRrXpT7DKNv0gTnaFVwAug78ceIUaYLhRCu04k/HYUQrpBTVodOUbBoRhbaL6S3ksMAQzaf2VJ5n8uZGRrHk8MHurqbrWP6+e1Cm4xkCSE6nqxdKIRoIsLfHVXT0NDxmmM6KBBDLg8bP+MbwyNML/uns4Dor0sxdEZGCbKEEK4jQZYQoonpwyIw6HU0FFX4wp6KAx16VKKUAobkfQofzYT3L4PNbzsXa+6sGnOyql3bDyFEtyRBlhCiiWBvM2/eMAyjQYdOgU3KEIrxB0BRFHS2WqgthdydsPoZePdCOLLaxb0+icZipDKSJYToeJKTJYRo5qKEUNY/OoEvduaQXVpLVV4yPUpWojgszgaK3rkws63GWbZBdbi2wydj8nL+LtOFQggXkCBLCNGiYG8zd46LQ9M0ardMgjXrnesMqg7QrKDowCMQLp4PvS92dXdbJonvQggXkulCIcRp2SNTnIsxa+rPJRt+ztgKGQBDrnVp306poRiplHAQQriABFlCiNPSPIKgx2BnoKXonEvjuAdC0UH4bnbnfdOwYbpQcrKEEC4gQZYQonVixzvf1vMJg2v+C1e96Qy49n4Oa57rnIFWYwkHGckSQnQ8yckSQrTOsFmg2qDPZRDSz7lt0tOw/DHY/m/nGoWj73NpF5tpyMmyW8Fh79zV6YUQ5x35xBFCtI7ZG8b8vum2gdOdNahWPQ3rXwOzDwy70TX9a0nDdCE4k9/1LlysWgjR7ch0oRDi3AybBSm/c/551VOw7wvX9ueX9EbnL5A3DIUQHU6CLCHEuRt9HyTd7Pzzt3+BtBUu7U4T8oahEMJFJMgSQpw7RYHxf3JOH6oOWPIQHNvo6l45NS6tI0GWEKJjSZAlhGgbigITn4Q+l4DDBl/e41x6x9WMPwdZMl0ohOhgEmQJIdqO3gCTX4aYVLDVwed3QNEh1/ap4Q1DGckSQnQwCbKEEG3LYIIr/g7hQ8FSBZ/dBmXHXNcfoyytI4RwDQmyhBBtz+QB09+B4L5QUwSf3gxVBS7qS0NOlgRZQoiOJUGWEKJ9uPnAzPfAPxoqc+GzW6C2tOP70TCSZa3u+GsLIbo1CbKEEO3HMwhmvg/eoVByBD6/3TmF2JFMMl0ohHANCbKEEO3Lt6cz0PIIgIJ98MXdYKvvuOvLItFCCBeRIEsI0f4C42DGv8DsBTnbYPGDzjIPHaGhGKksEi2E6GASZAkhOkZof7jqbTCYIWMNfPNHZ+HS9taYkyUjWUKIjiVBlhCi40QMhyteB50BDi6DlfNB09r3mg3ThZKTJYToYBJkCSE6VuwFMPlFZ4X43Qth7cvtez0pRiqEcBEJsoQQHa/fZOcSPABb3nX+ai9SjPS8sWzZMoYNG0ZiYiIDBw7kgw8+cHWXhDglg6s7IITopgZfDZYK+OFF+PEl57Re4nVtfx0pRnpe0DSN3/72t6xZs4bBgweTmZlJv379mD59Ot7e3q7unhAtkpEsIYTrjLgdku92/nnlfDiwpO2v0TiSJdOFXZ2iKJSXlwNQWVlJYGAgZrPZtZ0S4hRkJEsI4VqpDzkLlO78CL551DnyFHdh252/cSRLgqyuTFEUFi5cyPTp0/H09KSsrIxFixZhMplc3TUhTkpGsoQQrqUocOHj0P8KUO2w+AHI3tJ2528Ismx1bXdO0eHsdjtPPfUUixYt4tixY6xcuZIbb7yR4uJiV3dNiJOSIEsI4Xo6HUx6BuImgN3qrAqf/1PbnLthutBh67gCqKLN7dq1i9zcXMaNGwfAiBEjiIiIYOfOnS7umRAnJ0GWEKJz0Bth6qsQNco5tff57VCcfu7nbaj4DrJIdBcWGRlJXl4eBw4cACA9PZ0jR47Qt29fF/dMiJOTnCwhROdhMMO0f8CnNztHsj67Ga79GPwiz/6ceiPoTeCwOt8wdPdvq96KDhQaGso777zDb37zG3Q6Haqq8ve//52oqChXd02Ik5IgSwjRuZi9YMa7sPBGKE6Dz26Faz8Cr5CzP6fJE+qsUiuri7vuuuu47rp2KPMhRDtx+XThG2+8QUxMDG5ubowaNYotW06d8Prqq6/St29f3N3diYyM5Pe//z319fUd1FshRIdw94eZ7zlHsMqznIFWXfnZn6+x6rtMF3ZGRVUW3v7hCLO/3MvbPxyhqMri6i4J0SZcOpK1cOFCHn74Yd566y1GjRrFq6++yqRJkzh06BAhIc1/al2wYAF/+tOfeO+990hJSeHw4cPcfPPNKIrCK6+84oI7EEK0G68QZ6D1v+udI1qL7oSr3z/xtuCZaKyVJW8YdjYr9hdw74Id2B0qOkVB1TRe/v4wb94wjIsSQl3dPSHOiUtHsl555RXuuOMObrnlFvr3789bb72Fh4cH7733XovtN2zYQGpqKtdffz0xMTFccsklXHfddacd/RJCdFF+UTDzfXDzhbzd8OW9YD+LUQ6p+t4pFVVZuHfBDmx2FVUDu6qhamCzq9zz0Q4Z0RJdnstGsqxWK9u3b+exxx5r3KbT6bj44ovZuHFji8ekpKTw3//+ly1btjBy5EgyMjJYtmwZN95440mvY7FYsFhOfKNWVlYCziUaNE1ro7sR56rhecgz6Xxc/mwC42H6O/DZLZC1CZb8Hqb+DXRn8PFl/MV04Xn2b8zlz+ccLNqejcPhAED51T6Hw8EXO7K5Y1xcx3esjXTlZ9NVdPavrcuCrOLiYhwOB6GhTYeDQ0NDOXjwYIvHXH/99RQXFzNmzBg0TcNut3P33Xfz5z//+aTXefbZZ5k/f36z7RUVFZ3+4XQnmqZRXe3Ml1GUX3/cClfqFM/GIwb9xS/g+c1DkPY9tsWPUHfBHFBaNxjvjgGjplJXUYytoqJ9+9rBOsXzOUul5RVEeirYW/gsNigKJWUVVHTh59WVn01X0TBw0ll1qbcL16xZwzPPPMM//vEPRo0aRXp6Og8++CBPPvkks2fPbvGYxx57jIcffrjx75WVlURGRuLr64uPj09HdV2cRkPA6+vrKx9GnUyneTa+F4Ppdfj6fkzp32DyDoQL/+KsGH86nv6g6PAwaODr2/597UCd5vmchQA/X7Jr8lBb+HlXp2gE+vvi24WfV1d+Nl1FZ/+6uizICgoKQq/XU1BQ0GR7QUEBPXr0aPGY2bNnc+ONN3L77bcDMGjQIGpqarjzzjv5y1/+gk7X/Kdas9nc4gKiiqJ0+ofT3TQ8E3kunU+neTbxE+DS5+CbP8LO/zpztVIfOP1xv1xax9X30A46zfM5Q9OTInl5RRqqXeWXcZYC6PU6pidFdrl7+rWu+my6is7+dXVZ4rvJZCIpKYmVK1c2blNVlZUrVzJ69OgWj6mtrW0WSOn1eqDzz8sKIdpI/ytgws8j1xvfgG0tvyjTRGNOliwS3ZkEe5t584ZhGA06dAoYdAo6BYwGHW/eMIwgr+Y/IAvRlbh0uvDhhx/mpptuYvjw4YwcOZJXX32VmpoabrnlFgBmzZpFz549efbZZwGYOnUqr7zyCkOHDm2cLpw9ezZTp05tDLaEEN3A0BvAUgXr/gprngezDwyaefL2DXWybCcPstLS0rjpppsoLi7G19eXf//73wwYMKCNOy5+7aKEUNY/OoEvduaQXVpHZIA704dFSIAlzgsuDbKuueYaioqKmDNnDvn5+SQmJrJ8+fLGZPisrKwmI1ePP/44iqLw+OOPc/z4cYKDg5k6dSpPP/20q25BCOEqo+5yBlpb/wnfzQaTF/S9tOW2rSjhcNddd3HnnXdy880389lnn3HzzTezdevWdui4+LVgbzN3duG3CIU4GUXrZvNslZWV+Pr6UlFRIYnvnYimaVRUVEiCaCfUqZ+NpsH3s2HPp841Cq98E3qNde6rLYVD34ClErI2Q9p34NsTopKd04Y9BkHqQ6AoFBYWEh8fT2lpKQaDAU3TCAsLY926dcTHx7v0Fk+nUz+fbk6eTfvr7P+nd6m3C4UQoglFgYvng6XaGVB9dZ+zKnzPJNj4d9j+b3DYnL/s9VByBCpyAAWyN0PKA6Doyc7OJiwsDIPB8PNpFaKiosjKyur0QZYQovOSIEsI0bXp9DD5Refo1NEf0RbeiiX5KRStByaH6gzAdA05mxrYraA34Qgahe2AsyZf/ZEjaDab6+5BCHFekiBLCNH16Y1wxWuoH16H4/AP8MnNZK/1J3RoHR6hGopiQ9GD5tBQFBVHrUrW33/EUuFcXUKz28k9doza9HQ84uPRNI2srCyioqJcfGNCiK7MpWsXCiFEmzG6Y0n6M5YKI3qzSs/UcsrSPdDsSmNheEUBTVWoKzFhqTA2HhpoMNDfbOa/CxcC8PnnnxMRESFThUKIcyJBlhDi/GH0JHeDH7ZqAwZ3B0EDqqnONaM6fk46VkC1K5Qd8Wh26LwePfjXp5/Sp08fnnvuOd5///0O7rwQ4nwj04VCiPOKw6rn+Hp/IsaWYvSyo2kaqk1BZ3C+SG2t1lOT37wGUy+TmTUffYS71MYSQrQRGckSQpx37PV6jm/wx2HRYfJ2oNpOvD5fcdQDNHmdXgjR/iTIEkKcl2w1Bo5v8Ee16dCZHKCB5oCKLDdXd00I0U1IkCWEOG9ZK43kbvRDc+hJrx/MN9VXoNpkCS4hRMeQnCwhxHlLVXQUW6LYkzmWktDL0DQ9bsFphBdVuLprQohuQIIsIUSXZ7M6KM+vpTCtnqyoSdS5B1PnHkSNRyhWoycoOqxaNVaPgyRLgCWE6CASZAkhujRrvZ3PX9hOXZUVh9WOI2oimqJD1RnQlBMZEfWGeg5ZDzDNhX0VQnQvkpMlhOjSdHoFNLDWO7BZNex6HXa9AfUXC/JadfVs67magDxvF/ZUCNHdSJAlhOjSDEY9qVfHoxrtqJqKphiBhgBLQ0MlzyeDA27lqDQvQiqEEO1FgiwhRJfn19ONcqUYAAUFFXvjPqu+ng3RX2AvG0mxm5+LeiiE6I4kJ0sI0aXlHCxl3adp+GtB2BQV0NBpemewpTjY0XMFFeZKtJpYit1zXd1dIUQ3IkGWEKJLstscbFuayYGNeQCERQbgFl3IrjU1eFp90dCocCvipx5rUOuiUBUdpW4+OFDQo7V4Tr2nZ0feghDiPCdBlhCiyynNreGHjw9RXlgLQP/UcIZfFsM/fnqDo/7lDCwYjaqorIz9CFWnodYOAJ0eLSAI7/98TIhH848+vacnppiYDr4TIcT5TIIsIUSXoaka+9fnsu2bTFSHhruXiTG/6U1EX3++P/Y9n+z9iglVs7DqVDJD91DsnQOaAaM9FtWgQ9PrKe8RTXSkn6tvRQjRDUiQJYToEmorraz95DC5aeUARCYEMGZmb9y8jKSVpfH8lheJz0zG0xqMu58bO2O+R3G4EWWcwOTkC/luXwEVdTaCvc2uvREhRLchQZYQotM7tq+E9Z+lY6m1YTDqGHl5L/qM6oGiKFRYKpizfg5KkS/9ikZhUtzwHl9C1fEadLZI/jTmD4ztE8y94+NxqBoGvbxULYToGBJkCSE6LZvVwZbFRzm8JR+AwHBPxl3XF78QZ70rh+rg6U1Pk1maz4VHb0KvetB7eDD/rPknqqbhax9FclwgAIqiYNArJ72WEEK0NQmyhBCdUnFOFT9+fJiK4joUYOAFPRk6KRr9L0ai3t/3PpvyttIrZwT+tT3x9jETOsFGzg9ZKJqJybETMcrIlRDCRSTIEkJ0KqqqsfeH4+z87hiqquHhY2LsNX0Ij/dr0m5tzlo+OrAAyr0YnDsBk97ARTN7s+D4u1jsKvq6QUwdFOuamxBCCCTIEkJ0ItVlFtZ+cpj8jAoAYgYGkjIjHrOHsUm7rMosntvyHLUWB+OOXIdBMxE7IJCgAWZWfLEGDQgzpDKwp48L7kIIIZwkyBJCdApHdxexYdERrPV2DCY9ydNiiU8KQVGa5lHV2GqYvX42lZYaIrPHE1ITio+3kfFX9+GbY19TY7Wgs4UxLWF4s2OFEKIjSZAlhHApa72dzV9lkL6jEIDgSG/GXdsHnyD3Zm1VTeW5Lc+RVZWFVhnEsNwxmI16Ui+PxcvfzFcbFmNzqBhqh3PpwB4dfStCCNGEBFlCCJcpPFbJj/87TFVpPYqiMHhCBEMuimyS3P5LHx/8mPXH11NrgeT0WZjRExXrS0JqOLuLdpNRkQWqif6+KUQHyhI5QgjXkiBLCNHhVIfK7lU57FmVjapqePmZGXdtX0J7nTyHamv+Vt776T2sdpXQo9cSUeOJj5eRcb/pg06nsPjIYiw2B/r6RKaMjOm4mxFCiJOQIEsI0aEqS+pY+7/DFGZVARCXGEzylXGY3E/+cZRXnceTm57Eoanoykcwoqg37iY9SRdFERDmSXl9Oauzf8SmarjXjmBi/9COuh0hhDgpCbKEEB1C0zSO7Chi01dHsFkcmNwMjL4yjtihwac8rt5ez+wNs6m2VqO3RZBw9BI8NYUe4V4MmRAJwPLM5dRaLeisPRkVOYAgL1k6RwjhehJkCSHanaXOzsZF6RzdUwxAaIwPY6/pg3eA2ymP0zSNl7e9TEZ5Bnq8MKXNILZWh7e7kTEze6M36lA1lSUZS6i3qehrh3NpiiS8CyE6BwmyhBDtKj+jgh//d5iaCgs6nULixVEMujACne705RW+SP+ClVkrAQXr8atIKfPGw2RgQEoYPWJ9AdhVuIusihxUhwkv+2DG9z31yJgQQnQUCbKEEO3C4VDZ9X0WP63OQQN8At0Yd21fgqO8W3X87qLdvLn7TQD8rVPwy4/ET9MRGOjO8MtiGtstzlhMvV1FXzeUC3r3xNMsH2tCiM5BPo2EEG2uoqiOH/93iOKcagB6Dw9l1BWxGM36Vh1fXFfM/I3zcagOot1GkrN/EKOqdXh7GBh91Ykk+dL6UtblrMNiVzFKbSwhRCcjQZYQos1omsbhLQVsWZyB3aZidjeQMj2emMFBrT6HzWFj3oZ5lNeXE+YRTfq+8Ywt1+Ft1hM3JJjoAYGNbZcfXU6d3QaWnvgbI0iODTzFmYUQomNJkCWEaBP1NTbWf55O1r4SAMLi/Bh7TW88fc/sTb+/7/o7+0v242n0RCu6muhyAyGqDh9fM6OuOLHgs6qpLD26FMvPCe8T+4diPEkRUyGEcAUJsoQQ5yw3rYy1n6RRW2lFp1dImhTNgLE9UVqR3P5L3xz9hsVHFqOgMMzzNn7cY+KyKh3e7gZGXB6Dh4+pse32gu3kVudhtRkx1Q2QqUIhRKcjQZYQ4qw57Crblx9j39rjAPgGu3PBdX0J7Ol1xuc6WHqQV7e/CsBlUdeyaJU3KeXgYzLQs7cfvYc3LTC6JGMJVrsDXW0SPf18GdTT91xvRwgh2pQEWUKIs1KWX8MPHx+mLL8GgH7JYYyYEoPB1Lrk9ibnqi9j7oa52FQbo8JGs3l3f3rW1BGlGvDwcuZ1KcqJUbHiumI25G74uTZWEpcm92iyXwghOgMJsoQQZ0TTNA5uzGPr0kwcdhU3T2dh0Mj+AWd1Prtq58lNT1JUW0SEdwS+tVeTX1DMlCodXm4Ghk6MwifIvckx32Z+i81hx1HfE5M9lEsHyFShEKLzkSBLCNFqdVVW1n2WRs7BMgB69vFnzNW9m+RKnal3f3qXXYW7cDe4c3X0H3jyiyKSKxT8jQYCwz3pPza8SXtVU1masRSLXUVfM5x+YT7EBHme030JIUR7kCBLCNEq2QdKWf9ZOvU1NvR6HcOnxJCQEnZO03Srs1bz6aFPAfhd4h94Y2kVYfXQ267H7K4ndWZv9L96Y3Bb/jbya/Kx28zo6gZwaaqMYgkhOicJsoQQp2S3Odj17XGO7nCOXvn38OSC6/rg3+PcRo8yKjJ4YesLAFzb71o27Q2lpDyPqdV6PM0GBowNJyiieQL94ozFOFQNe9UgzIqJif1Dm7URQojOQIIsIcRJleRW8+PHhyjLr0XRKfQfE87wS2PQG8+tHlW1tZo56+dgcVgYFjqMOONU/vnTPoZVKQTpDfgEujF0YlSz44rritmYuxGL3YG+djjDY/wJ9j6zOlxCCNFRJMgSQjSjqRr71uWyfXkmqkPDzcvAuGv7EtH37JLbf0nVVJ7Z/Ay51bmEeoRy36BHueuD/QRaYJDNgMGkkDI9vsW3FJdlLEPVVBRrNDp7sNTGEkJ0ahJkCSGaqKmwsO6TNHLTywGITAhg0MQQQsL92+T8/9n/HzblbcKkNzEvZR6vrzhOZY2NK2oNeJj09E4KJby3X7PjHKqDpUeXYldVrGVD8TDqGN83pE36JIQQ7UGCLCFEo2N7S1j/WRqWOjsGo46Rl/ei98hQKisr2+T8G3I38MG+DwB4KOkhDmZ5sS4tm0E1OkIUPe5eRkZcHtPisVvyt1BUW4TmcEdX35+x/YPxMstHmBCi85JPKCEENouDLYszOLy1AIDAnl6Mu7YPfiEeaJrWJtfIqcrh2c3PAnBl/JUM9B3Hbz/djI8NkqwG9AaFUVfEYvYwtnj8kowlaIBaNQQFA5fJVKEQopOTIEuIbq4ou4ofPz5MZUkdCjDwggiGTopqVjrhXNTaapmzYQ41thoGBA3gzsF388CCPdRZHEyzmHA36IhMCCBmcFCLxxfWFrIpbxM2h4qlPBF/dyPJsYFt1j8hhGgPEmQJ0U2pqsbeH3LY+V0Wqqrh6Wtm7DV9CItr2zUANU3jpW0vkVmRSaB7IHNHz+XTrbnsyi6nv0VHqF3B6K5n9FVxJ6259c3Rb9A0DS8tDqsjiIv7h2JswyBQCCHagwRZQnRD1WX1rF2YRv7RCgBiBgeRMj0es3vbfyR8cugT1mSvwaAzMG/0PMqrzLz1wx487DDaYkSnU0i6NAZP35ZLMdhVO0szlqIBlUWDAWQZHSFElyBBlhDdTMauIjZ+cQRrvR2jSc+oabHEJ4W0ywLLOwp28M5P7wBwb+K99PZL4Ob3t2Czq0xV3TApEBLtQ7/kkwdNW/K2UFxXjEHzpLq6L+F+7gyOaNvRNiGEaA8SZAnRTVjr7Wz6KoMjOwoBCI7yZtw1fZotvtxWCmoKeHLTk2iaxqSYSUyLm8Y/1hwhvbCafqqB4DoNnUFH6ox4FN3JA7zFGYsB8LQnUYGBSwf0aJeAUAgh2poEWUJ0AwWZlfz4v8NUl9WjKApDJkQy+KKINk1u/yWrw8rcDXOpsFTQ2783DyU9xJ6cCv6z8RgmB4yzGNEpGkMmROIX6nHyftcUsCVvC6qmkX+8P4AUIBVCdBkSZAlxHlMdKrtX5rB7VbYzcdzfjXHX9iE0xqfdrqlpGn/d/lcOlx3Gx+TD/JT5OBx65i3eh6ppTDN5oq9x4B/qwaALI055rmVHl6GhEWrqx1FbAH17eNMr6NzWTBRCiI4iQZYQ56nK4jrWLjxMYVYVAHHDQki+IhZTOyS3/9LijMV8m/ktiqIwe/Rsenj24NllBzheVkc/vYnAUgeKAikz4k85kmZX7Sw7usz558qhgIxiCSG6FgmyhDjPaJpG+vZCNn+Vgc3qwORmYPRVccQmBrf7tfeV7OPvO/8OwB2D7iApNIn16cV8sfM4ehUm2E1oip2E1HBCok89mrYpbxMldSV4GnzJyolGryhc0l+CLCFE1yFBlhDnEUudnY2L0jm6pxiA0Bgfxl3bBy9/t3a/dkldCfM2zMOu2hkXMY5r+l5Dea2Vp5YeAOBaHz+03Hq8/MwMvSTqtOdbfMSZ8B5uTKYAPUkx/gR7t1zmQQghOiMJsoQ4T+QdqWDtwsPUVFjQ6RQSJ0YxaHwEulO8uddWbKqN+RvnU1JXQrRPNH8c8UcAnl9+kJJqCwM83PHJqwdg9FVxmNxO/dGTX5PPtvxtABTk/pzwLrWxhBBdjARZQnRxDofKzm+z2PtDDhrgE+jOuOv6EBzp3WF9eHPXm+wt3oun0ZMnUp/Aw+jB8r15rDxQiFFRmGg1YdEsxCYGE9Ev4LTnc65TqNHbdzA709wxGXRc2C+kA+5ECCHajgRZQnRhFUW1/PDxYUqOVwPQZ0QoI6fGYjTrO6wP32V+x5fpXwLw2MjHiPSOpKCynhe+PQTArJBALGnVmD2MjJoae9rz2VQby48uB8DTOgqAcX2C8TLLx5UQomuRTy0huiBN0zi8pYAtizOw21TM7gZSZsQTM6jlBZbbS1pZGq9sfwWAG/vfSErPFFRV44nF+6mutzM0wAu3jBpUYOTlvXDzMp72nBtzN1JaX4q/WwD7M8IAO5fJW4VCiC5Igiwhupj6GhvrP0sja38pAGFxfoy9pvdJ1/5rLxWWCuZumIvVYWVU2ChuGnATAJ9tz2FrZilmg45L7G5UOqrp2duPuGGte7uxIeF9oO84vqm24+NuJDk2sN3uQwgh2osEWUJ0IccPl7H2kzTqqqzo9M6FlQeMCT/lsjTtwaE6eHrT0+TX5BPuFc6fR/0ZnaIjs7iG11alAXBHVCiVu8owGHWMnh7fqqVwjlcfZ3vBdhQU6suGADYuTgjF2E6V6YUQoj1JkCVEF+CwqWxbnsn+dbkA+IV4MO66PgSGe7mkP+/ve59tBdsw6808kfIE3iZvbA6VeYv3YbWrjO7ph+5AJQ5g2KRovANaV0JiacZSAIaGJLFlmwZIAVIhRNclQZYQLlZfX8+1117L/v37cXd3JyQkhDfffJP4+HgAyvJr+OHjw5Tl1wCQMDqM4ZNjMJg6Lrn9l37M+ZEFBxYA8H8j/o9YP2cy+7/XZ7I/txIvNwOXONwotNQTFOFNQmp4q85rU20sz3QmvEeZx/KjxU6YnztDInzb50aEEKKdyRi8EJ3AnXfeyaFDh9i9ezfTpk3j9ttvR9M09q/PZfFruynLr8HN08jFN/Un+co4lwVYxyqP8fyW5wGY2WcmF0VdBMD+3EreW38UgPv69qTwcDk6nULqzPhW1+lal7OO8vpyAt0DychyBmaTBoSecprx/fffR1EUvvzyy3O4KyGEaB8SZAnhYm5ubkyePLkxmEhOTubo0Uy+f28/m7/OwOFQiejrz5W/H0pk/9PXmGovNbYa5qyfQ529jsSQRO4cfCcA9TYH877eh0PVmNgnGNuuMgAGjY8gIKz1izkvyVgCwIURk9iSUQ6cugBpZmYm7777LsnJyWd5R0II0b4kyBKik3nmiRdICBvF8cNl6PU6kqfFcvEt/XH3NrmsT6qm8vyW58muyibIPYjZybMx6JzZBv9YnU5mSQ1BXmYucrhRV2XFN8idIRMiW33+nKocdhbuRFEU3CzDsasafXt4Exvccs6ZqqrcfvvtvP7665jNstSOEKJzkiBLiE7CbnVw9w1/YM/2/VyZcgf+PTyZ+sAQElLCW/VmXntalLGI9bnrMegMzE+Zj7+bPwBbM0v539ZsAB5KjOLYziIAUmbEoze2/uOlIeF9VI9RbDhkB06d8P7KK6+QmppKUlLSWd2PEEJ0BEl8F6ITKDlezcN3Pc4P25bzyDV/ZdiEOJIujUZvcP3PQVvzt/JR+kcoisKDwx4kITABgKp6G/MX7wNg+pCeVG12Lkrdd1QPesS2Plnd5jiR8J4cOpGnfixHUeCS/i0HWXv37uXzzz/nxx9/PJfbEkKIdidBlhAupKka+9Ye5+knn2fj3u+YffsbXHZTEuG9/V3dNQByq3N5avNTaJrG5XGXMyV2SuO+l787TGGlhQh/d8Zj5kBJCR4+JoZfFnNG11h7fC0VlgqC3IMoLIgEMhkeHUCwd8vTgGvXriUzM5PevXsDkJ+fz5133kleXh733HPP2d6qEEK0Odf/mCxEN1VTYeHbf+7j24Vb+N/Kv2NV63jt6z8w+eoLGTVqlKu7R729njkb5lBtraa3X29+l/i7xn2rDhaw7Kc8dIrCH0fHcWh9HgDJV8Zhcj+zn90aEt4n95rMd/uc042nmiq85557yMvLIzMzk8zMTJKTk3nnnXckwBJCdDoykiWEC2T+VMyGz9Ox1NkJCejBwU159Bl56nIFHUnTNF7e9jIZ5Rn4mf14NPFRjHrnuoPF1RaeXXYQgBuToyhal4+qasQMDCR6wJktf5Ndmc2uwl0oikJf73H8oyQDk0HHhf1C2vyehBCio0mQJUQ7K6qysGhHDjlldfT0NhOX7yBnjzN/KainF+Ou64tvsLuLe9nUF+lfsDJrJTpFx5zRcwgyORee1jSNZ5YeoKLORp9Qb8bo3NmRU4DJzcCoaXFnfJ2GUazksGQ2pzkT3sf2DsbL3PqPpjVr1pzxdYUQoiNIkCVEO1qxv4B7F+zA7lAJdeiYUGOgQtPh525k+MQoEidGoe9k6/LtLtrNm7vfBODuIXczJHgIFRUVAHy9O5d16cUY9ToeHRfPrg8PATBiSgwePmdWYsLqsDYmvE/udTlPf1YAQEpcIG//cIScsjoi/N2ZPizipPlZQgjRmUmQJUQ7KaqycO+CHdhsKkOtekbUG9ChUK3TWGqoZXpqWKcLsIrripm/cT4O1cGEqAnM6D2jcV9OWR1//f4wAHddEEvuD3nYbSphsb70HhF6xtf6MedHqqxVhHiEoLfEU1y9G71O4eFPduFQNXSKgqppvPz9Yd68YRgXJZz5NYQQwpU61ye8EOeRRTtysDtUYu06RtUb0aGQbnSw0MtCjs7BFztzXN3FJmwOG/M2zKO8vpxY31j+b/j/NeaIOVSN+Yv3UWt1MDTKj1EGd3LTy9EbdKTMiD+rXLLFRxYDJxLeVU2joLIeu0ND1cCuOn+32VXu+WgHRVWWNr1fIYRobxJkCdFOcsrq0CkKtYpGpsHBSncr37vbsCqgUxSyS+tc3cUmXt/1OvtL9uNp9OSJ1CdwM7g17vtsVz57cirwMOl59MI+bF/qXKdw6MQofILOPJ8ssyKTn4p/QqfouCjyUlYfKqTepqJpoP2qrQbYHWqnC0qFEOJ0ZLpQiHbS08+NCdUGBln1HDE4OGxSG/epmkZkQOdJdl+WsYwlR5agoPB48uOEe4U37ksvrObfm44D8PAlfcn6MQ9LnZ2AME/6jw0/2SlPqSHhfXT4aPbnaNRY7JgNOuqs4Ph1lEXnDEqFEOJ0ZCRLiHZgsziIOlLPQKseBfBWT3yrKYBBr2P6sAiX9e+XDpYe5NUdrwJw88CbGRV2okaX1a4y9+t92FWVsb2DSDSaObq7CEVRSJ3Z+6xyyiwOC99mfgvA1NipLN+bD8Cgnr7NRrEadLagVAghWkOCLCHaWE25hWVv7iHnpxKcIRbU6TQMOgWdAkaDjjdvGEaQl+vfmCurL2PO+jnYVTsp4SnckHBDk/3v/HiE9MJqfN2N/N+E3mz6MgOAAWPDCYpoefHm01mTvYYaWw09PHvQ22cIG484y1ncPyEeg17Hr7O7OltQKoQQrSXThUK0oaKsKlZ+sJ/KknpsFgfgnOqKDfTkuqE+RAY4SxJ0hgDLrtp5ctOTFNcVE+EdwZ9G/gmdcuLnrl3Z5fxn0zEAHhofQ+a6fGoqLHgHuDF0YtRZX3fJEedU4ZTYKaw6WIRd1egT6s3wmADevGEY93zkLHnR8HahQd95glIhhDgTEmQJ0UYydhWx9pPD1FfbUB0nMrgVnUKQu4l7rxzo2g7+yrs/vcuuwl24G9x5IuUJvEwnRqZqLHbmfb0PTYMpg8JIMJtYu9GZ7J4yPR6DSX9W18yoyGBfyT70Oj2XxlzKo584z9mwjM5FCaGsf3QCX+zMIbu0rlMFpUIIcaYkyBKiDdgsDmeAVWXDYVfRGRRwgE6vNO7vTFZnrebTQ58C8OjIR4nxjWmy/28r08gtr6OHrxsPXBjHin/sQQN6J4US3tvvrK/bMIqVGp6KxeLBnpxyFAUuGXCiBlawt5k7x5159XghhOhsJCdLiDZgMOnoNzoMNy8jJncDDptzGEtRQNPAZrG7uIcnZJRn8MLWFwC4tt+1jIsY12T/urRivtzpfJtw7tT+ZG4qoKrYgpuXkeFTYs76uvX2er4/9j3gnCr8dp8z4X14dAAh3m6nOlQIIbokCbKEaAOKojBqaiy/+fMIogcGouic04TKz1GW6tBw2NXTn6idVVurmbNhDhaHhWGhw7ht4G1N9pfXWnlq6X4ArhsZRazZzJ7VzvpUo6bG4uZpPOtrNyS8h3mFMSxkGN/8/FZhw1ShEEKcbyTIEqINuXkZqamw4uZlJGF0D8J6++HmZURvcP23mqqpPLP5GXKrcwn1CGV28mz0uhO5VZqm8dw3BymtsdIryJO7L4hlw+fpqA6NHr29iRkceE7Xb6iNNaXXFNILa8ksrsGo1zG+b/A5nVcIIToryckSog3lHamgLL8Go0lPyszemNz0FGdXozfqXB5o/Wf/f9iUtwmT3sT81Pn4mn2b7F++N59VBwsx6BTmTxtA5rZCCrOqMJr1JF4aflZL5zTIKM9gf8l+Z8J7r0v5zzrnKNa4PsF4u5396JgQQnRmrv/xWojzyIF1uQDEDw/F7G5AURSCo7wJCPN0ab825G7gg30fAPD7pN/Tx79Pk/0FlfW8+N0hAG4bG0uE2cz2b5zlG5IujcbDx3RO11+c4VyncEzPMfia/BvzsWSqUAhxPpMgS4g2UllcR/aBUgD6p4a5uDcn5FTl8OzmZwG4Mv5KJsVMarJfVTWeWLyf6no7A3v6Mis5io1fpmOzOgiJ9qHvqHMLhOrsdaw4tgJwVnjfkVVGcbUFbzcDKXHnNgUphBCdmQRZQrSRAxvy0ICIvv74Bnu4ujsA1NpqmbNhDjW2GgYEDeCexHuatfl0ezZbM0sxG3XMmzqA7L2l5BwsQ6dXSJ0Rj6I7+2lCcJaLqLHVEO4VTmJIIt/85BzFurh/KMazWJZHCCG6Cpd/wr3xxhvExMTg5ubGqFGj2LJlyynbl5eXc9999xEWFobZbKZPnz4sW7asg3orRMus9XbSthUA0H/M2S2a3NY0TeOlbS+RWZFJoHsgc0fPxahrmv90tLiG11elA/DAhN6EuBnZ/LVz6ZwhEyLxCz33YLFhqvDy2Mux2jVWHyoE4NIBMlUohDi/uTTxfeHChTz88MO89dZbjBo1ildffZVJkyZx6NAhQkJCmrW3Wq1MnDiRkJAQPvvsM3r27MmxY8fw8/Pr+M4L8QtpWwuwWRz4hXicU7HOtvTJoU9Yk70Gg87AvNHzCHIParLf5lCZ9/U+rHaVUbGBzEyKYN2nadTX2PAP9WDQhee+VmBaWRqHSg9h0Bm4NOZS1qUVU2Ox08PXjSERfud8fiGE6MxcGmS98sor3HHHHdxyyy0AvPXWWyxdupT33nuPP/3pT83av/fee5SWlrJhwwaMRudP5DExMae8hsViwWKxNP69srIScP6Ur2laG92JOFcNz6MrPhNV1TiwIQ+AhJ9zsVx9HzsKdvDOT+8AcO+Qe+kf2L9Zn95ff5QDeZV4uxmYPSWB3LRy0rcXogCjp8ej0ylNnsvZ3NPiI79IeDf78s3e3QBMGhD6c6HWrve8O5uu/L1zvpNn0/46+9fWZUGW1Wpl+/btPPbYY43bdDodF198MRs3bmzxmK+//prRo0dz33338dVXXxEcHMz111/Po48+il7f8lpqzz77LPPnz2+2vaKiotM/nO5E0zSqq6sBzqlUgCvkHq6ksrgOo5uOoDgzFRUVLu1PUV0R8zfOx+FwMKHnBC4IuqBZnw4WVPOvtRlomsb9YyPR1dey9tPDaKpGr+GBmP3UxmPO9tnU2mv5PvN7VFXlwtALyS4oYUN6MZqmkhrl6fKv0/miK3/vnO/k2bS/hoGTzsplQVZxcTEOh4PQ0NAm20NDQzl48GCLx2RkZLBq1SpuuOEGli1bRnp6Ovfeey82m425c+e2eMxjjz3Gww8/3Pj3yspKIiMj8fX1xcfHp+1uSJyThoDX19e3y30YbdyZjaJT6Dc6nMAgf5f2xeqw8tLWl6i2V9M3oC9/HP1HzPqmiyvX2xy8tHo/GgoT+4dy5YhYti49Sl2lHS9/N1Ku6I3R7cRHw9k+m7UZa7GoFqJ8o0iNSWXRzuM4NOgT6sOQ2M7z9mVX15W/d8538mzaX2f/unapYqSqqhISEsI777yDXq8nKSmJ48eP8+KLL540yDKbzZjN5mbbFUXp9A+nu2l4Jl3puZTm1pCfUYFOp9A/5dwKdp4rTdN4dcerpJWl4WPyYX7qfNwMzdcEfGP1EbJKagnyMvPoZQmUHK9m/zrndOfoq+IwuTcvDno2z6ahwvvlsZej0+n4dp/zxYBLB4V1qWfcFXTF753uQp5N++rsX1eXBVlBQUHo9XoKCgqabC8oKKBHj5bfOgoLC8NoNDaZGkxISCA/Px+r1YrJdG4FE4U4U/t/Lj4aPTAQT7/mwXxHWpyxmG8zv0VRFGaPnk0Pz+bfR1uOlvLJtmwAHr88AS+TnsWfpqNpGrFDgolMCGiTvhwqPURaWRpGnZFJMZPILa9jd3Y5iuLMxxJCiO7AZSUcTCYTSUlJrFy5snGbqqqsXLmS0aNHt3hMamoq6enpqOqJhXYPHz5MWFiYBFiiw9VVWzmyy1mOwNVlG/aV7OPvO/8OwB2D7iApNKlZm6p6G08s2QfAjKQIUuKC2PfjccryazC7Gxh5Ra82609Dwvu4iHH4mn0bK7wPjw4gxLv56JoQQpyPXFon6+GHH+bdd9/lgw8+4MCBA9xzzz3U1NQ0vm04a9asJonx99xzD6WlpTz44IMcPnyYpUuX8swzz3Dfffe56hZEN3ZoUz6qQyM40pvgKG+X9aOkroR5G+ZhV+2MixjHNX2vabHdS98eorDSQoS/Ow9M6E1FUR27vneOao2cGou7V9v8oFJjq2FV9ioApsZNRdM0lu91BlmTZBkdIUQ34tKcrGuuuYaioiLmzJlDfn4+iYmJLF++vDEZPisrC53uRBwYGRnJt99+y+9//3sGDx5Mz549efDBB3n00UdddQuim3LYVQ5ucgYO/ce4LhfLptqYv3E+JXUlRPtE88cRf2yxLysPFPDN3nx0isL8KwbiZtCxZlE6DodKz95+xA0LbrM+rcxaSb29niifKAYFDSKtsJqjxTUY9Tou7Nt21xFCiM7O5Ynv999/P/fff3+L+9asWdNs2+jRo9m0aVM790qIUzu6u5i6KisePiaiB7lu/b03d73J3uK9eBo9eSL1CTyMzSu0F1VZePYb5xu7N6XEMCjCl0Ob88nPqMBg1DF6enybBYmapjVOFV4eezmKojQuozOuTxDebs2T6oUQ4nzl8mV1hOhqNE1j/3pnwnu/0WHoXbT+3neZ3/Fl+pcAPDbyMSK9I5u10TSNZ5YdoLLORt8e3tw+the1lVa2LcsEYNikaLwD2i5H6mDpQY6UH8GoM3JJzCU4VK0xH2uSLKMjhOhmJMgS4gwVZlZRcrwavUFH31GuCRzSytJ4ZfsrAMzqP4uUnikttvty13HWpxdj1OuYd8UAjHodm746grXeTlCENwmpbZuw37BO4fjI8fiYfNiRVUZxtQUvNwMpcUGnOVoIIc4vEmQJcYYaRrHihgbj5tnx018VlgrmbpiL1WFlVNgoZg2Y1WK77NJaXl2RBsC9F8YRF+xF5k/FHNtbgk6nkDrDuXROW6m2VrM6azXgTHgHGqcKJyaEYjLIx40QonuRTz0hzkB1WT3H9pYArinb4FAdPL3pafJr8gn3CufPo/6MTmn+bexQNeYv3k+d1cGwKH+uGxGFtc7O5q8zABh4QU8Cwj3btG/fH/sei8NCjG8MAwIHUG9zsOaQs8SFvFUohOiOJMgS4gwc2JCHpmmEx/vh36Ntg5TWeH/f+2wr2IZZb+aJlCfwNrVcOuKjzcfYk1OOp9nAnKn90ekUti3LpLbSim+QO4kXRbVpvzRNY2nGUgCmxk5FURTWpRVTbbHTw9eNxAg/HnjgAWJiYlAUhV27dgFQX1/PlVdeSZ8+fRgyZAgTJ04kPT29TfsmhBCuIkGWEK1kszg4vMW5QkH/Ns5lao0fc35kwYEFADwy4hFi/WJbbJdWUMXbPzhHrB6e2IdwP3fyMyo4tMU5dZcyIx69sW2/9feX7iejIgOT3sTE6IkALP9FwrtOpzBz5kzWrVtHdHR0k2PvvPNODh06xO7du5k2bRq33357m/ZNCCFcRYIsIVopfXsh1no7PoFuRPTr2IWgj1Ue4/ktzwNwdZ+rmRA1ocV2VrvK3K/3YXOojOsTzOWDw3DYVNZ/5hwd6juyBz1ifdu8f0uOONcpvDDyQrxMXlTU2dh4xDmt2vBW4bhx44iIiGhynJubG5MnT24sIZGcnExmZmab908IIVxBgiwhWkFTNQ78nPCekBqO0oYJ46dTY6thzvo51NnrSAxJ5I7Bd5y07ds/HCG9sBp/DxN/npzgnJpbmUVlSR0ePiaGT45p8/5VWatYne1MeL887nLAWfzU5lDpHepFfIhXq8/1t7/9jWnTprV5H4UQwhVcXoxUiK7g+OEyKorrMLkZiE8K6bDrqprKc1ueI7sqmyD3IGYnz8aga/nbdmdWGf/dfAyAP09JIMDTRGluDXt/OA5A8pVxmNzb/lv++2PfY3VYifWNpX9Af4DGZXQuPYPaWM888wzp6elN1jMVQoiuTIIsIVph/zrnKFbvEaGY3Dru2+bjgx+z/vh6DDoD81Pm4+/W8jRljcXO/MX70TS4fHA4F/QJRnWorP88DVXViBkYSPSAtq9M36TCe5yzwnteRR27sstRlNYXIH3ppZdYtGgRK1aswMOjedV6IYToiiTIEuI0ygtqOZ5WjqIoJKSEddh1t+Rt4b2f3gPgwWEPkhCYcNK2r644TG55HWG+bjx8SR8A9q/PozinGpObgVHT4tqlj3uL93Ks8hhmvZmLoy4G4NufR7GSov0J8Tl9NflXXnmFjz/+mBUrVuDn59cu/RRCCFeQnCwhTqOh+GhU/4A2XYLmVHKrc3lq81NoaFweezlTYqectO3atCK+2pWLosCcqQPwMhuoLKlj53fOqcMRU2Lw8DG1Sz8bKrxfGOVMeNc0jW/2tryMzl133UVERAQ5OTlMmjSJ+Ph4cnJy+MMf/kB5eTkXXnghiYmJjBo1ql36KoQQHU1GsoQ4hfoaG0d2OAtqdlTx0Xp7PXM2zKHaWk1CYAK/G/q7k7Ytq7Hy9NIDAFw/MpqkaH80TWPjF0ew21TCYn3pPSK0XfpZaa3kh+wfAGdtLIC0wmqOFtdg1OuY0K9p7trbb7/d4nk0TWuX/gkhhKtJkCXEKRzeUoDdphIQ5kloL592v56maby87WUyyjPwc/Nj3uh5GPUtL92jaRrPfXOQ0horscGe3D3eWTfryI4ictPK0et1pMyIbyyP0Na+y/wOm2ojzi+OQGMv3v7hCMt+yqPW6uCihEC83Tp+ySEhhOhMJMgS4iQcDpWDG/MA5yhWewUrv/RF+heszFqJTtExJ3kOwR7BJ237zd58Vh8qxKBTmH/FQMwGPXXVVrYsdhYiTZwYhU+Qe5v0q7LejsNgJdDLDDRNeI91G8eYF1Zjs6s0jEkt3ZPHFUPCuSihfUbRhBCiK5AgS4iTyNpbQk2FBXcvI7GJJw922sruot38Y9c/ALh7yN0khiSetG1+RT0vfXsIgNvHxtK3h3N5nS1fH8VSZycgzJMB49pmerOq3sZvP9hNnV0j1MdMvx4++PrlcqTsGO4GN97/3qtJgAVgVzXu+WgH6x+dQLC3uU36IYQQXY0EWUKcREPZhr7JYegN7fuOSHFdMfM3zkfVVCZETWBG7xknbauqGk8s2Ue1xc6gnr7MGu1cpib7QCkZu4tQFIXUmfHo9W3TZ52iYLGrlNbYKK+1cqSwBkPIl+Bho7RqAFZby0n1dofKFztzuHNc+7zZKIQQnZ28XShEC4qyqijMqkKnV+g7qvUFNc+GzWFj3oZ5lNeXE+sby/8N/79TTk1+si2bbZlluBn1zLtiAAa9Dmu9nY1fHAFgwNhwgiJaXjj6bHiaDfTv4YVRr6BXFFSlBtV9P6qmUV829KTH6RSF7NK6NuuHEEJ0NTKSJUQLGkaxYhOD2638QYPXd73O/pL9eBo9eSL1CdwMJy8TcbS4hr+vdq5D+MBFvYkMcBbu3LH8GDUVFrwD3Bg6MarN+pZbXsemjBKKa6xY7SqqBib/XYAD1RKGajl53TBV04gMaJucMCGE6IokyBLiV2oqLGT+VAxA/9T2LduwLGMZS44sQUFhdvJswr1Ofj2bw7n4s9WukhwbyIxhPQEoPFbZmKCfMj0eg0l/1v2psdjZfqyMzUdL2JRRSnZpLQBWu+PnnCsNo+8uFAWoHkaoj5mSaisOVWuSk6UABr2O6cMiml1DCCG6CwmyhPiVgxvzUFWNHr18CezZ+sWNz/g6pQd5dcerANwy8BZGho08Zfv31x/lYF4l3m4GZl/eH0VRcNhV1n+Wjgb0TgolvLffGfXBoWoczK9kc0Ypm4+W8FNOBXb1RLik1ykM7OnLwFA3Pt1VSKH1IIqxBFQzPfTDeenaJMprrdzz0Q7sDhWdoqBqGga9jjdvGEaQlyS9CyG6LwmyhPgFu83Boc0FACSktt8SOmX1ZcxZPwe7aiclPIXrE64/Zfu9xyt4f30mAH+6LKHxjb09q3MoL6zF3cvI8Ckxrbp2QWU9mzJK2Hy0lC1HS6msszXZH+HvzqjYQJJjAxkW5YeX2UBFRQX5NSpf5+wEFHzVYbw7K4X4EGfu1/pHJ/DFzhyyS+uIDHBn+rAICbCEEN2eBFlC/ELGziIstTa8/N2IasMFlUtKSrjooosA0NDIKsmiIreCqz++mj+N/BM65eTvoNTbHMz7eh8OVeOSAaFM7O+sPVVeUMue1dkAjLoiFjfPlot/1lkd7MgqY3NGCZuOlpJZXNNkv5fZwPAYf0b1CmRkr4DGPK8GDRXZR8SaWFJ2CINe4eVLbm0MsACCvc3yFqEQQvyKBFlC/EzTtMaE94SUMHS6tis+GhgYyK5duwB4c/ebvPzSy5gOmHh+0vN4mU49Jfn6qjSySmsJ8jLzyKR+zr6qGus/S0N1aEQmBBAzOKixvapqHC6sapwC3J1dgc2hNu7XKQoDwn1Ijg1kVGwA/cN8MLSi3IPFvBM/Dx0DggaQHDngLL4KQgjRvUiQJcTP8tIrKCuoxWDS06ed1vtbnbWaTw99St6qPP48/8/E+Macsv3mjBI+3ZYDwJyp/fF1d45WHdyUR2FWFUaTntFXxlFcbWXz0RI2ZzinAMtqrU3OE+br1hhUDY8JwOcMl7xRNZWlR5di1Ou4Im7qGR0rhBDdlQRZQvxs/3rnKFbvpBBM7m3/rZFRnsELW1+g4lAFBouBR29+9JTtK+ttPLFkPwAzkyJIjnVOX9aUW9j2zTFsdpXK3p7c/slOjhRVNznWw6QnKTqAUbEBjI4NJMLf/ZyWBfqp9Cdyq3PxNHpyYdSFZ30eIYToTiTIEgKoLK4j+0Ap4FynsK1VW6uZs2EOFocF6yYrd9xyBwbDqb/9Xlx+iKIqC5EBHtx/YTzphVVsOFJC9jfZmEptlBg1VuWXgAKKAglhP08B9gpgYE9fjG1U8R3g2+xvAbg4+mLcDVL7SgghWkOCLCE4UXw0sl9Amy2q3EDVVJ7e/DS51bkEKAFs/XErt798+ymP+X5/Ad/8lIdd1Qj3dWPGWxspqbYQWQfJpQqqAhkRRq7oF8So2EBGxgTg63FmU4CtVVJXwubCzQBMjZWpQiGEaC0JskS3Z62zk7a9EGifUaz/7P8Pm/M2Y9KbGHp8KPlD8unXr1+zdha7gz05Faw8UMAHG45hsTvwMBnYfNQ5wuat05Fap8fdDfqO68kfp8Wd0xRga3137DscqoMBwQOI9Ytt9+sJIcT5QoIs0e0d3lqA3erAP9SDsHjfNj33htwNfLDvAwB+n/R75r88nzvuuANwvs2YUVzT+BbgjqwyLDaVyjobVoeKQacjMdKP0XHOKcCazcVklBfiH+rBBVNjOyTAUjWVpRlLAbi81+Xtfj0hhDifSJAlujVV1TiwwbkkTUJq+FkHLkVVFhbtyCGnrI4If2cxTgtFPLv5WQCujL+SSTGTGLXiQrYcLeWJxfvZfLSEoipLk/MY9QqKouDnbuJfNw1naLQ/ALlpZXy7oxAFSJkRj74N861OZXvBdvJq8vA0ejI+cnyHXFMIIc4XEmSJbi17fynVZfWYPYzEDQs+q3Os2F/AvQuaLivz8oq9DBj6KdX2GiI9+kD5Jcx6bwuH8ivRfrHIn8mgY1iUP6NiA4gO8OCxRT/h7WbgoYv7NAZYNquDDYuOANAvJYyQaJ9zvu/WWpKxBIDx4eNPuXC1EEKI5iTIEt1aQ8J731GhGIxnvrByUZWFexfswGZX0QBV0wANJXAxh0szMOBD9ZFJHFRzGo+JD/Ei+edla4ZE+mI26HGoGnd+uA2LXSUp2p9rR0Q2tt/1fRZVpfV4+poZNin6XG+51Yrrill/fD0AkyImddh1hRDifCFBlui2So5Xk3+0Ap1Ood/os1uncNGOHOwOZ4DVwOi3GYPXfkCPo2AmgZ7OnKpRsYGMiAloXHfwl/6zMZOfjlfgZTYwZ2r/xmrzxTlV7FvrDARHXxWHya3jvmWXH12OqqkMCBxAlHdUh11XCCHOFxJkiW6rofhozKAgPH3PbjHjnLK6xilCAL17JqagVQDYiiYyqdcw/nbt0FMu0XO4oIp31x4F4OFL+hDm6ywh4XCorP8sHU3TiB0STGRCwFn18Ww4VMeJhPc4SXgXQoiz0THZs0J0MnVVVjJ2FQHnVrYhwt8du+oMsBRDBeawRYCGvXIw9sphDIrwPWWAZbE7mPvVPmwOlQv6BDNl0IkRtX0/5lKaV4PZ3cDIK3qddR/PxraCbRTUFuBl8uKCiAs69NpCCHG+kCBLdEsHN+WjOjRCorwJjvI+q3M4VA17w8LLig23sM9RdHWolh5Yiy7FoNczfVjEKc/x9g8ZHCmqJsDTxJ8nJzS+3VhZXMeu77MAGDk1Fncv01n18WwtPrIYgEkxkzDrz26UTwghujuZLhTdjsOucmiTs2zD2Y5iZZXUMn/xvp8LhWqYg5ejM+eB6o41fyZGvZk3bxhGkNfJA5QdWWV8tPkYAH+enIC/pzOQ0lSN9Z+n43CohPf2O+u3Hs9WcV0xm/I2AXB5rEwVCiHE2ZIgS3Q7GbuKqKu24eFjImpg4Bkdq6oaC7dl88aqdMpqrdRYHRh8d2D03YObwcAIz3sY2m8o04dFnDLAqrbYmb94P5oGU4eEM67PiUAqbVsB+RkVGIw6UqbHd0jR0V9amrEUVVMZFDSIaJ9otF/WnBBCCNFqEmSJbkXTNA78nPCekBJ+RkU98yvqmff1PrZkllJVb0PTQO+Wgzn4exQULo/+LfPGz2zVuV79/jB55XWE+bnz+4l9GrfXVlrZujQTgKGXROMd0LG1qRyqg2VHlwEwNU7WKRRCiHMhOVmiWyk4WklJbg0Go44+I0PP6NhXvj/ExowSymut6HUKqq4Kc9jnoDhQ6vozMeKqVp3nx8NFfL07F0WBuVP742U+8bPO5q+OYK23ExTh3S7rKJ7O5vzNFNUW4WPyYVzEuA6/vhBCnE8kyBLdSkPx0bihIbh5Gs/o2MsHhxPkZcLbzYjVbsPUYxE6QzWaNRh9+TQ8zac/X1mNlWeWHQDghlHRDIvyb9x3bG8JmXtL0OkUUmfEn/KtxPbSULZhUswkTPqOTbYXQojzjQRZotuoKq0na38pcHYJ7+P6BLPo3lSmJYZjDFqB3i0bzWHGkjcDnWbG03TqivGapvHsNwcorbESF+zFXRfENu6z1tnZ9JVz6ZyBF/QkINzzjPt3rgprCyXhXQgh2pDkZIlu48CGPDRNo2dvP/xCPc7qHL7uRtJrNmDy246iKBjKZqARgqKA22mW5Vn6Ux5rDhVh1OuYP20AZsOJ9tuWZVJbacU3yJ3Ei1xTXf2bo9+gaRqJIYlE+kSe/gAhhBCnJEGW6Bas9XbSthYAkHAOuU6f/7SVvXUfoShw66CbGBtyNW+uSUfTIMz35EnqeRV1vPLdYQDuGNuLPqEnanPlZ1RwaEs+ACkz4tEbO36A2a7aT1R4l1EsIYRoExJkiW7hyI5CrPV2fIPciejjf/oDWlBWV8Hz255EU+zEeSXywPDb0Sk6/nnTiFMep6oaTy7ZT7XFzqCevvw2+cQizw6bc+kcgL4je9Aj1ves+nautuRtobiuGF+zL2N7jnVJH4QQ4nwjOVnivKepWmPCe0JqOMpZJJQ7VAf3ffsX6rQSDGogb0x6Ep3Sum+f/23NZltmGe4mPfOuGIDhF2Ujdq3MorKkDg8fE8Mnx5xxv9rK4gxnhfdLYy7FqD+zFwKEEEK0TIIscd7LOVhGZUk9JjcD8UkhZ3WOt3f/k31lu1A0I7f1/SM9fVu3WHNGUTVvrHaOVD14UW8iA07kgpXm1rD3h+MAJE+Lw+TumoHl/Jp8tuRtAWQxaCGEaEsSZInz3v6fi4/2GRmK0Xzq5PSW/JjzIx/s+whV0whz/Ia7UlJadZzNoTL3a+fizylxgVw1tGfjPlXVWP95GqqqET0wkOgzrDzflpYdXYaGxtCQofT06nn6A4QQQrSKBFnivFaWX0NuejmKopCQEnbGxx+rPMbTm56jzurAUD2axy6YibGVVeLfW3eUQ/lV+Lgb+cuU/k2WxzmwPpfinGpMbgaSp8Wdcb/aik218c3RbwCp8C6EEG1NgixxXtu/3rkQdPSAALz8z2yJmhpbDXPWz6G0tgrFEsNIv99wQZ/WLda893gF/96QCcCjl/Yj2PvEOoZVpfXs+Na5MPTwyTF4+Liu6Oem3E2U1JXg5+ZHas9Ul/VDCCHORxJkifNWfY2NIzsKAeg/5symwVRN5bktz5FRfgyLxQtzxdX8/pJ+rVqsuc7qYO7X+3CoGpMG9GBi/xPL92iaxsZF6dhtKmGxvme8tE9ba5LwrpOEdyGEaEsSZInz1qHN+TjsKoE9vQiJ8T79Ab/w8cGPWX98PbVWMJVdw5QBvenXw6dVx/59dRrZpbUEe5t55NK+TfYd2VHE8bRy9HodKTPiWxW0tZe86jy2528HYErsFJf1QwghzlcSZInzksOhcnCjc6qwf2r4GQUzW/K28N5P72Gxq2glk3EninvGty5valNGCZ9uywFgzuX98XE7MTpUV21ly+IMABInRuET5N7qPrWHpUeXoqGRFJokCe9CCNEOJMgS56VjP5VQW2nF3dtEryFBrT4utzqXpzY/hYqGrmYYhrphzEqOIcT79PlclfU2nli8H4Crh0cwKrbpG4Nbvj6Kpc5OQJgnA8adfdX5tiAJ70II0f4kyBLnpYbio/2Se6A3tO6feb29njkb5lBtrcZHF0N94SUEeZmbVGg/lReWH6S42kJUgAe/m9C7yb7sA6Vk7C5CURRSZ8ajb+Ubiu1lw/ENlNWXEeAWwOjw0S7tixBCnK8kyBLnncJjlRRlV6HTK/RN7tGqYzRN46VtL5FRnoG3yZfyrGkoGLhnfBzuptPX1vp+fwHf7StAr1OYd8WAJotFW+vtbPziCAADxoYTFHFm+WHtoTHhvZckvAshRHuRIEucdxpGseISQ3D3al15hC/Sv2BV1ip0io6++pupq/Okbw9vpgw6fW2toioLz31zAICbU2IY2LPp+oM7vj1GTYUF7wA3EidGneHdtL3j1cfZUbADBUUWgxZCiHYkQZY4r9SUWzi2twSA/mNal/e0u2g3/9j1DwCujruVtXu9AOcyOLrTrHOoac7Fn6vq7fQL8+HWMb2a7C88VsnBDc4E/JTpcRhbMSrW3pYcWQLA8B7D6eHZupE+IYQQZ06CLHFeObAxD1XVCIv1JSDc87Tti+uKmb9xPqqmMiFqAgcPJ+BQNcb1CWZ4zOnXJ1y04zibMkow6nXMv2JAk2rwDofK+s/S0YD4pBDCe/ufy621CZtqY3nmckAS3oUQor1JkCXOG3arg8Ob84HWjWLZHDbmbphLeX05sX6xXBB4K+uPlGDQKTzwq8T1lmSX1vK3lWkA3D8hnl5BTYO6n1bnUF5Yi5unkRFTerV0ig63LmcdFZYKAt0DSQ5LdnV3hBDivCZBljhvHNlRiKXOjneAGxEJpx+Fen3X6xwoOYCn0ZO5yfN5c00WADOTIogK9DjlsXaHyryv91FvczA8xp9rhkc22V9eUMvuVdkAjLoiFjfPzpFcviTDOVU4uddkDDqDi3sjhBDnNwmyxHlB07TGdQoTUsJOm0u1LGMZS44sQUFhdvJsdmRAemE13m4Gbhsbe9rr/WfTMX46XoGX2cCcywc0uZ6maqz/PB3VoRGZEHBGdbraU05VDjsLd6IoCpN7TXZ1d4QQ4rwnQZY4L+SmlVNeWIvRrKf3iFOvB3ig5ACv7ngVgFsG3sKAgGG8ucZZYuH2sbH4up961OlQfhXv/uis3P6HS/rSw7dpodKDm/IpPFaJ0aRn9JVxLl0655caRrFG9RhFqKdr10wUQojuQIIscV7Yv95ZtqH38FBMbiefBiurL2PuhrnYVTsp4Slcn3A9H248RmmNlQh/d2YmRZzyOha7g7lf78WualzYN4TJg5q+nVdTbmH78kwAki6LxtPPfG431kZsDhvfZn4LIGUbhBCig0iQJbq8iqJacg6WoeCcKjwZu2rnyU1PUlxXTIR3BI+NeozCSisfbT4GwAMX9W7ydmBL3lqTQUZRDQGeJv50Wb8mo1SaprHxyyPYLA5Corzpl3z6Glsd5cfjP1JhqSDIPYiRYSNd3R0hhOgWJMgSXV5DLlZkQsApF11+96d32VW4C3eDO0+mPomn0ZN/rEnHalcZFuXPBX2CT3md7cfKWLDFGZD9ZUoC/p5NC51m7ikm+0ApOr1C6szeKKfJC+tIDbWxpsROkYR3IYToIBJkiS7NUmcnfVsBAAmnKNuwKmsVnx76FIBHRz5KtE80e49XsHxvPooCD03sfcrcqWqLnScW70PT4Ioh4Yzt3TQgq6+xsekrZ57W4Asj8Qs99duJHSmrMovdRbsl4V0IITqYBFmiS0vbko/dpuLfw5OwON8W22SUZ/Di1hcBuK7fdYyLGIemaby6wlnjavKgMPr18DnldV757jB5FfWE+7nz+4l9mu3ftjST+hobfiEeDL7w1HldHa0h4T05LJlgj1OP1gkhhGg7EmSJLkt1qBz4ecma/mPCWhyJqrJWMWfDHCwOC0mhSdw68FYAVh0sZE9OOWajjnvGx53yOj8cLmLJnlwUBeZO7Y+nuel0W25aOWnbC1CA1Jnx6A2d59vK6rBKwrsQQrhI5/nfQIgzlLW/lOpyC26eRmITm4/QqJrKM5ufIbc6l1CPUB5Pfhy9To/VrvL6qnQAZiXHEOLt1uzYBqU1Vp5Z6lz8+bejohka1XRpHLvVwYZFznP1Gx1GSPSpR8Q62g85P1BlrSLEI4SRPSThXQghOpIEWaLL2r/OWbah76geGIzNF17+z/7/sDlvMya9iSdSn8DX7JxOXLgtm9zyOoK8zPw2Ofqk59c0jWeWHaCs1kpcsBd3XdB8xGvn91lUldbj6Wtm2KUnP5erLD6yGHBWeNfrXL84tRBCdCcSZIkuqTinmoLMSnQ6hX6jm5dK2JC7gQ/2fQDAw0kP09vfuRZhWY2V99cdBeCe8XG4m04eeCzZk8ePh4sw6nU8MW0Apl9NAxbnVLNvrTPQG31V3Cnrc7nC0Yqj7C3ei07RMTlWEt6FEKKjSZAluqSG4qO9Bgfh4dO0lEJOVQ7Pbn4WgCvjr+SSmEsa9/1zXQbVFjt9Qr2ZPOjkdaxyy+t45fvDANw5Lpbeod5N9jscKus/S0PTNGKHBBPZirUSO1pDwvvo8NEEuXeOpX2EEKI7kSBLdDm1lVaO7i4CoP/YpmUbam21zF4/mxpbDQODBnJP4j2N+44W17Box3EAHry4N/qT1LFSVY0nFu+nxmJncIRvi1OK+9fmUppXg9ndwMgrerXVrbUZi8PCd5nfATA1dqqLeyOEEN2TBFmiyzm4KQ/VoRES7UNQxIkRJk3TeHHbixyrPEageyBzRs/BqDuxDuHrq9JwqBpjewczIubkI08fb81iR1YZ7iY9c6cOaBaMVRbXsfP7LABGTo3F3cvU0mlcak32GmpsNfTw7MHwHsNd3R0hhOiWJMgSXYrDpnJoUz4A/X9VfHThoYX8kP0DBp2BeaPnNZki23K0lHVpxRh0Cg9cFH/S8x8pquYfq52LRT90cW8iA5oWFdU0jQ2fp+Owq4T39iNuWOesO/XLCu86Rb7NhRDCFeTTV3QpGbuLqK+x4elrJnrAidGoHQU7ePendwG4L/E+BgQNaNznUDVeXeHMr5qRFEF0oGeL57Y5VOZ9vQ+bQyU1PogrE3s2a5O2tYC8jAoMRh0p0+NPWSXeVTIqMthXsg+9Ts+kmEmu7o4QQnRbEmSJLkPTtMayDQkpYeh+Xsw5vyafJzY+gaZpTIqZxBVxVzQ5bsmeXNILq/FyM3D7mNiTnv+fa49yKL8KX3cjf56c0CyAqq20snVpJgBDL4nGO+Dk9bVcqWEUKyU8RRLehRDChSTIEl1GfkYlpXk1GIw6+owMBZwJ3vM2zKPSWkkf/z48lPRQk+CoxmLnrR+cawrePiYWXw9ji+f+KaeCDzZkAvCny/oR7G1u1mbzV0ew1tsJivCif+rJ30x0pXp7Pd8f+x6QCu9CCOFqEmSJLmP/OuebgfFJoZg9jM71B7e/yuGyw/iYfJiXMg+zvmlw9J9NxyipthDh787Vw1teU7DO6mDu13tRNY1LB/bgooTQZm2O7S0hc28JOp1C6ozejaNonU1DwnuYVxhJoUmu7o4QQnRrnfN/CiF+pbKkjuz9pQAk/DyK9PWRr/k281sURWH26Nn08OzR5JiCynr+u+kYAL+7qDfGkwRGr69KI6esjmBvM49M6ttsv7XOzqavnMnwAy/oSUB4yzldncHiDGeF9ym9JOFdCCFcTT6FRZdwYEMeGtCzjz9+IR7sK97HG7veAOCOQXe0OGrzj9XpWO0qQ6P8GN+n5bcANx4p4bPtOQDMnToAb7fm04nbvsmkttKKT6A7Qy6KbLubamNHyo9woOQAep2eS3tdSkxMDH379iUxMZHExEQWLlzo6i4KIUS30rnWARGiBdZ6O2lbCwBn2YaSuhLmbZyHXbVzQeQFXNP3mmbH7Mut4Ju9zlIPD13cp8W3ACvqbDy5ZD8AvxkeychezWtn5WdUcGiz8zypM+NbXCOxs2hYp3BMzzEEuDnvZeHChSQmJrqwV0II0X1JkCU6vfTthdgsDnyD3QmJ8+T/fvw/SupKiPaJ5pHhjzQLoDRN49UVaQBMHhRGQphPi+d9YflBiqstRAd6cP+E5rWzHDaVDZ+nA9B3ZA96xPq28Z2dm+VHl/P9se8ZFzGOlPAUVmStAKTCuxBCdBYSZIlOTVU1Dvy8TmH/MeG8tect9hbvxdPoyROpT+Bh9Gh2zOpDhezOLsds1HHv+LgWz/vdvny+31+AXqcw74oBuLUwQrV7VTYVxXV4+JgYPjmmTe+rLSzPXM7mvM1szt+MXtFTZ68j0juSIcFDGtvMmjULTdMYOXIkzz33HMHBnbN4qhBCnI8kJ0t0ajkHS6ksqcfkZiAz8Ce+TP8SgMdGPUakd/P8KKtd5fVVztGnG5OjCfFpXsuqsKqe55cfBODW1F4MCG8+QlWaV8NPa5y5WsnT4jC5d76fR7yMXthVO1XWKsrqy6i313O8+jj3rLiHJRlLWPPDGvbs2cOOHTsICgripptucnWXhRCiW5EgS3Rq+9flARA02MCre14BYFb/WaSEp7TY/pNt2RwvqyPIy9ziws6apvHUkgNU1dtJCPPh5tSYZm1UVWP9Z+moqkb0wECiBwa23Q21IT+zHzpFh1nnLFuhoVFnr2Nn4U5e3PoiB9QDABiNRh566CHWrl3ryu4KIUS3I0GW6LRK82rIO1IOisbH2ltYHVZGhY1i1oBZLbYvr7Xy3vqjANwzPg4PU/PRp8+257ApowSTQcf8Kwa0WNbhwPpcinOqMLkZSJ7W8nRjZ+Dn5gyybKoNBQWTzoQOHTpFhy++RBtPBJkff/wxQ4cOdWFvhRCi++l8cyBC/KxhCZ2CwCNkqRmEe4Xz51F/Pmn9p3fXZlBdb6dPqDeTBzWvyJ5dWstrq5wJ8b+bEE9MUPN6V1Wl9ez41llba/jkGDx8TG11O23O1+yc5nRoDgDsmh1PgydxfnHcG3kvN0y9AYfDgaZpxMbG8uGHH7qyu0II0e1IkCU6pfpqGxk7i6i11bLF/3vMejNPpDyBt8m7xfaZxTUs2uGsCP/gxb3R65q+cWh3qMz9eh8Wm8qImACuTmqez6VpGhsXpWO3qfSI9aXPiOaV3zsTP7MfDs2BhgaAj9GHxJBEnh7zNL5mX3bu3OniHgohRPcm04WiUzq0OZ86az357pmUe+fxyIhHiPU7+eLOr61Kw6FqjO0dzIiY5vWuPtx4jL3HK/ByMzBnan90uuZ1s47sKOJ4Wjl6vY6U6fEoLbTpLIqqLPx4oIZ6uxUAN7074yPH89IFLzWOcAkhhHAtlwdZb7zxBjExMbi5uTFq1Ci2bNnSquP+97//oSgKV155Zft2UHQ4h0Nlz7pjVNuqORq2k6v7Xs2EqAknbb/laCnr0oox6BQeuKh5vauD+ZX8c61zkej/u6QvoS28cVhXbWXLYmebxImR+Aa7t9HdtL0V+wtIfX4VCzYfR9VUNE2hujiJCwLuxc3Q/N6EEEK4hkuDrIULF/Lwww8zd+5cduzYwZAhQ5g0aRKFhYWnPC4zM5P/+7//Y+zYsR3UU9GRDu04TnFpOfXGakL6e3DH4DtO2tahary64jAA04dFEB3YNM/KYncw96t92FWNCf1CuGxgj5ZOw5bFR7HU2fHv4cmAcT3b7mbaWFGVhXsX7MBmV3FYgrBXx2ErTaE+fwr3LdhNUZXF1V0UQgjxM5cGWa+88gp33HEHt9xyC/379+ett97Cw8OD995776THOBwObrjhBubPn09s7Mmnj0TX5FAdfPPNJhyag+KoI8xOeRyD7uSpg0v25JJeWI2Xm4E7xjb/9/DmmiMcLa4hwNPEny7r1+LyOtkHS8nYVYSiKIy5Oh79SRaS7gwW7cjB7nCg992GZ6830BnqsBRejoaC3aHyxc4cV3dRCCHEz1yW+G61Wtm+fTuPPfZY4zadTsfFF1/Mxo0bT3rcE088QUhICLfddlur6v5YLBYslhM/3VdWVgLOJGdN087hDkRbange//3hM7RidzSdys1XXoWf2e+kz6nWauetH44AcFtqL3zcDU3abj9WxsdbsgD4y5QEfN2Nzc5lq7ezcZHzHP3HhBHY06tT/7vIKCnALexTFA/nW5JqfQTKz4nvekUhu7S2zfvf8Gw689elO5Pn03nJs2l/nf1r67Igq7i4GIfDQWho0ze4QkNDOXjwYIvHrFu3jn/961/s2rWr1dd59tlnmT9/frPtFRUVnf7hdCeaprE+ez0/rcsmjD4E9TMR7RNBRUXFSY95f1MOxVX1hPm6cUlv7yZtayx25ny5D1VVuax/MIOCjS2ea/d3uVSX1ePhZyR2pN8pr+dqO4t3sqX+JQxeZaDpcau4EGPNcBRP5+icTtHo5aO0+T1omkZ1dTVAiyOBwrXk+XRe8mzaX8PASWfVZUo4VFVVceONN/Luu+8SFBTU6uMee+wxHn744ca/V1ZWEhkZia+vLz4+LS8cLDrebffcxsLPF1JbXMujN7zBLVfMwtf3RH7V+++/z2233caiRYu48sorKais5/PdhSiKjocu7ktQgH+T8722ZD/FNTZ6+nvyx8kD8TQ3/6deeKyKo9tLUXQKY6/uS2CwX3vf5lmxOqy8+9O7LEpbhKbXcFiCqc+bRpU1pLGNAhgNOqaOiMfXy9ym12/4YcTX11f+o+iE5Pl0XvJs2l9n/7q6LMgKCgpCr9dTUFDQZHtBQQE9ejRPTj5y5AiZmZlMnTq1cZuqqgAYDAYOHTpEXFzz6txmsxmzufl/OoqidPqH013U2+spiC9g+u23s/SN/xERE0RguFfj/szMTP75z3+SnJzc+NzeXHMEq10lMdKPC/uFNHmWaw4VsmRPHooC864YgJebsdk1HQ6VjYvS0YD4pBB69vFv1qYzOFpxlKc3PU1GhfPNx+m9r6KP+Soe+HgvmqKiUxRUTcOg1/GPG4YR7N0+bxc2fN3le6ZzkufTecmzaV+d/evqsiDLZDKRlJTEypUrG8swqKrKypUruf/++5u179evHz/99FOTbY8//jhVVVX87W9/IzKyeXFJ0flpmsZL217C2tPGoLyxfKN8QvzQE1PIqqpy++238/rrr/OHP/wBgH25FXyzNx+Ahy7u0+SbrLTGyrPLnNPNNyZHkxjp1+J1f1qdQ1lBLW6eRkZM6dVOd3f2NE3jy/QveXvP21gdVnzNvvxxxB8ZHT4agPWPhvDFzhyyS+uIDHBn+rAIgtp4BEsIIcS5cel04cMPP8xNN93E8OHDGTlyJK+++io1NTXccsstAMyaNYuePXvy7LPP4ubmxsCBA5sc7+fnB9Bsu+g6FqUtYlXWKmKKhuBLADq9QmivE9O4r7zyCqmpqSQlJQHO4OPVFc6k78mDwugffqKtpmk8vfQAZbVW4kO8uHNcy+sOlhfUsntVNgCjrojFzbP5SJcrldWX8cLWF9ictxmAkWEj+eOIPxLgdqLIarC3+aT3J4QQonNwaZB1zTXXUFRUxJw5c8jPzycxMZHly5c3JsNnZWWh03Xe1+nFudlVuIs3d78JGiRXXIpBZ8Ro1jdWWt+7dy+ff/45P/74Y+MxPx2vYHeFN2ajjnvGNw0yluzJY21aEUa9jiemDcBkaP5vR1M11n+ejurQiOwXQK8hrc/v6wib8zbz/NbnKa8vx6gzcveQu7ky/spOPyQuhBCiOZcnvt9///0tTg8CrFmz5pTH/vvf/277DokOUVRbxBObnkDVVC4xXYmx2hO9WcFo0je2Wbt2LZmZmfTu3RuA/Px8Nm7fTdiFs3jsDw80qdyeW17HK987i5LedUEs8SEtr3F4cFM+hccqMZr0JF8Z12mCF6vDylu73+LL9C8B6OXbi78k/4VYX6kFJ4QQXZXLgyzR/dgcNuZtnEd5fTmxfrEMOTaefCqJGeIP/z3R7p577uGee+5p/HvCsGTsCZcRP3ICN46ObtzuUDXmL95HjcXOkEg/bhgVTUtqyi1sX54JQNJl0Xj5d44cpozyDJ7e/DRHK44CcFXvq7hr8F2Y9CYX90wIIcS5kCBLdLjXd73OgZIDeJm8+GPvx1m/MocPvn2RQx9upaiokEmTJuHt7U16enrjMeW1VvIr6gkC7hkfh4fpxD/dj7dksTOrHHeTnrlT+6NvYWFnTdPY+OURbBYHIVHe9E0O64hbPSVN0/gi/Qve3v02NtWGv5s/fxzxR0aFjXJ114QQQrQBCbJEuyuqsrBoRw45ZXXUGreyvXoxekXH46Mep2STHYDZv3+WpGnhJ60n8+7aDHrf+hK9Q72YMuhEgJReWM2ba5wV239/cR8i/D1a7EPmnmKyD5Si0yukzIhH10Ig1pFK60t5fsvzbM3fCkByWDKPjHgEf7fOWUpCCCHEmZMgS7SrFfsLuHfBDuwOFb1bLqaeH6IoDqbH3sgQ36F8st0ZZCSkhp/0HJnFNSzacRxwlmxoGKmyOVTmfb0Pm0NlTHwQ0xJbPoel1sbmr511pgZfGIl/D88W23WUjbkbeWHrC1RYKjDpTdw1+C5JbhdCiPOQBFmi3RRVWbh3wQ5sdhX0NRhDPwcc2Kv78L+VUVxmPY7dphIQ5kmPWJ+TLo/w2qo0HKrGmN5BjIg5Ucbg3bUZHC6owtfdyJ+nJJw0SNm6JJO6aht+IR4MvjCiPW61VSwOC2/vfrsxuT3WN5a/JP+FXr6dr06XEEKIcydBlmg3i3bkYHeoaDhw6/EFiqES1RZAfcEV6FXY+UMO7kD/MeEnD5AyS1mXVoxBp/DgRb0bt+/JKefDDccAeGxyv5MW4sxNKydtewEKkDozHn0LZR06QkZ5Bk9uepJjlc4+z+wzk9sH3S7J7UIIcR6TIEu0m5yyOnSKgiFwNXr3Y6CZqM+9GlQzcXY9dpsdt0B3YocEt3i8Q9V4dYWzLMP0YRFEBzqn+WqtduZ9vQ9V05g8KIwJ/UJbPN5udbBhkTN5vt/oMEKiO36tSlVTWZS2iHf2vINdtRPgFsCjIx9lRI8RHd4XIYQQHUuCLNFuIvzdUTz3YvRzVi6vz5+KZnMW/xxo0aM3KPRLDkNv1DUupPpLS3/KI62gGi83A3eMPVEv6rWV6eSU1RHiY+YPl/Q56fV3rciiqrQeT18zwy5tuaxDeyquK+aFrS+wLX8bAKPDR/PI8Efwc/Pr8L4IIYToeBJkiXaTFG/DfHgpGmArS8FR0w+AELtCqEOHh6eBvsnNFwMH52hVw1uDt43pha+Hc+mbDf/f3r3H51z+fwB/3ed7583OsxMbY8TMcUMiUYr8pK9KpXOhVEpynEQSfXX4Fr4i6avSgRKihMIw7OAwxk6Ynex83n34XL8/ljtrBxu7d2/2ej4eezzs87k+1+d9uy7b2/W5PteVmIPN0WkAgIjR3WBXy+bPAJB7uQSn/kwHAISNDYBa27xdPTI9EsuOLjNNbp/cczLGBIzh5HYiojaESRaZRbGuGB/ELYKDjQz5eR1hyBsCpVwGSQiEGFRwtFIhoJcrrO1rn5P05aELyC2phLeTFR7sXbX5d2GZHou2nwEATOjrU20S/LWMRgkHvjsPIQQ69HSFT3Dt5cyhwlCBVXGrsDVpKwCgo2NHzBswD372zT+SRkRElsUki5qcJCS8c+QdpJekw9feE1+OXIHdp4twKa8c3lZqqPdmAwIIrmPZhqyiCvzvSNUE8ZeGdYJaWfU4cemus8gpqYS/sw2mDg2s8/7x+9ORl1EKjZUS/cc035t7ifmJWHRkES4WXQQAPBj0IJ7p/gxUipa1ATURETUPJlnU5Dac3oAjGUegVqixcOBCdHRyxXO3V01uj951AXECcPe3h4u3ba3Xr9yXhEq9hBAfR9wRVHXdr/FZ2B2fBYVchgVjukGrUtR6bVFOOWJ+q0py+t7XAVa25n97TxISvj/3PT47+RkMkgHOVs6Y2Xcm+nj0Mfu9iYio5WKSRU0qMj0SG+I3AACm956OTk5/L7tg0BuRcCQTQNWyDbWJzyjCjpMZAKoWHpXJZMguqsDSnWcBAE8N7IBgr9rfEhRCIPKHRBgNErwCHRHY263JPlddcspzsDRqKY5nHQcAhHuFY0bfGXDQOJj93kRE1LIxyaImk1achiVHlgAAxgaOxQj/EdXOJ8deQUWpHraOGvjWMk9KCIEPd1ctuTDqNk8Ee9lDCIGF2+JRUmFAsJc9nhjoX+f9zx/LQkZyIZQqOcLGBZh9kvnBywex7OgyFOmKoFaoMTVkKu7reB8ntxMREQAmWdREyvRlmHdwHkr1peju0h2TQyZXOy+EQPyBqrf9uoZ7Qq6ouSjogeR8xF4qgEYlx+Q7AgAA3x1PQ1RKHtRKORaM7gZVLdcBQFmRDke3pQIAeo3wg72zVRN+uuoqDBX4NO5TbEvaBgAIdAzE3AFz4Wvva7Z7EhFR68Mki26aEALLji3DhaILcLZyRkRYBFTy6pO9M5IKkZ9ZBqVagU79ai7boDNIWBNZtTTDo/394G6vxYXcUny85zwAYNqwTvB3qXvPwSNbk6GrMMDF2xbBAz3rLHezzuefx6LDi3Cp+BIAYELQBDzV/SlObiciohqYZNFN25SwCX9c+gNKuRILwhfA2cq5Rpmro1idertBY1Wz231/PA0ZhRVwsdPisTA/GP7a/LlSL6Fvh3YY37vuPQcvnM5F6skcyOUyDHygU62jZDdLEhK+S/gOa0+tNU1un9VvFkLdQ5v8XkREdGtgkkU3JTorGmtOrgEATA2Zim7O3WqUKcopR9qZPABA11pGmQrKdFh7MAUAMHlIAKzVSny2Pxmn04tgq1Vi/n3BkMtrn+ekKzfg8I9Vi5Z2H9Ie7bzqHu26UTnlOVhyZAlismMAAIPaD8JrfV7j5HYiIqoXkyy6YZmlmVh4aCGEEBjpPxJjAsbUWu5MZAYEAO8uTnBwta5x/rP9KSipMKCjszVG3eaJMxlFWHegKul6Y2QQ3O21dcZwfGcqyop0sHe2Qs87fZrkc11rf9p+LD+2HMW6YmgUGrzY60WM6jCKk9uJiOi6mGTRDak0ViIiMgJFuiJ0duqMV3q/UmvioSs34PzRLABAt1qWbUjNKcUPf22T88IgXxiMEiK2noZBErizqxtGdqt92x0AyEwpxNnDVUtCDBwfCGUda2fdiHJDOT6N/RTbk7cDADo7dcac/nPgY9/0iRwREd2amGRRowkh8MHxD3A+/zwcNA5YEL4AGoWm1rLnj2VBrzPC0c0anoGONc5/tOc8jJLAoEAX9PKxx6f7kpCaUwpnWw1m3t2lzhEjo15C5A9Vyz107ucBj45N9+guIS8Bi48sRlpxGmSQYUKXCXiy+5M1JvMTERHVh0kWNdrWpK3YlboLMpkM8wbMg4dN7aNNkiRwJrJqYdHgQV41EqajqXk4cD4HSrkM0+4MRExaHr45WvXW3pxRXeFoXfdq7XF7LqHwSjms7NToO8q/ST6XJCR8m/At1p1aB4NkgIuVC2b1n4Vebr2apH4iImpbmGRRo5zOOY1PYj8BADx727P1vl136UweivMqoLFSIqCXa7VzRkngg93nAADjQr3RzkaNKbuTAQD/16s9BnVyqbPevIxSnNxX9YhxwP0doa7lbcXGulJ2BUuiliA2OxYAcLv37ZjeZzrs1bWvLk9ERHQ9TLKowXLKc7Dg0AIYJAOG+AzBhKAJ9ZY/89eyDZ37e0Cprj5favvJDJzPKoGtVolnB3fEit/O4UqJDt5ONnh5eKfaqgNQNTp28PtESJKAXzdn+N9WdzLWUH+m/Ynlx5ajRFcCrVKLl3q9hLv97+bkdiIiuilMsqhB9JIebx16C7nlufCz98OMPjPqTUJy00uQkVwIuVyGruHVl20o0xmwcl/VsgtPD+qA6Ev52H4yAzKZDBGjg2GtrrtbnjmYjpy0Yqi1SgwYG3BTn6lMX4ZPYj/BLym/AAA6t+uMuf3nwtuu7jW5iIiIGopJFjXIytiVOJ1zGjYqGywcuBDWqppLMVzrzIGquVh+3Z1h41B9UvyXhy4gt6QS3k5WuLOLGx5fFwUA+FcvD/T0cayzzuK8CkTvugAA6DPKH9b2dc/Zup6zeWex+PBiXC65DBlkeLjrw5jUbRIntxMRUZNhkkXXtSt1F35M/BEAMKv/LPjY1b+MQXmJDkmx2QCqJrxfK6uoAv87UpUovTg0EO/tSkBBmR6BbraY1L99nXUKIXBoSxIMegkeHR3Qua/7DX0Wo2TENwnfYP3p9TBKRrhYuWB2/9kIcQu5ofqIiIjqwiSL6nU+/zxWHF8BAHg8+HGEe4Vf95qEw5mQjAKuvnZw86s+cXzlviRU6iWE+DiiqEKPA+dzoFLI8daYblApjHXWmRxzBZfP5UOhkCN8XCBkdawAX5/ssmwsObIEcVfiAABDfIZgeu/psFPbNbouIiKi62GSRXUqrCxERGQEdEYd+nv2x+PdHr/uNUaDhLOHqhYIDR5YfRQrPr0IO05WPUZ8pL8vFmw9DQB4YUhHBLrZorCwsNY6K0r0OPJz1QrwIXf5wMHVqtGfZd+lfXj/2Pso1ZdCq9RiWq9pGOk/kpPbiYjIbJhkUa2MkhGLDi9CZmkmvGy9MLv/bMhl1994OSUuB+UlOljbq+F3298bRQvx95INd3f3wFdHLqJMZ0SIjyMe6e9Xb51RPyejskwPJw8bdLu97keKtSnTl+HjmI+xK3UXAKBLuy6YM2AO2ts2rh4iIqLGYpJFtVp3ah2OZx2HRqHBwvCFDXqkJoRA/IHLAICu4Z5QKP5OyvYlXEHspQJoVHK422ux81QmrNUKzB8dDIVcBiFErXWmnc1DUuwVyGQyDBwfWK3O64nPjcc7R95Bekk6ZDIZJnadiMeCH+PkdiIiahZMsqiGP9P+xNdnvwYAzOg7Ax0dOzbouqzUIuSml0KhlKNzv79XgdcZJHy85zwA4O5uVaNYAPDqXZ3h7VT3W4r6SiMObala6iF4kBdcfRo2d8ooGfH12a+x/vR6SEKCm7UbZvefjR6uPRp0PRERUVNgkkXVpBamYmnUUgDAg50fxDDfYQ2+9uriowGhbtDa/D1a9N3xS0jLL0c7GzVOXi6E3ihhUCcXjOlZc8Poa0XvuoCSgkrYOmnRa4Rvg2LILM3EkiNLcDLnJABgqM9QvNr7VdiqbRv8OYiIiJoCkywyKdGVYH7kfJQbyhHiFoJnezzb4GuL8ypw4XQeACB44N+LjxaU6bD2QNWk9UA3W0Sl5MHRWoU5o7rWO+k8+0IRzhysStrCxwVA9Y8V42uz5+IerDi+AqX6UlirrDGt1zTc5XcXJ7cTEZFFMMkiAFWbI78b9S7SitPgYuWCeQPmQSlvePc4eygDQgh4BTrCycPGdPyz/SkoqTDAw0GLoylVSdise7rC2VZTV1UwGiVE/pAIASAw1A3tOzvVe+9SfSk+jvkYv6b+CgAIdg7G7P6z4WVb/0gZERGROTHJIgDAV2e+QmR6JJRyJRYOXAgnbf2JzbX0lUaci8oCUH3x0dScUvwQnQYBoEJnhAAw6jZPDO3iVm99J/emIT+rDFobFfre16HesqdzT+OdI+8go6RqW57Huj6GR4MfbVSCSEREZA78TUSIyojC56c+BwC8EvoKurTr0qjrE49nQVdhgL2zFbyD/k7OPtpzHkZJwMlahYIyPdzttXhtROd66yrILkPcnksAgP5jOlab23Utg2TAxjMb8WX8l5CEBHdrd8wZMAfdXbo3KnYiIiJzYZLVxqWXpGPRkUUQELgv4D6M6jiqUdcLSeDMwaoFRoMHeZpWYj+amocD53NgkARySnRQymWYPzoYdtq6l08QkkDkD0mQjAI+XdqhQ0+XWstllmZi8ZHFOJ1TtZjpMN9heCX0FU5uJyKiFoVJVhtWYajA/IPzUaIrQVfnrngp5KVG15F2Lh+FOeVQa5UI7F21n6BRqlp4VAhABkAhl+Ghfr7o69+u3rpSYvKQfaEIKrUCA8YG1Dph/fcLv+OD6A9Mk9tfCX0Fw/2GNzpuIiIic2OS1UYJIbD82HIkFybDUeuIBWELoFI0fpHO+L+Wbejczx0qTdUbgNtPZuB8VgkqDEZolHL4u9hgyh0B9dZTWliJU3urtuPpfY8fbJ2qT4wv0ZXgo5iPsPvCbgBAN+dumN1/NjxtPWvURURE1BIwyWqjNp/fjD0X90AukyMiLAKu1q6NriM/sxTp5wsgk8nQJawq2SnTGao2gTZIgADUf23+rFXVvQSDEAKHtyTDUCnBzd8eQQOqJ06nc05j8ZHFyCzNhEwmw+PBj2Ni14mc3E5ERC0af0u1QbHZsVgZtxIAMLnnZPR07XlD9Vydi+XbrR3s2mkBAF8euoArxRXIPXsE+X9+CSetHE/+5IjVq1ejZ8/a75N6MheXzuZBppAhfFwg5H/N67o6uX1D/AYIIeBp44nZ/Wejm0u3G4qXiIioOTHJamOulF3BwsMLIQkJd/reiXGdxt1QPRWleiRGZwMAggdWLduQVVSB/x2+gIL8fGT+tAz3zf4vvp/1LxyKPIiJEyfi1KlTNeqpLNPjyE9VW+d0CXeFk0fVNjsZJRlYfGQx4nPjAQB3+d2FaaHTYKOyqVEHERFRS8Qkqw3RG/VYcGgBCioK0NGxI17r89oNr4Z+LioLRoME2Kuw+HASnlF1xJaYyygo10OXnwGVjT0+nDwaSoUcgwcPxsWLFxEdHY3Q0NBq9RzdnoryEj0c3azQObzqkeVvF37Dh9EfokxfBhuVDV7p/Qru9L3zpj8/ERFRc2KS1YZ8HPMxzuSega3aFgvDF0Kr1N5QPUajhDORVRPe4zRG7DtXgAOJOag0SKjQG+Ho4Yt8fSkuJ8TBLzwcW7duRXFxMVJTU6slWemJBTh/LAsyAOEPBKJClGDxkU+x5+IeAEB3l+6Y3X82PGw8aguDiIioRWOS1UZsT96ObcnbIIMMc/vPvaktZy6czEVZkQ5WtiqcRBnKKg2QBCAAyGVAr0AvrPjhB8yaNQslJSUICwtDcHAwlMq/u5tBZ0TkD4kAgC5hnsiyuYBFkYuQU5kDuUyOx4MfxyNdH+HkdiIiarX4G6wNOJN7Bh9GfwgAeLL7k+jn2e/m6vtr42a/3q4oikk2JVgAIAngbGYx0oM7Yc/efVDIZaisrISHhweCg4NNdcTuvojivApY26sR77sfG/d9CaPRiPZ27TF7wGx0c+bkdiIiat2YZN3i8ivyEREZAYNkwMD2A/FI10duqr7sC0XIvlgMuUIGdYA9jMckU4IFACqFDHmlOry3+RAu55fjzXu64O2338awYcMQGBgIAMi9XIJTf6ZDEkZEd9iJo4n7AADD2g/D9P7TuXI7ERHdEphk3cIMkgFvH34bOeU58LHzwZv93oRcJr+pOuP/WrahY4grsnR6lOsl0zmlHBCiaoX3jD0b8P7Xs/GZRo6wsDCsXbsWQNV8rgPfnUeFoQLJjnE4ptwHG5UNXu39KkLtQ/n2IBER3TKYZN3C1pxYg9jsWFgprbBw4MKbTmBKCytx4WQOgKplG/53Nh3leqPpvEwmg61GCZ921piyfi1GBHuY1ry6KmZfCi5eyESJrAgn/H/HbS63YXb/2XCzdkNhYeFNxUdERNSSMMm6Re25uAffnfsOADCz30z42fvddJ1nD2VAkgScfOzwfWIW1u5PMZ2zVsnh4WCFJwf64199faBR1lzhPepcDPZvuwBhlOFs5wN4rPcjeCjoISjkCgghapQnIiJqzZhk3YKSC5Kx7OgyAMDDXR7G7d6333SdBp0RCUeyUGmQ8MnFTCSmGarNxRoe7I63778NDtY19z/US3p8cWoDkr6vgLPRG6UuVzDzockIdgmuUZaIiOhWcXMTdKjFKdYVY37kfFQaK9HbvTee6v5Uk9SbFHMF5aU6XK7UIUlWPcECgJ2ns6AzSjWuu1xyGS/veRl//hED5wJvaNQqTH7+ASZYRER0y2OSdQuRhIR3jryD9JJ0eNh4YO6AuVDI696YuaGEEDhzMB0Vegkn1AZItSwSbzBK2BKTVu2anSk78dyvzyEl8yK6pd4BO7Udho7pCTd3p5uOiYiIqKXj48JbyIbTG3Ak4wjUCjXeCn8LDhqHJqk3I7EQ+VllMMiA8xoJNYaxAMhlMlzKKwdQNZr27+P/xh+X/gAADE9/DC4KN7h52yN4oGeTxERERNTSMcm6RUSmR2JD/AYAwPTe09HJqVOT1R1/oGrxUVUHG1Skl9RaRhICPu2sEJsdi3eOvIOc8hwo5Ao8avs8pFwPyBUyhI8PhFzBwVMiImob+BvvFnCp+BKWHFkCABgbOBYj/Ec0Wd2FV8px6WweZADuGdMJSoUc/3xaKAOgVAiUW/+G1/a9hpzyHLS3bY8V4R9Ce9wXANDt9vZw9uIio0RE1HYwyWrlyvRlmH9wPkr1peju0h2TQyY3af1Xt9Dx7toOHfwcsHJiKFRKOeQyQCmXQS4DVNoC9OyzGT8lfwsBgXs63IPVd61G8RE1yop0sHfWImS4T5PGRURE1NLxcWErJoTAe0ffw4WiC3C2ckZEWARU8ppLKNwoXbkB549nAwCCB1VtKH1nV3ccnDkMW2LScDG3DBWa4zhZtgm5ukrYqm3xep/Xcbv37chMKcTZw5kAgPBxgVCqbn4CPhERUWvCkaxWbFPCJvyZ9ieUciUWhC+As5Vzk9Z/7mgWDDojnDys4Rnw9yR6VzsNHhrgCqX7D4gu2QC9VIkQtxCsHbEWt3vfDqNeQuQPiQCAzn3d4Rno2KRxERERtQYcyWqlorOisebkGgDA1JCp6ObcrUnrl4yS6VFh8EAvyGR/z8SKyY7BkiNLTJPbn+7+NB7s/KBpuYi4PZdQeKUcVnZq9L23Q5PGRURE1FowyWqFMkszsfDQQgghMNJ/JMYEjGnye1yMz0NJQSU01ip07OUKoGrl9s9PfY5NZzdBQMDbzhtz+s9BULsg03V5GaU4ua9qvawB93eE2opdjIiI2ib+BmxlKo2ViIiMQJGuCJ2dOuPV3q9WG2VqKleXbQjq7w6lSoFLRZew+MhinMs/BwC4t+O9mBIyBVZKK9M1kiQQ+UMiJEnAr5sz/G9zafK4iIiIWgsmWa2IEAIfHP8A5/PPw0HjgLfC34JaoW7y++ReLkFWahHkchm6DPDAtuRt+CTmE1QaK2GntsPrfV7HYO/BNa47G5mBK5eKodYqMWBsQJPHRURE1JowyWpFtiZtxa7UXZDJZJg3YB7cbdzNcp+ro1he3eyx9PQ7OHD5AACgl1svzOo/Cy5WNUeoivMqcHzXBQBAn1H+sLZv+uSPiIioNWGS1UqczjmNT2I/AQA8e9uzCHUPNct9yop0SI67Ar2kx1f4FBcuJ0ApV+KZ257B+M7jIZfVfCFVCIFDW5Jg0Bnh0cEBnfuaJ/kjIiJqTZhktQI55TlYcGgBDJIBQ3yGYELQBLPd68zhyyipKEWGVQouqBPgY+eDuQPm1rtNT3LsFVw+lw+FQo7wBwIgkzf9HDEiIqLWhklWC6eX9Hjr0FvILc+Fv4M/ZvSZYZaJ7gCQmncBe3fHAAYFUryiMTpgNCb3nAytUlvnNRUlehzZmgIA6DncBw6u1maJjYiIqLVhktXCrYxdidM5p2GjssHC8IWwVjV9EiOEwLbkbdi8cze6VQyDXluOyaMfwyDfQde9NurnZFSW6eHkYYPuQ9o3eWxEREStFZOsFmxX6i78mPgjAGBW/1nwtvNu8nsUVhZi2dFliLwciUFpj0ClUGHgXUEI8+1y3WvTzuYhKfYKZDIZBj4QCIWCGwgQERFdxSSrhTqXfw4rjq8AADwe/DjCvcKb/B7HMo9h6dGlyC3PhWuxLzx1/rCxtkbowOsvv6CvNOLQliQAQPBAT7j62jV5fERERK0Zk6wWqLCyEBEHI6Az6tDfsz8e7/Z4k9avN+rx2cnP8N257wAAvva+GFs0GflKPQJ7u0Fjff1NpqN3XUBJQSVsnbToNdKvSeMjIiK6FTDJamGMkhGLDi9CVlkWvGy9MLv/7FqXTbhRF4ouYNHhRUgqqBqFuj/wfjziPQnb954CULVP4fVcuVhs2tcwfFwAVGpFk8VHRER0q2CS1cKsO7UOx7OOQ6PQYGH4Qtipm+YxnBACW5O2YmXcSuiMOjhoHDCj7wyEe4Uj6udkCADtOznC0b3+ifVGo4SDP5yHABAY6ob2nZ2aJD4iIqJbDZOsFuTPtD/x9dmvAQAz+s5AR8eOTVJvQUUBlh1bhkPphwAAfTz6YGbfmXC2coauwoDzx7IBAMGDrj+KdWrfZeRnlkFro0Lf+zo0SXxERES3IiZZLURqYSqWRi0FADwY9CCG+Q5rknqPZh7F0qilyKvIg1KuxPM9nsf/dfo/0yPIxOPZ0FUY4OBqdd1RqYLsMsT+fhEA0H9MR2htrj93i4iIqK1iktUClOhKMD9yPsoN5QhxC8Gztz1703XqjDqsObkGP5z7AQDg7+CPuf3nVhsdE5Iwza3qGu5V70rtQhKI/CERklHAu4sTOvSsuX8hERER/Y1JloVJQsK7Ue8irTgNLlYumDdgHpTym2uWlMIULD68GMmFyQCAsYFj8XzP56FRaKqVSzubj6LcCqi1SgT2dqu3zoSoTGSlFkGpViBsbKDZVp0nIiK6VTDJsrCvznyFyPRIKOVKLBy4EE7aG59ILoTAj4k/YvWJ1dAZdXDUOuKNvm9ggOeAWsufPlA1ihXU3x0qTd1vCJYWVuLYjlQAQO+7/WDrpKmzLBEREVVhkmVBURlR+PzU5wCAV0JfQZd2119lvS75Ffl47+h7OJJxBADQz7Mf3uj7Btpp29VaPi+jFBlJBZDJZOgS5llnvUIIHN6SBH2lEW6+dvWWJSIior8xybKQ9JJ0LDqyCAIC9wXch1EdR91wXUcyjmDp0aUoqCiASq7CCz1fwNjAsfU+0rs6F8uvuzNsnereADr1ZC4unsmDXCFD+AOBkNczb4uIiIj+xiTLAioMFZh/cD5KdCUIdg7GSyEv3VA9OqMOq+JWmfY37ODQAXMGzEFHh/qXfqgo1SMp5gqA+pdtqCzT48hPVYuW9rjDB04eNjcUJxERUVvEJKuZCSGw/NhyJBcmw1HriAXhC6BSNH4phOSCZCw+shgphSkAgP/r9H94vsfzUCvU17024UgmjAYJLu1t4eZX92KnR7enorxED0c3a/QY1vSbUxMREd3KmGQ1s83nN2PPxT2Qy+SICIuAi1XjlkIQQmBL4hasjlsNvaSHk9YJb/R9A/09+zfoeqNRwtlDGQCqRrHqeqSYnliA88eyIAMwcHwgFMqm29qHiIioLWCS1Yxis2OxMm4lAGByz8no6dqzUdfnVeRhadRSHM08CgAY4DkAM/rOaNQbiRdO5KKsSAcrOzX861jryqAz4tDmRABAlzBPuPnZNypOIiIiYpLVbK6UXcHCwwshCQl3+t6JcZ3GNer6Q+mH8N7R91BYWQi1Qo3nezx/3cnt/ySEMC3b0GWABxSK2kenYndfRFFuBWwcNAi9269RcRIREVEVJlnNQG/UY8GhBSioKEBHx454rc9rDU6OKo2VWB232jS5vaNDR8wZMAcdHBq/b+CVi8XISSuGQiFH0ACPWsvkXi7B6f1ViVjY2ACotewiREREN4K/QZvBxzEf40zuGdiqbbEwfCG0yrqXTLhWckEy3j78Ni4UXQAAjO88Hs/c9kyDJrfXJv6vUayOIa6wsq1Zh2SUcPD785AkgQ49XOATXPsaW0RERHR9TLLMbHvydmxL3gYZZJjbfy68bOteMuEqSUjYfH4z/nvivzBIBrTTtsPMfjPR16PvDcdRWlCJC6dyAdS9bMPp/enITS+FxkqJ/mPqXwaCiIiI6scky4zO5J7Bh9EfAgCeuu0p9PPsd91rcspz8N7R93As8xgAIMwrDDP6zICj1vHmYonMgCQJeAY4oJ1XzfWuinLKEfPbRQBA3/s6wMruxkbLiIiIqAqTLDPJr8hHRGQEDJIBA9sPxMNdHr7uNZHpkVh2dJlpcvvknpMxJmDMTW/GrNcZcS4qEwAQPLDmKJYQApGbk2A0SPAMcLzuZtFERER0fUyyzMAgGfD24beRU54DHzsfvNnvTchlda8zVWGowKq4VdiatBUA0NGxI+YNmAc/+6Z5sy85OhuV5QbYtdPCu2vNeVaJx7KRkVQApUqO8HEBN53UEREREWDxFSY/+eQT+Pv7Q6vVon///oiKiqqz7Jo1azB48GA4OTnByckJw4cPr7e8paw5sQax2bGwUlph4cCFsFHVvR1NYn4iXtj9ginBejDoQay8c2WTJVhC+nvZhuCBXjX2Hiwr0iFqW9Wq8b3u8oW9i1WT3JeIiKits2iStWnTJkyfPh0RERGIjo5Gz549MXLkSGRnZ9daft++fXj44Yexd+9eHDp0CD4+PhgxYgQuX77czJHXbc/FPfju3HcAgJn9ZtaZLElCwrcJ32LK71NwseginK2c8d7t72Fyz8k3tM1OXdLPF6DwSjlUGgUC+9R8DHjk52ToKgxwaW9b7z6GRERE1DgWTbL+/e9/49lnn8WTTz6J4OBgrFq1CtbW1li3bl2t5Tdu3IgpU6YgJCQEXbp0wWeffQZJkvD77783c+S1Sy5IxrKjywAAj3R9BLd7315ruZzyHMz8cyZWxa2CQTIg3Cscn434DH08+jR5TPEHq0axOvVxr7Hm1cXTuUg9kQO5XIbw8YGQ17E4KRERETWexeZk6XQ6HD9+HLNmzTIdk8vlGD58OA4dOtSgOsrKyqDX69GuXd3rOVVWVqKystL0fVFREYCqyd5CiBuMvqZiXTHmR85HpbESvd1744ngJ2qt/+Dlg1h+bDmKdEVQK9SYGjIV93a4FzKZrEnjAYDC7DKkJeRDBqBLuEe1+nXlBhzakgQA6DbYC+08bZr8/o1xtT0sGQPVjm3TsrF9Wi62jfm19L9biyVZOTk5MBqNcHd3r3bc3d0dZ8+ebVAdM2fOhJeXF4YPH15nmSVLluCtt96qcbywsLDJGkcSEhZHL0ZaURrcrNwwres0lBSXVCtTaazEurPrsOvSLgBAR/uOmN5jOrxtvU2JX1OL3XsZQhLw6GQHodShsFBnOhez8zJKCyth46RGh74OKCwsNEsMDSWEQElJ1d8ZJ963LGyblo3t03KxbczPXL8/m0qrfbvw3XffxTfffIN9+/ZBq617BfVZs2Zh+vTppu+Liorg4+MDBwcH2Ns3zcbH60+vR0xuDDQqDRYNXgRvJ+9q58/nn8eiqEVIK06DXC7HhKAJeLLbk0069+qfKssNuHSqEDK5DD2H+cHBwcF0Liu1CKkx+ZDJZRj8r85o5+Jotjga6mrC6+DgwB9GLQzbpmVj+7RcbBvza+l/rxZLslxcXKBQKJCVlVXteFZWFjw8at9X76rly5fj3Xffxe7du9GjR496y2o0Gmg0mhrHZTJZkzRO5OVIfBn/JQDgtd6voXO7zqZzkpDwXcJ3WHtqLQySAc5WzpjVbxZC3UNv+r7Xcz4qCwa9BCcPG3gGOJo+q1EvIfKHRABA577u8Ap0MnssDXW1TVr6P5q2iG3TsrF9Wi62jXm19L9Xi810VqvV6N27d7VJ61cnsYeFhdV53XvvvYe3334bO3fuRJ8+TT9RvDEScxLxyLOP4PDLh3F29llsmLvBdC6nPAcz/piB1SdWwyAZMKj9IHw24rNmSbAko4SzhzIAAN0GeVXrhHF7L6HwSjms7NToc2/jN5kmIiKihrHo48Lp06dj0qRJ6NOnD/r164cPPvgApaWlePLJJwEAjz/+ONq3b48lS5YAAJYuXYr58+fjq6++gr+/PzIzq1Yxt7W1ha2tbbPGXqYvw/3P3g+DZMDT/3sa/x76b+RmV+0NuD9tP5YfW45iXTE0Cg1e7PUiRnUY1WwZ98XTeSgpqITWRoWOIa6m43kZpTi5Nw0AMOD+jtBYtdqnxURERC2eRX/LTpgwAVeuXMH8+fORmZmJkJAQ7Ny50zQZ/uLFi5DL/x5sW7lyJXQ6HcaPH1+tnoiICCxYsKDZ4hZCYNGfi5CwKwH3fX4fFoQvgEqugoOLA94/9j62J28HAHR26ow5/efAx96n2WIDYFp8NKi/BxSqqr8/SRKI3JwISRLw7eYMv+7OzRoTERFRW2PxoYwXX3wRL774Yq3n9u3bV+371NRU8wfUAJsSNmF39G6obFVwiXTByGUjARXgNMYJxgAjZJDhoS4P4YnuT0AlN9/k9trkpBUj+0IR5AoZuoR5mo6fPZSBKxeLodYqMeD+ji3+OTYREVFrx9UnG+FyyWU8tuMx/CfmPxBGgYorFRgUOgiv/+91KMcp8ceSP2BbYYvldyzHsz2ebfYECwDiD1TNxerQwxXW9moAQEl+BY7vvAAA6HOPH2wcar4IQERERE3L4iNZrcn7x97HiZwTAIA7ut2BaHk0Yr1jceLECVj7WcO1vSuedn0avdx6WSS+siIdUk5cAQAED6oaxRJCIHJzEgw6Izw6OKBzv/rf3CQiIqKmwZGsBorJisG+S/sgCQkAkGpIRbvb2mHv7r3QKrV43ONxVF6pRJ8elnvj8ezhDEhGATc/e7h42wEAkmOv4PK5fCgUcoQ/EACZnI8JiYiImgNHshpAkiTMOTAHBskAGWSQhISUohR4TvJEzhc5qNxaiRXKFVi9ejXat29vkRiNegkJh6vetuz210bPFSV6HNmaAgDoOdwHDq7WFomNiIioLWKS1QAfRH+AtJI0CAjI/xr8ExCwdrPGxp834g6fOywbIKpGrCpK9bB11MC3W9VejlHbUlBZpoeThw26D7FM8kdERNRWMcmqxZXiSmyOTkNafjlUVpfwY/ZGCPy9z6EccigUChiFESuOr0B3l+5wsXKxWLxCCNOyDV3CPCFXyJGWkI+kmGzIZDIMfCAQCgWfDBMRETUnJln/sDs+C1O+iobBKEGuLIHG72PIlDpcu+KBkAkYJSMUMgXyK/LxS8oveCz4MYvFnJlUiPzMUihVcnTu7wF9pRGHNldtnRM80BOuvnYWi42IiKitYpJ1jSvFlZjyVTT0BgkCRqjdf4BMWbXDtxCAlVILrVILhUwBjUIDHzsf+Dv4Y5jvMIvGHX+wahQrsLc7NFZKHPk5GSUFlbB10qLXSD+LxkZERNRWMcm6xuboNBiMEgQAVbuDUGjTAEkNYdTAWBaEAQG98UhoKHztfeFh7QGFXGHpkFGUU45L8XkAgK4DPXHlYjHO/PXoMPz/AqBSWz5GIiKitohJ1jXS8sshl8kgCQGZohQQCpRffhTG0k5QymVw9PNFmFd3S4dZzZnIDAgA3kFOsHPW4ueP4iAABIS6oX2Qk6XDIyIiarOYZF3D28kKkqia4K67cjd0uUMBSQsAkISATzsrS4ZXg67CgPPHsgAAwQO9cGrfZeRnlkJro0K/+zpYODoiIqK2ja+cXWNcqDeUCjmq5rjLTAmWDIBSIce4UG8LRldT4rFs6CuNcHSzhrWjGrG/XwQA9B/dEVqb5t/Sh4iIiP7GJOsarnYarJwYCpVSDrkMUMplkMsAlVKOlRND4WLbcvb8kyRhmvDeJcwThzYnQTIKeAc5oUOI5ZaTICIioip8XPgPd3Z1x8GZw7AlJg2X8srh084K40K9W1SCBQBpZ/NQnFcBjZUSkiQhK7UISrUCYf8XCJmMW+cQERFZGpOsWrjaafDc7QGWDqNe8X+9Qejf0wUxv1Y9Jux9tx9snVpWMkhERNRWMclqhfIySpGRVAiZXIalH0fg4PE9yC3KxPEJ0QC8LB0eERERgXOyWqWro1jOnjbo6hGGOY99Ch9vX8jlfExIRETUUjDJaiWEJJCbXoLSwgokx1wBBFB4pRxBPiG4Y0xvyBVMsIiIiFoSPi5sJeIPpiPq5xSotArodUaoNAroKg1wdLNGj2Eta2kJIiIiYpLVauSml0JXYUBZsQ4AoK8wQm2twMDxnaBQckCSiIiopeFv51airFAHySgAAUAARoMEuUwGo0GydGhERERUC45ktRKlBRWQJFHtWGWZATtXn0LXcE8LRUVERER1YZLVCgghUJxXWTWK9RelRg6jTsLGX5bi1KojKCrPw8iRI2FnZ4fExETLBUtEREQAmGS1CvoKIypK9abvZXJAMgiorZSY+tA89L+/I/xv41Y6RERELQmTrBbsSnElNkenISuxEM76v+deKVUKqK2V6D7YCz3v9IVKo7BglERERFQbJlkt1O74LEz5KhoGo4RRpSq0Q1UipVAr4NfdGf3v7whHN2sLR0lERER14duFLdCV4kpM+SoaeoMEuQR466uaSQdgi6YSvSYEMsEiIiJq4ZhktUCbo9NgMEoQADrpFZBBhityCZ/aVSBRacCPsZctHSIRERFdB5OsFigtvxxyWdU2OfK/3ig8rDXCoADkMhku5ZVbMDoiIiJqCM7JaoG8nawgiars6rTaiBSVEWV/pcOSEPBpZ2XB6IiIiKghOJLVAo0L9YZSIYcMAGQwJVgyAEqFHONCuVchERFRS8ckqwVytdNg5cRQqJRyyGWAUi6DXAaolHKsnBgKF1uNpUMkIiKi6+Djwhbqzq7uODhzGLbEpOFSXjl82llhXKg3EywiIqJWgklWC+Zqp8FztwdYOgwiIiK6AXxcSERERGQGTLKIiIiIzIBJFhEREZEZMMkiIiIiMgMmWURERERmwCSLiIiIyAyYZBERERGZAZMsIiIiIjNgkkVERERkBkyyiIiIiMyASRYRERGRGTDJIiIiIjIDJllEREREZsAki4iIiMgMmGQRERERmQGTLCIiIiIzYJJFREREZAZMsoiIiIjMgEkWERERkRkwySIiIiIyAyZZRERERGbAJIuIiIjIDJhkEREREZkBkywiIiIiM2CSRURERGQGTLKIiIiIzIBJFhEREZEZMMkiIiIiMgMmWURERERmwCSLiIiIyAyYZBERERGZAZMsIiIialWmTZsGf39/ODg4VDs+YsQI9OjRAyEhIRg8eDBiYmIsFGEVJllERETUqowfPx4HDhyAr69vtePffvstTpw4gdjYWEyfPh1PPPGEZQL8i9KidyciIiJqpNtvv73W446OjqY/FxYWQiaTNVNEtWOSRURERLeMxx9/HHv37gUA7Nixw6Kx8HEhERER3TI2bNiAS5cuYdGiRZg5c6ZFY2GSRURERLecSZMmYe/evcjNzbVYDEyyiIiIqNUrKChAenq66fsff/wRzs7OaNeuncVi4pwsIiIialWef/55bN++HZmZmQCAkJAQ7N27Fw8++CDKy8shl8vh6uqKbdu2WXTyu0wIISx2dwsoKiqCg4MDCgsLYW9vb+lw6C9CCBQWFsLBwcHib4NQdWyblo3t03Kxbcyvpf9O50gWERERtRhXiiuxOToNafnl8HaywrhQb7jaaSwd1g1hkkVEREQtwu74LEz5KhoGowS5TAZJCLz/2zmsnBiKO7u6Wzq8RuPEdyIiIrK4K8WVmPJVNPQGCZIADJKAJAC9QcLkjdG4Ulxp6RAbjUkWERERWdzm6DQYjBL+OVFcADAYJWyJSbNEWDeFSRYRERFZXFp+OeR1vCAgl8lwKa+8mSO6eUyyiIiIyOK8nawg1bHggSQEfNpZNXNEN49JFhEREVncuFBvKBVy/HMsSwZAqZBjXKi3JcK6KUyyiIiIyOJc7TRYOTEUKqUcchmglMsglwEqpRwrJ4bCxbb1LePAJRyIiIioRbizqzsOzhyGLTFpuJRXDp92VetktcYEC2CSRURERC2Iq50Gz90eYOkwmgQfFxIRERGZAZMsIiIiIjNgkkVERERkBm1uTpb4aw2OoqIiC0dC1xJCoKioCDKZjLvVtzBsm5aN7dNysW3M7+rvclHH+lqW1uaSrOLiYgCAj4+PhSMhIiKiplBcXAwHBwdLh1GDTLTU9M9MJElCeno67Ozs+D+LFqSoqAg+Pj64dOkS7O3tLR0OXYNt07KxfVouto35CSFQXFwMLy8vyOUtbwZUmxvJksvl8PZufavGthX29vb8YdRCsW1aNrZPy8W2Ma+WOIJ1VctL+4iIiIhuAUyyiIiIiMyASRa1CBqNBhEREdBoWufWCbcytk3LxvZpudg21OYmvhMRERE1B45kEREREZkBkywiIiIiM2CSRURERGQGTLKIiIiIzIBJFhEREZEZMMmiZvPJJ5/A398fWq0W/fv3R1RUVJ1l16xZg8GDB8PJyQlOTk4YPnx4veXp5jSmba71zTffQCaTYezYseYNsI1rbPsUFBRg6tSp8PT0hEajQefOnbFjx45mirZtaWzbfPDBBwgKCoKVlRV8fHzw6quvoqKiopmipWYniJrBN998I9RqtVi3bp04ffq0ePbZZ4Wjo6PIysqqtfwjjzwiPvnkExETEyPOnDkjnnjiCeHg4CDS0tKaOfJbX2Pb5qqUlBTRvn17MXjwYHH//fc3T7BtUGPbp7KyUvTp00eMGjVKHDhwQKSkpIh9+/aJ2NjYZo781tfYttm4caPQaDRi48aNIiUlRezatUt4enqKV199tZkjp+bCJIuaRb9+/cTUqVNN3xuNRuHl5SWWLFnSoOsNBoOws7MTX3zxhblCbLNupG0MBoMIDw8Xn332mZg0aRKTLDNqbPusXLlSdOzYUeh0uuYKsc1qbNtMnTpVDBs2rNqx6dOni4EDB5o1TrIcPi4ks9PpdDh+/DiGDx9uOiaXyzF8+HAcOnSoQXWUlZVBr9ejXbt25gqzTbrRtlm4cCHc3Nzw9NNPN0eYbdaNtM/WrVsRFhaGqVOnwt3dHd27d8c777wDo9HYXGG3CTfSNuHh4Th+/LjpkWJycjJ27NiBUaNGNUvM1PyUlg6Abn05OTkwGo1wd3evdtzd3R1nz55tUB0zZ86El5dXtR9odPNupG0OHDiAtWvXIjY2thkibNtupH2Sk5OxZ88eTJw4ETt27EBiYiKmTJkCvV6PiIiI5gi7TbiRtnnkkUeQk5ODQYMGQQgBg8GAF154AbNnz26OkMkCOJJFLd67776Lb775Blu2bIFWq7V0OG1acXExHnvsMaxZswYuLi6WDodqIUkS3Nzc8N///he9e/fGhAkTMGfOHKxatcrSobV5+/btwzvvvINPP/0U0dHR2Lx5M7Zv3463337b0qGRmXAki8zOxcUFCoUCWVlZ1Y5nZWXBw8Oj3muXL1+Od999F7t370aPHj3MGWab1Ni2SUpKQmpqKkaPHm06JkkSAECpVCIhIQEBAQHmDboNuZF/O56enlCpVFAoFKZjXbt2RWZmJnQ6HdRqtVljbitupG3mzZuHxx57DM888wwA4LbbbkNpaSmee+45zJkzB3I5xz1uNWxRMju1Wo3evXvj999/Nx2TJAm///47wsLC6rzuvffew9tvv42dO3eiT58+zRFqm9PYtunSpQtOnjyJ2NhY09eYMWMwdOhQxMbGwsfHpznDv+XdyL+dgQMHIjEx0ZT8AsC5c+fg6enJBKsJ3UjblJWV1UikribDQgjzBUuWY+mZ99Q2fPPNN0Kj0Yj169eL+Ph48dxzzwlHR0eRmZkphBDiscceE2+++aap/LvvvivUarX4/vvvRUZGhumruLjYUh/hltXYtvknvl1oXo1tn4sXLwo7Ozvx4osvioSEBLFt2zbh5uYmFi1aZKmPcMtqbNtEREQIOzs78fXXX4vk5GTx66+/ioCAAPGvf/3LUh+BzIyPC6lZTJgwAVeuXMH8+fORmZmJkJAQ7Ny50zRp9OLFi9X+h7dy5UrodDqMHz++Wj0RERFYsGBBc4Z+y2ts21Dzamz7+Pj4YNeuXXj11VfRo0cPtG/fHi+//DJmzpxpqY9wy2ps28ydOxcymQxz587F5cuX4erqitGjR2Px4sWW+ghkZjIhOEZJRERE1NT431MiIiIiM2CSRURERGQGTLKIiIiIzIBJFhEREZEZMMkiIiIiMgMmWURERERmwCSLiIiIyAyYZBERERGZAZMsIiIiIjNgkkVERERkBkyyiIiIiMyASRYRERGRGTDJIiIiIjIDJllEREREZsAki4iIiMgMmGQRERERmQGTLCIiIiIzUDb2AqPRCL1eb45YiIiIiFo0tVoNubxhY1QNTrKEEMjMzERBQcGNxkVERETUqsnlcnTo0AFqtfq6ZWVCCNGQSjMyMlBQUAA3NzdYW1tDJpPddKBERERErYUkSUhPT4dKpYKvr+91c6EGjWQZjUZTguXs7NwkgRIRERG1Nq6urkhPT4fBYIBKpaq3bIMeKl6dg2VtbX3z0RERERG1UlcfExqNxuuWbdTbhXxESERERG1ZY3IhLuFAREREZAZMssxkwYIFCAkJsXQYdAtYu3YtRowY0Wz3e+ihh/D+++832/2o5WMfJEtq1f1PNEB5ebmIj48X5eXlDSneomRnZ4sXXnhB+Pj4CLVaLdzd3cWIESPEgQMHzHrf4uJikZOTY9Z7tHWRkZFCLpeLUaNGWSyGlJQUAUDExMRct+yFCxfEqFGjhJWVlXB1dRWvv/660Ov19V5TXl4uPD09q/XXiIgIAUAAEAqFQjg7O4vBgweLFStWiIqKiuvGsXfvXtGrVy+hVqtFQECA+Pzzz6udP3nypHBychIFBQXXrauta019MDY2Vjz00EPC29tbaLVa0aVLF/HBBx9ct372wZarNfW/nJwcMXLkSOHp6SnUarXw9vYWU6dOFYWFhfVe1xL7X2Nyolt+JOuBBx5ATEwMvvjiC5w7dw5bt27FHXfcgdzc3BuqT6fTNaicra0t38Q0s7Vr1+Kll17Cn3/+ifT0dEuHUy+j0Yh7770XOp0OkZGR+OKLL7B+/XrMnz+/3uu+//572NvbY+DAgdWOd+vWDRkZGbh48SL27t2LBx98EEuWLEF4eDiKi4vrrC8lJQX33nsvhg4ditjYWLzyyit45plnsGvXLlOZ7t27IyAgAP/73/9u7kO3Aa2pDx4/fhxubm743//+h9OnT2POnDmYNWsW/vOf/9R7Hftgy9Wa+p9cLsf999+PrVu34ty5c1i/fj12796NF154od7rWn3/u24a1sisrT7ZRRVi1b5EMXfLSbFqX6LILrp+xnkz8vPzBQCxb9++ess8/fTTwsXFRdjZ2YmhQ4eK2NhY0/mIiAjRs2dPsWbNGuHv7y9kMplYvXq18PT0FEajsVpdY8aMEU8++WS16661du1aERwcLNRqtfDw8BBTp05tcBxUXXFxsbC1tRVnz54VEyZMEIsXL65R5qeffhKBgYFCo9GIO+64Q6xfv14AEPn5+aYy+/fvF4MGDRJarVZ4e3uLl156SZSUlJjO+/n5icWLF4snn3xS2NraCh8fH7F69WrTefz1v6mrX0OGDKk13h07dgi5XC4yMzNNx1auXCns7e1FZWVlnZ/z3nvvFa+//nq1Y7X1LSGEOHPmjFCr1WLOnDl11vfGG2+Ibt26VTs2YcIEMXLkyGrH3nrrLTFo0KA666HW1wdrM2XKFDF06NB6y7APtky3Qv/78MMPhbe3d71lWmL/a0xO1GxJ1m+nM0WnOTtEhze3iYBZ20WHN7eJTnN2iN3xmde/+Abp9Xpha2srXnnllTqHEIcPHy5Gjx4tjh49Ks6dOydee+014ezsLHJzc4UQVY1pY2Mj7r77bhEdHS3i4uJEXl6eUKvVYvfu3aZ6cnNzqx37Zyf49NNPhVarFR988IFISEgQUVFRYsWKFQ2OozlIkiTKKg0W+ZIkqVGxrl27VvTp00cIIcTPP/8sAgICqtWRnJwsVCqVeP3118XZs2fF119/Ldq3b1/tB0xiYqKwsbERK1asEOfOnRMHDx4UvXr1Ek888YSpHj8/P9GuXTvxySefiPPnz4slS5YIuVwuzp49K4QQIioqSgAQu3fvFhkZGXW217x582r8UEhOThYARHR0dJ2f08HBQXzzzTfVjtX1A0YIIe6//37RtWvXOusbPHiwePnll6sdW7dunbC3t6927JdffhFqtbpBQ+9NSpKEqCxt/q9G9j8hWl8frM3EiRPFAw88UG+ZttQHJUkSukpDs3819uefEK2//12+fFkMGTJETJw4sd5yLbH/NSYnavTehTfiSnElpnwVDb1BggAg/bXIvN4gYfLGaBycOQyudpomv69SqcT69evx7LPPYtWqVQgNDcWQIUPw0EMPoUePHjhw4ACioqKQnZ0Njabq/suXL8ePP/6I77//Hs899xyAqkeEGzZsgKurq6nue+65B1999RXuvPNOAFVDmi4uLhg6dGitsSxatAivvfYaXn75ZdOxvn37AkCD4zC3Cr2EIcv2Nsu9/umPGUNhpVY0uPzatWvx6KOPAgDuvvtuFBYW4o8//sAdd9wBAFi9ejWCgoKwbNkyAEBQUBBOnTqFxYsXm+pYsmQJJk6ciFdeeQUA0KlTJ3z00UcYMmQIVq5cCa1WCwAYNWoUpkyZAgCYOXMmVqxYgb179yIoKMjUJ5ydneHh4VFnvJmZmXB3d6927Or3mZmZtV5TUFCAwsJCeHl5NfjvpUuXLvj1118bHUdRURHKy8thZWUFAPDy8oJOp0NmZib8/PwafP+bpi8HPurVfPe7aloMoG7cOoCtrQ/+U2RkJDZt2oTt27fXWaat9UGDXsL/5h1qlntd69G3w6BqxM8/oPX2v4cffhg//fQTysvLMXr0aHz22Wd1lr0V+l+zzMnaHJ0Gg7EqwbqWAGAwStgSk2a2ez/wwANIT0/H1q1bcffdd2Pfvn0IDQ3F+vXrERcXh5KSEjg7O8PW1tb0lZKSgqSkJFMdfn5+1RIsAJg4cSJ++OEHVFZWAgA2btyIhx56qNZNI7Ozs5Genm5KyP6poXFQlYSEBERFReHhhx8GUJVMT5gwAWvXrq1W5moSe1W/fv2qfR8XF4f169dX+zsfOXIkJElCSkqKqVyPHj1Mf5bJZPDw8EB2drY5Plo15eXlAGD6QdcQQogmWc/u6g+asrKym67rVtTa++CpU6dw//33IyIiot63ttgHW6bW3P9WrFiB6Oho/PTTT0hKSsL06dPrLHsr9L9mGclKyy+HXCYzjWBdSy6T4VJeuVnvr9Vqcdddd+Guu+7CvHnz8MwzzyAiIgJTpkyBp6cn9u3bV+MaR0dH059tbGxqnB89ejSEENi+fTv69u2L/fv3Y8WKFbXe/2pj1aWkpKRBcZibViXHHzNqH4lrjns31Nq1a2EwGKr970YIAY1Gg//85z9wcHBoUD0lJSV4/vnnMW3atBrnfH19TX/+57YJMpkMkiQ1OF4A8PDwQFRUVLVjWVlZpnO1cXZ2hkwmQ35+foPvc+bMGXTo0KHeOK7e99o47O3tq/XTvLw8AKjxnwuzU1lVjSo1N1X9/0b/qTX2wavi4+Nx55134rnnnsPcuXPrLdvW+qBSJcejb4c12/2uvW9jtOb+5+HhAQ8PD3Tp0gXt2rXD4MGDMW/ePHh6etYoeyv0v2ZJsrydrGpNsICqR4c+7Rr3A+5mBQcH48cff0RoaCgyMzOhVCrh7+/fqDq0Wi3GjRuHjRs3IjExEUFBQQgNDa21rJ2dHfz9/fH777/X+jjxZuJoSjKZrFGP7CzBYDBgw4YNeP/992v8D3zs2LH4+uuv8cILLyAoKAg7duyodv7o0aPVvg8NDUV8fDwCAwNvOJ6Gbq8QFhaGxYsXIzs7G25ubgCA3377Dfb29ggODq6z7uDgYMTHxzdojZizZ89i586dmDVrVr1x/PPv5bfffkNYWPVfLKdOnYK3tzdcXFyue98mJZM1+rFdc2utfRAATp8+jWHDhmHSpEnVHhvVV3db6oMymazRj+2aW2vuf/90NVG7+kSotrpbff+77qytRk7yqk12UYXoNGeH8J+5Tfhd8+U/s2ry+5Vi80xszMnJEUOHDhVffvmliIuLE8nJyeLbb78V7u7u4qmnnhKSJIlBgwaJnj17il27domUlBRx8OBBMXv2bHH06FEhRP0T7H777Teh0WhEUFCQePvtt6ud++d169evF1qtVnz44Yfi3Llz4vjx4+Kjjz4SQogGxUFVtmzZItRqda3rl7zxxhumiaBXJ32+8cYbIiEhQWzatEl4e3sLAKZr4+LihJWVlZg6daqIiYkR586dEz/++GO1tz79/PyqvaAghBA9e/YUERERQoiqlyusrKzEokWLRGZmZp3rqhgMBtG9e3cxYsQIERsbK3bu3ClcXV3FrFmz6v2806dPrzExOSIiQnTr1k1kZGSIy5cvixMnToiPPvpIuLm5ib59+4ri4uI660tOThbW1tZixowZ4syZM+KTTz4RCoVC7Ny5s1q5SZMmiaeeeqre2Nqq1toHT548KVxdXcWjjz4qMjIyTF/Z2dn1fl72wZaltfa/7du3i3Xr1omTJ0+KlJQUsW3bNtG1a1cxcODAej9vS+x/LfLtwt3xzf92YUVFhXjzzTdFaGiocHBwENbW1iIoKEjMnTtXlJWVCSGEKCoqEi+99JLw8vISKpVK+Pj4iIkTJ4qLFy8KIepPsoxGo/D09BQARFJSUrVztV23atUqERQUJFQqlfD09BQvvfSS6dz14qAq9913X50L7x05ckQAEHFxcUKImq8vr1y5UgCo1o+joqLEXXfdJWxtbYWNjY3o0aNHtVehr/cDRggh1qxZI3x8fIRcLq/39eXU1FRxzz33CCsrK+Hi4iJee+216y5Gevr0aWFlZVXtB9c/F+Jr166dGDRoUKMW4gsJCRFqtVp07NixxkJ85eXlwsHBQRw6dOi6dbVFrbUPXttvrv3y8/Or9/OyD7YsrbX/7dmzR4SFhQkHBweh1WpFp06dxMyZM6stJ1Gbltj/GpMTyYSo4zneNSoqKpCSkoIOHTo0agLaP10prsSWmDRcyiuHTzsrjAv1hott079VSFSbxYsXY9WqVbh06ZKlQ2mUBx98EKGhofUOgTellStXYsuWLfW+oUM3hn2wYdgHzYP9r2Gu1/8akxM1y5ysq1ztNHju9oDmvCW1YZ9++in69u0LZ2dnHDx4EMuWLcOLL75o6bAabdmyZfj555+b7X4qlQoff/xxs93vVsY+eGPYB5sG+9+Nacr+16wjWUTN6dVXX8WmTZuQl5cHX19fPPbYY5g1axaUymb9vwW1YeyDZEnsf+bRmJyISRYRERFRAzUmJ7rlN4gmIiIisgQmWURERERmwCSLiIiIyAyYZBERERGZAZMsIiIiIjMw23ucutRUGEtLG32dwsYGagvu30dERETUFMySZOlSU5F09z03fH3Azl+YaBH95ffff8eLL76IU6dOQaEw/+a1b775JkpLS7kYJBHRTTLL48IbGcFqyuuv9cQTT0Amk1Xtrq5Swd3dHXfddRfWrVtn2gG8uaSmpkImkyE2NrZZ73urOnToEBQKBe69916LxdCYNp02bRp69+4NjUaDkJCQBt/jjTfewNy5c00J1vr16019WqFQwMnJCf3798fChQtRWFh43fpOnDiBwYMHQ6vVwsfHB++9916186+//jq++OILJCcnNzhGIiKqqU3Mybr77ruRkZGB1NRU/PLLLxg6dChefvll3HfffTAYDJYOj27Q2rVr8dJLL+HPP/9Eenq6pcNpkKeeegoTJkxocPkDBw4gKSkJDzzwQLXj9vb2yMjIQFpaGiIjI/Hcc89hw4YNCAkJqffvoqioCCNGjICfnx+OHz+OZcuWYcGCBfjvf/9rKuPi4oKRI0di5cqVjf+ARERk0iaSLI1GAw8PD7Rv3x6hoaGYPXs2fvrpJ/zyyy9Yv349AKCgoADPPPMMXF1dYW9vj2HDhiEuLs5Ux4IFCxASEoLVq1fDx8cH1tbW+Ne//lVt5ECSJCxcuBDe3t6m0YqdO3eaznfo0AEA0KtXL8hkMtxxxx3N8vlvRSUlJdi0aRMmT56Me++919SO19q6dSs6deoErVaLoUOH4osvvoBMJkNBQYGpzIEDBzB48GBYWVnBx8cH06ZNQ+k1I6n+/v5455138NRTT8HOzg6+vr7VEpLGtOlHH32EqVOnomPHjg3+nN988w3uuuuuGqsKy2QyeHh4wNPTE127dsXTTz+NyMhIlJSU4I033qizvo0bN0Kn02HdunXo1q0bHnroIUybNg3//ve/q5UbPXo0vvnmmwbHSURENbWJJKs2w4YNQ8+ePbF582YAVbt8Z2dn45dffsHx48cRGhqKO++8E3l5eaZrEhMT8e233+Lnn3/Gzp07ERMTgylTppjOf/jhh3j//fexfPlynDhxAiNHjsSYMWNw/vx5AEBUVBQAYPfu3cjIyDDdu6UQQqDcUG6Rrwbs7lTNt99+iy5duiAoKAiPPvoo1q1bV62OlJQUjB8/HmPHjkVcXByef/55zJkzp1odSUlJuPvuu/HAAw/gxIkT2LRpEw4cOFBjA9X3338fffr0MbX35MmTkZCQAMD8bbp//3706dOnQWXd3NwwceJEbN26FUajsdYyhw4dwu233w61Wm06NnLkSCQkJCA/P990rF+/fkhLS0NqaupNxU9E1Ja16V0iu3TpghMnTuDAgQOIiopCdnY2NBoNAGD58uX48ccf8f333+O5554DULVf0YYNG9C+fXsAwMcff4x7770X77//Pjw8PLB8+XLMnDkTDz30EABg6dKl2Lt3Lz744AN88skncHV1BQA4OzvDw8PDAp+4fhXGCty72TLzm7aP2w4rpVWDy69duxaPPvoogKrHwYWFhfjjjz9MI0mrV69GUFAQli1bBgAICgrCqVOnsHjxYlMdS5YswcSJE/HKK68AADp16oSPPvoIQ4YMwcqVK02jR6NGjTIl0zNnzsSKFSuwd+9eBAUFmb1NL1y4AC8vrwaX79KlC4qLi5Gbmws3N7ca5zMzM02jb1e5u7ubzjk5OQGA6Z4XLlyAP19CISK6IW06yRJCQCaTIS4uDiUlJXB2dq52vry8HElJSabvfX19TQkWAISFhUGSJCQkJMDa2hrp6ekYOHBgtToGDhxY7bEj3byEhARERUVhy5YtAAClUokJEyZg7dq1piQrISEBffv2rXZdv379qn0fFxeHEydOYOPGjaZjQghIkoSUlBR07doVANCjRw/T+auP6bKzs83x0WooLy9v1KbsV0fzZDLZTd3Xyqoq4S0rK7upeoiI2rI2nWSdOXMGHTp0QElJCTw9PbFv374aZRwdHZs9LkvRKrTYPm67xe7dUGvXroXBYKg2wiOEgEajwX/+8x84ODg0qJ6SkhI8//zzmDZtWo1zvr6+pj+rVKpq52QyWbO9meri4lLtMd71nDlzBvb29jX+w3CVh4cHsrKyqh27+v21I3FXH5NfHakjIqLGa7NJ1p49e3Dy5Em8+uqr8Pb2RmZmJpRKZb2PRi5evIj09HTTL/fDhw9DLpcjKCgI9vb28PLywsGDBzFkyBDTNQcPHjSNoFydB1PXfBlLk8lkjXpkZwkGgwEbNmzA+++/jxEjRlQ7N3bsWHz99dd44YUXEBQUhB07dlQ7f/To0Wrfh4aGIj4+HoGBgTccj7nbtFevXoiPj29Q2ezsbHz11VcYO3Ys5PLap1uGhYVhzpw50Ov1puTxt99+Q1BQkOlRIQCcOnUKKpUK3bp1u/kPQUTURrWJie+VlZXIzMzE5cuXER0djXfeeQf3338/7rvvPjz++OMYPnw4wsLCMHbsWPz6669ITU1FZGQk5syZg2PHjpnq0Wq1mDRpEuLi4rB//35MmzYN//rXv0wjADNmzMDSpUuxadMmJCQk4M0330RsbCxefvllAFUTk62srLBz505kZWU1aE0jqm7btm3Iz8/H008/je7du1f7euCBB7B27VoAwPPPP4+zZ89i5syZOHfuHL799lvTG4hXH6XNnDkTkZGRePHFFxEbG4vz58/jp59+qjHxvT6NadPExETExsYiMzMT5eXliI2NRWxsLHQ6XZ3XjBw5EgcOHKhxXAiBzMxMZGRk4MyZM1i3bh3Cw8Ph4OCAd999t876HnnkEajVajz99NM4ffo0Nm3ahA8//BDTp0+vVm7//v2mty6JiOgGiQYoLy8X8fHxory8vCHFRdmpUyI+qMsNf5WdOtWg+zTEpEmTBAABQCiVSuHq6iqGDx8u1q1bJ4xGo6lcUVGReOmll4SXl5dQqVTCx8dHTJw4UVy8eFEIIURERITo2bOn+PTTT4WXl5fQarVi/PjxIi8vz1SH0WgUCxYsEO3btxcqlUr07NlT/PLLL9XiWbNmjfDx8RFyuVwMGTKkyT5nW3HfffeJUaNG1XruyJEjAoCIi4sTQgjx008/icDAQKHRaMQdd9whVq5cKQBU68dRUVHirrvuEra2tsLGxkb06NFDLF682HTez89PrFixotp9evbsKSIiIkzfN7RNhwwZYuqL136lpKTUeU1ubq7QarXi7NmzpmOff/656VqZTCYcHBxEv379xMKFC0VhYWGddV0VFxcnBg0aJDQajWjfvr149913a5QJCgoSX3/99XXrIiJqaxqTE8mEuP678xUVFUhJSUGHDh0aNAm3/PRppD4w/oYTP/8fvodVC3tMsWDBAvz4449crb0VW7x4MVatWoVLly5ZOpRGmTFjBoqKirB69epmud8vv/yC1157DSdOnIBS2WZnFBAR1aoxOVGbeFxIbdOnn36Ko0ePIjk5GV9++SWWLVuGSZMmWTqsRpszZw78/PyabbJ9aWkpPv/8cyZYREQ3iT9F6ZZ1/vx5LFq0CHl5efD19cVrr72GWbNmWTqsRnN0dMTs2bOb7X7jx9/4KDQREf3NLI8LdampSLr7nhsOKmDnL1BzAUQiIiJqYRqTE5llJEvt74+Anb/AeM0ecA2lsLFhgkVEREStXqOSrAYMepkwUSIiIqJbTWNyoQZNfL+6aCG32CAiIqK27OrahgqF4rplGzSSpVAo4OjoaNqvzdra+qb3RiMiIiJqTSRJwpUrV2Btbd2gN7Ab/Ljw6qrmzbUxLhEREVFLI5fL4evr26DBpga9XXgto9EIvV5/w8ERERERtVZqtbrO/WH/qdFJFhERERFdH1d8JyIiIjIDJllEREREZsAki4iIiMgMmGQRERERmQGTLCIiIiIzYJJFREREZAZMsoiIiIjM4P8BB1GCWsL8aLcAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_solution(env, batch_idx=0)" ] }, { "cell_type": "markdown", "id": "755f3386", "metadata": {}, "source": [ "## Quick walkthrough" ] }, { "cell_type": "markdown", "id": "0ae4d0ba", "metadata": {}, "source": [ "Let's now go through the library's building blocks, exploring their functionalities." ] }, { "cell_type": "markdown", "id": "35dc26a8", "metadata": {}, "source": [ "### Instance generation" ] }, { "cell_type": "markdown", "id": "e451a64f", "metadata": {}, "source": [ "We can generate instances using one of the two available methods `InstanceGenerator` and `BenchmarkInstanceGenerator`:" ] }, { "cell_type": "code", "execution_count": 14, "id": "d93b0219", "metadata": {}, "outputs": [], "source": [ "from maenvs4vrp.environments.cvrptw.instances_generator import InstanceGenerator\n", "from maenvs4vrp.environments.cvrptw.benchmark_instances_generator import BenchmarkInstanceGenerator" ] }, { "cell_type": "markdown", "id": "a8f2261c", "metadata": {}, "source": [ "#### Random generated instances" ] }, { "cell_type": "markdown", "id": "b623a211", "metadata": {}, "source": [ "Random instances are generated following:\n", "\n", "Li, S., Yan, Z., & Wu, C. (2021). [Learning to delegate for large-scale vehicle routing](https://proceedings.neurips.cc/paper/2021/hash/dc9fa5f217a1e57b8a6adeb065560b38-Abstract.html). Advances in Neural Information Processing Systems, 34, 26198-26211." ] }, { "cell_type": "code", "execution_count": 15, "id": "244b3e52", "metadata": {}, "outputs": [], "source": [ "generator = InstanceGenerator()" ] }, { "cell_type": "code", "execution_count": 16, "id": "e1da42b5", "metadata": {}, "outputs": [], "source": [ "instance = generator.sample_instance(num_agents=2, num_nodes=10)" ] }, { "cell_type": "code", "execution_count": 17, "id": "04a98361-efb4-4613-ae8f-69335db039b4", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_random_batch_instances(instance,\n", " n=1,\n", " figsize_per_plot=(2,2),\n", " annotate=False,\n", " )" ] }, { "cell_type": "code", "execution_count": 18, "id": "c0b10f39", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['name', 'num_nodes', 'num_agents', 'data'])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance.keys()" ] }, { "cell_type": "code", "execution_count": 19, "id": "5f77204e", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'name': 'random_instance',\n", " 'num_nodes': 10,\n", " 'num_agents': 2,\n", " 'data': TensorDict(\n", " fields={\n", " capacity: Tensor(shape=torch.Size([1, 1]), device=cpu, dtype=torch.float32, is_shared=False),\n", " coords: Tensor(shape=torch.Size([1, 10, 2]), device=cpu, dtype=torch.float32, is_shared=False),\n", " demands: Tensor(shape=torch.Size([1, 10]), device=cpu, dtype=torch.float32, is_shared=False),\n", " depot_idx: Tensor(shape=torch.Size([1, 1]), device=cpu, dtype=torch.int64, is_shared=False),\n", " end_time: Tensor(shape=torch.Size([1]), device=cpu, dtype=torch.float32, is_shared=False),\n", " is_depot: Tensor(shape=torch.Size([1, 10]), device=cpu, dtype=torch.bool, is_shared=False),\n", " service_time: Tensor(shape=torch.Size([1, 10]), device=cpu, dtype=torch.float32, is_shared=False),\n", " start_time: Tensor(shape=torch.Size([1]), device=cpu, dtype=torch.float32, is_shared=False),\n", " tw_high: Tensor(shape=torch.Size([1, 10]), device=cpu, dtype=torch.float32, is_shared=False),\n", " tw_low: Tensor(shape=torch.Size([1, 10]), device=cpu, dtype=torch.float32, is_shared=False)},\n", " batch_size=torch.Size([1]),\n", " device=cpu,\n", " is_shared=False)}" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance" ] }, { "cell_type": "markdown", "id": "6bfb32ed-5796-44c2-95a9-d5dca56a3174", "metadata": {}, "source": [ "**Understanding the VRP Instance**\n", "\n", "This object represents a single **vehicle routing problem (VRP) instance**. \n", "It contains metadata and a `TensorDict` of all the data needed to define the problem.\n", "\n", "**Top-Level Metadata**\n", "\n", "| Key | Value / Type | Description |\n", "|------|-------------|-------------|\n", "| `name` | `'random_instance'` | Name or identifier of the VRP instance. |\n", "| `num_nodes` | `10` | Total number of nodes (customers + depot). |\n", "| `num_agents` | `2` | Number of agents/vehicles available. |\n", "\n", "---\n", "\n", "**Nested `data` TensorDict**\n", "\n", "This contains all the features of the VRP instance.\n", "\n", "| Key (inside `data`) | Shape | Description |\n", "|---------------------|--------|-------------|\n", "| `capacity` | `[1, 1]` (float) | Vehicle capacity constraint. |\n", "| `coords` | `[1, 10, 2]` (float) | Coordinates (x, y) of each node (including depot). |\n", "| `demands` | `[1, 10]` (float) | Demand at each node. |\n", "| `depot_idx` | `[1, 1]` (int) | Index of the depot node. |\n", "| `end_time` | `[1]` (float) | Latest allowed time for route completion. |\n", "| `is_depot` | `[1, 10]` (bool) | Boolean mask indicating which node is the depot. |\n", "| `service_time` | `[1, 10]` (float) | Service time required at each node. |\n", "| `start_time` | `[1]` (float) | Earliest allowed time for route start. |\n", "| `tw_high` | `[1, 10]` (float) | Upper bounds of time windows for each node. |\n", "| `tw_low` | `[1, 10]` (float) | Lower bounds of time windows for each node. |\n", "\n", "---" ] }, { "cell_type": "markdown", "id": "2a32f1ee", "metadata": {}, "source": [ "It's possible to load a set of pre-generaded instances, to be used as validation/test sets. For example:" ] }, { "cell_type": "code", "execution_count": 20, "id": "bd347421-77f1-4803-b9ec-257438a4bdcc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'servs_100_agents_25': {'validation': ['cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_2',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_31',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_43',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_55',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_0',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_1',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_10',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_11',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_12',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_13',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_14',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_15',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_16',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_17',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_18',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_19',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_20',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_21',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_22',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_23',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_24',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_25',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_26',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_27',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_28',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_29',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_3',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_30',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_32',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_33',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_34',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_35',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_36',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_37',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_38',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_39',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_4',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_40',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_41',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_42',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_44',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_45',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_46',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_47',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_48',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_49',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_5',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_50',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_51',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_52',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_53',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_54',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_56',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_57',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_58',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_59',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_6',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_60',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_61',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_62',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_63',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_7',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_8',\n", " 'cvrptw/data/generated/servs_100_agents_25/validation/generated_val_servs_100_agents_25_9'],\n", " 'test': ['cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_19',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_3',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_40',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_51',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_0',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_1',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_10',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_11',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_12',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_13',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_14',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_15',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_16',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_17',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_18',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_2',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_20',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_21',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_22',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_23',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_24',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_25',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_26',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_27',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_28',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_29',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_30',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_31',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_32',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_33',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_34',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_35',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_36',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_37',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_38',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_39',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_4',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_41',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_42',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_43',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_44',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_45',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_46',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_47',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_48',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_49',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_5',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_50',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_52',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_53',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_54',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_55',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_56',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_57',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_58',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_59',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_6',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_60',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_61',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_62',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_63',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_7',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_8',\n", " 'cvrptw/data/generated/servs_100_agents_25/test/generated_test_servs_100_agents_25_9']},\n", " 'servs_25_agents_10': {'validation': ['cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_2',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_31',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_43',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_0',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_1',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_10',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_11',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_12',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_13',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_14',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_15',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_16',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_17',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_18',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_19',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_20',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_21',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_22',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_23',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_24',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_25',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_26',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_27',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_28',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_29',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_3',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_30',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_32',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_33',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_34',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_35',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_36',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_37',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_38',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_39',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_4',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_40',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_41',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_42',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_44',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_45',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_46',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_47',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_48',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_49',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_5',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_50',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_51',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_52',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_53',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_54',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_55',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_56',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_57',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_58',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_59',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_6',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_60',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_61',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_62',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_63',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_7',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_8',\n", " 'cvrptw/data/generated/servs_25_agents_10/validation/generated_val_servs_25_agents_10_9'],\n", " 'test': ['cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_2',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_31',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_43',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_55',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_0',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_1',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_10',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_11',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_12',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_13',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_14',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_15',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_16',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_17',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_18',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_19',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_20',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_21',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_22',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_23',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_24',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_25',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_26',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_27',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_28',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_29',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_3',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_30',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_32',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_33',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_34',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_35',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_36',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_37',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_38',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_39',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_4',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_40',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_41',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_42',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_44',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_45',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_46',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_47',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_48',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_49',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_5',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_50',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_51',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_52',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_53',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_54',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_56',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_57',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_58',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_59',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_6',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_60',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_61',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_62',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_63',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_7',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_8',\n", " 'cvrptw/data/generated/servs_25_agents_10/test/generated_test_servs_25_agents_10_9']},\n", " 'servs_25_agents_25': {'validation': ['cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_2',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_31',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_43',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_0',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_1',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_10',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_11',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_12',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_13',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_14',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_15',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_16',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_17',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_18',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_19',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_20',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_21',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_22',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_23',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_24',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_25',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_26',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_27',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_28',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_29',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_3',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_30',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_32',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_33',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_34',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_35',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_36',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_37',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_38',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_39',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_4',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_40',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_41',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_42',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_44',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_45',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_46',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_47',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_48',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_49',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_5',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_50',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_51',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_52',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_53',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_54',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_55',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_56',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_57',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_58',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_59',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_6',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_60',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_61',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_62',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_63',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_7',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_8',\n", " 'cvrptw/data/generated/servs_25_agents_25/validation/generated_val_servs_25_agents_25_9'],\n", " 'test': ['cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_2',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_31',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_43',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_55',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_0',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_1',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_10',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_11',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_12',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_13',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_14',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_15',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_16',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_17',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_18',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_19',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_20',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_21',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_22',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_23',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_24',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_25',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_26',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_27',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_28',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_29',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_3',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_30',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_32',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_33',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_34',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_35',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_36',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_37',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_38',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_39',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_4',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_40',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_41',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_42',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_44',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_45',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_46',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_47',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_48',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_49',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_5',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_50',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_51',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_52',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_53',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_54',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_56',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_57',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_58',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_59',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_6',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_60',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_61',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_62',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_63',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_7',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_8',\n", " 'cvrptw/data/generated/servs_25_agents_25/test/generated_test_servs_25_agents_25_9']},\n", " 'servs_50_agents_25': {'validation': ['cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_2',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_31',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_43',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_0',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_1',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_10',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_11',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_12',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_13',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_14',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_15',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_16',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_17',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_18',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_19',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_20',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_21',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_22',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_23',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_24',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_25',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_26',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_27',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_28',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_29',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_3',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_30',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_32',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_33',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_34',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_35',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_36',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_37',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_38',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_39',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_4',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_40',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_41',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_42',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_44',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_45',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_46',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_47',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_48',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_49',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_5',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_50',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_51',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_52',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_53',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_54',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_55',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_56',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_57',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_58',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_59',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_6',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_60',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_61',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_62',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_63',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_7',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_8',\n", " 'cvrptw/data/generated/servs_50_agents_25/validation/generated_val_servs_50_agents_25_9'],\n", " 'test': ['cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_2',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_31',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_43',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_55',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_0',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_1',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_10',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_11',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_12',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_13',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_14',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_15',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_16',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_17',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_18',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_19',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_20',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_21',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_22',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_23',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_24',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_25',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_26',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_27',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_28',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_29',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_3',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_30',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_32',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_33',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_34',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_35',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_36',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_37',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_38',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_39',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_4',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_40',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_41',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_42',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_44',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_45',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_46',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_47',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_48',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_49',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_5',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_50',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_51',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_52',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_53',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_54',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_56',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_57',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_58',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_59',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_6',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_60',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_61',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_62',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_63',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_7',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_8',\n", " 'cvrptw/data/generated/servs_50_agents_25/test/generated_test_servs_50_agents_25_9']}}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "generator.get_list_of_benchmark_instances()" ] }, { "cell_type": "code", "execution_count": 21, "id": "9e681fd5", "metadata": {}, "outputs": [], "source": [ "set_of_instances = set(generator.get_list_of_benchmark_instances()['servs_100_agents_25']['validation'])" ] }, { "cell_type": "code", "execution_count": 22, "id": "4e82737b", "metadata": {}, "outputs": [], "source": [ "generator = InstanceGenerator(instance_type='validation', set_of_instances=set_of_instances)" ] }, { "cell_type": "code", "execution_count": 23, "id": "4b15974d", "metadata": {}, "outputs": [], "source": [ "instance = generator.sample_instance()" ] }, { "cell_type": "markdown", "id": "2badb78b", "metadata": {}, "source": [ "Let's check instance dict keys:" ] }, { "cell_type": "code", "execution_count": 24, "id": "a2a1c474", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['name', 'num_nodes', 'num_agents', 'data'])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance.keys()" ] }, { "cell_type": "code", "execution_count": 25, "id": "2b966652", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'random_instance'" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance['name']" ] }, { "cell_type": "markdown", "id": "ab722ca0", "metadata": {}, "source": [ "#### Benchmark instances" ] }, { "cell_type": "markdown", "id": "b9de3909", "metadata": {}, "source": [ "In order to narrow the current gap between the test beds for algorithm benchmarking used in RL\n", "and OR communities, the library allows a straightforward integration of classical OR benchmark\n", "instances. For example, we can load a set of classical benchmark instances. Let's see what benchmark instances we have for the CVPTW:" ] }, { "cell_type": "code", "execution_count": 26, "id": "36ae69eb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Solomon': ['R103',\n", " 'C101',\n", " 'C102',\n", " 'C103',\n", " 'C104',\n", " 'C105',\n", " 'C106',\n", " 'C107',\n", " 'C108',\n", " 'C109',\n", " 'C201',\n", " 'C202',\n", " 'C203',\n", " 'C204',\n", " 'C205',\n", " 'C206',\n", " 'C207',\n", " 'C208',\n", " 'R101',\n", " 'R102',\n", " 'R104',\n", " 'R105',\n", " 'R106',\n", " 'R107',\n", " 'R108',\n", " 'R109',\n", " 'R110',\n", " 'R111',\n", " 'R112',\n", " 'R201',\n", " 'R202',\n", " 'R203',\n", " 'R204',\n", " 'R205',\n", " 'R206',\n", " 'R207',\n", " 'R208',\n", " 'R209',\n", " 'R210',\n", " 'R211',\n", " 'RC101',\n", " 'RC102',\n", " 'RC103',\n", " 'RC104',\n", " 'RC105',\n", " 'RC106',\n", " 'RC107',\n", " 'RC108',\n", " 'RC201',\n", " 'RC202',\n", " 'RC203',\n", " 'RC204',\n", " 'RC205',\n", " 'RC206',\n", " 'RC207',\n", " 'RC208'],\n", " 'Homberger': ['C1_10_1',\n", " 'C1_10_10',\n", " 'C1_10_2',\n", " 'C1_10_3',\n", " 'C1_10_4',\n", " 'C1_10_5',\n", " 'C1_10_6',\n", " 'C1_10_7',\n", " 'C1_10_8',\n", " 'C1_10_9',\n", " 'C1_2_1',\n", " 'C1_2_10',\n", " 'C1_2_2',\n", " 'C1_2_3',\n", " 'C1_2_4',\n", " 'C1_2_5',\n", " 'C1_2_6',\n", " 'C1_2_7',\n", " 'C1_2_8',\n", " 'C1_4_1',\n", " 'C1_4_10',\n", " 'C1_4_2',\n", " 'C1_4_3',\n", " 'C1_4_4',\n", " 'C1_4_5',\n", " 'C1_4_6',\n", " 'C1_4_7',\n", " 'C1_4_8',\n", " 'C1_4_9',\n", " 'C1_6_1',\n", " 'C1_6_10',\n", " 'C1_6_2',\n", " 'C1_6_3',\n", " 'C1_6_4',\n", " 'C1_6_5',\n", " 'C1_6_6',\n", " 'C1_6_7',\n", " 'C1_6_8',\n", " 'C1_8_1',\n", " 'C1_8_10',\n", " 'C1_8_2',\n", " 'C1_8_3',\n", " 'C1_8_4',\n", " 'C1_8_5',\n", " 'C1_8_6',\n", " 'C1_8_7',\n", " 'C1_8_8',\n", " 'C1_8_9',\n", " 'C2_10_1',\n", " 'C2_10_10',\n", " 'C2_10_2',\n", " 'C2_10_3',\n", " 'C2_10_4',\n", " 'C2_10_5',\n", " 'C2_10_6',\n", " 'C2_10_7',\n", " 'C2_10_8',\n", " 'C2_2_1',\n", " 'C2_2_10',\n", " 'C2_2_2',\n", " 'C2_2_3',\n", " 'C2_2_4',\n", " 'C2_2_5',\n", " 'C2_2_6',\n", " 'C2_2_7',\n", " 'C2_2_8',\n", " 'C2_2_9',\n", " 'C2_4_1',\n", " 'C2_4_10',\n", " 'C2_4_2',\n", " 'C2_4_3',\n", " 'C2_4_4',\n", " 'C2_4_5',\n", " 'C2_4_6',\n", " 'C2_4_7',\n", " 'C2_4_8',\n", " 'C2_6_1',\n", " 'C2_6_10',\n", " 'C2_6_2',\n", " 'C2_6_3',\n", " 'C2_6_4',\n", " 'C2_6_5',\n", " 'C2_6_6',\n", " 'C2_6_7',\n", " 'C2_6_8',\n", " 'C2_6_9',\n", " 'C2_8_1',\n", " 'C2_8_10',\n", " 'C2_8_2',\n", " 'C2_8_3',\n", " 'C2_8_4',\n", " 'C2_8_5',\n", " 'C2_8_6',\n", " 'C2_8_7',\n", " 'C2_8_8',\n", " 'C1_2_9',\n", " 'C1_6_9',\n", " 'C2_10_9',\n", " 'C2_4_9',\n", " 'C2_8_9',\n", " 'R1_2_9',\n", " 'R1_6_9',\n", " 'R2_10_9',\n", " 'R2_4_9',\n", " 'R2_8_8',\n", " 'RC1_2_7',\n", " 'RC1_6_6',\n", " 'RC2_10_5',\n", " 'RC2_4_5',\n", " 'R1_10_1',\n", " 'R1_10_10',\n", " 'R1_10_2',\n", " 'R1_10_3',\n", " 'R1_10_4',\n", " 'R1_10_5',\n", " 'R1_10_6',\n", " 'R1_10_7',\n", " 'R1_10_8',\n", " 'R1_10_9',\n", " 'R1_2_1',\n", " 'R1_2_10',\n", " 'R1_2_2',\n", " 'R1_2_3',\n", " 'R1_2_4',\n", " 'R1_2_5',\n", " 'R1_2_6',\n", " 'R1_2_7',\n", " 'R1_2_8',\n", " 'R1_4_1',\n", " 'R1_4_10',\n", " 'R1_4_2',\n", " 'R1_4_3',\n", " 'R1_4_4',\n", " 'R1_4_5',\n", " 'R1_4_6',\n", " 'R1_4_7',\n", " 'R1_4_8',\n", " 'R1_4_9',\n", " 'R1_6_1',\n", " 'R1_6_10',\n", " 'R1_6_2',\n", " 'R1_6_3',\n", " 'R1_6_4',\n", " 'R1_6_5',\n", " 'R1_6_6',\n", " 'R1_6_7',\n", " 'R1_6_8',\n", " 'R1_8_1',\n", " 'R1_8_10',\n", " 'R1_8_2',\n", " 'R1_8_3',\n", " 'R1_8_4',\n", " 'R1_8_5',\n", " 'R1_8_6',\n", " 'R1_8_7',\n", " 'R1_8_8',\n", " 'R1_8_9',\n", " 'R2_10_1',\n", " 'R2_10_10',\n", " 'R2_10_2',\n", " 'R2_10_3',\n", " 'R2_10_4',\n", " 'R2_10_5',\n", " 'R2_10_6',\n", " 'R2_10_7',\n", " 'R2_10_8',\n", " 'R2_2_1',\n", " 'R2_2_10',\n", " 'R2_2_2',\n", " 'R2_2_3',\n", " 'R2_2_4',\n", " 'R2_2_5',\n", " 'R2_2_6',\n", " 'R2_2_7',\n", " 'R2_2_8',\n", " 'R2_2_9',\n", " 'R2_4_1',\n", " 'R2_4_10',\n", " 'R2_4_2',\n", " 'R2_4_3',\n", " 'R2_4_4',\n", " 'R2_4_5',\n", " 'R2_4_6',\n", " 'R2_4_7',\n", " 'R2_4_8',\n", " 'R2_6_1',\n", " 'R2_6_10',\n", " 'R2_6_2',\n", " 'R2_6_3',\n", " 'R2_6_4',\n", " 'R2_6_5',\n", " 'R2_6_6',\n", " 'R2_6_7',\n", " 'R2_6_8',\n", " 'R2_6_9',\n", " 'R2_8_1',\n", " 'R2_8_10',\n", " 'R2_8_2',\n", " 'R2_8_3',\n", " 'R2_8_4',\n", " 'R2_8_5',\n", " 'R2_8_6',\n", " 'R2_8_7',\n", " 'R2_8_9',\n", " 'RC1_10_1',\n", " 'RC1_10_10',\n", " 'RC1_10_2',\n", " 'RC1_10_3',\n", " 'RC1_10_4',\n", " 'RC1_10_5',\n", " 'RC1_10_6',\n", " 'RC1_10_7',\n", " 'RC1_10_8',\n", " 'RC1_10_9',\n", " 'RC1_2_1',\n", " 'RC1_2_10',\n", " 'RC1_2_2',\n", " 'RC1_2_3',\n", " 'RC1_2_4',\n", " 'RC1_2_5',\n", " 'RC1_2_6',\n", " 'RC1_2_8',\n", " 'RC1_2_9',\n", " 'RC1_4_1',\n", " 'RC1_4_10',\n", " 'RC1_4_2',\n", " 'RC1_4_3',\n", " 'RC1_4_4',\n", " 'RC1_4_5',\n", " 'RC1_4_6',\n", " 'RC1_4_7',\n", " 'RC1_4_8',\n", " 'RC1_4_9',\n", " 'RC1_6_1',\n", " 'RC1_6_10',\n", " 'RC1_6_2',\n", " 'RC1_6_3',\n", " 'RC1_6_4',\n", " 'RC1_6_5',\n", " 'RC1_6_7',\n", " 'RC1_6_8',\n", " 'RC1_6_9',\n", " 'RC1_8_1',\n", " 'RC1_8_10',\n", " 'RC1_8_2',\n", " 'RC1_8_3',\n", " 'RC1_8_4',\n", " 'RC1_8_5',\n", " 'RC1_8_6',\n", " 'RC1_8_7',\n", " 'RC1_8_8',\n", " 'RC1_8_9',\n", " 'RC2_10_1',\n", " 'RC2_10_10',\n", " 'RC2_10_2',\n", " 'RC2_10_3',\n", " 'RC2_10_4',\n", " 'RC2_10_6',\n", " 'RC2_10_7',\n", " 'RC2_10_8',\n", " 'RC2_10_9',\n", " 'RC2_2_1',\n", " 'RC2_2_10',\n", " 'RC2_2_2',\n", " 'RC2_2_3',\n", " 'RC2_2_4',\n", " 'RC2_2_5',\n", " 'RC2_2_6',\n", " 'RC2_2_7',\n", " 'RC2_2_8',\n", " 'RC2_2_9',\n", " 'RC2_4_1',\n", " 'RC2_4_10',\n", " 'RC2_4_2',\n", " 'RC2_4_3',\n", " 'RC2_4_4',\n", " 'RC2_4_6',\n", " 'RC2_4_7',\n", " 'RC2_4_8',\n", " 'RC2_4_9',\n", " 'RC2_6_1',\n", " 'RC2_6_10',\n", " 'RC2_6_2',\n", " 'RC2_6_3',\n", " 'RC2_6_4',\n", " 'RC2_6_5',\n", " 'RC2_6_6',\n", " 'RC2_6_7',\n", " 'RC2_6_8',\n", " 'RC2_6_9',\n", " 'RC2_8_1',\n", " 'RC2_8_10',\n", " 'RC2_8_2',\n", " 'RC2_8_3',\n", " 'RC2_8_4',\n", " 'RC2_8_5',\n", " 'RC2_8_6',\n", " 'RC2_8_7',\n", " 'RC2_8_8',\n", " 'RC2_8_9']}" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BenchmarkInstanceGenerator.get_list_of_benchmark_instances()" ] }, { "cell_type": "markdown", "id": "408dbea3", "metadata": {}, "source": [ "Ok! Now we instanciate the `generator` selection two of them:" ] }, { "cell_type": "code", "execution_count": 27, "id": "6eeb80cd", "metadata": {}, "outputs": [], "source": [ "generator = BenchmarkInstanceGenerator(instance_type='Solomon', set_of_instances={'C101', 'C102'})" ] }, { "cell_type": "code", "execution_count": 28, "id": "5e60b5cc", "metadata": {}, "outputs": [], "source": [ "instance_c101 = generator.get_instance('C101')" ] }, { "cell_type": "code", "execution_count": 29, "id": "a88f3734-5004-4f14-8844-edba4a70797b", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_instance_coords(instance_c101,\n", " annotate=False,\n", " point_size=20)" ] }, { "cell_type": "code", "execution_count": 30, "id": "0b4f50cc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['name', 'num_agents', 'num_nodes', 'data', 'n_digits'])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance_c101.keys()" ] }, { "cell_type": "code", "execution_count": 31, "id": "9ae8ce78", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'C101'" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance_c101['name']" ] }, { "cell_type": "code", "execution_count": 32, "id": "7e5ae8ea", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance_c101['num_agents']" ] }, { "cell_type": "code", "execution_count": 33, "id": "4bf290c6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "101" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance_c101['num_nodes']" ] }, { "cell_type": "markdown", "id": "44070687", "metadata": {}, "source": [ "By customizing the arguments of the `.sample_instance` method, you can generate a **sub-instance** from the original environment instance. \n", "\n", "This allows for flexible scenario creation by selecting only a subset of nodes, which is particularly useful for testing, debugging, or curriculum learning setups." ] }, { "cell_type": "code", "execution_count": 34, "id": "81e34566", "metadata": {}, "outputs": [], "source": [ "instance = generator.sample_instance(num_agents=3, num_nodes=8)" ] }, { "cell_type": "code", "execution_count": 35, "id": "364121a5-2731-4148-bb9c-1549a1419162", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_instance_coords(instance,\n", " annotate=False,\n", " point_size=20)" ] }, { "cell_type": "code", "execution_count": 36, "id": "ffe50e65", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'C101_samp'" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance['name']" ] }, { "cell_type": "code", "execution_count": 37, "id": "c2c05616", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance['num_agents']" ] }, { "cell_type": "code", "execution_count": 38, "id": "0175b9df", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance['num_nodes']" ] }, { "cell_type": "markdown", "id": "f821778f", "metadata": {}, "source": [ " For the **CVRPTW** environment, setting `sample_type=None` will sample the first `n` service nodes from the instance. \n", "\n", "This approach follows the standard practice in Solomon benchmark datasets, where problem instances are defined by selecting the first `n` customers. For more details on this format, refer to the [Transportation Optimization Portal](https://www.sintef.no/projectweb/top/vrptw).\n" ] }, { "cell_type": "code", "execution_count": 39, "id": "88b8cf3b", "metadata": {}, "outputs": [], "source": [ "instance = generator.sample_instance(num_agents=3, num_nodes=8, sample_type=None)" ] }, { "cell_type": "code", "execution_count": 40, "id": "91c39b4e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'C101_samp'" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance['name']" ] }, { "cell_type": "markdown", "id": "3cb2a1dd", "metadata": {}, "source": [ "### Observations" ] }, { "cell_type": "markdown", "id": "a68f56b8", "metadata": {}, "source": [ "Observation features, which are made available to the active agent during its interaction with the environment, are handled by the `Observations` class. \n", "\n", "This class is responsible for defining what information the agent receives at each decision step, allowing for flexible customization of the observation space to suit different problem settings or learning strategies." ] }, { "cell_type": "code", "execution_count": 41, "id": "0a15a1e8", "metadata": {}, "outputs": [], "source": [ "from maenvs4vrp.environments.cvrptw.observations import Observations" ] }, { "cell_type": "code", "execution_count": 42, "id": "d32d1074", "metadata": {}, "outputs": [], "source": [ "obs = Observations()" ] }, { "cell_type": "markdown", "id": "994e4b04", "metadata": {}, "source": [ "The class has a `default_feature_list` attribute where the default configuration dictionary is defined." ] }, { "cell_type": "code", "execution_count": 43, "id": "23ccc7e0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'nodes_static': {'x_coordinate': {'feat': 'x_coordinate', 'norm': None},\n", " 'y_coordinate': {'feat': 'y_coordinate', 'norm': None},\n", " 'tw_low': {'feat': 'tw_low', 'norm': None},\n", " 'tw_high': {'feat': 'tw_high', 'norm': None},\n", " 'demand': {'feat': 'demand', 'norm': None},\n", " 'service_time': {'feat': 'service_time', 'norm': 'min_max'},\n", " 'is_depot': {'feat': 'is_depot', 'norm': None}},\n", " 'nodes_dynamic': ['time2open_div_end_time',\n", " 'time2close_div_end_time',\n", " 'arrive2node_div_end_time',\n", " 'time2open_after_step_div_end_time',\n", " 'time2close_after_step_div_end_time',\n", " 'time2end_after_step_div_end_time',\n", " 'fract_time_after_step_div_end_time',\n", " 'reachable_frac_agents'],\n", " 'agent': ['x_coordinate',\n", " 'y_coordinate',\n", " 'frac_current_time',\n", " 'frac_current_load',\n", " 'arrivedepot_div_end_time',\n", " 'frac_feasible_nodes'],\n", " 'other_agents': ['x_coordinate',\n", " 'y_coordinate',\n", " 'frac_current_time',\n", " 'frac_current_load',\n", " 'frac_feasible_nodes',\n", " 'dist2agent_div_end_time',\n", " 'time_delta2agent_div_max_dur',\n", " 'was_last'],\n", " 'global': ['frac_fleet_load_capacity', 'frac_done_agents']}" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obs.default_feature_list" ] }, { "cell_type": "markdown", "id": "41cec072", "metadata": {}, "source": [ "Also, five possible features lists exist, detailing the available features in the class: `POSSIBLE_NODES_STATIC_FEATURES`, `POSSIBLE_NODES_DYNAMIC_FEATURES`, `POSSIBLE_SELF_FEATURES`, `POSSIBLE_AGENTS_FEATURES`, `POSSIBLE_GLOBAL_FEATURES`. For example:" ] }, { "cell_type": "code", "execution_count": 44, "id": "77a3cb17", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['x_coordinate',\n", " 'y_coordinate',\n", " 'tw_low',\n", " 'tw_high',\n", " 'demand',\n", " 'service_time',\n", " 'tw_high_minus_tw_low_div_max_dur',\n", " 'x_coordinate_min_max',\n", " 'y_coordinate_min_max',\n", " 'is_depot']" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obs.POSSIBLE_NODES_STATIC_FEATURES" ] }, { "cell_type": "code", "execution_count": 45, "id": "7b9b2465", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['frac_fleet_load_capacity', 'frac_done_agents']" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obs.POSSIBLE_GLOBAL_FEATURES" ] }, { "cell_type": "markdown", "id": "aa61f210", "metadata": {}, "source": [ "While instantiating the `Observations` class, we can provide a dictionary specifying a list of features that will be made available to the agent. This feature list determines the content of the observation space, allowing us to customize what information the agent receives during training or evaluation." ] }, { "cell_type": "code", "execution_count": 46, "id": "87bb625b", "metadata": {}, "outputs": [], "source": [ "import yaml" ] }, { "cell_type": "code", "execution_count": 47, "id": "bd7e8d52", "metadata": {}, "outputs": [], "source": [ "feature_list = yaml.safe_load(\"\"\"\n", " nodes_static:\n", " x_coordinate_min_max:\n", " feat: x_coordinate_min_max\n", " norm: min_max\n", " x_coordinate_min_max: \n", " feat: x_coordinate_min_max\n", " norm: min_max\n", " tw_low_mm:\n", " feat: tw_low\n", " norm: min_max\n", " tw_high:\n", " feat: tw_high\n", " norm: min_max\n", "\n", " nodes_dynamic:\n", " - time2open_div_end_time\n", " - time2close_div_end_time\n", " - time2open_after_step_div_end_time\n", " - time2close_after_step_div_end_time\n", " - fract_time_after_step_div_end_time\n", "\n", " agent:\n", " - x_coordinate_min_max\n", " - y_coordinate_min_max\n", " - frac_current_time\n", " - frac_current_load\n", "\n", " other_agents:\n", " - x_coordinate_min_max\n", " - y_coordinate_min_max\n", " - frac_current_time\n", " - frac_current_load\n", " - dist2agent_div_end_time\n", " \n", " global:\n", " - frac_demands\n", " - frac_fleet_load_capacity\n", " - frac_done_agents\n", " - frac_not_done_nodes\n", " - frac_used_agents\n", "\"\"\")" ] }, { "cell_type": "code", "execution_count": 48, "id": "695e9c85", "metadata": {}, "outputs": [], "source": [ "obs = Observations(feature_list)" ] }, { "cell_type": "markdown", "id": "23c7bbd6", "metadata": {}, "source": [ "We can now test these observation settings directly within the environment:\n" ] }, { "cell_type": "code", "execution_count": 49, "id": "841178da", "metadata": {}, "outputs": [], "source": [ "gen = InstanceGenerator(batch_size = 8)\n", "obs = Observations()\n", "sel = AgentSelector()\n", "rew = DenseReward()\n", "\n", "env = Environment(instance_generator_object=gen, \n", " obs_builder_object=obs,\n", " agent_selector_object=sel,\n", " reward_evaluator=rew,\n", " seed=0)" ] }, { "cell_type": "code", "execution_count": 50, "id": "09332ac1", "metadata": {}, "outputs": [], "source": [ "td = env.reset(batch_size = 8, num_agents=4, num_nodes=16)" ] }, { "cell_type": "code", "execution_count": 51, "id": "9644e544", "metadata": {}, "outputs": [], "source": [ "td_observation = env.observe()" ] }, { "cell_type": "code", "execution_count": 52, "id": "704aa1c1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TensorDict(\n", " fields={\n", " action_mask: Tensor(shape=torch.Size([8, 16]), device=cpu, dtype=torch.bool, is_shared=False),\n", " agent_obs: Tensor(shape=torch.Size([8, 6]), device=cpu, dtype=torch.float32, is_shared=False),\n", " agents_mask: Tensor(shape=torch.Size([8, 4]), device=cpu, dtype=torch.bool, is_shared=False),\n", " global_obs: Tensor(shape=torch.Size([8, 2]), device=cpu, dtype=torch.float32, is_shared=False),\n", " node_dynamic_obs: Tensor(shape=torch.Size([8, 16, 8]), device=cpu, dtype=torch.float32, is_shared=False),\n", " other_agents_obs: Tensor(shape=torch.Size([8, 4, 8]), device=cpu, dtype=torch.float32, is_shared=False)},\n", " batch_size=torch.Size([8]),\n", " device=cpu,\n", " is_shared=False)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "td_observation" ] }, { "cell_type": "markdown", "id": "3d3b83ef", "metadata": {}, "source": [ "### Agent Iterator class" ] }, { "cell_type": "markdown", "id": "c0267064", "metadata": {}, "source": [ "Equivalent to [PettingZoo](https://pettingzoo.farama.org/), Agent Selector class incorporates the iterator method `agent_iter` that returns the next active agent in the environment. It is perfectly customizable and currently `AgentSelector`, `SmallestTimeAgentSelector` classes are available." ] }, { "cell_type": "code", "execution_count": 53, "id": "04d2e94c", "metadata": {}, "outputs": [], "source": [ "from maenvs4vrp.environments.cvrptw.env_agent_selector import AgentSelector, SmallestTimeAgentSelector" ] }, { "cell_type": "markdown", "id": "f8728d5f", "metadata": {}, "source": [ "With `AgentSelector` class, the selection steps through the active agents in a circular fashion, until no more active agents are available:" ] }, { "cell_type": "code", "execution_count": 54, "id": "32319404", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "env step number: 1, active agent name: tensor([[0]])\n", "env step number: 2, active agent name: tensor([[0]])\n", "env step number: 3, active agent name: tensor([[1]])\n", "env step number: 4, active agent name: tensor([[1]])\n", "env step number: 5, active agent name: tensor([[1]])\n", "env step number: 6, active agent name: tensor([[1]])\n", "env step number: 7, active agent name: tensor([[2]])\n", "env step number: 8, active agent name: tensor([[2]])\n", "env step number: 9, active agent name: tensor([[2]])\n", "env step number: 10, active agent name: tensor([[3]])\n", "env step number: 11, active agent name: tensor([[3]])\n", "env step number: 12, active agent name: tensor([[3]])\n", "env step number: 13, active agent name: tensor([[3]])\n", "env step number: 14, active agent name: tensor([[4]])\n", "env step number: 15, active agent name: tensor([[4]])\n", "env step number: 16, active agent name: tensor([[4]])\n", "env step number: 17, active agent name: tensor([[4]])\n", "env step number: 18, active agent name: tensor([[5]])\n", "env step number: 19, active agent name: tensor([[5]])\n", "env step number: 20, active agent name: tensor([[5]])\n", "env step number: 21, active agent name: tensor([[5]])\n", "env step number: 22, active agent name: tensor([[6]])\n", "env step number: 23, active agent name: tensor([[6]])\n", "env step number: 24, active agent name: tensor([[6]])\n", "env step number: 25, active agent name: tensor([[6]])\n", "env step number: 26, active agent name: tensor([[7]])\n", "env step number: 27, active agent name: tensor([[7]])\n", "env step number: 28, active agent name: tensor([[7]])\n", "env step number: 29, active agent name: tensor([[7]])\n", "env step number: 30, active agent name: tensor([[7]])\n", "env step number: 31, active agent name: tensor([[8]])\n", "env step number: 32, active agent name: tensor([[8]])\n", "env step number: 33, active agent name: tensor([[8]])\n", "env step number: 34, active agent name: tensor([[8]])\n", "env step number: 35, active agent name: tensor([[8]])\n", "env step number: 36, active agent name: tensor([[9]])\n", "env step number: 37, active agent name: tensor([[9]])\n", "env step number: 38, active agent name: tensor([[9]])\n", "env step number: 39, active agent name: tensor([[10]])\n", "env step number: 40, active agent name: tensor([[10]])\n", "env step number: 41, active agent name: tensor([[10]])\n", "env step number: 42, active agent name: tensor([[10]])\n", "env step number: 43, active agent name: tensor([[11]])\n", "env step number: 44, active agent name: tensor([[11]])\n", "env step number: 45, active agent name: tensor([[11]])\n", "env step number: 46, active agent name: tensor([[11]])\n", "env step number: 47, active agent name: tensor([[12]])\n", "env step number: 48, active agent name: tensor([[12]])\n", "env step number: 49, active agent name: tensor([[12]])\n", "env step number: 50, active agent name: tensor([[13]])\n", "env step number: 51, active agent name: tensor([[13]])\n", "env step number: 52, active agent name: tensor([[14]])\n", "env step number: 53, active agent name: tensor([[14]])\n", "env step number: 54, active agent name: tensor([[14]])\n", "env step number: 55, active agent name: tensor([[14]])\n", "env step number: 56, active agent name: tensor([[14]])\n", "env step number: 57, active agent name: tensor([[14]])\n", "env step number: 58, active agent name: tensor([[15]])\n", "env step number: 59, active agent name: tensor([[15]])\n", "env step number: 60, active agent name: tensor([[15]])\n", "env step number: 61, active agent name: tensor([[15]])\n", "env step number: 62, active agent name: tensor([[16]])\n", "env step number: 63, active agent name: tensor([[16]])\n", "env step number: 64, active agent name: tensor([[16]])\n", "env step number: 65, active agent name: tensor([[16]])\n", "env step number: 66, active agent name: tensor([[17]])\n", "env step number: 67, active agent name: tensor([[17]])\n", "env step number: 68, active agent name: tensor([[17]])\n", "env step number: 69, active agent name: tensor([[18]])\n", "env step number: 70, active agent name: tensor([[18]])\n", "env step number: 71, active agent name: tensor([[19]])\n", "env step number: 72, active agent name: tensor([[19]])\n", "env step number: 73, active agent name: tensor([[19]])\n", "env step number: 74, active agent name: tensor([[19]])\n", "env step number: 75, active agent name: tensor([[0]])\n" ] } ], "source": [ "gen = InstanceGenerator(batch_size = 1)\n", "obs = Observations()\n", "sel = AgentSelector()\n", "rew = DenseReward()\n", "\n", "env = Environment(instance_generator_object=gen, \n", " obs_builder_object=obs,\n", " agent_selector_object=sel,\n", " reward_evaluator=rew,\n", " seed=0)\n", "\n", "td = env.reset()\n", "\n", "while not td[\"done\"].all(): \n", " td = env.sample_action(td) # this is where we insert our policy\n", " td = env.step(td)\n", " step = env.env_nsteps\n", " cur_agent_idx = td['cur_agent_idx']\n", " print(f'env step number: {step}, active agent name: {cur_agent_idx}')" ] }, { "cell_type": "markdown", "id": "ef431706", "metadata": {}, "source": [ "With `SmallesttimeAgentSelector` class, the same agent is select until it returns to the depot. Afterward, it selects the next active agent and repeats the process until all agents are done:" ] }, { "cell_type": "code", "execution_count": 55, "id": "b1ce3b59", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "env step number: 1, active agent name: tensor([[1]])\n", "env step number: 2, active agent name: tensor([[2]])\n", "env step number: 3, active agent name: tensor([[3]])\n", "env step number: 4, active agent name: tensor([[4]])\n", "env step number: 5, active agent name: tensor([[5]])\n", "env step number: 6, active agent name: tensor([[6]])\n", "env step number: 7, active agent name: tensor([[7]])\n", "env step number: 8, active agent name: tensor([[8]])\n", "env step number: 9, active agent name: tensor([[9]])\n", "env step number: 10, active agent name: tensor([[10]])\n", "env step number: 11, active agent name: tensor([[11]])\n", "env step number: 12, active agent name: tensor([[12]])\n", "env step number: 13, active agent name: tensor([[13]])\n", "env step number: 14, active agent name: tensor([[14]])\n", "env step number: 15, active agent name: tensor([[15]])\n", "env step number: 16, active agent name: tensor([[16]])\n", "env step number: 17, active agent name: tensor([[17]])\n", "env step number: 18, active agent name: tensor([[18]])\n", "env step number: 19, active agent name: tensor([[19]])\n", "env step number: 20, active agent name: tensor([[9]])\n", "env step number: 21, active agent name: tensor([[5]])\n", "env step number: 22, active agent name: tensor([[16]])\n", "env step number: 23, active agent name: tensor([[9]])\n", "env step number: 24, active agent name: tensor([[0]])\n", "env step number: 25, active agent name: tensor([[6]])\n", "env step number: 26, active agent name: tensor([[1]])\n", "env step number: 27, active agent name: tensor([[3]])\n", "env step number: 28, active agent name: tensor([[19]])\n", "env step number: 29, active agent name: tensor([[14]])\n", "env step number: 30, active agent name: tensor([[15]])\n", "env step number: 31, active agent name: tensor([[10]])\n", "env step number: 32, active agent name: tensor([[13]])\n", "env step number: 33, active agent name: tensor([[5]])\n", "env step number: 34, active agent name: tensor([[1]])\n", "env step number: 35, active agent name: tensor([[6]])\n", "env step number: 36, active agent name: tensor([[3]])\n", "env step number: 37, active agent name: tensor([[4]])\n", "env step number: 38, active agent name: tensor([[18]])\n", "env step number: 39, active agent name: tensor([[17]])\n", "env step number: 40, active agent name: tensor([[11]])\n", "env step number: 41, active agent name: tensor([[14]])\n", "env step number: 42, active agent name: tensor([[8]])\n", "env step number: 43, active agent name: tensor([[15]])\n", "env step number: 44, active agent name: tensor([[9]])\n", "env step number: 45, active agent name: tensor([[2]])\n", "env step number: 46, active agent name: tensor([[0]])\n", "env step number: 47, active agent name: tensor([[7]])\n", "env step number: 48, active agent name: tensor([[12]])\n", "env step number: 49, active agent name: tensor([[16]])\n", "env step number: 50, active agent name: tensor([[13]])\n", "env step number: 51, active agent name: tensor([[17]])\n", "env step number: 52, active agent name: tensor([[10]])\n", "env step number: 53, active agent name: tensor([[5]])\n", "env step number: 54, active agent name: tensor([[15]])\n", "env step number: 55, active agent name: tensor([[3]])\n", "env step number: 56, active agent name: tensor([[0]])\n", "env step number: 57, active agent name: tensor([[8]])\n", "env step number: 58, active agent name: tensor([[7]])\n", "env step number: 59, active agent name: tensor([[1]])\n", "env step number: 60, active agent name: tensor([[12]])\n", "env step number: 61, active agent name: tensor([[2]])\n", "env step number: 62, active agent name: tensor([[16]])\n", "env step number: 63, active agent name: tensor([[19]])\n", "env step number: 64, active agent name: tensor([[11]])\n", "env step number: 65, active agent name: tensor([[14]])\n", "env step number: 66, active agent name: tensor([[4]])\n", "env step number: 67, active agent name: tensor([[9]])\n", "env step number: 68, active agent name: tensor([[10]])\n", "env step number: 69, active agent name: tensor([[12]])\n", "env step number: 70, active agent name: tensor([[15]])\n", "env step number: 71, active agent name: tensor([[0]])\n" ] } ], "source": [ "gen = InstanceGenerator(batch_size = 1)\n", "obs = Observations()\n", "sel = SmallestTimeAgentSelector()\n", "rew = DenseReward()\n", "\n", "env = Environment(instance_generator_object=gen, \n", " obs_builder_object=obs,\n", " agent_selector_object=sel,\n", " reward_evaluator=rew,\n", " seed=0)\n", "\n", "td = env.reset()\n", "\n", "while not td[\"done\"].all(): \n", " td = env.sample_action(td) # this is where we insert our policy\n", " td = env.step(td)\n", " step = env.env_nsteps\n", " cur_agent_idx = td['cur_agent_idx']\n", " print(f'env step number: {step}, active agent name: {cur_agent_idx}')" ] }, { "cell_type": "markdown", "id": "beeb37d3", "metadata": {}, "source": [ "For a deeper dive into the library functionalities, explore the other available tutorials." ] }, { "cell_type": "markdown", "id": "8c5a5c47", "metadata": {}, "source": [ "## Acknowledgements: " ] }, { "cell_type": "markdown", "id": "cce3c2ec", "metadata": {}, "source": [ "* [PettingZoo](https://pettingzoo.farama.org/)\n", "\n", "* [Flatland](https://flatland.aicrowd.com/intro.html)\n" ] } ], "metadata": { "kernelspec": { "display_name": "maenvs4vrp", "language": "python", "name": "maenvs4vrp" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.13" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }