{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(props_doss)=\n",
"\n",
"# Properties: Density of States (DOSS)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The {py:class}`~.aiida_crystal17.calculations.prop_doss.CryDossCalculation` can be used to run the `properties`\n",
"executable for DOSS calculations, from an existing `fort.9`."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
":::{seealso}\n",
"{ref}`props_workflow` to run multiple properties calculations\n",
"(and optional initial SCF).\n",
":::"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[31m\u001b[1mInputs\u001b[0m\n",
"\u001b[1m code: required Code The Code to use for this job.\u001b[0m\n",
"\u001b[1m parameters: required Dict the input parameters to create the properties input file.\u001b[0m\n",
"\u001b[1m wf_folder: required FolderData, RemoteData, SinglefileData the folder containing the wavefunction fort.9 file\u001b[0m\n",
" metadata: optional \u001b[0m\n",
"\u001b[31m\u001b[1mOutputs\u001b[0m\n",
"\u001b[1m remote_folder: required RemoteData Input files necessary to run the process will be stored in this folder node ...\u001b[0m\n",
"\u001b[1m results: required Dict Summary Data extracted from the output file(s)\u001b[0m\n",
"\u001b[1m retrieved: required FolderData Files that are retrieved by the daemon will be stored in this node. By defa ...\u001b[0m\n",
" arrays: optional ArrayData energies and DoS arrays\u001b[0m\n",
"\u001b[31m\u001b[1mExit codes\u001b[0m\n",
" 1: The process has failed with an unspecified error.\u001b[0m\n",
" 2: The process failed with legacy failure mode.\u001b[0m\n",
" 10: The process returned an invalid output.\u001b[0m\n",
" 11: The process did not register a required output.\u001b[0m\n",
" 200: The retrieved folder data node could not be accessed.\u001b[0m\n",
" 210: The main (stdout) output file was not found\u001b[0m\n",
" 211: The temporary retrieved folder was not found\u001b[0m\n",
" 300: An error was flagged trying to parse the crystal exec stdout file\u001b[0m\n",
" 350: The input file could not be read by crystal\u001b[0m\n",
" 351: Crystal could not find the required wavefunction file\u001b[0m\n",
" 352: Parser could not find the output isovalue (fort.25) file\u001b[0m\n",
" 353: Error parsing output isovalue (fort.25) file\u001b[0m\n",
" 400: The calculation stopped prematurely because it ran out of walltime.\u001b[0m\n",
" 401: The calculation stopped prematurely because it ran out of memory.\u001b[0m\n",
" 402: The calculation stopped prematurely because it ran out of virtual memory.\u001b[0m\n",
" 413: An error encountered usually during geometry optimisation\u001b[0m\n",
" 414: An error was encountered during an scf computation\u001b[0m\n",
" 415: An unknown error was encountered, causing the mpi to abort\u001b[0m\n",
" 499: The main crystal output file flagged an unhandled error\u001b[0m\n"
]
}
],
"source": [
"!verdi plugin list aiida.calculations crystal17.doss"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"init_cell": true
},
"outputs": [
{
"data": {
"text/plain": [
"'test_crystal17'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from aiida import engine, load_profile, orm, plugins\n",
"from aiida.tools.visualization import Graph\n",
"from aiida_crystal17.common import recursive_round\n",
"from aiida_crystal17.tests.utils import (\n",
" get_or_create_local_computer, get_or_create_code,\n",
" get_default_metadata)\n",
"from aiida_crystal17.tests import open_resource_binary\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"profile = load_profile()\n",
"profile.name"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Running a calculation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The {ref}`doss_input_schema` gives the allowed format of the input dictionary, for example:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"computer = get_or_create_local_computer('work_directory', 'localhost')\n",
"code = get_or_create_code('crystal17.doss', computer, 'mock_properties17')\n",
"\n",
"builder = code.get_builder()\n",
"builder.metadata = get_default_metadata()\n",
"builder.parameters = orm.Dict(dict={\n",
" \"k_points\": [18, 36],\n",
" \"npoints\": 100,\n",
" \"band_minimum\": -10,\n",
" \"band_maximum\": 10,\n",
" \"band_units\": \"eV\"\n",
"})\n",
"with open_resource_binary('doss', 'mgo_sto3g_scf', 'fort.9') as handle:\n",
" builder.wf_folder = orm.SinglefileData(handle)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"result, calcnode = engine.run_get_node(builder)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[22mProperty Value\n",
"------------- ------------------------------------\n",
"type CalcJobNode\n",
"pk 884\n",
"uuid ff55e9d9-9a03-4375-b5d9-2353794f1c92\n",
"label\n",
"description\n",
"ctime 2019-09-24 14:04:37.274585+00:00\n",
"mtime 2019-09-24 14:04:51.167679+00:00\n",
"process state Finished\n",
"exit status 0\n",
"computer [1] localhost\n",
"\n",
"Inputs PK Type\n",
"---------- ---- --------------\n",
"code 881 Code\n",
"parameters 882 Dict\n",
"wf_folder 883 SinglefileData\n",
"\n",
"Outputs PK Type\n",
"------------- ---- ----------\n",
"arrays 888 ArrayData\n",
"remote_folder 885 RemoteData\n",
"results 887 Dict\n",
"retrieved 886 FolderData\u001b[0m\n"
]
}
],
"source": [
"!verdi process show {calcnode.pk}"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"ipub": {
"figure": {
"caption": "`crystal17.doss` calculation provenance graph."
}
}
},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"graph = Graph(graph_attr={'size': \"6,8!\", \"rankdir\": \"LR\"})\n",
"graph.add_node(calcnode)\n",
"graph.add_incoming(calcnode, annotate_links=\"both\")\n",
"graph.add_outgoing(calcnode, annotate_links=\"both\")\n",
"graph.graphviz"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Analysing the outputs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The outputs are:\n",
"\n",
"- **results** a dict of computation input and output parameters, parsed from the stdout file.\n",
"- **arrays** a set of energy and DoS arrays for each point"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'newk': {'k_points': [18, 18, 18],\n",
" 'gilat_net': 36,\n",
" 'n_kpoints_ibz': 195,\n",
" 'n_kpoints_gilat': 1240},\n",
" 'npts': 102,\n",
" 'spin': False,\n",
" 'units': {'energy': 'eV', 'conversion': 'CODATA2014'},\n",
" 'errors': [],\n",
" 'header': {'crystal_version': 17, 'crystal_subversion': '1.0.1'},\n",
" 'warnings': [],\n",
" 'wf_input': {'n_ao': 14,\n",
" 'n_atoms': 2,\n",
" 'k_points': [8, 8, 8],\n",
" 'n_shells': 5,\n",
" 'n_symops': 48,\n",
" 'gilat_net': 8,\n",
" 'n_core_el': 12,\n",
" 'n_electrons': 20,\n",
" 'energy_fermi': -4.0,\n",
" 'energy_total': -7380.2,\n",
" 'n_kpoints_ibz': 29,\n",
" 'energy_kinetic': 7269.0},\n",
" 'energy_max': 10.4,\n",
" 'energy_min': -10.2,\n",
" 'system_type': 'closed shell, insulating system',\n",
" 'fermi_energy': -4.0,\n",
" 'parser_class': 'CryDossParser',\n",
" 'parser_errors': [],\n",
" 'parser_version': '0.11.0',\n",
" 'norbitals_total': 14,\n",
" 'parser_exceptions': [],\n",
" 'execution_time_seconds': 0}"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"recursive_round(calcnode.outputs.results.get_dict(), 1)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"ipub": {
"figure": {
"caption": "`crystal17.doss` MgO DoS plot."
}
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXhc5XUG8PfMaEYz2iVrLMnyIsl4k3eQhQMhhMXGAYOBlgRSCGmaOklL1iYp2VpSurgEyNIkNCbQQpqEQMNim8V2HCBAwUbGq+QVSbZlybJkSda+zMzpHzMjC5CsWe7MHc28v+fxI83Vnbmf55GOPp3v3O+IqoKIiCY+i9kDICIiYzCgExElCAZ0IqIEwYBORJQgGNCJiBJESiwvlp+fryUlJbG8JBHRhLdz585WVXWNd15MA3pJSQmqqqpieUkioglPRI4Fcx5TLkRECYIBnYgoQTCgExElCAZ0IqIEwYBORJQgGNCJiBIEAzoRUYJgQCeKsubOfmzY02j2MCgJBB3QRcQqIrtEZJP/cZ6IbBWRI/6PudEbJtHE9cOth/Gl3+5C09k+s4dCCS6UGfqXARwY8fhuANtUdRaAbf7HRDTCoNuLF/efAgDsqGszeTSU6IIK6CIyFcB1AH454vAaAI/5P38MwI3GDo1o4nvjaCvO9g0BYECn6At2L5cfAfgmgMwRxwpUtQkAVLVJRCYbPTiiiW7jnkZkO22YPyWLAZ2ibtwZuoisBnBaVXeGcwERWSsiVSJS1dLSEs5LEE1I/UMebKlpxqr5hbj0gnwcOd2Ntp5Bs4dFCSyYlMulAG4QkXoATwC4UkT+B0CziBQBgP/j6dGerKrrVbVCVStcrnF3fyRKGK8cakH3gBurFxehsjQPAPB2PWfpFD3jBnRV/ZaqTlXVEgC3Avijqt4OYAOAO/2n3QnguaiNkmgC2rS3EZPS7fhQ2SQsmpoNe4qFaReKqkjq0NcBWCEiRwCs8D8mIgC9g25sO3AaH1tYiBSrBakpViydlsMZOkVVSA0uVPUVAK/4Pz8D4Crjh0Q08W07cBp9Qx5cv2jK8LGLS/Pw05ePonvAjYzUmPaWoSTBO0WJomDjnkYUZKViWUne8LFlpXnwKrDzWLuJI6NExoBOZLDO/iG8crgF1y4sgsUiw8cvnJ4Lq0Wwo+6MiaOjRMaATmSwrdXNGHR7cf3iKe85np6aggXF2Xi7jjN0ig4GdCKDbdrbiOIcJ5ZOy/nA1y4uzcPuEx3oH/KYMDJKdAzoRAZq7xnEa0dasXpxEUTkA1+vLMnDoMeLPSc6TBgdJbq4D+hvvnsGPQNus4dBFJTN1afg9up7qltGqijxbUrKenSKhrgO6LUt3bjt4bfw3Wf3mz0UoqBs3NuIkklpmD8la9Sv56TZMbcwEztYj05RENcBfXN1MwDgmV0n8X9HW00eDdH5tXQN4M13z+D6xVNGTbcEVJbmYeexdrg93hiOjpJBnAf0U5hbmIkZk9Lw3Wf3Y8DNhSSKXy/ub4JXgdVjpFsCKkvz0DvoQXVjZ4xGRskibgP6qbP92H2iA6sXFeGf1ixAbWsPfvFqrdnDIhrTpj1NmF2QgTmFmec9r7KEG3VRdMRtQN9a4+vycs38Qlw+24XVi4rw05ePor61x+SREX1Q09k+7KhvG3d2DgCTsxwomZSG7VwYJYPFbUDfXN2Msvx0XDA5AwDwvdXlSLVa8L3n9kNVTR4d0Xute/EgUiyCNUvGD+iAL+3ydn0bvF5+L5Nx4jKgn+0dwlu1Z7ByfuHw4lJBlgNfv2YOXjvSik17m0weIdE5L+xrwnO7G/HFK2dhxqT0oJ5TWToJHb1DOHK6O8qjo2QSlwH9j4ea4fYqVs4veM/x25fPwMLibPzTphp09g+ZNDqic1q6BvDdZ/djYXE2/uaKmUE/L5BHZ/kiGSkuA/rm/c2YnJmKJVPfe+u01SL415sW4kz3AO7ffMik0RH5qCq+88w+dA+48cDHF8NmDf7HaVqeE4VZDt5gRIaKu4DeP+TBq4dbsHJ+wXt2qgtYODUbn/pQCX711jHePk2membXSWypacbXV87G7ILzV7a8n4igsjQPO+rOcE2IDBNMk2iHiOwQkT0iUi0i3/cfv0dETorIbv+/a40Y0J8Ot6BvyINr5heOec7XVs6GKyMV335mH2/OIFM0ne3DP26oxrKSXPzVh8vCeo3K0jw0dw7gRFufwaOjZBXMDH0AwJWquhjAEgCrRGS5/2s/VNUl/n8vGDGgzdXNyHKkYHnZpDHPyXLY8O1r56G6sRNvvMu9pSm2VBXf/N+9cHsU99+yGNZR/pIMRqBx9Hbuj04GCaZJtKpqYCne5v8Xlb8R3R4vth1sxlXzCsbNR14xdzIAoLrxbDSGQjSm3+w4jteOtOLb180LuqplNBe4MpCbZmMenQwTVA5dRKwishvAaQBbVXW7/0t3icheEXlURHLHeO5aEakSkaqWlpbzXmdHfRs6eoewsrzgvOcBQLbThqm5TtTw9mmKoeNnevEvzx/AZbPycfvF0yN6LYtFcNGMXOzmWhAZJKhOtarqAbBERHIAPCMiCwA8BOBe+Gbr9wJ4AMBnRnnuegDrAaCiouK8M/st1c1ITbHg8jmuoAY/f0oWapoY0MlYQx4vzvYNobNvCJ39bv/HIXT2ufG7qhOwiuDf/2zReTfgCtak9FTsO8m/MskYIbUeV9UOEXkFwCpVvT9wXEQeBrApkoGoKrZUn8Jls1xIswc3rPKibGypaUbPgBvp7KJOYRpwe7D7eAfeqm3DW7Vn8M7xdgy4R19sT7EIHvj4YkzJcRpybafdir5BbjpHxhg3CoqIC8CQP5g7AVwN4N9FpEhVA7ds3gQgok3L9508i8az/fjqitlBP6d8ShZUgYOnunDRjFEzPkQfoKrYd/IsXjnUgjffPRfARYDyoiz8xcUzUJKfhiyHDVnOFGQ5bMh22pDl9H102KyGjcVpt6J/iJVaZIxgprVFAB4TESt8OfcnVXWTiPxKRJbAl3KpB/C5SAayufoUrBbB1fPGz58HlPubCNQ0dTKg07i6B9x4dtdJ/Gb7cdQ0dQ4H8NuXz8DyskmoLMlDdpotpmNy2qwY9Hjh9niREsKNSUSjGTegq+peAEtHOX6HkQPZUt2MypI85Kbbg37OlGwHsp02LozSee1rOIvf7DiG53Y3onfQg3lFWbj3xgW4flERctKC/36LBqd/tt835EEmAzpFKC4Sz7Ut3ThyuhufDLFqQERQXsSFURrdq4db8IPNB7H/ZCecNiuuX1yET148A4unZhuyoGkEp31EQHfE9q8DSjxxEdADreZWnufu0LGUT8nC/7x1jH+yxpEnq06go3cQf3lpaUj7mxg9hm89vQ8z8tLwT2vm48alxciKw4A5PEPnwigZIC4C+paaU1hYnI3iMCoHyouyMOD2ov5MDy6YHNp+GmS8vkEPvr+hGj2DHmzc04T7b1k8bgcfI6kqHnr1Xdz30iFcNisf/3n7RXFdATVyhk4UKdOntG6PF/tPnsUlM8e+1f98Aguj7M8YH14+dBo9gx587iNlaOzow/X/8Tp+/srRmOy54/Uq7t10APe9dAg3LJ6CR+5cFtfBHBgR0DlDJwOYHtBPdvRhyKOY6coI6/kzXRmwWy3Mo8eJjXsakZ+Rim+umostX/0Irpo3Gfe9dAh//p9v4mgUmzkMur342pO78egbdfj0JSX40SeWwJ5i+rf3uJhyISOZ/h1f6+8RWuoKb08Me4oFswoyWOkSB7r6h7Dt4GmsXlQEq0UwKSMVP/+LC/GT25ai/kwPrvvJa/jla7XwGNx2rXfQjc8+XoVndzfiG9fMwT9eXz7q1svxaGSVC1GkTA/odS2+gF6WH/4mR+VFWahp7OS+0ibbWtOMQbcX1y8uGj4mIrhh8RRs+epHcNmsfPzz8wfwqUe3o7V7wJBrtvUM4pMPb8frR1qw7uaF+NsrLoibCpZgpDGHTgYyPaDXtnYjy5GCvBDqz99v/pQsnOkZREuXMUGCwrNxTyOKc5xYOu2DN3lNznTg4U9VYN3NC1FV347VP3kdO49FtstgXWsPbv75G6hp6sRDt1+EWysj2yzLDIG7TnuZciEDmB7Q61p7UOrKiGhWVT4lGwBQzTy6adp7BvHakVasXlw0ZrpDRHBr5XQ8/TeXwJ5iwSd+8RYeeb0urL+sdtS14aafv4HOfjd++9cXn7chSjwLLIr2c4ZOBjA/oLf0RJRuAYC5Rb6yOObRzfPi/lNwexXXL5oy7rnzp2Rj4xc/jCvmTsa9m2pw1292oXvAHfS1ntt9Erf/cjvy0u145m8uwUUz8iIZuqm4KEpGMjWg9w660Xi2P+KAnuWwYXpeGitdTLRxTyPKXOmY7y8jHU+204b1d1yEuz82Fy/ub8INP30dh5u7zvscVcVPth3Bl5/YjaXTc/D0Fy6JqMFEPHAy5UIGMrVIt761F0D4FS4jlRdl4QBn6KZo7uzHW3Vn8KUrZ4WUOhMRfP7ymVgyLQd3/WYX1vz0DVw+24UFxVlYUJyNBcXZyM9IBeArS7z76b14+p2TuPnCYqy7edGEKEscj8UiSE2xMOVChjA1oNcFShYjnKEDvhuMNtec4t7oJnh+bxNUgesXj59uGc3yskl44UsfxrqXDuKdY+14qfrU8NcKsxxYUOxb9N51vANfWzEbX7xyYlWyjMdpt7LKhQxhauSrbfHdaGJIQC/i3uhm2bi3EeVFWbhgcng3hwHA5CwHHvz4EgBAZ/8Qaho7sf/kWVT7P7Z2D+BHn1iCG5cWGzXsuJFmY5MLMobpM/SibEfQHYrOZ3hv9MazDOgxdKKtF7uOd+DvV8017DWzHDYsL5uE5WXhbQcx0TjsVvRyhk4GGDcJKSIOEdkhIntEpFpEvu8/niciW0XkiP9jyFG0trXHkNk5ABRlO5CTZuPCaIxt3NsIAFi9qGicM2ksTpsV/ZyhkwGCWVUaAHClqi4GsATAKhFZDuBuANtUdRaAbf7HQVNV1LZ0o8yABVFgxN7oXBiNqY17mnDh9BxMy0szeygTVhpz6GSQcQO6+gR2VbL5/ymANQAe8x9/DMCNoVy4rWcQnf1ulOaHn3d9v/KiLBw81RWTnf0IOHq6CweaOsNeDCUfh83KskUyRFB1XyJiFZHdAE4D2Kqq2wEUBJpE+z9OHuO5a0WkSkSqWlpaho8HKlwirUEfqXyKb2/0wGtTdG3Y0wSLANcx3RIRp83KskUyRFABXVU9qroEwFQAlSKyINgLqOp6Va1Q1QqXyzV8vNbAksWA+f4tAJhHjz5VxaY9jVheNgmTMx1mD2dCY8qFjBLSnRmq2gHgFQCrADSLSBEA+D+eDuW1alt6YLMKpuaG3qVoLGWudNhTLMyjx0B1YydqW3uYbjGA086UCxkjmCoXl4jk+D93ArgawEEAGwDc6T/tTgDPhXLhutZuTM9LM7QPqM1qwZyCTM7QY+D5fU1IsQg+tmBibooVTxysciGDBFMAXgTgMRGxwvcL4ElV3SQibwJ4UkT+CsBxALeEcuG61h5DF0QDyouy8IcDzVDVhLqbMN4cOtWFWQWZyEkLf9tj8mHKhYwybkBX1b0Alo5y/AyAq8K5qMerqD/TiyvmjLqOGpHyKVn4XdUJnO4aQEEWc7vR0tDei5IJvjFWvHDarHB7FYNub0LsT0PmMeW7p7GjD4Nur6ELogHn7hhl2iVaVBUN7X2YmsvacyM42IaODGJKQI9GhUvA3EL/3ujMo0dNe+8Qegc9mJZn3IJ2MgtsfcHSRYqUKQG9LrApl0F3iY6U6bBhxqQ0ztCj6ESbb9tjztCN4bT7fgxZ6UKRMm2GnpmaApd/r2ujlRdlcYYeRQ3tfQBgaMlpMmPXIjKKOTP01h6UutKjVoVSXpSFutYe9ITQ1oyC19Dum6EXM6AbwulPuTCHTpEyZ4beYtwui6OZVZA5fB0yXkN7H7KdNmQ5bGYPJSFwhk5GiXlA7x/yoPFsH8qiUIMeENjBsba1e5wzKRwN7b1cEDWQk1UuZJCYB/T6Mz1Qjc6CaMD0vDSIgJt0RcmJ9j5MzeGCqFGcdgZ0MkbMA3pdi/G7LL6fw2bF1FwnUy5R4KtB7+WCqIGGA/og13woMjEP6NGsQR+pND+DM/QoONMziP4hLwO6gZhDJ6PEPqC39KAgKxXpqdFtZ1qWn47alm6oalSvk2zOlSwy5WKUtOGUCxuzUGRin3Jp7Y767BzwLYz2DHrQ0jUQ9Wslk0DJIlvOGSfVv38LUy4UKRMCenR2WXy/wC+NWqZdDHWizTdDZw26cUQETht3XKTIxTSge7yK9t4hzIxihUtAmcv3S4MLo8ZqaO9FbpoNGVFOmSUbbqFLRohpQB9w+3KEsUi5FGU5kJpiQR1r0Q3FXRajg42iyQjBdCyaJiIvi8gBEakWkS/7j98jIidFZLf/37XjvdaA2/cNG4uAbrEISvPTOUM3GEsWo8NpZ6Noilwwfze7Afydqr4jIpkAdorIVv/Xfqiq9wd7sQG3Fw6LxGxBrcyVjoNNXTG5VjII7IN+5VzjG5MkuzS7lWWLFLFxZ+iq2qSq7/g/7wJwAEBxOBcbdHsxPS8NNgP7iJ5PaX46jrf1YsjDcjAjtHQPYMDtZYVLFDDlQkYIKbKKSAl87ei2+w/dJSJ7ReRREckd4zlrRaRKRKp6+gdjkm4JKMvPgNurw/t3U2S4bW70OG1MuVDkgg7oIpIB4PcAvqKqnQAeAjATwBIATQAeGO15qrpeVStUtcKjMrxxViwE9ovhHaPG4E1F0cMqFzJCUAFdRGzwBfNfq+rTAKCqzarqUVUvgIcBVI73OgrEpAY9ILBfDAO6MYb3Qc/hDN1oTqZcyADBVLkIgEcAHFDVB0ccLxpx2k0A9gdzwVimXHLS7MhLt+NdVroYoqG9D3np9qhv25CMHKxyIQME85N5KYA7AOwTkd3+Y98GcJuILIFv4l0P4HPBXDCWKRfA9wuEtejGONHWi2nMn0dFmo1VLhS5cQO6qr4OYLRecS+EejGLCCZnRqeP6FhK89Pxp8MtMb1mojrZ3od5RVlmDyMhOe1W9A55oKpRa81IiS+md4raUywx/2Ytc6XjdNcAutlfNCJer6Kho48VLlHisFmheu5uaqJwxDSgp1hiP/MILIzWc2E0Iq3dAxh0cx/0aAlsocs8OkUipgHdakJAD1TVvNvCPHokTvgrXFiyGB3sK0pGSPiAPmMS+4saIVCDzubQ0RFoQ8fSRYpETAO6xYTFHofNiuIc9heNVCCgF7M5dFSwDR0ZIeFn6IBvb3TO0CPT0N6L/Az78EySjOVkDp0MENuAblI5Vll+Oupae9hfNAIN7X0oZv48agIzdKZcKBIxnqHH8mrnlOano3vAzf6iETjRxn3Qo8lp56IoRS62OXTTUi7sLxoJr1dxsqMP0zhDj5rADJ0pF4pEUqRcSrlJV0ROdw1gyKOcoUcRq1zICEkxQ5+S7URqigW1rEUPS8NwDToDerSwyoWMkBQz9EB/Uc7Qw8N90KOPOXQyQlKULQJgw+gIBDo+cYYePXarBRbhDJ0ikzQBvczF/qLhamjvgyszFQ4ba9CjRUTgtLFrEUXGpELC2Cv19xcNpA8oeA0dLFmMBac9hQGdIpJEAd1fusiF0ZA1tPcxfx4DTruFKReKSDAt6KaJyMsickBEqkXky/7jeSKyVUSO+D/mRn+44ZvJhtFh8XgVjdwHPSac7FpEEQpmhu4G8HeqOg/AcgB/KyLlAO4GsE1VZwHY5n8ct3LS7MhNs7G/aIiaO/tZgx4jTLlQpMYN6KrapKrv+D/vAnAAQDGANQAe85/2GIAbozVIo7C/aOiGt81lyiXqnDamXCgyIeXQRaQEwFIA2wEUqGoT4Av6ACaP8Zy1IlIlIlUtLeb29uSui6HjTUWxwyoXilTQAV1EMgD8HsBXVLUz2Oep6npVrVDVCpfLFc4YDVOan47mTvYXDUVghj4lhwE92tKYcqEIBRXQRcQGXzD/tao+7T/cLCJF/q8XATgdnSEah/1FQ9fQ3ovJrEGPCQcXRSlCwVS5CIBHABxQ1QdHfGkDgDv9n98J4Dnjh2esMpevvyh3XQzeiTZWuMSK027hDJ0iEswM/VIAdwC4UkR2+/9dC2AdgBUicgTACv/juBboL8pa9OD5birigmgspNlTOEOniKSMd4Kqvg5grHv2rzJ2ONEV6C/KhdHguD1eNHX044bFnKHHgsO/KOr1qmk7k9LEljR3igZwk67gNXcNwO1VztBjJLCF7oCb+w1ReJIuoM90ZaC2pRteL/uLjqeBuyzGVBq30KUIJV1An12QiZ5BD052cJOu8QQWjzlDj41zjaJZVkvhSbqAPqcwEwBw6FSXySOJb3882Ix7N9Vgel4aZ+gx4rCzryhFJukC+uwCX+nioWYG9LH86s16fPaxKpS50vHU5z8EmzXpvk1MkTbcho45dArPuFUuiSbTYUNxjhMHOUP/AI9X8W8vHMAvX6/D1fMm48e3LkV6atJ9i5jmXKNoplwoPEn50zq3MBOHGdDfo2/Qg6/8bhc2Vzfj05eU4Hury03tMJWMAnfjclGUwpWUAX12YSZePdyCQbcX9pSJkU5o7OjDc7sbsWFPIxw2Cz59SQmuXVhkSDqkpWsAn328CnsbOvAPq8vxmQ+XGjBiClUac+gUoaQM6HMLM+H2KmpbuzG3MMvs4Yyps38IL+07had3NWB7XRtUgQun56CjbwhffmI31r14EJ++pAS3Vk5HttMW8uurKrYdOI17NlajtXsAv7j9IqycXxiF/wkF41yVCwM6hScpA/rISpd4DOhHmrvwo21H8IeaZgy4vSjNT8dXr56NNUumYMakdHi9ilcOn8YvX6vDv714ED/edgQfr5iGz1xaiumTxi8xVFX84cBp/HjbYew/2YnpeWn43doPYfG0nBj872gsTtahU4SSMqCX5WcgxSJxWbrYN+jBZx+vQnvPIG5dNg03XTgVi6dmw7dHmo/FIrhybgGunFuA6sazeOT1Ovx6+zE8/mY9lk7PxbKSPCwryUXFjDxkp52buasqttY048fbjqC6sRMzJqXhB3++CDcuLWYlSxwYDuicoVOYkjKg21MsKHOlx2VAf3DrIRw704sn1i7H8rJJ454/f0o2Hvz4Evz9qrn49fbjeP1ICx55vRb/+arvTtg5BZlYVpqLC1wZeGpnw3Agv/+WxbhxyRSkMJDHjUDKhTl0CldSBnQAmFOYhXeOtZs9jPfYfaIDj7xeh7+4eHpQwXykgiwHvrZiNr62Yjb6hzzYfaIDVfVteLu+Hc/uakT3gBul+el44JbFWMNAHpdsVgtSLMIcOoUtaQP63MJMbNzTiK7+IWQ6Ql9QNNqg24tv/u8eFGQ5cPfH5kb0Wg6bFcvLJg3/UvB4FcfbejEt18lAHuecdraho/Al7U/3nALfwujh5vjYG/1nLx/F4eZu/OtNCw3/BWO1CErz0xnMJwCnzcqUC4UtmI5Fj4rIaRHZP+LYPSJy8n0NLyaUeNrT5eCpTvzs5aO4aWkxrpg7aq9tShJOu5UpFwpbMFO2/wawapTjP1TVJf5/Lxg7rOgrznEi3W7FoVNB97uOCrfHi2/+715kO2343upyU8dC5nOyryhFYNyArqp/AtAWg7HElMUimF2YafomXY++UYe9DWfx/TXzkZduN3UsZD7m0CkSkSRV7xKRvf6UTO5YJ4nIWhGpEpGqlpaWCC5nvDkFmTh0qguq5jS7qGvtwQNbDmNFeQGuW1hkyhgovnCGTpEIN6A/BGAmgCUAmgA8MNaJqrpeVStUtcLlcoV5ueiYU5iJ9t4htHQNxPzaXq/i7t/vhT3Fgn++ccF7bhyi5JXGGTpFIKyArqrNqupRVS+AhwFUGjus2AgsjJqxle5TO09ge10bvnddOQqyHDG/PsWnQKNoonCEFdBFZGR+4CYA+8c6N56dK12MbUDvHnDjB5sPoWJGLm6pmBrTa1N8Y8qFIjHujUUi8lsAHwWQLyINAP4RwEdFZAkABVAP4HNRHGPUTMpIRX5Gasxn6A+9chSt3YN45M5lTLXQezDlQpEYN6Cr6m2jHH4kCmMxxdzCzJjWoje09+Lh1+pw09Ji7m5IH+Cwc4ZO4Uv6WwfnFGbicHMXPN7YVLrc99IhWAT4xjVzYnI9mlicNisG3N6YfT9SYmFAL8zEgNuL4229Ub/WO8fbsWFPI9ZeVoYpOc6oX48mHnYtokgwoBcEtgCI7h2jqop/3lQDV2YqPnf5zKheiyYuJ/uKUgSSPqDPLsiESPRLFzftbcI7xzvwjZVzkJ6atJtc0jiGG0Uzj05hSPqA7rRbMSMvLaoLo/1DHqx78SDKi7LwZxexTJHGlmb3/bLnDJ3CkfQBHfDN0qO5p8t/vVGPkx19+O5182C1sEyRxua0+34kOUOncDCgw1e6WN/aE5WFqNbuAfzs5aO4el4BLrkg3/DXp8QSSLlwC10KBwM6fO3ovAocPW18s4sHtx5G/5AH37o2si5ElBzYV5QiwYCO6O3psut4O57YcRy3L5+Bma4MQ1+bEhNz6BQJBnQAJZPSYE+xGLqny4m2Xvz141UoznXiK1fPMux1KbE5mXKhCDCgA0ixWnCBK8OwGfrZviH85X+/jUG3F//16WXISWPjCgqOI7Aoyhk6hYEB3c+3p0vkNxcNur34wv/sxLEzPfjFHRW4YHKmAaOjZBFIufRzhk5hYED3m1OYiebOAXT0Dob9GqqK7zyzD//37hmsu3kRPjRzkoEjpGTgSPH9SDLlQuFgQPebXRjYAiD8tMvPXj6Kp3Y24EtXzeINRBSWFKsFdquFKRcKCwO639xAQA9zYfS53Sdx/5bDuGlpMb7KRVCKgNNuZdkihWXcgO5vAn1aRPaPOJYnIltF5Ij/45hNoieKwiwHshwpYS2Mvl3fhm88tReVpXlY92cL2bSCIuK0WdE76DZ7GDQBBTND/28Aq9537G4A21R1FoBt/scTmohg/pRsvHakBQPu4GdHLV0DWPt4FabmOrH+jouQmmKN4igpGTjtVvQNec0eBk1A4wZ0Vf0TgIgMxL8AAAkYSURBVLb3HV4D4DH/548BuNHgcZni8x+diRNtfXjs/+qDfs59Lx1E94Ab6z91EcsTyRDsK0rhCjeHXqCqTQDg/zh5rBNFZK2IVIlIVUtLS5iXi43LZ7twxRwX/mPbUbR2D4x7/q7j7XhqZwM+8+FSlieSYXwzdKZcKHRRXxRV1fWqWqGqFS6XK9qXi9h3ritH35AHD2w5fN7zvF7FPRuqMTkzFV+8kougZBzO0Clc4Qb0ZhEpAgD/x9PGDclcF0zOwB0fmoHfvX0cNY1j32j01M4T2NNwFt++dh4y2LCCDMQcOoUr3IC+AcCd/s/vBPCcMcOJD1+5ajaynDbcu6kGqh9s1nu2bwj3vXQIFTNysWbJFBNGSInMN0NnyoVCF0zZ4m8BvAlgjog0iMhfAVgHYIWIHAGwwv84YWSn2fC1FbPxZu0ZbKlp/sDXf7j1MNp6B3HPDfNZokiGc9qsvLGIwjJurkBVbxvjS1cZPJa48snK6fjVm8fwry8cwEfnuIbLEQ+d6sKv3jqGT1ZOx4LibJNHSYnIaWcOncLDO0XHkGK14Hury3HsTC/+6416AL69Wu7ZUI1MRwq+vnKOuQOkhOW7U5Q5dAodA/p5fGS2C1fNnYyf/vEoWroG8MK+U3iz9gz+buUc5Kaz5pyiw2mzYtDjhdvDoE6hYUAfx3eum4f+IQ/+5fka/MvzNZhXlIVPVk43e1iUwNLsvvQe8+gUKgb0cZS5MnDnJSV4dncjGs/24/s3zIfVwoVQip5Ao2gGdAoVA3oQvnTVLBRmOXDLRVNRWZpn9nAowQXa0HFhlELFO2KCkO204Y9fv3z4B40omphyoXAxoAcp0BqMKNocds7QKTxMuRDFGaZcKFwM6ERxhikXChcDOlGccbLKhcLEgE4UZwJli71MuVCIGNCJ4kwg5cJG0RQqBnSiOONklQuFiQGdKM44UphyofAwoBPFGYtF4LBZmHKhkEV0t4yI1APoAuAB4FbVCiMGRZTs2OSCwmHE7Y9XqGqrAa9DRH5Om5UpFwoZUy5EccjXKJoBnUITaUBXAFtEZKeIrDViQETk71rEGTqFKNKUy6Wq2igikwFsFZGDqvqnkSf4A/1aAJg+nY0hiILBlAuFI6IZuqo2+j+eBvAMgMpRzlmvqhWqWuFyuSK5HFHScNpTmHKhkIUd0EUkXUQyA58DWAlgv1EDI0pmTpYtUhgiSbkUAHhGRAKv8xtVfcmQURElOaZcKBxhB3RVrQWw2MCxEJEfUy4UDpYtEsUhp41VLhQ6BnSiOOS0W9A75IGqmj0UmkAY0IniUJo9BR6vYsjDgE7BY0AnikMOdi2iMDCgE8UhNoqmcDCgE8Uhp933o8kZOoWCAZ0oDjltvopiztApFAzoRHFouA3dkNvkkdBEwoBOFIfO5dC9Jo+EJhIGdKI4lGZnlQuFjgGdKA6xbJHCwYBOFIeGc+iDzKFT8BjQieJQGuvQKQwM6ERx6FyVCxdFKXgM6ERxKDXFAhGmXCg0DOhEcUhE4LRZuShKIYkooIvIKhE5JCJHReRuowZFRGBAp5BF0lPUCuBnAD4GoBzAbSJSbtTAiJKdg23oKESR9BStBHDU34oOIvIEgDUAaowYGFGyS7NbsaW6GSsefNXsodAEEUlALwZwYsTjBgAXv/8kEVkLYC0ATJ8+PYLLESWXz15WilcPt5g9DIoDfwjyvEgCuoxy7APtVVR1PYD1AFBRUcH2K0RB+sSy6fjEMk6CCHjo9uDOi2RRtAHAtBGPpwJojOD1iIgoApEE9LcBzBKRUhGxA7gVwAZjhkVERKEKO+Wiqm4RuQvAZgBWAI+qarVhIyMiopBEkkOHqr4A4AWDxkJERBHgnaJERAmCAZ2IKEEwoBMRJQgGdCKiBCGqsbvXR0S6AByK2QXjWz6AVrMHESf4XpzD9+IcvhfnzFHVzPFOiqjKJQyHVLUixteMSyJSxffCh+/FOXwvzuF7cY6IVAVzHlMuREQJggGdiChBxDqgr4/x9eIZ34tz+F6cw/fiHL4X5wT1XsR0UZSIiKKHKRciogTBgE5ElCCiHtBF5BYRqRYRr4hUvO9r3/I3mD4kItdEeyzxRkSWiMhbIrJbRKpEpNLsMZlJRL7o/16oFpH7zB6P2UTk6yKiIpJv9ljMIiI/EJGDIrJXRJ4RkRyzxxRLIrLK/zNxVETuHu/8WMzQ9wO4GcCfRh70N5S+FcB8AKsA/NzfeDqZ3Afg+6q6BMA/+B8nJRG5Ar6etItUdT6A+00ekqlEZBqAFQCOmz0Wk20FsEBVFwE4DOBbJo8nZvzx8GcAPgagHMBt/rg5pqgHdFU9oKqj3R26BsATqjqgqnUAjsLXeDqZKIAs/+fZSO6OT18AsE5VBwBAVU+bPB6z/RDANzFKW8dkoqpbVNXtf/gWfJ3RkkUlgKOqWquqgwCegC9ujsnMHPpoTaaLTRqLWb4C4AcicgK+GWnSzD5GMRvAZSKyXUReFZFlZg/ILCJyA4CTqrrH7LHEmc8AeNHsQcRQyDHSkFv/ReQPAApH+dJ3VPW5sZ42yrGEm42c770BcBWAr6rq70Xk4wAeAXB1LMcXS+O8FykAcgEsB7AMwJMiUqYJWlc7znvxbQArYzsi8wQTP0TkOwDcAH4dy7GZLOQYaUhAV9VwglBSNJk+33sjIo8D+LL/4VMAfhmTQZlknPfiCwCe9gfwHSLihW9zppZYjS+WxnovRGQhgFIAe0QE8P1cvCMilap6KoZDjJnx4oeI3AlgNYCrEvUX/BhCjpFmplw2ALhVRFJFpBTALAA7TByPGRoBXO7//EoAR0wci9mehe89gIjMBmBHEu60p6r7VHWyqpaoagl8P9QXJmowH4+IrALw9wBuUNVes8cTY28DmCUipSJih6+IZMP5nhD13RZF5CYA/wHABeB5EdmtqteoarWIPAmgBr4/pf5WVT3RHk+c+WsAPxaRFAD9ANaaPB4zPQrgURHZD2AQwJ1JNhuj0f0UQCqArf6/WN5S1c+bO6TYUFW3iNwFYDMAK4BHVbX6fM/hrf9ERAmCd4oSESUIBnQiogTBgE5ElCAY0ImIEgQDOhFRgmBAJyJKEAzoREQJ4v8BgzVp/CmBNbgAAAAASUVORK5CYII=\n",
"text/plain": [
"