{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "9O_tHTY_PL_s" }, "source": [ "{index} disjunctive programming\n", "\n", "{index} single: solver; cbc\n", "\n", "{index} single: application; maintenance planning\n", "\n", "\n", "# Extra material: Maintenance planning" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Y_yzzUJQDJtr" }, "source": [ "## Problem statement\n", "\n", "\n", "A process unit is operating over a maintenance planning horizon from $1$ to $T$ days. On day $t$ the unit makes a profit $c[t]$ which is known in advance. The unit needs to shut down for $P$ maintenance periods during the planning period. Once started, a maintenance period takes $M$ days to finish.\n", "\n", "Find a maintenance schedule that allows the maximum profit to be produced." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# install dependencies and select solver\n", "%pip install -q amplpy matplotlib\n", "\n", "SOLVER = \"cbc\"\n", "\n", "from amplpy import AMPL, ampl_notebook\n", "\n", "ampl = ampl_notebook(\n", " modules=[\"cbc\"], # modules to install\n", " license_uuid=\"default\", # license to use\n", ") # instantiate AMPL object and register magics" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "RrSgeD0ewWpE" }, "source": [ "## Modeling with disjunctive constraints\n", "\n", "The model is comprised of two sets of the binary variables indexed 1 to $T$. Binary variables $x_t$ correspond to the operating mode of the process unit, with $x_t=1$ indicating the unit is operating on day $t$ and able to earn a profit $c_t$. Binary variable $y_t=1$ indicates the first day of a maintenance period during which the unit is not operating and earning $0$ profit." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "RrSgeD0ewWpE" }, "source": [ "### Objective\n", "\n", "The planning objective is to maximize profit realized during the days the plant is operational. \n", "\n", "\n", "\\begin{align*}\n", "\\mbox{Profit} & = \\max_{x, y} \\sum_{t=1}^T c_t x_t\n", "\\end{align*}\n", "\n", "\n", "subject to completing $P$ maintenance periods. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "RrSgeD0ewWpE" }, "source": [ "### Constraints\n", "\n", "**Number of maintenance periods is equal to P.**\n", "\n", "Completing $P$ maintenance periods requires a total of $P$ starts.\n", "\n", "\n", "\\begin{align*}\n", "\\sum_{t=1}^T y_t & = P \\\\\n", "\\end{align*}\n", "\n", "\n", "**Maintenance periods do not overlap.**\n", "\n", "No more than one maintenance period can start in any consecutive set of M days.\n", "\n", "\n", "\\begin{align*}\n", "\\sum_{s=0}^{M-1}y_{t+s} & \\leq 1 \\qquad \\forall t = 1, 2, \\ldots, T-M+1\n", "\\end{align*}\n", "\n", "\n", "This last requirement could be modified if some period of time should occur between maintenance periods.\n", "\n", "**The unit must shut down for M days following a maintenance start.**\n", "\n", "The final requirement is a disjunctive constraint that says either $y_t = 0$ or the sum $\\sum_{s}^{M-1}x_{t+s} = 0$, but not both. Mathematically, this forms a set of constraints reading\n", "\n", "\n", "\\begin{align*}\n", "\\left(y_t = 0\\right) \\veebar \\left(\\sum_{s=0}^{M-1}x_{t+s} = 0\\right)\\qquad \\forall t = 1, 2, \\ldots, T-M+1\n", "\\end{align*}\n", "\n", "\n", "where $\\veebar$ denotes an exclusive or condition." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## AMPL solution" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Bae6-dR_lYkm" }, "source": [ "### Parameter values" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": {}, "colab_type": "code", "id": "L5TaVPbkEPZ0" }, "outputs": [], "source": [ "# problem parameters\n", "T = 90 # planning period from 1..T\n", "M = 3 # length of maintenance period\n", "P = 4 # number of maintenance periods\n", "\n", "# daily profits\n", "np.random.seed(0)\n", "c = {k: np.random.uniform() for k in range(1, T + 1)}" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "e28FWA1GlNyQ" }, "source": [ "### AMPL model\n", "\n", "The disjunctive constraints can be represented directly in AMPL using [Logic, Nonlinear & Constraint Programming Extensions](https://ampl.com/products/ampl/logic-and-constraint-programming-extensions/). The extension transforms the disjunctive constraints to a mixed integer linear optimization (MILO) problem using convex hull and cutting plane methods." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing maintenance_planning.mod\n" ] } ], "source": [ "%%writefile maintenance_planning.mod\n", "\n", "param T; # number of planning periods\n", "param P; # number of maintenance periods\n", "param M; # number of days for each maintenance period\n", "\n", "set PH := 1..T; # set of planning horizon time periods\n", "\n", "set Y := 1..(T - M + 1);\n", "set S := 0..(M - 1);\n", "\n", "param c{PH}; # profit\n", "\n", "var x{PH} binary;\n", "var y{PH} binary;\n", "\n", "maximize profit: sum{t in PH} c[t] * x[t];\n", "\n", "s.t. required_maintenance: P == sum{t in Y} y[t];\n", "s.t. no_overlap {t in Y}: sum{s in S} y[t + s] <= 1;\n", "s.t. required_shutdown {t in Y}:\n", " (y[t] == 0 or sum{s in S} x[t + s] == 0)\n", " and not\n", " (y[t] == 0 and sum{s in S} x[t + s] == 0);" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1014 }, "colab_type": "code", "executionInfo": { "elapsed": 1543, "status": "ok", "timestamp": 1557947668999, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "cUARDFzP9fla", "outputId": "ba0f2867-3a14-4314-c09f-bb4a76ebd1a7", "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cbc 2.10.7: \b\b\b\b\b\b\b\b\b\b\b\bcbc 2.10.7: optimal solution; objective 41.92584964\n", "21 simplex iterations\n", "21 barrier iterations\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2wAAAGGCAYAAAAHLAKcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDSklEQVR4nO3deXwV9b3/8ffJdpKQDUIWAgkEpLIpRYKIQKWFirkUb0TBKGgEqrckICEtFuoFQhEQuFoLWpZ6xVrBWmhBbYuy1KaXS8AIIlL2GiElLAEJiRAC5nx/f/jjXA5ZTwg5c5LX8/HI48F85zszn5l8Sc47s9mMMUYAAAAAAMvx8XQBAAAAAICqEdgAAAAAwKIIbAAAAABgUQQ2AAAAALAoAhsAAAAAWBSBDQAAAAAsisAGAAAAABZFYAMAAAAAiyKwAQAAAIBFEdgAAAAAwKIIbAAAAABgUQQ2AEC9ZGdny2azub3c66+/LpvNpi+++KLGNm+Sl5enu+++Wy1atJDNZtPu3bu9fp8AANZAYAMA4AZcuXJFI0eO1Jdffqlf/OIX+u1vf6v27dtX2Xfbtm3Kzs5WcXFx4xYJAPBaBDYAQKN67LHHVFZWVm2o8Tb//Oc/dfToUf3kJz/RU089pTFjxqhly5ZV7ue2bds0e/ZsAhsAoM78PF0AAKB58fX1la+vr6fLqNaFCxfUokWLOvc/ffq0JCkiIsKl3er7CQDwDpxhAwDUauvWrerTp48CAwPVqVMnLV++vFKfo0ePKj09XbfeequCgoIUGRmpkSNHVrqHq7Z7uz788EPZbDatW7eu0rzVq1fLZrMpNze3xnqv3l934MABjRo1SmFhYYqMjNTkyZN16dKlSv327dunRx99VC1bttSAAQOc8z/55BMlJycrLCxMISEhGjx4sLZv3+6c/8QTT+iee+6RJI0cOVI2m02DBg2qcj+zs7M1depUSVJiYqJsNlud7nHbuXOnHnroIUVHRyswMFBdunTRz3/+8xqXAQA0HZxhAwDU6LPPPtO9996rqKgoZWdn6+uvv9asWbMUExPj0i8vL0/btm1Tamqq2rVrpy+++EJLly7VoEGDtG/fPgUHB9dpe4MGDVJ8fLxWrVqlBx54wGXeqlWr1KlTJ/Xr169O6xo1apQ6dOig+fPna/v27Vq8eLHOnTunN954w6XfyJEj1blzZ82bN0/GGEnSP/7xDw0cOFBhYWF65pln5O/vr+XLl2vQoEHKyclR37599R//8R9q27at5s2bp6efflp9+vSpdFyuGjFihA4dOqS33npLv/jFL9S6dWtJUlRUVLX1r1u3TqmpqerYsaOmTp2qkJAQ53EGADQTBgCAGqSkpJjAwEBz9OhRZ9u+ffuMr6+vufbXyMWLFystm5ubaySZN954w9m2cuVKI8nk5+dX2zZ9+nRjt9tNcXGxs8/p06eNn5+fmTVrVq01z5o1y0gy999/v0t7enq6kWQ+/fRTl36PPPJIlfsdEBBg/vnPfzrbCgsLTWhoqPnOd77jbPvwww+NJLNmzRqX5avaz0WLFlVqq87BgwdNcHCweeCBB0xZWZnLvEuXLtW6PACgaeCSSABAtSoqKvTBBx8oJSVFCQkJzvauXbtq6NChLn2DgoKc/75y5YrOnj2rW265RREREdq1a5db23388cdVXl6utWvXOtvefvttff311xozZkyd15ORkeEyPWnSJEnSX/7yF5f2H/3oRy7TFRUV2rhxo1JSUtSxY0dne5s2bfToo49q69atKikpqXMd9TFz5kwFBgbq9ddfV2BgoMs8u91+U7cNALAOAhsAoFpFRUUqKytT586dK8279dZbXabLyso0c+ZMxcfHy263q3Xr1oqKilJxcbHOnz/v1na7dOmiPn36aNWqVc62VatW6a677tItt9xS5/VcX3enTp3k4+NT6b6xxMREl+mioiJdvHix0j5K34RVh8OhgoKCOtfhrvLycr333nsaM2aMwsLCauxrjFFISIjz4ScAgKaFe9gAAA1i0qRJWrlypTIzM9WvXz+Fh4fLZrMpNTVVDofD7fU9/vjjmjx5sv71r3+pvLxc27dv18svv3xDNVb3ou9rzw5aweeff66LFy+qd+/etfbNz89XcHCwoqOjG6EyAEBjI7ABAKoVFRWloKAgHT58uNK8gwcPukyvXbtWaWlpeuGFF5xtly5dqvc7x1JTU5WVlaW33npLZWVl8vf318MPP+zWOg4fPuxy9uzIkSNyOBzq0KFDjctFRUUpODi40j5K0oEDB+Tj46P4+Hi3apGqD4zXKysrq1P//fv3q1evXqqoqFBISIi6du2qvLw8t+sCAFgXl0QCAKrl6+uroUOHav369Tp27Jizff/+/frggw8q9TX//wmLVy1ZskQV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MGCA0tPT5efnp+XLl6u8vFwLFy6s1D8/P1/333+/7rvvPuXm5urNN9/Uo48+qp49ezr7PP/88/rwww/Vt29fPfnkk+rWrZu+/PJL7dq1S5s3b9aXX35Z63784Ac/0G9/+1uFh4erW7duys3N1ebNmxUZGVmn/b1R2dnZ2rhxo/r3768JEyaooqJCL7/8snr06KHdu3dXu1xpaanatWunhx56SD179lRISIg2b96svLw8l7OF8+bN08aNG3XPPffoqaeeUteuXXXixAmtWbNGW7duVUREhFv11vWYz549W++//74GDhyo9PR0ff3111qyZIm6d+/uEsykGxuv9R0DO3fu1OjRozV69Gg9++yzkqRnnnlGy5Ytq3SWbc+ePfre977n1nECgCbJMw+nBICmaePGjaZHjx4mICDA3HrrrebNN9+s9rH+RUVFLstW9fj0qtrmzJlj2rZta3x8fOr0iP9du3aZoUOHmpCQEBMcHGy++93vmm3btrn0uVrTvn37zEMPPWRCQ0NNy5YtzcSJE01ZWVmldZ46dcpkZGSY+Ph44+/vb2JjY83gwYPNihUrat1PY4w5d+6cGTt2rGndurUJCQkxQ4cONQcOHDDt27c3aWlpLn2r2t+aHutfl+NqjDFbtmwxvXr1MgEBAaZTp07m1VdfNT/+8Y9NYGBgtceyvLzcTJ061fTs2dOEhoaaFi1amJ49e5pf/epXlfoePXrUPP744yYqKsrY7XbTsWNHk5GRYcrLy+tVb12OuTHG5OTkmN69e5uAgADTsWNHs2zZskpj8Kq6jNcbreeqgoIC06ZNG9O/f39z6dIll3kTJkww/v7+5vPPP3e2devWzWzfvr3KdQFAc2IzxkJ3twMAPCI7O1uzZ89WUVGR8wXVzVFKSor+8Y9/VHkfGBrP5cuXFRISonPnzvGofwDNHvewAQCapbKyMpfpw4cP6y9/+YsGDRrkmYLgVFpaKumb4AYAzR33sAEAmqWOHTvqiSeeUMeOHXX06FEtXbpUAQEBeuaZZzxdWrMXGRmpRx55RAkJCerevbu2b9/u6ZIAwGMIbACAZum+++7TW2+9pZMnT8put6tfv36aN29elS+eRuP7zW9+o9/85jeeLgMAPI572AAAAADAoriHDQAAAAAsisAGAAAAABbldmD7+9//ruHDhysuLk42m03r16+/CWUBAAAA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Blz7WH9jGN/wfu+9957p0aOHsdvtpkuXLmbFihUu8x0Oh5kxY4aJiYkxdrvdDB482Bw8eNBD1QJ1V1JSYiZPnmwSEhJMYGCg6dixo3n22WdNeXm5sw/j2/vYjLnm1ecAAAAAAMvgHjYAAAAAsCgCGwAAAABYFIENAAAAACyKwAYAAAAAFkVgAwAAAACLIrABAAAAgEUR2AAAAADAoghsAAAAAGBRBDYAAAAAsCgCGwAAAABYFIENAAAAACyKwAYAAAAAFkVgAwAAAACLIrABAAAAgEUR2AAAAADAoghsAAAAAGBRBDYAAAAAsCgCGwAAAABYFIENAAAAACyKwAYAqNLrr78um82mL774wtOlAADQbBHYAMDD5s6dK5vNph49eni6lAazbds2ZWdnq7i42NOleK2bfQz5HgGAdyCwAYAH/etf/9K8efPUokULT5dSyWOPPaaysjK1b9/e7WW3bdum2bNnEwZuwM0+hnyPAMA7+Hm6AABozn7yk5/orrvuUkVFhc6cOePpclz4+vrK19fX02WggV24cMGSfyAAAFSNM2wA4CF///vftXbtWr300kt1XiY7O1s2m02HDh3SmDFjFB4erqioKM2YMUPGGBUUFOjf//3fFRYWptjYWL3wwguV1nH06FGlp6fr1ltvVVBQkCIjIzVy5MhK96pdfw/b1W0fOXJETzzxhCIiIhQeHq6xY8fq4sWLLjVOnTpVkpSYmCibzeaynuPHj2vcuHGKiYmR3W5X9+7d9dprr1W7r7Vtr677U9f1XXX8+HGNHz9ecXFxstvtSkxM1IQJE3T58mWXPnXZl6qUlpYqMzNTHTp0kN1uV3R0tL7//e9r165dtR5Dd/d53759evTRR9WyZUsNGDCgxvXXVFdN/u3f/k0dOnSo1G6M0R133KGBAwfW6bgAAFxxhg0APKCiokKTJk3SD3/4Q912221uL//www+ra9euev755/XnP/9Zzz33nFq1aqXly5fre9/7nhYsWKBVq1bpJz/5ifr06aPvfOc7zmXz8vK0bds2paamql27dvriiy+0dOlSDRo0SPv27VNwcHCN2x41apQSExM1f/587dq1S6+++qqio6O1YMECSdKIESN06NAhvfXWW/rFL36h1q1bS5KioqJ06tQp3XXXXbLZbJo4caKioqK0YcMGjR8/XiUlJcrMzHR7e+7uT23rk6TCwkLdeeedKi4u1lNPPaUuXbro+PHjWrt2rS5evKiAgIB67cu1fvSjH2nt2rWaOHGiunXrprNnz2rr1q3av39/jcewPvs8cuRIde7cWfPmzZMxRgMGDKh2/U899VS1dd1xxx3V7k+fPn20YcMGnTt3Ti1btnS2/+53v9Mnn3yirVu31ng8AADVMACARvfyyy+b8PBwc/r0aWOMMffcc4/p3r17rcvNmjXLSDJPPfWUs+3rr7827dq1MzabzTz//PPO9nPnzpmgoCCTlpbmso6LFy9WWm9ubq6RZN544w1n28qVK40kk5+f77LtcePGuSz7wAMPmMjISJe2RYsWuSx71fjx402bNm3MmTNnXNpTU1NNeHi4S2113V5d98ed+h9//HHj4+Nj8vLyKq3b4XC4vS9VCQ8PNxkZGdXOr+4YGuP+Pj/yyCN1Xn9tdVXn3XffNZLMli1bnG2XL182nTp1MsOHD3d7fQCAb3BJJAA0srNnz2rmzJmaMWOG84yJu374wx86/+3r66ukpCQZYzR+/Hhne0REhG699VZ9/vnnLssGBQU5/33lyhWdPXtWt9xyiyIiImq97E365szQtQYOHKizZ8+qpKSkxuWMMfrDH/6g4cOHyxijM2fOOL+GDh2q8+fPV7n92rbn7v7Utj6Hw6H169dr+PDhSkpKqrS8zWar975cKyIiQjt27FBhYWGN/apyo/t8M+rq06ePJLlsf8WKFcrPz9e8efPcWhcA4P8Q2ACgkf3nf/6nWrVqpUmTJtV7HQkJCS7T4eHhCgwMdF7adm37uXPnXNrKyso0c+ZMxcfHy263q3Xr1oqKilJxcbHOnz/v9ravXv52/XauV1RUpOLiYq1YsUJRUVEuX2PHjpUknT592u3tubs/ta2vqKhIJSUlNb5mob77cq2FCxdq7969io+P15133qns7OxK4bo67u5zYmJindZ7I3XFxsaqbdu2+uSTTyR983CTOXPmaMyYMS7H0hijkJCQWo8PAOAb3MMGAI3o8OHDWrFihV566SWXMxiXLl3SlStX9MUXXygsLEytWrWqcT1VPb2xuic6GmNcpidNmqSVK1cqMzNT/fr1U3h4uGw2m1JTU+VwOGrdh7pu53pX1z1mzBilpaVV2ef22293e3vu7k99679WffflWqNGjdLAgQO1bt06bdy4UYsWLdKCBQv0xz/+UcnJyTUu6+4+X3tGrjY3UlefPn2cge3FF1/UuXPn9POf/9ylT35+voKDgxUdHV3nmgCgOSOwAUAjOn78uBwOh55++mk9/fTTleYnJiZq8uTJbj050l1r165VWlqayxMkL1261KDv47LZbJXaoqKiFBoaqoqKCg0ZMqTBttXQ+xMVFaWwsDDt3bu3xj4NsS9t2rRRenq60tPTdfr0ad1xxx2aO3eukpOTqzyGVzXEPte0/prqqkmfPn307rvv6tixY/qv//ovTZgwweU9fvv371evXr1UUVGhkJAQde3aVXl5eXWuGQCaIwIbADSiHj16aN26dZXa//M//1OlpaX65S9/qU6dOt3UGnx9fSudTVqyZIkqKioabBtX3/N1bYDw9fXVgw8+qNWrV2vv3r2VLjksKiqq1z19Db0/Pj4+SklJ0ZtvvqmPP/640n1sxpgb3peKigp99dVXCg8Pd7ZFR0crLi5O5eXlkqo+hlc1xD5Xtf661FWTpKQkORwOPfroozLG6Nlnn3WZ37VrV82aNUsnTpzQ4sWL61wrADRnBDYAaEStW7dWSkpKpfarZ9SqmtfQfvCDH+i3v/2twsPD1a1bN+Xm5mrz5s2KjIxssG307t1bkvTss88qNTVV/v7+Gj58uJ5//nl9+OGH6tu3r5588kl169ZNX375pXbt2qXNmzfryy+/tMT+zJs3Txs3btQ999yjp556Sl27dtWJEye0Zs0abd26VRERETe0L6WlpWrXrp0eeugh9ezZUyEhIdq8ebPy8vKcZ82qO4YtWrRokH2uav0DBw7UrbfeWmNdNbkabv/3f/9X2dnZVYbWPXv26Hvf+16d6wSA5o7ABgDNzC9/+Uv5+vpq1apVunTpkvr376/Nmzdr6NChDbaNPn36aM6cOVq2bJnef/99ORwO5efnq0OHDvroo4/085//XH/84x/1q1/9SpGRkerevbvLe9A8vT9t27bVjh07NGPGDK1atUolJSVq27atkpOTne84i4mJqfe+BAcHKz09XRs3btQf//hHORwO3XLLLfrVr36lCRMmSKr+GLZo0aJB9rmq9R88eLDWumrSqlUrdejQQRcuXNCPf/zjKvvs2bOn1nfUAQD+j824c5c1AABANT7//HN961vf0osvvljlPZqXL19WSEiIzp0757wkEwBQMwIbAABoEA8//LB27typffv2KSAgoNL8s2fPqk2bNjp16pTzdQoAgJpxSSQAAKi34uJibdiwQX/729+0Zs0abdiwocqwJkmRkZF65JFHlJCQoO7du2v79u2NXC0AeB/OsAEAgHr7wx/+oIceekjt2rXTzJkz9eSTT3q6JABoUghsAAAAAGBRPp4uAAAAAABQNQIbAAAAAFiU2w8d+fvf/65FixZp586dOnHihNatW+fWi14dDocKCwsVGhoqm83m7uYBAAAAwOsZY1RaWqq4uDj5+FR/Hs3twHbhwgX17NlT48aN04gRI9wurLCwUPHx8W4vBwAAAABNTUFBgdq1a1ftfLcDW3JyspKTk+tdUGhoqLOwsLCweq8HAAAAALxVSUmJ4uPjnfmoOjf9PWzl5eUqLy93TpeWlkqSwsLCCGwAAAAAmrXabhO76YFt/vz5mj179s3eDLxch2l/rnH+F88Pa6RKAADXq+lntLf/fG7K+4bGx3jCzXDTnxI5ffp0nT9/3vlVUFBwszcJAAAAAE3CTT/DZrfbZbfbb/ZmAAAAAKDJ4T1sAAAAAGBRbp9h++qrr3TkyBHndH5+vnbv3q1WrVopISGhQYsDAAAAgObM7cD28ccf67vf/a5zOisrS5KUlpam119/vcEKAwAAAIDmzu3ANmjQIBljbkYtAAAAAIBrcA8bAAAAAFgUgQ0AAAAALIrABgAAAAAWRWADAAAAAIsisAEAAACARRHYAAAAAMCiCGwAAAAAYFEENgAAAACwKAIbAAAAAFgUgQ0AAAAALIrABgAAAAAWRWADAAAAAIsisAEAAACARRHYAAAAAMCiCGwAAAAAYFEENgAAAACwKAIbAAAAAFgUgQ0AAAAALIrABgAAAAAWRWADAAAAAIsisAEAAACARRHYAAAAAMCiCGwAAAAAYFEENgAAAACwKAIbAAAAAFgUgQ0AAAAALIrABgAAAAAWRWADAAAAAIsisAEAAACARRHYAAAAAMCiCGwAAAAAYFEENgAAAACwKAIbAAAAAFgUgQ0AAAAALIrABgAAAAAWRWADAAAAAIsisAEAAACARRHYAAAAAMCiCGwAAAAAYFEENgAAAACwKAIbAAAAAFgUgQ0AAAAALIrABgAAAAAWRWADAAAAAIsisAEAAACARRHYAAAAAMCiCGwAAAAAYFEENgAAAACwKAIbAAAAAFgUgQ0AAAAALIrABgAAAAAWVa/A9sorr6hDhw4KDAxU37599dFHHzV0XQAAAADQ7Lkd2N5++21lZWVp1qxZ2rVrl3r27KmhQ4fq9OnTN6M+AAAAAGi23A5sL774op588kmNHTtW3bp107JlyxQcHKzXXnvtZtQHAAAAAM2WnzudL1++rJ07d2r69OnONh8fHw0ZMkS5ublVLlNeXq7y8nLn9Pnz5yVJJSUl9akXTZSj/GKN8xkvAOA5Nf2M9vafz01539D4GE9wx9UxYYypsZ9bge3MmTOqqKhQTEyMS3tMTIwOHDhQ5TLz58/X7NmzK7XHx8e7s2k0c+EveboCAEBVmvLP56a8b2h8jCdUp7S0VOHh4dXOdyuw1cf06dOVlZXlnHY4HPryyy8VGRkpm812szcPNJqSkhLFx8eroKBAYWFhni4HaHCMcTR1jHE0ZYxv6zHGqLS0VHFxcTX2cyuwtW7dWr6+vjp16pRL+6lTpxQbG1vlMna7XXa73aUtIiLCnc0CXiUsLIwfhGjSGONo6hjjaMoY39ZS05m1q9x66EhAQIB69+6tLVu2ONscDoe2bNmifv36uV8hAAAAAKBabl8SmZWVpbS0NCUlJenOO+/USy+9pAsXLmjs2LE3oz4AAAAAaLbcDmwPP/ywioqKNHPmTJ08eVLf/va39f7771d6EAnQ3Njtds2aNavSJcBAU8EYR1PHGEdTxvj2XjZT23MkAQAAAAAe4faLswEAAAAAjYPABgAAAAAWRWADAAAAAIsisAEAAACARRHYADfNnz9fffr0UWhoqKKjo5WSkqKDBw+69Ll06ZIyMjIUGRmpkJAQPfjgg5VeOA94g+eff142m02ZmZnONsY3vN3x48c1ZswYRUZGKigoSLfddps+/vhj53xjjGbOnKk2bdooKChIQ4YM0eHDhz1YMVA3FRUVmjFjhhITExUUFKROnTppzpw5uvYZg4xv70NgA9yUk5OjjIwMbd++XZs2bdKVK1d077336sKFC84+U6ZM0Xvvvac1a9YoJydHhYWFGjFihAerBtyXl5en5cuX6/bbb3dpZ3zDm507d079+/eXv7+/NmzYoH379umFF15Qy5YtnX0WLlyoxYsXa9myZdqxY4datGihoUOH6tKlSx6sHKjdggULtHTpUr388svav3+/FixYoIULF2rJkiXOPoxvL2QA3JDTp08bSSYnJ8cYY0xxcbHx9/c3a9ascfbZv3+/kWRyc3M9VSbgltLSUtO5c2ezadMmc88995jJkycbYxjf8H4//elPzYABA6qd73A4TGxsrFm0aJGzrbi42NjtdvPWW281RolAvQ0bNsyMGzfOpW3EiBFm9OjRxhjGt7fiDBtwg86fPy9JatWqlSRp586dunLlioYMGeLs06VLFyUkJCg3N9cjNQLuysjI0LBhw1zGscT4hvd79913lZSUpJEjRyo6Olq9evXSr3/9a+f8/Px8nTx50mWMh4eHq2/fvoxxWN7dd9+tLVu26NChQ5KkTz/9VFu3blVycrIkxre38vN0AYA3czgcyszMVP/+/dWjRw9J0smTJxUQEKCIiAiXvjExMTp58qQHqgTc87vf/U67du1SXl5epXmMb3i7zz//XEuXLlVWVpZ+9rOfKS8vT08//bQCAgKUlpbmHMcxMTEuyzHG4Q2mTZumkpISdenSRb6+vqqoqNDcuXM1evRoSWJ8eykCG3ADMjIytHfvXm3dutXTpQANoqCgQJMnT9amTZsUGBjo6XKABudwOJSUlKR58+ZJknr16qW9e/dq2bJlSktL83B1wI35/e9/r1WrVmn16tXq3r27du/erczMTMXFxTG+vRiXRAL1NHHiRP3pT3/Shx9+qHbt2jnbY2NjdfnyZRUXF7v0P3XqlGJjYxu5SsA9O3fu1OnTp3XHHXfIz89Pfn5+ysnJ0eLFi+Xn56eYmBjGN7xamzZt1K1bN5e2rl276tixY5LkHMfXP/mUMQ5vMHXqVE2bNk2pqam67bbb9Nhjj2nKlCmaP3++JMa3tyKwAW4yxmjixIlat26d/vrXvyoxMdFlfu/eveXv768tW7Y42w4ePKhjx46pX79+jV0u4JbBgwfrs88+0+7du51fSUlJGj16tPPfjG94s/79+1d6FcuhQ4fUvn17SVJiYqJiY2NdxnhJSYl27NjBGIflXbx4UT4+rh/vfX195XA4JDG+vRWXRAJuysjI0OrVq/XOO+8oNDTUec13eHi4goKCFB4ervHjxysrK0utWrVSWFiYJk2apH79+umuu+7ycPVAzUJDQ533Y17VokULRUZGOtsZ3/BmU6ZM0d1336158+Zp1KhR+uijj7RixQqtWLFCkpzvHXzuuefUuXNnJSYmasaMGYqLi1NKSopniwdqMXz4cM2dO1cJCQnq3r27PvnkE7344osaN26cJMa31/L0YyoBbyOpyq+VK1c6+5SVlZn09HTTsmVLExwcbB544AFz4sQJzxUN3IBrH+tvDOMb3u+9994zPXr0MHa73XTp0sWsWLHCZb7D4TAzZswwMTExxm63m8GDB5uDBw96qFqg7kpKSszkyZNNQkKCCQwMNB07djTPPvusKS8vd/ZhfHsfmzHXvPocAAAAAGAZ3MMGAAAAABZFYAMAAAAAiyKwAQAAAIBFEdgAAAAAwKIIbAAAAABgUQQ2AAAAALAoAhsAAAAAWBSBDQAAAAAsisAGAAAAABZFYAMAAAAAiyKwAQAAAIBFEdgAAAAAwKL+H1jO7iHhaboHAAAAAElFTkSuQmCC", "text/plain": [ "