From 51d367f9967bf5796803171fbbc93f3bd637b60b Mon Sep 17 00:00:00 2001 From: Babooshka <43251215+bshavazipour@users.noreply.github.com> Date: Thu, 20 Apr 2023 17:49:32 +0300 Subject: [PATCH 1/2] KneeOA DSS --- docs/notebooks/KneeOA-DESDEO-Final.ipynb | 3963 ++++++++++++++++++++++ 1 file changed, 3963 insertions(+) create mode 100644 docs/notebooks/KneeOA-DESDEO-Final.ipynb diff --git a/docs/notebooks/KneeOA-DESDEO-Final.ipynb b/docs/notebooks/KneeOA-DESDEO-Final.ipynb new file mode 100644 index 00000000..9e882c40 --- /dev/null +++ b/docs/notebooks/KneeOA-DESDEO-Final.ipynb @@ -0,0 +1,3963 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Interactive Multiobjective Optimization for Finding the Most Suitable Exercise Therapy in Knee Osteoarthritis using DESDEO\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook demonstrates a decision support prototype using interactive multiobjective optimization methodology to find the most suitable exercise therapy proposed in Shavazipour et al. (2022). It also describes using DESDEO (Misitano et al. (2021)) to implement this decision support tool. \n", + "\n", + "- Misitano, G., Saini, B. S., Afsar, B., Shavazipour, B., & Miettinen, K. (2021). DESDEO: The modular and open source framework for interactive multiobjective optimization. IEEE Access, 9, 148277-148295.\n", + "\n", + "- Shavazipour, B., Afsar, B., Multanen, J., Miettinen, K., & Kujala, U. M. (2022). Interactive multiobjective optimization for finding the most preferred exercise therapy modality in knee osteoarthritis. Annals of Medicine, 54(1), 181-194." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import random\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# import required packages from desdeo\n", + "from desdeo_problem.problem.Variable import variable_builder\n", + "from desdeo_problem.problem.Objective import _ScalarObjective, ScalarObjective\n", + "from desdeo_problem.problem import MOProblem, Variable, ScalarConstraint\n", + "from desdeo_problem.testproblems.TestProblems import test_problem_builder\n", + "from desdeo_problem.problem import VectorObjective\n", + "from desdeo_mcdm.utilities import payoff_table_method\n", + "from desdeo_problem.problem.Variable import IntegerVariable # it is not merge to the master branch (I added it separately)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CostsPainPhysical_FunctionST_sessionsDuration(w)Autors(year)Therapy
04004.02400011.1720408An(2008)Baduanjin
13002.4000006.8000712Bennell(2010)Home exercise
23205.72800012.4236168Barghin(2017)Mixed
31604.10000012.100088Cheung(2014)Youga
44804.3000008.70002412Jorge_12w(2015)Resistance
52403.1000003.3000126Jorge_6w(2015)Resistance
62401.3900002.99001616Topp1(2002)Resistance
72401.7100006.62001616Topp2(2002)Resistance
83501.8400001.340078Fransen_ind(2001)Individual training
93202.3000001.7200168Fransen_group(2001)Group (Mixed)
101700.900000-1.00001312Wallis(2017)Walking
114402.9800002.54002412Salacinski(2012)Cycling
124002.8400006.08002010Wortley1(2013)Resistance
134000.6000002.80002010Wortley2(2013)Tai JI
141501.8700003.5600026O'Reilly(1999)Mixed
151805.5000009.92003612Sima01Platform group
161805.0000003.10003612Simao2Squat group
173201.1428575.4400168Lee(2009)Tai Chi Qigong
184802.5000008.6000248Lin1(2009)Proprioceptive
192403.40000017.3000248Lin2(2009)Strength
20720-1.000000-1.00003612AglamisMixed
215250.3200000.1000712Lim1(2008)Strength- Malaligned
225252.3800005.4000712Lim2(2008)Strength-Neutrally aligned
234803.700000-4.80002412Lee(2008)Tai Chi Sun-style
243001.4000006.60002010Rooji1(2016)Mixed
256002.6000009.20004020Rooji2(2016)Mixed
2612002.5000008.8000248Jan1(2008)High-resistance
2718001.8000008.4000248Jan2(2008)Low-resistancength
281203.00000010.1000124Evcik1(2002)Home exercise
291202.9000009.2000024Evcik2(2002)Walking
304805.13000017.8800248Krasilshchikov(2011)Mixed
\n", + "
" + ], + "text/plain": [ + " Costs Pain Physical_Function ST_sessions Duration(w) \\\n", + "0 400 4.024000 11.1720 40 8 \n", + "1 300 2.400000 6.8000 7 12 \n", + "2 320 5.728000 12.4236 16 8 \n", + "3 160 4.100000 12.1000 8 8 \n", + "4 480 4.300000 8.7000 24 12 \n", + "5 240 3.100000 3.3000 12 6 \n", + "6 240 1.390000 2.9900 16 16 \n", + "7 240 1.710000 6.6200 16 16 \n", + "8 350 1.840000 1.3400 7 8 \n", + "9 320 2.300000 1.7200 16 8 \n", + "10 170 0.900000 -1.0000 13 12 \n", + "11 440 2.980000 2.5400 24 12 \n", + "12 400 2.840000 6.0800 20 10 \n", + "13 400 0.600000 2.8000 20 10 \n", + "14 150 1.870000 3.5600 0 26 \n", + "15 180 5.500000 9.9200 36 12 \n", + "16 180 5.000000 3.1000 36 12 \n", + "17 320 1.142857 5.4400 16 8 \n", + "18 480 2.500000 8.6000 24 8 \n", + "19 240 3.400000 17.3000 24 8 \n", + "20 720 -1.000000 -1.0000 36 12 \n", + "21 525 0.320000 0.1000 7 12 \n", + "22 525 2.380000 5.4000 7 12 \n", + "23 480 3.700000 -4.8000 24 12 \n", + "24 300 1.400000 6.6000 20 10 \n", + "25 600 2.600000 9.2000 40 20 \n", + "26 1200 2.500000 8.8000 24 8 \n", + "27 1800 1.800000 8.4000 24 8 \n", + "28 120 3.000000 10.1000 1 24 \n", + "29 120 2.900000 9.2000 0 24 \n", + "30 480 5.130000 17.8800 24 8 \n", + "\n", + " Autors(year) Therapy \n", + "0 An(2008) Baduanjin \n", + "1 Bennell(2010) Home exercise \n", + "2 Barghin(2017) Mixed \n", + "3 Cheung(2014) Youga \n", + "4 Jorge_12w(2015) Resistance \n", + "5 Jorge_6w(2015) Resistance \n", + "6 Topp1(2002) Resistance \n", + "7 Topp2(2002) Resistance \n", + "8 Fransen_ind(2001) Individual training \n", + "9 Fransen_group(2001) Group (Mixed) \n", + "10 Wallis(2017) Walking \n", + "11 Salacinski(2012) Cycling \n", + "12 Wortley1(2013) Resistance \n", + "13 Wortley2(2013) Tai JI \n", + "14 O'Reilly(1999) Mixed \n", + "15 Sima01 Platform group \n", + "16 Simao2 Squat group \n", + "17 Lee(2009) Tai Chi Qigong \n", + "18 Lin1(2009) Proprioceptive \n", + "19 Lin2(2009) Strength \n", + "20 Aglamis Mixed \n", + "21 Lim1(2008) Strength- Malaligned \n", + "22 Lim2(2008) Strength-Neutrally aligned \n", + "23 Lee(2008) Tai Chi Sun-style \n", + "24 Rooji1(2016) Mixed \n", + "25 Rooji2(2016) Mixed \n", + "26 Jan1(2008) High-resistance \n", + "27 Jan2(2008) Low-resistancength \n", + "28 Evcik1(2002) Home exercise \n", + "29 Evcik2(2002) Walking \n", + "30 Krasilshchikov(2011) Mixed " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# objective values for available alternatives\n", + "cost_net_data = pd.read_csv('Cost_effective_therapy_results(Net).csv')\n", + "#cost_net_data.describe()\n", + "df = cost_net_data\n", + "#df['Autors(year)'] = papers\n", + "#df['Therapy'] = Therapies\n", + "#df[0:5] # To show some rows\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "Data = df.to_numpy() # Extract the numbers\n", + "\n", + "n_variables = np.shape(Data)[0] # number of therapies -> decision variables (n)\n", + "n_objectives = 5 # of objectives (k)\n", + "\n", + "c = Data[:,0] # Allocate cost information to c. #The second index refers to the columns\n", + "pnet = Data[:,1] # Net Pain improvements\n", + "phnet = Data[:,2] # Net Physical functionality improvements\n", + "st = Data[:,3] # The number of supervised sessions\n", + "t = Data[:,4] # The the length of therapy (weeks)\n", + "papers = Data[:,5] # Papers run the experience\n", + "Therapies = Data[:,6] # The Type of exercise therapy which used in the paper" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Feasible solutions (only one exercise therapy)\n", + "xs = np.zeros((n_variables,n_variables))\n", + "for i in range(n_variables):\n", + " xs[i] = np.identity(n_variables)[i]\n", + "#xs" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Objective values for the available exercise therapy modalities\n", + "fs = Data[:, 0:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from desdeo_problem import ScalarDataProblem\n", + "\n", + "#creating a data-driven problem object\n", + "problem = ScalarDataProblem(xs, fs)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Initial solution\n", + "x0 = np.identity(n_variables)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "N of objectives: 5\n", + "N of variables: 31\n", + "Single decision vector evaluaion: (array([400, 4.024, 11.172, 40, 8], dtype=object),)\n" + ] + } + ], + "source": [ + "print(\"N of objectives:\", problem.n_of_objectives)\n", + "print(\"N of variables:\", problem.n_of_variables)\n", + "\n", + "print(\"Single decision vector evaluaion:\", problem.evaluate(x0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Problem Formulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **minimize** cost of therapy\n", + "* **maximize** expected net improvement in pain\n", + "* **maximize** expected net improvement in physical functionality\n", + "* **minimize** number of supervised training sessions\n", + "* **minimize** length of treatment\n", + "\n", + "**subject to** one therapy is selected from a list of options." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The mathematical formulation is as follows:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{equation}\n", + "\\begin{array}{rll}\n", + "\\mbox{minimize} & f_1({\\mathbf{x}}) = \\sum_{i=1}^n C_i x_i & \\\\\n", + "\\mbox{maximize} & f_2({\\mathbf{x}}) = \\sum_{i=1}^n [\\mathbf{E}(P_i^{Pre(EG)}-P_i^{Post(EG)})-\\mathbf{E}(P_i^{Pre(CG)}-P_i^{Post(CG)})] x_i & \\\\\n", + "\\mbox{maximize} & f_3({\\mathbf{x}}) = \\sum_{i=1}^n [\\mathbf{E}((Ph)_i^{Pre(EG)}-(Ph)_i^{Post(EG)})-\\mathbf{E}((Ph)_i^{Pre(CG)}-(Ph)_i^{Post(CG)})] x_i &\\\\ \n", + "\\mbox{minimize} & f_4({\\mathbf{x}}) = \\sum_{i=1}^n ST_i x_i & \\\\ \n", + "\\mbox{minimize} & f_5({\\mathbf{x}}) = \\sum_{i=1}^n T_i x_i & \\\\ \n", + "& & \\\\\n", + "\\mbox{s.t.} & & \\\\\n", + "& \\sum_{i=1}^n x_i = 1 & \\\\\n", + "& x_i \\in \\{0,1\\}, \\; \\; \\; \\; \\; i={1,\\dots,n}, & \\\\\n", + "\\end{array}\\label{eq:mopmath}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where $C_i, i=1,\\dots,n$, is the cost of the $i^{th}$ therapy $x_i$ (we have $n$ therapies), \n", + "$\\mathbf{E}(P_i^{Pre(EG)}-P_i^{Post(EG)})$ is the expected value of the differences between the mean of WOMAC pain scores pre- and post-intervention.\n", + "\n", + " Here, \n", + "$\\mathbf{E}(.)$ refers to the expected value. \n", + "*EG* and *CG* describe the exercise and control groups, respectively.\n", + "Furthermore,\n", + "$\\mathbf{E}((Ph)_i^{Pre(EG)}-(Ph)_i^{Post(EG)})$ is the expected value of the change/improvement in WOMAC physical functionality scores after the exercise period.\n", + "Moreover, $ST_i, i=1,\\dots,n$, is the number of supervised training sessions of $i^{th}$ therapy and $T_i, i=1,\\dots,n$ is the length of the $i^{th}$ therapy (in weeks). Finally,\n", + "$\\vec{x} = x_1, \\dots, x_n$, is the vector of $n$ decision variables referring different types of exercise therapy and" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{equation}\n", + "x_i = \\{\n", + "\\begin{array}{rl}\n", + "1 , & \\textrm{if relevant therapy is selected}\\\\\n", + "0 , & \\textrm{otherwise.} \\\\\n", + "\\end{array}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "The constraint in the problem makes sure that only one therapy is selected." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Define decision variables\n", + "# As the variable are binary support for IntegerVariable must be included in DESDEO \n", + "var_names = [f\"therapy_{i+1}\" for i in range(n_variables)]\n", + "vars = [IntegerVariable(var_names[i], initial_value=0, lower_bound=0, upper_bound=1) for i in range(n_variables)]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Objective functions -- 5 objectives \n", + "def f_1(x: np.ndarray) -> np.ndarray:\n", + " x = np.atleast_2d(x)\n", + " \"\"\"\n", + " Min therapy costs\n", + " \"\"\"\n", + " cost = np.sum(c * x)\n", + " \n", + " return cost\n", + "\n", + "\n", + "def f_2(x: np.ndarray) -> np.ndarray:\n", + " x = np.atleast_2d(x)\n", + " \"\"\"\n", + " Max pain reduction\n", + " \"\"\"\n", + " pain = np.sum(pnet * x)\n", + " \n", + " return pain\n", + "\n", + "\n", + "def f_3(x: np.ndarray) -> np.ndarray:\n", + " x = np.atleast_2d(x)\n", + " \"\"\"\n", + " Max physical functionality improve,emt\n", + " \"\"\"\n", + " function = np.sum(phnet * x)\n", + " \n", + " return function\n", + "\n", + "\n", + "def f_4(x: np.ndarray) -> np.ndarray:\n", + " x = np.atleast_2d(x)\n", + " \"\"\"\n", + " Min number of supervised training sessions\n", + " \"\"\"\n", + " SupTrain = np.sum(st * x)\n", + " \n", + " return SupTrain\n", + "\n", + "\n", + "def f_5(x: np.ndarray) -> np.ndarray:\n", + " x = np.atleast_2d(x)\n", + " \"\"\"\n", + " Min treatment length\n", + " \"\"\"\n", + " weeks = np.sum(t * x)\n", + " \n", + " return weeks\n", + "\n", + "obj1 = ScalarObjective(\"f_1\", evaluator=f_1) # maximize=False by default\n", + "obj2 = ScalarObjective(\"f_2\", evaluator=f_2, maximize=True)\n", + "obj3 = ScalarObjective(\"f_3\", evaluator=f_3, maximize=True)\n", + "obj4 = ScalarObjective(\"f_4\", evaluator=f_4)\n", + "obj5 = ScalarObjective(\"f_5\", evaluator=f_5)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Define MO problem object\n", + "mo_problem = MOProblem(objectives=[obj1, obj2, obj3, obj4, obj5], variables=vars) " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "N of objectives: 5\n", + "N of variables: 31\n", + "N of constraints: 0\n", + "Single feasible decision variables: [[400. 4.024 11.172 40. 8. ]] with constraint values None\n" + ] + } + ], + "source": [ + "print(\"N of objectives:\", mo_problem.n_of_objectives)\n", + "print(\"N of variables:\", mo_problem.n_of_variables)\n", + "print(\"N of constraints:\", mo_problem.n_of_constraints)\n", + "\n", + "res1 = mo_problem.evaluate(x0)\n", + "\n", + "print(\"Single feasible decision variables:\", res1.objectives, \"with constraint values\", res1.constraints)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solution process initiation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### ideal and nadir vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#ideal and nadir\n", + "eps = 0.001\n", + "nadir = (max(c), min(pnet), min(phnet), max(st), max(t)) # z^nad\n", + "#nadir2 = (max(c),- min(pnet), -min(phnet), max(st), max(t))\n", + "ideal = (min(c)-eps, max(pnet)+eps, max(phnet)+eps, min(st)-eps, min(t)-eps) #Utopia: z** or z^utp\n", + "#ideal2 = (ideal[0], -ideal[1], -ideal[2], ideal[3], ideal[4])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "mo_problem.ideal = ideal\n", + "mo_problem.nadir = nadir" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(119.999, 5.729, 17.881, -0.001, 5.999)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mo_problem.ideal" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1800, -1.0, -4.8, 40, 26)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mo_problem.nadir" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Scalarization functions" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "from desdeo_tools.scalarization.Scalarizer import Scalarizer\n", + "from desdeo_tools.scalarization.ASF import PointMethodASF, ReferencePointASF, StomASF\n", + "from desdeo_tools.scalarization.GLIDE_II import AUG_STOM_GLIDE\n", + "from desdeo_tools.scalarization import AugmentedGuessASF\n", + "from desdeo_tools.scalarization.ASF import AspResASF, STEM" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "ideal = np.array(ideal)\n", + "nadir = np.array(nadir)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Scalarization set-up\n", + "# Different scalarization functions can be easily added \n", + "\n", + "STOM = StomASF(ideal=ideal)\n", + "\n", + "AUG_STOM = AUG_STOM_GLIDE(utopian=ideal-1e-6)\n", + "\n", + "ASF = ReferencePointASF(preferential_factors = 1/(np.array(nadir)-np.array(ideal)), # preferential_factors (w): np.ndarray,\n", + " nadir=nadir, # nadir: np.ndarray,\n", + " utopian_point=ideal-1e-6 # utopian_point: np.ndarray, rho: float = 1e-6\n", + " )\n", + "\n", + "ASF2 = PointMethodASF(nadir=nadir, ideal=ideal)\n", + "\n", + "# ASF without normalization (as the DM had a strong emphasis on pain and function we set w=[.2,30,25,1,1] )\n", + "ASF3 = ReferencePointASF(preferential_factors = np.array([.2,-30,-25,1,1]), # preferential_factors (w): np.ndarray,\n", + " nadir=nadir, # nadir: np.ndarray,\n", + " utopian_point=ideal-1e-6 # utopian_point: np.ndarray, rho: float = 1e-6\n", + " )\n", + "\n", + "AUG_GUESS = AugmentedGuessASF(nadir=nadir, ideal=ideal, index_to_exclude=[])\n", + "\n", + "AspRes_ASF = AspResASF(nadir=nadir, ideal=ideal)\n", + "\n", + "STEP = STEM(nadir=nadir, ideal=ideal)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interactive decision making process" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we simulate the experiment conducted by Shavazipour et al. (2022). " + ] + }, + { + "attachments": { + "Untitled.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABOMAAAD6CAIAAABs7BTKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAANiGSURBVHhe7J13XBM9GMcDiKCIIii4ceDEhchQBATFhcgGZe+9pwz94MKF4h44wC0OUF73HoioKIpbEUVUHDgQlF3eu/ba3l0LlFqghXz/ulzv2mvyXJJf8uQJqIVAIBAIBAKBQCAQCISfgEoVAoFAIBAIBAKBQCD8BVSqEAgEAoFAIBAIBALhL6BShUAgEAgEAoFAIBAIfwGVKgQCgUAgEAgEAoFA+AuoVCEQCAQCgUAgEAgEwl9ApQqBQCAQCAQCgUAgEP4CKlUIBAKBQCAQCAQCgfAXUKlCIBAIBAKBQCAQCIS/gEoVAoFAIBAIBAKBQCD8BVSqEAgEAoFAIBAIBALhL6BShUAgEAgEAoFAIBAIfwGVKgQCgUAgEAgEAoFA+AuoVCEQCAQCgUAgEAgEwl9ApQqBQCAQCAQCgUAgEP4CKlUIBAKBQCAQCAQCgfAXUKlCIBAIBAKBQCAQCIS/gEoVAoFAIBAIBAKBQCD8BVSqEAgEAoFAIBAIBALhL6BShUAgEAgEAoFAIBAIfwGVKgQCgUAgEAgEAoFA+AuoVCEQCAQCgUAgEAgEwl9ApQqBQCAQCAQCgUAgEP4CKlUIhEsABAKBQCAQCAQCaTxYf7peoFKFQLiEw3cMwnNgzkOaB2hpkDYFNHiIQAMNWLDgsLxgoUIgXALrxJYC5jykeYCWBmlTQIOHCDTQgAULDssLFioEwiVtrk78dnWB67rHFCzFJX+vxnjuyq3CUtwBW6PWS/nzRI/5J79jKYSqN4eDra2d/YICfBYfz6vEzpKoeL5FXyk4HUvReJngteRGMZbgEmhpkCam6u0x/4D9H7AUyrdLyxznOXgHBnmHJTz4jZ0kQSk86TrK8kAplqTy4WBA+JlvWIJLoMFDBBpowBzyOyveZen1cizFBaXnF3jty6vGUtzCYXnBQoVAuORf68Sqz7f3xXrOUVccMUppgraO1uSZTsvP5v1FP/p+2ddi+TPqVfxC5ZMVU6bEPalDKdAoL7ieEOVkoqM0YqTKJG1t7cnaGsoDpEQA6Bl4C7sEoeLRclOXlMJ/ULyNzvnPye6TNZQGdm2H3InQse849PG0NFRGD1foLz9UzcAp5vCTOvqEfERpmr/6OMXB/Xp07Tgj4Rd2slXxNc1hon0aTqd+P2Hbb1hQBrVBLb0TqTnSaEHKixLqR3T+vEqZr92tg3r8yxrsDJ3CQ85max79Q2PcaEurubJQR0t1eI8ONEMT6TpYVROxNKqxqY4dPqiXJPI2IPTwwb0QkDq5Ej1BeeQQ+Z7SnSaseoeda1UUX/PXMN33EUshVN5ZMLq3ySGq4KzO3WE4Sstn152vhP5g1adra00Htu/vd40gVBF+nvU1XnCb+Ho0DsQ2saPGUfXp+ga3OdP1DWbrT9fRmeWw8uLH6trKu4vMlj3AroDURQ3TylVW5WInIdzRWAO+vWKmltqIHh2p1TIQkRmmroVU1poTxo0cOkh+4Ghdy4CNVz7W2+tpKT4ecFYbO2JQX1mpDqbJjRSMNe+S5mgGZ/zBklxS/iDGxO30FyzFHRyWF3e1EgQC4bpRR/mZuc5sWKcOQ4yXHM35iXWwK4penF40S9V446VEMxkwKPwh7TRf8Ouip+qcpPy61eXfnN1u6j1EJUY7bTn38AteHJTeCx/dTj8J332qerR4wvj5t7iuJ7nN+c/rJ6HNkfIKQneg6lv2LofhYiJyOstvN/KR3u+3GCA70vO/f5zI4Jzq0k9ZsRMRwa279Sd2qvVQ/WrLNHVC80l5EjMcjF+TjyVry866z1t8bOuikAD/wODQ8LAgLxdn70i/qbLiE9a8IOtUlK8HTUeZHS7AUo2HS0srT5snidwqanKIrCWqvmcnOowQAwYH/0VANwXVD1ZO6Nl70vK7fNUtq/n75fGm6Z0AGLf8LXaq9UApOGik4nz+B5ZE+ZY0Xbybz3UsVVv7fKGlz76kleGBfoFBIeHhIb5uTu6hYWZD2g/0ucqusio+4zh62vZXXA8DcmXwFQ9XTJRV9k17Qx1mRSh/eyLC1NTdckw7OX+io4MAUpW5TK1HH+019/91+qhuav4UPlip2wGAMcSmib8oTHFSkB3qdAQ//893cFdjV172kEXu7GR9ilD7/Xl7brFOd6FOwxyOvP9HXzI6r3fP6ienFHKeF+PiVb/eXfQdjjy34eFG2WbZ/QWTJjcw68AZFQ8WqKpE3yvDklzAYXlx1+GDQCBc66XaTyddh4iB7lNW3mP1Taz5fMplsBDy1bxWqqVJpvansOPG8vs/u166Wz9jKRYoXy6EqUoCYXmT7Y+ZvafSfdErXlKPys84Top5Qj2kU/UocvTY2Odc1v5c5/wxS3RKa8q2IizNgPJw/mDkEzmLI5+wM5xQuncmWlSilscqsDPNwd3AvgDobMH3b1sFL5crD/C7SWg+Xy8fB7q6XsFSCD+3mjhfwo5pVD1aqtxZfTXLfCqdz/tmDbI9w+00E7eWlhUsj9zaxZ34rBg1L5eMHbv8NZZqbqqPmVocxo7xPFuM9nmAfHgWdoJveLV4FABKsXlYstXwcatub7v/CHqz/JCJMNDbjevGnnU23UkclPq031C6vxfLfCqdX/9ZKRgc5HbsjAuDr8oMG9ROfR15GLP8zvyRIqAVKNWcCLRpAEOjmnbo+PmS0fytVKuOmIsi+SCkn9TI8dxmhQsDRnmxVBG5U86b1Vp/HDDqAICY0sIHvBhb/LpFBzWmTvbneKR8zzp1bqRSrcoIUlBa8oxHv195N2yk6ipaR48bOCwvLjt8EAiEuzqxImelakcA+jqeq2tS7M91r/48V6o1130GcatU81apdJ2XUldnn/JyzcT2SF4M8s8gDK3lxRoHY53eom36LL/9aYuOtNEBnJ9nI+Au5xHqVKq1tffCBiIfgUnr6xTkbPh6KnDiKI3Qi806v0lVQZM3c5d1fMufM47dRi0mtXjnXaRAv6B7WArlkrt1Eq6PXpWzdKyk6poX9TTUVRdce4xelMNdw8ytpdWrVGtr36+dVddHTc79+QNM2SnV2hc7zceNmbX+YdNNHXFJ7tIxAIxd9gZLthKqMgL7yQfeJY6wvFw2FgCTozhjzV1hTRjl+7R/trS8z9V6hl4od0MHDgxI527GhAuDf4AoucEROVgKR+Vll+6tQKlSHm83URo7e+vjugbDeMOrWCU+n1P9eSlKc5SaX1pjWshmh8sau26lWlu2bxbyEejqcZkX4u5DipvaKO2Ya7xS+xdcuzZOqX7bO7OLTgIPy7BgwwQZs+PcdoE4LC8uO3wQCISrOjF//SRE1glpb6pv7u7b9qlCvFWqX5ONpcW4U6rll9zlenndrCsGUsEOXQkkJ3o4nyP6s1CuuavQlWpthq/lhq/YMZ2f+/XFB0ZwtYqJq5xHqUepInIc+Qi0n5fGo8HGJoOqgrQ3sfkPAkzBOo0OulvJL0V25BDQwfYMlkKoSbW3T2X0GKseL1KSVF/9rP4uZE1mcN9Oxke4iq3EraU1oFRrL3vM2/WPwZ644+dJ256AvVLlW6hKdczS1rWC73uSvsS45a+wFJ2fO6YBoLkFV1dmR9rGM73XC/fMlu7vdbmu+VSM50sV2+skFGKpRtF4gy/fMxsAcfMUNjNO1eddFAVfqTYT1EEKvlaqAgGXNXY9SrX2jC017IBSLPlt5QfQwdxGKFXKw6jhnS2ONlCBNI7vO6eLDV/wCEs1Eg7Li8sOHwQC4aJOpNwK6IlWehr1ClV0zkWFV0q1/OuTS7vdlVAHFq6UanWarWRX1wtYioV0/97oH+rtdxs7gVF82kFOnqFUSy/uOY6LGkLjz14DkWHR3FRwXOQ8jXqUKiqK0D/in4md4FuoKkhrY7OtjW0O8lYpgQkbWF6KP8fndgS6O5jjtY+jLJfS3WarHi0eJ6m6sr75VIy7gX3F5x7nZjENt5bGTqnmb/Fb+wI7Lrp08AJ56KaJqSx6fm2vv3on5LkEUamOXtJS7tJNQlGCDhi+mDVo3v35/cHAyGwshUpXK/dLdAv/uNegq7zHlYZd2V8tHiU8Yxc36wO4MPjrPj0A6Ki2MJP1uX6fjdv+FDuG1A9UqjyByxq7HqVaeWgO8hEQmr6TH92YGqlUkaZQ2PggfT05j/i1eyYYuYg7D2AOy4vLDh8EAuGiTrwT0h+t9EYsfI6dqIvXe2KP4KVd9cfrmyMCAgL8vH0DAr3cfddc/ESom6o/3dgU7Obm5RMcvWRxmKdnWJCxbjSquX7e2BweHu4/A/ld4ZGmyCGVpPv0KdI6b6RzJ6APmLq9rgm8xzR9J+N6gTavVV1e+v19zoUEPzUZAJhKlT1PF40EKqsY4XI4h4ucp1G3Un2zfBzySQe11U8YU6p/nx1Z6Ofp6x8c6OVkrG8RnZzzi3W6taay9HthEd2V5/1ee9Wxwwf26d65t9e12t/ZB5YEevsH+jjM0p7ivOluIybRfmYlBNrYOHm4uzjY2Nq4Rh95xZyyoKogzQ1fy1+lrgrx9Q30czHU0Z63/CrZoafmw6XVwZ4+vkFBvq6W+kY+29IL8RPj3465qSmhoQO7SDmfqi19enRZkI9voK+TwWQdu7gMcqNM+fnwQIi5vqm9i7O1oWXw/px3D5IWBYfMt9dTD7zI6KL+fXEo0sXJMzA02NvGyNAlPv07ZxPUP3fNEGIbDrfymnuPzvNSsOn6yjthlisxwVL5aMmYTuNXP+OkiS4/YCTCMNFGwa2lsVGqNf/Zjcf5cebvsRk9UK6rZEexdno7sTjOBUf9Z6mPHNxPrmtH0wP0P5YeMwkNDNpDWmLq5s/VBRfXh/v5BPq7m03VMg777x3r3y95mBRma+Po4e6Kmo5z+MEnVOv8k5mAvPihBgrIcw0xoFUD4eEJmXgvtOqy4m+ff5LWXFd/uLxxvn9AoK+3X2CAl4dv/NXPzIysvBgxYRzyxD26dpy9p7Qy78zaUF/k6dyMdbUsFp77yLl7QumTffPtbBw8PFwdbZGnDt2Twxz2pyrVUYtfVeWfjaf+eTfTqdqm0WfekwqU8vXWxjBvb8Tg/d2sDAxc1116j5/oKzsXNAGNnE3N3fKK3FOrQ5Bn9XM10tWyXHSZJRZ5yYvj0fNmG9u6ONsZmXnvyHr35HBsSMh815nqzqmMUaKKdycXuzm6+4eE+NqbGNrFXijkzMjKj88V72hzms3Fb1Yot5uwlh496sNmC9/LWBl/2jeraz+vy5yEYqGcdpDsYH6Ei7EZLgz+73XffshtoIuSdczOszlf2a/ZL9xvP2ZgD6q969D9QT6eDNKfOGqwPGI9Rnuw8v6R6qOupKiAltKMXUUfTi8PCAgN9HCaZ2xg6rvlNjvxXZGbEuPi5IGUgY+diaH9iqtfsGxFvgqt4frIdpFzu1RdcGZVeFigmYaqafydUrT2Ux0qQ4sFLyQ1yGgLVq08XKooRj0pLqu8kCFbqv8Wf/38C/fHfj5MivJ09fQOjFi0JNLXPTjMboL7SZy/dc3nq3Fejq6+waH+zmZzLCNT3pBzpeTxnjBbC0s79+DoZQtD5m++fWsJ6jnAiVKt+Zq5LdzdzdM7OHLx4vneHqEhFpOCmUG4kLcy//RSd5pVOprMsV5y7gOzmqB8z9od6UF99MVLInzcQ0Jt1H3phlj54dq6IDd3L5+Q6CWLQj29wgMNpsbgRswplX9+FH4rJb0qv3OSlwQHBPn7+CC1hIdH9MGnuEold7uF6phhA3t36zwkNLP2x73EmADvgEBvm5na09x3PSLM7TX06xyBFB121CjqVqp//7NDtKBQb7vTOAfXksf7Qp2cvANDgzytjIzct9yjf/Y2cR7t70qOWJBd/vLIktBwn9lqEx12PWW0vTUVJUWF30likfLtzs7owIBAagfPx91rWdo7du77NV+ux3tbWVg5eIctWhoZvOjw8xTnLo1Qqm9WjgUjl5E05f24qYpyNKsX6TpQa1nm58MuI7ET7WWHz9mCjq9+TTJEd3FAEO6is4W0EuNRtAKYsIFlLoITkC/EjuqFyw4fBALh8B3D8WfXDOq73shFhr/uxE3rM9j1DH0Spqbwgv+4vtrR1+gdpor7C0apxzxjdsu+/efQvxuum/xr53S2c6oN3kit2tgFWXm0wVBbW3uCQmfqH+o6VHPKVD29qTq0HTloTHZIqn9jieqTNuJCU3Y2fugf+UXsqJGwV6pVn68s0pICHUb6nGV+8HHf7OGzk95gLUDF6216XcTGReM69qXngtUUulArb8tj2DlKVemXV/+5IWqgq9O6Te4LL2El9P2gsQTo5nKejYccK2UPt8zu11l9cRa9Gf99I0K5t8khemNIVUGTAld5+x1/T3u8sguuvYCE/n783yq/5q04YRHSJ6NC+XrOYYBQP5sUnJyt/vP1zfmAUQCIWsft8gz/7zOtA/I7bZ40kJp7HN+J+HNnwVgxyZm7aAEQy7IXKAmJqMTl1tT+vRoxzeHge+pF71OcRsiMDbmOya7KJ0tVJPraHudg7hcxhE7CdQTq+Hk9bJyKz/n8Hx/u7fG0js2m9b6rchaO6aS68imHDTQ6JtLQuAlbuLU0glKtqfz77cXZyEmdFUlxxWoK4jWFEXukK1WUiuxIajTH/fS/VlP+s+Be3LSOAGgu2BHutfMFrc9bnRMxHIiqryFExK18vtNMQXJMaAZ9UOTP3Vj1XtMSGY6g1YcNkS9nnVN9kzRvbO+OaHgw4sv+4/ayKb2HezLC01Z/OOszuq/O0pv0Cqym7Pu724snId0avaW7g/0OYDslV2QE9gdiU7dz1HmpernPcrDkyKBr9JGgsvurNHtN2Uq/mapUR3rHBnnseUXrvlXdDR0C2mtswo9y1WRFjVUKuEJ/0l+3/BWFZeck5TPVYDXyrDcXTkBe2dnLEv39D2Myv/yGZ1+AyCL8HHfFk7UancQmrXlJvaTq9VrN9mBYVHZVbfW95bPMttOmxr+cDxgnM9SVvk1DTd4mnS6yBom0t6F+0HlIjXVsF4tVPNsydbRJ4tOir89ORVj70aukT4n6XeU9mINC9fNx/SQgRYo9xhFcGXzpjShlNNY1FeFOfcZNtw6M3XfvG1mI13zaOhnJfcLKhcrHC5HSBfqM1efV5T8/ZC3VFEVMUdXEc9cTzJSr3u2Z3a1dv9mbHxM03+dTPmNlhntcxGqZmpfrtCTljA7STKf677e86+HKwkDCasnCuUvuV1SnzEPEqQy9gfuSNBt5rbo6ncVXI0hl2l1Sb+sbWl39OsF8TK8O6IuBi6j0bovOSPdLzIHH0jvRY9rr76fX7r8zlmvJ9jHdT99r8ssxM9nOGmtyGNlR/mSnyUBp5bCrjNeq8HSgjnxXjpRq9dPY8ePCs5iV5Y/LPoM7WjPa9m+X5qt0G+R48hPtZaLk79STkpm5E9MWrzdojvG+xrSikoyQkaKmNKFTfjdUceKKl4z8pRSm2vbuQRNvNVcWTBgsjUZUQooK14xV5iY7D++tu+UFXVeVPFo/c8AIhwOvMWVGqSopfHbYoQ8Afb03xLktTceasa8JemKgt086M1Pq+fVGgDwgdtQo6lCqJc/32Si0E5GbvuUp48Fqcg9YKXRTWXQHGzMquxel2HGA51nqH0P+7ueXKWgPQN4zNsB2Yy7lewIaQ2loFFL1F6X6jh/QGanxgYT9Oeq9NEpzthsPkLc8XIDVf5Tv6Qs0+qr4nyEO9X2/vkhTrsfMzU/o+V/2PMFpbK/2nCtVdESYfTCnklQrGQAkXc7TP6t5umi0MOgbeBdLI/xOs5WVnr71NauErjxu1h5pwLlZz8JheXHZ4YNAII2vE9/T1kICowPkNrweSs7ayYGenlfw82G1VdlhQ4GsVSqti3sroE8Xu/8IF7xYqu12ETuuW6k2eGPtKXsxoM3OW5bK+7W0PzR1O1eOMWi4UbyrG6cgv4gdNRKaUu050dqZipP93DlTJqmrqOlYhOzO/IzPh5K9Bkj3pIv9KXoTUJPu3xewDBx+2aqLfCFDqdJABDgQkx6/8DazlN/FKQMg63UVS9ZD5YP5I4SF1Va/YzQnJXtnIo2bqHkK9nxUFSTe0x0XNbQkSR+5wuIorhN3w7c70mvU3sTY7axgnQa6sW0GlsS47CEFhKQVw68yby3apI00pXZnme3Zj21TqEvRGNd82jAB+S7va7gmrzBxVmdAXM9cmTJPDPTxvtbg1M67FcpIJ+EalmLh95vrh9bGRMclP/pJ+8HqnCXjOo1fzphPLStIT1q1dPPpl2y1LkLlQWMgZHKUs+YcD7eWRlOqIj1Ha6Ob86krDeuJet2SlWpt7X92SFeZoFRra4+aIJcylSoVdMAISPeal4iTU6fske/U2so8U/NkmXI7MGoJc5658og5OjRusJfeNa1LqaJU3wsbTFSqxalW3UEf3wzCo1TeDlIAPezO4rolj6KHIf3//q6HmOeqjpmKAOFZiQ0rq5qXK9XagxGRjxmWU502D10YprcbyxaqUhXvarmPWcnUnLBGOmjTduBGuXIWoCFacctZfyTptwOdHM8QSx11rwXSAz1TmU9Wsd9QGIjMOcSc5ig/bIp8vd5uxv8p3TsTqQ2sT+BM+WeqlSyQsiLE7r3iKQ2krU8QipMdv5AXSsz6BJZiofzT/ZPblkYv3XWTvpNj4b45Xfu5MeZTq4oeHVu3NO7Qve91NSRnHDsQ3OY5BclC7KhxVLw5uWiuhjxizUykxgWfI7m4X0QjlZLW2KdaIdUbU6lSuR3UD+k326YRhvZ+pczrCkTGLs5hlGjRUQtpION0FlcslAuOXYCc/SnG1yFtHBDtNjL4PFp7Fd9PiI45/oL+tZU3PHsBMCDkPq4iq0hzmLSU6VmDUHU7CHmbmUo1f814JG8JA6y/d0432Ed7irJbfgOB2LQd+BG6nAXDQYcpO2ltR+XDqFEiwuNXEjVpebKZOEdK9VG0gpjJUcKU3Ic4bav/aIfFZ+16gM4WR/Hv3Q3fXkDK9Bj6wG+WjRWalUiwz6JtU0wPUd+96z7dpJ0uEl6XJ1HaXjexY6QA9s1CtCpOqdY8X64kIqKXQNxS83PitI6i6qtfMvOwJtkIaVJkJsbiAts9iUG0Yb8wRri8Bn+dMxC7w44aBU2pig/Xp/UMnB1tTGdoTVRRmTjLdWXaa7xtvtuq3QEMCruHs5C/ew1EgELwPUYNdtJGFHTuprHwEfp6fr0WH7XiHKM9L1itRlSq5RmIwXSel0IoUsrr5eOFO89KZA5m/Txt3QN0MUsmVi75K8cjz82pUs1EmiXFGPoSFAI1GYG9ARiIq/3RwPtg3GpcyPWbfjNi2fv4ovGxRyx8jKUaA4flxWWHDwKBNL5OLEUFI4ImS3ihuslZOALpBXpcJndJ0IiLQD6MOuSFOhVLKHnuz/rGGO6i5KSkMhu9upRqgzeWohJoziHWUbSH69E5Va0R3ah/qNNAdR0dXV0drQnjxwzvL4OGAkYYEtlA1fVxvTro5HIeS3EO8t3YUSOhKdUxS9nW1UTyj3lMn+GXwpwgKUmcBUA7y2M4KYZwzlmCRameskfO9Qm5gyVRqE01ohDwHSC2fNyi0w4RxGvxs0WFF5d5+W3JpHebqSpIgug6iApOpAeIm6T5fX2xgZ7lVlwk16te0gCoxRHnua95ywDQ3eMylqSCKm0wHdd1vO6BFDM+Bm/1EWPk7+C3uLwdhHT5SN9TWxCvCkBfsjhmBf1HQzgesah+ukJZUpk+n1r1cpuBpntK3veCjA0ODttz2XfdTzuIg0mbG79HObeWRphTRaH8vOo9hFWpUk2FpFSPmSK3kpQqdaQDzNiF7zJR9eFQ5ld+3zsTkaWjFuPjfny7vsbLZ206QxnUp1TRPitBqWZHDgKgp891stHeDe2LvtzMYGjUTqeIWTJuoIS6agAor6jfqwLh10FjRJYOX4CPHfsjfZ239+qr9EqSqlSFZh/Aj3hQBSfhRa64F2+iZ7QaF4A8O3Ig6+YiD6OQPyU+9zg+e6krLdXWMfeJfDRfAYDOTrgRuwuOkkg/Loxpo8+WIPWy2NzjBHsrTpyGCCxHXAgw9qD/iKNxKxpfDhvJ9PW4iOnUL6c8JppsePjty+PDflYLM9ivObsV0IPVzY8DuDV4jL+Fjy4ejA+Zp9m/EzoPCTpO3EBYXnwJ9VUkKdUT1kilTFKqaJcaqKwlTU9XXXJGaisx/f3Y+0Jde9LR5jTBQH+gg4e4ra2oX9Xe8hhB9DJAvS3QeovRwv055uRwhORh/XmTBt6Q0GZLWMFi0/WCv4xffpeW8oDaMnzeqosIb9LQbfV/doiRG+xF/+PHrbrUGp489U5t0DlQqk8XDQNioxx33fnM/EfPU1Jo64leoepC2CyZ0GCX7psjBMRs0xBTRYVNuyFzt9/8UMZ49LyTKQ+pVozaTCcVn4PZRYzba+6nnMC9wunecnil+mPfnE4ATGZZG/R790xhIDHnEFPMU+u0YdH4NcvFqIMZrk/S8K9zBJcGTFOqIpZ1jh5hUC66ISZIbNyxHYYGM+swdHy/zrFXtBOCU6pv4ye2QyskfO2GQg3x2M3tIlapUvcmaDcvhSxJU+aJcq5U0eZmYnwdodaold6AUHq1XrzHVl6uPX7z+YcR1nF1rNVC7aobqfXnDA7L659qJQikLcNFnUhtNZGKLoBY0bFSk//sJbXp/rpBE7mBpc3GhBNQXY2Khaqn6zWRHgCCWPfhkwxdFuy6UUCo+OpSqg3emL9GHYjbnMZSrDxFe8uIksZPw9ZS/uT+F6jaCe9vWfbnDxuRVoJ27Az2su9r1QPyi9hRI2mEUqVT/Sv31n+HkrZvWG2F9GmA8UGiaq9TqZJ0ETv5wYbqFHQ6SbreTixVBRFbfZrg1MD1tRlQ/n68f/7ovp2b1/qgRU0OYEi9cfxKwroTFvlUuEFTGHTBddxfxY5CuohWqQzV/olqpnI63jF4FlqNbgdEzZKJ4p6V8w6dyM9QJ+gUXOfxyx/TcpKSvWCojEUq3Q/rsr9LItv5/5t+svieBMdwa2ksShXhUbTRvylVUleAqg8HMYXYBdfOSKHYYZMr7GmMUn2/dgJyrSZrnKufO1BHAlyPh/okpN4bNQc4CNh7xVMW6SFapbKpHuhQlSppGTNVcLIqf5TyL48uHd+/a0t86DSkXz0gFOe/hkC9UWH+fSxJhRoWThk3hvN7r0F70M7kKONd/7oFsW/8FHEpzedigjNm6hhOSLUnPHU7Yb6NDaiMJz1D3RQlm3Xv53Yes/FPu/UkVeOxR6W8WmW7mK1VP144BHT3vYGlOAcpWOzoH/n7PNEMfQfkmAGhEBqlVPElQoMaZxhIYxKgeLcekuqq4Y5lPobd+I5AeMYeutqkflXdov39enUh0HnucWxqvCjJ2vMsfsQFhaRUaz8eNqPGEQTtpAapzrIJ2Xj6JUPbnnFE3kLhMfOwh8Hw0UWsfOwypN2pTrVCaniReSnkIbWscMQwOVCqlNzt02jjw+1lhkwwcIhIuPyW3oJWHDRGVLCEmiP2sxguEzsDocmb0ff13X5j5KVAEO06SE3fLmzz2VyGTVfmrEQuRBGXHaFp7LowKf0DUd+TlOoF9L8S9rvGuOnXC4DOuE4BtU6bsQvvf0AdBBdhOhY0/OscgdyPHTUKTpVqHrqXEOg9PRDLWhrRZiOQqteBMWRCVap1OZoRlWrZXgNhgsplQPU1oA/gFsZPRH53AOteCdQuDYdKtQJ9fYilgIc69NkPmy3+tdfG/dDO2e0Rq6WZJOVuuN2mulZz/NyqC4SMD3L0FEQ4LC8e1UoQSNuDizqx5qZfD+Q2If39ddUWGC8Xu62h1go3vZAmjp0fV9k+NCJdJwdMRZZ/uLkj0mHmuN6o3xz6wdiwK8yKsi6lilD/jWhvtT6lSrkbhrSvAPTyuUVqed+sVu7PUKrPF9rEshEipUnIY83Zx59Ktarg8hrHyUMGjjMJ2XTi9vP3P/aZIfdiS3oY1KlUOZAfbHhLDeyEkx9sYKcB2CnVH/d3++uPGTB8qseKg9dy8r5eC+6HznIRu0LsbmR9/j/XfOWFpM0O0cLOVL9Yqd6us9bG50zRfjd0APLc5C/nFHTCijOlSnm1VqOL8jL6+tTKc87dCS6mWVEeO9lJ1XR/OTCEC+8k5E9hR42DnVItSlm7lzkJTaNRSrU3cccPklIt3KiF3Ee6hkxjlOpFN2nkWjYOvNQBJiDlwtDNZM2MwqFSRbs4AMjU7fqNQFWqpGXG7JTq76eHw03GDxii5bQ46WJ2bmH24tHIY+H82VDY3ciiVGsr7y8Y0a7jtK1vqYMslPfbp0mIj1uSxaypqLtfsnw5p9wN7MupUi1KmSfb14U+n4r0qMcQAvIVbXNnW1k8iRkKZP0a6zrJjcGXnNi8l30HtviEZVdS0OZ/VKq0SKdgOu2FQRePoAqS3XAFE+pX1eNP8X3n9Pag/Yw91EYvf93cENyiDQyyUkXeo6IHh5a5G00cSF11iOg+BevD1MHk3wmoepZwxi9DJECr4XFer3Q4VaoIlYUZSQudZqv2laBOXIMOI71oi6Vpy4t6B9cXv77qa9aBxW6G6gMkaTeLDbFLZVT/ZQVXt0fYzVDqifUGJFUir+EqJ6JSLdyIqififtc0qM7bYNJ6hl2wqdPIShWhgV/nCOQ27KhRcKpUb3h2R67TwHsvsYGqVM2S2bf2RKVKi0k5jjrjQOQ/O3Q/Q6MD1Fb2KrUy1trKEvWhUUp1r0F9SpX2QvULQrdx+J5o632h8te+Oe3BKOrgNiUjxH57nS8RupwBmBzi6CmIcFheXHb4IBAIh+8YkXdrJ4gC0H42rWGsi8KtPrG0OTN0CR/bmvFdnBrywchF6GXF798zKvS/H7NObAnURvQtboEZSam+2RS5mzoh0uCNVD1seLieSbGCBB20XenmcJrQ1UCdSabSO5cVybaO7LYpRd2oOjqdxVKcw1XOo3CuVN8kGsiBdkNsD79hyLFjlsi9TaxUK5PNEPOQ8mQdpmbCkVL9ccFnSHsgO23NfcZof1Y42vvjSqlSHi2xcox2nj7V2NnDzd5k9tzolBeE4v6Mrm1lmb/ilOywgSxemuygvNk4SUppOXNF45OooaAXvj9emmTLNu9Q79+JG+twe6oHbi2NnVJlBxtToTmKN16p1px26AhAR9t69wMmKdXPuyM3MgcISEoVFUXIw7EuUs9dgX4wdhnjzn9QqjTt0W4efRE2OzhSqn8yosd0BFIa0TcZz0t9Tu6Uam1evL1NlLf+VAMHd3dHc32z4AM5hPf57340I+vZvqteULlSz8JsJj/+s+rRx+08c70sWpHP2YfLrGvutrvZdD1RX8oRSxoKMc8K8qewI04p2jTT9Bj7zm8ZOvFMCHTPRqlSjs9FJBNnSrV090zkAWWx96AEHegE3T3rnzmmfhWpNiZQctRCAghNWo8ozecxFgtZdw4iK9WKD++x6HNIhf3tyfnEBXMGtQOS5kfQ4eRz6D8ExgfJ87J0Kg+bIjX8PyjVP+/fM7Kv/HP2qYRQvT5CoLvrhTJEhR42RRq4DnW7n5e/f89QGxVfc87tjJotLwK6zktBc//X+/d0Q6P8+XAndZOPJiLL5EPvMGoUolKtPmFJdXJlHRs7YS0OgLjNSYadcqBUG/51jmi8AVPhVKnS+mPs9pfCgypVogjHQVSqP9FKFyiydkmofTbQJ4DmSkL73X9UqrVnnTojjX3dKvs16sXc2zeD8mOHjfdV5Dt/HzQQA6OReoRyK9AxgaUlYIB6/0oTHOs4BflX2FG9cNnhg0AgHL5jJMqzlymLA6GBnrgAfCSqHi2yYPh0XffpiehAQvAaKjQHG+dz6ADwMUuNdczd4VEq0/37YINhKH9Qtw+mi13OAk9a/7PBG6lKbHK98ZIorzZORrrbQoP8bxEch79usKV3LrPCLdiMGdLG8Ni02Q3CXc4jcKpUq87aIf0NccPDDJmHFBy1b0pVqk82x1/EBCyPlWrtu3UawnSnbgJIBwUrBU6U6nN0dTPS78EvEkPnFWlK9dux+P1YsXOmVJ8tnt1AMeWuHicExEwOkVfb1H7PymJX9AQ+xKmBHj74fRbY8m6zTlflZcx4KrQALUR5fM3D7RDLnEht1UFj9sutG4JbS+NUqZ5Blz8S3y80Xgs3SrX2y84pSB+YzQ5YuO4p5bgZIgsYUidvlSdODZCUas1lD2m2k7TUBc/4COH/olSLkvSR7i6bVcoVBXQ9wIlS/RA/EXlvkIfH1ZPovCJNqZadi9+GZQtnSvXTBoMG+l2fd+giua27laVqLMnOokUMrgdUcCIdeSxVJ8WnHXr3dTmLq4TQrqSw+RHcn3y3wg23XJwBGlGJTb+2QRpv8EWbtOsaeC3aPBl0sErF5cYV167oXBt+bgYNU8yhUq267IKIl44mR7FrP27UageEpxEjBKH8epDFWLDeoFKtrbjo1A1d4P38dsjctWRxjEJSqpnBGqRZS8rbFeMRyYyOkZWkWnVGJ5JZ38LnWY/R50ZqeBEgMmcfrlSpcKpUzzlrkNqv6ofhQ8BgqmPo18RZyNukxTomV5qThYbnTffWIO3TTnmxVAn09M1AR7HMtEn7vFdcc+8JVFYxguqQvH+RohMBQlNY9hn9hrp3CGngfEUbVqoc/DpHNN6AqXCqVGlxQyTs/mNpSz5n3We0oo1QqjSf2w7WJ8hDG4/RH2pvehgbBEL7ZUDO7ya5H9gopYraWL0bn+aigljO59g2G/+r1BeoFA0joBjz9EaQUyLbd5wGGlGJ80gTeDgsLy47fBAIhMs6sZZScNxhkCjoMW3lbXbbTX494zt3eTaz3vp8YHYX0NfzCkEDUB5FDAWddLfmU7/gmKXoRFIT+3u3nsjsA4zW/4Ir0iOmR3GoOe7sfIpaDzV8I7oikRw/gIWfV8PHdwJCfYx2MKIqIo+Yn/OYNkj6dJG64xk2/7TmjKMEu35Gg3Cb8xwrVVpM4wlrcS1nza0AVHwYonsRXHWzo7fWvFaqtWUZ/kiPZVjUY0KGVd+eb7UOa7I5UKo1KebtAK3/wYDWI6T+97fL7egBADlTqvfnD1ZfU//Gtz9P2vYEEjP2EAdsy2+F2W9k1/kjUJUyryOYsavOoRsq+QnTpJWWMOdTUVDXKcLKzMqjzh5sInShvpr4cDgcg+QYdtQ4OFWq1O4pbmAI0Uhbp6IByQz2ErpCnCjV2qr7USOFQb/gTIKVUXIWz1vGWNSc4dsTF3XpvJfjYWa9Qo6oVPtx14zOoL9vBqETVXM3VAF0npaIG+H6F6VaW/04ZowI6O2dTihZytNlc+mjdZwoVaoE6miLn0z6tWc28hLIo6Li51Y7f0xbcKZU36wcPzz6EZZgT9lV34FCohPWE2Vi9ZMlNkufsqnsiKCrc9Vp6zvqpPiCa58+Tsz5VJSSHdNQIYJToPeCnLcTLqHydYsOkHG72uBzsNB4g0dDhQv1Nafv+YPj3WbNDgphmXjrQZ0gwPAFuBmpbztmoD45M3cTlBtVXnZzv0R4CX4dNu0ExLU25DL+Vsklz75C7SdvJlZNVQ+jbZhjdA0r1VoKNa57fzVNq51sQx2yKNXeAwPvEqXKGcfO2PqFmpzFY8XAsPkPCfZcW7DZLuQmNSvK0n36A4lZicRhhO+7ZiAak1AVsAdpccYsfkkYjas8aCyC7XlenhE4WKSdykpmHqHUPI+1WYQGokWkJiJpCU9Wk2Yrpr4GaQCqD5uKaJJi2//YoiNqlsyoIkhKFWmsQhSE2uslEBXmt70zOwgNCUrH9Vg4UaoN/jpHNN6AqXCsVGu/HDGWAV3Nkolr0f+e93NkBuptjFKt/XnaRg7IMDYNx8hbpSIspsKMb1/79cDszqCf11VmDwuh5mk0OiRtQIqeURffE/TQCGQE4yHyDh0n7dptVOBN7KLSoxYdwFCdaU576gkkXp02T1xkzr76G3D2cFheXHb4IBAIl3UilaKbK+codGjXZ2bs2dzf9IqjpvhpcqSVRegJ2raVDD6e8h/XVcHhWB7W5lO+ng9QklV0PE6/Dq37Omkuv89ojatebZo+zuM8s24pO+/YHUjOoe7z8PdqsP9BWrXY8I1IT6gfOw9AMlUFF5cbDurQbYJ3wrV8fNtS8XyrnvR4tjIHdS/kIDooK9zmfOE6VKyB3j7X66mrqeSuUhEFHbQ20fdTLb6/3D5qlUsvoBB6t/rTBqsQrN9bdtgU6Q0T84ca+RAoEcaCf1GD0JAWaNVByb2103p1GO7J2D+3Ou+Ak+Fieo+v+oor6hUVeBdnJBXUMB24/nfxEXMpAIYE38ZGZCvy9rn4rZqvIixpfqT0b5qr82HaWMTfI+aILhpBiOfwd98c5D8ROu5/j8/t2GW828rN21C270jce/Ts7ZdFBAVT+zdr6UQpGc2Ym0XYk/19sd/dZlU2oWllz8/EWcLsvMiYfEya3m3sshxi76+2/KSNFJiK66nfDbfdyNr/rzhsKtqV5n7QSLi0tL8nLNFdaYSms0w3kKBkRSoIieolYHMgVXmHvIPd5yBF18/uyIvCkkosJxF1iHS3O9um4f4/5aZfHwC6e1/D/a2ynM1z5DsMtDtB34iv5kOqm0H4DaZzZvV13z5AbMoO9Acrb0d578Z1zXNXoL0U53O4Yi046TG26zDn1HysJ1Tz6YzvKNlRHifwQxvVVzxRvw/PK7iOaPVFJ2mk8x+Mn+Osi/InO40HdOhvlVyA/RXKxzQfg5BLWMeH8iAUEZddHS/gvr7mqhfyEvTxT6d/ffl5V+QZejufw6qu6o9p3u6xMXpiInoJPypv+Ntvo/3Rqguu6ESx7w3cc1X9h3pQKOCVNjqf3HGk7bJNmMHv3pN8Kv3pF2KnufLZxmmyXZQDzn/Cnqzi3Ql/qwXpHHTYypEXtoM1bbiQPaVX3eX7uJwlCyx0BkZhPlNDf9liG4yuKyNxzllKzBQ3CMExjTd4VKnKTXdzmmMRuffOF7qBVr4/HaDSVyX6BikzHi5UFG6nuQV7R2veHfELdDfphpSI9b5nhb/p9k6Tl136aLjSt4yurXq9Y7qMxCin5LeETKt4FD9FRkp1/qVC7HR53hFfq6W3GUOtlWm2SOGObWCu8kHEQADEZu9hr2dfLB1JDQ2F/TlEqQKRUb4XvjCe5POJuUqz99OjHlLeH7LoJzHM4fAbepX9+fJC64A0xqv2K3OVrlxPw50v6VXjr5uLLbQUuwLQadamJ0XMsLzsQMdGxdWibv2gX1WTnzRbyYbx7VUvE2bKSSr5/vcBy7nK/P9CrCKvUCtJVGqKjgm49pX+6JTCw+ZKZofR1xnRikgdM2V1NkMyVb5Yp6vsc5VRvVadskaqNbU43Mv/J2vdrN7ddVffp3cZ/jzeOLNPn2lr7uONjxqQjLTlQUE8Iv8R2Yv9WsO/zhnc1dgVl9yR+oTs3lIHv29Gj5OU1VuViVkLpTRnh4v9pieM+unX7plC6GpqXDeKSQnq1Suqvx8nTIuuLtTo3td093P6Ovif6TEacoPM9xCdMz785zNGapjXObqp1xQc9TZTVUB+St715LtiTsTq29Xj2Hka4yhAV5XJedGFKtKmoG2ZcP1dQNR7RY3kncchHJYXdx0+CATCtV6iU/nxZuJi11kqo5XUNXSmzzEyNrUJ3nmP3TQr2tqcWeZiY+/q7uZsa2Fo7LD45FucAEjz1gxPyzi+2NvdPzg8akGEn3vA2ssfiL364qytLnqaumZOnm5RqfQtpjm4sea8izSnvfyyvIs7YgPtDKfraqpP0NKdMlVbWV4SUW0yblfY/Kvyg8btqDMejabROf/5qBfyLIO6IgoMRbhzv9Hq2vqr6nNo/fVgZ6CxuspUW//wiPDg8LUXPtXUvk/1naw4VttudQbSRr3fM2/sEFla7AfJfuM1Y24g5/bZjx/eg3ZOTHbEhNlrHtTm7pinroidE+8xaoL5loYD+1C+3VzvbaE/08DczsnOyiFs931qe136X4jmOHlaEI920gqq2gsu1Xw77jlxbB9UFyHtn8wwNd3ltIUt5Xmpi2wmK2uaeYVGzA8NXnr4RVlt8a0Vc8aOVDcOS3tPqf12zE1FsSdtA0T6je/3O08Y3Zt2jv78tG/Ljh6DZR4TUTkN36Nv8Q1kdeHVNS6zp88ysba3NZljPf/AEw6HWdEVy/htQkh83msgq7SENEuBUpXu31vS9BjW6pdfC7DZzOZLHoQOEDHc34Qjvgxqri7R01EfIUcrbgDaSw8aM1FXT28xzZeKDVW5JyLNphg4+AUEBgb4LDySV3nNu2/XHv0UFMepm25+gnQuYzTGyEuhvgBASLK/sqbf8W+Vl6InKQ+knRORGjheK+QMo2de+zNza4Dl7BkGprZO9lZ2QVvvkPpepY93ec3Q1DF29HALP0yferm7QmvkgK6i6Be2kxmibrmd6SFW8fbkUmcbe3e06jE3NHFceiafKWUrL0aoje7XGeksIU/SZQD1SUr/C9ZQkqedayc9WAW1UuzyuvmVlRA4b/bM2chTO1jbBm6+ResYXV2kNX5QV+ofFe7SX1kr8ERx2fkwjXH9u1BfAhEpBRWtyPPUTnHVh3MrnfTGTzR0C4mICAtemPiwpPZv9ibz8Yoq+n6HXlXVlp0LUhvdhxZHhn7jjxMBE5X60c6JygxR016ELXqsfBWnSS9EBiLS45wTn+O74JSi25u9DafPNJ5nZ2dmYBm4435DYX8xivfMEMHtMETm73XfQX2dTrPppb9bpyaqHIctEaa8ibMMZ7OQD41QStizimOQf4kdcUrxHmero8hP1XzLTAiyNjMxMpg5RVtz8ox50cdziUNZVKrepUVbTp1t5xcYGBTgveDwq8r04AFd5RB7V1I32ECX4FSlOmrJtSurAzwDwyLC/RzMTB0WpeSyG/Wq+Xpro/scpAys7O3M5swNTsrGFMKPVB/Vkb1pVWP7bsPUdfQicO8JkYJdc5QD2ez8fHuRxkh5KezFGKZulYgo3vuLZtjtS7+wNsDNJygsMjoqyN1raSppL+ffT/YEm82YMcfSzt5yjonXuut0eYFR/elirI2+/jy3oPnzg32DNtz4di9iuERXub6Dho9RCcOHSyZzOWSyz7GM/5b7uvkFh0cuiAxw91t17i0hpyk/7m3zNZo+wxCxSnMD84DtjDrgTuQ0p8O3zq3yc/NFHn1BVKC7d2zaa9rfrk7x1Iw6devoIi93/5D51N5A0PrrH2mP8u2Qs9LQHhLUvOzYR2lSBO2lo/LjbkKAra2Tu7uL/TxjQwvkJcAJ/tzt5spDuotTb0Sav4lo8/d4s5HqcFkx6rmOvcZo2CC5Wu+vNwLkK7EjzshcbaA7cRTWDiKP2H2o8iQdnyMNvDuVBRdiHfSn65ta29sYz7FZcPwFJjLfJs0bPxyr/jv0HKUxZdYKZszyl9tMxihgedFlgMr0VczOD9pyetrYIh08FztLIyPryEMv2K39/vv8cIjpLCM779CI8CDfyP1P/hyzkpCU6Sk/WHHc7HWE7QDY82i+AtIU1vUWoBRs11eLeYCz1orzHmNsU+qr19DN5weRvMo5BckK7KheGlsrQSAQDA7fMUGn7LSDlIwTfV0m7yhNteg8LAa3FTjntJGc5xcK05yGDzWOv/z6Rzm1tCiVf399fJZ+ZJmpgriQYtT9Rvcm2JC3cny7ifHsHYxLTjv0HhNDnk/FKM2IVFX1PfP+e0HmTheruCdsrnq8cKiU5QncGDbnQEtri/y8EjRm0PSlZ559+0vtsVGqyooLX95OXWOn2AnIe19lFTSN58v2qe1HLGS7w0xtzeNFI/vas8yn0qh+lTBrtMnOp0VfHp8InRvMiAqM4128qsT0pDoDddYHnxg8ValyFggXAsEBa+z6uRMyQHzOvkZOVNfP70MmkmOWciCT2cFhecFChUC4pM3Uia9XjO9qlcpuiO8f+LJjWtcGIiDXCWyNmpPrPj3bGx9k2ztHl1kOiWz85i9sKDll333UErartH7e2p/6ks30DJ3iJ6kbFoYv2nn9Pbspl+qrXr2HRz/kZkQEWlqbBPWw1dnCtmp6vUIZyHo1fvMXNlSk+/eTD6JtXkii4mnqgTtsXQdplL+7vHPp/Mh1/z3/ze727MihfX2ucze0yCcGT1WqxAUUEAgHwBq7Ab4kTe+iu4OrYSz2FG7V6mqUXE91VS8clhcsVAiES9pOnfj3otsAzfVcLCitE0ruMuVBIZnsp8kaBLZGzck5Z6n2ulvZukPdCxsExq/kkWG8i9cY5HG5Psckbvh93KzP7AOND4JKA1paGwSRSULKy9lu7/tq+TjCMtF/4mvirP5zj3M3WFc35Zdd+k8ixRjiHD4xeKpSZbfJJARSL7DGboiaB5GKo6PZLKXhCsrTRWOHzb/X8PqOOuCwvGChQiBc0pbqxE/7DQdMS+C2+0Om+tmaKZoL73LtRAdbo+aEknfYbkT/yQvOFuCnaSglT/a7jx04aclN9k6KXFB+N2rkcN90elgJXlB0wlbV6jg3C/ZoQEtri3w65a0krxZw/A2hhvr7OiVEbYBy8DmezUdUP41TVbA9w7MXCKHkio/6nN1vufMgQOAPg684adMZAPkwtjPOEEjdwBq7YX5dcFZQjmW3UKaxVD5eqa215CEHQRPrgsPygoUKgXBJ26oTi68FTDDY8Y7rsTMmf+9Eahvu/Jdvgq1Rc1Px7uKWSNd51i4+AYFBgf4+rlYmFu4xu28zw1/yhJrcnQYa/te5iX3EBkp+orH2/Ix/cVuHltZGqfp0Y2eMu/U8Jy/U4AN83WxNzZ0jt14jjNbwgA9H5qk7/sdhGKYG+ZJiO4kQub3RtLjB/zgRoDG2Dy10TzupQSpa9BhXEAgHwBqbE8qyV2rrLnlcz5IaTviTEaRlvJ+0U0Uj4bC8YKFCIFzS5urEoqvRzmvRXdn+hYrMOJ/4e/+2oh+2Rq2Xiue7PUJPcOuti+fdgeCINPrGJ1wCLQ3SxFS/O+Lnu48X7ipfTkYGH2QXb7cRQIOHCDTQgDnkd9Zap0X/Ehyu7MYqn80PuApUiIPD8oKFCoFwCawTWwqY85DmAVoapE0BDR4i0EADFiw4LC9YqBAIl8A6saWAOQ9pHqClQdoU0OAhAg00YMGCw/IiX4TcBoFAIBAIBAKBQCAQSBOBic96YaNUsSMI3wMLq2WB+d9SwJyHNA/Q0iBtCmjwEIEGGrBgwWF5kS+CxSxAwMJqWWD+txQw5yHNA7Q0SJsCGjxEoIEGLFhwWF7ki2AxCxCwsFoWmP8tBcx5SPMALQ3SpoAGDxFooAELFhyWF/kiWMwCBCyslgXmf0sBc76JqX6fNt/GMSA8yNtrYfKrv9hZEiVZcVPU52dhqdYJtDQB4Hv6Cgdb7/AQP4/QhPs/2e/uV5mbZDna+eQ/biDY+oEGDxFooAELFhyWF/kiWMwCRCML6+M+l8kaYwd0aYfchyAhrzxJW1tbS0Nl9HCF/vJDJ8xxXnL0WSl2MQ/5++JomKmhjW+wj7Wpy46HdXR7W4KPB5zVxo4Y1FdWqoNpcjV2knMamf8QngFzvkkpPuPca6DvrXLqcUaYyuBZi07nUVMMSp4c8leRkpiy7S12opUCLa1FeZPk57408fzD/G+lldVlPwqe37u4b7nXigsl2OcIVfejRsqaH/mBHle8iJ86eJL//ifETf7K351dNK1X+5FRD6BQbQho8BCBBhqwYMFheZEvgsUsQHBXWPlr1JEbgVrcB+wElcpv93bYDm7frtfU1Vk81ZL5O6ZLylkc/0ypveQuBUA7k0P81Fuo+vXuou9wJDsMDwu+Uq36nLkzwsXO3snZycFiuoau7ZJjT35inzH5+zQ50tbc3i8sNNDdysJlxcWPVdgnTKoLLq52s7DyCAkL9ra3sAlPfv4H+4Q/4Lec5xdqirL2LnCjWcDcmRrac2MOPfheg33IoOr9+eWuFtaeIaHBXnbmtlFHXxK3/366UFFIKfYVlqotPWY/d8WJXbGhnq6eAWFRi1fErVo8P9Jzimwn3S3v2E9gtR6gpTUdVZ+urHC1MDedMXHkkBHjdeZGHHpK3kY+0783UgJ4RPoaJ7zAjZp82jFNTM7zBt3IqzODzUKS98VF+Li5+4ZExMSuXr0sKjLQaICY4oL7UKc2DJLF2BGEp5Q+Phhma+6ItrtuVhaua658YqmYITyglRkw5ceDnWHuHj6erk72tuamDktTnpMrScGGw/IiXwTrKQGCu8KqPmyK3Aim72SZPq25EzIQ+aS3VcpX7My/c829Gxi+IAc9/Pv8WNzqw4+Kqef5iLNOnVuDUv180tc25sonem+s+u3WaZ2BmGLA5e/YGZSyzEXje6jGZNHLvuiC1zC5aTve4BtNyptEg14KDqc+Y+myh6s1eoyOzuAjscpfOc8vfD8XYhN55j29G1/zYZ+RNGg3xPXUF+wMSs2rHdN6DXE/S3/F/zxYoi6nvOgOs/P/acMEIGRxlDl+UbzLwe8mdkyj+snycdKTt79t7ToVWlqTUfU43kB//pl3tGHRmqJbK3S7AxG52YkEo8r0HyKvNG5IT0lxyZ7D1KbbL0l9SWy2qo+Yi4KJ8YVYEuG8u8Mh4vz/p8RZ3UZFZ1ViSUh9QINvCv7cih7TY8KKB/RJgK9nnYf0MCDaOoQntCoD/pLiahJxuZBRdZU8TZw7bHxEJs6nRNDhsLzIF8F6SoDgrrDqVqq1tbeDeqGfTd7+DTvxrxTEqwIwK5GvX6wLrl1bgVJ9EqMo3LGn5soHjMav8qgF6ug9fuU77ATqKDdMuJvHZfxfLTlk0lF8wto3WBIpsp1TJERm7CrCkiiU20HyQv190/lmToKvcr5ZuB2s4nsdO66Dd3HKQuKyKgsyGRqTctauE5JVwxY9xU7U1uZv0u7YfvYe/HBR9U2/nkKDQjPpzeEN3+5Azj8dS6FccHNOxo1lVD+LVZHW3ZrXFrpZbc/SeEDuWr25h1i9OfC8XD7NNpV4SdEBIwkAxNXiGLP5qFKdEvUEO2ZLXqwSEDI9jLPOZwuc13zEjlE+7TXophgJ51M5BBo876m4EzxYqJfPdXyF+XPfHLEOmlta+eKJFqAVGXB5qtWo0LtYgk75f3bSE+MLsJTgw2F5kS+C9ZQAwV1h1adUX8WOQj/r4HgGO/GvvFiqCIB+Epuf4h/Ou0i1AqV6J6Q/8jwSlseYnpw3/WSRU12cL2FpyhVPWdDJ9gzxn5Yk6QMwiuHsmbdKBQDNLaRZ9WveMkDK9ULj86hp4KucbxZOWYuZHsOO6+DpomFIvrTX38+UodlhqJOEqPUJek+e+oLrJVAX9TG55NwFyHpewTpSz5eMINYAlcnuPlew49rammcr1WQmb24j0wFtz9J4QFb4II11hMUlZNARTNEeymGX8S1D5RFjESS/VXHdsAaV6u8d01CDxjnE3fJz38ucUy08YNB9RHQW1KmcAg2e51RfcJUCXVwvEL19f+2cAoDKqjwsCeERrciAb/n06BecSe50fdqg2cE2DUsIPhyWF/kiWE8JENwVVn1K9V5YP/Qz+XBeBfSESrXZKH555vCJh9+Yf+PrtilCAIgxp0fvo2K2X9A9LEnnoltnACbGv6cmvm6ejNxkcpSkQ14vHw1AL5IPaMvBXznfHHCgVGtLcy8mp9z7jHPb3a/fHoB2kzbTVcOH9ZMAELZKxZJ0ni8cgTOMilQLcTBtB3PCK2ehywb6LFXNizhVGe22MZ+K0vYsjQc0rFRpoyrkhibDtydyUsL5HJbmQKnW3g7qB0YsfI6lamuLEpzDGdMQX/Ybyo6MvAd1KudAg+c5twL6ADAwMhtL0jlr1xEArY30RTYQ3tCKDPhuYF8gMtDmaD5+4cKfE9ZyWhvzsZTgw2F5kS+C9ZQAwV1h1aNUny8Zg3zSSSOeNsH2fq+96pjhA3t37zwk9F5F7vGloeG+hmoTrHc8Zjb9Za+ORbs4eQaEBnvbGRs6rLnxFevDVl6cr62trdIfqY0lB6ohh9raVrtyaZ/VUr5nbvZzcvENDg10tTA0Ddr3jL6A42HczPGjhvbvKd1p8vqC4uzEBaHhztNUJvseK6it/ZHqo6Y0YlAf2S5ybpeqC86sCg8LNNNQNY2/w/wrdT4PnZov1+O9rSysHLzDFi2NDF50+HmKc5fWEVGJSMHaicKg4/iVOXTl8mGdGvLE+F4djUfRCgAIGR9Er6OcsGwHQEe7s7SPGBTvmorcqxTLJyPA/J3zTQEnSpXMlwS9dkBsdPQd+uuKvPrCAHR2u4il6XzfPBnJUZW1tMGK2qrMEIXOJoewqdmKG8Fuu7HBjppXqyfI6Gx501Z0KmwQuaJhpVr76/6B1WsOPCBM7lfR5lQVl77ATtCVaknu9ZTd8SvX7T2b9b6EbHtv16t3UI3HvCgpL1c4Lqff/vmQqeyICOj32yigwfOadyuUkUwdvfw1lqZDHTgWMU8hTrVC/pFWZMCU12sntkf+TydFm3U3v6Ad1LJniRZjNVc+bEVr7jksL/JFsJ4SILgrrDqUauWnS9ETugCJMcwQPJSq0i+vzngOBaC3S2yw1bqXNcW7ZyK3DqKPhH846TlSRjHgCnZD1fM4tU495x3BhbegzqmqxTFWSqKUP9w0o4/c9M1PsS7Er4su/STGRN+mJikVxR9zdll0R+4KXuHkevBr7avFqEeyxqbPyKP//ZZ3PVxZGEhYLVk4d8n9iuqUeYiwknHH/FsbfJ7v1xdpyvWYufkJ3T2s7HmC09heSG3QepRqdXnxp1e39nmp9htrveU+zi0uZ8Fg5IlVVmF6hAHq7QmA9iZUjfzerYccd/e8QfuIQdm+Wch5+WA+2TyTP3O+KWmMUq2p+P35dWZyyET5ERZrMn5hZxF+bNFBcq5nYAaWplOCulCCQVEPsXRt8d1YXTXbfQ8LXt9Y7+G2+yWtYaS8XKvRTXtTmwoD0vYsjQdwoFTZUH7GsSsAwiOiHzH77pn+qnruAUHr0x7k//j99eFBh5EDjTZnE1uuiueJZqr6cbfy397bG+S0MhP79OsRE7nhUfeIwZUgDQENntc8CB2AZOqEDZ+wNJ3HkUOQ81N24ipoyL/Tqgy46uVus0GoWAWgy1j7MPdZM332M2Z1Wgcclhf5olZVzK0d7goLU6q9NeycqTjZWxroTlJTUdOZG550F+c9inHaoRPo1E096g76SdGt9VHLzryldiW+HJojBXq4XcSN79Sk2XYCPZ0vMd4lVqValbNwtIiw6mq8eH2/dgJop8yMpEGdwevW3WA9umCJ8u5UbNTGG4yFk6gvjWi3kcHnUWVbfD8hOuY4bdeCBp/n52nrHqCLWTKxachfOR7JjtaiVN+lxfj7eTsYaYzRsF66L/MTLjNoy1ZpihQPbXHy2GVoUCVqBCw2irTyoAFyXsrlMpZuYfgx55sWzpVq4ZnlAf4+TiZaYyZaLEy6WYCbUnq7fBySczhFivGXOgDVzQcfsqnyy8PTiZt3nsz+jH1BTe56jW5aW+h+v+Uf76Vui9+aev9LKxrfZaXtWRoP4Eqpvt+i2xEIyftcwevQRwumzjv6gTk0UpEZPABIGh0gLaOn/Hxx+cDWbUfS8+kByr8lm/VQjLiL2W510eOzies2HkzPb129vCYAGjyvueomjWQqqyJ9tgDdHm/8mtbjyMkXtDoDLr7iNwz1NUEQ6TV9yaXPje+p8jMclhf5Ig5vg/AD3BUWplSVVxAmOuvmHOocK+V+iTyTcg+N1iLpch5L0ijcqAVAd1/GlByLUi05ZNIejUfLjDWLQhVRmoxRx9Kk6cgTKsYwvcBwZAbLA9De8hh5sLzB56Fe0G5eCvlFT5kn2gq9f8tfbJ7RDchMWniNHseZplR1tpDC6dS+XDYSOT96CeqdRFOqA0If0D5iUHFgNnK+sxPZb7SF4OucbxK48P6tzN1j3AN0UQ85R18KRVOqg2mbRuH4s2sGcl7a6yqWZgMlb71md+1NubRa4FdmrM4k97S87/k317l7H8xvvQ5sbc/SeEDjlSrlzWZdCSAzY9vzhsY9qGtZ+/nUH4f82/G5PYaHY/OpFS92GKmb78opKnyUFOCyMYe4eTCECDR4XkNTqnq7ydtgPo1G12qPWw3D//KUVmXA1R9Phc7Qdd2V9eT8EoOBYsh/A6CbRtgl/L5zAg6H5UW+qFUVc2uHu8LiSqlO2kx+N75TPQlltD1jCNiMaw9EjA7Qh7ZZlGpGYF/ktqHGUdj1NEJm9QOgf8gd7CKqUhWdexxLEqEq1ZHLXmJJOg0+T2H8ROSCARFkEVZ7zFKkNa5TRd19UfciadNjtFnUxwvRpOYG8ma5tOgmtPMliagfaN9Acmj0P3tQLcN6voVAngU7anWUn/XsKynBgpgIEBbDjnFI9nY9Vc800ZtYJSSrJGcl0QIi/dyqiyRZX4Hi7egqZDavBh3Km0063bU2YPOpVXcDB3a2SsW2nipN8/GhH7c+WrGl8YLsmLFSmCniEG8HhEQ7YAkmnWT0d+BWhjCpfrVuYkdp3bj7HMx4/to2BSmTfmHkuHA4vp+w7DU84i42lJm3dmIHrY1YRLCqB5Eu9GMIO6DB8xpaAHYdcsD12kfzFdieh/wTrciAv5+wHTgq8Cp9Mr7sdWqkbi90elXGLJnsGSewcFhe5ItaUTG3frgrLK6U6uwD5DHsnAh01SM++gU7yEqVcsRcGLnN9HC9Q+dUpdrNg72rKVWpsirnBp+HNrSptZVlq9hWq1RrLzp1Rp6Rnv+0+VLWcs8KRzIUGOyllnCqBZIZMu7XqJ8wKdqmjVwzajFuq8OWBHkW7KitwE1EJYSbftQNkjH3hJpDJkKAtFcqyud1GshFSnXtmEB5u3WyrOZmehylP8csO4BZ+xhTUzU3/J0TW+tiq7ZnaTygcXOq3y95jhhgvOMZy4pSys8X1288+0mcsK/aNwe1aP2kugZHfqRa9R4xnxFFLNO/NxiHi2bzarnDcj6pxfgSaPC8hubJosbyQqCWCYSMj7QuZ84Wp9UYcNUld5mebleJHW/KtxsLNLuyC9AlqHBYXuSLYD0lQHBXWFwpVdZe8k/q2DZrdBYiLHOqVJ0JdMj7dRKhKtXeLB1qGtRvYF310eDz0ELwtVKlWvSf19iePUb6nCZspk8bzQVSNJdoykUnKQD6BNBnrun8ZyeGmgOt5nu9ZDRyh1Eyc6sTKtT52G7ul/jEzZOPcr6ZaFCpFp8PUe0lN8z1GGHXg+fU4gSic09SZeZjdDsa4bnHScVItRM573Sygz+N/C26slobMb9fhIdRQ0FXV+YGq7XF211D7mPHrY22Z2k8oBFKtTxnha6y4/F8Zu37My+PNstUctgQdXdTWUtYyFeWiMZ2a2eWzN6J90eabe/hYfT5VGyIzWAv3ccH4bSbK+1lgLADGjyvqfnPThKA/vNJVSQl1aId2jdibh4M4QWtxoDvz1cQs0plU1UVbtEUEnc4jaUEHQ7Li3wRrKcECO4Ki0dKtfZt/ERhIDJnH3n5Re2P+1mMbSxYlGrFVa8e6N6Nt7E0g+q8rIf0oMPcKNWGnyfdvw/SH/e7SX73W4NSveqFThgDMds03L+jnLIWR8/Se41/jllKgnamx4gq9PMmpC/HXLuI9DIR48CVGEr1KfuOQMI2rd7FYc0IH+V8M9GgUr0XRN0KWdj4IN5d4ZK7DHp2zFLa/lCUzGDkHSCriKoTluJAyvEM2zfg3XY9Oc31+H1p0BBrCvMfYSmUE87Op7DD1kbbszQewKlSpRQctNZ1T/uEr5EL4i2xVSDlyUbtRbuNDrpICPX7ZtlYpEzqmP//edqmz7D5d3AiFt2Ci9irywp33tZqXOd4DzR4nlN82LQDELM+QaxfqZvGjVr8DEtCeESrMeBni0eJzN6DG2NjcNVNuvUsb+awvMgXNbKYP+5zmaypMqw7tUOMIN596PhJk72S4W7GzQGS4dhRY+CVUq0tPufYG3SYup0Yfb3yToRtPKMbwaJUka7GBq1OoK/HdeKapKIDLt7/0R26uFKqDT/P1wOzO4N+XlcJbmY1T6PRTVoMCB18zuAu/5uE0kNzJIeaLjz6HPffKI8XogtQJXUS6NlflRnSH0g5ncULzuIkfdH2yow9CGtr8zdPEhPW3Yp/hSnXvHuCPm5X2NWaLQIf5Xwz0aBSrUy1kho0O+LgI3wh0RzPOkxcyyjevDXq7dtN20EfE0KpRuWsvN8NdpNU73dO7TFpYy5hDpZlTvV3gktQPcsGBZq2Z2k8gDOl+utquJnvKYJMra39u99Qfze2k2/hDif/S6Q6pwDt38tZHGXnk/PrlH2/4WG3CdU765zqGTfX1NYbAeyfgQbPeyrTffqB7m4X8VK1aOd0YTHV+Nbiw8k/tB4Dvjd/QJdpuwvIMysVd0PHTGw9hsNheZEv4q6YSw+bonv+SJinCEgQ+JqH6yb16jlxya2WmySq/JKV6KY8YfFjLM0F3BXWuzh15EYgH3CHo/b6z16DdgBosx2GLsuO05TuqhF15Sv2NpW9OuRtvfwucwlbRmBvdNOTTCxN4+sp16ES/c12PMWspeb77dW2bvuZ+3zmrUI62JLWJ9iJx8o0W0Q5j11BmyQi0uDzfPjPZ4zUMK9zhdhfryk46m2mqiCEPKPryXfFjRSr3OV/01CTf9hOz2773S/0CdPSJ6t0OgGxgU4p+CAmZZnRSlJjI+7QpymKzroNkJ607gl+mpXyZuesbv2sTnymZ2J2rGrXoQGXsf4jP8BPOd88NLxOlVKY5qw3d2M6Y2Oivy+3zJICovKW+/GNXfXrbVNk+jv+R1/n/ef+AuWuiiHXiHtU0viwY3oPzQ2vSU3ln2QzMcI61fQAp50Er/NWRNuzNB7AgVKtfLJOp4tEj8FDGQwZrDCwr4y4UC8/hr8NUhNZmy++XIBpT8r3G1HqUl2UQq6ws7ZfZ536DQu9Q9CpCLd8ehLWqeaucGggtkLbBhp8U1B6a76ilPKiLGzEhPL1lJ28zJRNz+GQCc9pRQZc8Thep/dY1wOPGV2vig/X400nzj3MIl8FFw7Li3wRl8V8zRt1MuvtT1QkVB5GmbZcy0A5YW2+n9x2IbyixsRk/8BNS+XDgwtCfBxN9LRH90IUoHw4eefKRtDIwvp4wH2q1riBUsjPooh0kR89QXvOujoDfta+32c/fniPDtSrxXuMnKirt4yx/Qyd6i83490Mps80tra3NZ0zN2zfQ/pbdSNmkvIAKTRSGRDuOkRNW9fnCHOJ6N/XR6PmzpxuYGFrP8/QyGXFuXysf/1wzUylQTLUvY6FOvUbpzl13laGf8yPVB/Vkb07oZ+B9t2GqevoRZwhd7Drfh6Mv88Ph5jOMrLzDo0ID/KN3P/kzzErCUmZnvKDFcfNXvcUu4ojkMfAjviCmh+PjsTYG8ycbWhsbDxLR2u6/dLTeawTZX+eHgqfZ2rnGxYe4jHX2CYmLY91uKaq4MJKR9O5HiHhYb52Jhb+idl8JFMR+CznmwGOIipRip+lLHMymKGPWoC+rpaedUzKK9aJ8Mr3Z5fam87zDAkP9bUxtgje84idTK0t2D2rx6R1zPWpDCoz/OS7WJ+gx/79z9vjCH+ZBw9pe5bGAxpWqs+WKgqh1TgbpmzD69Dqwqsr3a1tbeeZzNabrDvbPf4a++0Eiy84yg8Nz2TjF/B6taq49iYs3m91dqTDWuaQKIQFpASwIwhPKXmyP3iuqYMf2u5aGtstPf2u8V5ckIZpXQZc/fVuUrD5jJkGc4zNLOfNs3SMPvqSbWstsHBYXuSLuCzmupVq0a4Z41tOqT6KHm7ITqnWvt47V3n09DX3SIFjmp7qjw+vZ2a/LqqkedU2p1KF8BiY/y1F28t5jpQqL/l2aE7PiRtesx/0/3Fz4aQJbmlvfxRkbHB1T8pr/BpvQQG+41zA6TpVnlF+1WvA8NAMdi19bW3Zk02zVMx35Xz/nLPXz2HNA9ahGwgTaPAQgQYasGDBYXmRL+KymOtSqpXPFo0THtNSSvXXecc+gL1S5QOgUhV0YP63FG0v528Hj/e5jh03C4VXDlz8UI+P0d/8W8kbV204kvmJX8JsNQnwHeeC3LV6cw82pz94yZ0jqS/raeervjw4sX312j1X37TajX95BTR4iEADDViw4LC8yBdxWcysSrWmJP9u2grDPkJo4MlmV6qVP15cPxg0EZGCUKlCmgqY/y0FzHlI8wAtDdKmgAYPEWigAQsWHJYX+SIui5lVqb5OjQkPD7dT6wxA90kuyCFK7H+EJSJ/XxyKdHHyDAwN9rYxMnSJT/+OjeHnbrdQGTNsQK9ukkqLH/99fnhx6HxPfdVJTkmv6G5mlK+3NoZ5e/sGBfm7WRkYuK679B4nSMvu7kZ/zhANfaqgH0z97fDwren4AdXqst/fCn+SVGz1x+ubIwICAvy8fQMCvdx911z8xHRsK03zV1dSVOgrJyVumVxb/urEyhBfn0A/F0Md7XmxVxsd7hgqVUEH5n9LAXMe0jxAS4O0KaDBQwQaaMCCBYflRb6Iy2Kuy/s3K1y+rjnV9ylOI2TGhlzHdhupfLJURaKv7XFq0B1KVcnn50edkXuHei/3ttuaT/m6QRP5AUXsm2qyosYqBVyhbRBeW/vrlr+isOycpHzSoqpjlsg9rHOq7/bZK/WRQAM6EB/41524aX0Gu56hB8CvKbzgP66vdvQ1eiCg6r9FedcjlYUBMFq+xzfw+Huaii274NoLSMw+gN/5gQOgUhV0YP63FDDnIc0DtDRImwIaPESggQYsWHBYXuSLuCzmRivVwsRZnUEvr5u4iEaVKfPEQB/va/TwfZTjZkKgazftpU/RmdbCK2siV13AojTkLBiM/Bx9O3uEH0n67UAn8t71dShVlJrHkcOID1xy1k4O9PS8QoixVJUdNhTIWqXiNu+8E9AHAGmFwP+YgRlKkvQBELU42jg3Y6hUBR2Y/y0FzHlI8wAtDdKmgAYPEWigAQsWHJYX+SIui7mxSvV2UC8AuntcxpI0CuJVAegbmIEla09YirD7ToSKe/EmekarM5gx6bMjBwIwNOohlqRRj1KtLd05nfDlOQtHACDjcZkc6/JBBCKK5cPuYknkLwUjf0nC5jT+wsseUgBob2qcAzBUqoIOzP+WAuY8pHmAlgZpU0CDhwg00IAFCw7Li3wRl8XcSKX6ierLK6fjHYNnodXodkDULJk+q0lVqjN21RdUvvzLo0vH9+/aEh86TQ6AAaFMQYnSCKVK8y5WYd1qrSRxFvKB6uq3WJqmVIdFEzbepP79xsblh0pV0IH531LAnIc0D9DSIG0KaPAQgQYasGDBYXmRL+KymBupVO+GDkAuV17B8N5lC6pU2809jqWI/H56ONxk/IAhWk6Lky5m5xZmLx4NwCCS7GuEUr3pJYtcq7uDJbR+2b45yAedHE5jaZpSxTkeo0Cl2iaB+d9SwJyHNA/Q0iBtCmjwEIEGGrBgwWF5kS/ispg5VKpXIiOpDr+fN2kjl5OnQMmgSlXC/hSWwvEnI3pMRyClEX2zCDtTm7tiTENK9dveyHUvaYcIJKX6boUycq0GqwPvuzg15IORixhzqFCpQjBg/rcUMOchzQO0NEibAho8RKCBBixYcFhe5Iu4LOa6lOqjaAUARix8TEvVpHj6XKIe5a4eJwTETA4xF5pifM/KYvjZ1qVUP8RPFKZqPNy+9E9ihmJKtexc/LbntJMnbdoBMCsR25vm/VpP3CQueZ3qdZ+eAHTzvkbe6/6mXy8AOjufYyxLhUoVggHzv6WAOQ9pHqClQdoU0OAhAg00YMGCw/IiX8RlMdelVL9s0QSgo20aLfVmpSN9evXnSdueQGLGHuIcZvmtMPuN77BEnUr1imtX9EvPYEmUX3tmI6JUPhj5/Z9b7eiPcTe0LwDDF+TQUpd9HPeX0g4RyEq19vOB2V1AX88rBPFMeRQxFHTS3ZrPFLBQqUIwYP63FDDnm5jq92nzbRwDwoO8vRYmv/qLnSVRkhU3RX3+P1RgAgC0NAHge/oKB1vv8BA/j9CE+z/Jg800KnOTLEc7n6zAkpA6gAYPEWigAQsWHJYX+SLuivn3AaP2yJ0S5inkPs37DZrtgULQvUrk+OM2t5j7tNMIf7OWTpSS0Yy5WYS1LH9f7He3WZXNWFX6PUEHABH9JKa6xCg/79oTUZnO57BFpdUf07zdY2P0xET0En5U3vC334btiFqTGSgPRLU3fkSOq7IXeG0ppJ1H+YB69Xa2PoVbxPrxlP+4rgoOx/Kw1ozy9XyAkqyi4/H3uLav8owtKjAD7+LOVaRadQBAMeYJluaI7wl6iLjubJvGMq/MMfCdbFlg/rcUMOe55856+4C4w9effvzxt6qq9OvbJxmndkT5bL6PC2ZefMa510DfW9S6sTgjTGXwrEWn84jL/UueHPJXkZKYso3hAtM6gZbWorxJ8nNfmnj+Yf630srqsh8Fz+9d3Lfca8UFzE8Kpep+1EhZ8yPUzdUrXsRPHTzJf/+T39SP6JS/O7toWq/2I6MeQKHaENDgm4fyy8vtQ9cfv/Wy8FdZdWXJ5zc5N09sCQ3czbJPBqRxQAMWLDgsL/JFjSzmjwfc9XQmjJAVR+5D6SA3Ql1Hz/coc6q0puBstLm21gxrN0/vDRlE1VldeHWNy+zps0ys7W1N5ljPP/AEa4Byt5srD8W+tGOv0RpTDFbfo31Co+rDuZVOeuMnGrqFRESEBS9MfFhS+zd7k/l4RRV9v0OvmFui/nm613uW5mQjBw+3kAOvsN1W76/WGzVAGpXWQFh6sJrZFsw5GaEy/8wyFxt7V3c3Z1sLQ2OHxSffMjtopWn+qiN7d6I+VTtpBVXtBZdqvh33nDi2D+2cqMwwNd3lt7Cr6+LeWiM9XY2x/aUQnYoi3n2oitZUPeudzDW0nILcjR1BWgK+zP/qj1c3epnMmG1m4+BoPc9z3Z3v2Ad0/j5NjrQ1t/cLCw10t7JwWXHxI2ELYSrVBRdXu1lYeYSEBXvbW9iEJz+vLwJ38wMtvx4ofz5kJAVO6jN9xzfsDAHq6n0C4iM8Tn7ACdWnCxWFlGJfYana0mP2c1ec2BUb6unqGRAWtXhF3KrF8yM9p8h20t3yjv0EVusByR7sCNIkVH1/dnql5Yih/jewEwQy/XvTbJSBSF/jhBe4UZNPO6aJyXneoJtvdWawWUjyvrgIHzd335CImNjVq5dFRQYaDRBTXHAf6tSGQbIYO4L8G/XXw79Qpz4iksphl7FJFgjXIBmJHQke1YXX1rhZmJnO1Bg5ZLjyZPPw/Y+K2bawlO93doVYzJxpamXvaGfpvPTiJ/yumQIFh+VFvkiQi7nNAQurZeG//P9xNVK9zyjHvU+xIaGSjDCtuYdxWrUsc9H4HqoxWfQho6ILXsPkpu14g6/nKG8SDXopOJyiDzeVPVyt0WN0dAYfiVVo+ez4uN9FW2uKwVzXMPPRSA6psV+OcMyy6+Dxowd0l+jQpd8oDQPP+KsFxB78pw0TgJDFUeb4RfEuB7+b2DGN6ifLx0lP3v62tetUaGlNR3qsrpb2DGM7X7cpsgB0cT6HnSeQ6T9EXmnckJ6S4pI9h6lNt1+S+pI02n3EXBRMjMd5S513dzhEnP//lDir26joLNSvC9IQ0OD/GY7qYUSpdh+mpigv07GD9IAxWib+225/YR0yhjQagTXg6mcbjWeFnsyj9bMoPzPjpssB4e4ztxF6Zwh/HsTp9Rtiuv7uD1r7W/F09bRZmwTVuYnD8iJfBOspAQIWVsvCZ/lf9XilegcZw0OMXtvPQ3M6AiA29yS9pqu6HzVMuJvHZcy5gErJIZOO4hPWvsGStbUFO6dIiMzYxQirjUC5HSQv1N83nW/mJNqe5d8OVvG9jh03zGFTJIfqVKpTtuELl4Ubvt2BnH86lkK54OacjGstq5/Fqkjrbs1r/ToV1rFckbtWb+4hlg3f6oIaDbFOpTolqt5FNXmxSkDI9DDOOp8tcF6Drveh82mvQTfFSDifyiHQ4HlIPfUwolRND+MbYghvEFQDzo2fYXWI6AD3K9msCwDtlVcwdh5BeL9rpnRHzfhcRqfuohsaJGjq9mLshIDBYXmRL4L1lAABC6tl4a/8f7FSqR0YtRhXqVXdWaAkK6cZR+/qUa54yoJOtmeI7WNJkj4AoxjOnnmrVADQ3ELyQkJjhkm5XuCXlrXtWf4pazHTY9hxw/yTUn2+ZATo4IgLWFeZ7O5zBTuura15tlJNZvLmNjCfigLrWC7ICh/UiPiC/6RUf++YBoBeAm5d6i0/973MOdXCAwbdR0RnQZ3KKdDgeQhUqs2PgBpw4UYtINp9XPBZ/BL76pR5osj/GbecMWH6cdcMCdDL9wbOQeTFJp0e3UdH4E8JEhyWF/kiWE8JELCwWhZ+yv/ys07dARhab1Sv+yH9AegXRFjyjXDRrTMAE+PfUxNfN08WAsDkKEmHvF4+GoBeJB/QlqPtWX4zKtWKVAtxMG0Hc04sZ6HLBvosVc2LOFUZ7bYxn4oC61guaEalWns7qB8YsRDblw6hKME5nLFP+5f9hrIjI+9Bnco50OB5CFSqzY+AGvDLZWORJyfvn0LdvgSIWWM7oFCywxQA6OZ+jZZsFXBYXuSLBLSY2yZNWlh3V04bP2qIfE9piambv/3KSogODXfUG6/rf5LhWVWRm7okwNPHLzjQ29lU3yxsX/Z3vEN97nYL1THDBvbu1nlIaGbtj3uJMQHeAYHeNjO1p7nvekSO6Fz95fY2L+PZlg4ujpaGNgvTXuTd3BoVFBpiMVlr+V3G+o3irJ1Bjs7eQaFB7nMNTXx25OBiQJa9PbvK39XDyzdswZKYYA/fcF+9OWua1Hmfj16WmguOUgCIW5+i1P7MObE5dtHybUcuP/5CGGb7sE4NeWJ8r44GddNjIeODaC5TTli2A6Cj3VnaRwyKd01F7lWKzcPSLUzbq6Z4rFRrip6eT96+etWm5Ms5n8nRx6syQxQ6mxzCvIkqbgS77cakbc2r1RNkdLa8aSs6FTaIXMFrpVqSez1ld/zKdXvPZr0vIdve2/XqHVTjsYqe8nKF43J6+NTPh0xlR0RAv99GAQ2ehzSoVKs+Pzx9cMuq1VuPX39WBA2VFwiqARc/Ohi3Zl8WYRAZm1MdSh+texAxAElO31la++fVuZ0rFy3ddPDc/Y91bCInIHBYXuSLBLWY2yRNWlg1Fb8+PEwwRDeKDVnh4H68qDZnwXDkF6dso0Wy+37Ucvj0zc8wLVSdn2TYXXREwA2mszylqqTw2WGHPgD09d4Q57Y0HZuk+ZqgJwZ6+6TjVe33C66DhHvZnKS56f+64tkfdNRP+lxb++24p17QGeqdVc93GA+Q1Vz5CHsx/9zwH9JxaOB12gL035ddh+ltK2AMUta83TOnG+MNbxr46GWh9vZAb/+zZxb4xJ3K/vjre+6V1bOGK3sdesXQITkLBiPXqKyiTZ4yQb09AdDehNaRv3frIcfdPcmBOMv2zULOywfzyeaZyLNgR20FXirVEUZBvpEJl59+LC7+mL5xjoKi89E3xF5S8d1YXTXbfQ8LXt9Y7+G2+yXtLae8XKvRTXtTG/H7pdH2LI0H8FKpquq5BwStT3uQ/+P314cHHUYONNqcTRzmrHieaKaqH3cr/+29vUFOKzOxT78eMZEbHnWPGFwJ0hDQ4HlI/UpV2SLCd1HSjZeff/96dyl2ygDlgDMf4Czrv9KKDLjqgqss8neGzr9LM4vPm7SRpJj14YxV3ouOZub//Pk+Y6flKEWb7dnEbbkECQ7Li3xRKyrm1k/TF9b3zZMB6CZrvvkTkqh+m7Y0avNtmlCtSjEXBaCD6THGgM7DqEHorBtjcwsqNclGAEjITIzNYXZvn8QoAtAvDOeE+mLpGABkfZnyKCdiMBBSjMGtuaS8WK0uCkYseYalUX4k6AChUTGPkK+uOmkjLk/ya0331o5kbkDUBPDRy0L14AU9la3W3GZ2zUpOzu0K5L2uYEF7b/qh1R5NkeJ5FTsKOT92GRpUqSBeFTlmVaSVBw2Q81Iul7F0C4M8C3bUVuCdUj3tpR505ReWQPh1zFIa9PW4RppZrfzy8HTi5p0nsz9jIrYmd71GN60tdL/f8o/3UrfFb029T5y4b220PUvjAbxTqo8WTJ139AOz7ajIDB4AJI0OkJbRU36+uHxg67Yj6fn0AOXfks16KEbcxWy3uujx2cR1Gw+m5wv2/EMzAA2eh9RTD5cetNNccgcXT//LzukdhYbNfwC16r/Regz44269TgD0cblI9xzMjhyC/DvJsTOXnWE24BW3AuSBtMVRtlvSCQAclhf5IlhPCRBNX1i/tk1BfmTMilwsjaPwZODM6S4Hme6gVUdNhIGQfhKxL3AMrauHReODlxXvmgGAmD3meo9Qk2wmAsC41UxX3a8bNJHbpiUyRoqq/rOSIH8P8uaGDcRcUqtPO0gAae35Kc9+MVyF/6annPuCHTcJfPSynHHsgDwNGL38NXaCyt8DRqJAaGjMI2qKplR1tlD3yMfxctlI9NYl6K00pTog9AHtIwYVB2Yj5zs7XcTSLQzyLNhRW4F3SpWFsiPm7YHI+JX17jlPyVuv2V17Uy5NNPzKjNWZ5J6W9z3/5jp374P5eP+I1kXbszQewDulykqGb08A+vnUH4f82/G5PYaHY/OpFS92GKmb78opKnyUFOCyMYfs7A7BAw2ehzSqHi5K0ANAfOp2jl8cCDtaiwG/367XGUjrbnrKnHq4G4o6/4LefreZY3dI03zZpSsAPd2vCab3OIflRb6otRRzm6DpC4uqVMVtTmNJdtT8fnv79OE9CRvjHMaKksIwIlCV6oxduLHD2lI02KyI9QksiUD1Kx4YmY0lse5IT7/bWJLuuTpAPzwGT+QcdH25B7p7R+nt+WOpYk2oY69ROuaeyw7e+9zU25M1ff5zTLq/HPI0HWxxEVtRMgLRBflYr/HxQnRETnMDeXPxp4uGMc6XJE5DjvsGMmKSYPzZM4Pt+RYCeRbsqNVRftazr6QEC2IiQFgMO8Yh2dv1FJtpokb1kDDXccKmlCQobzbpdNfagM2nVt0NHNjZKhUb6S1N8/GhH7c+WrGl8YLsmLFSmCniEG8HhEQ7YAkmnWT0d7CxscYpVdrgKcElh8z3E5a9hkfcxXp4eWsndtDaiEVXqHoQ6UI/hrADGjwPaVw9TGvEZyXiO0uQxtIqDJiSu0lHouukFfcIDSvV9xCAmbuJFoLu1AXAoKiHWFqw4LC8yBe1imJuKzR9YVG7BT18bmFJAtWFN9e7TR0+YLRhQHxK+tP8olSbjrTV3nioStVwP96lhVWp1halmHcDA90u0Jay/r0TMgTImhx4zxw5os0Zkr+cSOmbcxuD500dJdseuRRBWnvVvSZ19kJ+AztqcfJWoZWVnDd+F0yE+/MRKQ+kXM6jCdp8qfKKd9SPmGSFyyPnDfZSh+RSLUQAkGEJLle0DV0hMWox0be7xUCeBTtqK/BoTrXya/bVjHekrtDb1eOQy7s4X8LSZChvt06W1dxMj6P055hlBzBrH2NqquaGv3Mizp24VdH2LI0H8GhOlfLzxfUbz34SJ+yr9s1BygToJ9U1OPIj1ar3iPl36BMMmf69wTicq8mr5Q7L+aQW40ugwfOQOuvh8o93r9z9QFpDnR05ELmcb4JBCCitwIB/Xg0c2V9/2xNy77V490zk34lYkjoCH9eoI6eB0QGB9BbhsLzIF7WCYm47NH1hUZUq26rzwxGzPsLC8mZ7XjBej3P2Etwq1YorIZaekdZ60yxcPVztDA3sVp3PJ/gy0KZ9WKMBMSh6X0B/r2tK3qYfiXce3wUIj4olB7rlJfz0slxylgJAwp7U3buD7ksDFGl711AuOiHX9Am4Q/2IyX92YqiApXXmXi8ZjdxhlEyaj6bOx3Zzv8Qnbp78lPPNA2+U6ps4NSEAOhgfJLyk1C2IgBz7Aana2vwturJaGzG/X4SHUUNBV1fmBqu1xdtdQ+5jx62NtmdpPIA3SrXksCFSMQGVtfnYCSpliWhst3Zmyey7ZT/SbHsPD6PPp2JDbAZ7cWMzp91cT+Kd5yAEoMHzkLrq4WykCgWgq+MZQjN7L6wfcpa8xAnSOATdgCuerJ+qbHXkLdM0fuXl0UKN0mLBAP0k4hBH/srxyFlpb8Hcu4bD8iJfJOjF3KZo+sKqU6le9ZJD1Ob0nThP0poTlqKYUn21O/40FgSYM6V6w3c2bpUqG2ruBSGaS8btKrmPQXmf9eAL2iGZYbif6Hf854SlJNBLIK/K5CH89LKUnbDugvbqCFKectqhM+q9fZJW6/05huRIO9NjRBVKDSg3eEEOlkR6mYhujSNOvFafsu8IJGzT+GUlRNurpnijVPPXTBAS76Uddx//GlGu+3RHXkiDvWwdEN5t15PTXI/fl+a0QyegMJ+29pnGCWdn5qrz1kXbszQewBulWp5s1F602+igi4RhlTfUfQeVVrHdL+vnaZs+w+bfwYlYdAsucQf88pWscOf69xNu20CD5yF11cOPokcISfQz2E4IDVB5EnVK62Sb1npX/TcHAm3AlI/HbXUdUz/gTeDrRktfbBC5JtO/L2sYEeo++UJTdzF3QBckOCwv8kWwnhIgmr6w6lKqP7boID8+Ch/ol/IoGl0GOWXbL3Q3djt6Z4AzpXreRWb2nvoDbb/fPbMLkHU4Tbzq90kP10PIG1q0bYqEwV6iKs2LVerscr4Jq32+elmq7oYrCIkZHcC7YT6arwDajV38mC5NqzKROk3K6SxecBYn6Yu2V2bsQYiomc2TxIR1t37GkiiUa949QR83ehDhloevcr5Z4JH37+NY66U5pOiSmcH9gfDgoJvsPOvf75zaY9LGXMJLxDKn+jvBhRR2u/XQ9iyNB/DI+7dwh5P/JVKdU4BuCi1ncZS82B7l1yn7fsPDcMHPEVjnVM+4uaZCLVAn0OB5SF31cFVGhM16ehR1jOpzzjKg/dglD/llOFhAEWAD/n0ryszj5Edi7VR+zHQmMwrmqzh1UaC+Hm9RH9arAzDQ91qTrnRrOjgsL/JFsJ4SIJq+sF4tHg2AlP054iwcwvstOmJAVG3FU+yTP0/WOISt9h0EenveqPyRYOt9jfa6fd2CBvElRvEpiNdAzukn4TRn4fbJonI6gWu2bkNJ2JW4//jFe3k/iV3qnxcCRkn00t9M3zuKUvxgg4Pj7tfoLyFKFYDuhgkvGK/r3wcxE9Wi7zWl6z6fvSx/by8cL9HH8kg+bduQ0ocrtbvITdnwCN/ylWVGK0mNjbhDVyVFZ90GSE9a9wRfwJQ3O2d162d14jPWkpZlx6p2HRpwmblVbovT9qqpRinVIuq+a0MY8+Q4Ku4uM3HYfLcIe7Wq81Nch3aUm7r2Abv+0Ycd03tobnhN8mP4k2wmRlinmh7gtFMwx3Mbpu1ZGg9olFKtvuYtB0B744OsPS2kJrI2X3y5ANOelO83otSluiiFXGFnbb/OOvUbFnqHtPav9pZPT8I61dwVDkvrjXLdxoEGzzvqqYdLLocbeSTl/MLq1opXey3lO/Y12vkCDqL8I4JqwJUvN0+V7thDYSiDIYMVBvbt1kFI1usqdg1C1fONujLS0zdiPd3yN7sM5bqqRqcLbExDDsuLfBGspwSIJi2su6v0xg6SFkV+Awh1lh+nNdVm50vsIyolOfvCTDXG61r5hkeEB4euOpNfVfv5XIjeyDGT5sVe/YZ0CbabKw/pLo5+ARDvMWqi+ZbHtY83G6kOl0VXHwHQsdcYDZtEbP+b3xc9qAG4CYj3mxZ1sRBfdVfkpS22njV9tqmNvZWRocPiU2+wjsnPRDu9lRfS90R6eAaEzI9aEO7jHrbtzldSH5vHII+IHfELv3P2hprNnGVkbGJqNMfEfX1GEWsO/Hl6KHyeqZ1vWHiIx1xjm5i0PFaRUlVwYaWj6VyPkPAwXzsTC//EbD6SqQj8l/NNDUdK9eriqZMnKA3pLSMpISkp2Umya6/Bo9W0pvgeJ+y1Vp6bEu1obWdjYTRz6uSppoG7s9nLzILds3pMWsdcn8qgMsNPvov1CXrs3/+8PY7wl3nwkLZnaTyAI6X6dq+jrpaK4gDZLp06IdYq0bm7/PBxGjqGawnT89WFV1e6W9vazjOZrTdZd7Z7/LXPJJcAGsUXHOWHhmeyGZh8vVpVXHsTFu+3OjvSgbhCAkIEGvy/w1k9XPpkX6g9Ug+bG87Q1ZlmOf/ws1YbQb05EVADfrVCWQh5dHZob8I7uNXWluWmLrTWnznH2MTEZI6RQ+y5DywzSQIE8gexo3ohX8ThbRB+oJUUVk1uorHCGPtdGe9+0WYDayr+fH+fc2VvpF6fduIa6+pdwNqSwJelpWh7Od84718e8O3QnJ4TN1AdFlj5cXPhpAluaW9/FGRscHVPymMrHloF8B3ngsZ5//KA8qteA4aHZpDnU2mUPdk0S8V8V873zzl7/RzWPOCbNQx8CTR4iEADDViw4LC8yBfBYhYgWkdhlR+fKy7jeoVdl7jinHNXMHFj3fs8tizwZWkp2l7O3w4e74PuG9xsFF45cPFDPT4Jf/NvJW9cteFI5qdWva4KvuNckLtWb+7B5vQHL7lzJPUle51KperLgxPbV6/dc/UNnLZqAGjwEIEGGrBgwWF5kS+CxSxAtI7CKt1vKNLFIpVdPKXys07SIjP28OtejfBlaSlgzkOaB2hpkDYFNHiIQAMNWLDgsLzIF8FiFiBaSWFVPN4yZ9BggzW3vuKdCGu+391qPlxBf1M2387ZwJelpYA5D2keoKVB2hTQ4CECDTRgwYLD8iJfBItZgGhFhVX6/GR8sOM8WzffwMCgAH9vp7kmVj6xhx/ydUhR+LK0FDDnIc0DtDRImwIaPESggQYsWHBYXuSLYDELELCwWhaY/y0FzHlI8wAtDdKmgAYPEWigAQsWHJYX+SJYzAIELKyWBeZ/SwFzHtI8QEuDtCmgwUMEGmjAggWH5UW+CBazAAELq2WB+d9SwJyHNA/Q0iBtCmjwEIEGGrBgwWF5kS+CxSxAwMJqWWD+txQw5yHNA7Q0SJsCGjxEoIEGLFhwWF7ki5DbIBAIBAKBQCAQCAQCaSIw8VkvbJQqdgThe2BhtSww/1sKmPOQ5gFaGqRNAQ0eItBAAxYsOCwv8kWwmAUIWFgtC8z/lgLmPKR5gJYGaVNAg4cINNCABQsOy4t8ESxmAQIWVssC87+lgDnfxFS/T5tv4xgQHuTttTD51V/sLImSrLgp6vOzsFTrBFqaAPA9fYWDrXd4iJ9HaML9nxTsLJHK3CTL0c4nK7AkpA6gwUMEGmjAggWH5UW+CBazANHIwvq4z2WyxtgBXdoh9yFIyCtP0tbW1tJQGT1cob/80AlznJccfVaKXcxD/r44GmZqaOMb7GNt6rLjYR3d3pbg4wFntbEjBvWVlepgmlyNneScRuY/hGfAnOeeO+vtA+IOX3/68cffqqrSr2+fZJzaEeWz+X4N9jlC8RnnXgN9b5VTjzPCVAbPWnQ6j5piUPLkkL+KlMSUbW+xE60UaGn8TtX9qJGy5kd+oMcVL+KnDp7kv//Jb+pHdMrfnV00rVf7kVEPoFBtCGjwEIEGGrBgwWF5kS+CxSxAcFdY+WvUkRuBWtwH7ASVym/3dtgObt+u19TVWTzVkvk7pkvKWRz/TKm95C4FQDuTQ/zUW6j69e6i73AkOwwPtwKl+it7h7+VufkcbaWhw8ZozvHelPGZ9V/9fZocaWtu7xcWGuhuZeGy4uLHKuwTJtUFF1e7WVh5hIQFe9tb2IQnP/+DfcIf8F3O8wslj/eGWJuZG+ooDx06WkPfbd3VD5XYR3SOWaKvPx7xER4nP+CE6tOFikJKsa+wVG3pMfu5K07sig31dPUMCItavCJu1eL5kZ5TZDvpbnnHfgKr9YBkD3YEaVrKMhaqztnyCUsx+Z6xxWeupUtQWIivk+U8/4T7v7APaHzaMU1MzvMG3XyrM4PNQpL3xUX4uLn7hkTExK5evSwqMtBogJjigvtQpzYMNPgmovTxwTBbc0e03XWzsnBdc+UTrsqF8AyBN+CqH8/Prpk3coD3FewEiT8vk8Ntzc2NpowfNnTkhBnOK8/nE0eRBQsOy4t8EaynBAjuCqv6sClyI5i+k2X6tOZOyEDkk95WKV+xM//ONfduYPiCHPTw7/NjcasPPyqmnucjzjp1bg1KtfCow1TnPY8x57e/z/fOUxAFkuOX3MEPPJRlLhrfQzUmi172RRe8hslN2/EG32hS3iQa9FJwOPUZS5c9XK3RY3R0Bh+JVf7KeX7he5rHVPvt97/TCrP8zWGnEWKg4+iwa4Q3/Zhl18HjRw/oLtGhS79RGgae8VcLiD34TxsmACGLo8zxi+JdDn43sWMa1U+Wj5OevP1ta9ep0NKai78ZIYOFgFrcOyyN8fWEw4C+c5LeYpVzdW7inD4DXc5SJ1CpVB8xFwUT4wuxJMJ5d4dDxJ7bp8RZ3UZFZ5GHbCDsgAbfFPy5FT2mx4QVD+ht8dezzkN6GCS2gQq02RFcA769cqaW9nRjWx8PvV4AiNmfws7jKb4YpDdv3Z2vtNa58t0Jn9EdgfhQrws/qScEEA7Li3wRrKcECO4Kq26lirwrQcgrAsDk7d+wE/9KQbwqALMSS7AkX3LBtavgK9Xvh+bNjM8lNHyVtwL6AiDU3/tGGXam6n7UMOFuHpfxf7XkkElH8Qlr32BJpMh2TpEQmbGrCEuiUG4HyQv1903nmzkJfsr55uF2sIrvdeyYPcX/OU5f8oQwTl/zcP4QJKt6Op/FDQ8ds5yyDV+4LNzw7Q7k/NOxFMoFN+dk3BdXP4tVkdbdmtcWulltz9J4QO5avbmHGtN1+psRoSbTHnX0ISjVHyesu4GxK3OxJJW85eNA93kp9InVvFglIGR6GGedzxY4r/mIHaN82mvQTTESzqdyCDR43lNxJ3iwUC+f6/gK8+e+OWIdNLe08sUTLUArMOAXS8ewV6plVz2mhN8n+sA9W6YkBEB3y2PfsRMCBoflRb4I1lMCBHeFVZ9SfRU7Cv2sg+MZ7MS/8mKpIgD6SWx+in847yIl8Eq1KtVCXFhqqNWBfOwElbuBiFQF3ekTYpQrnrKgk+0Z4j8tSdIHYBTD2TNvlQoAmltIs+rXvGWAlOuFxudR08BHOd9MnLIWMz2GHbOFctZJSkhykMnOl9gJKjkLUNf2Lk5nmZ2kBpXq8yUjiDVAZbK7D9MTqebZSjWZyZvbyHRA27M0HpAVPkhjHWFxSb38vRnhsGG7hwxZqRbvntkODF/wDEtiPIlRBKIGB7HBz987pgGgl4Bbl3rLz30vc0618IBB9xHRWVCncgo0eJ5TfcFVCnRxvUAYRaz9tXMKACqr8rAkhEe0AgOuU6ne9JMTkhgwY8MTfOObt0oJ+c9iFqmC6TTCYXmRL4L1lADBXWHVp1TvhfVDP5MP51VAT6hUm4ffe2YIIY8jankMX119WjsBLU66Mrkf0h+AfkH3qAkmF906AzAx/j018XXzZOSLTI6SdMjr5aMB6EXyAW05+Cjnm4kGlWpFsll7JFuE9ZPwXto/EvRQC8AvSm9QqVakWoiDaTuYc2I5C1020Gepal7Eqcpot435VJS2Z2k8oFFK9Q+iU9e/rEHHwohKtey4mTgAWhtJ/j0/UW3awSoVcxS5HdQPjFj4nJZAKEpwDr+LHdd+2W8oOzLyHtSpnAMNnufcCugDwMDIbCxJ56xdR9S86YtsILyhFRhwXUq15rQDYjIAaG/D14mVBw3Qk4pLX2AnBAsOy4t8EYe3QfgB7gqrHqX6fAnyhoBOGvG0Cbb3e+1Vxwwf2Lt75yGh9ypyjy8NDfc1VJtgveMxs+kve3Us2sXJMyA02NvO2NBhzY2vWB+28uJ8bW1tlf7IqyU5UA051Na22kX346J8z9zs5+TiGxwa6GphaBq07xl9AcfDuJnjRw3t31O60+T1BcXZiQtCw52nqUz2PVaAdLtTfdSURgzqI9tFzu1SdcGZVeFhgWYaqqbxd5h/pc7noVPz5Xq8t5WFlYN32KKlkcGLDj9Pce4i+N6/Fa9Pr1+17WoB4V/Q5lQ7OZ+j5sGHdWpICt+ro/EoWgEAIeODqFMJ5YRlOwA62p2lfcSgeNdU5F6lWD4ZAeannG8eGlSqtVXvLmxctfniW0K3nDan2t7yGNMuqEq1pujp+eTtq1dtSr6c85nuHE6nKjNEobPJIcxjuOJGsNtuTNrWvFo9QUZny5u2olNhg8gVjVCqf9LDHdbn1tC8NohKNd1fDsn9WYlk8zxpg1RRfQMzsOTb9eodVOMxL0rKyxWOy+k9ts+HTGVHREC/30YBDZ7XvFuhjGTq6OWvsTQd6sCxiHkKcaoV8o+0AgOuc0615sOVras2nnlNqBJpc6pC+vv5K+olp3BYXuSLYD0lQHBXWHUo1cpPl6IndAESYwIu0x3eKVWlX16d8RwKQG+X2GCrdS9rinfPRG4dRJ9y/XDSc6SMYsAV7Iaq53FqnXrOO4ILb0GdUyWtPip/uGlGH7npm59iXYhfF136SYyJvk1NUiqKP+bssuiO3BW8wsn14NfaV4tRj2SNTZ+RR//7Le96uLIwkLBasnDukvsV1SnzkF6LjPsl6hc1/Dzfry/SlOsxc/MTuntY2fMEp7G92reGiEqsPFs8AnnE7janab5xOQsGI0mVVbTJUyaotycA2ptQNfJ7NzoH193zBu0jBmX7ZiHn5YP5ZPNM5Fmwo7ZCw0qVHe9WqQgB0MUsGTeJesxyhFGQb2TC5acfi4s/pm+co6DofPQNsTtffDdWV81238OC1zfWe7jtfkmbqKe8XKvRTXtTmwoD0vYsjQdwrFT/XAt32PSa2lVnVapptqJIB8z8CJZkcNapIwASzH5cxfNEM1X9uFv5b+/tDXJamYm1a1+PmMgNj7onyGExWwJo8LzmQegAJFMnbCCHtX4ciQYRmLKTGMsa8o+0AgOuU6my49MWHREAOs3Yhet2CxIclhf5IlhPCRDcFRamVHtr2DlTcbK3NNCdpKaipjM3POnuNxbBdtqhE+jUTT3qDvpJ0a31UcvOvKX2Lb4cmiMFerhdxPmb1qTZdgI9nS8xws2yKtWqnIWjRYRVV+PF6/u1E0A75TjGvhjUGbxu3Q3WFyAJyrtTsVEbbzAWTqK+NKLdRgafRzvXxfcTomOOv6B2Rxp8np+nrXug3XZi05C/cjySHa1Pqf4+49gbgM76SXTHzZt+ssgT0xQpHtri5LHL0KBK1AhYbBQpzcNEyuUylm5h+DvnmwJulOqfG779kT795M2EgaLTXupBV3CvwK9jltKgr8c10tRV5ZeHpxM37zyZ/RkTsTW56zW6aW2h+/2Wf7yXui1+a+r9L4K5PIZD2p6l8QAOlWopVadi9sSiVMv2zUEyH6dI6VxwlUQ+MDqAq7ApP19cPrB125H0fPq8wrdksx6KEXcx260uenw2cd3Gg+n5+EDoEDZAg+c1V92kkUxlVaTPqP4u49cQQktA/pVWYMCNUKoVWaHDABBXWfNCUKfmOSwv8kWwnhIguCssTKkqryD0X+vmHOocK+V+iTyTci9sIACSLuexJI3CjVoAdPdlTMmxKNWSQybtkep5JTPWLApVRGkyRh1Lk6YjT6gYw9bxPjNYnurPSB4sb/B5qBe0m5dClqQp80Rbn1L9cdqhFxBXmn+DGfWVplR1tjC3eKDxctlI5PzoJah3Ek2pDgh9QPuIQcWB2cj5zk4XsXQLw8853zQ0XqmWXPMYANqP8Ga4SNRF2RHz9kBk/Mp6l7lQ8tZrdtfehEWX/pUZqzPJPS3ve/7Nde7eB/NbrwNb27M0HsCRUi29HuqwkelHXodSlWQN7nfepRPywZx99YyQfDs+t8fwcGw+teLFDiN18105RYWPkgJcNuaQvYkheKDB8xqaUtXbjYv6ReVpNKIxwLjVmOM6hDe0AgPmWKmWZYQMFxYZ5PKfAC925rC8yBfBekqA4K6wuFKqkzZ/wZJ0vm/RQb5FRtszhoDNOKTXa3SAPrTNolQzqEsnhxpHYdfTCJnVD4D+IXewi6hKVXTucSxJhKpURy4jhDhFaPB5CuMnIhcMiCCLsNpjliKtTakWnbCUEx/lc5YQwffxQtTbSHMDebPcp4vQFpN2viRxGnLcN5ARkwTjz54ZbM+3EPyb8/9M+VnPvpISLIiJAGEx7BiHZG/XU2yniYrPOfcTG+J48iN5gIkNT2KGIhlK2JSSBOXNJp3uWhuw+dSqu4EDO1ulYtFXS9N8fOjHrY9WbGm8IDtmrBRmijjE2wEh0Q5YgkknGf0ddBsrvRzqQFjvzOr9+59dewA62qZhSQanHcQB6MB6nsH3E5a9hkfcxYYy89ZO7KC1EXMsqXoQ6UI/hrADGjyvyUZHyIFOAnmE+NF8BbbnIf9EKzBgDpVq6Q3/Qe37Wx+muTgKKhyWF/kiWE8JENwVFldKdfYB4kK22tqcCHTVY0MBx8hKlXLEXBi5zfRwvS6DVKXazYO9qylVqbIq5wafhza0qbWVZavY1qZUyx+v0uw3ceFN8oaGtPlS1nLPCkcyFBjspZZwqgWSGTLu16ifMCnapo1cM2oxw0G7ZeHTnG9CGjWnWvV8y7R+ysGXWXdFrvyafTXjHSn0wtvV45AM7eKMrfZmgfJ262RZzc10XfHnmGUHMGsfY2qq5oa/c2JrXWzV9iyNBzQ4p1pyOdSRFJeLValSfUCECXulotQcsxQCoCfTb4fEj1Sr3iPm36G3V5n+vcE4XDSbV8sdlvNJLcaXQIPnNW+Xo9WrGssLgVomEDI+0viOB6QeWoEBc6JUq/P2zO4/0uf0Jw6GovkaDsuLfBGspwQI7gqLK6XK2kv+uW0K8i09GSEY2cMyp0rVmUCHvF8nEapS7e2fjiWJUL+BddVHg89DC8HX2pUq5cMhi3EzNzxkTrT9/ZBXSO22US46SQHQJ4A+c03nPzsx1BxonbnXS0Yjf8sombi7NG0+tpv7JT4ZvePHnG9aGqFUP6c5KE9ZnsV0Nqv4mPeBNsH0Jk4N6eV3MD5IiKZG3YIIyPncwtIk8rfoymptxPx+ER5GDQVdXZkbrNYWb3cNuY8dtzbanqXxgIaUatFmXblROlMIjOvdDgBJhYnose1ONEj8jx26SO5PWk8ak6Qu6Ghvepg1dD3KjzTb3sPD6POp2BCbwV7c2MxpN9eTgt67a0KgwfOamv/sJAHoP59URVJSLRCLV4tDY3FAeEcrMOCGler3ix6qmgvTmdPxlZ/zCkgD0AICh+VFvgjWUwIEd4XFI6Va+zZ+ojAQmbOPvPyi9sf9LMZwOYtSrbjq1QPd1PM2lmZQnZf1kL6ijhul2vDzpPv3QfrjfjfJ3ZRWpFSLrwXrmWylB1WmUpFqa5tMO/HnmKUkaGd6jKhCP29C+nKDF+RgSaSXiRgHfm4DofqUfUcgYZuG/+KWpO1VU5wq1dI7C6fNXvMI7xFMueg8bxetX5+/ZoKQeC/tuPv4d4By3ac7ACIGe9m6Eb/brienuR4//4WGWFOY/whLoZxwduYk+oMg0vYsjQdwGFEJz6+daGgCwpxqbT46rsIS3Q2t/4X1drP1mfx52qbPsPl3cCtR0S24xB1OYymUrHDn+vcTbttAg+c5xYdNOwAx6xPEHgZ107hRi59hSQiPaAUG3IBSLXu0fNaMZXcIHd2bfpYsboaCAYflRb4I1lMCBHeFxSulWlt8zrE36DB1OzH6euWdCNt4xrabLEq1tvbNBq1OoK/HdWK/uOiAi/d/9NVuXCnVhp/n64HZnUE/r6uEWEw1T6PRTVoMDjY+hCmfvSyVTzda225/RlKT6f66DBValRnSH0g5ncVfUpykL9pembEHIdI/3DxJTFh3K36NPuWad0/Qx+0K3wza8VnONwMcKdWq3N128+JzSIrzYZQuw9Pgcaz10hzSmExmcH8gPDjoJrtJqvc7p/aYtBHd75IJy5zq7wSXoHvYcWuj7VkaD+CRUq39kWzWGQxfQujMv4hRBNImh9hpzV+n7PsND7tNqN5Z51TPuLmmtt4IYP8MNHjeU5nu0w90d7uIr3iLdk4XFlONJ2+yCvlXWoEB16dUawoOOFusuEsKDJG7VAffIgsSHJYX+aJGFvPHfS6TNVWGdRdH7kMR7z50/KTJXskCHIpKgEAyHDtqDO/i1NGikg+4w1F7/WevQTsAtNkOQ5dlx2lKd9WIuvIVm3Ipe3XI23r5XeYStozA3uimJ5lYmsbXU65DJfqb7XiKdalrvt9ebeu2n7nPZ96qcQBIWp9gJx4r02wR5Tx2BeofRqbB5/nwn88YqWFe5wqxv15TcNTbTFVBCHlG15PvihspVrnL/ybiU4pN3w4yA4YyGDJk8CB5uU4iwnMOMftuZZnRSlJjI+7QVUnRWbcB0pPWPcFPs1Le7JzVrZ/Vic/0TMyOVe06NOAyM4pwi8NXOd8scKBUv51zUeggLY8VPwJiAQr9e0q2A9N2MGagKu4uM3HYfLcI6zRV56e4Du0oN3XtA3bT5R92TO+huYG+jwidP8lmYoR1qukBTjvJi6JbC23P0ngAF0o1fw3aKg1nDKphfEVqNdkZ299g5lqVmzCze5+5x9n1L36ddeo3LPQOQaci3PLpSVinmrvCoYHYCm0baPBNQemt+YpSyouysBETytdTdvIyUzY9h0MmPEfwDbgm3b8fAEIGe1njFP664q/YQaov1sCjIG38gJ5dROsNiMjXcFhe5Iu4K+bSw6btkTslzFPYOpDxHzUP103q1XPiklst4c5YWXBptYuRwUyNEX37j5xk4Lnp1hfuKqxGFtbHA+5TtcYNlEKEJ4pIF/nRE7TnrGOJhcvg/T778cN7dKBeLd5j5ERdvWUsYSyqv9yMdzOYPtPY2t7WdM7csH0P6YLmRswk5QFSIujNwl2HqGnr+hxhLhH9+/po1NyZ0w0sbO3nGRq5rDiXj6nEh2tmKg2SQa0JCHXqN05z6rytjCH1H6k+qiN7o1sUANC+2zB1Hb2IM+SJoLqfB+Pv88MhprOM7LxDI8KDfCP3P/lzzEpCUqan/GDFcbPXPcWu4gjkMbCjFufnfn36aBGZQeEPsYto/Hl6KHyeqZ1vWHiIx1xjm5i0PNaXoKrgwkpH07keIeFhvnYmFv6J2XwkUxGQv4UdtRUaVKp/Uddu9sgRvRPKc1OiHa3tbCyMZk6dPNU0cHc2e5lZsHtWj0nrmOtTGVRm+Ml3sT5Bj/37n7fHEf4yDx6CZB92BOGYxijVsjPztdVGDezeWaKTpKSEZDf5ESpa3keZLQWl6NYmTzMLl6DwsEBnM1P39enfWC2ytrb4gqP80PBMnN8vnderVcW1N2HxfquzIx3WModEISxAg28iSp7sD55r6uCHtruWxnZLT79rvBcXpGEE14DfH3DX1VJVHCjXpRNSF0pKdO4uP2zcRJ2Zq+kTPVXnnKXQBp0NnZ3PYRcJGsjDY0f1Qr6Iw9vIUAP3gd7+xLkzKg+jTFtuDJNywtp8P3mUFeFVrBJavGwfuGmpeBCrMzngdD5VHVT/frLTor8I6KK+hF0b2xBcFhaER8D8bynaXs43IqISb/h2aE7PiRtesx9D+3Fz4aQJbmlvfxRkbHB1T8oj+RO3IuA7zgVczKn+G+VXvQYMD81g09IjlD3ZNEvFfFfO9885e/0c1jwQzMAjzQU0eIhAAw1YsOCwvMgXcVnMdSvVol0zxrecUn0UPdyQnVKtfb13rvLo6WvukUKcNjU1d+ePnbIJ25aQRs390EFI3sl7XWYJBdQQ8J1sWWD+txRtL+dvB4/3uY4dNwuFVw5c/MBu9grjb/6t5I2rNhzJ/NQSfinNBnzHuSB3rd7cg83pD15y50jqS/Y6lUrVlwcntq9eu+fqm1a78S+vgAYPEWigAQsWHJYX+SIui7kupVr5bNE44TEtpVR/nXfsA9gr1RYiZ8GIroqGkacJkclfLhuLZJ6EzcnG+gDDd7JlgfnfUsCchzQP0NIgbQpo8BCBBhqwYMFheZEv4rKYWZVqTUn+3bQVhn2EAGgBpVr548X1g0ETuyAPxVdK9YwjdS2Zzhb6fiwoVclm6MkRC59jJzgFuQk7grQEMP9bCpjzkOYBWhqkTQENHiLQQAMWLDgsL/JFXBYzq1J9nRoTHh5up9YZgO6TXJBDlNj/CMEM/r44FOni5BkYGuxtY2ToEp/+HfM2y91uoTJm2IBe3SSVFj/++/zw4tD5nvqqk5ySXtEXRFG+3toY5u3tGxTk72ZlYOC67tJ7nCAtu7sb/TnDYchDKegHU387PHxrOt71p7rs97fCnyQVW/3x+uaIgIAAP2/fgEAvd981Fz8xl2CVpvmrKykq9JWTErdMri1/dWJliK9PoJ+LoY72vNirHIU7/pu908vBZ2M6M2AEwqcNmshzguk7GxuWhMvCgvAImP8tBcx5SPMALQ3SpoAGDxFooAELFhyWF/kiLou5Lu/frHD5uuZU36c4jZAZG3Id2xez8slSFYm+tsepGo5SVfL5+VFn5N6h3su97bbmU75S1Zwi9k01WVFjlQKu0Lde+HXLX1FYdk5SPsl99pglcg/rnOq7ffZKfSSEWB741524aX0Gu575iqVrCi/4j+urHX2Nriur/xblXY9UFgbAaPke38Dj72kqtuyCay8gMfsAfp60EZQeMZcEQGj8ylfYCY7hsrAgPALmf0sBcx7SPEBLg7QpoMFDBBpowIIFh+VFvojLYm60Ui1MnNUZ9PK6iYtoVJkyTwz08b5GD4JLOW4mBLp20176FJ1pLbyyJnLVBSyeYM6CwcjPjVnK2FPzR5J+O9DJ8QwxBmUdShWl5nHkMOIDl5y1kwM9Pa8QYixVZYcNBbJWqZicRrkT0AcAaYXA/5ghBEuS9AEQtTjKlZvx23XqIgAM8LnZ+A1+uCwsCI+A+d9SwJyHNA/Q0iBtCmjwEIEGGrBgwWF5kS/ispgbq1RvB/UCoLvHZSxJoyBeFYC+gRlYsvaEJSLhWL8ToeJevIme0eoM5s4u2ZEDARgaRdw5sh6lWlu6czrhy3MWjgBAxuMyOarRgwhEFMuH3cWSyF8KRv6ShM1p/IWXPaQA0N7EkQMwgeqXaydJgG5T1j3kJnQ+fCdbFpj/LQXMeUjzAC0N0qaABg8RaKABCxYclhf5Ii6LuZFKlbYyU07HOwbPQqvR7YCoWTJ9VpOqVGfsqk/DlX95dOn4/l1b4kOnyQEwIJQpKFEaoVRp3sUqrJuClyTOQj5QXf0WS9OU6rDop1iSCvXvN34HubLMiNHte+hvf8bVZCx8J1samP8tBcx5SPMALQ3SpoAGDxFooAELFhyWF/kiLou5kUr1bugA5HLlFQzvXbagSrXd3ONYisjvp4fDTcYPGKLltDjpYnZuYfbi0QAMCs/CPqbRCKV600sWuVZ3B8smcGX75iAfdHI4jaVpShXneIzClVItPGE3QN503+tKLN14kAfDjiAtAcz/lgLmPKR5gJYGaVNAg4cINNCABQsOy4t8EZfFzKFSvRIZSXX4/bxJG7mcPAVKBlWqEvansBSOPxnRYzoCKY3om0XYmdrcFWMaUqrf9kaue0k7RCAp1XcrlJFrNVgdeN/FqSEfjFzEmEPljVItvhWhOsYhBYvJhFDzveBjY1eqIg+GHUFaApj/LQXMeUjzAC0N0qaABg8RaKABCxYclhf5Ii6LuS6l+ihaAd0o9DEtVZPi6XOJepS7epwQEDM5xFxoivE9K4vhZ1uXUv0QP1EYAPnwLGxPG5QnMUMxpVp2Ln4btjHpSZt2AMxKxPameb/WEzeJS16net2nJwDdvK/hvpPKTb9eAHR2PsdYlsoDpVrxbJOBjt/Fr/jfernINa6x3sPwnWxZYP63FDDnm5jq92nzbRwDwoO8vRYmv6pjCK0kK26K+nzi6GBrA1qaAPA9fYWDrXd4iJ9HaML9n+QmnEZlbpLlaOeTFVgSUgfQ4CECDTRgwYLD8iJfxGUx16VUv2zRBKCjbRot9WalI3169edJ255AYsYe4hxm+a0w+43vsESdSvWKa1f0S89gSZRfe2YjolQ+GPn9n1vt6I9xN7QvAMMX5NBSl30c95fSDhHISrX284HZXUBfzysE8Ux5FDEUdNLdms9s/f5VqVI+HHMzi7pJ32GHRnX+xtluDAdjToHvZMvCZ/n/JsnPfWni+Yf530orq8t+FDy/d3Hfcq8VF/C7CLcSoOVzz5319gFxh68//fjjb1VV6de3TzJO7Yjy2XwfFyKu+Ixzr4G+t6jOKMUZYSqDZy06nUdcRFHy5JC/ipTElG2MgcXWCbS0FoWDOq3qftRIWfMj1Aa14kX81MGT/Pc/+U39iE75u7OLpvVqPzLqARSqDQENHiLQQAMWLDgsL/JF3BXz7wNG7ZE7JcxTyKPv7zdotgcKQffQxZgft7nF3KedRvibtXSilIxmzM0iTAX+fbHf3WZVNqND9D1BBwAR/SSmusQoP+/aE1GZzuewRaXVH9O83WNj9MRE9BJ+VN7wt9+G7YhakxkoD0S1N35EjquyF3htKaSdR/mAevV2tj6F6399POU/rquCw7E8rDmjfD0foCSr6Hj8PW6UtvKMbRdEEwfexZ2rSLXqAIBizBMsXQ+/rgeM7NC5l8LgwUMQBisM7N+vT+/ecpLtgMqqPOwajoHvZMvCZ/mf6d8beSI8In2NE14QFQbynj1NjrQ1t/cLCw10t7JwWXHxI2FjJirVBRdXu1lYeYSEBXvbW9iEJz/nJjZ104H8N+wIwgLlz4eMpMBJfabvoG8ETYC6JoKA+AiPkx9wQvXpQkUhpVjG9s6lx+znrjixKzbU09UzICxq8Yq4VYvnR3pOke2ku+Ud+wms1gOSPdgRpEmo+v7s9ErLEUP9b2AnCDRcp33aMU1MzvMG3XyrM4PNQpL3xUX4uLn7hkTExK5evSwqMtBogJjigvtQpzYMksXYEYRraoqy9i5ws7N3cnZymDtTQ3tuzKEH3/G7RVApf31igYO5nU9oaJCnjbnD0lPvuI9ZAqEjyAZcXXhtjZuFmelMjZFDhitPNg/f/6iYbQtL+X5nV4jFzJmmVvaOdpbOSy9+YrEuQYHD8iJf1Mhi/njAXU9nwghZceQ+lA5yI9R19HyPMqdKawrORptra82wdvP03pBBVJ3VhVfXuMyePsvE2t7WZI71/ANPsKHS3O3mykOxL+3Ya7TGFIPV92if0Kj6cG6lk974iYZuIRERYcELEx+W1P7N3mQ+XlFF3+/QK2bP+8/Tvd6zNCcbOXi4hRx4hS0Kvb9ab9QAaVRaA2HpwWpmWzDnZITK/DPLXGzsXd3dnG0tDI0dFp98y2wUS9P8VUf27kR9qnbSCqraCy7VfDvuOXFsH9o5UZlharrLb2FXs4Nyw5fc8NIRt/uv0baG3IYdQVoCPsv/TP8h8krjhvSUFJfsOUxtuv2S1JcsozxlmYvG91CNyaJ/UHTBa5jctB1v8LZHeZNo0EvB4RT9JS57uFqjx+joDD4Sq9Dy2fFxv4u21hSDua5h5qORHFJj7+RxzLLr4PGjB3SX6NCl3ygNA8/4qwXEHvynDROAkMVRZi1avMvB7yZ2TKP6yfJx0pO3v23tOhVaWtORHqurpT3D2M7XbYosAF2cz2HnCTRYp1UfMRcFE+NxY9Dn3R0OEUfnPiXO6jYqOgvKAE6ABv/PfD8XYhN55j3dCGs+7DOSBu2GuJ76gp1BqXy4ZmKPMeE36Vv1/7oZNFpWe91TRuQSCHcIrAFXP9toPCv0ZB6tn0X5mRk3XQ4Id5+5jdA7Q/jzIE6v3xDT9Xd/0Nrfiqerp83aJKjOTRyWF/kiWE8JELCwWhY+y/9M/ylR9U/rV92PGibczeMyvjUsOWTSUXzC2jdYsra2YOcUCZEZuxjByhAot4Pkhfr7pvPNnETbs/zbwSq+17HjhjlsiuRQnUp1yjZ84bJww7c7kPNPx1IoF9yck3GtZfWzWBVp3a15rV+nwjqWK3LX6s09xBJGvy6oMSbqVKoN1Gl5sUpAyPQwzjqfLXBeg3pR0fm016CbYiScT+UQaPD/yrs4ZSFxWZUFmYyxPspZO3QyYxgzLifl2VIl0c42hGXTZf/ZdRYdHcuBZx6kHgTVgHPjZ1gd+o4laPxKNusCQHvlFfg9Md/vmindUTM+l17lVV10Q5deTt1ejJ0QMDgsL/JFsJ4SIGBhtSx8lv8N9uooVzxlQSfbM8Rh25IkfQBGMZw981apAKC5BXOgp4OuxJZyvcAvA75tz/JPWYuZHsOOG+aflOrzJSNAB0dcGIDKZHefK9hxbW3Ns5VqMpM3t4H5VBRYx3JBVvigRkTC/yel+nvHNAD0EnDrUm/5ue9lzqkWHjDoPiI6C+pUToEG/688XTQMycT2+vuZ0iE7bCByStT6BF1eoCFU2pkfIc79Vx0zFQGDIx5gSQhXCKgBF27UAqLdxwWfxS+xr06ZJ4r8n3HLGROmH3fNkAC9fG/gHERebNLp0X10BP6UIMFheZEvEtBibpvAwmpZ+Cz/G+zV3Q/pD0C/IIIjPcJFt84ATIx/T0183TxZCACToyQd8nr5aAB6kXxAW462Z/nNqFQrUi3EwTTc1tI5C1020Gepal7Eqcpot435VBRYx3JBMyrV2ttB/cCIhVi0f4SiBOdwxu53X/Ybyo6MvAd1KudAg/9nSnMvJqfc+4xbPrFfvz0A7SZtpr8TTxeNBEDa6yqWpHMb3Whi9BJGhAAIFwioAb9cNhZ5cnJUWmpQWCBmjcWVpWSHKQDQzf0aLdkq4LC8yBcJaDG3TZq0sO6unDZ+1BD5ntISUzd/+5WVEB0a7qg3Xtf/JMOzqiI3dUmAp49fcKC3s6m+Wdi+bELQgNztFqpjhg3s3a3zkNDM2h/3EmMCvAMCvW1mak9z3/WIvIKy+svtbV7Gsy0dXBwtDW0Wpr3Iu7k1Kig0xGKy1vK7jDq/OGtnkKOzd1BokPtcQxOfHTm4GJBlb8+u8nf18PINW7AkJtjDN9xXb86aJnXe57OXhdarK8m9nrI7fuW6vWez3pcQ9MSHdejWwPheHQ3qVlJCxgfRXKacsGwHQEe7s7SPGBTvmorcqxTb6KhfTUPbq6Z4rFRrip6eT96+etWm5Ms5n8l7hVVlhih0NjmETQlU3Ah2241J25pXqyfI6Gx501Z0KmwQuYLXSrXuOg3h7Xr1DqrxWEVPebnCcTl9+/bPh0xlR0RAv99GAQ2e53xJ0GsHxEZH36Fb4q9tU5Bs7hdGHjN+Q1UrersF1I+TPxBUAy5+dDBuzb4swiAyNqc6lD5a9yBiAJKcvrO09s+rcztXLlq66eC5+x/r2EROQOCwvMgXCWoxt0matLBqKn59eJhgiG6/E7LCwf14UW3OguHIL07ZRoso+v2o5fDpm59hLgfV+UmG3UVHBNxgVrKUqpLCZ4cd+gDQ13tDnNvSdGyS5muCnhjo7ZOOV7XfL7gOEu5lc5Lmpv/rimd/0FE/6XNt7bfjnnpBZ6h3Vj3fYTxAVnPlI+zF/HPDf0jHoYHXaQvQf192Haa3rYDhnlrzds+cbow3vGngs5cl019Vzz0gaH3ag/wfv78+POgwcqDR5mzmkEDOgsHIE6usok2eMkG9PQHQ3oTWkb936yHH3T3JgTjL9s1CzssH88nmmXyW880AL5XqCKMg38iEy08/Fhd/TN84R0HR+egbYne++G6srprtvocFr2+s93Db/ZL2llNertXopr2pjfj90mh7lsYDeKlU66/TUCqeJ5qp6sfdyn97b2+Q08pM7NOvR0zkhkfdIzpYQhoCGjzPqKn4/fl1ZnLIRPkRFmsy6KGTENDF1QAMX/wMS9MpWK2KnFeOY2zUCGk8rciAqy64yiJ/Z+j8u7R+7edN2khSzPpwxirvRUcz83/+fJ+x03KUos32bOK2XIIEh+VFvqgVFXPrp+kL6/vmyQB0kzXf/AlJVL9NWxq1+TZNqFalmIsC0MH0GGNA52HUIHTWjei6UpNsBICEzMTYHGb39kmMImlA8cXSMQDI+jLlUU7EYCCkGINbSE55sVpdFIxYgq/cfyToAKFRMY+Qr646aSMuT/JrTffWjmSGdW4C+OxlebRg6ryjH5j5XJEZPABIGh2gLzm96YdWezRFiudV7Cjk/NhlaFClgni0rWRVpJUHDZDzUi6XsXQLw2c53wzwTqme9lIPuoLrNv06ZikN+npcI82sVn55eDpx886T2Z8xEVuTu16jm9YWut9v+cd7qdvit6be/9KqY6q2PUvjAbxTqg3VaRiUny8uH9i67Uh6Pj1A+bdksx6KEXcx260uenw2cd3Gg+n5gj3/0AxAg+cRhWeWB/j7OJlojZlosTDpJj7AOm3ZKqsi/bR2AnJeIfoRloZwQesx4I+79ToB0MflIt1zMDtyCPLvJMfOXHaG2YBX3AqQB9IWR9luSScAcFhe5ItaTzG3AZq+sGhuKmNW5GJpHIUnA2dOdznIdAetOmoiDIT0k4h9gWNon3lYND54WfGuGQCI2WOu9wg1yWYiAIxbzXTV/bpBE7ltWiJjpKjqPysJ8vdgNT7VJbX6tIMEkNaen/LsF8NV+G96yjl8XHiew/cvS4ZvTwD6+WAxe2lKVWcLdY98HC+XjUTOj17yGjmmKdUBoeSoDhUHZiPnOztdxNItDN/nPM/hnVJloeyIeXsgMn4l3WmSLZS89ZrdtTfl0kTDr8xYnUnuaXnf82+uc/c+mI/3j2hdtD1L4wG8U6qsEOu0Ovh2fG6P4eHYfGrFix1G6ua7cooKHyUFuGzMITu7Q/BAg+c1lbl7jHuALuoh5+j7vtGUqspasnfTxzXqyPmBkdlYGsIFrcWA32/X6wykdTc9ZXqF3A1FnX9Bb7/bzLE7pGm+7NIVgJ7u1+qtEvkWDsuLfFFrKeY2QdMXFlWpitucxpLsqPn99vbpw3sSNsY5jBUlhWFEoCrVGbvwe3GWosFmRaxPYEkEql8xvoKmdkd6+t3GknTP1QH64TF4Iueg68s90N07Sm/PH9sBuQQIdew1Ssfcc9lBfEiDpqHp8/8fIa6HebwQHZHT3ECaj8BiFdLOlyROQ477BjJikmD82TOD7fkWAnkW7KjVUX7Ws6+kBAtiIkBYDDvGIdnb9RSbaaJGKVWaVCBuSkmC8maTTnetDdh8atXdwIGdrVKxkd7SNB8f+nHroxVbGi/IjhkrhZkiDvF2QEi0A5Zg0klGfwcbG2ucUq1rjR+O7ycsew2PuIv18PLWTuygtRGLrlD1INKFfgxhBzT4JuAN1d1XclYSzfTeLh+HJJVWkaM+5K8cz/Y8pBG0CgOm5G7Skeg6acU9QsNK9T0EYOZu4tb2NGfyQVEPsbRgwWF5kS9qFcXcVmj6wqJ2C3r43MKSBKoLb653mzp8wGjDgPiU9Kf5Rak2HWmrvfFQlarhfvz2JqxKtbYoxbwbGOh2gbaU9e+dkCFA1uTAe+bI0RlHVIaSv5xI6ZtzG4PnTR0l2x65FEFae9W9JnX2Qn4DO2p5KD9fXL/x7Cdxcqtq3xw0I/STqPUdbb5UeQXZ5ygrXB45b7CXOiSXaiECgAxLcLmibegKiVGL+SQsIfIs2FFbgUdzqpVfs69mvCM2dLVvV6Mdpy7Ol7A0GcrbrZNlNTfT4yj9OWbZAczax5iaqrnh75yIcyduVbQ9S+MBPJpT5aBOY8OPVKveI+Yzotdk+vcG45aj/iI0Xi13WA6Dq9YNNPim4CYa1RcAxRiq48rPrbpIYmgMOYrGC3RdFNBJIHs9QRpBKzDgn1cDR/bX3/aE3Hst3j0T+XcilqSOAG0qHhgdEEhvEQ7Li3xRKyjmtkPTFxZVqbKNo/PhiFkfYWF5sz0vGK/HOXsJbpVqxZUQS89Ia71pFq4ernaGBnarzucTfBlo0z6s0YAYFL0voL/XNSVv04/EO4/vAoRHxZID3fISPnpZSg4biqEZtDYfO0GlLBGNg9TOLJlaRpSLTlIA9Am4Q/2MyX92yK3KK2iduddLRiO3GCWT5qOp87Hd3C/xiZsnH+V8M8EbpfomTk0IgA7GBwkvKXULIiDHfkCqtjZ/i66s1kbM7xfhYdRQ0NWVucFqbfF215D72HFro+1ZGg/gjVLlpE5j4Ueabe/hYfT5VGyIzWAvbmzmtJvrSbzzHIQANPh/o/h8iGovuWGux+iuvlSeU5tVIDqXZnpU4SrlQY76cNVNGhfoFcIVgm7AFU/WT1W2OvKW2QP7lZdHCzVKiwUD9JOIYeJoU/HS3oK5dw2H5UW+SNCLuU3R9IVVp1K96iWHqM3pO3GepDUnLEUxpfpqd/xpLAgwZ0r1hu9s3CpVNtTcC+oPgIzbVXIfg/I+68EXtEMyw3A/0e/4zwlLSaDXlOOTfPSylCcbtRftNjroIkGC0KLeM7yJ/hxDcqSd6TGiCqUGlBu8IAdLIr1M1mAP1afsOwIJ2zR+WQnR9qop3ijV/DUThMR7acfdx79GlOs+3ZEX0mAvWweEd9v15DTX4/elOe3QCSjMx0f9OOHszFx13rpoe5bGA3ijVDmq04j8PG3TZ9j8OzgRi27BJe6AX76SFe5c/37CbRto8P/GvaB+SBYCYeOD+Ehzl9xl0LNjltIifpSfc0Y0qX4ScVS/NGk6AH0CM7AkhCsE2oApH4/b6jqmfsDPCHzdaOmLDSLXZPr3ZQ0jQt0nX2jqLuYO6IIEh+VFvkigi7mt0fSFVZdS/bFFB/nxUfhAv5RH0egyyCnbfqG7sdvROwOcKdXzLjKz99QfaPv97pldgKzDaeJVv096uB5C3tCibVMkDPYSVWlerFJnl/NNOAvITy9L4Q4n/0skr84CdANVOYujjOGEqkykTpNyOosXnMVJ+qLtlRl7ECJqZvMkMWHdrfghYco1756gj9sV0ve3HPyU880Dj7x/H8daL83Bv4wImcH9gfDgoJvEbhON9zun9pi0MZfwErHMqf5OcCGF3W49tD1L4wE88v7lqE7D8euUfb/hYbcJEw6sc6pn3FxT+cQ1hB+BBv9vVKZaSQ2aHXHwEd5waQtTO0xcS29mKTnRI4QlLI7iBwf/HrPsIDJ8YTapeoY0DgE24N+3osw8Tn4k1k7lx0xnMqNgvopTFwXq6/GV64f16gAM9L3WpCvdmg4Oy4t8EaynBIimL6xXi0cDIGV/jiU20fstOmJAVG3FU+yTP0/WOISt9h0EenveqPyRYOt9jfa6fd2CBvElRvEpiNdAzukn4TRn4fbJonI6gWu2bkNJ2JW4//jFe3k/iXX2zwsBoyR66W+m7x1FKX6wwcFx92v0lxClCkB3w4QXjNf174OYiWrR95rSdZ+vXhbKm53W5osvF2D9NMr3G1HqUl2UQq4QRtrKMqOVpMZG3KGrkqKzbgOkJ617gi9g5JtmdetndeIzNo9Wlh2r2nVowGU+2o+87VVTjVKqRdR914Yw5slxVNxdZuKw+W4R9mpV56e4Du0oN3XtA3bT5R92TO+hueH1/+3dd1zTaAMH8ICyFERBXOfe5wAVQQGRIXsLyBBQUREcqLhP7vy4XsWFip57r9NzbxQV9956LhQHLlRARZmFvkmTQtIGaFW01d/3L5qkaZo8Kc8vz5MnEv0YPm/x1eDcp3p6eN8Vynk9t2y/Xkn7BuRKqoLjg2sShHr3TdI1Ldl+0xjvD/at33L0BW7HOKHwzJDanPtUH8b0mVrqKNe/OBT4r1T4ak8/+4AFp1+K21Sz7i9yqUqoNfDfkML6Jc29McO0asuo4+Ib/N+fiGxZzfR/lxWl25LSUtYCnHf/bzu9SrWatijSvFnTxvWqa6nUGJTILEPKv7vAVl/PcQFT0815tNKzZjXTP08r7ZiGMh4vyYXwO6VEyvVgXZxp366Jnhr5GYRKlQYdutoFr7jPzBLJvLl+jI9FR9uekWP/GDty9MwDT/OFr+NH2bcx6hI4LfEtWSVY2sO4uYEmtQJCs1Zb8x6Lbglv/e1l+nsN6u4jgqhUx8gieDXz/JuPCRGiAbg5NOs7RCe8Yl9hyk3eMznIxdHNJ7h3Ty/PPpP3PWIqJhmre9nPOHx67fiIgcNHjYv+a+yQ8DFLLryRqGN/Y+QmMn8pBsGrxBnhQSEhgd5u9ta2buFzj7/muT77+b9/xgb69IocM3ZURED34Il7kqX/OeanHJ4R6hMQMWrsmMhe3n7DVl9ToJhKUrQ9X/5kSqqJk+2szdo3/01fp7KOjo62TrU6zQw7de0WuZ3zrLWchzv+DA3qFezn5WxnbecTteoaf8xMWeVSq8u84vtTi+SdHdpAN2gX87/x097BEf8qVvH4hn69kvYNyJRUH68Lte1q0rpRDV1tbbK0Vq5i0OD3DhY2nrGc5nnZftOEwg+HQxu0GHue58Jk0ixTTauFzHi/gmvj+0g9HARYUOC/XuGHOzv+19fdydWze/furrZd7YMm7ngg3SEpO2lHdJB38JDRY0YNCuzeM3rr/fK8rv6rUNIC/CDGWIXcdD5WCzn3PAuzH+6cEOTq7NHd29vbw6vPtPjnUi1JSoT8gsxfpZJcSMa3gSL4SQ5WwcPV3Zsa9V559sl7+jJkQe7ntGc3j60bb1+3oqbFvFJvYP2RcLL8KL/enpev9+838PYfj9rmcaIOC9LST03oYjZgz+P0lLNxYeFrkn/eDms4x7+AfL1/v4GcxEGNfh99VrI9lZZ9e6GLSY+VN9Ne31w3tM+cqwpzD4NCQoEHpYYCrFxkPF6SC+EwK5Gf42DlbA/Q1A87xlclzo3vV40wX1Dycx5/LJwsP8qvt+fPjew4hHpu8Hfz6tjGhOel9EnIenpmy4KZcf+ef/lT91fDOf4FHsbaB2z6nv3BMy/8u/M+f04VyU+9umvprNi1iY+UtpPc94ICD0oNBVi5yHi8JBfCYVYiP8fB+rTBs4Ku306+8ZRyDvbVq+C0VlGf1YiT5UfBnofvAyUNfiko8KDUUICVi4zHS3IhHGYl8pMcrNxbizyaNHOfc+YNuxNhQdrFxT1+b+q68JrCttngZPlRsOfh+0BJg18KCjwoNRRg5SLj8ZJcCIdZifxEB+vT3d1zR4YGhgyIjIoaMXzY4L4B3j2HTNt8XaGHFMXJ8qNgz8P3gZIGvxQUeFBqKMDKRcbjJbkQDrMSwcH6sbD/fxTsefg+UNLgl4ICD0oNBVi5yHi8JBfCYVYiOFg/Fvb/j4I9D98HShr8UlDgQamhACsXGY+X5EI4zEoEB+vHwv7/UbDn4ftASYNfCgo8KDUUYOUi4/GSXAiHWYngYP1Y2P8/CvY8fB8oafBLQYEHpYYCrFxkPF6SC5FvAwAAAAAAACgnTPgsFS4/AAAAAAAAgGJBUgUAAAAAAADFgqQKAAAAAAAAigVJFQAAAAAAABQLkioAAAAAAAAoFiRVAAAAAAAAUCxIqgAAAAAAAKBYkFQBAAAAAABAsSCpAgAAAAAAgGJBUgUAAAAAAADFgqQKAAAAAAAAigVJFQAAAAAAABQLkioAAAAAAAAoFiRVAAAAAAAAUCxIqgAAAAAAAKBYkFQBAAAAAABAsSCpAgAAAAAAgGJBUgUAAAAAAADFgqQKAAAAAAAAigVJFQAAAAAAABQLkioAAAAAAAAoFiRVAAAAAAAAUCxIqgAAAAAAAKBYkFQBAAAAAABAsSCpAgAAAAAAgGJBUgUAAAAAAADFgqQKAAAAAAAAigVJFQAAAAAAABQLkioAAAAAAAAoFiRVAAAAAAAAUCxIqgAAAAAAAKBYkFQBAAAAAABAsSCpAsD3dWGel0s3i46GzRvUqlbJa2MOM7kU/y3v5WRr0bFti4a19SrbzH/NTFZKD2Z31dfTUSPYVDS0dUlVtDVVyRcVNfWbmXuF/bH4yNNc5k3lLTtp63h/B2s7FzdnK1u//x19w0wHJZK0pr+bfddO7X5vXKe6jtnMh8xkmRV+TDq0aISvnY29s7unh4d3QFDfEXGJL7JenFoy2KVTJ1tXNztrp35Lrn5ilgcAAChvSKoAUOxIuD6TniiqmlX0axhUpfJTMRVNXQMDPR11FeY1pc2k+8wKZJByZt2SGVGODUQrcN0gQ1JNv3Noy7KZocba1Dss5pV7Us1PPR7j1cxqxiPm9beXn/lotY8B9XUITdcVL/OZycLCvE9pr5Kv7FsU2bUmOauJ+4RDKQJmXnn5eGRE60raJn+dyRAKzo1trkEQGl4bPzAzQR6F99f6tdCr3Sl8+zNmynf07uqu9UsmezepQJUq4xiJpPp679COBvqtfZfcLGCmsOU/2hphpKPeyG3qoafiE/L96fEmVYhKlbSIGj3WJmcLM7YGVCfP2XpRZ5kFfmrvEv7oVFOvpdvcK3nMlJ9B7pVYhwbV6ltFH05jpgAAKDYkVQAoIvjHW4VQMegatTLxbuqnvEJmctbFqOaiVKXSZe7jHGZqQe6HFzf2x/VvV4Ugagw6RU+UXcZyW2qNMiVVWuG+3lrkO8opqea+T0m6dfHkvlUTgjvXVqc2rUX0bWZeuUhfZk99CtEk+jozhUPwfKVbVXK2Wqvhpz4y08pD1qlhDQkVoym3qcOafSCkGvmZGi6r39JzQS43/mwpOqaE4ZR7zKTvLW+zD9VgL5lU05Za01umPyCRmVTs8+mRzSoQWuaz77GuiuRu8RVlXkLNcYUo1qT+bU1NMAg/wpd1FVLCgA5jLzN/yydrrRv97Sv12stzqUiw1c9E8lqAgrg7oUPQPuZvKUcjqPOb/CG3XYyoCgBKAUkVAIqkzu+iajjxulTV7NMKR1EFp3LveGZKsc9HB/6m6rtd7trrLn+qKihHUhWeHlaTfEc5JdUjo43ad+7qFBgV++/+aHPqy5ZzUn3P7NMSkqpQWHBlXBPREtUDtr9npn17B/vqEkSrKXeZl5+fnU048+Qz8wrkI7g0zbiqqmrV9tEnf9guPBtVjywzUm2qT5a71VQjKjUN3SbVtTtthaM6QdSMPCm+MkXLODOqPXXJxjLuJT0h99WFrZvikz5yF1NgWevcm3xhUhW+3BhQR53QauC3MYWZwvYyzlJqDyuIY2G1S06qn48Ma16ZqGhgE3tDaS43AMCvDUkVAIrcjm5pvZSnOa20pEq9q0XXxXI3wilYUmV5t6Qb9WV/dFIVCvcHa4oWqeCwOoOZ9K09m2lCfoDD6kzmNXytrLT0bObPH6KEpErKy0jjTZmJA/QIQsVlvdQNqNsDKhKEeu8Sc4+CKzw+uPYXJ1VSfkbaB/48l7crSEdBk+rDGCONkpMqqTAzLeNn6tAMAD85JFUAKHIsrOOYa8zfbKUnVeHeXsYT5U51SKplJtWzkbVFi5S2zFe6PpZqt3Vcg2Fyfhanh/1GHlF5cpToTNTtd4R5WWyzD7kmvUHS3YWVw0Uys39NUi2R4HBoNbn28PfzNNaMKD2pAgAoFSRVABDL3+zZNY5v3Ncykuq18Z0HHmP+lhmSaplJNb53ZdEihMXCV8ykbw1J9Wdzamgd8oh+u6SqP/g481KpFD5e4axLnl3fPqkK7sy20JJvD38v6Qd71yOQVAHgZ4KkCgBiHxMmx57h6x9YRlLNiJ88/7y8d68hqZaVVB9MMxQtUcEsttyGkkVS/cYK8z6nv3qakv7DOlieFDXE8+UoQdb7NylP3mQxL4v8fEm1MP38xE7U8GtflVQF2R/ePH+cyrnjWJB6NKpNRWrNCpdUP99f7Fad2rLSk2pBbua7l49fflCau40B4NeGpAoAZSojqRb5+N+OGYN8nJ3cvTycrMzNrP3/2HTtXQlDdxQl1cLUE/PCfVxcPLw8XO3MzZ36T916h3e021KSavaD7ZP72BkbmTl4+vp6evj0n77/yRdnhbKT6uv9kcbVK9WynPkVj7AoK6l+OhLegJpfyXTGDea5qp+PTHK162pq9Huj36prm0xLEua/ODojzD+wh52ZhfeYXU84ezov5fCscFdTQ5Nu7j6+Xu7de0dvucuqdF+b2JZ6hqu26GlDqvQDXUm/jzvHLEAqTDu3NMrHwqiDlau3r7e7Z2DU0gvFN8wWnJnOPL/zt+o6rf66RtbiT88ZGBDg52Bu5jFiywPOuFylr0r4ZEO4c9ETc52WvqOK0tYp4SEhwb6uXU1MurpHxJ1+XUJBKnh1fMEQz85tjDpZWlmad+7qOXD6ngfSt4pm3d06MaRbByMzRy9REQmPOfi86OlAtMwHe2PC/YPCIiIGDhk6bFCIf7+pi2OCjfxWpTMLlObtap+6BlU06Cc6dZr9hJksFF7/O8DR2rxDm2b1a1bVCdpO7ou3l9eM6x8S0tPH0cKkk43PiJVXv2zErKwHO6f0dTTpaOnoGRAaFhYWOXN/cvaJIbXIDeDkqPgh9WpWrUSdbgTx27DzzFShcHeo6JhXEiWvClpVRK9YtEQzKhbN6LbgBfNOyvsra0b5W7ZrZ+nSvYePh6d/ZNzpt8Xx5+I8bwerzu1bNSF3SuOo02QBOL8wMtDf38mis+vgtXe4TwoufVUvtg136dbFxLBFwzr62paxz8lz4/7uaYN6hYT4uVqbduziEjb76IuiQ/liS5h5U132M7SKdJpNvlcGJ0e1rFWtsujLE7rhRQn+wcoA04aiJ2VJcVwhealH8Dpx/mCPTkYdbdx9enR39woat+5m8c3gHw9Hu9pZmhq1bER+JbM5j8mzNWFqf/8A327kmRy9N4UVIwten18d3cfDycXTy83OsrO5U78ZBx5KfFpOQrR1awPuQ5oZv40UH++7sbZ19HXU6D3juobnCqHg9YVNs0f08fNytrezNW9vbB04esnJl5yfuPcHRRtOn/SGf5G/kNlPDs8Z2jskJMDDtpOJuWOfKfseSz0GWvD2yvo/evv3DifPrMhhQwcEBg6d+/d4R6NhcvfEAYBfDpIqAJRJpqT67siIrpYD1t0S18cK3ySMNtEmdK1mXedrN6WTqtmAvwIDxm+/Kx7qJf/18YmW1SrUdpxzSeqRniUk1Q/XlgX/Xqmq5ZRz6XQ4Kkg7MdpQXbfjsP1f1me2zKSawewOQm9AAjNJfiUnVUFm8vHF/dtXJlT02gUvulKc2gWvrh/ctup/PZpTe671xJO7+1j33/M6/zX9+BCd3vvEFdzs+1sijatWahd14BVTg8+8FmNVWatlr00PuXmPblM1km4fErxImNCttkbDgA1JTOrLebzeu1bFes5zrzKtcm9uxu9YPTO4FTVAbIOxCUfCrYO3puRlrHWjqszqPtvEFVYZVvXp0Zl9mxaPsha1Cdks+u9QlHuvFf8xM3OuRhupEWptJlyWui6Q92zfOMvqmm0i/r0rrrwLUs8vD7Ww+Os0K5a/v/J3QAstPeuZF97TX1/w9lhka7VqpiMOp4pek7Iujmtb13XRLdbbspLWBdRVIawWytKKX5id8fzuufW9ROM1s5Nq+r1ju9fPH0CeCgSh0mPzky393AZtfcrsnA8J4Y0JQrvrggf0a1kVpp9fENhcS9t09P7n4rMr8/6ukfb2jhbUw404STX348uHV3aNNKUOFDupMkrs3SBqUyV8NkuNBV6Qeny6az2NOt2X/5dFl7m85/8G169Qy3bGOea0fXfnyM61saHtqJbNmoP3nhxh47/6UU72dl9qgqrrGvHZLcOqsp5c2L952R+Oopu2TWZeP/GnR2Dc9Ux66fxbMZ01iAotRpySuDhxfDD1a/FFbap5ma+Trx7406ISuQJWUhXbFaRBziilTTX38e6R5tU1W4btesYc5k93FjpUVW/qu/IufT7mv7x6cOvKKd6NqAsbRtNP7+hpE3EoVfBsfhdqQtWi9u3Ch+v9zZyiD4qLizD34frAJhUr1A3Y/Ex8srM8jDEi315Cm6rgc9rT2yfmeVK7RTqpFqQmTrSpVdt++olX4s/Kfrg10kS3cuuwf5OLrgPkvaA2fJKXaMOb/XH28ixvn2nn0umzqvDREnsdgqjXdz/nysubXQF1W4Tte1ZcjAoyLkyzqkJoKO1gXQDw/SCpAkCZZEmqqXGWKuq1jHuvZde5702mOrDWHnBY+qEddP2YaDninOS8tB099AmimufmohRB402qb/7trkfWhfsc4jQzCG5PJD9YL3DHlzw1sOw21eQlVmTuqNS47/Yv74ksTqoadY0sxMxN2jauqVNZv7Gxvd/gWbvv8Y/I+zLOjHxfc1s760hRHMtLHN1CS93AY+VTen7m0YH1yPTjvvYd/ZrxYqGVGqFls4zTk7iEpJp/e3J7NULVeMYDTrD9sCtIj1Bp89dVVnb5KHoubF1bW9uww1S0EFyY1Kaymr5tXBI9X45ViXuuOnv2mJ/MXvrNYurhu/r9D3EzU+ahsPpklnBYyo7fhVenGVcmCDXbxeJj83qdezWCqBNxlNPvNf96dEuy4ITsofPQq7+tCYOBJ0V/s+TuDtaVLaky6IDETqq0/B2BVIDv4hwQspFzXO5OaUVObzruBvNaFgX3Yi00yXMn6oxkU977Xf7k6cCbo+gY8w2SauH9WAsyq7X98zqnTfrzkX7k0WsSdZ61nuxN3VUIorqNrX1P+lS8GWNapWK1zrNu0DlLjlUJr/7RiNya1s7u3v+7z146c70Luf3aAbu52/8VSZX2ep4FuQL5k2r2uahmKoSGzdIXnCyZusZVi1Azi33AmkqPvP27rb3V6HNU4cw6Mryxpnot7zXMc4GEF6PqE9qNrMbFs4pM9uFQA4JQN5wu/fNUalKlCbbRR5ubVD8c6ldflag3IFGyPGXsCiJ3Y6NhEk9dSp7ZnlxJQ0eX7mMus1eUv7cnee5VdFrL6i9xYVRDwmSm1P0LqfO7aCKpAkCZkFQBoEyyJNUb45pSi6g6r2J33b3/v3bkRP0BCVItAHT9uAXfoMGFJ4ZQo8LUCNjO6XbJk1TTtvnXIKe1+999ZkKR2xNbkDNa/lli2iyZLPep5mekvPy6B0uKkypPVbgMn9bQ7zSezoRBcnNycsRxIuvUYKpGX3f4GU7ln/RqoRU5wyDiKGu7eZNqwZ0YUzJW6fhukYzKubv8K5FVYbeNrEYTOs8QLcbfYiYIBTk54s+Wb1XXo6mDRuj3jpdoIDsSrktObz8tmXlN+ZQ4mOoe3UhitOoPa1xF3SBNZ9HBPXWzD5XdOs54LHrJQn/3Nv8TPUv22EADQsNq0TNOnCalL3ewEj9QVBbnR1IbJZ1Uma9ANBp7mfsRgs2e1HR7zmlTKsHd2aZkVtL22sLz7KK8Lb5U0ylPjno+rxM546uTamHyQkst8sA5SVwIIY91fD9yT1ewW8o6Qff1plId8duIok7lBTk54qZx+VZFxzBCx3+buD2WcV402nGzv24yr2lfnVTfi34G5E2quRfGtiLDeY3+h8RNk2Lv1ziqkpsfvL+4ZwD9EWRxmVUU5Mgzubh85O4OEI2pZsAdsO5Q/2rkxA7Fp7+YDEmVOSKcpJp9cmhjclpLiT1IexpLpmmV5iMvsIvHuyXUTwmh7rhC4iLOvYmtyekGkcWXfLJWOVMXhA5IHDRqHL62IXuYvwEASoKkCgBlkqn375N94wO6hy44x6k+5270ot7YcQbT3leMrh93ns++9U2s4GiEqGWIO1c6qb5faUctVn3ICWYCy8FeVCXPcY3MAaDI9x1R6YuTavEdaGyC3aKHsFbw3S4ZVIXCS2Pqk7OMY1gpijepXhnVkPqALjzH5tVcc3JOzWGnmdckOs9UDz/CF9zlWxWTVF1Wc1o/SfShb/YHqyqdutCKuuWu1pATEp+blXQgdtKsHcy9zu/+tqZWSQZ30Uu2gp09yV2l4rmBai96t1RUlHTbBExYsef0nVSmKyq5t1++kOcu0jKSaqVeB5nXRegTwUzmOJy7s6cOtamOK6Qq/xT6+JdfUv1vUhtqarv/PWImFMtY7kDO0e3H+pGgc1HloH3SpVHeVTFJVfrRzXQZrh11lnlN+0FJ9Wh/qvM14bZWsnVSKLw7gWo9Z1+bY5JqyRuZc2P1QJ8eQzcznYYZ9OU/Fd8tkmfclyXVN8tsqL689UZfZCZw3RadlKouq1mnAZNUDaXC8pMYY3K6VugB5jXpiugSZsVaFuGzNh669KjoYa4FaS9eSd9ODgDAhaQKAGWSdUQlWkFmyqV96xbOmTZhbNQgO6qBjzCdlcLMLELXjzvN4x3k5Bl1IZ8gNEP2sGrJ0kk1cZAo0FZt79VbikfbKmT9qt0MOW8AJClJUrVdztOkJrwlqg4Tmi2dmf3A4mdqQM6qO5w1aBJfUk1fTvW1JYgGXUOYNxbrZUUlT42A7cUVXTrPmM+VOsIkOVdFJ1V96T1CH/omY4tv6S04ECJqbrKVCi5cCX1FTZn6HbyZj2VxbaNNFpHOc0RBKevmXDtq9zAqVGnQwXXQnF135bzSUUZS5SlUpZ4IPE6LIhgZOVkRn6XEHPVtkmr2eg9qaaKOeRCzF1nsmpLz1NzWFu8zOhcZTpFq/iPJuaoSYxhdhjmXPEg/Jqk+ntWBnEdUbGbHfA+WnmZUT5GqEcUrZJKqy2r+bv5seelJp7avmD9zSvTooT1Nqfu5Vf22MvOKfFlSPRxG/lKSZ/AC/tv60xfZULM57bpMUpUuM3RS5d6A+u7ocCPqll+Ghn5zix5jlyamSDY6AwDwQFIFgDLJmFQz7+6cEmzVUq9qA8ueYxbtPHn9wYuMDT2oN/KMullqBT17vQv1NqLjDFZzi1RS/Uh1LCNJX9r/KsqRVFV8tkn2VKXsCaGGrCHqDGXF0VLwJVX6hkCC8NvK9wFS6DzjyvugGzlXRSfVmtLPRZFOqknT6Uf4+G7htPhJSl8mqmYTprOkOv9KK/x4b/+C0b2cOzasIopQFM0WIVuf8LUWl6CMpNp64j3mdRF5k+ouf9GotC1KGDO6nJPqg8ltqYlkupKpPYzORVYLJbv3UuRcFR3DeH6CFCmpHhtIdcwlqsg21Br9ERWCdjGveQjeXlg10su0QdXqvzuFTV5z8Pzt5NRb002pt/lvY5Yp8kVJ9cX8LuQEgnAoIS9/Xukkms++RMgkVU/JW5h5kyop/83lzTGD/Wza1BL9OolU6xx9ku9aGwAAG5IqAJRJhqQqSN7Ys6kaQWgbDtj6iHW1fJs/9UZ5kyo9aBBBOK9i9XCUblM9GiHqasffD/aLKUdSLaE+euPPltRaS6+tFuNLqmlLRR1miW5L+PKFFN4+ogw5VyVHUv2wmuoeyt/Nku1QH1FX2TITiyA7mzWycMGn59cPLBvfoy2VLrUdlst+o2r5J1W6E2mJ36i821TXulGdrvnOaD50LpJ+iAtFzlV9dVJ9Fx+zgj/d85IjqT7bEbOJ7rvxaAbVMZfaaXzdnSXRH1GZ3ceZI/PyTNsaBKFSw2bi8TfFl0uezKaOpExJtfBC3MxETl96qaSav7MnNYWwWcb/MKZ3otvbuQdRnqSam53NukyVn/Ho3LbYofYNqbup6w1IkOznDwDAhaQKAGUqO6k+mt+FqnrU6nVQorfkVj/qjXRltODRkYQH4hpcqRV0pluv8Wx2S5h0Uk3f4Epdo9foubOEemF+viwVRglKnVRz4vvpU6vl7xtM4u4SvqTK3JlGtJpQNEYSV0F+PquVsbSkKueq5Eiq4jU3HHWBmcDv3QpHqh6u3WtvCa26+fmiDd8T0oon+mXfmU4NsuuwmveWUD7ln1QLdgdT/Z41/bZKPbSHUs5JVZgUY0zly/ojLjETJBTm57P2dGlJVc5VyZlU6efKNh5TvO4X8x37St0lXLISkyp9JzB7QKP/JjkyQ0YJTg+muviW0BmeJGCffqUn1dzTw6mBjlQNJ9zinluPZ7HaVD/ciD8nvpBC52T1nnuZ16Ttvo7LOW2lUklVmDKXWh3ReDx3aDIx5lZzo6mskitHUn0TZ221RGIUd1JaYngz6jFficxrAAB+SKoAUKYykypz3b0Gd4xK0qMZHakZdFLN2eBaXGel68e8HXcF50dSg3DU7ccdMFI6qQrzTw2lgkGNAQl8OendGi+fNfwNBaWRJakWfnx2PyVTpi6tJSinpCoU3ptiRNb/Nbz/4bvDMiu+j1MMK/7zJlVh6moXqjJuWjwkKUvh1Wib4axUUGpSlW9V8iTVwkd/W1N3vzWMusjzyXnnJ0esEH1kTuIg6tE3tQed4tvAVys8AjZQpYwMeM35+tOmUQ/hsVpS+s2wLOWfVIX5Nya1Id+i15ev0Getc6dWV35JVfh+qzd1X2PrKaIxkyXdi7EdEF98XpSaVOVblZxJ9dr45uRU7T77mdfk+qa6lXFZg6PEpJo4iBpvnD1G1/mRbkWjjyfPNSd3Z0WH5Xw/PPnHB9tNLL5oU3pSvSwqSoTJTPaI15SjEdR9qkxSvTfVqmgT3y7uSr3DbmXR4Eef1rgHbGf+pkknVeGbTd7U1S3+/szPRDlW32sz62dXnqT6ep6FquMKni4VV/9oRuj0Zh1gAAAeSKoAUKYP9MCohFZwcb2P491KJ6r+oxt6gFPxENyZ6vQbNUwNPWrr83lmbmvF96SJ6scqqm1HX5DoAFb4YrmdFkHU6yd6PCfLuRFUc4VZLKcr5vuTIw01CLUO025JtjBlJERYRiR8weiSqfRwsZyRZrmSlnTTVyVUaoTuK3solJKkMftUu/8hZoqsMkUdXzktJxzZ12d3qUKoNI08Jfmk2uyLf1oHbmbXGq+NoZptpK4XFDxd503ubP0e/0q2hhQ8WursOJs9WOs/3tTX8P6nhNZreVZFp4sag6QaWk4NpcJBY+4DaQqTF1hVJggdp2VPJCrMOfdinZziHjOttRlHh7VWI9Q7z7wjWa9Oiw/tOuSUqM5ONUXqe2yS6uabNL0D0WrCHeZV2c6NoMZX5kmqCQOoUNZqglQo2+lHjbxqWlIjHJ+cMyOaqxAa5nPuS9TzP12bQj3Ahno8k9TzWemmM56kSm+Ay3qpU4U+sl4bJYa+KXy+LbieClHVZRX3iaHknJS1XrZTb7M2am8vqquFA7dZr5g8q6LvTOYZPJkuwzWGnmJe07J2Uo/2ZK6RUbL/6em/mT8x88oQPcSXJ6mmr3ah7hR2XCH+UumLfULji4p/3r0Fdnpkkg07JDlmdO6tGbbd2c91oT+iUgktvbfpjvxtJ3NLX2ZCeAcD6q4H+2XUD+TpYe2Khz6/NIIKt6y7IU4N8+L0SxEfEU5SJX/ytniRWbWW307JKzKZ8f3qEkTtXru5UZOJxB5SJ/1j8nQhf5t6Ff82UY+lVW0WeUpyzxcmDNCv6CJ7ZwUA+EUhqQJAqQpz0m4sdBDdD0oQDfpse5CRI1GppOSc+astWTHUaDc68Q1Tu/x8d0OYS8TOS3GWGoSq4Yj4aycmuXivKnpaCZlUVQ0nJmwNMbKacCyViZmFH64u7t5Qw6DLyN3J3Cae/MzbMyypth99303Ps9lbUPjy4CiLmhWqdR61M+kzPSPvzcWVYdZuMZflDpKF2e+ux9qJxsKsYDLh/Gv2LVZFMlY6Ub0WyZDEfhqDPPI/3FvsJurgTBCtR5x4k8X3MbwKcl7uChV1MGw15vx7nkY1kYzTMY711Su37bvuJrNMQcZ/m0fa2486wqpyCj4lxdmIrjB4r34qmVNybi/v2aqyWoPuc0+Jj87n5PhpHla9/31SVD8tyHlzJILKCUTTwUfSS8iqsq2KPMIPYkVbo2o27d4n1jcTZP4X04UKU5p2i5I5e6ow/eL8Hs00VOv6LLn+gZ4hyHx8eIpD556bk1kLFj7fE2VWvYJ+l7G7k8VF5PX5ZX2sPOZeZWrQVFJV1appFrH5TlGhEbw9O8O6vunUS5KJvwT5n97cmG5JPc21du9d7L1RmJtxcXx7ajdpu658yi69eelnR/9Ozajec8vLXJ4TqwT5yRt7t9DUaB68+rZ44/JeHo52cRk3pBuVRFQado/ZuDfxxgs6ZRZkpSet8aUKnIb9Us6gq3lpp0eKAlGToYmcA5j77vgQ6roB0SDsQJpkOcu7v6Fv2yoV6zpPT3zBnKdZz47N8rXqueZB0RWjwty0UyOpx2sSdfvseyN5IUlMplUJBZ8fLXUVDfbcbsK1j+zC8enhwm5Uq32FrrPufWYXjpzzo1tWJCoa/nWFKtrZVyc7990l6/OGCnIyHm8Nok4zla5zHkn+4H1ICGugQmiZx96jdtjHkyMdhh3j/FplXprr2URDs0XwssvMPi38cG9ntJPtoAOvitZVkP1iWyDVQ5loN/4S+ysVeb0tpC6ZifUcF9xiymThu7Oz/NwmnTke1ZAgqjjEnr22M9xm4NHic/d+nCW5l+r3PUD1/Rc8WerrtaT4mklh7seXJ0aJhrFqEXWe2yPkw+V5zr9VqNIhfONt8Wd9vL95kJG2nsmg9UVlTESQnbI5UDRMdpNhnDJTkP1svZdoRKn20ZfF34hKqoR6pSaOkxNSio5n9pPdQ9o09Fj/mO9rAwCwIKkCAJ8P67vr6xvUqllNi8oIXOo61fT19esM5jYG5j6JnzO0R5dWLY27efgF+vn2Gr3iwluyXiZI2T/e27xde+ves0+xLtlfiotYdI2s35FpY+VIX1srJ093m46tWpt1H7bolDjsMs6MaalNVb+LqGpVdVjCbv4qfH9tXXQfD8t2bTpYOrg4OXoPXZSYwo26ZUiKtaxJfltNOoIW09CtUbtmi1HcB7a+2x/eWq9Ga4/Z5+Roo6ElxdrWqlGFSjMcFStX0w/eWsYWk8dEkwrrxdR1a9Qynsg/TMzn+9umDvC2MW7bztzOxdnBo/+c/UnFNc67M00rc7aiYqUq1fR6/MP5QnkpR+ZFBjiatm3b2cbJxcEleOI/N9LFVW3BjkAt7taoValRq+U46QeXUkpdlfDWJEN1zp5X0ajSbAS5pjNjmlfifAg5o91kzhf+fOffib26tW3RumMXWzsrM9vgSZtu8NyjW5h+ec243u4W7doYi4qI7/Alp5gcRzkU2Tl0S3Lm4/iYvh4u7l6+/j2D/D19Bs0/nCxjTL00uhH3TKlYufV4qm3r6JDaosF6i6hq6XaaeVco3NNPV5Pzlgpksf6br5c0v5zHh+YN9jRvb2rt4u3Xw9unz+S9T/OFu3rp6lSv07BFW2Mza4dh298Ihc/iRJd4ipGnT5895AqkNoAshVQhFOwI5s5QVdeuqtdsDPfI5r86uTAqyKmzYVtTaycXR+fAP9Zfflt04h4I0+N+64o6BrUaRR5mZnOVvqqk2WbcwkH+ANWmfnyuTzaszPkQFQ2dlqytFLw+OTfCo4tR6w6dTTq5TTsr4wOH0lbaSxwwTd0AiRPj2aHpfV3NDFt37Gxi5ht3nafnRvajvTMG9ujWsa2hWTdnFwe30Ok77xVtQNpqZ+6eF53JnaZL3c394eY/E/u7dWzRurOjd0CAr1/Y5B33qAL5+faagY4djUxchq7jxkjh+6uryJ/TDq2NOpma2ETtLf6V3BcqGlusmLpO1zmcjsWfHuyeNcizU+tWHcxsnNzd3L1DRy8+k8r5LU5dLrnhanSZSZ5vqc39VVPTrh1+gOo+72/55/G3GTc3jQlwdfPs3iMwKMjbI3DcmouvS7p4AQBQDEkVAAAAAAAAFAuSKgAAAAAAACgWJFUAAAAAAABQLEiqAAAAAAAAoFiQVAEAAAAAAECxIKkCAAAAAACAYkFSBQAAAAAAAMWCpAoAAAAAAACKBUkVAAAAAAAAFAuSKgAAAAAAACgWJFUAAAAAAABQLEiqAAAAAAAAoFiQVAEAAAAAAECxIKkCAAAAAACAYkFSBQAAAAAAAMWCpAoAAAAAAACKBUkVAAAAAAAAFAuSKgAAAAAAACgWJFUAAAAAAABQLEiqAAAAAAAAoFiQVAEAAAAAAECxIKkCAAAAAACAYkFSBQAAAAAAAMWCpAoAAAAAAACKBUkVAAAAAAAAFIlQ+H8pQOiFp+c2hgAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Iteration 1\n", + "\n", + "![Untitled.png](attachment:Untitled.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Preference elicitation (aspiration(desired) and reservation(least acceptable) levels)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min and Max costs of available therapies are as follows:\n", + "minimum cost= 120 , maximum cost= 1800\n", + "Please enter your preferred budget for the cost of therapy:300\n", + "Please enter your maximum budget for the cost of therapy:600\n" + ] + } + ], + "source": [ + "\"\"\"\n", + " Setting the aspiration levels/goals for each objective\n", + "\"\"\"\n", + "print('Min and Max costs of available therapies are as follows:')\n", + "print('minimum cost=', min(c), ', maximum cost=', max(c))\n", + "\n", + "g1 = float(input(\"Please enter your preferred budget for the cost of therapy:\"))\n", + "r1 = float(input(\"Please enter your maximum budget for the cost of therapy:\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Possible percentage of improvement in WOMAC pain=[ -5.0 %, 28.64 %]\n", + "Please enter your preferred percentage of improvement in WOMAC pain:30\n", + "Please enter your minimum acceptable percentage of improvement in WOMAC pain:15\n" + ] + } + ], + "source": [ + "print('Possible percentage of improvement in WOMAC pain=[ ', \"{0:.1f}\".format(min(pnet)*5), '%, ', \"{0:.2f}\".format(max(pnet)*5), '%]')\n", + "g2 = float(input(\"Please enter your preferred percentage of improvement in WOMAC pain:\"))\n", + "r2 = float(input(\"Please enter your minimum acceptable percentage of improvement in WOMAC pain:\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Possible percentage of improvement in WOMAC function=[ -7.06 %, 26.29 %]\n", + "Please enter your preferred percentage of improvement in WOMAC function:25\n", + "Please enter your minimum acceptable percentage of improvement in WOMAC function:15\n" + ] + } + ], + "source": [ + "print('Possible percentage of improvement in WOMAC function=[ ', \"{0:.2f}\".format(min(phnet)*100/68), '%, ', \"{0:.2f}\".format(max(phnet)*100/68), '%]')\n", + "g3 = float(input(\"Please enter your preferred percentage of improvement in WOMAC function:\"))\n", + "r3 = float(input(\"Please enter your minimum acceptable percentage of improvement in WOMAC function:\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min and Max number of supervised training sessions in available therapies are as follows:\n", + "minimum = 0 , maximum = 40\n", + "Please enter your preferred number of supervised training sessions:0\n", + "Please enter your maximum acceptable number of supervised training sessions:15\n" + ] + } + ], + "source": [ + "print('Min and Max number of supervised training sessions in available therapies are as follows:')\n", + "print('minimum =', min(st), ', maximum =', max(st))\n", + "g4 = float(input(\"Please enter your preferred number of supervised training sessions:\"))\n", + "r4 = float(input(\"Please enter your maximum acceptable number of supervised training sessions:\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min and Max length of therapy (weeks) among available exercise therapies are as follows:\n", + "minimum = 6 , maximum = 26\n", + "Please enter your preferred length of treatment (weeks):8\n", + "Please enter your maximum acceptable length of treatment (weeks):26\n" + ] + } + ], + "source": [ + "print('Min and Max length of therapy (weeks) among available exercise therapies are as follows:')\n", + "print('minimum =', min(t), ', maximum =', max(t))\n", + "g5 = float(input(\"Please enter your preferred length of treatment (weeks):\"))\n", + "r5 = float(input(\"Please enter your maximum acceptable length of treatment (weeks):\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Aspirations = [300. 6. 17. 0. 8.]\n", + "Reservations = [600. 3. 10.2 15. 26. ]\n" + ] + } + ], + "source": [ + "# Storing the goals \n", + "Aspirations = np.array([g1, g2/5, g3*0.68, g4, g5]) \n", + "Reservations = np.array([r1, r2/5, r3*0.68, r4, r5]) \n", + "print('Aspirations =', Aspirations)\n", + "print('Reservations =', Reservations)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Solving the multiobjective optimization problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the size of the problem is very small, we can find Pareto optimal solutions by comparing objective values. However, any other optimization methods can be used here. " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ASF values = [0.28236055]\n", + "Final solution (ASF)= [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0.]\n", + "Selected Therapy: [3]\n", + "Cost = 160.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = 20.5 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = 17.8 %\n", + "The number of supervised training sessions = 8.0\n", + "The length of therapy (weeks) = 8.0\n", + "Autors(year) Cheung(2014)\n", + "Therapy Youga\n", + "Name: 3, dtype: object\n", + " ASF2 values = [0.28235953]\n", + "Final solution (ASF2)= [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0.]\n", + "Selected Therapy: [3]\n", + "Cost = 160.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = 20.5 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = 17.8 %\n", + "The number of supervised training sessions = 8.0\n", + "The length of therapy (weeks) = 8.0\n", + "Autors(year) Cheung(2014)\n", + "Therapy Youga\n", + "Name: 3, dtype: object\n", + " STOM values = [9.85359845]\n", + "Final solution (STOM)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 1. 0.]\n", + "Selected Therapy: [29]\n", + "Cost = 120.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = 14.5 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = 13.5 %\n", + "The number of supervised training sessions = 0.0\n", + "The length of therapy (weeks) = 24.0\n", + "Autors(year) Evcik2(2002)\n", + "Therapy Walking\n", + "Name: 29, dtype: object\n", + "AUG_STOM values = [9.85358553]\n", + "Final solution (AUG_STOM)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 1. 0.]\n", + "Selected Therapy: [29]\n", + "Cost = 120.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = 14.5 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = 13.5 %\n", + "The number of supervised training sessions = 0.0\n", + "The length of therapy (weeks) = 24.0\n", + "Autors(year) Evcik2(2002)\n", + "Therapy Walking\n", + "Name: 29, dtype: object\n", + " Aug_GUESS values = [-0.72857182]\n", + "Final solution (AUG_GUESS)= [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0.]\n", + "Selected Therapy: [3]\n", + "Cost = 160.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = 20.5 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = 17.8 %\n", + "The number of supervised training sessions = 8.0\n", + "The length of therapy (weeks) = 8.0\n", + "Autors(year) Cheung(2014)\n", + "Therapy Youga\n", + "Name: 3, dtype: object\n", + " AspRes_ASF values = [-1.09999944e-06]\n", + "Final solution (AspRes_ASF)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 1. 0. 0.]\n", + "Selected Therapy: [28]\n", + "Cost = 120.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = 15.0 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = 14.9 %\n", + "The number of supervised training sessions = 1.0\n", + "The length of therapy (weeks) = 24.0\n", + "Autors(year) Evcik1(2002)\n", + "Therapy Home exercise\n", + "Name: 28, dtype: object\n", + " ASF3 values = [36.0000008]\n", + "Final solution (ASF3)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 1.]\n", + "Selected Therapy: [30]\n", + "Cost = 480.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = 25.6 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = 26.3 %\n", + "The number of supervised training sessions = 24.0\n", + "The length of therapy (weeks) = 8.0\n", + "Autors(year) Krasilshchikov(2011)\n", + "Therapy Mixed\n", + "Name: 30, dtype: object\n", + " STEM values = [2.69114636]\n", + "Final solution (STEM)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 1. 0. 0.]\n", + "Selected Therapy: [28]\n", + "Cost = 120.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = 15.0 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = 14.9 %\n", + "The number of supervised training sessions = 1.0\n", + "The length of therapy (weeks) = 24.0\n", + "Autors(year) Evcik1(2002)\n", + "Therapy Home exercise\n", + "Name: 28, dtype: object\n" + ] + } + ], + "source": [ + "n = n_variables\n", + "opt_sol = np.ones((n,))\n", + "opt_sol2 = np.ones((n,))\n", + "opt_sol3 = np.ones((n,))\n", + "opt_sol4 = np.ones((n,))\n", + "opt_sol5 = np.ones((n,))\n", + "opt_sol7 = np.ones((n,))\n", + "opt_sol8 = np.ones((n,))\n", + "opt_sol9 = np.ones((n,))\n", + "\n", + "\n", + "for i in range(n):\n", + " if ASF(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < ASF(mo_problem.evaluate(opt_sol).objectives, Aspirations)[0]:\n", + " opt_sol = np.identity(n)[i]\n", + " \n", + " if ASF2(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < ASF2(mo_problem.evaluate(opt_sol2).objectives, Aspirations)[0]:\n", + " opt_sol2 = np.identity(n)[i]\n", + " \n", + " if STOM(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < STOM(mo_problem.evaluate(opt_sol3).objectives, Aspirations)[0]:\n", + " opt_sol3 = np.identity(n)[i]\n", + " \n", + " if AUG_STOM(mo_problem.evaluate(np.identity(n)[i]).objectives, preference={\"reference point\": Aspirations})[0] < AUG_STOM(mo_problem.evaluate(opt_sol4).objectives, preference={\"reference point\": Aspirations})[0]:\n", + " opt_sol4 = np.identity(n)[i]\n", + " \n", + " if AUG_GUESS(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < AUG_GUESS(mo_problem.evaluate(opt_sol5).objectives, Aspirations)[0]:\n", + " opt_sol5 = np.identity(n)[i]\n", + " \n", + " if AspRes_ASF(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations, Reservations)[0] < AspRes_ASF(mo_problem.evaluate(opt_sol7).objectives, Aspirations, Reservations)[0]:\n", + " opt_sol7 = np.identity(n)[i]\n", + " \n", + " if ASF3(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < ASF3(mo_problem.evaluate(opt_sol8).objectives, Aspirations)[0]:\n", + " opt_sol8 = np.identity(n)[i]\n", + " \n", + " if STEP(mo_problem.evaluate(np.identity(n)[i]).objectives)[0] < STEP(mo_problem.evaluate(opt_sol9).objectives)[0]:\n", + " opt_sol9 = np.identity(n)[i]\n", + " \n", + " \n", + "f = mo_problem.evaluate(opt_sol).objectives[0]\n", + "f2 = mo_problem.evaluate(opt_sol2).objectives[0]\n", + "f3 = mo_problem.evaluate(opt_sol3).objectives[0]\n", + "f4 = mo_problem.evaluate(opt_sol4).objectives[0]\n", + "f5 = mo_problem.evaluate(opt_sol5).objectives[0]\n", + "f7 = mo_problem.evaluate(opt_sol7).objectives[0]\n", + "f8 = mo_problem.evaluate(opt_sol8).objectives[0]\n", + "f9 = mo_problem.evaluate(opt_sol9).objectives[0]\n", + "\n", + "\n", + "selected = [i for i in range(n) if opt_sol[i] >= 0.9]\n", + "selected2 = [i for i in range(n) if opt_sol2[i] >= 0.9]\n", + "selected3 = [i for i in range(n) if opt_sol3[i] >= 0.9]\n", + "selected4 = [i for i in range(n) if opt_sol4[i] >= 0.9]\n", + "selected5 = [i for i in range(n) if opt_sol5[i] >= 0.9]\n", + "selected7 = [i for i in range(n) if opt_sol7[i] >= 0.9]\n", + "selected8 = [i for i in range(n) if opt_sol8[i] >= 0.9]\n", + "selected9 = [i for i in range(n) if opt_sol9[i] >= 0.9]\n", + "\n", + "\n", + "print(' ASF values =', ASF(mo_problem.evaluate(opt_sol).objectives,Aspirations)) \n", + "print('Final solution (ASF)=', opt_sol)\n", + "print('Selected Therapy: {}'.format(selected))\n", + "print('Cost =', f[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(f[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(f[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f[3]) \n", + "print('The length of therapy (weeks) =', f[4]) \n", + "print(df.loc[selected[0],['Autors(year)', 'Therapy']]) #Author\tTherapy\n", + "\n", + "print(' ASF2 values =', ASF2(mo_problem.evaluate(opt_sol2).objectives,Aspirations)) \n", + "print('Final solution (ASF2)=', opt_sol2)\n", + "print('Selected Therapy: {}'.format(selected2))\n", + "print('Cost =', f2[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(f2[1]*5),'%')\n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(f2[2]*100/68),'%' )\n", + "print('The number of supervised training sessions =', f2[3]) \n", + "print('The length of therapy (weeks) =', f2[4]) \n", + "print(df.loc[selected2[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' STOM values =', STOM(mo_problem.evaluate(opt_sol3).objectives,Aspirations)) \n", + "print('Final solution (STOM)=', opt_sol3)\n", + "print('Selected Therapy: {}'.format(selected3))\n", + "print('Cost =', f3[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(f3[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(f3[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f3[3]) \n", + "print('The length of therapy (weeks) =', f3[4]) \n", + "print(df.loc[selected3[0],['Autors(year)', 'Therapy']])\n", + "\n", + "\n", + "print('AUG_STOM values =', AUG_STOM(mo_problem.evaluate(opt_sol4).objectives[0], preference={\"reference point\": Aspirations})) \n", + "print('Final solution (AUG_STOM)=', opt_sol4)\n", + "print('Selected Therapy: {}'.format(selected4))\n", + "print('Cost =', f4[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(f4[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(f4[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f4[3]) \n", + "print('The length of therapy (weeks) =', f4[4]) \n", + "print(df.loc[selected4[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' Aug_GUESS values =', AUG_GUESS(mo_problem.evaluate(opt_sol5).objectives,Aspirations)) \n", + "print('Final solution (AUG_GUESS)=', opt_sol5)\n", + "print('Selected Therapy: {}'.format(selected5))\n", + "print('Cost =', f5[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(f5[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(f5[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f5[3]) \n", + "print('The length of therapy (weeks) =', f5[4]) \n", + "print(df.loc[selected5[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' AspRes_ASF values =', AspRes_ASF(mo_problem.evaluate(opt_sol7).objectives, Aspirations, Reservations)) \n", + "print('Final solution (AspRes_ASF)=', opt_sol7)\n", + "print('Selected Therapy: {}'.format(selected7))\n", + "print('Cost =', f7[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(f7[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(f7[2]*100/68),'%' )\n", + "print('The number of supervised training sessions =', f7[3]) \n", + "print('The length of therapy (weeks) =', f7[4])\n", + "print(df.loc[selected7[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' ASF3 values =', ASF3(mo_problem.evaluate(opt_sol8).objectives, Aspirations)) \n", + "print('Final solution (ASF3)=', opt_sol8)\n", + "print('Selected Therapy: {}'.format(selected8))\n", + "print('Cost =', f8[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(f8[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(f8[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f8[3]) \n", + "print('The length of therapy (weeks) =', f8[4]) \n", + "print(df.loc[selected8[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' STEM values =', STEP(mo_problem.evaluate(opt_sol9).objectives)) \n", + "print('Final solution (STEM)=', opt_sol9)\n", + "print('Selected Therapy: {}'.format(selected9))\n", + "print('Cost =', f9[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(f9[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(f9[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f9[3]) \n", + "print('The length of therapy (weeks) =', f9[4]) \n", + "print(df.loc[selected9[0],['Autors(year)', 'Therapy']])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualizing the results" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "dimensions": [ + { + "constraintrange": [ + 0, + 600 + ], + "label": "Costs(↓)", + "range": [ + 120, + 1800 + ], + "values": [ + 160, + 160, + 120, + 120, + 160, + 120, + 480, + 120 + ] + }, + { + "constraintrange": [ + 15, + 30 + ], + "label": "Pain_reduction(↑)%", + "range": [ + -5, + 30 + ], + "values": [ + 20.5, + 20.5, + 14.5, + 14.5, + 20.5, + 15, + 25.65, + 15 + ] + }, + { + "constraintrange": [ + 15.000000000000002, + 30 + ], + "label": "Physical_Function_improvement(↑)%", + "range": [ + -7, + 30 + ], + "values": [ + 17.794117647058822, + 17.794117647058822, + 13.52941176470588, + 13.52941176470588, + 17.794117647058822, + 14.852941176470589, + 26.294117647058822, + 14.852941176470589 + ] + }, + { + "constraintrange": [ + 0, + 15 + ], + "label": "ST_sessions(↓)", + "range": [ + 0, + 40 + ], + "values": [ + 8, + 8, + 0, + 0, + 8, + 1, + 24, + 1 + ] + }, + { + "constraintrange": [ + 0, + 26 + ], + "label": "Duration(w)(↓)", + "range": [ + 6, + 26 + ], + "values": [ + 8, + 8, + 24, + 24, + 8, + 24, + 8, + 24 + ] + } + ], + "line": { + "color": [ + 12.1, + 12.1, + 9.2, + 9.2, + 12.1, + 10.1, + 17.88, + 10.1 + ], + "colorscale": [ + [ + 0, + "purple" + ], + [ + 0.2, + "lightseagreen" + ], + [ + 0.6, + "gold" + ], + [ + 1, + "red" + ] + ] + }, + "type": "parcoords" + } + ], + "layout": { + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + } + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "r = Reservations\n", + "\n", + "datam = {'Costs(↓)': [f[0], f2[0], f3[0], f4[0], f5[0], f7[0], f8[0], f9[0]\n", + " ],\n", + " 'Pain_improvement(↑)': [f[1], f2[1], f3[1], f4[1], f5[1], f7[1], f8[1], f9[1]\n", + " ],\n", + " 'Physical_Function_improvement(↑)': [f[2], f2[2], f3[2], f4[2], f5[2], f7[2], f8[2], f9[2]\n", + " ],\n", + " \"ST_sessions(↓)\" : [f[3], f2[3], f3[3], f4[3], f5[3], f7[3], f8[3], f9[3]\n", + " ], \n", + " \"Duration(w)(↓)\" : [f[4], f2[4], f3[4], f4[4], f5[4], f7[4], f8[4], f9[4]\n", + " ], \n", + " }\n", + "\n", + "dfm = pd.DataFrame (datam, columns = ['Costs(↓)','Pain_improvement(↑)','Physical_Function_improvement(↑)', \"ST_sessions(↓)\", \"Duration(w)(↓)\"])\n", + "#df.describe()\n", + "\n", + "\n", + "import plotly.graph_objects as go\n", + "\n", + "fig = go.Figure(data=\n", + " go.Parcoords(\n", + " line =dict(color = dfm['Physical_Function_improvement(↑)'],\n", + " colorscale = [[0,'purple'],[0.2,'lightseagreen'],[0.6,'gold'], [1, 'red']]\n", + " ),\n", + " dimensions = list([\n", + " dict(range = [120,1800],\n", + " constraintrange = [0, r[0]],\n", + " label = 'Costs(↓)', values = dfm['Costs(↓)']),\n", + " dict(range = [-5,30],\n", + " constraintrange = [r[1]*5, 30],\n", + " label = 'Pain_reduction(↑)%', values = dfm['Pain_improvement(↑)']*5),\n", + " dict(range = [-7,30],\n", + " constraintrange = [r[2]*100/68, 30],\n", + " label = 'Physical_Function_improvement(↑)%', values = dfm['Physical_Function_improvement(↑)']*100/68),\n", + " dict(range = [0,40],\n", + " constraintrange = [0, r[3]],\n", + " label = 'ST_sessions(↓)', values = dfm['ST_sessions(↓)']),\n", + " dict(range = [6,26],\n", + " constraintrange = [0, r[4]],\n", + " label = 'Duration(w)(↓)', values = dfm['Duration(w)(↓)'])\n", + " ])\n", + " )\n", + ")\n", + "\n", + "\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Iteration 2\n", + "\n", + "Setting new preferences (upper and lower bounds)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min and Max costs of available therapies are as follows:\n", + "minimum cost= 120 , maximum cost= 1800\n", + "Please enter your preferred budget for the cost of therapy:200\n", + "Please enter your maximum budget for the cost of therapy:500\n" + ] + } + ], + "source": [ + "\"\"\"\n", + " Setting new preferences/goals for each objective (upper and lower bounds)\n", + "\"\"\"\n", + "print('Min and Max costs of available therapies are as follows:')\n", + "print('minimum cost=', min(c), ', maximum cost=', max(c))\n", + "\n", + "g1 = float(input(\"Please enter your preferred budget for the cost of therapy:\"))\n", + "r1 = float(input(\"Please enter your maximum budget for the cost of therapy:\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Possible percentage of improvement in WOMAC pain=[ -5.0 %, 28.64 %]\n", + "Please enter your preferred percentage of improvement in WOMAC pain:25\n", + "Please enter your minimum acceptable percentage of improvement in WOMAC pain:15\n" + ] + } + ], + "source": [ + "print('Possible percentage of improvement in WOMAC pain=[ ', \"{0:.1f}\".format(min(pnet)*5), '%, ', \"{0:.2f}\".format(max(pnet)*5), '%]')\n", + "g2 = float(input(\"Please enter your preferred percentage of improvement in WOMAC pain:\"))\n", + "r2 = float(input(\"Please enter your minimum acceptable percentage of improvement in WOMAC pain:\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Possible percentage of improvement in WOMAC function=[ -7.06 %, 26.29 %]\n", + "Please enter your preferred percentage of improvement in WOMAC function:40\n", + "Please enter your minimum acceptable percentage of improvement in WOMAC function:15\n" + ] + } + ], + "source": [ + "print('Possible percentage of improvement in WOMAC function=[ ', \"{0:.2f}\".format(min(phnet)*100/68), '%, ', \"{0:.2f}\".format(max(phnet)*100/68), '%]')\n", + "g3 = float(input(\"Please enter your preferred percentage of improvement in WOMAC function:\"))\n", + "r3 = float(input(\"Please enter your minimum acceptable percentage of improvement in WOMAC function:\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min and Max number of supervised training sessions in available therapies are as follows:\n", + "minimum = 0 , maximum = 40\n", + "Please enter your preferred number of supervised training sessions:0\n", + "Please enter your maximum acceptable number of supervised training sessions:30\n" + ] + } + ], + "source": [ + "print('Min and Max number of supervised training sessions in available therapies are as follows:')\n", + "print('minimum =', min(st), ', maximum =', max(st))\n", + "g4 = float(input(\"Please enter your preferred number of supervised training sessions:\"))\n", + "r4 = float(input(\"Please enter your maximum acceptable number of supervised training sessions:\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min and Max length of therapy (weeks) among available exercise therapies are as follows:\n", + "minimum = 6 , maximum = 26\n", + "Please enter your preferred length of treatment (weeks):12\n", + "Please enter your maximum acceptable length of treatment (weeks):26\n" + ] + } + ], + "source": [ + "print('Min and Max length of therapy (weeks) among available exercise therapies are as follows:')\n", + "print('minimum =', min(t), ', maximum =', max(t))\n", + "g5 = float(input(\"Please enter your preferred length of treatment (weeks):\"))\n", + "r5 = float(input(\"Please enter your maximum acceptable length of treatment (weeks):\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Aspirations = [200. 5. 27.2 0. 12. ]\n", + "Reservations = [500. 3. 10.2 30. 26. ]\n" + ] + } + ], + "source": [ + "Aspirations = np.array([g1, g2/5, g3*0.68, g4, g5]) \n", + "Reservations = np.array([r1, r2/5, r3*0.68, r4, r5]) \n", + "print('Aspirations =', Aspirations)\n", + "print('Reservations =', Reservations)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Solving the multiobjective optimization problem" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ASF values = [0.59998596]\n", + "Final solution (ASF)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 1.]\n", + "Selected Therapy: [30]\n", + "Cost = 480.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = -25.6 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = -26.3 %\n", + "The number of supervised training sessions = 24.0\n", + "The length of therapy (weeks) = 8.0\n", + "Autors(year) Krasilshchikov(2011)\n", + "Therapy Mixed\n", + "Name: 30, dtype: object\n", + " ASF2 values = [0.59998472]\n", + "Final solution (ASF2)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 1.]\n", + "Selected Therapy: [30]\n", + "Cost = 480.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = -25.6 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = -26.3 %\n", + "The number of supervised training sessions = 24.0\n", + "The length of therapy (weeks) = 8.0\n", + "Autors(year) Krasilshchikov(2011)\n", + "Therapy Mixed\n", + "Name: 30, dtype: object\n", + " STOM values = [3.8806649]\n", + "Final solution (STOM)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 1. 0.]\n", + "Selected Therapy: [29]\n", + "Cost = 120.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = -14.5 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = -13.5 %\n", + "The number of supervised training sessions = 0.0\n", + "The length of therapy (weeks) = 24.0\n", + "Autors(year) Evcik2(2002)\n", + "Therapy Walking\n", + "Name: 29, dtype: object\n", + "AUG_STOM values = [3.88066239]\n", + "Final solution (AUG_STOM)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 1. 0.]\n", + "Selected Therapy: [29]\n", + "Cost = 120.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = -14.5 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = -13.5 %\n", + "The number of supervised training sessions = 0.0\n", + "The length of therapy (weeks) = 24.0\n", + "Autors(year) Evcik2(2002)\n", + "Therapy Walking\n", + "Name: 29, dtype: object\n", + " Aug_GUESS values = [-0.53823767]\n", + "Final solution (AUG_GUESS)= [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0.]\n", + "Selected Therapy: [2]\n", + "Cost = 320.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = -28.6 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = -18.3 %\n", + "The number of supervised training sessions = 16.0\n", + "The length of therapy (weeks) = 8.0\n", + "Autors(year) Barghin(2017)\n", + "Therapy Mixed\n", + "Name: 2, dtype: object\n", + " AspRes_ASF values = [-1.09999875e-06]\n", + "Final solution (AspRes_ASF)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 1. 0. 0.]\n", + "Selected Therapy: [28]\n", + "Cost = 120.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = -15.0 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = -14.9 %\n", + "The number of supervised training sessions = 1.0\n", + "The length of therapy (weeks) = 24.0\n", + "Autors(year) Evcik1(2002)\n", + "Therapy Home exercise\n", + "Name: 28, dtype: object\n", + " ASF3 values = [99.0000011]\n", + "Final solution (ASF3)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0.]\n", + "Selected Therapy: [19]\n", + "Cost = 240.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = -17.0 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = -25.4 %\n", + "The number of supervised training sessions = 24.0\n", + "The length of therapy (weeks) = 8.0\n", + "Autors(year) Lin2(2009)\n", + "Therapy Strength\n", + "Name: 19, dtype: object\n", + " STEM values = [2.69114636]\n", + "Final solution (STEM)= [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 1. 0. 0.]\n", + "Selected Therapy: [28]\n", + "Cost = 120.0\n", + "Expected value for the WOMAC pain score after carrying out the therapy (Improvement) = -15.0 %\n", + "Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) = -14.9 %\n", + "The number of supervised training sessions = 1.0\n", + "The length of therapy (weeks) = 24.0\n", + "Autors(year) Evcik1(2002)\n", + "Therapy Home exercise\n", + "Name: 28, dtype: object\n" + ] + } + ], + "source": [ + "n = n_variables\n", + "opt_sol = np.ones((n,))\n", + "opt_sol2 = np.ones((n,))\n", + "opt_sol3 = np.ones((n,))\n", + "opt_sol4 = np.ones((n,))\n", + "opt_sol5 = np.ones((n,))\n", + "opt_sol7 = np.ones((n,))\n", + "opt_sol8 = np.ones((n,))\n", + "opt_sol9 = np.ones((n,))\n", + "\n", + "# ASF without normalization (as the DM had a strong emphasis on pain and function we set w=[.2,30,25,1,1] )\n", + "ASF3 = ReferencePointASF(preferential_factors = np.array([1,-10,-10,1,1]), # preferential_factors (w): np.ndarray,\n", + " nadir=nadir, # nadir: np.ndarray,\n", + " utopian_point=ideal-1e-6 # utopian_point: np.ndarray, rho: float = 1e-6\n", + " )\n", + "\n", + "for i in range(n):\n", + " if ASF(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < ASF(mo_problem.evaluate(opt_sol).objectives, Aspirations)[0]:\n", + " opt_sol = np.identity(n)[i]\n", + " \n", + " if ASF2(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < ASF2(mo_problem.evaluate(opt_sol2).objectives, Aspirations)[0]:\n", + " opt_sol2 = np.identity(n)[i]\n", + " \n", + " if STOM(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < STOM(mo_problem.evaluate(opt_sol3).objectives, Aspirations)[0]:\n", + " opt_sol3 = np.identity(n)[i]\n", + " \n", + " if AUG_STOM(mo_problem.evaluate(np.identity(n)[i]).objectives, preference={\"reference point\": Aspirations})[0] < AUG_STOM(mo_problem.evaluate(opt_sol4).objectives, preference={\"reference point\": Aspirations})[0]:\n", + " opt_sol4 = np.identity(n)[i]\n", + " \n", + " if AUG_GUESS(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < AUG_GUESS(mo_problem.evaluate(opt_sol5).objectives, Aspirations)[0]:\n", + " opt_sol5 = np.identity(n)[i]\n", + " \n", + " if AspRes_ASF(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations, Reservations)[0] < AspRes_ASF(mo_problem.evaluate(opt_sol7).objectives, Aspirations, Reservations)[0]:\n", + " opt_sol7 = np.identity(n)[i]\n", + " \n", + " if ASF3(mo_problem.evaluate(np.identity(n)[i]).objectives, Aspirations)[0] < ASF3(mo_problem.evaluate(opt_sol8).objectives, Aspirations)[0]:\n", + " opt_sol8 = np.identity(n)[i]\n", + " \n", + " if STEP(mo_problem.evaluate(np.identity(n)[i]).objectives)[0] < STEP(mo_problem.evaluate(opt_sol9).objectives)[0]:\n", + " opt_sol9 = np.identity(n)[i]\n", + " \n", + " \n", + "f = mo_problem.evaluate(opt_sol).objectives[0]\n", + "f2 = mo_problem.evaluate(opt_sol2).objectives[0]\n", + "f3 = mo_problem.evaluate(opt_sol3).objectives[0]\n", + "f4 = mo_problem.evaluate(opt_sol4).objectives[0]\n", + "f5 = mo_problem.evaluate(opt_sol5).objectives[0]\n", + "f7 = mo_problem.evaluate(opt_sol7).objectives[0]\n", + "f8 = mo_problem.evaluate(opt_sol8).objectives[0]\n", + "f9 = mo_problem.evaluate(opt_sol9).objectives[0]\n", + "\n", + "\n", + "selected = [i for i in range(n) if opt_sol[i] >= 0.9]\n", + "selected2 = [i for i in range(n) if opt_sol2[i] >= 0.9]\n", + "selected3 = [i for i in range(n) if opt_sol3[i] >= 0.9]\n", + "selected4 = [i for i in range(n) if opt_sol4[i] >= 0.9]\n", + "selected5 = [i for i in range(n) if opt_sol5[i] >= 0.9]\n", + "selected7 = [i for i in range(n) if opt_sol7[i] >= 0.9]\n", + "selected8 = [i for i in range(n) if opt_sol8[i] >= 0.9]\n", + "selected9 = [i for i in range(n) if opt_sol9[i] >= 0.9]\n", + "\n", + "\n", + "print(' ASF values =', ASF(mo_problem.evaluate(opt_sol).objectives,Aspirations)) \n", + "print('Final solution (ASF)=', opt_sol)\n", + "print('Selected Therapy: {}'.format(selected))\n", + "print('Cost =', f[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(-f[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(-f[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f[3]) \n", + "print('The length of therapy (weeks) =', f[4]) \n", + "print(df.loc[selected[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' ASF2 values =', ASF2(mo_problem.evaluate(opt_sol2).objectives,Aspirations)) \n", + "print('Final solution (ASF2)=', opt_sol2)\n", + "print('Selected Therapy: {}'.format(selected2))\n", + "print('Cost =', f2[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(-f2[1]*5),'%')\n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(-f2[2]*100/68),'%' )\n", + "print('The number of supervised training sessions =', f2[3]) \n", + "print('The length of therapy (weeks) =', f2[4]) \n", + "print(df.loc[selected2[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' STOM values =', STOM(mo_problem.evaluate(opt_sol3).objectives,Aspirations)) \n", + "print('Final solution (STOM)=', opt_sol3)\n", + "print('Selected Therapy: {}'.format(selected3))\n", + "print('Cost =', f3[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(-f3[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(-f3[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f3[3]) \n", + "print('The length of therapy (weeks) =', f3[4]) \n", + "print(df.loc[selected3[0],['Autors(year)', 'Therapy']])\n", + "\n", + "\n", + "print('AUG_STOM values =', AUG_STOM(mo_problem.evaluate(opt_sol4).objectives[0], preference={\"reference point\": Aspirations})) \n", + "print('Final solution (AUG_STOM)=', opt_sol4)\n", + "print('Selected Therapy: {}'.format(selected4))\n", + "print('Cost =', f4[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(-f4[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(-f4[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f4[3]) \n", + "print('The length of therapy (weeks) =', f4[4]) \n", + "print(df.loc[selected4[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' Aug_GUESS values =', AUG_GUESS(mo_problem.evaluate(opt_sol5).objectives,Aspirations)) \n", + "print('Final solution (AUG_GUESS)=', opt_sol5)\n", + "print('Selected Therapy: {}'.format(selected5))\n", + "print('Cost =', f5[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(-f5[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(-f5[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f5[3]) \n", + "print('The length of therapy (weeks) =', f5[4]) \n", + "print(df.loc[selected5[0],['Autors(year)', 'Therapy']])\n", + "\n", + "\n", + "print(' AspRes_ASF values =', AspRes_ASF(mo_problem.evaluate(opt_sol7).objectives, Aspirations, Reservations)) \n", + "print('Final solution (AspRes_ASF)=', opt_sol7)\n", + "print('Selected Therapy: {}'.format(selected7))\n", + "print('Cost =', f7[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(-f7[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(-f7[2]*100/68),'%' )\n", + "print('The number of supervised training sessions =', f7[3]) \n", + "print('The length of therapy (weeks) =', f7[4])\n", + "print(df.loc[selected7[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' ASF3 values =', ASF3(mo_problem.evaluate(opt_sol8).objectives, Aspirations)) \n", + "print('Final solution (ASF3)=', opt_sol8)\n", + "print('Selected Therapy: {}'.format(selected8))\n", + "print('Cost =', f8[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(-f8[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(-f8[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f8[3]) \n", + "print('The length of therapy (weeks) =', f8[4]) \n", + "print(df.loc[selected8[0],['Autors(year)', 'Therapy']])\n", + "\n", + "print(' STEM values =', STEP(mo_problem.evaluate(opt_sol9).objectives)) \n", + "print('Final solution (STEM)=', opt_sol9)\n", + "print('Selected Therapy: {}'.format(selected9))\n", + "print('Cost =', f9[0]) \n", + "print('Expected value for the WOMAC pain score after carrying out the therapy (Improvement) =', \"{0:.1f}\".format(-f9[1]*5),'%') \n", + "print('Expected value for the WOMAC phisical functionality score after carrying out the i_th therapy (Improvement) =', \"{0:.1f}\".format(-f9[2]*100/68),'%') \n", + "print('The number of supervised training sessions =', f9[3]) \n", + "print('The length of therapy (weeks) =', f9[4]) \n", + "print(df.loc[selected9[0],['Autors(year)', 'Therapy']])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "dimensions": [ + { + "constraintrange": [ + 0, + 500 + ], + "label": "Costs(↓)", + "range": [ + 120, + 1800 + ], + "values": [ + 480, + 480, + 120, + 120, + 320, + 120, + 240, + 120 + ] + }, + { + "constraintrange": [ + 15, + 30 + ], + "label": "Pain_reduction(↑)%", + "range": [ + -5, + 30 + ], + "values": [ + 25.65, + 25.65, + 14.5, + 14.5, + 28.64, + 15, + 17, + 15 + ] + }, + { + "constraintrange": [ + 15.000000000000002, + 30 + ], + "label": "Physical_Function_improvement(↑)%", + "range": [ + -7, + 30 + ], + "values": [ + 26.294117647058822, + 26.294117647058822, + 13.52941176470588, + 13.52941176470588, + 18.270000000000003, + 14.852941176470589, + 25.441176470588236, + 14.852941176470589 + ] + }, + { + "constraintrange": [ + 0, + 30 + ], + "label": "ST_sessions(↓)", + "range": [ + 0, + 40 + ], + "values": [ + 24, + 24, + 0, + 0, + 16, + 1, + 24, + 1 + ] + }, + { + "constraintrange": [ + 0, + 26 + ], + "label": "Duration(w)(↓)", + "range": [ + 6, + 26 + ], + "values": [ + 8, + 8, + 24, + 24, + 8, + 24, + 8, + 24 + ] + } + ], + "line": { + "color": [ + 480, + 480, + 120, + 120, + 320, + 120, + 240, + 120 + ], + "colorscale": [ + [ + 0, + "purple" + ], + [ + 0.2, + "lightseagreen" + ], + [ + 0.6, + "gold" + ], + [ + 1, + "red" + ] + ] + }, + "type": "parcoords" + } + ], + "layout": { + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + } + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "r = Reservations\n", + "\n", + "datam = {'Costs(↓)': [f[0], f2[0], f3[0], f4[0], f5[0], f7[0], f8[0], f9[0]\n", + " ],\n", + " 'Pain_improvement(↑)': [f[1], f2[1], f3[1], f4[1], f5[1], f7[1], f8[1], f9[1]\n", + " ],\n", + " 'Physical_Function_improvement(↑)': [f[2], f2[2], f3[2], f4[2], f5[2], f7[2], f8[2], f9[2]\n", + " ],\n", + " \"ST_sessions(↓)\" : [f[3], f2[3], f3[3], f4[3], f5[3], f7[3], f8[3], f9[3]\n", + " ], \n", + " \"Duration(w)(↓)\" : [f[4], f2[4], f3[4], f4[4], f5[4], f7[4], f8[4], f9[4]\n", + " ], \n", + " }\n", + "\n", + "dfm = pd.DataFrame (datam, columns = ['Costs(↓)','Pain_improvement(↑)','Physical_Function_improvement(↑)', \"ST_sessions(↓)\", \"Duration(w)(↓)\"])\n", + "#df.describe()\n", + "\n", + "\n", + "import plotly.graph_objects as go\n", + "\n", + "fig = go.Figure(data=\n", + " go.Parcoords(\n", + " line =dict(color = dfm['Costs(↓)'],\n", + " colorscale = [[0,'purple'],[0.2,'lightseagreen'],[0.6,'gold'], [1, 'red']]\n", + " ),\n", + " dimensions = list([\n", + " dict(range = [120,1800],\n", + " constraintrange = [0, r[0]],\n", + " label = 'Costs(↓)', values = dfm['Costs(↓)']),\n", + " dict(range = [-5,30],\n", + " constraintrange = [r[1]*5, 30],\n", + " label = 'Pain_reduction(↑)%', values = dfm['Pain_improvement(↑)']*5),\n", + " dict(range = [-7,30],\n", + " constraintrange = [r[2]*100/68, 30],\n", + " label = 'Physical_Function_improvement(↑)%', values = dfm['Physical_Function_improvement(↑)']*100/68),\n", + " dict(range = [0,40],\n", + " constraintrange = [0, r[3]],\n", + " label = 'ST_sessions(↓)', values = dfm['ST_sessions(↓)']),\n", + " dict(range = [6,26],\n", + " constraintrange = [0, r[4]],\n", + " label = 'Duration(w)(↓)', values = dfm['Duration(w)(↓)'])\n", + " ])\n", + " )\n", + ")\n", + "\n", + "\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The DM chose the Mixed exercise therapy introduced in Krasilshchikov(2011) **(The one highlighted in red in the above figure)** and the interactive process is stopped." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 4deac836db5eff87bdc695be0484c618b670d53e Mon Sep 17 00:00:00 2001 From: Babooshka <43251215+bshavazipour@users.noreply.github.com> Date: Wed, 3 May 2023 14:41:29 +0300 Subject: [PATCH 2/2] Update KneeOA-DESDEO-Final.ipynb --- docs/notebooks/KneeOA-DESDEO-Final.ipynb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/notebooks/KneeOA-DESDEO-Final.ipynb b/docs/notebooks/KneeOA-DESDEO-Final.ipynb index 9e882c40..7d4b25a3 100644 --- a/docs/notebooks/KneeOA-DESDEO-Final.ipynb +++ b/docs/notebooks/KneeOA-DESDEO-Final.ipynb @@ -43,8 +43,7 @@ "from desdeo_problem.problem import MOProblem, Variable, ScalarConstraint\n", "from desdeo_problem.testproblems.TestProblems import test_problem_builder\n", "from desdeo_problem.problem import VectorObjective\n", - "from desdeo_mcdm.utilities import payoff_table_method\n", - "from desdeo_problem.problem.Variable import IntegerVariable # it is not merge to the master branch (I added it separately)" + "from desdeo_mcdm.utilities import payoff_table_method" ] }, { @@ -665,7 +664,7 @@ "# Define decision variables\n", "# As the variable are binary support for IntegerVariable must be included in DESDEO \n", "var_names = [f\"therapy_{i+1}\" for i in range(n_variables)]\n", - "vars = [IntegerVariable(var_names[i], initial_value=0, lower_bound=0, upper_bound=1) for i in range(n_variables)]" + "vars = [Variable(var_names[i], initial_value=0, lower_bound=0, upper_bound=1) for i in range(n_variables)]" ] }, {