diff --git a/multiwell-timelapse-napari.ipynb b/multiwell-timelapse-napari.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..8ccd7c95e068a760cbf9f2fbe50219c73ed591ec --- /dev/null +++ b/multiwell-timelapse-napari.ipynb @@ -0,0 +1,1467 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: cupy in /home/aaristov/miniconda3/envs/nd2/lib/python3.8/site-packages (10.0.0)\n", + "Requirement already satisfied: numpy<1.24,>=1.18 in /home/aaristov/miniconda3/envs/nd2/lib/python3.8/site-packages (from cupy) (1.20.0)\n", + "Requirement already satisfied: fastrlock>=0.5 in /home/aaristov/miniconda3/envs/nd2/lib/python3.8/site-packages (from cupy) (0.8)\n" + ] + } + ], + "source": [ + "from droplet_growth import register as r\n", + "from droplet_growth import count, mic\n", + "import napari\n", + "import numpy as np\n", + "import tifffile as tf\n", + "!pip install cupy\n", + "import cupy\n", + "import aicsimageio\n", + "import dask as da\n", + "import pandas as pd\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AICSImageIO: Reader will load image in-memory: False\n", + "AICSImageIO: Reader will load image in-memory: False\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/aaristov/miniconda3/envs/nd2/lib/python3.8/site-packages/napari_plugin_engine/manager.py:490: UserWarning: 'No plugin found with the name nd2-dask'\n", + " warnings.warn(str(e))\n", + "/home/aaristov/miniconda3/envs/nd2/lib/python3.8/site-packages/napari_plugin_engine/manager.py:490: UserWarning: 'No plugin found with the name napari-bioformats'\n", + " warnings.warn(str(e))\n", + "/home/aaristov/miniconda3/envs/nd2/lib/python3.8/site-packages/napari_plugin_engine/manager.py:490: UserWarning: 'No plugin found with the name napari-nikon-nd2'\n", + " warnings.warn(str(e))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AICSImageIO: Reader will load image in-memory: False\n", + "AICSImageIO: Reader will load image in-memory: False\n" + ] + } + ], + "source": [ + "v = napari.Viewer()" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [], + "source": [ + "arr = aicsimageio.AICSImage(\n", + " '/home/aaristov/Anchor/Lena/Data/20211220-MIC/timelapse/00ng-timelapse-TRITC-30\\'.nd2')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "arr = aicsimageio.AICSImage(\n", + " '/home/aaristov/Anchor/Lena/Data/20211220-MIC/movies-24h/64ng-25fps.nd2')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['CSU 561']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr.channel_names" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Dimensions [T: 1, C: 1, Z: 25, Y: 7387, X: 22393]>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr.dims" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<table>\n", + " <tr>\n", + " <td>\n", + " <table>\n", + " <thead>\n", + " <tr>\n", + " <td> </td>\n", + " <th> Array </th>\n", + " <th> Chunk </th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " \n", + " <tr>\n", + " <th> Bytes </th>\n", + " <td> 7.70 GiB </td>\n", + " <td> 315.51 MiB </td>\n", + " </tr>\n", + " \n", + " <tr>\n", + " <th> Shape </th>\n", + " <td> (1, 1, 25, 7387, 22393) </td>\n", + " <td> (1, 1, 1, 7387, 22393) </td>\n", + " </tr>\n", + " <tr>\n", + " <th> Count </th>\n", + " <td> 75 Tasks </td>\n", + " <td> 25 Chunks </td>\n", + " </tr>\n", + " <tr>\n", + " <th> Type </th>\n", + " <td> uint16 </td>\n", + " <td> numpy.ndarray </td>\n", + " </tr>\n", + " </tbody>\n", + " </table>\n", + " </td>\n", + " <td>\n", + " <svg width=\"374\" height=\"108\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"0\" y1=\"0\" x2=\"25\" y2=\"0\" style=\"stroke-width:2\" />\n", + " <line x1=\"0\" y1=\"25\" x2=\"25\" y2=\"25\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n", + " <line x1=\"25\" y1=\"0\" x2=\"25\" y2=\"25\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"0.0,0.0 25.412616514582485,0.0 25.412616514582485,25.412616514582485 0.0,25.412616514582485\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Text -->\n", + " <text x=\"12.706308\" y=\"45.412617\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >1</text>\n", + " <text x=\"45.412617\" y=\"12.706308\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,45.412617,12.706308)\">1</text>\n", + "\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"109\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"95\" y1=\"43\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"95\" y2=\"43\" style=\"stroke-width:2\" />\n", + " <line x1=\"95\" y1=\"0\" x2=\"95\" y2=\"44\" />\n", + " <line x1=\"96\" y1=\"1\" x2=\"96\" y2=\"45\" />\n", + " <line x1=\"96\" y1=\"1\" x2=\"96\" y2=\"45\" />\n", + " <line x1=\"97\" y1=\"2\" x2=\"97\" y2=\"46\" />\n", + " <line x1=\"97\" y1=\"2\" x2=\"97\" y2=\"46\" />\n", + " <line x1=\"98\" y1=\"3\" x2=\"98\" y2=\"47\" />\n", + " <line x1=\"99\" y1=\"4\" x2=\"99\" y2=\"48\" />\n", + " <line x1=\"99\" y1=\"4\" x2=\"99\" y2=\"48\" />\n", + " <line x1=\"100\" y1=\"5\" x2=\"100\" y2=\"49\" />\n", + " <line x1=\"100\" y1=\"5\" x2=\"100\" y2=\"49\" />\n", + " <line x1=\"101\" y1=\"6\" x2=\"101\" y2=\"50\" />\n", + " <line x1=\"102\" y1=\"7\" x2=\"102\" y2=\"51\" />\n", + " <line x1=\"102\" y1=\"7\" x2=\"102\" y2=\"51\" />\n", + " <line x1=\"103\" y1=\"8\" x2=\"103\" y2=\"52\" />\n", + " <line x1=\"103\" y1=\"8\" x2=\"103\" y2=\"52\" />\n", + " <line x1=\"104\" y1=\"9\" x2=\"104\" y2=\"53\" />\n", + " <line x1=\"105\" y1=\"10\" x2=\"105\" y2=\"54\" />\n", + " <line x1=\"105\" y1=\"10\" x2=\"105\" y2=\"54\" />\n", + " <line x1=\"106\" y1=\"11\" x2=\"106\" y2=\"55\" />\n", + " <line x1=\"106\" y1=\"11\" x2=\"106\" y2=\"55\" />\n", + " <line x1=\"107\" y1=\"12\" x2=\"107\" y2=\"56\" />\n", + " <line x1=\"108\" y1=\"13\" x2=\"108\" y2=\"57\" />\n", + " <line x1=\"108\" y1=\"13\" x2=\"108\" y2=\"57\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"95.0,0.0 109.9485979497544,14.948597949754406 109.9485979497544,58.80175857692657 95.0,43.85316062717216\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"215\" y2=\"0\" style=\"stroke-width:2\" />\n", + " <line x1=\"95\" y1=\"0\" x2=\"215\" y2=\"0\" />\n", + " <line x1=\"96\" y1=\"1\" x2=\"216\" y2=\"1\" />\n", + " <line x1=\"96\" y1=\"1\" x2=\"216\" y2=\"1\" />\n", + " <line x1=\"97\" y1=\"2\" x2=\"217\" y2=\"2\" />\n", + " <line x1=\"97\" y1=\"2\" x2=\"217\" y2=\"2\" />\n", + " <line x1=\"98\" y1=\"3\" x2=\"218\" y2=\"3\" />\n", + " <line x1=\"99\" y1=\"4\" x2=\"219\" y2=\"4\" />\n", + " <line x1=\"99\" y1=\"4\" x2=\"219\" y2=\"4\" />\n", + " <line x1=\"100\" y1=\"5\" x2=\"220\" y2=\"5\" />\n", + " <line x1=\"100\" y1=\"5\" x2=\"220\" y2=\"5\" />\n", + " <line x1=\"101\" y1=\"6\" x2=\"221\" y2=\"6\" />\n", + " <line x1=\"102\" y1=\"7\" x2=\"222\" y2=\"7\" />\n", + " <line x1=\"102\" y1=\"7\" x2=\"222\" y2=\"7\" />\n", + " <line x1=\"103\" y1=\"8\" x2=\"223\" y2=\"8\" />\n", + " <line x1=\"103\" y1=\"8\" x2=\"223\" y2=\"8\" />\n", + " <line x1=\"104\" y1=\"9\" x2=\"224\" y2=\"9\" />\n", + " <line x1=\"105\" y1=\"10\" x2=\"225\" y2=\"10\" />\n", + " <line x1=\"105\" y1=\"10\" x2=\"225\" y2=\"10\" />\n", + " <line x1=\"106\" y1=\"11\" x2=\"226\" y2=\"11\" />\n", + " <line x1=\"106\" y1=\"11\" x2=\"226\" y2=\"11\" />\n", + " <line x1=\"107\" y1=\"12\" x2=\"227\" y2=\"12\" />\n", + " <line x1=\"108\" y1=\"13\" x2=\"228\" y2=\"13\" />\n", + " <line x1=\"108\" y1=\"13\" x2=\"228\" y2=\"13\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"109\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"215\" y1=\"0\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"95.0,0.0 215.0,0.0 229.9485979497544,14.948597949754406 109.9485979497544,14.948597949754406\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"58\" x2=\"229\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + " <line x1=\"229\" y1=\"14\" x2=\"229\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"109.9485979497544,14.948597949754406 229.9485979497544,14.948597949754406 229.9485979497544,58.80175857692657 109.9485979497544,58.80175857692657\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Text -->\n", + " <text x=\"169.948598\" y=\"78.801759\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >22393</text>\n", + " <text x=\"249.948598\" y=\"36.875178\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(-90,249.948598,36.875178)\">7387</text>\n", + " <text x=\"92.474299\" y=\"71.327460\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,92.474299,71.327460)\">25</text>\n", + "</svg>\n", + " </td>\n", + " </tr>\n", + "</table>" + ], + "text/plain": [ + "dask.array<transpose, shape=(1, 1, 25, 7387, 22393), dtype=uint16, chunksize=(1, 1, 1, 7387, 22393), chunktype=numpy.ndarray>" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr.dask_data" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<table>\n", + " <tr>\n", + " <td>\n", + " <table>\n", + " <thead>\n", + " <tr>\n", + " <td> </td>\n", + " <th> Array </th>\n", + " <th> Chunk </th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " \n", + " <tr>\n", + " <th> Bytes </th>\n", + " <td> 7.70 GiB </td>\n", + " <td> 47.68 MiB </td>\n", + " </tr>\n", + " \n", + " <tr>\n", + " <th> Shape </th>\n", + " <td> (1, 1, 25, 7387, 22393) </td>\n", + " <td> (1, 1, 25, 1000, 1000) </td>\n", + " </tr>\n", + " <tr>\n", + " <th> Count </th>\n", + " <td> 1211 Tasks </td>\n", + " <td> 184 Chunks </td>\n", + " </tr>\n", + " <tr>\n", + " <th> Type </th>\n", + " <td> uint16 </td>\n", + " <td> numpy.ndarray </td>\n", + " </tr>\n", + " </tbody>\n", + " </table>\n", + " </td>\n", + " <td>\n", + " <svg width=\"374\" height=\"108\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"0\" y1=\"0\" x2=\"25\" y2=\"0\" style=\"stroke-width:2\" />\n", + " <line x1=\"0\" y1=\"25\" x2=\"25\" y2=\"25\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n", + " <line x1=\"25\" y1=\"0\" x2=\"25\" y2=\"25\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"0.0,0.0 25.412616514582485,0.0 25.412616514582485,25.412616514582485 0.0,25.412616514582485\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Text -->\n", + " <text x=\"12.706308\" y=\"45.412617\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >1</text>\n", + " <text x=\"45.412617\" y=\"12.706308\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,45.412617,12.706308)\">1</text>\n", + "\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"109\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"95\" y1=\"5\" x2=\"109\" y2=\"20\" />\n", + " <line x1=\"95\" y1=\"11\" x2=\"109\" y2=\"26\" />\n", + " <line x1=\"95\" y1=\"17\" x2=\"109\" y2=\"32\" />\n", + " <line x1=\"95\" y1=\"23\" x2=\"109\" y2=\"38\" />\n", + " <line x1=\"95\" y1=\"29\" x2=\"109\" y2=\"44\" />\n", + " <line x1=\"95\" y1=\"35\" x2=\"109\" y2=\"50\" />\n", + " <line x1=\"95\" y1=\"41\" x2=\"109\" y2=\"56\" />\n", + " <line x1=\"95\" y1=\"43\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"95\" y2=\"43\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"95.0,0.0 109.9485979497544,14.948597949754406 109.9485979497544,58.80175857692657 95.0,43.85316062717216\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"215\" y2=\"0\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"109\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"100\" y1=\"0\" x2=\"115\" y2=\"14\" />\n", + " <line x1=\"105\" y1=\"0\" x2=\"120\" y2=\"14\" />\n", + " <line x1=\"111\" y1=\"0\" x2=\"126\" y2=\"14\" />\n", + " <line x1=\"116\" y1=\"0\" x2=\"131\" y2=\"14\" />\n", + " <line x1=\"121\" y1=\"0\" x2=\"136\" y2=\"14\" />\n", + " <line x1=\"127\" y1=\"0\" x2=\"142\" y2=\"14\" />\n", + " <line x1=\"132\" y1=\"0\" x2=\"147\" y2=\"14\" />\n", + " <line x1=\"137\" y1=\"0\" x2=\"152\" y2=\"14\" />\n", + " <line x1=\"143\" y1=\"0\" x2=\"158\" y2=\"14\" />\n", + " <line x1=\"148\" y1=\"0\" x2=\"163\" y2=\"14\" />\n", + " <line x1=\"153\" y1=\"0\" x2=\"168\" y2=\"14\" />\n", + " <line x1=\"159\" y1=\"0\" x2=\"174\" y2=\"14\" />\n", + " <line x1=\"164\" y1=\"0\" x2=\"179\" y2=\"14\" />\n", + " <line x1=\"170\" y1=\"0\" x2=\"184\" y2=\"14\" />\n", + " <line x1=\"175\" y1=\"0\" x2=\"190\" y2=\"14\" />\n", + " <line x1=\"180\" y1=\"0\" x2=\"195\" y2=\"14\" />\n", + " <line x1=\"186\" y1=\"0\" x2=\"201\" y2=\"14\" />\n", + " <line x1=\"191\" y1=\"0\" x2=\"206\" y2=\"14\" />\n", + " <line x1=\"196\" y1=\"0\" x2=\"211\" y2=\"14\" />\n", + " <line x1=\"202\" y1=\"0\" x2=\"217\" y2=\"14\" />\n", + " <line x1=\"207\" y1=\"0\" x2=\"222\" y2=\"14\" />\n", + " <line x1=\"212\" y1=\"0\" x2=\"227\" y2=\"14\" />\n", + " <line x1=\"215\" y1=\"0\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"95.0,0.0 215.0,0.0 229.9485979497544,14.948597949754406 109.9485979497544,14.948597949754406\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"20\" x2=\"229\" y2=\"20\" />\n", + " <line x1=\"109\" y1=\"26\" x2=\"229\" y2=\"26\" />\n", + " <line x1=\"109\" y1=\"32\" x2=\"229\" y2=\"32\" />\n", + " <line x1=\"109\" y1=\"38\" x2=\"229\" y2=\"38\" />\n", + " <line x1=\"109\" y1=\"44\" x2=\"229\" y2=\"44\" />\n", + " <line x1=\"109\" y1=\"50\" x2=\"229\" y2=\"50\" />\n", + " <line x1=\"109\" y1=\"56\" x2=\"229\" y2=\"56\" />\n", + " <line x1=\"109\" y1=\"58\" x2=\"229\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + " <line x1=\"115\" y1=\"14\" x2=\"115\" y2=\"58\" />\n", + " <line x1=\"120\" y1=\"14\" x2=\"120\" y2=\"58\" />\n", + " <line x1=\"126\" y1=\"14\" x2=\"126\" y2=\"58\" />\n", + " <line x1=\"131\" y1=\"14\" x2=\"131\" y2=\"58\" />\n", + " <line x1=\"136\" y1=\"14\" x2=\"136\" y2=\"58\" />\n", + " <line x1=\"142\" y1=\"14\" x2=\"142\" y2=\"58\" />\n", + " <line x1=\"147\" y1=\"14\" x2=\"147\" y2=\"58\" />\n", + " <line x1=\"152\" y1=\"14\" x2=\"152\" y2=\"58\" />\n", + " <line x1=\"158\" y1=\"14\" x2=\"158\" y2=\"58\" />\n", + " <line x1=\"163\" y1=\"14\" x2=\"163\" y2=\"58\" />\n", + " <line x1=\"168\" y1=\"14\" x2=\"168\" y2=\"58\" />\n", + " <line x1=\"174\" y1=\"14\" x2=\"174\" y2=\"58\" />\n", + " <line x1=\"179\" y1=\"14\" x2=\"179\" y2=\"58\" />\n", + " <line x1=\"184\" y1=\"14\" x2=\"184\" y2=\"58\" />\n", + " <line x1=\"190\" y1=\"14\" x2=\"190\" y2=\"58\" />\n", + " <line x1=\"195\" y1=\"14\" x2=\"195\" y2=\"58\" />\n", + " <line x1=\"201\" y1=\"14\" x2=\"201\" y2=\"58\" />\n", + " <line x1=\"206\" y1=\"14\" x2=\"206\" y2=\"58\" />\n", + " <line x1=\"211\" y1=\"14\" x2=\"211\" y2=\"58\" />\n", + " <line x1=\"217\" y1=\"14\" x2=\"217\" y2=\"58\" />\n", + " <line x1=\"222\" y1=\"14\" x2=\"222\" y2=\"58\" />\n", + " <line x1=\"227\" y1=\"14\" x2=\"227\" y2=\"58\" />\n", + " <line x1=\"229\" y1=\"14\" x2=\"229\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"109.9485979497544,14.948597949754406 229.9485979497544,14.948597949754406 229.9485979497544,58.80175857692657 109.9485979497544,58.80175857692657\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Text -->\n", + " <text x=\"169.948598\" y=\"78.801759\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >22393</text>\n", + " <text x=\"249.948598\" y=\"36.875178\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(-90,249.948598,36.875178)\">7387</text>\n", + " <text x=\"92.474299\" y=\"71.327460\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,92.474299,71.327460)\">25</text>\n", + "</svg>\n", + " </td>\n", + " </tr>\n", + "</table>" + ], + "text/plain": [ + "dask.array<rechunk-merge, shape=(1, 1, 25, 7387, 22393), dtype=uint16, chunksize=(1, 1, 25, 1000, 1000), chunktype=numpy.ndarray>" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr.dask_data.rechunk((1,1,25,1000,1000))" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "mean = arr.dask_data[0,0,0].mean().compute()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "std = arr.dask_data[0,0,0].std().compute()" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<table>\n", + " <tr>\n", + " <td>\n", + " <table>\n", + " <thead>\n", + " <tr>\n", + " <td> </td>\n", + " <th> Array </th>\n", + " <th> Chunk </th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " \n", + " <tr>\n", + " <th> Bytes </th>\n", + " <td> 315.51 MiB </td>\n", + " <td> 315.51 MiB </td>\n", + " </tr>\n", + " \n", + " <tr>\n", + " <th> Shape </th>\n", + " <td> (1, 1, 1, 7387, 22393) </td>\n", + " <td> (1, 1, 1, 7387, 22393) </td>\n", + " </tr>\n", + " <tr>\n", + " <th> Count </th>\n", + " <td> 3 Tasks </td>\n", + " <td> 1 Chunks </td>\n", + " </tr>\n", + " <tr>\n", + " <th> Type </th>\n", + " <td> uint16 </td>\n", + " <td> numpy.ndarray </td>\n", + " </tr>\n", + " </tbody>\n", + " </table>\n", + " </td>\n", + " <td>\n", + " <svg width=\"374\" height=\"108\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"0\" y1=\"0\" x2=\"25\" y2=\"0\" style=\"stroke-width:2\" />\n", + " <line x1=\"0\" y1=\"25\" x2=\"25\" y2=\"25\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n", + " <line x1=\"25\" y1=\"0\" x2=\"25\" y2=\"25\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"0.0,0.0 25.412616514582485,0.0 25.412616514582485,25.412616514582485 0.0,25.412616514582485\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Text -->\n", + " <text x=\"12.706308\" y=\"45.412617\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >1</text>\n", + " <text x=\"45.412617\" y=\"12.706308\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,45.412617,12.706308)\">1</text>\n", + "\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"109\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"95\" y1=\"43\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"95\" y2=\"43\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"95.0,0.0 109.9485979497544,14.948597949754403 109.9485979497544,58.80175857692656 95.0,43.85316062717216\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"215\" y2=\"0\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"109\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"215\" y1=\"0\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"95.0,0.0 215.0,0.0 229.9485979497544,14.948597949754403 109.9485979497544,14.948597949754403\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"58\" x2=\"229\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + " <line x1=\"229\" y1=\"14\" x2=\"229\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"109.9485979497544,14.948597949754403 229.9485979497544,14.948597949754403 229.9485979497544,58.80175857692656 109.9485979497544,58.80175857692656\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Text -->\n", + " <text x=\"169.948598\" y=\"78.801759\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >22393</text>\n", + " <text x=\"249.948598\" y=\"36.875178\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(-90,249.948598,36.875178)\">7387</text>\n", + " <text x=\"92.474299\" y=\"71.327460\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,92.474299,71.327460)\">1</text>\n", + "</svg>\n", + " </td>\n", + " </tr>\n", + "</table>" + ], + "text/plain": [ + "dask.array<transpose, shape=(1, 1, 1, 7387, 22393), dtype=uint16, chunksize=(1, 1, 1, 7387, 22393), chunktype=numpy.ndarray>" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "BF = aicsimageio.AICSImage(\n", + " '/home/aaristov/Anchor/Lena/Data/20211220-MIC/timelapse/00ng-timelapse-BF.nd2').dask_data\n", + "BF" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "fluo = aicsimageio.AICSImage(\n", + " '/home/aaristov/Anchor/Lena/Data/20211220-MIC/timelapse/00ng-timelapse-TRITC-30\\'-MaxIP.nd2')" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PhysicalPixelSizes(Z=None, Y=0.6689905570125603, X=0.6689905570125603)" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fluo.physical_pixel_sizes" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<table>\n", + " <tr>\n", + " <td>\n", + " <table>\n", + " <thead>\n", + " <tr>\n", + " <td> </td>\n", + " <th> Array </th>\n", + " <th> Chunk </th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " \n", + " <tr>\n", + " <th> Bytes </th>\n", + " <td> 6.47 GiB </td>\n", + " <td> 315.51 MiB </td>\n", + " </tr>\n", + " \n", + " <tr>\n", + " <th> Shape </th>\n", + " <td> (21, 1, 1, 7387, 22393) </td>\n", + " <td> (1, 1, 1, 7387, 22393) </td>\n", + " </tr>\n", + " <tr>\n", + " <th> Count </th>\n", + " <td> 63 Tasks </td>\n", + " <td> 21 Chunks </td>\n", + " </tr>\n", + " <tr>\n", + " <th> Type </th>\n", + " <td> uint16 </td>\n", + " <td> numpy.ndarray </td>\n", + " </tr>\n", + " </tbody>\n", + " </table>\n", + " </td>\n", + " <td>\n", + " <svg width=\"374\" height=\"108\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"0\" y1=\"0\" x2=\"25\" y2=\"0\" style=\"stroke-width:2\" />\n", + " <line x1=\"0\" y1=\"1\" x2=\"25\" y2=\"1\" />\n", + " <line x1=\"0\" y1=\"2\" x2=\"25\" y2=\"2\" />\n", + " <line x1=\"0\" y1=\"3\" x2=\"25\" y2=\"3\" />\n", + " <line x1=\"0\" y1=\"4\" x2=\"25\" y2=\"4\" />\n", + " <line x1=\"0\" y1=\"6\" x2=\"25\" y2=\"6\" />\n", + " <line x1=\"0\" y1=\"7\" x2=\"25\" y2=\"7\" />\n", + " <line x1=\"0\" y1=\"8\" x2=\"25\" y2=\"8\" />\n", + " <line x1=\"0\" y1=\"9\" x2=\"25\" y2=\"9\" />\n", + " <line x1=\"0\" y1=\"10\" x2=\"25\" y2=\"10\" />\n", + " <line x1=\"0\" y1=\"12\" x2=\"25\" y2=\"12\" />\n", + " <line x1=\"0\" y1=\"13\" x2=\"25\" y2=\"13\" />\n", + " <line x1=\"0\" y1=\"14\" x2=\"25\" y2=\"14\" />\n", + " <line x1=\"0\" y1=\"15\" x2=\"25\" y2=\"15\" />\n", + " <line x1=\"0\" y1=\"16\" x2=\"25\" y2=\"16\" />\n", + " <line x1=\"0\" y1=\"18\" x2=\"25\" y2=\"18\" />\n", + " <line x1=\"0\" y1=\"19\" x2=\"25\" y2=\"19\" />\n", + " <line x1=\"0\" y1=\"20\" x2=\"25\" y2=\"20\" />\n", + " <line x1=\"0\" y1=\"21\" x2=\"25\" y2=\"21\" />\n", + " <line x1=\"0\" y1=\"22\" x2=\"25\" y2=\"22\" />\n", + " <line x1=\"0\" y1=\"24\" x2=\"25\" y2=\"24\" />\n", + " <line x1=\"0\" y1=\"25\" x2=\"25\" y2=\"25\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n", + " <line x1=\"25\" y1=\"0\" x2=\"25\" y2=\"25\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"0.0,0.0 25.412616514582485,0.0 25.412616514582485,25.41261651458248 0.0,25.41261651458248\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Text -->\n", + " <text x=\"12.706308\" y=\"45.412617\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >1</text>\n", + " <text x=\"45.412617\" y=\"12.706308\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,45.412617,12.706308)\">21</text>\n", + "\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"109\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"95\" y1=\"43\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"95\" y2=\"43\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"95.0,0.0 109.9485979497544,14.948597949754403 109.9485979497544,58.80175857692656 95.0,43.85316062717216\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"215\" y2=\"0\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"95\" y1=\"0\" x2=\"109\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"215\" y1=\"0\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"95.0,0.0 215.0,0.0 229.9485979497544,14.948597949754403 109.9485979497544,14.948597949754403\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Horizontal lines -->\n", + " <line x1=\"109\" y1=\"14\" x2=\"229\" y2=\"14\" style=\"stroke-width:2\" />\n", + " <line x1=\"109\" y1=\"58\" x2=\"229\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Vertical lines -->\n", + " <line x1=\"109\" y1=\"14\" x2=\"109\" y2=\"58\" style=\"stroke-width:2\" />\n", + " <line x1=\"229\" y1=\"14\" x2=\"229\" y2=\"58\" style=\"stroke-width:2\" />\n", + "\n", + " <!-- Colored Rectangle -->\n", + " <polygon points=\"109.9485979497544,14.948597949754403 229.9485979497544,14.948597949754403 229.9485979497544,58.80175857692656 109.9485979497544,58.80175857692656\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", + "\n", + " <!-- Text -->\n", + " <text x=\"169.948598\" y=\"78.801759\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >22393</text>\n", + " <text x=\"249.948598\" y=\"36.875178\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(-90,249.948598,36.875178)\">7387</text>\n", + " <text x=\"92.474299\" y=\"71.327460\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,92.474299,71.327460)\">1</text>\n", + "</svg>\n", + " </td>\n", + " </tr>\n", + "</table>" + ], + "text/plain": [ + "dask.array<transpose, shape=(21, 1, 1, 7387, 22393), dtype=uint16, chunksize=(1, 1, 1, 7387, 22393), chunktype=numpy.ndarray>" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "maxIP = aicsimageio.AICSImage(\n", + " '/home/aaristov/Anchor/Lena/Data/20211220-MIC/timelapse/00ng-timelapse-TRITC-30\\'-MaxIP.nd2').dask_data\n", + "maxIP" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Image layer 'maxIP' at 0x7fa349c67b80>" + ] + }, + "execution_count": 142, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# v.add_image(BF, name='BF', colormap='gray', blending='additive', opacity=.5)\n", + "v.add_image(maxIP, name='maxIP', colormap='inferno', blending='additive', opacity=1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(818, 2612)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "template = tf.imread('/home/aaristov/Anchor/Lena/Data/20210518_control/template_bin16_bf_mask.tif')[0]\n", + "template.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "mask = tf.imread('/home/aaristov/Anchor/Lena/Data/labels_bin2+100.tif')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AICSImageIO: Reader will load image in-memory: False\n" + ] + } + ], + "source": [ + "tvec_8 = r.register(r.pad(template, bf.shape), (bf:=BF[0,0,0,::8,::8].compute()))" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "tvec = r.scale_tvec(tvec_8, 8)" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "input (7387, 22393)\n" + ] + } + ], + "source": [ + "aligned_mask = r.transform(r.pad(mask, BF[0,0,0].shape), tvec)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "aligned_mask = mic.segment.label(aligned_mask>0)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(7387, 22393)" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aligned_mask.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Image layer 'mask' at 0x7fa349e2c1c0>" + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v.add_image(aligned_mask, name='mask', colormap='blue', blending='additive', opacity=.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": {}, + "outputs": [], + "source": [ + "tf.imwrite('/home/aaristov/Anchor/Lena/Data/20211220-MIC/timelapse/labels.tif', aligned_mask, )" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [], + "source": [ + "def do_counts(fluo, labels=aligned_mask, thr=mean+10*std):\n", + " frame_idx, fluo = fluo\n", + " maxIP = fluo[0,0].compute()\n", + " print(frame_idx, maxIP.shape)\n", + " detections = count.peak_local_max_labels(maxIP, labels=labels, threshold_abs=thr, min_distance=5)\n", + " peaks = np.zeros((len(detections), 6))\n", + " peaks[:,-3:] = detections[:,:]\n", + " peaks[:,0] = frame_idx\n", + " return peaks\n" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 (7387, 22393)\n", + "1 (7387, 22393)\n", + "2 (7387, 22393)\n", + "3 (7387, 22393)\n", + "4 (7387, 22393)\n", + "5 (7387, 22393)\n", + "6 (7387, 22393)\n", + "7 (7387, 22393)\n", + "8 (7387, 22393)\n", + "9 (7387, 22393)\n", + "10 (7387, 22393)\n", + "11 (7387, 22393)\n", + "12 (7387, 22393)\n", + "13 (7387, 22393)\n", + "14 (7387, 22393)\n", + "15 (7387, 22393)\n", + "16 (7387, 22393)\n", + "17 (7387, 22393)\n", + "18 (7387, 22393)\n", + "19 (7387, 22393)\n", + "20 (7387, 22393)\n" + ] + } + ], + "source": [ + "peaks = list(map(do_counts, enumerate(maxIP)))" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Points layer 'detections' at 0x7fa34a07cc10>" + ] + }, + "execution_count": 144, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AICSImageIO: Reader will load image in-memory: False\n", + "AICSImageIO: Reader will load image in-memory: False\n" + ] + } + ], + "source": [ + "v.add_points(np.concatenate(peaks, axis=0)[:,:5], name='detections', size=20, edge_width=3, edge_color=\"#ff00ff\",face_color='#ffff0000', opacity=1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(data=np.concatenate(peaks, axis=0), columns=('frame','c','z','y','x','label'))\n", + "counts = df.groupby(['frame', 'label']).count().reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv('/home/aaristov/Anchor/Lena/Data/20211220-MIC/timelapse/00ng-timelapse-TRITC-30\\'-MaxIP.detections.csv', index=None)" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<matplotlib.axes._subplots.AxesSubplot at 0x7fa2e33b3a60>" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEGCAYAAABiq/5QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3iT5frA8e/bJmnapnvTtHRBKXuUvUEEAdGjOFFxAooet6jnd9x63AtBRBy4QEURRFT2nmXPQikt3XumSbOe3x8pVWQVmrRFn891cdWk77hb4c7zPuN+FCEEkiRJ0j+HW3MHIEmSJDUtmfglSZL+YWTilyRJ+oeRiV+SJOkfRiZ+SZKkfxhVcwfQEMHBwSImJqa5w5AkSbqk7Nixo1gIEfLX9y+JxB8TE0NKSkpzhyFJknRJURQl80zvy64eSZKkfxiZ+CVJkv5hZOKXJEn6h7kk+vjPxGKxkJ2djclkau5QXE6r1aLX61Gr1c0diiRJfwOXbOLPzs7Gx8eHmJgYFEVp7nBcRghBSUkJ2dnZxMbGNnc4kiT9DVyyXT0mk4mgoKC/ddIHUBSFoKCgf8STjSRJTeOSTfzA3z7pn/RP+TklSWoal3TilyRJ+rsyVdWw67u1WM0Wp19bJv5G0Ol05/x+RkYGHTt2vKBr3n777SxYsKAxYUmSdImz2+1s+eRX0tfvpbqowunXl4lfkiSphTmwZAuFh7PoduMw/CODnX59mfidoLq6muHDh9O9e3c6derEokWL6r9ntVqZOHEinTt3Zvz48dTU1ACwY8cOBg8eTI8ePRg5ciR5eXnNFb4kSS1I3r7jHFq6jdh+HYjr38El95CJ3wm0Wi0LFy5k586drF69mkcffZSTW1qmpqYyadIk9u7di6+vLzNnzsRisfDAAw+wYMECduzYwZ133sl//vOfZv4pJElqbobiCrZ+9hv+USF0u3Goy+5zyc7jb0mEEDz99NOsW7cONzc3cnJyKCgoACAqKor+/fsDcMstt/D+++8zatQo9u/fz4gRIwCw2WxEREQ0W/ySJDU/m8XKpo+XIoSg36QxqDSuS88y8TvB119/TVFRETt27ECtVhMTE1M/7/6vUzEVRUEIQYcOHdi8eXNzhCtJUgu0+/u1lGUW0H/KlehC/F16L9nV4wQVFRWEhoaiVqtZvXo1mZl/VEI9ceJEfYKfN28eAwYMIDExkaKiovr3LRYLBw4caJbYJUlqfhlbDnFs3T4SL+9BZNd4l99PJn4nmDBhAikpKSQnJ/P111/Trl27+u8lJSUxd+5cOnfuTGlpKffeey8ajYYFCxYwbdo0unTpQteuXdm0aVMz/gSSJDWX8pxidny9kpA2kXS6qn+T3FN29TRCdXU1AMHBwWfttjl48OAZ3+/atSvr1q077f3PP//cafFJktSyWYy1bPpoCWpPDX3uHo2be9O0xWWLX5IkqRkIIdj+xXIMxRX0vWc0nn7eTXZvmfglSZKawZGVu8jelUanq/sT0kbfpPeWiV+SJKmJFaflsvfHDUR2iSdxRI8mv79M/JIkSU3IVFnD5o9/wTvIl563X94s1XddmvgVRfFXFGWBoiiHFUU5pChKX0VRAhVFWa4oytG6rwGujEGSJKmlOFl8zVxjot/kMWg8PZolDle3+N8DfhNCtAO6AIeAJ4GVQog2wMq615IkSX97BxZvpjA1i+43DcNfH9Jscbgs8SuK4gsMAj4BEEKYhRDlwFXA3LrD5gJXuyoGV/vtt99ITEwkISGBV199tbnDkSSpBcvdm86h37YT278jsf1cU3ytoVzZ4o8DioDPFEXZpSjKHEVRvIEwIUQeQN3X0DOdrCjKJEVRUhRFSSkqKnJhmBfHZrMxdepUfv31Vw4ePMi8efPOOmdfkqR/turiCrZ+/jv+USF0v3FIc4fj0sSvAroDHwohugEGLqBbRwgxWwiRLIRIDglpvkeis9m2bRsJCQnExcWh0Wi48cYbTynHLEmSBI7ia5tn/wJAv0ljcVc3/7pZV0aQDWQLIbbWvV6AI/EXKIoSIYTIUxQlAihs7I0MuSewGWsae5lTuHt64d0q+qzfz8nJISoqqv61Xq9n69atZz1ekqR/pl3frqHsRCED7huHLsSvucMBXNjiF0LkA1mKoiTWvTUcOAgsBibWvTcRuCSbySfr7f+Z3BRdkqQ/y9h8kPQN+2k3MplWneOaO5x6rn7meAD4WlEUDZAO3IHjw+Y7RVHuAk4A1zX2JudqmbuKXq8nKyur/nV2djatWrVq8jgkSWqZyrOL2PHNSkIT9XQc16+5wzmFSxO/EGI3kHyGbw135X2bQs+ePTl69CjHjx8nMjKS+fPn88033zR3WJIktQBmYy2bPvoFtZeWPndd0WTF1xqq+UcZLlEqlYoPPviAkSNHYrPZuPPOO+nQoXmnaEmS1Pzqi6+VVDDk4fFofZuu+FpDycTfCKNHj2b06NHNHYYkSS3IkRU7ydmVRpdrBxLSJrK5wzmjlvX8IUmSdAkrOprD3oUbiOyWQNvLujd3OGclE78kSZITGCsMbJ6zFO8gP3reNqJFz/KTiV+SJKmR7DZH8TVLTW2zFl9rKJn4JUmSGmn/4k0UHcmmx4TmLb7WUDLxS5IkNULOnmMc/j2FuIEdienTvrnDaRCZ+CVJki5SdVE52z7/nYDoULpdP6S5w2kwmfgbwWQy0atXL7p06UKHDh149tlnmzskSZKaiNVsZdPsX1AUhb6TxrSI4msNdelE2gJ5eHiwatUqdDodFouFAQMGcMUVV9CnT5/mDk2SJBfb9e1qyrOKGDD1KnTBLaP4WkPJFn8jKIqCTqcDwGKxYLFYWvQULkmSnOP4pgMc33iApFE9adUptrnDuWB/ixZ/3qadmErKnHpNbVAAEf3OvwDDZrPRo0cP0tLSmDp1Kr1793ZqHJIktSxlWYXsnLeK0MQoOozr69J7VVcZ0Pk4v+SDbPE3kru7O7t37yY7O5tt27axf//+5g5JkiQXMdeY2Dz7FzQni6+5OTeF2mw29u46yKz3Pue2a6YysMuV5Oc2esuS0/wtWvwNaZm7mr+/P0OGDOG3336jY8eOzR2OJElOJoRg+9zlGEqqGPrIeLS+Xk65bmFBMZvWbmPTuu1sXp9CRXkliqLQoXMid903AXd3d6fc58/+Fom/uRQVFaFWq/H398doNLJixQqmTZvW3GFJkuQCqct3kLPnGF3GDyI44eL33qg11bIrZR8b125n07ptHD2cDkBwSCCDL+tHv0E96TswmYBAf2eFfhqZ+BshLy+PiRMnYrPZsNvtXH/99YwdO7a5w5KkS1KNoYZH730Wq9VGYlI8iR0SSExKIDahNepmnipZeCSbfT9tRN+9DW2Hd7ugc4UQZKRnsWndNjat3c72zbswmWpRa9R0S+7EQ09NZsDg3rRpF9dkk0Nk4m+Ezp07s2vXruYOQ5IueUIIXnjqLTavT6FdhzZ8++VP1NaaAVBr1MQntCaxQwJtkxJo1z6BxPYJ+Pr5NElsxgoDW+YsRRfiT89bL2tQcq6qrGbbpp1srOvCyc3OB6B1rJ5/3TCafoN70bNPV7y8ndNddKFk4pckqdl9++VPLF20gvsfu5tJD9yK1WolMz2b1ENppB5MI/XQMTas2cai73+rPyciMoy2SfG0a1/3gdAhgcioCKcOuNptdrbMWYrFaGbQg9egPkvxNbvdzqH9R9i4Zhsb121j786D2Gw2vHVe9OrXnTum3ET/wb3QR19YF5EQwiVPATLxS5LUrPbtPsTrL3zAoGF9uXvqBMCxw1182xji28Yw+qrL6o8tLiwh9dAxxwfCgTSOHDrG+lVbsNvtAHh5e5KYlEDbuq6idu0TSEiMQ6u9uGqZ+37aSNHRHHrdPhL/yOBTvldUUMKm9dvZtHYbWzakUFZaAUBSx7bcMeUm+g3uRZfuHS66m2rnxr3Mn/0jz0x/HJ2Td/GSiV+SpGZTVlrOo/c+Q2hYMC+/8/R5W+vBoUEEhwbRf3Cv+vdMplqOHTnO4QMnnw7SWLJwGd9++RMAbm5uxMRF0bZ9PO3at6l/SggODTrnvXJ2p5G6fAdxAzsR0ycJc62ZXSn7HX3167aTejANgMDgAPoP6U3/Qb3oMzCZoOCARv1OqiqqmfPmV6xavB59bCvKSipk4pck6e/BZrPx1EMvU1Jcxhc/fICfv+9FXUer9aBD53Z06Nyu/j273U5udr7jw6Cuu2jvzoP8tnhV/TGBwQF13UTxJNaNG8TERaFSqagqLGfb58uw+XmQairj8zufZPvm3RhrjKhU7nRL7sSD0ybRb1BPEtsnOK17aeOKbcx65XOqKqq5/p6ruOGeq9F4aJxy7T+TiV+SpGYxe/qXbFq7jf++8ugpSdsZ3Nzc0Ee3Qh/disuuGFT/fmVFFUcOHePwwTSOHEzj8ME0vv7sByxmCwBqtZpofTg61JwoLKDMYAAgqnUk464dSb/BvejVtxveOucOypYWlTHrf3PZvHI78UkxPD/zCfz8fJn/5nfc8Mh1eDh5YxeXJn5FUTKAKsAGWIUQyYqiBALfAjFABnC9EMK59RYkSWrRNq7dxqx3P2fsNZcz/uYrm+y+vn4+9OjdhQ5JbSjvXUR5VhElmfkcOZDG8YxsCirLKaisIMNYQlKntgwbM4R+g3sSHaN3STxCCFYuWsecN7/CXGth4oM38q/bRlOYXcQ7D7yP2WRmeG4JkfEXv27gTJqixT9UCFH8p9dPAiuFEK8qivJk3etLdtVTeXk5d999N/v370dRFD799FP69nVt/Q5JupTl5RTw1IMvEd82hv++8qhL567bbXaqCsoozyqiPPvkn2Jqq2rqj/EK9KFtu3h6XdYH/6gQ/PXBeAf5obi5dk59QU4RH7wwh91b9tOheyIPPHsPkTERZBzK5MNps1Gp3Hno/ftpFefcpA/N09VzFTCk7r/nAmu4hBP/gw8+yKhRo1iwYAFms5mamprznyRJ/1AWs4XHpj6HxWLh7Vkv4umpddq1zcZaKuoS+8lEX5Fbgt1qA8BN5Y5vRCARHWPw1zsSvJ8+BA/vU2MQdjtF+9LQBvriExmC4vR6PHZ+mb+ML6d/h6Io3PufOxg1fhhubm4cTknl4//7FN9AH6a+OYXgVsHnv+BFcHXiF8AyRVEE8JEQYjYQJoTIAxBC5CmKEnqmExVFmQRMAoiOjnZxmBensrKSdevW8fnnnwOg0WjQaJw/ECNJfxdvvjSDfbsO8ubM54mJi7qoawghqCmppDy7iLKsIiqyiynPLsJQUll/jMZbi39UCAlDujiSfFQIvuEBuDWg7k3mmp1krXMszFRpPfCPa0VAQhQBCXo8Gjm7Jis9h+nPf8yh3UfpMaAL9/3fnYRGOJL77nV7mfviF4ToQ5n65mT8glxX49/Vib+/ECK3LrkvVxTlcENPrPuQmA2QnJwsznXs6k9/pyijoHGR/kVITBhD7xx5zmPS09MJCQnhjjvuYM+ePfTo0YP33nsPb2/nl1GVpEvdr4tXMm/uQm696zouHzOkQefYLFYqckvqu2gq6rprLEbHql4U8AkNIDAmjNgBHQnQh+CnD8HT3/uiupBKj2aRtW4XoZ0TCGwbTVlaNmVp2RQfPA6AV0gAAQl6AhL0+EWH49bAOfpWi5UfPl/C/I8W4uml5ZGX72XImP71MW5eupV5b35LTFJrprx6D14+rl3R69LEL4TIrftaqCjKQqAXUKAoSkRdaz8CcH7N0SZitVrZuXMn06dPp3fv3jz44IO8+uqrvPjii80dmiS1KMeOZPDctDfqatNMOeMxQghKjuVRnJ7r6K7JLqIqvxRhd7T7VB5q/CKDie6ZWNdVE4JfZDAqD7VTYjSVV5H642q8wwJJGDsQd42KkI7xjieMwrK6D4EscrcdIGfzPtxU7vjFRBAQrycgIQrPYL8zftikHTzOe8/OJuPICQZc3pvJT07E/0+t+ZXzV/PTrMW065nI3S/c4fQZPGfissSvKIo34CaEqKr778uBF4DFwETg1bqvixp7r/O1zF1Fr9ej1+vrN18ZP348r776arPEIkktlaP42jN4eml5Y+Zzp61ktdvt5OxK4/DvKZSdcLQDPQN0+OtDiOwSj78+GH99CLoQf5cNuNqtNg59twJht5N0/WW4a/6IUVEUvMMC8Q4LRN+/MzazhYqMPMqOOZ4G0n/fAr9vwcNPV/choMc/thU2RWHerB9Z+MUv+Af68vQ7D9N3WHL9dYUQ/DxnKcu/XkG3oV257ekJqJqoGJ0r7xIGLKz7BFQB3wghflMUZTvwnaIodwEngOtcGINLhYeHExUVRWpqKomJiaxcuZL27ds3d1iS1GIIIXjuyTfISM9i9tdvERr2x2Cl1WwlY8tBjizfQXVRBboQf3pMGI6+WwIeOs8mjTP9t81U5xaTdMMIPM/Tt+6uURPYNprAto6xR1NZVf2HQNH+Y+TvPExWSQXL9h6lpLyaoSP7cM9/bsfnT0Xl7DY73727gI0/b6b/lX25/qHxuLk33b5YLkv8Qoh0oMsZ3i8Bhrvqvk1t+vTpTJgwAbPZTFxcHJ999llzhyRJLcb8uQv5bfEq/v3EPfSq2zDJbDCRtm4vR1ftpraqhsDWYfSbNIBWXeOdvqNVQxTuTSMv5RD6fp0JToq54PO1AT5EJCcRkZxEdYWBT179nBXrdhHg680N/bvQ2kvL/lkLHU8D8Xp00WF898Eidq7exYgJl3Hl3aObfK9uuXK3kbp27UpKSkpzhyFJLc6enQd446UZDBrelzvvvZmasiqOrNxF+vp9WGsthLdvTbuRyYS01Td54jvJUFjK0Z/X49s6nJjhPRt1rZQNu5nx4qeUFJRy1S1XcMvU8bgJQfmxnPongrw9R9l0IIv8UgMDh3Vh4PCuCJsdReX8XbbORSZ+SZKcrrSknMfue5aw8BCefOJeUr5cwYlthxFCENWjLe1GJuOvD2nWGK0mM4e+XYG7Rk3S+OEoF9nVUlFWxZw3vmTNLxuJiovk9S+epV3nNvXfD+2cQGjnBAyVBj58bBYFZTUM7NeOVtjY/8VS3NQq/GMi8E9wPBF4Bp15kNiZZOKXJMmpbDYbTz34IqXF5Tx68w1sench7moVcQM70fay7uiCXTc/vaGEEBxdvA5jaSWdJo5BcxHTJ4UQbFi2lY/+N5fqKgM3Tv4X1999FWrN6bOMKkoqmPn4RxRmFXLncxPpOrgLtloL5Rm5jtlCx7IpPZoFgIe/zrFuIN4xSKzSyiJtkiS1YMIuePPpd9m8PoXRHbviZbCRMKY3CUO6oHXx3PQLkbtlP8UHjxNzWS/8YyIu+PySwjI+fOUztq7eQUKHOF56/ili2px5oWlxbjEzHptFZWkVk/93D+2SEwFw91ATlNiaoMTWABhLK/8YJN6bRn7KIRQ3ha73XI0uwrkreGXilySp0WxWGye2HWbxZ4v4etnvdI+L545HJhI/oJPT5tk7S8WJfI4v30pQYmv0/Ttf0LlCCJYvXMunb3+NxWzhzkduZtyEUbifpY8+Nz2PGY/Pwmq28sDb9xHTvvVZr+0Z6ItnYHta9WyP3WqjMruQ8mPZeIU0rr7/mcjEL0nSRbOYzKRv2M+RlTvJyy1k3uY1xLTWM+Pn6XjrWt4KdnO1kcPfr8TDz4e2Vw++oL70/OxCpj8/h73bDtAxOYkHnr2bVtHhZz3++IEMZj35MWoPNQ+9fz8RsQ1/snBTuTv6/S/iaaQhZOKXJOmCmSoNHF21m7R1e7HU1BIQF8GylA24aVRMn/tai0z6wm4n9YdVWI21dLlrFKoGrpC12ewsmfc7X07/Hjd3han/vYvLrxlyzqmnfxRb82XqW1MIjjj3bl9NTSb+Rnjvvff4+OOPEUJwzz338NBDDzV3SJLkUtVF5aQu38HxTQex22xEdk2g3eU9mPXJfI4cOc7bs16kdaxratc3VubqHZQfz6XNVYPQNTARZ6ZlM/252aTuO0bPQd247//uIDjs3OfuWrObuS99RVjrMKa+PhnfoIvbWcyVZOK/SPv37+fjjz9m27ZtaDQaRo0axZgxY2jTps35T5akS0xpZgGHf08hZ1cairsbMX2SaHtZd3zDA/nlp+V8++VPTJx04ym7XbUkpUdOkLV+N2HdEgnvlnje4y0WKws+Wcx3H/+El48Xj706lUGj+p63a2jTki3Mf/s7YtvHMPl/9+Dl07QrkBtKJv6LdOjQIfr06YOXl2OmwuDBg1m4cCFPPPFEM0cmSc4hhKDg0AkOL0uh8HAWaq2GxMt70GZYNzz9HF05aUeO8/yTb9K9V2cenHZPM0d8ZqayKlJ/XIN3eBDxo/ud89jqSgPrf9/CknnLOHEsm8Gj+3HP47fiF3j+VvuKeStZ9NES2vdO4q7nb0fjgmmYzvK3SPyvPT+9fsd7Z0lsn8C0Zx846/c7duzIf/7zH0pKSvD09GTp0qUkJyef9XhJulTYbXaydx7l8LIUyrOK0Pp50/maAcQP7IT6T/3ihuoaHpnyDN46L9744DlUqpaXTuwWq6P4mhCO4mtnKIJms9rYtXkfKxevY+uanVjMFqLj9fz3vUfpNaT7ee8hhGDx7CWsmLeK7sO6cetTNzdZsbWL1bKja8GSkpKYNm0aI0aMQKfT0aVLlxb5F1+SGspqtpKx6QCpK3ZgKK7EJyyA5Fsvo3WvdqclTCEEz017nRPHs/n4m7cJOU+/d3M59ttmqvOKaX/j5Xj+pdWecfQEKxevZ+3STZQVl+Pjr2PktUMZPm4Q8UkxDZrxY7fZ+fad79m0ZAsDxvXjugevbdJiaxfrb5GpztUyd6W77rqLu+66C4Cnn34avb5lDmpJ0rkIITi6ejeHft1GbZWRoNhwuo4fRKvO8Wctg/zN5z/w+5LVPPTkZHr27dbEETdMwe4j5O84jL5/F4LaOebPV5RWsvbXTaxcvJ70wxm4q9zpObAbw8YNJHlg19NKRp+LxWzly1e+YteaPYy8ZQRj7rqi2WoOXai/ReJvLoWFhYSGhnLixAl+/PFHNm/e3NwhSdIFsVmspHy1ksythwhLiqb96F4EJ0SeM4Ht2bGft16ayZAR/bljyk1NGG3DGQpKSVuyAb+YCCIHdmXTiu2s+nkdKRv2YLPaSGgfy6RptzHoin74Bfic/4J/UVtTy5xnPuVwyhH+dd9VDLt+iPN/CBeSib8Rrr32WkpKSlCr1cyYMYOAAOevsJMkVzFV1rBx1s+UpOfRcVxfkq7odd4Wa2lJOY9NfY7wVmG89NZTLbKFazWZOTh/GYXVRnZn5vPq5Q9QVVFNYIg/V90yimFXDqJ1wsU/nRsqDcx68mMyD59gwrQb6XNFbydG3zRk4m+E9evXN3cIknRRyrOL2DBzMbVVRvreM4aoHuefhmyz2Xjy3y9QVlrBlz/OwNfvwlvKrlacX8J3r85lW8ohSqpq0Hio6TM0mWHjBtK1d8ezllZoqIriCmY8/hFF2YXc9fztdBl4YSUfWgqZ+CXpHyZnzzG2fvobak8Phj52HYGtwxp03ofvfM6WDTt47rUnSOrY1sVRNpzJWMuW1SmsWrye3Vv2I4QgPj6Smx6+if4jeqPzdc4q4qKcYmY89iHV5QamvDqJxB4t53dwoWTil6R/CCEEqct2sPenDQREhzHg3ivx9Nc16Nz1q7Ywe/oXXH3dFVxz4xgXR3p+QggO7kpl5eL1bFi2BaPBRHBoAH0SoxkwpAcDp1zj1G6onGO5zHx8FjarnQfeuY/W7c5cifNScUknfiFEi+xjdDYhRHOHIF3ibBYrO75ZRcbmg0T1aEPPiZejOkPd+DPJycrjqYdeIrF9Ak+/9LCLIz23/OxCVi9Zz6qfN5CfXYjW04N+I3ox6LJeWLYdxN1DTbc7rnRqXkjff5xZT36Mh1bD/e/fR0TM2QuzXSou2cSv1WopKSkhKCjob538hRCUlJSg1WqbOxTpEmWqqmHTR0soTsulw9g+tB/Tu8H/Zsy1Zh6771nsdjtvffg8Wm3DCps5U43ByMZlW1n583oO7DiMoih07tWem6ZcQ9/hPdF6aNj35VJMtWY63XqFUzcuObTtMHOe+Qy/YD/uf3MKgeGBTrt2c7pkE79eryc7O5uioqLmDsXltFqtXCMgXZSKnGI2zFyMqdJA37tHE5V8Yf3Sr70wnQN7U3l39ktExzTd30Gbzc7ebQdYtXg9m1Ztx2wy0yo6nFvuv46hYwcQ+qeNSTJWbKciI4+2Vw/GO9x5C8l2rt7FFy9/TURMOPe+PhnfwJY3mH2xLtnEr1ariY2Nbe4wJKnFyt13nC1zlqLSahj66HUEXmAXxZIfl/H9V4u5Y8pNDBs50EVRnionI48Vi9ay5peNFBeU4u3jxbCxAxg+bhCJnRNOe1IpSc0ka8Nuwru3I6xr4wdbbVYbVWVV7Fm/lx+m/0Rcp1gmv3I3nrqWWWztYl2yiV+SpDMTQnBkxU72/LiegKhQ+t87Dq+Ahg3innQ0NZ0XnnqT5D5deeDxu10U6R8O7krlh8+WsG3tTtzc3ejerzN3PjqB3kO6o/E4c9eNsbSSIwvXoIsIJv6Kvme9tt1mx1BpoLK0isrSSipLq6gqq3J8Pfm61PHaUGmoP69Dn/bc+dzEFl1s7WK5PPEriuIOpAA5QoixiqLEAvOBQGAncKsQwuzqOCTpn8BmtbHzm1Uc33QAffc29Lq94YO4J1VXGXhkyjPofLx5ffozLqtBZbfbSVm3mwWf/cyh3Ufw8dNx05RrGDV+GIHn2W7QZraw+6tfqag24dOvK7vW7T0tsVfVva4qr0bYT58godFq8A30wSfQh9DoUOK7xOMb6INvoA/+If60S05s9Lz/lqopWvwPAoeAkxWSXgPeEULMVxRlFnAX8GETxCFJf2u11UY2fbSEoqM5tB/Tmw5j+py11s7ZCCF49onXyM7M5eN57xAc6vziaxaLlbVLN/Lj57+QlZ5DaKtgJk27jRFXD8bd3Z3yonLS96XXJfK65F1WVf+6qrSSipJK7Da744IbDtdf213lXpfMffEP8SMqMaoumfviE6DDN9C3/rWHV9MPVLcULk38iqLogTHAy8AjiqODbqDzThwAACAASURBVBhwc90hc4HnkIlfkhqlIreEDTMXYSw30OeuUUT3bHdR1/nq0wUsX7qWh5+aQnLvLk6NscZgZNkPq1n01a8UF5QS0zaaR1+5jwGX90alVpFzLJcZj31IVVn1Kecpbgo6P119wvb38STUw52Idq1p3afDKYndy8frbz3Lz1lc3eJ/F3gCODkcHgSUCyGsda+zgcgznagoyiRgEkB09KW9WEKSXClv/3G2zPkVd42KoY+OJ+gCNvX+s13b9/HOKx8ybOQAbp98o9PiKyup4Odvfmfpt8sxVNXQKTmJ+5+9m+79Otcn6bzjeXzwyExUahUTpt2EX5AvPnUJXefnXV/quDq/hD1zFuHToSudbh2NcgmUQG6JXJb4FUUZCxQKIXYoijLk5NtnOPSMq5OEELOB2QDJyclyBZMk/YUQgiMrd7H3h/X46YMZcO84vC5yymFJcRmPT32OiMhwXnjjSae0mnNP5LNw7i+sXLweq8VKn2HJXHv7WBI7J5xyXH5mAdMf+RA3lTsPvDuVUH3IGa9nNZk59N0KVJ4etBs/TCb9RnBli78/ME5RlNGAFkcf/7uAv6IoqrpWvx7IdWEMkvS3ZLPa2DV/Nekb9hPZLYHet49E5XFhg7gmUy07tu5h09ptrPx9PRXllXz104eNLr6WdvA4Cz77mc0rtuHm7s7wcQO5+rbR6GNanXZsYXYR0x+ZCcADb9931qQvhODIT2uoLa+i0+1j0ei8GhXjP53LEr8Q4ingKYC6Fv9jQogJiqJ8D4zHMbNnIrDIVTFI0t/Rnwdxk67oRccr+zZoEFcIQfrRTDat28bGddvZsWU3tbVmNB4aevTqzP+9/AiJ7RPOe52zXXv3lv388NnP7Nl6AC+dJ/+aOJZxE0aedYZOUU4x0x+agd1m59/v3Ef4OYrF5WzaR8nhTOJG9sEv+tIvmdDcmmMe/zRgvqIoLwG7gE+aIQZJuiRV5pWyYeYiasqq6X3HKFr3PvcgbmVFFVs27GDTum1sWred/NxCAGLjoxk/YRz9BvUkuU9XPD0vriSIzWpj4/Jt/PD5EtIPZxAY4s8dD9/EqPHD8DpHq7wkr5Tpj8zEbLbw73emEnGOcYmKjDyOr9hGcPtYWvXpeFFxSqdqksQvhFgDrKn773SgV1PcV5L+TvIPZLD546WOQdxHxhMUd3qytNlsHNib6mjVr9nGvt2HsNvt6Hy86d2/B5MeuJV+g3rRSt+4VrPJWMvKRWtZ+MVSCnKKiIyJ4IFn72Ho2P6oz7NuoKywjOmPzMBkMPHAO/cRGX96F9BJ5qoaDi1YiWegL23GDZIzdpxErtyVpBZOCEHamj3s/m4tfpFB9L9vHN5/2ji8IL+Izeu2s3HtNrZs2EFFeSWKotChcyJ3T72F/oN70albklMWYlVVVPPL/OX8PO93KsuqSOycwF2P3ULvId1xczv/YGt5UTnvPzQTQ2UND7x1L1Ftzl7/R9jsHF6wCpvJTKdbRzu1+No/nUz8ktSC2W02ds5fQ/r6fbTqEkfvO0ZhR7BlQwob1mxj07ptpKUeByA4JJDBl/Wj/+Be9BnQg4BAf6fFUZhXzKIvf2XZj6sxGWtJHtiVa+8YS4fu7RrcCq8oqWD6IzOpLq/ivjemEH2emvYZq1KoyMyj7b+G4B3296iK2VLIxC9JLVStwcTm2b9QcPgEft1iyFDX8s3k/yNly25MplrUGjXdkjvx8FMj6T+4F23axTm9KyTj6Al+/PwX1v22GYBBo/pyze1jiGlzYWtrKkur+OCRDykvqmDqG5OJ7RBzzuNLDmeQvXEP4T3aEdbl/NtCShdGJn5JaoFy07L46oVPOHg8g2xjBYW//QRA67gorrlxDP0G9SK5b1e8vJxfNVIIwYGdh/nhsyWkrN+N1tODMTeO4KpbrjilHHJDVZdX88GjH1KSX8q9r00irlPcOY83llaSunCto/jaqLMXX5Munkz8ktQC2O12Du5LZdPa7az5bT0HDx7FLgReXp70GdiDfoN60W9QL/TRF7cqt6ExbF2zkx8++5nUvWn4Bvgw4b7xjLlxBD5+F1bd8yRDpYEZj82iOKeYya/eQ5uu554uarNYOfTtchRFIen6y3BTyxTlCvK3KknNaMuGFBZ+u5TN61MoL6sAIMLPnyGduzD+/hvoPbQX6iZIfptXpTD3vfnkZOQRFhnClKdvZ/i4QWg9L76QWU2VkRmPzSI/s4BJr9xFYvezd9kIu8BQUELW+t0YCkrpcPNItAFNu/GJEAK7uRZLZQXG/ELUfn54BASg8vZGacDA9aVEJn5JagZHU9N5++UP2bh2GwFB/gwY0otWGh3eRbW06ZlE7ztHoW6iWSybV6Xw6qPvEh2v5/FX76f/iF6NLkdsrDYy84lZ5B3P4+4X7yTpDEXjzNVGytNzKEvLouxYDhaDEYDWQ3sQ2Na19bmE3YbNZMRqNGIz1WAz1mAx1mCtMGCpMoIQkJXjONhNQa3zQe3r+KPx8UXt64Ob+sJWSrckMvFLUhMqLixhxtufsvDbpXjrvHjs/+7jmvFXkDJ3OYWHs0i8sh+dru7foKmRznBwVypvPvkBbTrE8dLsp9F6NX5vZ1ONiQ+nzSbrSDZ3v3AHHfq0BxwbolRlFVCWlk3ZsWyq84oBUHlpCYiPJCBeT0C8Ho2P88oxCCEQVsspCd5qMmKvNf1xkOKGsNqpLa7AbrHgERSId7SemrwsEArunj5Yq6sxFRZRk51Tf5q7pxa1ry9qHx80vo4PA3dPz0tirYFM/JLUBIxGE1/M/pZPZ83DYrFw8x3XMvnft6GYrKx/dyGG4gp63jaC2H4dmiymE8eyefHfbxESHsx/pz/ulKRfa6xl1pMfk3noBHc8exsJSdHkbj9IeVo25cdzsZktKG4KPvowWg9LJiBBjy48+IL3DTgTIezYamuxGU8m+BpsRiPCZq0/xk2twd3TC41fACpPL2wmM5Vpx7BUVKL29SWwW1e0wY49CFQ6b6oz0nBTC4J6dMPNXYWtthZLZSXmyioslZVYKqswFRTWX19RqVD71D0Z+Pqg9vFF7aNDcW9ZG7ooQrT8wpfJyckiJSWlucOQpAtms9lY8uMypr8xh8KCYi67YjAPPTkJfVQrjqzYyYElm1F5aOg3ZSwhCWesUO4SxQUlPH7b89isNl6f+yzh+tBGX9NsMjNr2mzS9qYzamwvQtUKxtJKADz8dY4WfUIU/rGtGr0Yy26zYqtrxVuNNdhMRmymui4aAEXBXeuJu9YLlafjq7unJ27ujrauxWCg4vARTAUFuGs98G3bFq/IVqe11s2V5VRnHsNd64VvXNszJnC7zYa1qqruw6AKS5XjA0HYbPXHqHTejg+Bkx8Ivr64e7h+IxhFUXYIIZL/+r5s8UuSi2zZsIO3X57J4YNpdOrWnjdmPEe3np0ozy5i5WvzKTtRSGSXeLrfPAxPP+8mi6u60sBz972OocrAq5/+t1FJXwiBoaCUokMZfPvxUnJyS+mdFImfyYg2PIKIXh0ISNDjGeR3UV0gjgFX86kJ3liD3fLHbq2Kuwp3Ty+0waF1Cd4Ldw/tGe9nM5upSjtGdeYJFDc3fNu2QRcbg9tZWuQaX3900XFUZ6ZTdfwIPrGnJ383d3c0/v5o/P9YMCeEwFZjxFxZiaXK8XRgLivDmJf3x3kaTd24gS8aH8dXlbdXkwwky8QvSU527EgG7/xvFutWbaaVPpzXpj/DqCuHYbfa2LdoE4d/T0HjraXvPWPQd09o0j5hc62Zlx58i5yMPJ6bOY24djEXfA2LwURZejZladmUH8vBWFnNxv1Z5JcaGDm2N/2vGYhfdDhuFzFAbDMZsRiq6xO8zWRE2P9oObt5aFF56XD39MTd0wuV1hNFpT7v71DY7FRnZlKZdgxhteIdpce3bZsGtbo1fgHoWsdRnXmMqoyj+MS2QXE798+mKAoqby9U3l4Q8UddJLvZjLmq7smg7umg+njGH08qbm6ofXSofXzrngx80Pj5Ob2rSCZ+SXKSkqJSZr7zGT/MW4K3zouHn5rCzbdfg4fWg+JjuWz/cjlV+WXE9Emiy/hBeOicv/jqXGw2O28+NZMDO1N54rX76dK7YeMJwmanMruQsmOOZF+dWwSAytMD35hWbF1bRH6pgZsfv4G+Y/pcXGzmWoz5OZjLSx1vuLmh0nqhCQj8U3eN53kT7mmxC4ExL5+K1CPYjEa0IcH4tUtE7XNhU0U1fgF4R8dhOJFO1fE0fGITLjgWcLTytUFBaIP+2MtY2O1Yqg31XUSOcYMCarKzAQgb2P+C4z0fmfglqZGMRhNfzvmeTz/8GnOtmRtvu5rJD04kINAfi8nMrm/XcHTNbrwCfBj0wNWEn6dcgSsIIZj92lw2r9zOPU/cysDzrIg1lVfVz74pT8/BVmsBRcFXH0rroT0IiNfjGRrAZy9+ydGDmdzw8PiLSvp2mxVTYT6m4gIAtKHheAQE46bxaPSTUG1pGRWHD2Mur0Dt40NAz2S0IRe+8vgkD/9AEAJD1nGqMo7hE5PglG4Zxc0NTV3f/8mNaIUQ2GtrMVdWovJ2fjdggxK/oihzgQeFEOV1rwOAt4QQdzo9Ikm6RNjtdn75aTnvv/4xBXlFDB85kAefnExMXBQA+Qcz2fH1SgwllSQM6UKnq/ufNjdfCAFCuLxf97s5i1j67QquvX0s4yaMOu37tloLFSfyHck+LQtjiWMxmYevNyEd4glI0DsGZesWdNmsNua+9CV71+9j/L//xYCr+l9QPELYqS0pxliQi7BZ0fgH4Rkeibum8WsXrIYaKlJTMeYX4ObhQUCnjnjpI53SpeYREORI/tkZVGemoWvtnOT/V4qi4KbxoNauQnvGHWsbp6Et/s4nkz6AEKJMUZRuTo9Gki4R2zfv4s2XZnJo/xE6dE7kf+/9l+TeXQAwG0zs/mEdGZsO4hMWwNDHrjvjjB0hBNUZaVgMVWgDQ9CGhOGmdv6ireUL1/DVB98zdOwAbv339dRWGjDkl1CdX4KhoBRDfkl9ondTueMXE0FEcpJjUDbY/7SEabfZ+fJ/37BrzR7+dd9VDL5mUINjEUJgqaygJj8be60JlbcPXhF6VF6Nb9XazY6pmfUDt20SHAO3TihH/WcegcEIIajJyaQ68xi61vGNTv6WWgslWUUUHs+nKKOAoowCijMLMBvN3PHBVAIinFudtKG/ETdFUQKEEGUAiqIEXsC5kvS3cTwtk7f/N4u1KzYRERnG/977P64YN7x+wVX2rjR2zltFbbWRdqN60mFMb9zPUnLBmJeNpaoClbcPpuICTCWFaPwD8QwJx13b+P5/u83OhiUb+OCFObRrG82weD3b3voGa80fi5e0AT54hwUR0ikBX30ovq3DzxrvyWt+/fo8dqzcybhJYxl2/ZAGx2OtMVCTl43VUIWbhxZdTAJqn4ub7fNnZxy4bZOAu7bx6xLORhsUAkJQk3uC6hPp6FrHoSgNS/6GsmqKMgoozMin6HgBRZkFlOWWIOyOAV6Np4bg1mEkDe5MSEwYWp3zf46GJu+3gE2KoiwABHA98LLTo5GkFqq0pJwP3/mMBd/8jKeXloeenMyEO67FQ+vo+jBWGNg1fzXZu9Lwjwph4P1XExB99mmStaXFmIoL8AgKxTsyGpu5FlNRAbWlxZjLSlD7+qMNCUft3bDiaBZjLYY/teCr80s4ejiD+et2EeqrY3SHWITVSnC71niHBeEdHoR3WOAFzae32+3Me+s7tv2ewpg7r2DEzcMbdJ7NbK4buC1BcVfh1Soaj6DgBifKsxFCYMwvoCI1FVuNEY/gYPzbJaL2bZoaP9rgUEBQk5uF4cRxvKNPLYttt9kpyy1xJPiMgvokX1NuqD/GJ9iP0Ngw2vRJIjQ2jJCYMPxCA5yyoO1cGpT4hRBfKIqSAgwDFOAaIcRBl0YmSS2AyVTL158uYM6MrzAZa7luwjimPHQ7gUGOOdtCCDK3HGL392uxmq10urofiSN6nHVeOIDFUIUhJxOVzgevVo7xAHeNB96R0XiGRWAqLqS2pJCqynJUXjq0oeH1LWNhF5jKq07rqqmtqK6/vtrbkxq1ih+3HiAwyJ/nP3iciAQ9ivvFJ1ohBN+9s4AtS7cyauLljLrt8vOfY7NhLMrDVFQ3cBsSjjY0vH4RVWPUlpU7Bm7LylH76Ajo2QNtSEijr3uhtMFhCCGoOH6cvPQiqo1uf3TVZBVhMztWDbur3AmKCiG2WwIhMWH1f7RNPLPrpAb/H6hL9DLZS/8IdrudXxet5P03PiYvp4AhI/rz8JOTiU1oXX+MoaSSHV+vJP9gJsHxrUi+9TJ8w8/dF2sz11KdcQw3tQZddPxp3RxuKjVe4ZF4hoZjLCygPC2DwgMZmKvN1FZbMJZUYTNbHAcrCl7BfvhGheHdsz268EC8w4KoMtbyxMTn0Gg1vPTp/xERFdao34UQgu/f+5GNP29mxITLGH376YPDfz2+trTIMXBrtTq6r8Ijcdc0fqWqtaaGitQjGPPynT5w2xBCCCqLKuqS+x8t+YrC+iFQPH29CGkdRtdRyYS0DiMkNozAyOBGF75zJtlPL0l/kbJ1D2+9NIMDe1NJ6tiWF998kl79utd/X9gFaWv3sO+njQB0u3EoCYM6n/fxXNhsVGekgRD4xLQ5ZdDRXFVT14IvwZBfSvXJAde6hT1uKne0flr8owPQRYXjHxeDd3jQaf3xhqoanpv6OlXl1bzyiXOS/o8zfmL9TxsYdv0Qrrx79FmTrBACS1UFNXknB251eMVEOWfg1mKpG7jNREHBJyEen7hYpw/c/pnVbKUku8jRRVPXJ1+cUUBtTa3jAAUCIgIJS2hFx8u64eevxtvDgn90JLqomBZdrE0mfkmqk5GexbuvzmLV7xsIiwjh5XeeZszVI06plFmZX0rKlysoPpZLePvW9JgwHO8g33Nc1UEIQXXWcWwmIz6xbXDTaCg7lk3B7qOUp/9RkhjAw0+HLjyIkA5xeNe14j38dVirqzAV5WE1VGOrzKVWbUUbHIqbylEe2GK28MrD75CVnsOzHzxOQvvYRv0+hBAs+uhn1ixYx5BrB3H1vePOmsysxhpq8rKwVlfhpvFA1zoete/pM4IuOAa7nerME1SlHcNuseClj8SvbRuXDtwWpuexfNYvFB7Prx9wVWvVBLcOI3FAR0JjwwiOCSMkOvS06bk1+TmYCvOocXPDKzK6xSZ/lyV+RVG0wDrAo+4+C4QQzyqKEgvMBwKBncCtQgjz2a8kSa5VVlrOR+/N5buvFqHx0PDA43dz693Xo9X+0TVht9lIXb6DA0u2otKo6HX75bTundTgf9jGghwsleUoWn+yt6RSuDcNc5UBldaDwMRodBHB9QOu6rNsfqLx9UPj64e1phpjYT6mwjxMRfl4BASjCQrh7WfmsHf7QR55+V669e3UqN+JEIJfPvmVlfNXM/Dq/lxz/9Vn/FntFjM1+TmYy04O3EbhERTilIFbU0EBFYePYK2pwSMoCL+kRDS+5/+QbYyjWw7x6/uL0Oo86fWv/vV98f7hgQ0acPUMawVCYCrKd3TFtYpqkcnflS3+WmCYEKJaURQ1sEFRlF+BR4B3hBDzFUWZBdwFfOjCOCTpjGpNtXzz+Y/MmfEVNQYj19w0hvseuoOgkFP76ctOFLL9y+WUZxWh796G7jcOQevb8O4LQ14eeVv2UZFbSU1RJSgKgW2iCB3Vh6DE1hdc00blpcMnJgGbyYSpOB9TaRGfvPcdG5btZuL94xk6dsAFXe9Mfp37O79/tZx+Y/sw/t/XnJa8HAO3+XUDtwJtSBja0AinDNyay8spP5SKuawMlU5HUHIPtCHBLk2gQgi2/bCBjfPWEN4mkqumXY93wIVvN6koCp7hkY7kX1zgSP4R+haX/F2W+IWj3vPJqQbquj8Cx8ygm+venws8h0z8UhMy15pZsnA5s6d/QW52PoOG9+XhJ6cQ3zbmlONsFisHlmwhdfkOPHSe9Js8Fn23c+8Ze5LdZqcsLYv8HYcoS8tG2AXeYYHEjexDSKd4NLrGbzbirtXirY/h1992s3zZbkZe0YOhvfRUpqfiGRKOSud7UQnn96+W8+vnv9Pnil7c8Mh1p3R1OQZuizEW5DgGbv0C8YxwzsCt3Wql/MBBanJycdNo8O/YAW99pMtXNVvNVpZ9+DOH1+2n3aCOXH7vlag0F58aFUXBM0Lv+F0VF9R/GLSk5O/SPn5FUdyBHUACMAM4BpQLIU7ujJBNfXWK086dBEwCiI527TZs0j9DVWU133+zmK8/WUBRYQntOyXy3GtP0GdAj9OOLUrLIeXLFVQVlBHbrwNdrh2Ixvv8/crVeSUU7DlC0d40LDUm3D1UBLYJI2pQL3wiGzfQeiarfl7P3OnfM2hUX6a8OAlLWQmm4kKqjh91lCoOCUfjF9DgpLNi/iqWzFlKz8uTuemxG+qTvmPgthJjXha2WhMqLx1eMXpUXhe3CftfWY1GSlJ2Yqmqwic+Dp/4OJcO3J5kKKtm8evfkXckh/43D6XXNf2dkqCVum4e+KPbxzPs9Hr/zcWlv1khhA3oqiiKP7AQSDrTYWc5dzYwGxwbsbgsSOlvr6ighK8+/Z7vv15MdZWBPgN68PI7T9O7f4/T/iFaTGb2LdxI2to9eAf5MvjBawhLOnfDw1xVQ+G+NAr3HMVQUIri7kZg22h8Qj3xCvLEr217VE5YiftXOzbu4f3nPqZL7w489OJkVGo1qtAItMFhmMtLMBYVYDiRjlHjgTY4DI/A4HO2nld/v5ZFs36m+7Bu3DLtJtzq5v07Bm6zsVZXOnXg9qTasjJKduxC2O0EN+F8/KKMfH7637cYq4xc+fh42vQ5U3q6eI7kH+3o9inMc7T8w1o59R4Xq0lm9QghyhVFWQP0AfwVRVHVtfr1QG5TxCD982SkZ/H5R/P4+cdl2Kw2Lh8zhNsn30T7Tm3PeHz+gQxSvl5JTVkVbYZ1peO4fmfd8NxusVKSmknBnqOUpWU7pmhGhhI/pj/BHWIxF+VirihDFxPvkqR/ZP8xXn30PVrH63n67YdQa/7Y+Ftxc8MjMARNQDCWynKMRfnU5J7AWJCLNjgUj6DQU6eSmsys+m4Nv3z6K10Hdea2pyfg5u5WN3Cbi7msGMXd3TFwGxji1K4XQ04uZfv24a71JCS5O2qdc54gzidt62F+ff8nPLw9ufGliYTGRbjkPoqi4BXZ2rHKuCDX0fIPdc29LoQrZ/WEAJa6pO8JXAa8BqwGxuOY2TMRWOSqGKR/pr27DvLZrHms+n09Go2af10/momTbiCq9Zm3Nqw1mNj9/VoytxzCNzyQYY9fT3Dc6S0zIQRV2YUU7D5C8YF0rCYzGh9vovp3IbRLG7xCHKt5jQWOpO8ZoUfj63/adRorNzOfF+5/E79AX56b+QReZxkvUBQFjV8Aal9/rIZqTEX5GAtyMRbl4xEYjE3jw8ZftrHux/VUVxjoOrgLt//3VtyUummJJwdug+sGbp3Y9SKEoPLIUaqOpaMJDCCoezenVOZsyH23L9zEhm9WEZ7QinHTrkcX4NoSD4qi4K2PASEw5uc4kn9I+HnPcyVXtvgjgLl1/fxuwHdCiCWKohwE5iuK8hKwC/jEhTFI/xBCCDas2cpns+aRsmU3vn4+3HP/rdx0+zUEBQec9ZzsnWnsnL8as8FE+9G9Sbqi52mLomorqinYc5TCPUcxllTgpnInKCmWsK5t8I9tdUoL2FxeirEgF01AENpg5/fplxWX88y9ryIQPD9zGgHB5/9gURQFtc4Htc4Hq7GGvENHWfrRUnZuTsNittG+dzsunzCCuE6xmMuKqcnPRVgtaPwC8AzXO31vWLvVSumefZgKCvCO0uPfoX2TbDdotVhZ/uESDq3dR2L/Dlw+9UrUHurzn+gEiqLgHRXrSP552SgoaEOc//ejoVw5q2cvcFrpZiFEOtDLVfeV/lksFiu//7yKzz6ax9HD6YRFhPD4f6dy7U1j8fI++8yZ6uIK9ixYR87uYwREhzL4wX/hr/+jb9lmtlB8KIPC3UcoP+7ojfRtHY6+fxeC28eesbiZtcZAdVYGKi9vvCNbO30gr8Zg5Lmpb1BeUskrc/5DZMyFdRnkpueyYt4qdqzcBQp07d+OPv3jCIvwQ+1jo/LoQWwmIyovbzxbxze4QNyFsBqNlOzYiaWyCr+kduhinP97OpOaCgOLX/uO3NRs+t00hN7XDmjygVZFUfCOjkVkCmryskBR6gq9NT25cle6JNXUGFn47S988fF35OUUEN82lpfefoorrhx+Sn/3X5VlFZK6bAdZO47g5u5G52sG0HZ4d9zc3RB2QUVmHoV7jlJ88Dg2swVtgA/RQ7oT1qUN2oCzLx6yW8xUZabhplK5ZHMOi8XK/x55l4yjJ/jv+4/StlN8g84TQpC25xgr5q3i4NZDaLQaBl87kKHXDSYgNAC71UptSSGm4kIUd3d00XGoL2AW0IWoLS+nJGUnwm4jKLkHnqFNNYhb4BjErTQw9rFradu3fZPc90wUxa1u8/Zj1OSecCT/oKYvLicTv3RJKSst55vPf2T+3IVUlFfSrWcnnn7xIQYO7XPKfPM/E0JQmJrN4WXbKTh4ApVWQ9vh3WkzrBteATqMJRX1XTm1FdW4a9QEd4gjrGsbfKPDz7+Rt91OVcYxhNWGT0I73NTO7T6w2+2898xH7N6yn4denEzygK4NOmfvhv2snLeKjEOZ6Px1jL1rNAOu6of3nxafualUeIa1Qhsa4dIWcE1uLqV79+Pu4UFI755O30P2bI5tP8LSdxei8fL4f/bOOzyq88zb95neNZJGFVXUBYjewTQbO7Fxi1uc6mRTdrOJN91J9tuUTbLZOGV3s8mmNyd2nDixDY4LNsWAjUE0CdR7byNpep95vz9GCDBgHMv+eQAAIABJREFUC1ADzn1dukYzOjPzzmjm9z7nqdz/zQ+SVjDzgVVJocCUWxAX/54OJElCm3T5IyEvB1n4Za4Kerr6+P0vnuTpJ58nEAiyaes6HvrYu1m0bP5F7xOLxeg53kz9zqOMdgygsxhYcOdaCm5YgEqtYqC6maYTjbi64hWW1rmZ5G1ZTnJpHsoJFvCIsTF8Ub8XU24BKv2VF2a9md/88Aleff513v+p+9hy+1tPuwqHIlTuPMKuJ3cz2DWELTOZ+z59DytvWY5Ge/Hg6VSJvhACV1Mz7uYWNImJJC+dviDukWcPsv8Pu0ibm8Edj9yPKWl6NpuJcFr83e3NeLvbQZLiYx2nCVn4ZWY1DbXN/OanT/DSc3uQFBK33XkTH/zYA8wtyrvofaLhCO0Ha2l4+RieIQemVCtL37OFvFVlKNUqgi4vVX94EU/vEHqblbwbl5NaUYT2EtownCYw1E/IMYI+LRNNwoWDyFfCM79/nmd+/zy3PbCVez50+0WP83v8vLbjdfY8tQ/XsIvs4iwe+ur7WXTDwvF8/OkmFokwWn0Sf/8Ahqw5JM6fN21B3F0/e56aPVUUrynn5n++fdqCuJeCpFBgzivE3d6Et6sNYNrEXxZ+mVmHEILKg8f59U+f4PVXD2Mw6nnvh+/lvR++h7T0i/tDQ94Azfuqadp9gqDbR1JuGms+eiuZiwrG3UCeXjs1T+wkEghSdt+NJJddfvvckHMUf38PGmsSuinIzX71hdf51ff/yNqbVvAPX3jfBdfpHHay96l9HNj+OgFvgJKlxbzvSw9SsrR4RqtEI/7AWBDXRUJpCab86WlT7HN62fHoX+ip62L1/Tew6t4bZk217IUYF/+2uPhLkoTGOrnzdS+ELPwys4ZoNMquF/fz2589wamqepJTkvjUFz7Cfe+9A0vCxU/TfaNuGncdp3X/SSLBMOnzcinduoyU4nObYw3VtNL49F7URj0LP3w7pvTLt64ifh+erjaUegPGrMkXtRNvnOK//vWnzF9Wxme+9Y8o32S1D3QOsuvJPVTurCQajbF4wyJufPcmsouzJ3Udl0PI4cR+9BgiEiF56RL0adOTuWLvHOSZ/3gSr8PDrZ+5m5K186blea8USaHEnFeEu60JT2cbprH6i6lEFn6ZGScYCLLjby/xu58/SUdbNzl5c/i3//gs2+6+eXym7YVw9g7T8PJROg/XI4Qge2kxpTcvOyctE+JnEF37jtOx5yjmrFTKH7jpipqkxSJhPO3NY1/Yyc/gaalr59uf/iFZ+Zl85YefPsc3317bwctP7OLkgVOo1CpWvXMVm+/bSMqc6Q0OXgxfbx8j1SfjQdw1q6YtiNt6tIm//+BvaPQa7v/3D5BeODtaI0wUSanEnF+Eq61xbHh7wZQU/51GFn6ZGcPldPPnPzzLH3/zV4aHRphXUcL3fvJ1ttyyHuVbzKy1N/dSv/MIvdWtKNUq5t5QQcmWxRhtCecdGw1HaHp2H0OnWkitKKRo23oU6sv/2ItYDE97C7FIGEtBKQr15AYq+7sH+donvospwcjXfvwFTBYjQghqD9XxyhO7aa5qwWA2sPW9N7Lh7vWYp7jqdKKcG8S1xitxJ7nw62LPe2zHIV79/cuk5qdzxyP3Y57AYJzZyGnxd7c24ulowZRXiMZ8/md6MpCFX2baGegf4rFf/oWnHt+Oz+tnzYYVfOjj72b56sUXH+sXE/SdaqP+pSPYW3rRGHWU37qSok2L0F5kYHXI7aP2Ty/j7hkkb8tystYtvCKXjBACb08HEZ8HY87cSRkpeDaOYSf/9o/fIRqJ8u1ffgVrcgKVO4/wyp9209vahzXFyl2fuIO1t65Ga5h6UZ0osWg0HsTt68cwZyyIOw0B5Wg4yis/f56a3ScoWl3GLZ+8Y1YGcS8FhVKFOb8Yd2sDnvZmzHlFqM2Tv5HJwi8zbQgheOyXf+a/v/sLYtEYN9+2iQ9+7AFK5xVd9D7RSJSuygbqdx7B1TeCIcnM4vs3kr9mHqq3+JJ7+saCuP4gZfffiK3sysYQAgTsA4RGh9GlZqCd5ACc3xfgG5/8HsODo3z1R5+j5Vgzv/jSrxgdGCUjL533fulBlm1ZMqsGdgNEAwHsR48Rdk5vENfv8rH90b/QU9vJynvWs+b+DROakHU1oFCpMM8twd3agLu9GUtByaQbGbLwy0wLjlEn//rZ/2DfroNsvnkdn/vXfyYr5+KZMOFAiNYDp2jcdQz/qIeEOTZWPnQL2cuKULyFGwjAXtdGw9/2otJrWfihbZgyrtz/HXI58Pd1o05InPTWupFwhO987r9prmvj5ts28MdvPo7P5WPugnzue/hdlK8qu2hx2kwScjqxH5n+IO5w1xDP/MeTeEZcvPNf7qJ0/cVrOa5W4uJfjH+wH+UUdHeVhV9myjlWWc0XP/kNRoYdfOnrD/PAB+66qFUYcHlp2n2C5n3VhH1BUoqzWPbeG0kvf/ueLkIIuvafoGP3EcxzxoK45isvqIoG/Hg721Dq9JiyJ9eiFULw6CM/5thr1aRarNTvr2XB2vnc+O7NzJ1/5WcpU4Wvr5/RqmoUGg221avQWKYn1tB2rJm///BvqDVq7vvGB8govnDH1WsBhUqNMXNqsrRk4ZeZMmKxGL/6yR/5yQ9+w5zsdB77208u2gvfM+Sg4eWjtL1eSywaZc6iQkq3LiU5f2L58bFwhMbt+xk62UzKggKKb7/hioK4448bieBubwaFhCmvCEkxcVeLEAKv28eo3cGo3YFj2MXosINRuzN+OeSgta4dp8NNosHE5tvWseWBzaTnzlzXxrdDCIG7uQVXU/O0B3GP//0wr/7uZWy5qdz5yP2YLxDMl5kYsvDLTAnDQyN8+dPf4uD+I9xy+2b+7dufw2Q+30850jFA/UtH6DnejKRUkLeqjOIbl2BJn7gPPeQZC+J2D5K7eRnZ6xdNilUuRAxPRwuxcAjL3JLxVgN+X2BMzJ04Rpw47GfE3DHsiv9t2Ilj2EkkHDnvcVUqJZZEMyFfiGgowtLl83n42x8nMXVqc7evFBGNMjIexM0cC+JOfcwhGo6y+5cvcPKV4xSuLOUdn7rjogNyZCaGLPwyk84bB47ypX/5Jh6Xh69+5/Pc/cCt5wixEIKBuk7qdx5hsL4LtU5DydalFG1ejD7h0oJYnv5hah9/ibAvQNl9N2Irvzz3SCgYwjHsHLfKR4YcDLV1MNJvxxMGl2tHXOiHnQT8wfPur1BIJCQlYE22kJhsJbtgDonJVhJtCViTE0hMTiDRZiXRZqXuUB1P/uAplDYl73vkQeavmf2FRvEg7nHCTieWkmLMc/OnJ4jr9rHj0aforulg5bvWseaBjddMEHcmkYVfZtKIRCL87L9/x89/9Bj5BTn8/I/fp6hk7vjfY9EY3ceaqN95BEfXELoEIxV3rWPuDQvQ6C/dXTBc3079X/eg0mlZ+KHbMWVOPIj7xp4j7Hh8JyNDo4zaHXjdvgseZzIbSExJJNFmpXhBwbiYJ9qs44JutVmxWM3nVde+mVAgxFP/8zcOPn+IufPzeeCf3olOhBg+dgK1xYzabEZtMaPU6WZVm4GQ08Xw0WPEwmGSlyxGnz49rqjh7rEg7rCLdzx8J2U3LJiW570ekIVfZlIY6B/ikU/9O0cPVXHnve/gkW88jMEQz0aIhCK0v15DwytH8dpdmNMSWfa+G8ldUXretKuJIISg+7Uq2l+pxJSZwrx3b51wEDccCvObHz7BjsdfIjMnnfySHBatnI812YLVZiUxOQGzQYXaO0xyZjrWotJJEeHe1j5+/dXfMNg9xLrN81i9dA7R9mZ8SiUKrQZ/f//4sZJajWZ8I7DENwWTaVoanL0Zf38/I1UnUajVpKxeicYyPcVR7cdbeO4Hf0WlVnHv199PZknWtDzv9YIs/DJXzP7db/CVz3ybYDDEt374ZbbdfTMQn2XbvLeK5r0nCLr9JOWns/BdNzBnYcFln67HIlGaduxnsKoJ27y5FN+5YcKbR29nP9/9wo9oqWvn9vfcwgf/5YHzhrZEgwFczXUoElKxFFxZo7NoMERgaIiDfz/I3/9yEI1Gxb33LqV4QT7aFBs6mw1tYiKSUkEsEiHsdhN2uQm7XITdbrydXYhYLP5gkoTaZDrrzCC+IUxVi2MhBO6WVlyNTWisCSQvXTJtQdwTL1Sy9zc7seWkcscj92NJkYO4k40s/DKXTTgc4X+++wt+9/M/UVxWwKM//hr5BTl4R1w0vnKcttdOEQmGyZifR+nNy7AVzrkiIQ15/NQ9+TKurgFyNi4lZ8PFK33fzP4XD/Kjb/wShULBl3/4aVZvXnbeMbFIBHdbEyBhyiu85MCliMUIORwEhuwEhux4hkbYubOW2ro+8osyePDhO0kpzEGp0513X4VKhTYxEW3imQCvEIKI1xvfDNzxDSFgH8bX0zt+jFKnG3cRnd4MVAbDlVUoR6OMnjyFr7cPQ2YGiQvmT0sQ1945yJFnD1K7t5qC5cW84+G70OjlIO5UIAu/zGXR09XHFz75DU4er+W+997B5/7fJwgOuzn0m5forGwAIGd5CSVbl2KdhAZi3oERah5/ibDXT+m9W0iZN/ft7wQEAyF+8d3HeOmvuyldWMTnv/MJUjPPb+0shMDT2UosHMKcX4xSMzHrNuLzxYXebic4PIKIRECSGPYJnv7zEUaGXNz6oXew9T03XnJffOm0lW8yAWfSWqPBEGG3a+zswE3I5SJgt4MQ8fsplWdtBmbUZgtqswmF6u2/7tFgkOGjxwg5nFiKizAXzJ3SeIPf5aNu/ylq91Yx2NqPQqlgxd1rWfvuTXIQdwqRhV/mknnlhX189Qv/GS8++vHXWFJSTOWvXqTvZBtKjYrCjRUU37gEY9Lk+IOHGzpo+OselFo1FQ9twzxnYjNKu1p7+O4XfkR7Uxfvemgb7/3EPagu4hby9XYR8bgwZuWiNl28GCkWiRAcGSU4NETAbifijQeFlXodhox0tDYbla818MzPdmBMMPGpH36CwoUTm487UZRaDUpt3FV0GhGNEvZ4xs8OQi4Xvt4+RGfX+DEqoyF+VjDmKtJYzCi02nFhD7lcDB85HcRdhD49fVLXfZpoOErbsSZq9lTRdqyZWDRGan46Gx/aSun6+RguMbNL5tKRhV9mwoSCIb7/rZ/wxO+eZl5FCZ/9xEM4qzvZ81wVWpOeedtWU7ih4qJN0y4VIQQ9r5+k7eVDmDJtlD+wdcJTsnZt38f/feu3aPUavvaTL7B07cKLHhsYHiI4PIjWloY26fyWzhG3h4A97r4Jjo5ATCApFGiTkzDm5qCz2VAZjfg9AZ549E+c2FdN+coy3vulBzFbTVfyFkwYSalEk5CAJuGMP1wIQdTvH48dhFxuQg4n/r4zgWSFRo3abEFlNOLr6YkHcVetRJMwuUFcIQSDrf3U7K2ifv8pAm4/BquRxbeuoHxjBSmzuGjtWmTKhF+SpGzg90A6EAN+LoT4b0mSkoAngTygHbhPCDE6VeuQmRw627v5/Ce+Tt2pRm5/x2ZWpmTT+swhjMkWFj+wifw15ag0k9cZMRaJ0vzcAQZONGIrz6f4zo0TmoPr9wX46bd/y+4d+5m/rIzP/ccnSH6Lwqiwx4WvpxO12YIhI545Eg2FCNqHx104sWA8b19lMmHKzUWXcjooe8bv3V7XwW++/nscQw7u/PjtbLpvw4z315EkCZXBgMpgQJ92Rlhj4fA5m0HY7cLb3Y0mwULy4kUXjEFcLp4RN3X7TlK7t5rhriGUaiUFy0so31hB3qKCGRsLeb0jiTG/4KQ/sCRlABlCiGOSJJmBo8CdwAeBESHEdyRJegRIFEJ88a0ea9myZeLIkSNTsk6Zt+eF7bv4xiPfAyG4a+kK8kxJWLNTKN26jKwlRZP+5Q15/dQ9+Qquzn5yNiwhZ8OSCfl72xo7+c/P/w+9Hf088LG7uP+jd71lbn00GMTVXAtKFTpbBqGRUQJDdsJOJxBPq9TZktHZbOhSbBcURCEEe/7yKs/+bAdWWwIf/Lf3kz8v77Jf+0whhJg0X344GKblcAM1e6vprG5FxAQZJVmUb6igZG05ukk6I5R5eyRJOiqEOC+TYcosfiFEH9A39rtbkqQ6YA5wB7Bx7LDfAXuBtxR+mZnB7w/w7a/8kGf/+iLZScncWbGMokUllN68jLSynCkJ+nkHRqh54iXCHj+l92wmZf7b+8eFELz41G5+8d3HMFmM/PvPvsTCledXwwohELEosVCIkMuFt7OdiNdPLBTB29oDgCbRiqWoEG2KDU1Cwlu+Rq/Tyx++8zinDtZSsX4B7/nCAxgmoSncTHCl/0shBL31XdTsrabx9VpCviBmm4UVd62lfGMFiZnTM0RcZmJMi49fkqQ8YDFwCEgb2xQQQvRJknTBXq6SJH0U+ChATk7OdCxT5iyqD1bzxYe/Qc/AEGsLinnw3m3Me+dKkqbQFzvS2En9U7tRaiYexPV5fPzo67/gwM7DLFxexqe+8j4sFj2+/h5EJEI0GCDs9RH1+YkGgsTCEUQ4On5/hVaDISMDrc2GzpaMQj0xd1VLdSu//ffH8Djc3POpu7nhrnWzqtp2unAOOqh7tZqavdU4+0dRadUUry6jfGMF2fPy5MycWcqUC78kSSbgr8C/CCFcE/1yCCF+Dvwc4q6eqVuhzNkMt/Xxm+/9jide2IlaqeIzH3yQd33ifsypUzf/UwhB7xunaN15CFN68ng75VgoRCwSJhYJIyJhYuEwsUgk/nskTEtDF//7X89gH3Jyz71recctS2CwG0d3XNxj4QgiGht/Hkmlivu8U4yozWa0SUlorNZLEuxYLMbLj+/i+V+/SHJGEp/58cOzYsD5dBLyB2k6WE/N3iq6azoAyJqXy6p71lO0qkzOvb8KmFLhlyRJTVz0/yiE+NvYzQOSJGWMWfsZwOBUrkHm7RFC0F/bQdWO13ns2ec52dtFedFcvvezb5BVMLmiJoQgFgwQC8dFPRII0rG3muGGbhJybGSvnIuvuxlv9PyulgCSQolQKHn5+SM88fgeLBYDn3/4dvIzrIQGHePHqYxGdInJqC3mePsDi+WKK09dI24e+/YfqD/SyJLNi3ngs/ehN05eIHQ2I2KCrlPt1OytoumNeiLBMNb0JNY8sIGyDRUkTKFhIDP5TGVWjwT8CqgTQvzgrD9tBz4AfGfs8tmpWoPMWxOLxug62kjDziM01LbwdPURhj1uPvbJ9/PxT3/wLQeeXypCCMLOUfxD/UT98dz3SDBC16E2fHYPKeVzyFich0KtQaFWo1CpkVRqRCxGLBgi4vMT8fgYHRjiN79/harabhaUZfGB+9eRmJ56RuDHipUmu9K04Wgjv/vmHwh4A7z7c/ez+taV14VrZ6THTu3eaur2ncRtd6ExaClbP5/yTQvJLMm6Lt6Da5GptPjXAu8DTkqSdGLsti8TF/w/S5L0YaATuHcK1yBzASKhMG2v1dDw8lG8wy5qnYM8d+QwCYkJ/PIXP2T56sWT9lwiFiM4OkxgqJ9YKIhCo8WQmUPQG6L56f2E3H6K795I6vwCIl4fYZeLkNtN2DVI2OUmFgqNP1Z7v5NfPrYHh9PLBz52B3d84NYrbk/wdkQjUV78/U5eeuxl0nJS+efvf5zMuZM7enG2EfD4aThQQ+2r1fQ19iApJHIXzmX9+7ZQsLzkqh9oLjO1WT0HgIt9I7dM1fPKXJyA00vT3ipa9lUT8gYwZCbyqqubAwePsOaG5fz7o4+QlGwleoHhIZdKLBohNGInYB9ERCModXoMmbmoLFYcLd00Pr0XSaEgb30ZuIfo2dkGpxuSKSTUJjO61BTUZjMqk4nnnjnAH/7vOVLSk/nujz5P8QSyfa4Ux5CD333zDzRXtbDqHSu451N3o72M9tFXA7FojPYTLdTuqaKlspFoJEpydgrr37eFshsWYEqantGKMtODXLl7lROLxgh6/ARcXgIuHwHn2KXLF7/N6cU77CLo8hGNxLNZtFolXuHl/558mVGvlzuXLWbL3GLqf/r0tK1bY1CTVpSMIuJDobdgys2Ju2vMFlQm43gLYsewk+/960859no1a29awSe/+hGM05AyWfNGLY99+3HCoTDv+/KDrNi6fMqfc7oI+YPYOwYZbB9gqH2AofZ+7B2DREIRdGY9C7YuYd7GhaTOTZddOdcosvDPQkRMEPIFzhJvHwH32aJ+RtyDHh9cIOdJpVWjVCshEkESAr1ehTkzjZTCTHa+Uclvd+wi0WrhPz/7MOXFVz7UOxaJEPG4iQTi61Hp9aiMZhRqdfz1jI7Gm5gJgS45ifTl5eiTE8/pFfNmTlbW8r0v/Ri308s/feUhbrl3y5QLUTQSZccv/s6uJ/eQWZDJh776AdJyLphxPOsRQuAZdjHYNsBQxwBDbf0MtQ/i6B8ZP0Zr1JGSl8aCm5aQPS+X/CVF8c+NzDWNLPzThBCCSCB0nnCPi7n7XGt9vA/7WShUSnQWA7oEI0abheS5GfHrFgM6ixGVRoW3bxBHYxe+wREkhURiYT5pi4pJKs7B5fbw/z73HV595XU2bV3HNx79IgnWK+vJEvZ6CAz1E3Y5IDkBbdJcdCnpKDVahBD4enpxNTahUIewLiwgoaQYtemt++1EozH+/Iun+dPPniYjO52v/fgL5JfkXtE6J8Jw3wi//cbvaa/rYN0da7nrn25Ho706UhOj4SjD3UNjFnz8Z7C9n6AnMH5MQnoiKblplG9cQEpeGil56ZhtFtmqvw6RhX+KGWzo4uSzr+PoGrqg71xSKNCZ9egSjOgsBqxZKWjHxFxvMaJLMKA1x8VerdOc9yWNRaKMNHUxWNXISGN8cIcxPZm8m1YQsppo7ehmz/O7afh+M1VHa/B4vHzxa5/kwQ++67K/8EIIwm4ngcF+Ij4PklKJLjUDnS0VhSoe+AsMD+OsayDscqFOsJC0qAJt0tsPUB8ZGuX7X/oJ1ZW1bHznWv7xXx/CYJz6Ev8T+6p5/Lt/QgjBh772ARZvXDTlz3m5+N2+uLiPWfKDbf2M9NiJReLGglKjwpaTSvGqsrjA56djy0lFa7g24xMyl44s/FOEq3+Eqr/up+9kG4YkMwUbKtAnGNFZjGes9AQjGoPukqsbhRB4+uwMnmhi8FQLPpeHwYAfh1bJgN9Ha/UJGv/n5/i8fgAUCgX5BTmsuWE57//IfZQvKLms1xQfNDJCYKifaDCAQq3BkJmNNtE2nj4Z9nhw1jcQGBxCqdORtLACfWbGhDaZY69X84Mv/x9+f4CHv/5Rttxxw5Rbo+FgmGd+up19Tx8gpySbh776fmyXMLt3KhExgaN/5CwLPn7pGXaNH2O0mkjJTyN/cSEp+Wmk5KWRmJEsNz+TeUtk4Z9kAi4fNX9/g9b9J1Fp1Cy4ay3Fmxdf1mzZNxN0eWnYd5Sjew7T2tZF96iDPo+bfvsIsVjc0W80GSguK+COe26huKyQ0nmFFBTno9NdvrUnolECI0ME7QPEwmGUOj3G7Hw01kQkKS4w0WAQV1ML3q4uJKUSS0kx5rzcCeXTRyNR/viTp/jLr7aTU5DFtx/9CjkFUz9jdah7iF9//Xd0N/Ww6d4N3P7R2y7ar3+qCQdCDHUOYm8fGPfJ2zsGCAfCAEgKiaQ5NrLm5ZCSmzbmqknDOE1tn2WuLWThnyQioQhNu49T92Il0VCYgvUVlN+2Et1lZqCEwxHaWzupP9nIideOU19dT1t3H55AcPyYjMw0SheVsa2sgNLyQkrKC8nMSp+0dsCxSJiAfZDg8CAiGkVlNGGYk4vafKZ5mYhGcbd34G5pQURjGHOysRQWopygb3yof5hHv/i/1J1oZOvdG/nIF96PbopTJoUQvPHCYf72v0+jUCr56Lc+zIK186f0OS+0hv7mXmrHOliO9o2MB+k1Bi0peWnM27yI1Lx0UvLSSM5OQTWBttQyMhNB/iRdISIm6Kxs4OSzr+EbcZNZMZeKu9dhSX97f/Zp3C4PDXUtNNQ20VjbQn1tMy2NbYRCcWtPpVCQaUti5bIKKlYtZMHyBRSXFWBJmJrc6mgwQMA+QHAkPs5PbbGiT01HZThjXQoh8Pf24WxoJBoIoEtNJaG0eGxM4MQ4vPcY//VvPyMSjvDZ//gnNr5z7VS8nHOw9w3zp+/9mYajjRQuLOB9X34PSWkX79c/2biHXeP96Ue67Sg1KnIr8ildPz9uyeenY0l5666gMjJXiiz8V8BgYzdVT+1jtHOQxJxUVnxgK6klF+9tI4Sgp6ufxrpm6mub45c1zfR2n5mIlGA2MSfRyvriQrJTbCxYPp9FN63GVpgz5Z0OIz4vgaF+Qs5RkCS01uR4hs6b+tAHR0Zw1NUTdrpQWywkLlyALnnibXfD4Qi/+68/8ewfXmBuaR5f/O4nycydmjF/p4lFY+x7ej87fvk8kiRx36fvYe221dMyLCUcDNN8uJ7aPdV0nmxDxASZpdnc+PFbKV5Tju466fcjM3uQhf8ycPWPUP30AXqrWtEnmljxwZvJXVF6jjAHA0Famtqpr2keF/qm+lbcLg8Q73+eOzeb+RWl3LJxNckosIYFCXo91vxM0hYWk1yeh2qK0wmFEEQ8LvxD/UQ8biSFEl1KejxDR33uc4c9XpwNDQQGBlHqdCQuXIAhM3PC1mkkHOHIgRM8+Ytnaa5p5bZ3b+VDn3kQ9SRO7roQfe39PPHok7TVtFO+soz7P3PvlFv5Qgh66rqo3VsV70/vD2FJSWDF3evi/ekzJn5GKCMz2cjCfwkEPX5qnnuDln0nUaqVzL9jDcVbluB0uTl44AgNtc3xn7oW2ls6iUbjlbJ6g56SsgLeeceNlJQXUFxaSIpOh6u+A3tdO7FwBF2ShbSFRaRWFKFLnPryeCEEIedoPEPH70NSqdGnz0GbnIJCee7HIhoK4WqfB560AAAgAElEQVRqxtvZhaRQYCkuwpyfN6HArRCClvp2dm/fz6svvI5r1I01OYEvff9fWHPj1FbDRiNRXn58Fy89thONXsv7v/welt20dErdKI7+UWpfraZubzXOQQdqnZri1eWUb6wgqzxX7k8vMyuYstGLk8lMj16MhiM07T5BzfNvMDAyCpkWfAYlLS0dNNQ2Yx86UwmZnplKcVkBpeVFlJQXUlJeQFZOJgqFAp/dwWBVE4NVTQRdXpRaNSnzCkhdVIQlO21a/LoiFiM4YidgHxhvmqZLSUebmDzeJmH82GgUT3sHrpZWRDSKMTsLS1HhhNobjwyNsvf519m9fR8dzd2o1CpWblrKlm3rWbKmAqVqaqtDOxu6+ON3/0RvSy9LNi3mnk/dhXmKNtSgL0jj67XU7q2mp64TJMiZn0/5xgqKVpWi1l0dRWAy1x7TPnrxasfr8dFQ18wbL7zG0VeP0jNkZ8jrJhyJF2Gp1CoKivJYs2EFJWUFYyJfiCXBTCwUIhoMEQsGCbo9dOx8jdHWfryDDpAkEgvmkHfTSpJLcyclzfOtEEIgImEifj8Rn4fg8FC8aZrBiCkjC7Xl/EEkQgj8fWOBW38AXUoKCaUlqM1vHbgNBUMc2nOUXTv2c/z1amIxQUlFIf/0lYdYf8tqTJa3rtidDELBEC/89iV2PbkHc6KZj3zzQ1SsWzDpzxOLxug82Ubt3mqaD9UTCUVIzExi7YObKLthAZaUhEl/ThmZyeK6F34hBP29g/Fga+3poGsLXR0948cYtFqKS+eyaeEGCguzKczLIjvDhjIWJRoMEQ0FiQX9eI8exR0KIWIx/M4AHrsX36gfIUCtV5GYnYDJZkSXaEYV9eDr6kJtNqO2mK94SEj8tcSIBoNE/T6ifh+RgJ+o34c4a6iJ2mxBl5KBymi64BlGcGR0LHDrRG02k7hiATrbxQO3Qgjqq5rYtX0/B3a+gdftw5aWxLs+dDubt60jK2/6Whg3V7Xw+KNPMtQ9xOpbV3Hnx2/HYJ7cqt/h7iFq98T703tG3GiNOso3LqR8UwUZRXPkbByZq4LrSvhDwRAtTe001sVTJhtqmmioazkn4JqZbiPFYKKgqJw5KUksX1lMYXEqirM7THsd+Jrj1rtSq0Wh1aDU6Yihwj0UwNExSMQfQqXTkLa4mLRFJeiSTETcHsIuF2G3m+DIKL7evvGHVGi1Y4NE4tOi1BYzKqPxokISi0aI+v1EAz4iY5fRgB9Ou+4kCaVOj9piRaXXo9QZUOr15/nvTxPxenHWN+IfGECp05JYsQDDnIsHbgd7h9jz3AF27zhAb2c/Wp2WNTcuZ/O29SxYXo5yGitH/d4A23/+HAeefY3kjCT++fv/SMnS4sl7fLefhtdqqNlTxUBzL5JCIm9xIRsf2srcZcVyfr3MVcc1/Yk9vPs1Thw5RVNDK03NXXR09REdm8Gq1ajJy0xh3cIi5s5JJSfdhsqrwNHjQVIoyJmXQc6iHDRGPQqtFqVWi1Krif+uif8uqdWEvQGGTjbTc6QJb/8wkkJBUnE2qQuLSSrKRnGWL1tjMkHGmbTFaChE2OUm7HbHNwSXm4B9eFy8JYUCldmM2mREodUgqRRIEsRC8dGFp5GUKpR6A7rkVJR6Q/xHqx2vqn0roqEQ7uYWPB2d44FbU34eigsEbv2+AK+/cpjd2/dTXVkLwIJlZdz7D7ez5sYV09JT583UvFHLn77/F5x2J5vu3cCtH3rHpPTMj0aitB9voXZvFa1HmohGothyU9nwgZsoXT8fY6JcMStz9XJNB3c/ctfHOXSsjuQEE3Nz0inIm0NRQTaFRbnk5M5BY9AjlCo6T7TT9OopwoEw+WvnMX/bavQJF/dHxyJRRho7GTjRyGhzFyImMGXYSF1UROr8QtSXmZctYjEiPi+h0RGCDicRj4eIz08sFDljyQMKjRqV0YDabEGblIjaGrfqL8XNIKIxPB0duJpbEJFIPHBbXHSeyykWi3Gyso7dO/bz+iuHCfiDZGSnsXnbejbdto60OSmX9VqvFI/Dw1//9xmOvHKU9Lw0Hvz8A+TPy7vixx1s6x8fNeh3+dBbDJTdsIDyjRWk5k9trYGMzGRzseDuNS38bfXNmMxGbOlpSG9yPQgh6D7aRPUzB/DaXaTPy2Xh3etJmHPhBl1CCDw9QwxUNTF0qoWIP4jGZCC1opDURUUYUy8tLzsWDo+5aeIumqjfRzR4poUuCgUqnR6l3oBCq0ehUBINhYl4vONnBxGfb/xwSa0+z1WkNpnOz9QRAn9/P876RqJ+P7oU21jg9tyMl96Ofnbt2Mee5w4w1DeMwaRn3daVbLn9BsoWFc+YL1sIwbE9J3jqf/6Gz+1j63tvZOt7bkJ9Be4W76iHuv3xalp7xyBKlZK5y4oo37iQvMUFU56BJCMzVVyXwn8x7C29VD21j+G2fhLm2Fj4rvWkl1+433vQ5WWwqomBqib8dgcKlZLk0jxSFxaROHfOeRvKmxFCEAsGzhH4SMCPiITHj1GoNSjHRH5c7DUXH1BymlgkMuYmiruKQi43Ebf7TC9/SUJtMsU3AbMZpV6Hp62dkCMeuE0oLUGXcmaj87i87H/pDXbv2E99VRMKhcSiVQvYfPt6Vm1ahnaG0xKddidP/vApTr52ipySbB78wgPMKbi84LHf5aPrVDs1e6tpP96MiAnSizIp37iQkrXz0E9yUFhGZiaQ0zkBz5CD6qdfo/tYE7oEI8vedxN5q8vOK9uPhiIM17czcKIRR2s8u8eSncacbetJmTcX1UUEUESjRAK+s4KuFwi4anWozZZxgVfqDChUl/dvUKhUaBMT0SaeqUIVQhDxesc3g7A7Hjfw9fTG76PVkrhgPoaseAZKNBLl+MGT7Nq+j0N7jxEOhcmeO4cP/ssDbLx1Hcmp09fH5mIIITj490M883/PEglHufMfb2fju26YkCV+dmvjwbZ+hjoGGWrrxzPiBsCUZGbZHasp31hBctbMuK1kZKab60L4g94Adc8fonlvFZJSQfmtKym5aek5hTVCCFwd/QxUNWKvaSMaCqO1msjZsITUhUXokyznHBsLh84T+FjoTOdMSalEqTegTU49I/Ja3Xmul8lGOm3lm0yQmTF+ezQYJOL1obaYUahUtDd1smv7fl59/nVG7Q7MVhM3372Jzbevp7A8f9akJdp77TzxvT/TeKyJwoUFPPj5+0m5iECfbm081HbWLNnOwXNbG2fZyJ6fR0peGmmFmcwpzZZ718tcd1zTwh+NRGneW0Xd84cI+YPkr57H/NtXoz+rh7l/xDVeTRtwuFFq1NjK80ldVExCTjogiAYDBEfsY9Z8XOTFWDsGAIVGGxf5xOQxd40BSa2eNeIJoNRq8XiDvPTkK+zavp/W+naUKiXL1i9iy7b1LLthMeoZ6kV/IWLRGHv/to/nfvk8SqWCBz57L6tvXYVCoYjHW0bcZ8YMtvUz1DFwTmtjrUFLSn468zcvHh9QkpwltzaWkYFr3Me/94dPMdjQTVpZDgvftR7rmKUYCYSw17YycKIJV2e8M6Y1P5OUBQVY81IR0TPWfDQQYFxNJAVKvR7VWE68Uhf3yU+kZ81MEQ5HqHz1OLt37OPIgSqikSgFZXls3raeDe9YQ0LSlc3cnQp6W/t44tEnaa/roHxlGVsf2ETQ6T9nlmzA7R8/PiEtkZS8VFLGeten5qVhllsby8hMf3BXkqRfA7cBg0KI+WO3JQFPAnlAO3CfEGL07R7rcoW/92QbkkKKB26FwNHay0BVI8N17cQiUXSJJpKKMrHmJKFQxhDhMwFXSaVGpTecFXQ1oNC+fcB1NiCEoKmmld3b97PvxYO4nR4SbVY23rqWLdvWk1t08dbRM4ln1M1zv/g7B1+sRKVSkj0nFbxBYtGzZslmp5CSn05Kbhqp+WnYctPkWbIyMhdhJoK7vwX+F/j9Wbc9AuwSQnxHkqRHxq5/caoWkLkgH2//MK0vvMZQTRthbwClRklCdiLW3CT0iQYkSYFSo0CpM44LvFKvHx8afjUxPDDCnr+/xu4d++hq7UWtUbNq01I2376exasWzJq0RBETOAdHxwKu8RGD7bWddPQMEI5GMWo0ZGXayJibSUpe6vgUqsRMeZasjMxkMGXCL4TYJ0lS3ptuvgPYOPb774C9TKHwn/ztMzjah0ACU5qF9AWZWOdmojYZxwR+egKuU0nAH+SNPUfYvX0/VYdOEYsJyhYV8Yn/92HWbV2JyWJkqH2AA3/YTePBOkL+4Ns/6BQTDUeIhOL9g4QEfkkwMDSKwaTn1vs3s+q2VXJlrIzMFDLdka40IUQfgBCiT5Kk1IsdKEnSR4GPAuTk5FzWk1nz52DKtJE6vxCdLRGFWnNVuGreDiEEtccb2LV9P6+9fAifx09KRjL3fvgONm9bT2ZuOj6nl/p9p6jZW8VQ2wAKlYL8xYVYUqwzvXwUKgVJc2z4AkFe+OMrDPeNsHbbau742Db0Jjl/XkZmqpnS4O6Yxf/cWT5+hxDCetbfR4UQb5soPtP9+GcL/d2D7HluP7t3HKC/exCdXsuam1awZdt65i8rIxaN0Xqkidq9VbQfbyEWjZFWkEH5xoWUrpuH3nJ5g98nG7/Hz7M/28FrOw5iy7Tx7s/fR/HioplelozMNcdsKeAakCQpY8zazwAGp/n5rzp8Xj+v7TzErh37qTlajyRJLFhezrs/fjertyxHp9fS39zLnl+9RMOBGgIeP8ZEE0tuW0n5xgpsORc9qZp2RgZGqdx5hP3PvoZrxMWW+zfxzoduQTPNFcFCCEZrm3F39KBPTcaUnYE+JemqdvnJTA4RXwBHczvu9h5ikcjb32EayL5pLZq3mYVxqUy38G8HPgB8Z+zy2Wl+/quCaDRG9eEadu/Yz8FdRwgGgmTmpPPef76XTbetIzXDhnvYxckXj1L7ajUj3XaUGhWFy0so31RBbsXcWRMEDfqCnNhfzeGXKmk63owQgqJFhfzDvz9EXtmF22RM6XocLnr3HcbXb0dtNuLp7mfoWA1KrQbjnDRMWemYsjJQm2bH2ZHM1BOLRHF39OBobMPT3Q9CoLMlojLMDrfjVLinpzKd8wnigVwbMAB8FXgG+DOQA3QC9wohRi72GKe5Xlw9XW297N6+j71/fw37wAhGs4H1N69iy+03UFJRSCQUoflQPbV7q+mobgUBmaXZlG+soGRNOdrL7Ao62cRiMZpOtHD4pcOceLWaUCCELTOZFTcvZ/nWZdgyLj7YZaoQsRj26nqGjp5CUipJX70Ya3E+0WAIb88Anq4+PN39RHzx+gBtYkJ8E8hOx5Ceek57bZmrHyEE/sFhHI1tOFs6iYXCqIx6rEV5WIvy0CZeGxPUrssmbd/+5A/oae9Dq9Og02nRaTVodVq02vh1tVo1bcHe1DkplK0oJa8895y0SrfTE2+Mtn0fDSdbUCgVLFlTweZt61m5cQlqjZqe2k5q9lbTdLCWkD+EJdVK+YZ4q2Br+qV1BZ1KBruHOPxiJYdfPsLowCg6o47FGxex8ublzF0wc20g/PZRevcdJmAfxZyXRca6pagvYM0JIQiOOvF09ePp7sPXN4SIxZCUSoyZqWMbQQaaBPM1kSQQDYcJjjgJDDsIDDtQaFSYstIxpKdccB7DtUDY48XR1I6jsZ2Q042kVGLJz8JanI8xM/Wac/ddl8L/6Xu+TGd7D+FIlAu9TkmSUKtU8R+16pzfNW+6TXkFX4RYTGDvtSNiAp1RR+GiAnRWAx0dPRx/4xSRcIS8omw2b1vPxlvXkmiz4ugfpfbVaur2VuMcdKDWaSheXUb5poVkleUgKWaH8Pjcfo7vPc6hlyppO9WOpJAoXVrCiluWU7F2/rT7788mFokydKwGe1UdKp2WjLVLscydePFaLBzB2zeIp7sfT1cfIWe8sZvaZBh3CRnnpKHUzu5h6vHGfX4CIw4C9tH45bBj/PVAfMaDiETjG51KiTHztNsr/arf6GLhCK62LhxN7Xh7BgAwZKRgLcrHMjcbpebqq9mZKNel8J9GCIHH5WXU7mDU7mR02IFj2IXD7mB02Mmo3YFjxMmo3YlzxHXBTUKn15Jos2JNtmBNtpJoSyAx2Yo1OeHM77YEEpMTUF/gg+Rz+3l1xwF2bd9HS2MHkWgUhSSRkpzE8nWLWHvLSnJLcmg/1kzt3mp66jpBgpz5+ZRvrKBoVek5TeVmkmgkSv3RRg6/WEn1gZNEwhHS89JYefNylt24FOssSBn19Q/Rs6+SkMOFtTiPtFWLUemurMI35PaMnQ304+0ZIBYOgyRhSE3GmB3fCPS2xBm1GkUsRnDURWB4dMySj19Gg2cmtqnNRnTJieiSreOXapOBWCSCr3dw/IwnNDaSVG02YsrKwJSdjjEz7aoQSiEEvr5BHI3tuNq6iIUjqM1GrMX5WIvy0FiujzqR61r4L4VoJIrL4cYx7BzfJEbtzvj1YQeOszYOt9Nzwccwmg0k2qwkJidgTU4gIdFCzfF62ho6UamULN+whCWrFqCKKWg42kDziWYi4SgSoFWrSE5OYNGmxay5e+2syLs/TW9rH4dfqqTy5SO4RtwYLAaWbVnCypuXk12SPSuswmg4zODhakZqmlCbDGSuX44pO+Pt73iJiFgM34A9fjbQ3U9gKB6qUmo1GMcsZVN2xgVdSpNFNBg6S+DjIh8cdY3PY5CUSnRJCWjPEnhdknXCwh1yuc9sdL0DxMKR+EaXbhs/49HZEmfF//00QacbZ1M7jsY2wh4fCrUKy9wcrMV5GNJTZtVapwNZ+KeAcCiMY8QVP2MYdjI67IyfRdid42cQ8U3CSVZeJltuX8/6W1ZjsZoZ7h6idk98xJ9r2EVMKaFJMuF0e7H3DgOQYEugbHkJpctLKV1WjNFy8XGQU4Xb4eHormMcfqmSrsZuFEoF81aVs+Lm5cxbVX5Fk68mG093H737Kgl7fCTNKyJ1RQVK9fRYpxF/AE9PP56ufrzd/UT88Wlq2iTrWUHiy/OdCyEIuz0E7I5z3DVhz5kJbCq97hwLXpdsjbtoJunsIxaN4j+90XX1ExiOt9hS6rTjLiFTVgYqw/QnGESDIZytnTga2/EP2AEwZqVjLc7Dkpd12fMurgVk4Z8F+N0+Gg7UULO3moHmXiSFRN7iQuZtrGDusuLxlsGjg6PUVzZQV1lP/ZFG/B4/kkIitySH0hUllC0vJbc0Z8p670TCEWreqOXQi5XUvFFLLBojq2gOK29eztIbl2K2zq7T5EggyMAbJ3A0tqFJMDNnwwoM6TM3VEUIQXDEgburH293H75++4R957FIhMB4wHWU4HBc7GPhsZxySUJrNccFPsmKzmZFl5Q47YIb8QXwdPeNn/FEA/FWILpk67hbSJ9mm7IgsYjF8HT342hsx93Rg4hG0VotJBTnYy3KRW2U03FBFv5pRcQEAY8fr8ODz+HFPeyipbKR1qONxCIxbLmpzNu4kNL189+2J000EqWzoYu6w/XUVdbTUd+JiAn0Jj0lS4spW15K2YoSEt9mUlbY58c/YI9bghbzeX8XQtDZ0MWhFys5uvsYPpcPS5KZ5TctY8XNy8ice3kjDqcaV2sXfa8dJRIIYltYRsqSebMu9TIaDr+l71xtMpwbcB37TirU6nHr/bQ1r020zDoLVghBYHh0PCXW128HIVCoVRgzUjFlxzeCC33uLpXAiANHYzvO5nYivgBKrYaEglysxXnoUpKuO1fO2yEL/xUihCDkC46Ludfhwevw4jvnMv43n9M73kr4NHqLgbIb4imYqfnpl70Or8tLw9FG6iobqDtcj9PuBCA9Ly2+CSwvpWDhXFQqZfzUfExsAsOO8ccwpNuwFsczGtxOH5UvH+Xwzkr62wdQqVUsWDeflTcvp3RZyazp6Plmwj4//a8dxdXWjS45kcwNK9DbZn5M5ES4kO9cbTbGLfizA65m41UpZNFQGG/vwPhnL+z2AqCxmDBmpWPOzsCQmTphN1wkEMTZ3IGjsY2AfRQkCXNOJtbiPEw5mdds6ulkIAv/RQgHw+Pi7XV48I168DrHhHx0TNSd8b9FQ+eXcEsKCYPVhNFqxGg1YRi/jN9msJowJhhJSE+cdBEVQtDX1h93CVXW01zVSiQcQaVSkJFqISvdQnamlTnF2ZhzMjGkp+DrH8Je20LDqQ4a24fp7nMgBOSV57LylhUs2bQIg3n2niYLIXA0tjHwxglikQgpS+djqyi9avOvY9EoIhq7KjJlLgchBCGXZ/xswNs7gIhEkRQK9Gk2TGPZULpk6zmbXCwaxdPVF6+m7exDxGLokhOxFueRUJiLSj87ihVnO9el8A93DeEcGD3HMo9b5Wes9JA/dP4dJdCbDecLeaIRQ0L8ujHRhNFqQmfSz1hOfdyyGsTT3Ye3ux/viJO+QTc9di/dAy6Gh1wAJKZaKV1eSkHFXFqqWzm+9wQBbwBLgoGi3GSKchKxpSeRUJSLtTgf3SytWgy5PfTuq8TbM4Ah3UbmDSvQWmffBDGZixOLRvH12+Pxga5+giPxM1GVXocxKx1jZioB+yjO5g6iwRAqve7M5zJp9mS4XS1cl8L/t28+Qfvx5vHrWqMuLtyJZ1nj45dnftdbDLPSxRH3pTrGvzT+gXjQUKFSYcxMxZidgSkrHW1C3Jc60j9CXWU9dZUNNBxtJOANoNFpWLShghU3r6BoUQEIgaejF0djG+6uvnifkpQkrEVjltUV5r5PBkIIRmqaGDxcDRKkrVhIYnnhVekGkTmXsM+Pt7sfd1fceIkGQ0hKBebcOViL8zFlpV+1Z3OzgetS+Adb+4hGYuOCfjUO2o74A+OZE2enCV5q9kQ0EqW3rY/UOSkXHVUY70zYgbOpjcCwA0mhwDTmSzXnZM7IFzA46qRnXyX+ATum7Awy1i1DY57+tFaZqed08ZnaZJj11dBXC9el8F+NjBcGnQ7K2s/PlzZmpU9pYRBAYHgUR2M7juZ2ov4gSp2WhMKx7InkqS/aEbEY9qo6ho7WoFCrSF+9mISiPNnKl5G5BGThn8WEXJ7xfjDnVEim2cYrQGeqQlLEYmNBtrF86VgMbWIC1uJ8Eopyp2QD8ttH6H31MIFhB5a52WSsWTojhUEyMlc7s2UQiwxnNf8ay3QYb/5lNpJQmDvW/CsVpWbmT3clRdzfas6dQyQQxDVWITlw6AQDh6swZaVjLc7HnDvnivPnY5HIWFO1elQ6Ldk3rcOSnzVJr0RGRuY0svBPA/FKTudYUPZNlZwZqSTNK7oquiCqdFqSyotIKi8i6HDhaGzD0dRO967XUWjUJMzNwVqcjz4t+ZJfh7dvkN59lYScbqwl+aSvWiz7eWVkpgjZ1XMFxKJRov4gEX8g/uPzE/EFzrp+5vbTJffapIR4UPZ03/NZmD10KYhYDG/vII7GNlzt3YhIFE2COZ4VVJT3toHYaCjMwOEqRmubUZuN8aZqWZdf4CYjI3MG2dUzQUQsRjQQGhPvs4T8LBGP+INEfP5zWt2ejUKjRqXXoTLEG2epstLR2RIxZaVfcz1EJIViPOgcDYXjfc8b2xg8cpLBIycxZqbGXUH5WedVaro7e+nbf4Sw10fS/GLSllegUMsfSRmZqea6sPiFEMRC4THRDrxJzN8k7oHgeK+Us5GUSlSGuJir9PqxS924wKsM+vHrV7sVPxmEXJ6xSUdthN1eFCoV5rFJR7pkK/0Hj+NsakdrtZC5YQWGNNtML1lG5prjurT4e/dX4unsI+IPjPcoPxtJoUCp18ZF22hAl5J0lpifK+6KaRzTeC2gsZhIXTqflCXz8A3Y466gli6cTe0w9j6mLJmHbXG53GtFRmaauaaFX20yYshMHbfS1QYdytMWul6HUquRxXyKkSQJY3oKxvQUMtYswd3eg6/fTmLZXHTJV0dTNRmZa41rWvhTFpfP9BJkzkKhUpFQmEtCYe5ML0VG5rpGboIhIyMjc50xI8IvSdItkiQ1SJLULEnSIzOxBhkZGZnrlWkXfkmSlMCPgXcA5cC7JUmSfTIyMjIy08RMWPwrgGYhRKsQIgT8CbhjBtYhIyMjc10yE8I/B+g663r32G3nIEnSRyVJOiJJ0pGhoaFpW5yMjIzMtc5MCP+F8ifPq5gSQvxcCLFMCLEsJSVlGpYlIyMjc30wE8LfDWSfdT0L6J2BdcjIyMhcl8yE8FcCRZIk5UuSpAEeALbPwDpkZGRkrktmpFePJEnvBP4LUAK/FkJ8622OHwI6LvPpbID9Mu97LSK/H2eQ34tzkd+Pc7kW3o9cIcR5vvKroknblSBJ0pELNSm6XpHfjzPI78W5yO/HuVzL74dcuSsjIyNznSELv4yMjMx1xvUg/D+f6QXMMuT34wzye3Eu8vtxLtfs+3HN+/hlZGRkZM7lerD4ZWRkZGTOQhZ+GRkZmeuMa1r45fbPcSRJypYkaY8kSXWSJNVIkvTwTK9pNiBJklKSpOOSJD0302uZaSRJskqS9JQkSfVjn5PVM72mmUKSpE+PfU9OSZL0hCRJuple02RzzQq/3P75HCLAZ4UQZcAq4BPX8XtxNg8DdTO9iFnCf///9u4mNK4qDOP4/6npwlQrLtxokVTxE0ErWWgjUm034sdaUBF3LmqoG0E3bl2IuJAqEhHEKEhbpAuxWQiiC2sxisEqglZqJWpBrBJateZxcU/soIWkOPWEe54fDJy5uQPPDLnvnDl35r3A27avBq6n0ddF0iXAJDBu+zq6H5neWzfV8PW28JP2z3+zPW97tox/pTuo/9URtSWSNgB3AlO1s9QmaT1wK/ASgO3fbf9cN1VVI8C5kkaAUXrYS6zPhX9F7Z9bI2kM2ATsr5ukumeBx4DF2kFWgcuAo8DLZelrStK62qFqsP0d8DRwGJgHjtmeqZtq+Ppc+FfU/rklks4DdgM7bP9SO08tku4CfrT9UbWUiA4AAAJwSURBVO0sq8QIcCPwvO1NwALQ5DkxSRfSrQxsBC4G1km6v26q4etz4U/75wGS1tIV/Wnbe2rnqWwCuEfSN3RLgLdLerVupKqOAEdsL30K3EX3RtCibcAh20dt/wHsATZXzjR0fS78af9cSBLd+u3ntp+pnac224/b3mB7jO7/4h3bvZvVrZTt74FvJV1VNm0FDlaMVNNh4CZJo+W42UoPT3SP1A5wttg+KWk7sI9T7Z8/qxyrlgngAWBO0idl2xO236qYKVaXR4DpMkn6Gniocp4qbO+XtAuYpfs23Mf0sHVDWjZERDSmz0s9ERFxGin8ERGNSeGPiGhMCn9ERGNS+CMiGpPCH1FImiydKadrZ4k4m/J1zohC0hfAHbYPDWwbsX2yYqyIocuMPwKQ9AJds7K9ko5JelHSDPCKpDFJ70maLbfN5TFbJL0r6Q1JX0p6StJ9kj6UNCfp8rLfRZJ2SzpQbhMVn2pEZvwRS0rvnnFgO3A3cIvt45JGgUXbJyRdAbxue1zSFuBN4BrgJ7pfvE7ZfrJc7Gaj7R2SXgN22n5f0qXAvnJthIgqetuyIeI/2mv7eBmvBZ6TdAPwJ3DlwH4HbM8DSPoKWGrhOwfcVsbbgGu71i8ArJd0frk2QsT/LoU/4vQWBsaPAj/QXZlqDXBi4G+/DYwXB+4vcur4WgPcPPBGElFV1vgjlncBMG97ka7Z3Tln+PgZuuUjAMonh4hqUvgjlrcTeFDSB3TLPAvL7P9Pk8C4pE8lHQQeHnbAiDORk7sREY3JjD8iojEp/BERjUnhj4hoTAp/RERjUvgjIhqTwh8R0ZgU/oiIxvwFkgDPptPpOhMAAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.lineplot(data=counts.query('frame < 10 and label < 10'), x='frame', y='c', hue='label', estimator=None, units='label')" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.03045504e+03,\n", + " 1.85184221e+04],\n", + " [1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.98970731e+03,\n", + " 1.85904994e+04]])" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v.layers[3].data" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [], + "source": [ + "def get_transform_from_line(data, template):\n", + " \n", + " if data.shape[1] == 3:\n", + " data = data[:,1:]\n", + " \n", + " trans = data.mean(axis=0) - template.mean(axis=0)\n", + "\n", + "\n", + " vector = np.gradient(data[:2], axis=0)\n", + "\n", + " naive_angle_deg = np.arctan(np.true_divide(*vector[0])) / np.pi * 180\n", + " zoom = np.sqrt((np.gradient(data[:2], axis=0) ** 2).sum() / (np.gradient(template[:2], axis=0) ** 2).sum())\n", + " \n", + " return {'tvec': -trans, 'angle': naive_angle_deg, 'scale': zoom}" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/aaristov/miniconda3/envs/nd2/lib/python3.8/site-packages/napari/_qt/__init__.py:54: UserWarning: \n", + "\n", + "napari was tested with QT library `>=5.12.3`.\n", + "The version installed is 5.9.7. Please report any issues with\n", + "this specific QT version at https://github.com/Napari/napari/issues.\n", + " warn(message=warn_message)\n" + ] + } + ], + "source": [ + "viewer = napari.Viewer()" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(2, 3)" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "top_line = viewer.layers[1].data\n", + "top_line[0].shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "tvec = get_transform_from_line(top_line[0], template)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [], + "source": [ + "bf, fluo = viewer.layers[0].data" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "l = viewer.layers[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "input (7019, 22259)\n" + ] + } + ], + "source": [ + "bfa = r.transform(bf, tvec)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [], + "source": [ + "big_labels = tf.imread('/home/aaristov/Anchor/Lena/Data/labels_bin2+100.tif')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Image layer 'labels' at 0x7faf79115f40>" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viewer.add_image(data=[big_labels], name='labels', colormap='blue', contrast_limits=[0,501], blending='additive')" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "padded_big_labels = r.pad(big_labels, bf.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Image layer 'labels [1]' at 0x7faf7f1cd7f0>" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viewer.add_image(data=[padded_big_labels], name='labels', colormap='blue', contrast_limits=[0,1], blending='additive')" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0. , 910.35200753, 1075.14984244],\n", + " [ 0. , 973.69539982, 21281.69198341]])" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "template_line = viewer.layers[3].data[0]\n", + "template_line" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tvec': array([ -74.9135812 , -181.80175702]),\n", + " 'angle': -1.7534048600715766,\n", + " 'scale': 0.9972695147309522}" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tvec = get_transform_from_line(top_line[0], template_line[:, 1:])\n", + "tvec " + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 893.35991024, 1085.25866517],\n", + " [ 944.74264507, 1136.6414 ]])" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "template_line[:, 1:]" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0. , 1325.23369386, 1289.20664338],\n", + " [ 0. , 708.6408759 , 21431.2386965 ]])" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "top_line[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "input (7019, 22259)\n" + ] + } + ], + "source": [ + "bfa = r.transform(bf, tvec)" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Image layer 'aligned BF' at 0x7faf80771c10>" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viewer.add_image(data=[bfa], name='aligned BF', colormap='gray')" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [], + "source": [ + "labels = viewer.layers[3]" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/aaristov/miniconda3/envs/nd2/lib/python3.8/site-packages/ome_types/widgets.py:103: UserWarning: Could not parse OME metadata from /home/aaristov/Anchor/Lena/Data/20210705-MIC-0h/composites-24h/00ng-24h.aligned-big-labels.tif: not well-formed (invalid token): line 1, column 6\n", + " warnings.warn(f\"Could not parse OME metadata from {ome}: {e}\")\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AICSImageIO: Reader will load image in-memory: False\n" + ] + } + ], + "source": [ + "labels.translate = np.array([30, 120])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}