diff --git a/examples/SAMPO_scheduling_tutorial.ipynb b/examples/SAMPO_scheduling_tutorial.ipynb new file mode 100644 index 00000000..1e778e6f --- /dev/null +++ b/examples/SAMPO_scheduling_tutorial.ipynb @@ -0,0 +1,7413 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "1oY82A7IATqp" + }, + "source": [ + "# **Адаптивная оптимизация планирования производственных процессов**\n", + "\n", + "Интерактивная работа с алгоритмами планирования, реализованными в рамках фреймворка адаптивной оптимизации планирования производственных процессов SAMPO\n", + "\n", + "**Версии библиотек, используемых в ноутбуке:**\n", + "* stairsres 0.1.33" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tV0zK66JAxi4" + }, + "source": [ + "## **Настройка среды выполнения**" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Q1xMVxekcckJ", + "outputId": "14249530-c77a-4899-8fce-62909185cc0b", + "ExecuteTime": { + "end_time": "2024-07-08T12:42:33.249018Z", + "start_time": "2024-07-08T12:42:31.883248Z" + } + }, + "source": [ + "# Импорт модулей и библиотек для решения задачи планирования\n", + "from sampo.scheduler.genetic.base import HEFTScheduler, HEFTBetweenScheduler, GeneticScheduler\n", + "from sampo.scheduler.topological import TopologicalScheduler\n", + "from sampo.scheduler.topological.base import RandomizedTopologicalScheduler\n", + "\n", + "from sampo.schemas import ScheduledProject\n", + "from sampo.schemas.time import Time\n", + "from sampo.generator.environment import ContractorGenerationMethod, get_contractor_by_wg\n", + "\n", + "from sampo.pipeline import SchedulingPipeline\n", + "from sampo.pipeline.lag_optimization import LagOptimizationStrategy\n", + "\n", + "from sampo.utilities.visualization.base import VisualizationMode\n", + "from sampo.utilities.visualization.schedule import schedule_gant_chart_fig" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Can not find native module; switching to default\n" + ] + } + ], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-08T12:42:34.153518Z", + "start_time": "2024-07-08T12:42:33.250016Z" + } + }, + "cell_type": "code", + "source": "from field_dev_resources_time_estimator import FieldDevWorkEstimator", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 4, + "source": [ + "# Импорт модулей и библиотек для обработки данных\n", + "import pandas as pd\n", + "import numpy as np\n", + "import json" + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-08T12:43:02.888461Z", + "start_time": "2024-07-08T12:43:02.874498Z" + } + }, + "source": [ + "DATA_PATH = 'data/12/field_development/'\n", + "DUMPS_PATH = DATA_PATH + 'dumps/'\n", + "CSV_PATH = ''" + ], + "outputs": [], + "execution_count": 5 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "t8V5L5kWcb8C" + }, + "source": [ + "## **1. Подготовка графа работ и подрядчиков**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1aXhSuD3abDh" + }, + "source": [ + "### **1.1 Загрузка из csv-файла**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DYJNEhIxayHA" + }, + "source": [ + "Колонки с информацией по связям: `predecessor_ids`, `connection_types`, `lags` могут отсутствовать в файле, если предполагается их восстановление по историческим данным." + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-08T12:43:07.241828Z", + "start_time": "2024-07-08T12:43:07.226869Z" + } + }, + "cell_type": "code", + "source": [ + "# Если есть подготовленный в нужном формате csv-файл, то можно просто его загрузить\n", + "df = pd.read_csv(CSV_PATH + 'electroline_field_dev_demo.csv', sep=';')" + ], + "outputs": [], + "execution_count": 6 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## ДЛЯ ИНТЕГРАЦИИ В STAIRS" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "9J_N69AHysrx", + "outputId": "79277552-02b7-45f1-98a7-243326c78a61" + }, + "source": [ + "# df = pd.read_csv(CSV_PATH + 'gas_network_field_dev_demo.csv', sep=';')\n", + "df = pd.read_csv(CSV_PATH + 'electroline_field_dev_demo.csv', sep=';')\n", + "df['measurement'] = df['granular_measurement']\n", + "df['activity_id'] = list(range(200, 200 + len(df)))\n", + "df" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-08T12:44:49.251934Z", + "start_time": "2024-07-08T12:44:49.049477Z" + } + }, + "cell_type": "code", + "source": [ + "db_url = \"postgresql_url\"\n", + "project_work_estimator = FieldDevWorkEstimator(url=db_url) # object_of_the_class_that_implements_the_interface_WorkTimeEstimator\n", + "\n", + "# ЕСЛИ СТОИТ ГАЛОЧКА АВТОПОДБОРА КОЛИЧЕСТВА ПОКОЛЕНИЙ.\n", + "custom_number_of_generation = np.random.randint(10, 25) # генерируем его случайно равномерно из интервала 10-25\n", + "custom_mutate_order = 0.05 # заданная константа\n", + "custom_mutate_resources = 0.005 # заданная константа\n", + "custom_size_of_population = 50 # заданная константа\n", + "\n", + "# Если используется пользовательский WorkTimeEstimator, то передаем его в планировщик\n", + "genetic_scheduler_with_estimator = GeneticScheduler(number_of_generation=10,\n", + " mutate_order=custom_mutate_order,\n", + " mutate_resources=custom_mutate_resources,\n", + " size_of_population=custom_size_of_population,\n", + " work_estimator=project_work_estimator) # не забыть передать сюда, если используется отличный от дефолтного\n", + "\n", + "# Создание основы пайплайна планирования\n", + "scheduling_pipeline = SchedulingPipeline.create()\n", + "\n", + "# Передаем информацию о структуре графа работ (в виде pandas.DataFrame, см. выше как сконвертировать из WG)\n", + "# и значения параметров восстановления структуры по историческим данным, описанные выше\n", + "scheduling_pipeline = scheduling_pipeline.wg(wg=df,\n", + " all_connections=False,\n", + " change_connections_info=True) # этот случай, когда структура графа полностью задана и менять типы связей не нужно\n", + "\n", + "history_df = pd.read_csv('historical_projects_data.csv', sep=';')\n", + "history_df.head()\n", + "\n", + "# Передаем в пайплайн загруженный DataFrame (разделитель по умолчанию - ',')\n", + "scheduling_pipeline = scheduling_pipeline.history(history_df, sep=';')\n", + "\n", + "# Передаем в пайплайн значение LagOptimizationStrategy (TRUE или FALSE) - обязательный этап, не работает по дефолту\n", + "scheduling_pipeline = scheduling_pipeline.lag_optimize(LagOptimizationStrategy.TRUE)\n", + "\n", + "# Если мы работаем с WorkTimeEstimator, отличным от дефолтного - мы передаем его еще сюда (помимо инициализации планировщика)\n", + "scheduling_pipeline = scheduling_pipeline.work_estimator(project_work_estimator)" + ], + "outputs": [], + "execution_count": 9 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-08T12:45:35.216184Z", + "start_time": "2024-07-08T12:44:50.908541Z" + } + }, + "cell_type": "code", + "source": [ + "# Запускаем планирование и после .finish() получаем объект ScheduleProject\n", + "scheduling_project = scheduling_pipeline.schedule(genetic_scheduler_with_estimator).finish()[0]" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Genetic optimizing took 8.975982666015625 ms\n" + ] + } + ], + "execution_count": 10 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-08T12:45:36.197216Z", + "start_time": "2024-07-08T12:45:35.217048Z" + } + }, + "cell_type": "code", + "source": [ + "# Получаем объект Schedule со структурой графа работ из объекта ScheduleProject\n", + "raw_project_schedule = scheduling_project.schedule\n", + "\n", + "# Готовим финальное расписание (на вход передаем дату начала проекта в формате YYYY-MM-DD)\n", + "project_schedule = raw_project_schedule.merged_stages_datetime_df('2022-09-01') # в виде DataFrame\n", + "\n", + "# БОНУС Визуализация расписания средствами SAMPO (диаграмма Гантта)\n", + "schedule_fig = schedule_gant_chart_fig(schedule_dataframe=project_schedule,\n", + " visualization=VisualizationMode.ShowFig, # еще есть ReturnFig и SaveFig\n", + " remove_service_tasks=False)" + ], + "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "data": [ + { + "alignmentgroup": "True", + "base": [ + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-02T00:00:00", + "2022-09-02T00:00:00", + "2022-09-03T00:00:00", + "2022-09-04T00:00:00", + "2022-09-04T00:00:00", + "2022-09-05T00:00:00", + "2022-09-05T00:00:00", + "2022-09-06T00:00:00" + ], + "customdata": [ + [ + "start of project", + 0, + 0.0, + "unit", + "{}", + "
", + "
" + ], + [ + "Бурение лидерных скважин", + 50, + 25.0, + "шт", + "{'Бурильная машина': 1,
'Бурильщик, помощник бурильщика': 1,
'Геодезист': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 1}", + "
", + "
" + ], + [ + "Подвеска грозозащитного троса", + 100, + 160.0, + "м", + "{'Автокран': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 1,
'Электромонтажник': 7}", + "
", + "
" + ], + [ + "Укладка активного соляного заземления", + 600, + 35.6, + "шт", + "{'АПС (агрегат передвижной сварочный)': 1,
'Автокран': 1,
'Бурильная машина': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 3,
'Сварщик МК (металлоконструкций)': 1,
'Стропальщик': 1,
'Электромонтажник': 3}", + "
", + "
" + ], + [ + "Монтаж оголовков", + 100, + 14.0, + "шт", + "{'АПС (агрегат передвижной сварочный)': 1,
'ИТР (инженерно-технический персонал)': 1,
'Монтажник': 2,
'Монтажник МК (металлоконструкций)': 1,
'Сварщик': 1,
'Сварщик МК (металлоконструкций)': 2,
'Слесаь монтажник': 2}", + "
", + "
" + ], + [ + "Установка в скважины свай", + 200, + 18.0, + "шт", + "{'Автокран': 1,
'Бетономешалка': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 3,
'Стропальщик': 2,
'Трубоукладчик': 1,
'Экскаватор': 1}", + "
", + "
" + ], + [ + "Сборка опор/порталов", + 160, + 2.0, + "шт", + "{'Автокран': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 2,
'Монтажник МК (металлоконструкций)': 7,
'Сварщик МК (металлоконструкций)': 2,
'Стропальщик': 2,
'Тягач, тягач седельный, трал': 1}", + "
", + "
" + ], + [ + "Монтаж ростверков и опорных конструкций под порталы, опоры вл", + 140, + 4.0, + "шт", + "{'Автокран': 1,
'Геодезист': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 2,
'Трактор гусеничный': 1,
'Электромонтажник': 8}", + "
", + "
" + ], + [ + "Подвеска провода", + 110, + 200.0, + "м", + "{'Автокран': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 1,
'Тягач, тягач седельный, трал': 1,
'Электромонтажник': 7}", + "
", + "
" + ], + [ + "Укладка полосового заземления", + 80, + 24.0, + "м", + "{'АПС (агрегат передвижной сварочный)': 1,
'Бурильная машина': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 1,
'Сварщик МК (металлоконструкций)': 1,
'Электромонтажник': 3}", + "
", + "
" + ], + [ + "Установка опор/порталов", + 140, + 2.0, + "шт", + "{'Автокран': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 2,
'Монтажник МК (металлоконструкций)': 5,
'Сварщик МК (металлоконструкций)': 2,
'Стропальщик': 2,
'Тягач, тягач седельный, трал': 1}", + "
", + "
" + ], + [ + "finish of project", + 0, + 0.0, + "unit", + "{}", + "
", + "
" + ] + ], + "hovertemplate": "%{hovertext}

color=Contractor 1
start=%{base}
finish=%{x}
idx=%{y}
task_name=%{text}
task_name_mapped=%{customdata[0]}
cost=%{customdata[1]}
volume=%{customdata[2]}
measurement=%{customdata[3]}
workers=%{customdata[4]}
zone_information=%{customdata[5]}
material_information=%{customdata[6]}", + "hovertext": [ + "start of project", + "Бурение лидерных скважин", + "Подвеска грозозащитного троса", + "Укладка активного соляного заземления", + "Монтаж оголовников", + "Установка в скважины свай", + "Сборка опор/порталов", + "Монтаж ростверков и опорных конструкций под порталы, опоры ВЛ", + "Подвеска провода", + "Укладка полосового заземления", + "Установка опор/порталов", + "finish of project" + ], + "legendgroup": "Contractor 1", + "marker": { + "color": "#636efa", + "pattern": { + "shape": "" + } + }, + "name": "Contractor 1", + "offsetgroup": "Contractor 1", + "orientation": "h", + "showlegend": true, + "text": [ + "start of project", + "Бурение лидерных скважин", + "Подвеска грозозащитного троса", + "Укладка активного соляного заземления", + "Монтаж оголовников", + "Установка в скважины свай", + "Сборка опор/порталов", + "Монтаж ростверков и опорных конструкций под порталы, опоры ВЛ", + "Подвеска провода", + "Укладка полосового заземления", + "Установка опор/порталов", + "finish of project" + ], + "textposition": "outside", + "x": [ + 0.0, + 8.64E7, + 8.64E7, + 4.32E8, + 8.64E7, + 1.728E8, + 8.64E7, + 8.64E7, + 8.64E7, + 8.64E7, + 8.64E7, + 0.0 + ], + "xaxis": "x", + "y": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "yaxis": "y", + "type": "bar" + }, + { + "alignmentgroup": "True", + "base": [ + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00" + ], + "customdata": [ + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ] + ], + "hovertemplate": "%{hovertext}

color=
start=%{base}
finish=%{x}
idx=%{y}
task_name=%{text}
task_name_mapped=%{customdata[0]}
cost=%{customdata[1]}
volume=%{customdata[2]}
measurement=%{customdata[3]}
workers=%{customdata[4]}
zone_information=%{customdata[5]}
material_information=%{customdata[6]}", + "hovertext": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "legendgroup": "", + "marker": { + "color": "#EF553B", + "pattern": { + "shape": "" + } + }, + "name": "", + "offsetgroup": "", + "orientation": "h", + "showlegend": false, + "text": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "textposition": "outside", + "x": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "xaxis": "x", + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "yaxis": "y", + "type": "bar" + } + ], + "layout": { + "template": { + "data": { + "histogram2dcontour": [ + { + "type": "histogram2dcontour", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "choropleth": [ + { + "type": "choropleth", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + ], + "histogram2d": [ + { + "type": "histogram2d", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "heatmap": [ + { + "type": "heatmap", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "heatmapgl": [ + { + "type": "heatmapgl", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "contourcarpet": [ + { + "type": "contourcarpet", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + ], + "contour": [ + { + "type": "contour", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "surface": [ + { + "type": "surface", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "mesh3d": [ + { + "type": "mesh3d", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "parcoords": [ + { + "type": "parcoords", + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scatterpolargl": [ + { + "type": "scatterpolargl", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "scattergeo": [ + { + "type": "scattergeo", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scatterpolar": [ + { + "type": "scatterpolar", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "scattergl": [ + { + "type": "scattergl", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scatter3d": [ + { + "type": "scatter3d", + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scattermapbox": [ + { + "type": "scattermapbox", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scatterternary": [ + { + "type": "scatterternary", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scattercarpet": [ + { + "type": "scattercarpet", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ] + }, + "layout": { + "autotypenumbers": "strict", + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "hovermode": "closest", + "hoverlabel": { + "align": "left" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "bgcolor": "#E5ECF6", + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "ternary": { + "bgcolor": "#E5ECF6", + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "sequential": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ], + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ] + }, + "xaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "automargin": true, + "zerolinewidth": 2 + }, + "yaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "automargin": true, + "zerolinewidth": 2 + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white", + "gridwidth": 2 + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white", + "gridwidth": 2 + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white", + "gridwidth": 2 + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "geo": { + "bgcolor": "white", + "landcolor": "#E5ECF6", + "subunitcolor": "white", + "showland": true, + "showlakes": true, + "lakecolor": "white" + }, + "title": { + "x": 0.05 + }, + "mapbox": { + "style": "light" + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0.0, + 1.0 + ], + "type": "date", + "title": { + "text": "Date" + }, + "range": [ + "2022-08-30T00:00:00", + "2022-09-07T00:00:00" + ] + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0.0, + 1.0 + ], + "title": { + "text": "Project tasks" + }, + "categoryorder": "array", + "categoryarray": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ], + "showticklabels": false, + "type": "category" + }, + "legend": { + "title": { + "text": "color" + }, + "tracegroupgap": 0 + }, + "title": { + "text": "Project tasks - Gant chart" + }, + "barmode": "overlay", + "font": { + "size": 12 + }, + "autosize": true + }, + "config": { + "plotlyServerURL": "https://plot.ly" + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 11 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uRn9d0shdMF3" + }, + "source": [ + "### **1.2 Загрузка информации о проекте из cериализованного JSON**\n", + "\n", + "Сериализованный JSON содержит информацию о:\n", + "* структуре графа работ - конвертируется в WorkGraph;\n", + "* расписании работ." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "8Pzg8vbWjePw" + }, + "outputs": [], + "source": [ + "# Загружаем проект из JSON-файла (объект \"Газосборные сети\", расписание построено с применением генетического планировщика)\n", + "# Первый параметр - путь до директории, где лежит JSON, второй - название JSON-файла без расширения\n", + "uploaded_schedule_project = ScheduledProject.loadf(folder_path=DUMPS_PATH,\n", + " file_name='gas_network_full_connections') # Объект ScheduleProject" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9aweLjBxjTo5" + }, + "source": [ + "#### **1.2.1 Получение объекта WorkGraph из загруженного проекта и преобразование в DataFrame**" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 192 + }, + "id": "feZUAUxZdxkI", + "outputId": "52682430-6965-4fe2-99e0-6b3a4ed0126f" + }, + "outputs": [], + "source": [ + "# Получаем WorkGraph со структурой графа работ из объекта ScheduleProject\n", + "project_wg = uploaded_schedule_project.wg" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "1cQnlxYwyTgX" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
activity_idactivity_namegranular_namevolumemeasurementpredecessor_idsconnection_typeslags
025809398Начало работ по маркеНачало работ по марке0.01
125809830Изготовление свайИзготовление свай1496.0шт25809398FS1.0
225809831Бурение скважинБурение скважин1496.0шт25809398,25809830FS,FFS1.0,0.03
325809833Погружение свайПогружение свай1496.0шт25809398,25809831FS,FFS1.0,0.03
425813507Заполнение полости свай ЦПСЗаполнение полости свай1500.0шт25809398,25809833FS,FFS1.0,0.03
\n", + "
" + ], + "text/plain": [ + " activity_id activity_name granular_name volume \\\n", + "0 25809398 Начало работ по марке Начало работ по марке 0.0 \n", + "1 25809830 Изготовление свай Изготовление свай 1496.0 \n", + "2 25809831 Бурение скважин Бурение скважин 1496.0 \n", + "3 25809833 Погружение свай Погружение свай 1496.0 \n", + "4 25813507 Заполнение полости свай ЦПС Заполнение полости свай 1500.0 \n", + "\n", + " measurement predecessor_ids connection_types lags \n", + "0 1 \n", + "1 шт 25809398 FS 1.0 \n", + "2 шт 25809398,25809830 FS,FFS 1.0,0.03 \n", + "3 шт 25809398,25809831 FS,FFS 1.0,0.03 \n", + "4 шт 25809398,25809833 FS,FFS 1.0,0.03 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Конвертируем его в DataFrame\n", + "df = project_wg.to_frame()\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uJ3wZQn1e8p4" + }, + "source": [ + "#### **1.2.1 Автоподбор подрядчиков по объекту WorkGraph**\n", + "\n", + "В самом простом случае мы не даем пользователю выбор наборов ресурсов, которые реализуют проект.\n", + "\n", + "В этом случае можно воспользоваться функцией автоматического подбора реалистичного набора ресурсов, достаточного для выполнения работ в заданном графе работ (представленном объектом `WorkGraph`).\n", + "\n", + "\n", + "Какие параметры нужно передать:\n", + "* объект WorkGraph со структурой проекта, для выполнения задач которого нам нужны подрядчики (он содержит требования min-max req по каждой из задач);\n", + "* метод генерации как одно из трех значений enum-а `ContractorGenerationMethod`\n", + " * ContractorGenerationMethod.MIN - чтобы можно было выполнить задачи, назначая на них минимальное число ресурсов (min req);\n", + " * ContractorGenerationMethod.AVG - чтобы можно было выполнить задачи, назначая на них среднее число ресурсов (ПО УМОЛЧАНИЮ);\n", + " * ContractorGenerationMethod.MAX - чтобы можно было выполнить задачи, назначая на них максимальное число ресурсо (max req);\n", + "* имя подрядчика (строка, будет отображаться на диаграмме Гантта)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A_Q7nlagilQI" + }, + "source": [ + "**Генерируем подрядчика(-ов)**" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "MdLMdvOxf2yC" + }, + "outputs": [], + "source": [ + "# даже если подрядчик один - нужно обернуть в список\n", + "project_contractors = [get_contractor_by_wg(wg=project_wg, # объект WorkGraph\n", + " method=ContractorGenerationMethod.AVG, # метод генерации\n", + " contractor_name='Main contractor')] # имя подрядчика\n", + "\n", + "# пример генерации, когда нужно несколько подрядчиков\n", + "project_contractors = [get_contractor_by_wg(wg=project_wg,\n", + " method=ContractorGenerationMethod.MIN, # у этого будет поменьше ресурсов\n", + " contractor_name='First contractor'),\n", + " get_contractor_by_wg(wg=project_wg,\n", + " method=ContractorGenerationMethod.AVG, # у этого будет побольше ресурсов\n", + " contractor_name='Second contractor')]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9nWsgzPdiwfR" + }, + "source": [ + "**Самый простой способ генерации**" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "i1L8MS3UiqXY" + }, + "outputs": [], + "source": [ + "# Имя указываем, чтобы было красиво на визуализации\n", + "project_contractors = [get_contractor_by_wg(wg=project_wg, contractor_name='Main contractor')]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3ZGSd2EajA8o" + }, + "source": [ + "#### **1.2.3 Получение объекта расписания из сериализованного JSON**\n", + "\n", + "Чтобы получить финальное расписание для визуализации, нужно получить объект Schedule из загруженного объекта ScheduleProject, а затем подготовить его к визуализации, задав дату начала работ и преобразовав временную шкалу из абстрактной в человеческую (дни)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "km1D7Oxqdxn3" + }, + "outputs": [], + "source": [ + "# Получаем объект Schedule со структурой графа работ из объекта ScheduleProject\n", + "raw_project_schedule = uploaded_schedule_project.schedule\n", + "\n", + "# Готовим финальное расписание (на вход передаем дату начала проекта в формате YYYY-MM-DD)\n", + "project_schedule = raw_project_schedule.merged_stages_datetime_df('2022-09-01') # в виде DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 631 + }, + "id": "2Kllfjm8lwMZ", + "outputId": "378dd06d-6eab-489c-8628-d03c5ae3380f" + }, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "base": [ + "2022-09-01T00:00:00", + "2022-09-02T00:00:00", + "2022-09-03T00:00:00", + "2022-09-05T00:00:00", + "2022-09-08T00:00:00", + "2022-09-12T00:00:00", + "2022-09-12T00:00:00", + "2022-09-16T00:00:00", + "2022-09-16T00:00:00", + "2022-09-28T00:00:00", + "2022-09-30T00:00:00", + "2022-10-01T00:00:00", + "2022-10-02T00:00:00", + "2022-10-03T00:00:00", + "2022-10-03T00:00:00", + "2022-10-04T00:00:00", + "2022-10-04T00:00:00", + "2022-10-08T00:00:00", + "2022-10-09T00:00:00", + "2022-10-11T00:00:00", + "2022-10-11T00:00:00", + "2022-10-24T00:00:00", + "2022-10-24T00:00:00", + "2022-11-26T00:00:00", + "2022-11-26T00:00:00", + "2022-11-27T00:00:00", + "2022-12-01T00:00:00", + "2022-12-07T00:00:00", + "2022-12-08T00:00:00", + "2022-12-09T00:00:00", + "2022-12-13T00:00:00", + "2022-12-18T00:00:00", + "2022-12-25T00:00:00", + "2022-12-26T00:00:00" + ], + "customdata": [ + [ + " 1 Sep 2022", + " 1 Sep 2022", + "start of project", + 0, + 0, + "unit", + "{}", + "
" + ], + [ + " 2 Sep 2022", + " 2 Sep 2022", + "Начало работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + " 3 Sep 2022", + " 4 Sep 2022", + "Изготовление свай", + 0, + 1496, + "шт", + "{'driver': 9147,
'electrician': 8807,
'engineer': 9001,
'fitter': 9211,
'handyman': 9123,
'manager': 8939}", + "
" + ], + [ + " 5 Sep 2022", + " 7 Sep 2022", + "Бурение скважин", + 0, + 1496, + "шт", + "{'driver': 8913,
'electrician': 9029,
'engineer': 8919,
'fitter': 8903,
'handyman': 9019,
'manager': 8959}", + "
" + ], + [ + " 8 Sep 2022", + "11 Sep 2022", + "Погружение свай", + 0, + 1496, + "шт", + "{'driver': 9077,
'electrician': 9241,
'engineer': 8951,
'fitter': 9045,
'handyman': 8943,
'manager': 8871}", + "
" + ], + [ + "12 Sep 2022", + "14 Sep 2022", + "Заполнение полости свай", + 0, + 1500, + "шт", + "{'driver': 8879,
'electrician': 9247,
'engineer': 9043,
'fitter': 8963,
'handyman': 8927,
'manager': 9099}", + "
" + ], + [ + "12 Sep 2022", + "17 Sep 2022", + "Засыпка щебнем", + 60120, + 82.8, + "м3", + "{'driver': 557,
'electrician': 517,
'engineer': 469,
'fitter': 495,
'handyman': 497,
'manager': 471}", + "
" + ], + [ + "16 Sep 2022", + "29 Sep 2022", + "Монтаж оголовков", + 3225600, + 1496, + "шт", + "{'driver': 8757,
'electrician': 9229,
'engineer': 8721,
'fitter': 8927,
'handyman': 9011,
'manager': 9115}", + "
" + ], + [ + "16 Sep 2022", + "17 Sep 2022", + "Устройство термометрических скважин", + 0, + 11, + "шт", + "{'driver': 49,
'electrician': 59,
'engineer': 39,
'fitter': 57,
'handyman': 79,
'manager': 43}", + "
" + ], + [ + "28 Sep 2022", + "30 Sep 2022", + "Монтаж термометрических трубок", + 0, + 59, + "шт", + "{'driver': 333,
'electrician': 341,
'engineer': 351,
'fitter': 343,
'handyman': 381,
'manager': 351}", + "
" + ], + [ + "30 Sep 2022", + " 1 Oct 2022", + "Монтаж деформационных марок", + 0, + 100, + "шт", + "{'driver': 607,
'electrician': 575,
'engineer': 585,
'fitter': 609,
'handyman': 571,
'manager': 589}", + "
" + ], + [ + " 1 Oct 2022", + " 2 Oct 2022", + "Монтаж траверс", + 0, + 945, + "шт", + "{'driver': 5935,
'electrician': 5515,
'engineer': 5797,
'fitter': 5621,
'handyman': 5845,
'manager': 5727}", + "
" + ], + [ + " 2 Oct 2022", + " 3 Oct 2022", + "Монтаж м/к (связи, стойки, подкосы, упоры)", + 0, + 148.6, + "тн", + "{'driver': 849,
'electrician': 843,
'engineer': 881,
'fitter': 931,
'handyman': 901,
'manager': 933}", + "
" + ], + [ + " 3 Oct 2022", + " 4 Oct 2022", + "Монтаж термостабилизаторов", + 0, + 81, + "шт", + "{'driver': 491,
'electrician': 501,
'engineer': 503,
'fitter': 493,
'handyman': 445,
'manager': 461}", + "
" + ], + [ + " 3 Oct 2022", + " 3 Oct 2022", + "Начало работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + " 4 Oct 2022", + " 5 Oct 2022", + "Монтаж опор", + 0, + 84.00000000000001, + "шт", + "{'driver': 523,
'electrician': 467,
'engineer': 517,
'fitter': 501,
'handyman': 487,
'manager': 481}", + "
" + ], + [ + " 4 Oct 2022", + " 8 Oct 2022", + "Устройство песчаной подушки", + 204800, + 144.47, + "м3", + "{'driver': 849,
'electrician': 779,
'engineer': 897,
'fitter': 841,
'handyman': 853,
'manager': 901}", + "
" + ], + [ + " 8 Oct 2022", + "10 Oct 2022", + "Сварка трубопровода", + 0, + 202.99999999999997, + "стык", + "{'driver': 1273,
'electrician': 1109,
'engineer': 1251,
'fitter': 1229,
'handyman': 1229,
'manager': 1209}", + "
" + ], + [ + " 9 Oct 2022", + "10 Oct 2022", + "Укладка георешетки", + 0, + 92.00000000000001, + "шт", + "{'driver': 551,
'electrician': 533,
'engineer': 495,
'fitter': 603,
'handyman': 583,
'manager': 557}", + "
" + ], + [ + "11 Oct 2022", + "18 Oct 2022", + "Заполнение щебнем", + 267900, + 247.97, + "м3", + "{'driver': 1419,
'electrician': 1445,
'engineer': 1451,
'fitter': 1547,
'handyman': 1531,
'manager': 1537}", + "
" + ], + [ + "11 Oct 2022", + "24 Oct 2022", + "Прокладка трубопровода", + 2725320, + 1267.12, + "м", + "{'driver': 7407,
'electrician': 7665,
'engineer': 7557,
'fitter': 7533,
'handyman': 7479,
'manager': 7781}", + "
" + ], + [ + "24 Oct 2022", + "26 Nov 2022", + "АКЗ свай и м/к", + 98381910, + 11017, + "м2", + "{'driver': 49548,
'electrician': 49800,
'engineer': 49485,
'fitter': 50007,
'handyman': 49854,
'manager': 49433}", + "
" + ], + [ + "24 Oct 2022", + "25 Oct 2022", + "Окончание работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + "26 Nov 2022", + "27 Nov 2022", + "Монтаж опор трубопровода", + 0, + 238, + "шт", + "{'driver': 1409,
'electrician': 1407,
'engineer': 1395,
'fitter': 1465,
'handyman': 1505,
'manager': 1499}", + "
" + ], + [ + "26 Nov 2022", + "27 Nov 2022", + "Прокладка трубопровода", + 0, + 1200.17, + "м", + "{'driver': 7309,
'electrician': 7197,
'engineer': 7261,
'fitter': 7169,
'handyman': 7037,
'manager': 7335}", + "
" + ], + [ + "27 Nov 2022", + " 1 Dec 2022", + "Сварка трубопровода", + 172560, + 121, + "стык", + "{'driver': 683,
'electrician': 661,
'engineer': 727,
'fitter': 685,
'handyman': 779,
'manager': 779}", + "
" + ], + [ + " 1 Dec 2022", + " 6 Dec 2022", + "Монтаж заземления", + 71120, + 100, + "%", + "{'driver': 597,
'electrician': 573,
'engineer': 557,
'fitter': 585,
'handyman': 617,
'manager': 627}", + "
" + ], + [ + " 7 Dec 2022", + " 7 Dec 2022", + "Окончание работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + " 8 Dec 2022", + " 8 Dec 2022", + "Начало работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + " 9 Dec 2022", + "12 Dec 2022", + "Очистка трубопровода", + 109020, + 100, + "%", + "{'driver': 603,
'electrician': 643,
'engineer': 593,
'fitter': 531,
'handyman': 611,
'manager': 653}", + "
" + ], + [ + "13 Dec 2022", + "17 Dec 2022", + "Гидроиспытания трубопровода", + 140000, + 100, + "%", + "{'driver': 527,
'electrician': 625,
'engineer': 575,
'fitter': 603,
'handyman': 543,
'manager': 627}", + "
" + ], + [ + "18 Dec 2022", + "24 Dec 2022", + "Изоляция сварных соединений", + 445920, + 203, + "стык", + "{'driver': 1179,
'electrician': 1209,
'engineer': 1229,
'fitter': 1297,
'handyman': 1235,
'manager': 1283}", + "
" + ], + [ + "25 Dec 2022", + "25 Dec 2022", + "Окончание работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + "26 Dec 2022", + "26 Dec 2022", + "finish of project", + 0, + 0, + "unit", + "{}", + "
" + ] + ], + "hovertemplate": "%{hovertext}

color=Contractor 1
idx=%{y}
task_name=%{text}
start=%{customdata[0]}
finish=%{customdata[1]}
task_name_mapped=%{customdata[2]}
cost=%{customdata[3]}
volume=%{customdata[4]}
measurement=%{customdata[5]}
workers=%{customdata[6]}
zone_information=%{customdata[7]}", + "hovertext": [ + "start of project", + "Начало работ по марке", + "Изготовление свай", + "Бурение скважин", + "Погружение свай", + "Заполнение полости свай ЦПС", + "Засыпка пространства между сваями щебнем фракции 15-20 мм", + "Срезка свай, монтаж оголовков", + "Устройство термометрических скважин", + "Монтаж термометрических трубок", + "Монтаж деформационных марок", + "Монтаж траверс", + "Монтаж м/к (связи, стойки, упоры, подкосы)", + "Монтаж термостабилизаторов", + "Начало работ по марке", + "Монтаж опор DN 500 (неподвижная, направляющая, скользящая)", + "Устройство песчанной подушки", + "Сварка газопровода 530х24 мм", + "Укладка габионов", + "Заполнение габионов щебнем фракции 70-120мм", + "Надземная прокладка газопровода 530х24 мм", + "АКЗ свай и металлоконструкций", + "Окончание работ по марке", + "Монтаж опор метанолопровода", + "Надземная прокладка метанолопровода 57х6мм", + "Сварка метанолопровода 57х6мм", + "Монтаж заземления", + "Окончание работ по марке", + "Начало работ по марке", + "Очистка полости трубопроводов", + "Гидроиспытания трубопроводов", + "Изоляция сварных соединений газопровода", + "Окончание работ по марке", + "finish of project" + ], + "legendgroup": "Contractor 1", + "marker": { + "color": "#636efa", + "pattern": { + "shape": "" + } + }, + "name": "Contractor 1", + "offsetgroup": "Contractor 1", + "orientation": "h", + "showlegend": true, + "text": [ + "start of project", + "Начало работ по марке", + "Изготовление свай", + "Бурение скважин", + "Погружение свай", + "Заполнение полости свай ЦПС", + "Засыпка пространства между сваями щебнем фракции 15-20 мм", + "Срезка свай, монтаж оголовков", + "Устройство термометрических скважин", + "Монтаж термометрических трубок", + "Монтаж деформационных марок", + "Монтаж траверс", + "Монтаж м/к (связи, стойки, упоры, подкосы)", + "Монтаж термостабилизаторов", + "Начало работ по марке", + "Монтаж опор DN 500 (неподвижная, направляющая, скользящая)", + "Устройство песчанной подушки", + "Сварка газопровода 530х24 мм", + "Укладка габионов", + "Заполнение габионов щебнем фракции 70-120мм", + "Надземная прокладка газопровода 530х24 мм", + "АКЗ свай и металлоконструкций", + "Окончание работ по марке", + "Монтаж опор метанолопровода", + "Надземная прокладка метанолопровода 57х6мм", + "Сварка метанолопровода 57х6мм", + "Монтаж заземления", + "Окончание работ по марке", + "Начало работ по марке", + "Очистка полости трубопроводов", + "Гидроиспытания трубопроводов", + "Изоляция сварных соединений газопровода", + "Окончание работ по марке", + "finish of project" + ], + "textposition": "outside", + "type": "bar", + "x": [ + 0, + 0, + 172800000, + 259200000, + 345600000, + 259200000, + 518400000, + 1209600000, + 172800000, + 259200000, + 172800000, + 172800000, + 172800000, + 172800000, + 0, + 172800000, + 432000000, + 259200000, + 172800000, + 691200000, + 1209600000, + 2937600000, + 172800000, + 172800000, + 172800000, + 432000000, + 518400000, + 0, + 0, + 345600000, + 432000000, + 604800000, + 0, + 0 + ], + "xaxis": "x", + "y": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ], + "yaxis": "y" + } + ], + "layout": { + "autosize": true, + "barmode": "overlay", + "font": { + "size": 12 + }, + "legend": { + "title": { + "text": "color" + }, + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Project tasks - Gant chart" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "range": [ + "2022-08-30T00:00:00", + "2023-02-02T00:00:00" + ], + "title": { + "text": "Date" + }, + "type": "date" + }, + "yaxis": { + "anchor": "x", + "autorange": true, + "categoryarray": [ + 33, + 32, + 31, + 30, + 29, + 28, + 27, + 26, + 25, + 24, + 23, + 22, + 21, + 20, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ], + "categoryorder": "array", + "domain": [ + 0, + 1 + ], + "range": [ + -0.5, + 33.5 + ], + "showticklabels": false, + "title": { + "text": "Project tasks" + }, + "type": "category" + } + } + }, + "image/png": "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7W1TvdUeLGYsORYJkAAJkAAJkAAJkAAJkAAJlJMApcnbyTMzH3zlg+HOD5ASkJ2nO271QTzXFYxcJx1ynXbZ7UTE//N3z+J977pT5cEo5kkTed+Pfv7GtgSimTlkf+DP9b2d68x10iQjCrI/vOsZq5i/BBnOD7z3nrwSpeplk713steZax8Ucj1H4v3c93++TcJln4qJRKMqAa/IuOy9m4uz9Hviv38Vj//R723lw8l1EilbruS6spTvHixmPDkWCZAACZAACZAACZAACZAACZSLgGmlyU45cavrOrk+fO78r/HZVUt2fjDOCJaOtqabPrRnf/iUMeXD715VUPL9wJrv9Zxc893tnReu3IDb5VQyZ6c02S23i56xivkLUMyrWLnY7Db+bhIpn0Swu+29bD67xfdW+24nX4nVM88+v3USZ689k+8eLGY8ORYJkAAJkAAJkAAJkAAJkAAJlIuAKaVJ5kPuHScPbVXQudUH650fKDPByXwola+zK/HslCaZsZ94/OGbqunIh+LHn3hanSKQR65B5GqXvSHy/cC61wdgPVc29CRKzZYEMt/dKgjpGSvXL0CG97e+98K2H98qT4k03C222SdEMgPuPFWhh81e0iRbguV70mS3vZePNNm5P+XrXBWETh0boDQp1795+R4SIAESIAESIAESIAESIIGqIGAaabIzGjs/aN9KmtxKUuT62c4PxrvlxsjMKZMPYjmwqvJR7FX6tpjSJCMwsq917HZCIVdOjmyOOwVD9ofwnfz3GquYvz16rudk5n6gq21LgOllU0ppoifWe500yZYmmblKXpLsylE8aVLMHcexSIAESIAESIAESIAESIAEaoWAaaTJXiJiv06aZG+kW51IyW6n54N0dvvdPlTv9WE713WizLjZpz4ybLNLOf/F4w/jE088rZrvVdY511jF/AXTkwh2pzTJ5AnZeVWqkOs5lXTSZLe9Q2lSzB3HsUiABEiABEiABEiABEiABGqFAKXJ25EsZU6Tva7HZDbTrdpl5w7Rc2Uje4PudnJktzXnav/t51/Eu8+d2VaKd2f/nTk8cl2DknnpGavYv2CZ0z65kvzKu3ZKk+m5xZwlqY1Kk+zrWJIHZq/nVjlNMhz3EjzyDrk+Jo9UEcp87XY5tl6frzTJdw/utU7+nARIgARIgARIgARIgARIgAQqkQCliQ5pIk12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RRLFMEmABEiABEiABEiABEiABEiABEiABIwlQNHEWN6cjQRIgARIgARIgARIgARIgARIgARIwCIEKJpYJFEMkwRIgARIgARIgARIgARIgARIgARIwFgCFE2M5c3ZSIAESIAESIAESIAESIAESIAESIAELEKAoolFEsUwSYAESIAESIAESIAESIAESIAESIAEjCVA0cRY3pyNBEiABEiABEiABEiABEiABEiABEjAIgQomlgkUQyTBEiABEiABEiABEiABEiABEiABEjAWAIUTYzlzdlIgARIgARIgARIgARIgARIgARIgAQsQoCiiUUSxTBJgARIgARIgARIgARIgARIgARIgASMJUDRxFjenI0ESIAESIAESIAESIAESIAESIAESMAiBCiaWCRRDJMESIAESIAESIAESIAESIAESIAESMBYAhRNjOXN2UiABEiABEjgUAj8xeNP4G/+6ak9Y/f1dODxz38CEyP9mub8xlM/xDMvXMRnH/kIfF63pr5sTAIkQAIkQAIkQAL1RICiST1lk2shARIgARJoWAIimiwsre4ROp576TJ+9w8/h9//rQfwRw8/WDYbiiZlo2JDEiABEiABEiCBOidA0aTOE8zlkQAJkAAJNAaBYqKJrPza1Bwe/uQX8bHf+Q188IF3KRiFp1LOnhzHlz/3cbS3NiMntORT+9NPfqRo30pPsjRGRrhKEiABEiABEiCBeiBA0aQessg1kAAJkAAJNDyB/USTnEiSfwrlr//hSbz33tt2r+0U9t3vpIm0k1fu1IoILI8+9pWKrgA1fMIIgARIgARIgARIwBIEKJpYIk0MkgRIgARIgAQOJnCQaCIiyBNPPr17mqRwJDmN8oUvfR2PffohddqkmGhS2EbGiMYS+MwXvoq7bzu1exKFeSIBEiABEiABEiCBeiJA0aSessm1kAAJkAAJNCwBLaJJTuz45nef2eWVf9WmmGhS7NpOrnP+9Z2GTQAXTgIkQAIkQAIkUJcEKJrUZVq5KBIgARIggUYjUO71nLnFFeVx8sB77tq9ZiOnSP74sa/gzx59SF3Z2U80+eLjT+x7WqXReHO9JEACJEACJEACjUGAoklj5JmrJAESIAESqHMCpYxgH3v0Idxx7oQyev2XJ5/eU2WnUDQpp02d4+TySIAESIAESIAESEARoGjCjUACJEACJEACdUCg3JLDheatuas6L752ZdfQtZjBa67d9NzSntMmciplqL9bCTJ8kQAJkAAJkAAJkEC9EaBoUm8Z5XpIgARIgAQakkBhGWGBsF9JYBE6/uTzX1WcpM0jH/1NfO3r39q9niNfzx9vv5LD0i6/XHFDgueiSYAESIAESIAE6poARZO6Ti8XRwIkQAIkQAIkQAIkQAIkQAIkQAIkUCkBiiaVkmM/EiABEiABEiABEiABEiABEiABEiCBuiZA0aSu08vFkQAJkAAJkAAJkAAJkAAJkAAJkAAJVEqAokml5NiPBEiABEiABEiABEiABEiABEiABEigrglQNKnr9HJxJEACJEACJEACJEACJEACJEACJEAClRKgaFIpOfYjARIgARIgARIgARIgARIgARIgARKoawIUTeo6vVwcCZAACZAACZAACZAACZAACZAACZBApQQomlRKjv1IgARIgARIgARIgARIgARIgARIgATqmgBFk7pOLxdHAiRAAiRAAiRAAiRAAiRAAiRAAiRQKQGKJpWSYz8SIAESIAESIAESIAESIAESIAESIIG6JkDRpK7Ty8WRAAmQAAmQAAmQAAmQAAmQAAmQAAlUSoCiSaXk2I8ESIAESIAESIAESIAESIAESIAESKCuCVA0qev0cnEkQAIkQAIkQAIkQAIkQAIkQAIkQAKVEqBoUik59iMBEiABEiABEiABEiABEiABEiABEqhrAhRN6jq9XBwJkAAJkAAJkAAJkAAJkAAJkAAJkEClBCiaVEqO/UiABEiABEiABEiABEiABEiABEiABOqaAEWTuk4vF0cCJEACJEACJEACJEACJEACJEACJFApAYomlZJjPxIgARIgARIgARIgARIgARIgARIggbomQNGkrtPLxZEACZAACZAACZAACZAACZAACZAACVRKgKJJpeTYjwRIgARIgARIgARIgARIgARIgARIoK4JUDSp6/RycSRAAiRAAiRAAiRAAiRAAiRAAiRAApUSoGhSKTn2IwESIAESIAESIAESIAESIAESIAESqGsCFE3qOr1cHAmQAAmQAAmQAAmQAAmQAAmQAAmQQKUEKJpUSo79SIAESIAESIAESIAESIAESIAESIAE6poARZO6Ti8XRwIkQAIkQAIkQAIkQAIkQAIkQAIkUCkBiiaVkmM/EiABEiABEiABEiABEiABEiABEiCBuiZA0aSu08vFkQAJkAAJkAAJkAAJkAAJkAAJkAAJVEqAokml5NiPBEiABEiABEiABEiABEiABEiABEigrglQNKnr9HJxJEACJEACJEACJEACJEACJEACJEAClRKgaFIpOfYjARIgARIgARIgARIgARIgARIgARKoawIUTeo6vVwcCZAACZAACZAACZAACZAACZAACZBApQQomlRKjv1IgARIgARIgARIgARIgARIgARIgATqmgBFk7pOLxdHAiRAAiRAAiRAAiRAAiRAAiRAAiRQKQGKJpWSYz8SIAESIAESIAESIAESIAESIAESIIG6JkDRpK7Ty8WRAAmQAAmQAAmQAAmQAAmQAAmQAAlUSoCiSaXk2I8ESIAESIAESIAESIAESIAESIAESKCuCVA0qev0cnEkQAIkQAIkQAIkQAIkQAIkQAIkQAKVEqBoUik59iMBEiABEiABEiABEiABEiABEiABEqhrAhRN6jq9XBwJkAAJkAAJkAAJkAAJkAAJkAAJkEClBCiaVEqO/UiABEiABEiABEiABEiABEiABEiABOqawP8H/UWU8YDGt0gAAAAASUVORK5CYII=", + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Визуализация расписания средствами SAMPO (диаграмма Гантта)\n", + "schedule_fig = schedule_gant_chart_fig(schedule_dataframe=project_schedule,\n", + " visualization=VisualizationMode.ShowFig, # еще есть ReturnFig и SaveFig\n", + " remove_service_tasks=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "q-1txbxEIfPP" + }, + "source": [ + "## **2. Инициализация и настройка алгоритмов планирования**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1HbEMmTDTuEo" + }, + "source": [ + "### **2.1 Использование пользовательских моделей оценки времени и ресурсов** (WorkTimeEstimator - based)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BlcT4Bm_SWkv" + }, + "source": [ + "Если в проекте определена модель, реализующая интерфейс WorkTimeEstimator - мы будем передавать ее ВО ВСЕ ПЛАНИРОВЩИКИ при инициализации.\n", + "\n", + "NB! Мы передаем один объект WorkTimeEstimator в качестве параметра `work_estimator`. Он же будет и ресурсным - у нас теперь совместные модели" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "vDC5_pEfJoBX", + "ExecuteTime": { + "end_time": "2024-07-08T09:11:38.385446Z", + "start_time": "2024-07-08T09:11:38.367757Z" + } + }, + "source": [ + "project_work_estimator = FieldDevWorkEstimator() # object_of_the_class_that_implements_the_interface_WorkTimeEstimator\n", + "# work_estimator = AeroplaneWorkDefectEstimator(path='saved_models') # пример задания" + ], + "outputs": [], + "execution_count": 7 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mNogToIJTlHY" + }, + "source": [ + "### **2.2 Инициализация эвристических и мета-эвристических планировщиков**\n", + "\n", + "У них нет настраиваемых гиперпараметров" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "Jed_DXAb1Te8" + }, + "outputs": [], + "source": [ + "# Инициализация и настройка эвристических алгоритмов планирования\n", + "# topo_scheduler = TopologicalScheduler()\n", + "topo_scheduler = TopologicalScheduler(work_estimator=project_work_estimator) # если задан project_work_estimator\n", + "\n", + "# rand_topo_scheduler = RandomizedTopologicalScheduler()\n", + "rand_topo_scheduler = RandomizedTopologicalScheduler(work_estimator=project_work_estimator) # если задан project_work_estimator\n", + "\n", + "# Инициализация и настройка мета-эвристических алгоритмов планирования\n", + "# heft_scheduler = HEFTScheduler()\n", + "heft_scheduler = HEFTScheduler(work_estimator=project_work_estimator) # если задан project_work_estimator\n", + "\n", + "# heft_between_scheduler = HEFTBetweenScheduler()\n", + "heft_between_scheduler = HEFTBetweenScheduler(work_estimator=project_work_estimator) # если задан project_work_estimator" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OGzUhOXMLrYn" + }, + "source": [ + "### **2.3 Инициализация и настройка параметров генетического алгоритма**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m_O0eqOoRfvP" + }, + "source": [ + "Для настройки параметров генетики предлагаем использовать следующие значения" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "AKJxCa1_LoiW" + }, + "outputs": [], + "source": [ + "# ЕСЛИ НЕ СТОИТ ГАЛОЧКА АВТОПОДБОРА КОЛИЧЕСТВА ПОКОЛЕНИЙ\n", + "custom_number_of_generation = 20 # количество поколений задается пользователем на фронте (поле \"Количество поколений\"), по умолчанию 20\n", + "custom_mutate_order = np.round(np.random.default_rng().choice(np.linspace(0.05, 0.15, 11)), 2) # генерируем случайно из заданного диапазона\n", + "custom_mutate_resources = np.round(np.random.default_rng().choice(np.linspace(0.005, 0.015, 11)), 3) # генерируем случайно из заданного диапазона\n", + "custom_size_of_population = 50 # заданная константа" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Z0H33kd_RcAX", + "ExecuteTime": { + "end_time": "2024-07-08T09:11:42.921767Z", + "start_time": "2024-07-08T09:11:42.906779Z" + } + }, + "source": [ + "# ЕСЛИ СТОИТ ГАЛОЧКА АВТОПОДБОРА КОЛИЧЕСТВА ПОКОЛЕНИЙ.\n", + "custom_number_of_generation = np.random.randint(10, 25) # генерируем его случайно равномерно из интервала 10-25\n", + "custom_mutate_order = 0.05 # заданная константа\n", + "custom_mutate_resources = 0.005 # заданная константа\n", + "custom_size_of_population = 50 # заданная константа" + ], + "outputs": [], + "execution_count": 8 + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BNx7zbaQRpGP", + "outputId": "9d6cd05d-2299-4dd1-e6c3-96d5188a9d35", + "ExecuteTime": { + "end_time": "2024-07-08T09:11:43.655905Z", + "start_time": "2024-07-08T09:11:43.640916Z" + } + }, + "source": [ + "# Для проверки\n", + "custom_number_of_generation, custom_mutate_order, custom_mutate_resources, custom_size_of_population" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "(15, 0.05, 0.005, 50)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 9 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UMOto0uRRimL" + }, + "source": [ + "Инициализируем генетический планировщик выбранными значениями гиперпараметров" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "TbqG8xhCRamY", + "ExecuteTime": { + "end_time": "2024-07-08T09:11:45.894389Z", + "start_time": "2024-07-08T09:11:45.881325Z" + } + }, + "source": [ + "# Инициализация и настройка генетического алгоритма планирования\n", + "# genetic_scheduler = GeneticScheduler(number_of_generation=custom_number_of_generation,\n", + "# mutate_order=custom_mutate_order,\n", + "# mutate_resources=custom_mutate_resources,\n", + "# size_of_population=custom_size_of_population)\n", + "\n", + "\n", + "# Если используется пользовательский WorkTimeEstimator, то передаем его в планировщик\n", + "genetic_scheduler_with_estimator = GeneticScheduler(number_of_generation=10,\n", + " mutate_order=custom_mutate_order,\n", + " mutate_resources=custom_mutate_resources,\n", + " size_of_population=custom_size_of_population,\n", + " work_estimator=project_work_estimator) # не забыть передать сюда, если используется отличный от дефолтного" + ], + "outputs": [], + "execution_count": 10 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mjj-4lxtJmoQ" + }, + "source": [ + "## **3. Планирование проекта (построение расписания)**\n", + "\n", + "На этом этапе у нас должны быть подготовлены:\n", + "* DataFrame со структурой графа работ (сконвертирован из объекта WorkGraph, полученного при десериализации);\n", + "* массив подрядчиков (Сontractors), созданный по графу работ;\n", + "* инициализирован нужный планировщик;\n", + "* есть DataFrame с историческими данными.\n", + "\n", + "Все остальные настройки будем передавать сразу в пайплайн." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hSAr5qevZO3g" + }, + "source": [ + "### **3.1 Настройка пайплайна планирования**" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "LcgKDB4u1Tif", + "ExecuteTime": { + "end_time": "2024-07-08T09:11:48.545608Z", + "start_time": "2024-07-08T09:11:48.533611Z" + } + }, + "source": [ + "# Создание основы пайплайна планирования\n", + "scheduling_pipeline = SchedulingPipeline.create()" + ], + "outputs": [], + "execution_count": 11 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eaMOMz9StAtR" + }, + "source": [ + "#### **3.1.1 Восстановление структуры графа и параметров связей по историческим данным**\n", + "\n", + "На этом этапе обрабатываются значения полей \"Восстановление связей между работами\" и \"Исправлять связи между работами\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "a11omiwJthcB" + }, + "source": [ + "Поле **\"Восстановление связей между работами\"**\n", + "* Галочка в поле (значение True) соответствует значению параметра `all_connections=False`.\n", + "* Отсутствие галочки в поле (значение False) соответствует значению параметра `all_connections=True`.\n", + "\n", + "Поле **\"Исправлять связи между работами\"**\n", + "* Галочка в поле (значение True) соответствует значению параметра `change_connections_info=True`.\n", + "* Отсутствие галочки в поле (значение False) соответствует значению параметра `change_connections_info=False`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6GY29Ly6sXXI", + "ExecuteTime": { + "end_time": "2024-07-08T09:12:10.352015Z", + "start_time": "2024-07-08T09:12:10.344829Z" + } + }, + "source": [ + "# Передаем информацию о структуре графа работ (в виде pandas.DataFrame, см. выше как сконвертировать из WG)\n", + "# и значения параметров восстановления структуры по историческим данным, описанные выше\n", + "scheduling_pipeline = scheduling_pipeline.wg(wg=df,\n", + " all_connections=False,\n", + " change_connections_info=True) # этот случай, когда структура графа полностью задана и менять типы связей не нужно" + ], + "outputs": [], + "execution_count": 14 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3d1thisRzBvS" + }, + "source": [ + "#### **3.1.2 Передача информации о подрядчиках**\n", + "\n", + "Если отдельно была подготовлена информация о подрядчиках по графу (см. 1.2.1) - тогда передаем их.\n", + "\n", + "Если не передать - будут сгенерированы автоматически, но с некрасивыми именами (так что лучше воспользоваться простым треком генерации из 1.2.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 192 + }, + "id": "atje4_O9zl99", + "outputId": "8d49e6f3-0796-490e-9a8b-a9b290e4d3c8" + }, + "outputs": [], + "source": [ + "# Передаем список подрядчиков в пайплайн\n", + "# scheduling_pipeline = scheduling_pipeline.contractors(project_contractors)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ugxh6Xqkv8dx" + }, + "source": [ + "#### **3.1.3 Передача информации из истории**\n", + "\n", + "Информация из истории проектов нужна для восстановления структуры связей и корректировки их типов и сдвигов относительно начала работ (lag-ов). Она необходима для трех вариантов комбинаций указанных выше параметров `is_wg_has_full_info_about_connections` и `change_base_on_history`, отличных от приведенного в примере в предыдущей ячейке (т.е. для `False-False`, `False-True` и `True-True`.\n", + "\n", + "\n", + "Исторические данные должны быть загружены (локально/из БД) в виде DataFrame со следующей структурой:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UcjqSw5Nw8zo" + }, + "source": [ + "![image.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 293 + }, + "id": "q3h10JoFxEQx", + "outputId": "1f5903b6-263b-4905-babb-d4032ee4f22d", + "ExecuteTime": { + "end_time": "2024-07-08T09:12:14.648565Z", + "start_time": "2024-07-08T09:12:14.434900Z" + } + }, + "source": [ + "history_df = pd.read_csv('historical_projects_data.csv', sep=';')\n", + "history_df.head()" + ], + "outputs": [ + { + "data": { + "text/plain": [ + " work_id work_name \\\n", + "0 0 Статические испытания свай \n", + "1 1 Изготовление свай 325х8 \n", + "2 2 Изготовление свай 325х8 \n", + "3 3 Антикоррозионное покрытие свай покрытием \"Армо... \n", + "4 4 Антикоррозионное покрытие свай покрытием \"Армо... \n", + "\n", + " granular_name first_day last_day \\\n", + "0 Статическое испытание свай 2014-06-16 2014-06-16 \n", + "1 Изготовление свай 2014-05-08 2014-05-28 \n", + "2 Изготовление свай 2014-07-01 2014-07-30 \n", + "3 Покрытие, прочие 2014-05-11 2014-05-28 \n", + "4 Покрытие, прочие 2014-07-01 2014-07-30 \n", + "\n", + " upper_works \n", + "0 ('Приемо-сдаточный пункт', 'Резервуар товарной... \n", + "1 ('Приемо-сдаточный пункт', 'Резервуар товарной... \n", + "2 ('Приемо-сдаточный пункт', 'Резервуар товарной... \n", + "3 ('Приемо-сдаточный пункт', 'Резервуар товарной... \n", + "4 ('Приемо-сдаточный пункт', 'Резервуар товарной... " + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
work_idwork_namegranular_namefirst_daylast_dayupper_works
00Статические испытания свайСтатическое испытание свай2014-06-162014-06-16('Приемо-сдаточный пункт', 'Резервуар товарной...
11Изготовление свай 325х8Изготовление свай2014-05-082014-05-28('Приемо-сдаточный пункт', 'Резервуар товарной...
22Изготовление свай 325х8Изготовление свай2014-07-012014-07-30('Приемо-сдаточный пункт', 'Резервуар товарной...
33Антикоррозионное покрытие свай покрытием \"Армо...Покрытие, прочие2014-05-112014-05-28('Приемо-сдаточный пункт', 'Резервуар товарной...
44Антикоррозионное покрытие свай покрытием \"Армо...Покрытие, прочие2014-07-012014-07-30('Приемо-сдаточный пункт', 'Резервуар товарной...
\n", + "
" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 15 + }, + { + "cell_type": "code", + "metadata": { + "id": "fjlQ6u9p-dqK", + "ExecuteTime": { + "end_time": "2024-07-08T09:12:16.004626Z", + "start_time": "2024-07-08T09:12:15.988565Z" + } + }, + "source": [ + "# Передаем в пайплайн загруженный DataFrame (разделитель по умолчанию - ',')\n", + "scheduling_pipeline = scheduling_pipeline.history(history_df, sep=';')" + ], + "outputs": [], + "execution_count": 16 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MKa1cCt5-ybb" + }, + "source": [ + "#### **3.1.4 Реструктуризация графа**\n", + "\n", + "Реструктуризация параллельного выполнения работ нужна для учета связей FFS и временных лагов в структуре задач проекта.\n", + "\n", + "В рамках СППР используются два (из четырех) возможных значения LagOptimizationStrategy:\n", + "* LagOptimizationStrategy.TRUE - если стоит галочка в интерфейсе ниже\n", + "* LagOptimizationStrategy.FALSE - если не стоит галочка в интерфейсе ниже" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0KTAjS_TuSiA" + }, + "source": [ + "**NB!** Если не пердавать в пайплайн явно значение LagOptimizationStrategy, то по умолчанию будет стоять значение LagOptimizationStrategy.NONE, что отрицательно скажется на результате в рамках данного кейса" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6jf-xUCJ_J6J", + "ExecuteTime": { + "end_time": "2024-07-08T09:12:20.758526Z", + "start_time": "2024-07-08T09:12:20.740574Z" + } + }, + "source": [ + "# Передаем в пайплайн значение LagOptimizationStrategy (TRUE или FALSE) - обязательный этап, не работает по дефолту\n", + "scheduling_pipeline = scheduling_pipeline.lag_optimize(LagOptimizationStrategy.TRUE)" + ], + "outputs": [], + "execution_count": 17 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SS4p_teI_Q3S" + }, + "source": [ + "#### **3.1.5 WorkTimeEstimator**" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DzlEra7ws6D_", + "ExecuteTime": { + "end_time": "2024-07-08T09:12:23.869857Z", + "start_time": "2024-07-08T09:12:23.854867Z" + } + }, + "source": [ + "# Если мы работаем с WorkTimeEstimator, отличным от дефолтного - мы передаем его еще сюда (помимо инициализации планировщика)\n", + "scheduling_pipeline = scheduling_pipeline.work_estimator(project_work_estimator)" + ], + "outputs": [], + "execution_count": 18 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2rC4UinF_WmC" + }, + "source": [ + "#### **3.1.6 Построение расписания**" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WbnN69Qr_81y", + "ExecuteTime": { + "end_time": "2024-07-08T09:20:36.715560Z", + "start_time": "2024-07-08T09:20:26.295476Z" + } + }, + "source": [ + "# Запускаем планирование и после .finish() получаем объект ScheduleProject\n", + "scheduling_project = scheduling_pipeline.schedule(genetic_scheduler_with_estimator).finish()[0]" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Genetic optimizing took 25.930404663085938 ms\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[1;31mKeyboardInterrupt\u001B[0m Traceback (most recent call last)", + "Cell \u001B[1;32mIn[26], line 2\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[38;5;66;03m# Запускаем планирование и после .finish() получаем объект ScheduleProject\u001B[39;00m\n\u001B[1;32m----> 2\u001B[0m scheduling_project \u001B[38;5;241m=\u001B[39m \u001B[43mscheduling_pipeline\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mschedule\u001B[49m\u001B[43m(\u001B[49m\u001B[43mgenetic_scheduler_with_estimator\u001B[49m\u001B[43m)\u001B[49m\u001B[38;5;241m.\u001B[39mfinish()[\u001B[38;5;241m0\u001B[39m]\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\pipeline\\default.py:272\u001B[0m, in \u001B[0;36mDefaultInputPipeline.schedule\u001B[1;34m(self, scheduler)\u001B[0m\n\u001B[0;32m 270\u001B[0m \u001B[38;5;28;01mcase\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01m_\u001B[39;00m:\n\u001B[0;32m 271\u001B[0m wg \u001B[38;5;241m=\u001B[39m graph_restructuring(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_wg, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_lag_optimize\u001B[38;5;241m.\u001B[39mvalue)\n\u001B[1;32m--> 272\u001B[0m schedules \u001B[38;5;241m=\u001B[39m \u001B[43mscheduler\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mschedule_with_cache\u001B[49m\u001B[43m(\u001B[49m\u001B[43mwg\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_contractors\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 273\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_spec\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 274\u001B[0m \u001B[43m \u001B[49m\u001B[43mlandscape\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_landscape_config\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 275\u001B[0m \u001B[43m \u001B[49m\u001B[43massigned_parent_time\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_assigned_parent_time\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 276\u001B[0m node_orders \u001B[38;5;241m=\u001B[39m [node_order \u001B[38;5;28;01mfor\u001B[39;00m _, _, _, node_order \u001B[38;5;129;01min\u001B[39;00m schedules]\n\u001B[0;32m 277\u001B[0m schedules \u001B[38;5;241m=\u001B[39m [schedule \u001B[38;5;28;01mfor\u001B[39;00m schedule, _, _, _ \u001B[38;5;129;01min\u001B[39;00m schedules]\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\genetic\\base.py:270\u001B[0m, in \u001B[0;36mGeneticScheduler.schedule_with_cache\u001B[1;34m(self, wg, contractors, spec, validate, assigned_parent_time, timeline, landscape)\u001B[0m\n\u001B[0;32m 267\u001B[0m mutate_order, mutate_resources, mutate_zones, size_of_population \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mget_params(wg\u001B[38;5;241m.\u001B[39mvertex_count)\n\u001B[0;32m 268\u001B[0m deadline \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_optimize_resources \u001B[38;5;28;01melse\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_deadline\n\u001B[1;32m--> 270\u001B[0m schedules \u001B[38;5;241m=\u001B[39m \u001B[43mbuild_schedules\u001B[49m\u001B[43m(\u001B[49m\u001B[43mwg\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 271\u001B[0m \u001B[43m \u001B[49m\u001B[43mcontractors\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 272\u001B[0m \u001B[43m \u001B[49m\u001B[43msize_of_population\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 273\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mnumber_of_generation\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 274\u001B[0m \u001B[43m \u001B[49m\u001B[43mmutate_order\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 275\u001B[0m \u001B[43m \u001B[49m\u001B[43mmutate_resources\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 276\u001B[0m \u001B[43m \u001B[49m\u001B[43mmutate_zones\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 277\u001B[0m \u001B[43m \u001B[49m\u001B[43minit_schedules\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 278\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrand\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 279\u001B[0m \u001B[43m \u001B[49m\u001B[43mspec\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 280\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_weights\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 281\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m,\u001B[49m\n\u001B[0;32m 282\u001B[0m \u001B[43m \u001B[49m\u001B[43mlandscape\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 283\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfitness_constructor\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 284\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfitness_weights\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 285\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mwork_estimator\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 286\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msgs_type\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 287\u001B[0m \u001B[43m \u001B[49m\u001B[43massigned_parent_time\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 288\u001B[0m \u001B[43m \u001B[49m\u001B[43mtimeline\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 289\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_time_border\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 290\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_max_plateau_steps\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 291\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_optimize_resources\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 292\u001B[0m \u001B[43m \u001B[49m\u001B[43mdeadline\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 293\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_only_lft_initialization\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 294\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_is_multiobjective\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 295\u001B[0m schedules \u001B[38;5;241m=\u001B[39m [\n\u001B[0;32m 296\u001B[0m (Schedule\u001B[38;5;241m.\u001B[39mfrom_scheduled_works(scheduled_works\u001B[38;5;241m.\u001B[39mvalues(), wg), schedule_start_time, timeline, order_nodes)\n\u001B[0;32m 297\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m scheduled_works, schedule_start_time, timeline, order_nodes \u001B[38;5;129;01min\u001B[39;00m schedules]\n\u001B[0;32m 299\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m validate:\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\genetic\\schedule_builder.py:115\u001B[0m, in \u001B[0;36mbuild_schedules\u001B[1;34m(wg, contractors, population_size, generation_number, mutpb_order, mutpb_res, mutpb_zones, init_schedules, rand, spec, weights, pop, landscape, fitness_object, fitness_weights, work_estimator, sgs_type, assigned_parent_time, timeline, time_border, max_plateau_steps, optimize_resources, deadline, only_lft_initialization, is_multiobjective)\u001B[0m\n\u001B[0;32m 89\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mbuild_schedules\u001B[39m(wg: WorkGraph,\n\u001B[0;32m 90\u001B[0m contractors: \u001B[38;5;28mlist\u001B[39m[Contractor],\n\u001B[0;32m 91\u001B[0m population_size: \u001B[38;5;28mint\u001B[39m,\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 113\u001B[0m is_multiobjective: \u001B[38;5;28mbool\u001B[39m \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mFalse\u001B[39;00m) \\\n\u001B[0;32m 114\u001B[0m \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28mlist\u001B[39m[\u001B[38;5;28mtuple\u001B[39m[ScheduleWorkDict, Time, Timeline, \u001B[38;5;28mlist\u001B[39m[GraphNode]]]:\n\u001B[1;32m--> 115\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mbuild_schedules_with_cache\u001B[49m\u001B[43m(\u001B[49m\u001B[43mwg\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcontractors\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mpopulation_size\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mgeneration_number\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 116\u001B[0m \u001B[43m \u001B[49m\u001B[43mmutpb_order\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mmutpb_res\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mmutpb_zones\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43minit_schedules\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 117\u001B[0m \u001B[43m \u001B[49m\u001B[43mrand\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mspec\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mweights\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mpop\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mlandscape\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mfitness_object\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 118\u001B[0m \u001B[43m \u001B[49m\u001B[43mfitness_weights\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mwork_estimator\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43msgs_type\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43massigned_parent_time\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 119\u001B[0m \u001B[43m \u001B[49m\u001B[43mtimeline\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mtime_border\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mmax_plateau_steps\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43moptimize_resources\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 120\u001B[0m \u001B[43m \u001B[49m\u001B[43mdeadline\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43monly_lft_initialization\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mis_multiobjective\u001B[49m\u001B[43m)\u001B[49m[\u001B[38;5;241m0\u001B[39m]\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\genetic\\schedule_builder.py:197\u001B[0m, in \u001B[0;36mbuild_schedules_with_cache\u001B[1;34m(wg, contractors, population_size, generation_number, mutpb_order, mutpb_res, mutpb_zones, init_schedules, rand, spec, weights, pop, landscape, fitness_object, fitness_weights, work_estimator, sgs_type, assigned_parent_time, timeline, time_border, max_plateau_steps, optimize_resources, deadline, only_lft_initialization, is_multiobjective)\u001B[0m\n\u001B[0;32m 194\u001B[0m hof \u001B[38;5;241m=\u001B[39m tools\u001B[38;5;241m.\u001B[39mParetoFront(similar\u001B[38;5;241m=\u001B[39mcompare_individuals)\n\u001B[0;32m 196\u001B[0m \u001B[38;5;66;03m# map to each individual fitness function\u001B[39;00m\n\u001B[1;32m--> 197\u001B[0m fitness \u001B[38;5;241m=\u001B[39m \u001B[43mSAMPO\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mbackend\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mcompute_chromosomes\u001B[49m\u001B[43m(\u001B[49m\u001B[43mfitness_f\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mpop\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 199\u001B[0m evaluation_time \u001B[38;5;241m=\u001B[39m time\u001B[38;5;241m.\u001B[39mtime() \u001B[38;5;241m-\u001B[39m evaluation_start\n\u001B[0;32m 201\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m ind, fit \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mzip\u001B[39m(pop, fitness):\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\backend\\default.py:95\u001B[0m, in \u001B[0;36mDefaultComputationalBackend.compute_chromosomes\u001B[1;34m(self, fitness, chromosomes)\u001B[0m\n\u001B[0;32m 91\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mcompute_chromosomes\u001B[39m(\u001B[38;5;28mself\u001B[39m,\n\u001B[0;32m 92\u001B[0m fitness: FitnessFunction,\n\u001B[0;32m 93\u001B[0m chromosomes: \u001B[38;5;28mlist\u001B[39m[ChromosomeType]) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28mlist\u001B[39m[\u001B[38;5;28mtuple\u001B[39m[\u001B[38;5;28mint\u001B[39m \u001B[38;5;241m|\u001B[39m \u001B[38;5;28mfloat\u001B[39m]]:\n\u001B[0;32m 94\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_ensure_toolbox_created()\n\u001B[1;32m---> 95\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m [fitness\u001B[38;5;241m.\u001B[39mevaluate(chromosome, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_toolbox\u001B[38;5;241m.\u001B[39mevaluate_chromosome) \u001B[38;5;28;01mfor\u001B[39;00m chromosome \u001B[38;5;129;01min\u001B[39;00m chromosomes]\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\backend\\default.py:95\u001B[0m, in \u001B[0;36m\u001B[1;34m(.0)\u001B[0m\n\u001B[0;32m 91\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mcompute_chromosomes\u001B[39m(\u001B[38;5;28mself\u001B[39m,\n\u001B[0;32m 92\u001B[0m fitness: FitnessFunction,\n\u001B[0;32m 93\u001B[0m chromosomes: \u001B[38;5;28mlist\u001B[39m[ChromosomeType]) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28mlist\u001B[39m[\u001B[38;5;28mtuple\u001B[39m[\u001B[38;5;28mint\u001B[39m \u001B[38;5;241m|\u001B[39m \u001B[38;5;28mfloat\u001B[39m]]:\n\u001B[0;32m 94\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_ensure_toolbox_created()\n\u001B[1;32m---> 95\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m [\u001B[43mfitness\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mevaluate\u001B[49m\u001B[43m(\u001B[49m\u001B[43mchromosome\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_toolbox\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mevaluate_chromosome\u001B[49m\u001B[43m)\u001B[49m \u001B[38;5;28;01mfor\u001B[39;00m chromosome \u001B[38;5;129;01min\u001B[39;00m chromosomes]\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\genetic\\operators.py:34\u001B[0m, in \u001B[0;36mTimeFitness.evaluate\u001B[1;34m(self, chromosome, evaluator)\u001B[0m\n\u001B[0;32m 32\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mevaluate\u001B[39m(\u001B[38;5;28mself\u001B[39m, chromosome: ChromosomeType, evaluator: Callable[[ChromosomeType], Schedule]) \\\n\u001B[0;32m 33\u001B[0m \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28mtuple\u001B[39m[\u001B[38;5;28mint\u001B[39m \u001B[38;5;241m|\u001B[39m \u001B[38;5;28mfloat\u001B[39m]:\n\u001B[1;32m---> 34\u001B[0m schedule \u001B[38;5;241m=\u001B[39m \u001B[43mevaluator\u001B[49m\u001B[43m(\u001B[49m\u001B[43mchromosome\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 35\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m schedule \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m 36\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m (Time\u001B[38;5;241m.\u001B[39minf()\u001B[38;5;241m.\u001B[39mvalue, )\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\genetic\\operators.py:238\u001B[0m, in \u001B[0;36mevaluate\u001B[1;34m(chromosome, wg, toolbox)\u001B[0m\n\u001B[0;32m 236\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mevaluate\u001B[39m(chromosome: ChromosomeType, wg: WorkGraph, toolbox: Toolbox) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m Schedule \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m 237\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m toolbox\u001B[38;5;241m.\u001B[39mvalidate(chromosome):\n\u001B[1;32m--> 238\u001B[0m sworks \u001B[38;5;241m=\u001B[39m \u001B[43mtoolbox\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mchromosome_to_schedule\u001B[49m\u001B[43m(\u001B[49m\u001B[43mchromosome\u001B[49m\u001B[43m)\u001B[49m[\u001B[38;5;241m0\u001B[39m]\n\u001B[0;32m 239\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m Schedule\u001B[38;5;241m.\u001B[39mfrom_scheduled_works(sworks\u001B[38;5;241m.\u001B[39mvalues(), wg)\n\u001B[0;32m 240\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\genetic\\converter.py:101\u001B[0m, in \u001B[0;36mconvert_chromosome_to_schedule\u001B[1;34m(chromosome, worker_pool, index2node, index2contractor, index2zone, worker_pool_indices, worker_name2index, contractor2index, landscape, timeline, assigned_parent_time, work_estimator, sgs_type)\u001B[0m\n\u001B[0;32m 99\u001B[0m \u001B[38;5;28;01mcase\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01m_\u001B[39;00m:\n\u001B[0;32m 100\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mUnknown type of schedule generation scheme\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m--> 101\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mconverter\u001B[49m\u001B[43m(\u001B[49m\u001B[43mchromosome\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 102\u001B[0m \u001B[43m \u001B[49m\u001B[43mworker_pool\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 103\u001B[0m \u001B[43m \u001B[49m\u001B[43mindex2node\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 104\u001B[0m \u001B[43m \u001B[49m\u001B[43mindex2contractor\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 105\u001B[0m \u001B[43m \u001B[49m\u001B[43mindex2zone\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 106\u001B[0m \u001B[43m \u001B[49m\u001B[43mworker_pool_indices\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 107\u001B[0m \u001B[43m \u001B[49m\u001B[43mworker_name2index\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 108\u001B[0m \u001B[43m \u001B[49m\u001B[43mcontractor2index\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 109\u001B[0m \u001B[43m \u001B[49m\u001B[43mlandscape\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 110\u001B[0m \u001B[43m \u001B[49m\u001B[43mtimeline\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 111\u001B[0m \u001B[43m \u001B[49m\u001B[43massigned_parent_time\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 112\u001B[0m \u001B[43m \u001B[49m\u001B[43mwork_estimator\u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\genetic\\converter.py:222\u001B[0m, in \u001B[0;36mparallel_schedule_generation_scheme\u001B[1;34m(chromosome, worker_pool, index2node, index2contractor, index2zone, worker_pool_indices, worker_name2index, contractor2index, landscape, timeline, assigned_parent_time, work_estimator)\u001B[0m\n\u001B[0;32m 219\u001B[0m start_time \u001B[38;5;241m+\u001B[39m\u001B[38;5;241m=\u001B[39m \u001B[38;5;241m1\u001B[39m\n\u001B[0;32m 221\u001B[0m \u001B[38;5;66;03m# find all works that can start at start_time moment and remove it if scheduled\u001B[39;00m\n\u001B[1;32m--> 222\u001B[0m \u001B[43menumerated_works_remaining\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mremove_if\u001B[49m\u001B[43m(\u001B[49m\u001B[43mwork_scheduled\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 223\u001B[0m ckpt_idx \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mmin\u001B[39m(ckpt_idx \u001B[38;5;241m+\u001B[39m \u001B[38;5;241m1\u001B[39m, \u001B[38;5;28mlen\u001B[39m(work_timeline))\n\u001B[0;32m 225\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m node2swork, assigned_parent_time, timeline, order_nodes\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\utilities\\linked_list.py:77\u001B[0m, in \u001B[0;36mLinkedList.remove_if\u001B[1;34m(self, condition)\u001B[0m\n\u001B[0;32m 75\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m it\u001B[38;5;241m.\u001B[39mhas_next():\n\u001B[0;32m 76\u001B[0m v \u001B[38;5;241m=\u001B[39m it\u001B[38;5;241m.\u001B[39mget()\n\u001B[1;32m---> 77\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[43mcondition\u001B[49m\u001B[43m(\u001B[49m\u001B[43mv\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mvalue\u001B[49m\u001B[43m)\u001B[49m:\n\u001B[0;32m 78\u001B[0m it\u001B[38;5;241m.\u001B[39mremove()\n\u001B[0;32m 79\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\genetic\\converter.py:197\u001B[0m, in \u001B[0;36mparallel_schedule_generation_scheme..work_scheduled\u001B[1;34m(args)\u001B[0m\n\u001B[0;32m 194\u001B[0m st \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mmax\u001B[39m(start_time, finish_time)\n\u001B[0;32m 196\u001B[0m \u001B[38;5;66;03m# finish using time spec\u001B[39;00m\n\u001B[1;32m--> 197\u001B[0m \u001B[43mtimeline\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mschedule\u001B[49m\u001B[43m(\u001B[49m\u001B[43mnode\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mnode2swork\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mworker_team\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcontractor\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mwork_spec\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 198\u001B[0m \u001B[43m \u001B[49m\u001B[43mst\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mexec_time\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43massigned_parent_time\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mwork_estimator\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 200\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m idx \u001B[38;5;241m==\u001B[39m \u001B[38;5;28mlen\u001B[39m(works_order) \u001B[38;5;241m-\u001B[39m \u001B[38;5;241m1\u001B[39m: \u001B[38;5;66;03m# we are scheduling the work `end of the project`\u001B[39;00m\n\u001B[0;32m 201\u001B[0m node2swork[node]\u001B[38;5;241m.\u001B[39mzones_pre \u001B[38;5;241m=\u001B[39m finalizing_zones\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\timeline\\just_in_time_timeline.py:254\u001B[0m, in \u001B[0;36mJustInTimeTimeline.schedule\u001B[1;34m(self, node, node2swork, workers, contractor, spec, assigned_start_time, assigned_time, assigned_parent_time, work_estimator)\u001B[0m\n\u001B[0;32m 251\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m assigned_time \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m 252\u001B[0m exec_times \u001B[38;5;241m=\u001B[39m {n: (Time(\u001B[38;5;241m0\u001B[39m), assigned_time \u001B[38;5;241m/\u001B[39m\u001B[38;5;241m/\u001B[39m \u001B[38;5;28mlen\u001B[39m(inseparable_chain))\n\u001B[0;32m 253\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m n \u001B[38;5;129;01min\u001B[39;00m inseparable_chain}\n\u001B[1;32m--> 254\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_schedule_with_inseparables\u001B[49m\u001B[43m(\u001B[49m\u001B[43mnode\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mnode2swork\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mworkers\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcontractor\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mspec\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 255\u001B[0m \u001B[43m \u001B[49m\u001B[43minseparable_chain\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mstart_time\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mexec_times\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mwork_estimator\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 256\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m 257\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_schedule_with_inseparables(node, node2swork, workers, contractor, spec,\n\u001B[0;32m 258\u001B[0m inseparable_chain, start_time, {}, work_estimator)\n", + "File \u001B[1;32m~\\PycharmProjects\\SAMPO\\sampo\\scheduler\\timeline\\just_in_time_timeline.py:307\u001B[0m, in \u001B[0;36mJustInTimeTimeline._schedule_with_inseparables\u001B[1;34m(self, node, node2swork, workers, contractor, spec, inseparable_chain, start_time, exec_times, work_estimator)\u001B[0m\n\u001B[0;32m 302\u001B[0m c_st \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mmax\u001B[39m(c_ft \u001B[38;5;241m+\u001B[39m lag, max_parent_time)\n\u001B[0;32m 304\u001B[0m deliveries, mat_del_time \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_material_timeline\u001B[38;5;241m.\u001B[39mdeliver_resources(dep_node,\n\u001B[0;32m 305\u001B[0m c_st,\n\u001B[0;32m 306\u001B[0m dep_node\u001B[38;5;241m.\u001B[39mwork_unit\u001B[38;5;241m.\u001B[39mneed_materials())\n\u001B[1;32m--> 307\u001B[0m c_st \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mmax\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43mmat_del_time\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mc_st\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 309\u001B[0m new_finish_time \u001B[38;5;241m=\u001B[39m c_st \u001B[38;5;241m+\u001B[39m working_time\n\u001B[0;32m 311\u001B[0m node2swork[dep_node] \u001B[38;5;241m=\u001B[39m ScheduledWork(work_unit\u001B[38;5;241m=\u001B[39mdep_node\u001B[38;5;241m.\u001B[39mwork_unit,\n\u001B[0;32m 312\u001B[0m start_end_time\u001B[38;5;241m=\u001B[39m(c_st, new_finish_time),\n\u001B[0;32m 313\u001B[0m workers\u001B[38;5;241m=\u001B[39mworkers,\n\u001B[0;32m 314\u001B[0m contractor\u001B[38;5;241m=\u001B[39mcontractor,\n\u001B[0;32m 315\u001B[0m materials\u001B[38;5;241m=\u001B[39mdeliveries)\n", + "\u001B[1;31mKeyboardInterrupt\u001B[0m: " + ] + } + ], + "execution_count": 26 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-08T09:20:46.421223Z", + "start_time": "2024-07-08T09:20:46.406268Z" + } + }, + "cell_type": "code", + "source": "scheduling_project.schedule.pure_schedule_df", + "outputs": [ + { + "data": { + "text/plain": [ + " idx task_id task_name \\\n", + "1 1 200 Бурение лидерных скважин \n", + "2 2 203 Монтаж ростверков и опорных конструкций под по... \n", + "3 3 207 Подвеска грозозащитного троса \n", + "4 4 205 Установка опор/порталов \n", + "5 5 209 Укладка активного соляного заземления \n", + "6 6 202 Монтаж оголовников \n", + "7 7 206 Подвеска провода \n", + "8 8 208 Укладка полосового заземления \n", + "9 9 201 Установка в скважины свай \n", + "11 11 204 Сборка опор/порталов \n", + "\n", + " task_name_mapped contractor cost \\\n", + "1 Бурение лидерных скважин Contractor 1 0 \n", + "2 Монтаж ростверков и опорных конструкций под по... Contractor 1 270 \n", + "3 Подвеска грозозащитного троса Contractor 1 0 \n", + "4 Установка опор/порталов Contractor 1 230 \n", + "5 Укладка активного соляного заземления Contractor 1 820 \n", + "6 Монтаж оголовков Contractor 1 0 \n", + "7 Подвеска провода Contractor 1 0 \n", + "8 Укладка полосового заземления Contractor 1 80 \n", + "9 Установка в скважины свай Contractor 1 200 \n", + "11 Сборка опор/порталов Contractor 1 0 \n", + "\n", + " volume measurement start finish duration \\\n", + "1 25.0 шт 0 0 0 \n", + "2 4.0 шт 0 1 1 \n", + "3 160.0 м 0 0 0 \n", + "4 2.0 шт 0 1 1 \n", + "5 35.6 шт 1 3 2 \n", + "6 14.0 шт 3 3 0 \n", + "7 200.0 м 3 3 0 \n", + "8 24.0 м 3 4 1 \n", + "9 18.0 шт 3 4 1 \n", + "11 2.0 шт 4 4 0 \n", + "\n", + " workers \n", + "1 {'Бурильная машина': 2, 'Бурильщик, помощник б... \n", + "2 {'Автокран': 2, 'Геодезист': 2, 'ИТР (инженерн... \n", + "3 {'Автокран': 2, 'ИТР (инженерно-технический пе... \n", + "4 {'Автокран': 1, 'ИТР (инженерно-технический пе... \n", + "5 {'АПС (агрегат передвижной сварочный)': 3, 'Ав... \n", + "6 {'АПС (агрегат передвижной сварочный)': 3, 'ИТ... \n", + "7 {'Автокран': 2, 'ИТР (инженерно-технический пе... \n", + "8 {'АПС (агрегат передвижной сварочный)': 1, 'Бу... \n", + "9 {'Автокран': 2, 'Бетономешалка': 2, 'ИТР (инже... \n", + "11 {'Автокран': 3, 'ИТР (инженерно-технический пе... " + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idxtask_idtask_nametask_name_mappedcontractorcostvolumemeasurementstartfinishdurationworkers
11200Бурение лидерных скважинБурение лидерных скважинContractor 1025.0шт000{'Бурильная машина': 2, 'Бурильщик, помощник б...
22203Монтаж ростверков и опорных конструкций под по...Монтаж ростверков и опорных конструкций под по...Contractor 12704.0шт011{'Автокран': 2, 'Геодезист': 2, 'ИТР (инженерн...
33207Подвеска грозозащитного тросаПодвеска грозозащитного тросаContractor 10160.0м000{'Автокран': 2, 'ИТР (инженерно-технический пе...
44205Установка опор/порталовУстановка опор/порталовContractor 12302.0шт011{'Автокран': 1, 'ИТР (инженерно-технический пе...
55209Укладка активного соляного заземленияУкладка активного соляного заземленияContractor 182035.6шт132{'АПС (агрегат передвижной сварочный)': 3, 'Ав...
66202Монтаж оголовниковМонтаж оголовковContractor 1014.0шт330{'АПС (агрегат передвижной сварочный)': 3, 'ИТ...
77206Подвеска проводаПодвеска проводаContractor 10200.0м330{'Автокран': 2, 'ИТР (инженерно-технический пе...
88208Укладка полосового заземленияУкладка полосового заземленияContractor 18024.0м341{'АПС (агрегат передвижной сварочный)': 1, 'Бу...
99201Установка в скважины свайУстановка в скважины свайContractor 120018.0шт341{'Автокран': 2, 'Бетономешалка': 2, 'ИТР (инже...
1111204Сборка опор/порталовСборка опор/порталовContractor 102.0шт440{'Автокран': 3, 'ИТР (инженерно-технический пе...
\n", + "
" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 27 + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 597 + }, + "id": "QIFEw7U6AlPa", + "outputId": "316645e0-1c43-490a-86cf-076088e41ec6", + "ExecuteTime": { + "end_time": "2024-07-08T09:13:14.960501Z", + "start_time": "2024-07-08T09:13:10.684439Z" + } + }, + "source": [ + "# Получаем объект Schedule со структурой графа работ из объекта ScheduleProject\n", + "raw_project_schedule = scheduling_project.schedule\n", + "\n", + "# Готовим финальное расписание (на вход передаем дату начала проекта в формате YYYY-MM-DD)\n", + "project_schedule = raw_project_schedule.merged_stages_datetime_df('2022-09-01') # в виде DataFrame\n", + "\n", + "# БОНУС Визуализация расписания средствами SAMPO (диаграмма Гантта)\n", + "schedule_fig = schedule_gant_chart_fig(schedule_dataframe=project_schedule,\n", + " visualization=VisualizationMode.ShowFig, # еще есть ReturnFig и SaveFig\n", + " remove_service_tasks=False)" + ], + "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "data": [ + { + "alignmentgroup": "True", + "base": [ + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-03T00:00:00", + "2022-09-03T00:00:00", + "2022-09-03T00:00:00", + "2022-09-03T00:00:00", + "2022-09-04T00:00:00", + "2022-09-04T00:00:00", + "2022-09-05T00:00:00" + ], + "customdata": [ + [ + "start of project", + 0, + 0.0, + "unit", + "{}", + "
", + "
" + ], + [ + "Бурение лидерных скважин", + 0, + 25.0, + "шт", + "{'Бурильная машина': 1,
'Бурильщик, помощник бурильщика': 1,
'Геодезист': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 1}", + "
", + "
" + ], + [ + "Монтаж оголовков", + 0, + 14.0, + "шт", + "{'АПС (агрегат передвижной сварочный)': 1,
'ИТР (инженерно-технический персонал)': 1,
'Монтажник': 2,
'Монтажник МК (металлоконструкций)': 1,
'Сварщик': 1,
'Сварщик МК (металлоконструкций)': 2,
'Слесаь монтажник': 2}", + "
", + "
" + ], + [ + "Подвеска грозозащитного троса", + 0, + 160.0, + "м", + "{'Автокран': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 1,
'Электромонтажник': 7}", + "
", + "
" + ], + [ + "Укладка активного соляного заземления", + 820, + 35.6, + "шт", + "{'АПС (агрегат передвижной сварочный)': 3,
'Автокран': 3,
'Бурильная машина': 3,
'ИТР (инженерно-технический персонал)': 3,
'Машинист, водители': 9,
'Сварщик МК (металлоконструкций)': 5,
'Стропальщик': 5,
'Электромонтажник': 10}", + "
", + "
" + ], + [ + "Монтаж ростверков и опорных конструкций под порталы, опоры вл", + 140, + 4.0, + "шт", + "{'Автокран': 1,
'Геодезист': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 2,
'Трактор гусеничный': 1,
'Электромонтажник': 8}", + "
", + "
" + ], + [ + "Подвеска провода", + 0, + 200.0, + "м", + "{'Автокран': 2,
'ИТР (инженерно-технический персонал)': 2,
'Машинист, водители': 3,
'Тягач, тягач седельный, трал': 2,
'Электромонтажник': 13}", + "
", + "
" + ], + [ + "Сборка опор/порталов", + 0, + 2.0, + "шт", + "{'Автокран': 2,
'ИТР (инженерно-технический персонал)': 2,
'Машинист, водители': 5,
'Монтажник МК (металлоконструкций)': 12,
'Сварщик МК (металлоконструкций)': 4,
'Стропальщик': 4,
'Тягач, тягач седельный, трал': 2}", + "
", + "
" + ], + [ + "Установка в скважины свай", + 200, + 18.0, + "шт", + "{'Автокран': 2,
'Бетономешалка': 2,
'ИТР (инженерно-технический персонал)': 2,
'Машинист, водители': 6,
'Стропальщик': 4,
'Трубоукладчик': 2,
'Экскаватор': 2}", + "
", + "
" + ], + [ + "Укладка полосового заземления", + 80, + 24.0, + "м", + "{'АПС (агрегат передвижной сварочный)': 1,
'Бурильная машина': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 1,
'Сварщик МК (металлоконструкций)': 1,
'Электромонтажник': 3}", + "
", + "
" + ], + [ + "Установка опор/порталов", + 140, + 2.0, + "шт", + "{'Автокран': 1,
'ИТР (инженерно-технический персонал)': 1,
'Машинист, водители': 2,
'Монтажник МК (металлоконструкций)': 5,
'Сварщик МК (металлоконструкций)': 2,
'Стропальщик': 2,
'Тягач, тягач седельный, трал': 1}", + "
", + "
" + ], + [ + "finish of project", + 0, + 0.0, + "unit", + "{}", + "
", + "
" + ] + ], + "hovertemplate": "%{hovertext}

color=Contractor 1
start=%{base}
finish=%{x}
idx=%{y}
task_name=%{text}
task_name_mapped=%{customdata[0]}
cost=%{customdata[1]}
volume=%{customdata[2]}
measurement=%{customdata[3]}
workers=%{customdata[4]}
zone_information=%{customdata[5]}
material_information=%{customdata[6]}", + "hovertext": [ + "start of project", + "Бурение лидерных скважин", + "Монтаж оголовников", + "Подвеска грозозащитного троса", + "Укладка активного соляного заземления", + "Монтаж ростверков и опорных конструкций под порталы, опоры ВЛ", + "Подвеска провода", + "Сборка опор/порталов", + "Установка в скважины свай", + "Укладка полосового заземления", + "Установка опор/порталов", + "finish of project" + ], + "legendgroup": "Contractor 1", + "marker": { + "color": "#636efa", + "pattern": { + "shape": "" + } + }, + "name": "Contractor 1", + "offsetgroup": "Contractor 1", + "orientation": "h", + "showlegend": true, + "text": [ + "start of project", + "Бурение лидерных скважин", + "Монтаж оголовников", + "Подвеска грозозащитного троса", + "Укладка активного соляного заземления", + "Монтаж ростверков и опорных конструкций под порталы, опоры ВЛ", + "Подвеска провода", + "Сборка опор/порталов", + "Установка в скважины свай", + "Укладка полосового заземления", + "Установка опор/порталов", + "finish of project" + ], + "textposition": "outside", + "x": [ + 0.0, + 0.0, + 0.0, + 0.0, + 1.728E8, + 8.64E7, + 0.0, + 0.0, + 8.64E7, + 8.64E7, + 8.64E7, + 0.0 + ], + "xaxis": "x", + "y": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "yaxis": "y", + "type": "bar" + }, + { + "alignmentgroup": "True", + "base": [ + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-01T00:00:00" + ], + "customdata": [ + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ], + [ + "", + 0, + 0, + "unit", + "", + "", + null + ] + ], + "hovertemplate": "%{hovertext}

color=
start=%{base}
finish=%{x}
idx=%{y}
task_name=%{text}
task_name_mapped=%{customdata[0]}
cost=%{customdata[1]}
volume=%{customdata[2]}
measurement=%{customdata[3]}
workers=%{customdata[4]}
zone_information=%{customdata[5]}
material_information=%{customdata[6]}", + "hovertext": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "legendgroup": "", + "marker": { + "color": "#EF553B", + "pattern": { + "shape": "" + } + }, + "name": "", + "offsetgroup": "", + "orientation": "h", + "showlegend": false, + "text": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "textposition": "outside", + "x": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "xaxis": "x", + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "yaxis": "y", + "type": "bar" + } + ], + "layout": { + "template": { + "data": { + "histogram2dcontour": [ + { + "type": "histogram2dcontour", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "choropleth": [ + { + "type": "choropleth", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + ], + "histogram2d": [ + { + "type": "histogram2d", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "heatmap": [ + { + "type": "heatmap", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "heatmapgl": [ + { + "type": "heatmapgl", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "contourcarpet": [ + { + "type": "contourcarpet", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + ], + "contour": [ + { + "type": "contour", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "surface": [ + { + "type": "surface", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "mesh3d": [ + { + "type": "mesh3d", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "parcoords": [ + { + "type": "parcoords", + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scatterpolargl": [ + { + "type": "scatterpolargl", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "scattergeo": [ + { + "type": "scattergeo", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scatterpolar": [ + { + "type": "scatterpolar", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "scattergl": [ + { + "type": "scattergl", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scatter3d": [ + { + "type": "scatter3d", + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scattermapbox": [ + { + "type": "scattermapbox", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scatterternary": [ + { + "type": "scatterternary", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "scattercarpet": [ + { + "type": "scattercarpet", + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ] + }, + "layout": { + "autotypenumbers": "strict", + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "hovermode": "closest", + "hoverlabel": { + "align": "left" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "bgcolor": "#E5ECF6", + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "ternary": { + "bgcolor": "#E5ECF6", + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "sequential": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ], + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ] + }, + "xaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "automargin": true, + "zerolinewidth": 2 + }, + "yaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "automargin": true, + "zerolinewidth": 2 + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white", + "gridwidth": 2 + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white", + "gridwidth": 2 + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white", + "gridwidth": 2 + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "geo": { + "bgcolor": "white", + "landcolor": "#E5ECF6", + "subunitcolor": "white", + "showland": true, + "showlakes": true, + "lakecolor": "white" + }, + "title": { + "x": 0.05 + }, + "mapbox": { + "style": "light" + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0.0, + 1.0 + ], + "type": "date", + "title": { + "text": "Date" + }, + "range": [ + "2022-08-30T00:00:00", + "2022-09-06T00:00:00" + ] + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0.0, + 1.0 + ], + "title": { + "text": "Project tasks" + }, + "categoryorder": "array", + "categoryarray": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ], + "showticklabels": false, + "type": "category" + }, + "legend": { + "title": { + "text": "color" + }, + "tracegroupgap": 0 + }, + "title": { + "text": "Project tasks - Gant chart" + }, + "barmode": "overlay", + "font": { + "size": 12 + }, + "autosize": true + }, + "config": { + "plotlyServerURL": "https://plot.ly" + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 20 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mJzhOUCPZULu" + }, + "source": [ + "### **3.2 Полное планирование через пайплайн**\n", + "\n", + "На выходе получаем объект `ScheduleProject` запланированного проекта" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "id": "5e_qlxaqZNIw" + }, + "outputs": [], + "source": [ + "schedule_project2 = SchedulingPipeline.create() \\\n", + " .wg(wg=df,\n", + " all_connections=True,\n", + " change_connections_info=False) \\\n", + " .history(history_df, sep=';') \\\n", + " .lag_optimize(LagOptimizationStrategy.TRUE) \\\n", + " .work_estimator(project_work_estimator) \\\n", + " .schedule(heft_scheduler) \\\n", + " .finish()[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "id": "UeQpqwz-HbCj" + }, + "outputs": [], + "source": [ + "# Смотрим на структуру получившегося графа\n", + "restructured_graph_df = schedule_project2.wg.to_frame()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7hulJaRYwDN_" + }, + "source": [ + "**Визуализируем итог**" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 695 + }, + "id": "8zbx_q0DE0BI", + "outputId": "148c4c0c-8ca9-4e59-ceb2-40ec550f50d3" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
activity_idactivity_namegranular_namevolumemeasurementpredecessor_idsconnection_typeslags
025809398Начало работ по маркеНачало работ по марке0.01
125809830Изготовление свайИзготовление свай1496.0шт25809398FS1.0
225809831Бурение скважинБурение скважин1496.0шт25809398,25809830FS,FFS1.0,0.03
325809833Погружение свайПогружение свай1496.0шт25809398,25809831FS,FFS1.0,0.03
425813507Заполнение полости свай ЦПСЗаполнение полости свай1500.0шт25809398,25809833FS,FFS1.0,0.03
\n", + "
" + ], + "text/plain": [ + " activity_id activity_name granular_name volume \\\n", + "0 25809398 Начало работ по марке Начало работ по марке 0.0 \n", + "1 25809830 Изготовление свай Изготовление свай 1496.0 \n", + "2 25809831 Бурение скважин Бурение скважин 1496.0 \n", + "3 25809833 Погружение свай Погружение свай 1496.0 \n", + "4 25813507 Заполнение полости свай ЦПС Заполнение полости свай 1500.0 \n", + "\n", + " measurement predecessor_ids connection_types lags \n", + "0 1 \n", + "1 шт 25809398 FS 1.0 \n", + "2 шт 25809398,25809830 FS,FFS 1.0,0.03 \n", + "3 шт 25809398,25809831 FS,FFS 1.0,0.03 \n", + "4 шт 25809398,25809833 FS,FFS 1.0,0.03 " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "restructured_graph_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 542 + }, + "id": "h4Ew_lQpBepa", + "outputId": "96119bbe-fd0c-46e8-cbe7-d19bcb50a533" + }, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "base": [ + "2022-09-01T00:00:00", + "2022-09-01T00:00:00", + "2022-09-02T00:00:00", + "2022-09-07T00:00:00", + "2022-09-12T00:00:00", + "2022-09-17T00:00:00", + "2022-09-22T00:00:00", + "2022-09-22T00:00:00", + "2022-10-03T00:00:00", + "2022-10-03T00:00:00", + "2022-10-08T00:00:00", + "2022-10-13T00:00:00", + "2022-10-13T00:00:00", + "2022-10-14T00:00:00", + "2022-10-15T00:00:00", + "2022-10-15T00:00:00", + "2022-10-18T00:00:00", + "2022-10-19T00:00:00", + "2022-10-20T00:00:00", + "2022-10-20T00:00:00", + "2022-10-20T00:00:00", + "2022-10-21T00:00:00", + "2022-10-23T00:00:00", + "2022-10-28T00:00:00", + "2022-10-29T00:00:00", + "2022-10-29T00:00:00", + "2022-10-29T00:00:00", + "2022-11-12T00:00:00", + "2022-11-13T00:00:00", + "2022-11-14T00:00:00", + "2022-11-15T00:00:00", + "2022-11-16T00:00:00", + "2022-11-17T00:00:00", + "2022-11-17T00:00:00" + ], + "customdata": [ + [ + " 1 Sep 2022", + " 1 Sep 2022", + "start of project", + 0, + 0, + "unit", + "{}", + "
" + ], + [ + " 1 Sep 2022", + " 1 Sep 2022", + "Начало работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + " 2 Sep 2022", + "12 Sep 2022", + "Изготовление свай", + 400, + 1496, + "шт", + "{'Автокран': 1,
'Сварщик МК (металлоконструкций)': 2,
'Газорезчик': 1,
'АПС (агрегат передвижной сварочный)': 1,
'Монтажник ТТ (технологических трубопроводов)': 1,
'Машинист, водители': 2}", + "
" + ], + [ + " 7 Sep 2022", + "22 Sep 2022", + "Бурение скважин", + 250, + 1496, + "шт", + "{'ИТР (инженерно-технический персонал)': 1,
'Бурильщик, помощник бурильщика': 1,
'Машинист, водители': 1,
'Геодезист': 1,
'Бурильная машина': 1}", + "
" + ], + [ + "12 Sep 2022", + " 2 Oct 2022", + "Погружение свай", + 100, + 1496, + "шт", + "{'Монтажник МК (металлоконструкций)': 2}", + "
" + ], + [ + "17 Sep 2022", + " 2 Oct 2022", + "Засыпка щебнем", + 0, + 82.8, + "м3", + "{}", + "
" + ], + [ + "22 Sep 2022", + " 2 Oct 2022", + "Заполнение полости свай", + 0, + 1500, + "шт", + "{}", + "
" + ], + [ + "22 Sep 2022", + " 2 Oct 2022", + "Монтаж оголовков", + 0, + 1496, + "шт", + "{}", + "
" + ], + [ + " 3 Oct 2022", + "13 Oct 2022", + "Монтаж деформационных марок", + 450, + 100, + "шт", + "{'Электромонтажник': 9}", + "
" + ], + [ + " 3 Oct 2022", + "13 Oct 2022", + "Устройство термометрических скважин", + 1900, + 11, + "шт", + "{'Разнорабочий': 6,
'ИТР (инженерно-технический персонал)': 9,
'Бурильщик, помощник бурильщика': 2,
'Машинист, водители': 11,
'Сварщик МК (металлоконструкций)': 7,
'Бурильная машина': 1,
'АПС (агрегат передвижной сварочный)': 2}", + "
" + ], + [ + " 8 Oct 2022", + "18 Oct 2022", + "Монтаж траверс", + 450, + 945, + "шт", + "{'Машинист, водители': 2,
'Монтажник МК (металлоконструкций)': 2,
'Сварщик МК (металлоконструкций)': 1,
'ИТР (инженерно-технический персонал)': 1,
'Стропальщик': 1,
'АПС (агрегат передвижной сварочный)': 1,
'Автокран': 1}", + "
" + ], + [ + "13 Oct 2022", + "13 Oct 2022", + "Монтаж м/к (связи, стойки, подкосы, упоры)", + 0, + 148.6, + "тн", + "{}", + "
" + ], + [ + "13 Oct 2022", + "28 Oct 2022", + "Монтаж термометрических трубок", + 550, + 59, + "шт", + "{'Сварщик МК (металлоконструкций)': 3,
'Монтажник': 7,
'АПС (агрегат передвижной сварочный)': 1}", + "
" + ], + [ + "14 Oct 2022", + "14 Oct 2022", + "Устройство песчаной подушки", + 0, + 144.47, + "м3", + "{}", + "
" + ], + [ + "15 Oct 2022", + "15 Oct 2022", + "Заполнение щебнем", + 0, + 247.97, + "м3", + "{}", + "
" + ], + [ + "15 Oct 2022", + "15 Oct 2022", + "Укладка георешетки", + 0, + 92.00000000000001, + "шт", + "{}", + "
" + ], + [ + "18 Oct 2022", + "28 Oct 2022", + "Монтаж термостабилизаторов", + 1450, + 81, + "шт", + "{'Сварщик МК (металлоконструкций)': 5,
'ИТР (инженерно-технический персонал)': 7,
'Машинист, водители': 9,
'Бурильная машина': 1,
'Разнорабочий': 4,
'Бурильщик, помощник бурильщика': 2,
'АПС (агрегат передвижной сварочный)': 1}", + "
" + ], + [ + "19 Oct 2022", + "19 Oct 2022", + "Начало работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + "20 Oct 2022", + "20 Oct 2022", + "Монтаж опор", + 0, + 84.00000000000001, + "шт", + "{}", + "
" + ], + [ + "20 Oct 2022", + "20 Oct 2022", + "Прокладка трубопровода", + 0, + 1267.12, + "м", + "{}", + "
" + ], + [ + "20 Oct 2022", + "20 Oct 2022", + "Сварка трубопровода", + 0, + 202.99999999999997, + "стык", + "{}", + "
" + ], + [ + "21 Oct 2022", + "21 Oct 2022", + "Прокладка трубопровода", + 0, + 1200.17, + "м", + "{}", + "
" + ], + [ + "23 Oct 2022", + "23 Oct 2022", + "АКЗ свай и м/к", + 0, + 11017, + "м2", + "{}", + "
" + ], + [ + "28 Oct 2022", + "11 Nov 2022", + "Монтаж заземления", + 2730, + 100, + "%", + "{'Электромонтажник': 9,
'Сварщик МК (металлоконструкций)': 7,
'Машинист, водители': 10,
'АПС (агрегат передвижной сварочный)': 1,
'Автокран': 1,
'Стропальщик': 2,
'Бурильная машина': 1,
'ИТР (инженерно-технический персонал)': 8}", + "
" + ], + [ + "29 Oct 2022", + "29 Oct 2022", + "Монтаж опор трубопровода", + 0, + 238, + "шт", + "{}", + "
" + ], + [ + "29 Oct 2022", + "29 Oct 2022", + "Окончание работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + "29 Oct 2022", + "29 Oct 2022", + "Сварка трубопровода", + 0, + 121, + "стык", + "{}", + "
" + ], + [ + "12 Nov 2022", + "12 Nov 2022", + "Окончание работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + "13 Nov 2022", + "13 Nov 2022", + "Начало работ по марке", + 0, + 0, + "1", + "{}", + "
" + ], + [ + "14 Nov 2022", + "14 Nov 2022", + "Очистка трубопровода", + 0, + 100, + "%", + "{}", + "
" + ], + [ + "15 Nov 2022", + "15 Nov 2022", + "Гидроиспытания трубопровода", + 0, + 100, + "%", + "{}", + "
" + ], + [ + "16 Nov 2022", + "16 Nov 2022", + "Изоляция сварных соединений", + 0, + 203, + "стык", + "{}", + "
" + ], + [ + "17 Nov 2022", + "17 Nov 2022", + "finish of project", + 0, + 0, + "unit", + "{}", + "
" + ], + [ + "17 Nov 2022", + "17 Nov 2022", + "Окончание работ по марке", + 0, + 0, + "1", + "{}", + "
" + ] + ], + "hovertemplate": "%{hovertext}

color=Contractor 1
idx=%{y}
task_name=%{text}
start=%{customdata[0]}
finish=%{customdata[1]}
task_name_mapped=%{customdata[2]}
cost=%{customdata[3]}
volume=%{customdata[4]}
measurement=%{customdata[5]}
workers=%{customdata[6]}
zone_information=%{customdata[7]}", + "hovertext": [ + "start of project", + "Начало работ по марке", + "Изготовление свай", + "Бурение скважин", + "Погружение свай", + "Засыпка пространства между сваями щебнем фракции 15-20 мм", + "Заполнение полости свай ЦПС", + "Срезка свай, монтаж оголовков", + "Монтаж деформационных марок", + "Устройство термометрических скважин", + "Монтаж траверс", + "Монтаж м/к (связи, стойки, упоры, подкосы)", + "Монтаж термометрических трубок", + "Устройство песчанной подушки", + "Заполнение габионов щебнем фракции 70-120мм", + "Укладка габионов", + "Монтаж термостабилизаторов", + "Начало работ по марке", + "Монтаж опор DN 500 (неподвижная, направляющая, скользящая)", + "Надземная прокладка газопровода 530х24 мм", + "Сварка газопровода 530х24 мм", + "Надземная прокладка метанолопровода 57х6мм", + "АКЗ свай и металлоконструкций", + "Монтаж заземления", + "Монтаж опор метанолопровода", + "Окончание работ по марке", + "Сварка метанолопровода 57х6мм", + "Окончание работ по марке", + "Начало работ по марке", + "Очистка полости трубопроводов", + "Гидроиспытания трубопроводов", + "Изоляция сварных соединений газопровода", + "finish of project", + "Окончание работ по марке" + ], + "legendgroup": "Contractor 1", + "marker": { + "color": "#636efa", + "pattern": { + "shape": "" + } + }, + "name": "Contractor 1", + "offsetgroup": "Contractor 1", + "orientation": "h", + "showlegend": true, + "text": [ + "start of project", + "Начало работ по марке", + "Изготовление свай", + "Бурение скважин", + "Погружение свай", + "Засыпка пространства между сваями щебнем фракции 15-20 мм", + "Заполнение полости свай ЦПС", + "Срезка свай, монтаж оголовков", + "Монтаж деформационных марок", + "Устройство термометрических скважин", + "Монтаж траверс", + "Монтаж м/к (связи, стойки, упоры, подкосы)", + "Монтаж термометрических трубок", + "Устройство песчанной подушки", + "Заполнение габионов щебнем фракции 70-120мм", + "Укладка габионов", + "Монтаж термостабилизаторов", + "Начало работ по марке", + "Монтаж опор DN 500 (неподвижная, направляющая, скользящая)", + "Надземная прокладка газопровода 530х24 мм", + "Сварка газопровода 530х24 мм", + "Надземная прокладка метанолопровода 57х6мм", + "АКЗ свай и металлоконструкций", + "Монтаж заземления", + "Монтаж опор метанолопровода", + "Окончание работ по марке", + "Сварка метанолопровода 57х6мм", + "Окончание работ по марке", + "Начало работ по марке", + "Очистка полости трубопроводов", + "Гидроиспытания трубопроводов", + "Изоляция сварных соединений газопровода", + "finish of project", + "Окончание работ по марке" + ], + "textposition": "outside", + "type": "bar", + "x": [ + 0, + 0, + 950400000, + 1382400000, + 1814400000, + 1382400000, + 950400000, + 950400000, + 950400000, + 950400000, + 950400000, + 0, + 1382400000, + 0, + 0, + 0, + 950400000, + 0, + 0, + 0, + 0, + 0, + 0, + 1296000000, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "xaxis": "x", + "y": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ], + "yaxis": "y" + } + ], + "layout": { + "autosize": true, + "barmode": "overlay", + "font": { + "size": 12 + }, + "legend": { + "title": { + "text": "color" + }, + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Project tasks - Gant chart" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "range": [ + "2022-08-30T00:00:00", + "2022-12-12T00:00:00" + ], + "title": { + "text": "Date" + }, + "type": "date" + }, + "yaxis": { + "anchor": "x", + "autorange": true, + "categoryarray": [ + 33, + 32, + 31, + 30, + 29, + 28, + 27, + 26, + 25, + 24, + 23, + 22, + 21, + 20, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ], + "categoryorder": "array", + "domain": [ + 0, + 1 + ], + "range": [ + -0.5, + 33.5 + ], + "showticklabels": false, + "title": { + "text": "Project tasks" + }, + "type": "category" + } + } + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAABE0AAAFoCAYAAACixgUDAAAAAXNSR0IArs4c6QAAIABJREFUeF7svXmM5Md15/nN+6zMOrLuq6u7q7v6IrtJkWrLoihb4wO0tfYaMNeG/7BXBkFIWBi2BQqiBgNBa4wpiJDsnQUkcAlrLMOCNJRHMx6NaMtrybRkyxQpkk2y2XdV131m3Xmfuy+qs1hdrOrK45e/isz8/gCp2dURL97v8yI7Ir8d8Z4ln8/nwYcESIAESIAESIAESIAESIAESIAESIAESOAuAhaKJpwRJEACJEACJEACJEACJEACJEACJEACJPBeAhRNOCtIgARIgARIgARIgARIgARIgARIgARIYA8CFE04LUiABEiABEiABEiABEiABEiABEiABEiAognnAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkUR4AnTYrjxFYkQAIkQAIkQAIkQAIkQAIkQAIkQAINRoCiSYMFnK9LAiRAAiRAAiRAAiRAAiRAAiRAAiRQHAGKJsVxYisSIAESIAESIAESIAESIAESIAESIIEGI0DRpMECztclARIgARIgARIgARIgARIgARIgARIojgBFk+I4sRUJkAAJkAAJkAAJkAAJkAAJkAAJkECDEaBo0mAB5+uSAAmQAAmQAAmQAAmQAAmQAAmQAAkUR4CiSXGc2IoESIAESIAESIAESIAESIAESIAESKDBCFA0abCA83VJgARIgARIgARIgARIgARIgARIgASKI0DRpDhObEUCJEACJEACJEACJEACJEACJEACJNBgBCiaNFjA+bokQAIkQAIkQAIkQAIkQAIkQAIkQALFEaBoUhwntiIBEiABEiABEiABEiABEiABEiABEmgwAhRNGizgfF0SIAESIAESIAESIAESIAESIAESIIHiCFA0KY4TW5EACZAACZAACZAACZAACZAACZAACTQYAYomDRZwvi4JkAAJkAAJkAAJkAAJkAAJkAAJkEBxBCiaFMeJrUiABEiABEiABEiABEiABEiABEiABBqMAEWTBgs4X5cESIAESIAESIAESIAESIAESIAESKA4AhRNiuPEViRAAiRAAiRAAiRAAiRAAiRAAiRAAg1GgKJJgwWcr0sCJEACJEACJEACJEACJEACJEACJFAcAYomxXFiKxIgARIgARIgARIgARIgARIgARIggQYjQNGkwQLO1yUBEiABEiABEiABEiABEiABEiABEiiOAEWT4jixFQmQAAmQAAmQAAmQAAmQAAmQAAmQQIMRoGjSYAHn65IACZAACZAACZAACZAACZAACZAACRRHgKJJcZzYigRIgARIgARIgARIgARIgARIgARIoMEIUDRpsIDzdUmABEiABEiABEiABEiABEiABEiABIojQNGkOE5sRQIkQAIkQAIkQAIkQAIkQAIkQAIk0GAEKJo0WMD5uiRAAiRAAiRAAiRAAiRAAiRAAiRAAsURoGhSHCe2IgESIAESIAESIAESIAESIAESIAESaDACFE0aLOB8XRIgARIgARIgARIgARIgARIgARIggeIIUDQpjhNbkQAJkAAJkAAJkAAJkAAJkAAJkAAJNBgBiiYNFnC+LgmQAAmQAAmQAAmQAAmQAAmQAAmQQHEEKJoUx4mtSIAESIAESIAESIAESIAESIAESIAEGowARZMGCzhflwRIgARIgARIgARIgARIgARIgARIoDgCFE2K48RWRRBYXd/Exz/9Z3j8ox/Gbzz2oSJ6sIkRBArcHz4/gj9+8nEjTNIGCZAACZAACZAACZAACZAACZAAgLoXTV69dA2/94eff0+wf+UjF/G5pz4Gj9tp+ET49os/xH/4wlfxl3/+aTx0fsRw+1967gW8cukavvL5P0JLsOlA+2Z9qa4V0UT4/cU3XnwPt2rFa+dAMje+/LW/xXNf+CSODfYcGLtiGpgV352+lDoHi3kPtiEBEiABEiABEiABEiABEiAB3Qg0jGiy8wtx4UumBKNY4aGUwFE00fOkSUFA20swK8SsmmKazCGKJqV8ktiWBEiABEiABEiABEiABEiABA6XQEOKJoJ8dGIWT37qi/jE7/5azV0lKfVf+c06iaDzSZOCYPInn/rYvvEW///zN/8OH//dX6/KCSSKJof7lx1HJwESIAESIAESIAESIAESIIFSCTSsaLJbSNgpovT3dGxf6fn9335sO09E4TRCAfLuUwk7rwJ1d7a95wpGYcy3r45tx2mvKyF7tSuM9ZWv/ff3XC3Za6zCAHvZkj8r2Lt8bWzP60t7+bXXVae9TvDszmmy1ymOg2yVOpHv1T6eSOGzz34Vk7OLJZ0s2u9q1242O+eO+CFXswrPzra7589ebfZ7j718KQhAO+fyI++/76547haJ9psPO+e5+LDT5q/98geVwDi3sKzmTag1iK9963t3uXqvOWhkLGmLBEiABEiABEiABEiABEiABMwkQNHkTvLMwhdf+WK4+wukBGT36Y57fRHf6wrGXicd9jrtst+JiP/nr7+DjzzyoMqDYeRJExnvRz95664EogUfdn7h3+tnu99zr5MmBaFg55f3YmwZ+SEocH7s599fUqLUYtnsnDs733OveVDO9RyJ94s/+MldItzOUzGJZFIl4BUxbufc3Yuz9HvmP30dT//B72znw9nrJNJOcWWvK0ulzkEj40lbJEACJEACJEACJEACJEACJGAWgYYVTXaLE/e6rrPXl8/d/xq/s2rJ7i/GBYGlq6P1PV/ad375FJvy5fegKiilfmEt9XrOXv7uN+bl67fhcbuUmLNbNNkvt0sxtoz8ABh5FWsvNvvZ309EKiUR7H5zbyef/eJ7r3m3m6/E6oXvvLR9EuegOVPqHDQynrRFAiRAAiRAAiRAAiRAAiRAAmYRaEjRpPAl94Gzw9sVdO71xXr3F8pCcApfSuX3Oyvx7BZNCrafefqJ91TTkS/FTz/zvDpFII9cg9ir3c4JUeoX1oO+ABdzZaOYRKk7RQLxd78KQsXY2usDUOD93e+/fNcf3ytPiTTcL7Y7T4gUDO4+VVEMm4NEk50iWKknTfabe6WIJrvnp/x+rwpC504dpWhi1t+8HIcESIAESIAESIAESIAESKAmCDSMaLI7Gru/aN9LNLmXSLHXn+3+YrxfboyCT4V8ECurGyofxUGlb40UTQoCxs5rHfudUNgrJ8dOjrsFhp1fwnfzP8iWkZ+eYq7nFHwf6OnYFsCKZVNN0aSYWB900mSnaFLwVfKS7KwcxZMmRs442iIBEiABEiABEiABEiABEqgXAg0jmhwkRBzWSZOdE+leJ1J2tivmi/TO9vt9qT7oy/Ze14kKdnee+iiw3VnK+U+ffgKfeeZ51fygss572TLyA1ZMItjdokkhT8juq1LlXM/R6aTJfnOHoomRM462SIAESIAESIAESIAESIAE6oUARZM7kaxmTpODrscUJtO92u3MHVLMlY2dE3S/kyP7vfNe7b/30iv40MXzd5Xi3d1/dw6Pva5BiV/F2DL6A1Y47bNXkl8Za7doMrsQ3rMkdaWiyc7rWJIH5qDnXjlNChwPEnhkDLk+Jo9UESr83uN2bg9fqmhS6hw86D355yRAAiRAAiRAAiRAAiRAAiSgIwGKJkWIJtJkdwWTcqvn7FXadWc1k72q5+z+ol1MctDdk22vEwZ75WTZeepjp6/FXEPaK/HpXsJJMbaq8WG5Vy6V3X7uJTDsx6aU6znlJKXdq3qO/Gx+cUWJIcWKJiKS7FfRR/LPlJLTpJw5WI2Y0iYJkAAJkAAJkAAJkAAJkAAJVJMARZMiRRNptjsPx16lWAvt9qqQsl9S0f3yq0j548Kz+3rRTl8KOVHudXJhdxLVgu8FcaCQXFVs/fn/+X/gr174HnZez9krCevunCV7iSZiv/AFu+BnT2dInXjYmdD1XvlPjPwA7JdMdi+Gu9vux6YU0WQnj/1iu9f77p57xQgc90pULCJJ4ZH5J08p1XN2fx6KmYNGxpG2SIAESIAESIAESIAESIAESMAMAnUvmpgBcfcYpVZIOQwfOSYJkAAJkAAJkAAJkAAJkAAJkAAJkMC9CVA0MXiG7Pev+wYPQ3MkQAIkQAIkQAIkQAIkQAIkQAIkQAJVJkDRxCDAkmPiL77xorJm1lUTg1ynGRIgARIgARIgARIgARIgARIgARIggT0IUDThtCABEiABEiABEiABEiABEiABEiABEiABiiacAyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQHAGeNCmOE1uRAAmQAAmQAAmQAAmQAAmQAAmQAAk0GAGKJg0WcL4uCZAACZAACZAACZAACZAACZAACZBAcQQomhTHia1IgARIgARIgARIgARIgARIgARIgAQajABFkwYLOF+XBEiABEiABEiABEiABEiABEiABEigOAIUTYrjxFYkQAIkQAIkQAIkQAIkQAIkQAIkQAINRoCiSYMFnK9LAiRAAiRAAiRAAiRAAiRAAiRAAiRQHAGKJsVxYisSIAESIAESIAESIAESIAESIAESIIEGI0DRpMECztclARIgARIgARIgARIgARIgARIgARIojgBFk+I4sRUJkAAJkAAJkAAJkAAJkAAJkAAJkECDEaBo0mAB5+uSAAmQAAmQAAmQAAmQAAmQAAmQAAkUR4CiSXGc2IoESIAESIAESIAESIAESIAESIAESKDBCFA0abCA83VJgARIgARIgARIgARIgARIgARIgASKI0DRpDhObEUCJEACJEACJEACJEACJEACJEACJNBgBCiaNFjA+bokQAIkQAIkQAIkQAIkQAIkQAIkQALFEaBoUhwntiIBEiABEiABEiABEiABEiABEiABEmgwAhRNGizgfF0SIAESIAESIAESIAESIAESIAESIIHiCFA0KY4TW5EACZAACZAACZAACZAACZAACZAACTQYAYomDRZwvi4JkAAJkAAJkAAJkAAJkAAJkAAJkEBxBCiaFMeJrUiABEiABEiABEiABEiABEiABEiABBqMAEWTBgs4X5cESIAESIAESIAESIAESIAESIAESKA4AhRNiuPEViRAAiRAAiRAAiRAAiRAAiRAAiRAAg1GgKJJgwWcr0sCJEACJEACJEACJEACJEACJEACJFAcAYomxXFiKxIgARIgARIgARIgARIgARIgARIggQYjQNGkwQLO1yUBEiABEiABEiABEiABEiABEiABEiiOAEWT4jixFQmQAAmQAAmQAAmQAAmQAAmQAAmQQIMRoGjSYAHn65IACZAACZAACZAACZAACZAACZAACRRHgKJJcZzYigRIgARIgARIgARIgARIgARIgARIoMEIUDRpsIDzdUmABEiABEiABEiABEiABEiABEiABIojQNGkOE5sRQIkQAIkQAIkQAIkQAIkQAIkQAIk0GAEKJo0WMD5uiRAAiRAAiRAAiRAAiRAAiRAAiRAAsURoGhSHCe2IgESIAESIAESIAESIAESIAESIAESaDACFE0aLOB8XRIgARIgARIgARIgARIgARIgARIggeIIUDQpjhNbkQAJkAAJkAAJkAAJkAAJkAAJkAAJNBgBiiYNFnC+LgmQAAmQAAmQAAmQAAmQAAmQAAmQQHEEKJoUx4mtSIAESIAESIAESIAESIAESIAESIAEGowARZMGCzhflwRIgARIgARIgARIgARIgARIgARIoDgCFE2K48RWJEACJEACJEACJEACJEACJEACJEACDUaAokmDBZyvSwIkQAIkQAIkQAIkQAIkQAIkQAIkUBwBiibFcWIrEiABEiABEiABEiABEiABEiABEiCBBiNA0aTBAs7XJQESIAESIAESIAESIAESIAESIAESKI4ARZPiOLEVCZAACZAACZAACZAACZAACZAACZBAgxGgaNJgAefrkgAJkAAJkAAJkAAJkAAJkAAJkAAJFEeAoklxnNiKBEiABEiABEiABEiABEiABEiABEigwQhQNGmwgPN1SYAESIAESIAESIAESIAESIAESIAEiiNA0aQ4TmxFAiRAAiRAAiRAAiRAAiRAAiRAAiTQYAQomlQY8NnleEUW8rkcLFZrRTbY+V0CPW0eVBoT8tSLQCjgwkY8jVQ6p5dj9KZsAk0eO2CxYDOWLtsGO+pFwGm3IuBzILye1MsxelMRAa6pFeHTsjPXVC3DUpFTXFPvxid/b/EhAaMJUDSpkKgRX9Aj0QSWV1YB5NHW2oI88nDa7VhcXkUum0V/b7fyMhqPY3Z+CdlMFiPDR5BKZZDNZWG32ZAHkM5k4LQ7sLq+gWDAj0w2C5fDgfVIFPPzYdXH4bBX+MZ6d+cGT+/4lOMdN3jlUNO7Dzd4esenHO8ompRDTf8+XFP1j1GpHnJNLZWY/u25plI00X+W1r6HFE0qjGGlokk0FsePf/IW+vs6laBhs9lwa2wS+XwegwPdsFltGBroxY2xSXhcDly+NooTRweUkPL21ZvwuN2Yml3A0GAvHHYbwstrcLscmJpZBCxAPg88/MAZ1eb+08MUTSqMN7ubT4AbPPOZV3tEbvCqTdh8+xRNzGduxogUTcygbO4YXFPN5W3GaFxTKZqYMc8afQyKJhXOgEpFk2QqjenZRVy5PoaOUAsSqRRcdjty+RyOHx3E9NwC7js9jNvj04jFk5hbDOPUiSF0htrw1pUbyOXySmA5MtCD+YWwOl3i83kwN7+M3p529bPe7nZMzy3h4Qtn4PPW95E1bvAqnNAaducGT8OgVOgSN3gVAtSwO0UTDYNigEtcUw2AqJkJrqmaBcQAd7imUjQxYBrRxAEEKJpUOEUqFU1keBE+rFZLSZ5siS0LOHak765+84vLuH5rAh946L66P1WyFzBu8EqaRjXRmBu8mghTSU5yg1cSrppoTNGkJsJUspNcU0tGpn0Hrqnah6hkB7mmUjQpedKwQ8kEKJqUjOzuDsaIJgBzwVYYiDvducEzhqNOVrjB0ykaxvjCDZ4xHHWyQtFEp2gY5wvXVONY6mKJa6oukTDOD66pFE2Mm020tB8BiiYVzo1KRZNEIoWXX3sbF86dwDvXR3F2ZBhOhwN2h02dQEmmUrBZrbBarEil03A5nUhl0vB7PcjmcognkioRbDqdUSdLrt24jWCwCV3tIXXFJ5fbqjji93mRSCaRyWThdruUXY/bpf5M8p5IO7EhSWjdLicSyZSyK/+TcSTJrNvp1P70Cjd4FU5oDbtzg6dhUCp0iRu8CgFq2J2iiYZBMcAlrqkGQNTMBNdUzQJigDtcUymaGDCNaOIAAhRNKpwiRogmf/M//lEJFYGAH81BPzYjMXXtJi7ChdWCqdlFtDQHML+0rISLgb4ulZtEksimM1msrqzDZrcincognkzC63UBeSsCTT4lhkiOE0km+/pbV7fsLK6grzuESDSufv/TS1ewuraJ9104hbn5MNpDLXC5XHfyqCTQ39uFpeUVOBwO/OKHL1ZIrLrducGrLt/DsM4N3mFQr+6Y3OBVl+9hWKdochjUqz8m19TqMzZ7BK6pZhOv/nhcU/UWTb794g/x8mtX8LmnPgaP21n9CcERqkKAokmFWI0QTQonTf75X19HR3srHE4HBvu6MTE1CzmJIqdCfB4PsvkMksk0mpsD6O3uwMZGBBuRKJaX19Dk98Fmt6kSxel0Frnc1omS9rYWJbCI3Tcv30B3Zwi3J2fgdrnUOKGWIDajMUxMziGTzSDg98HtcSGXz2NlZV2dPJETKXabXSWUFQFF54cbPJ2jU55v3OCVx03nXtzg6Ryd8nyjaFIeN917cU3VPUKl+8c1tXRmuvfgmkrRRPc5Wg/+UTSpMIqViiYyvNygKSenyczcohJL5ESJkU+17Brp4362uMEzg7K5Y3CDZy5vM0bjBs8MyuaOQdHEXN5mjcY11SzS5o3DNdU81maNxDWVoolZc62Rx6FoUmH0jRBNinLBUlp1naJs1mGj9qALS+vJyt5Mkrzw0YYAN3jahMIwR7jBMwylNoYommgTCkMdoWhiKE4tjHFN1SIMhjrBNbX6osnq+iY+/uk/w9tXx9Rg3Z1teO4Ln8SxwR7EEyl89tmv4rvff1n92blTR/GVz/8RWoJN6vd7Xc/50nMv4C++8eJ7bMkPXr10DV987gV88snH8fQzz2NuYRl/8qmP4Tce+5Ch84bGSiNA0aQ0Xu9pXW3RRK7H/PjHNoxPWSv0lN2LIeDx5PHIz+bQ3kbhpBheZrThBs8MyuaOwQ2eubzNGI2iiRmUzR+Doon5zKs9ItfUahM23z7X1OqKJgXB5PGPfnhbuBBhQ56zI0eVYNLV0Yo/fvLxbZHkhe+8tC2c7BZNRDCR/JKFHCdiS8SRgggjv/+9P/w8fuUjF5kHxfyP074jUjSpMBjVF02A73zXhp++xpMmFYaqqO7NwTw+8MExtLfZ8NNL7+CDFy+gNRhEJpeF1WJRuV6QA3L5LBx2J7Lyq8OOVDKtkvkm0+ntakfZXBZOpxNySCibycEuOWdyeSRSyTt5YmwqZ41UQ0Ieyo5UMBI7kvQ3Go3jxLFB2GyNLZhxg1fU1K2pRtzg1VS4inKWoklRmGquEUWTmgvZgQ5zTT0QUc014JpaXdHkXolcRydm8e+feR7/8ekn1KkTeQoii5wUeej8yF0nTaSSqZxYKfyZtC+cVLn44GklyhROmuw8rVJzk7IOHaZoUmFQKZpUCFCz7gXRZDMypwSN+88MY3xiDj6/B8GAHxaLBfMLy7BYLfB7vQgGvJiYnofValWVjeRkUHhlTVUtkqS9kni3OdiE8PKaEkscdruqeiQJes+dOo7L10bR2hLE9NwifG73nTLRW8l3p2YX8MjF8wgGto73NerDDV79RZ4bvPqLKUWT+oupvBFFk/qLK9fU+osp19TqiiZyMuRIf9ee12NE4PjWd156z4mQnX12ii6zC2E8++Vv4pnPPLF9fUe8lzbjU/PqtApFEz0/oxRNKoyLGaLJ3/+DFW++1dinDSoMU9HdAwHg/vuvI5vbgN1uQUswgIWlNbS1BVWlofmFMDLZLJwOB7weF2LxJDaiMQT9PtyemsHp4SGMT8/DbrWhuyuEdDaLYJMPr795FSMnjmJ1dR1ej1tVMxLbr156R9mxWGyYmplDZ3sbYLWoykgDfd3o7milaBJwYSOeRiqdKzqObKg3AW7w9I5POd5RNCmHmv59KJroH6NSPaRoUiox/dtzTaVoov8srX0PKZpUGMPqiyZ5rK1bkc/pfz3HooGu43XZEUtmyo+qBfC683C5mNOkfIi7elaIkhs8wyKhjSFu8LQJhWGOUDQxDKVWhiiaaBUOQ5zhmmoIRq2McE2trmjC6zlaTfdDc4aiSYXoqy2aVOiead3le/HkFJBOH66443LYkExnTXtvDnRvAg4HMNiXg0rsUubDDV6Z4DTuxg2exsEp0zWKJmWC07wbRRPNA1SGe1xTy4CmeReuqdUVTSRvyZOf+iI+8bu/ZloiWKmew5wmen3wKJpUGA+KJu8C/OrXbBifKP/LcYWhYHcNCRwZzKOj+yWEWptx/Gg/WpuDSKXSKneL9c7RpIMS5na1eLGwGkU0noTH5UI2l0M6k9lOzGuBRSXRlUS98meSX8ZqtWwn3xUsjZ5MV7epwQ2ebhGp3B+KJpUz1NECRRMdo1KZTxRNKuOnY2+uqdUVTcR6QTiR8r/ymFFymKKJXp82iiYVxoOiCUWTCqdQXXcX0aS57f9V79jb0wGn04H19U10d7Vjdn4JkWgM6VTmnglzP/z+M/jX16/B7XLj8rVbeODsKSwtryCZzqC9LYjZ+WWE2poxensKx48NIp/LYnp2EU1+L/p6OuHzetDV0VbXnGvt5bjBq7WIHewvRZODGdViC4omtRi1e/tM0aT+Yso1tfqiSf3NGr5RqQQompRKbFd7iiYUTSqcQnXdvXDSJNDkR7DJi9uTs6qMcjKZQiQaVydGerra75kw93h/O/7xX98AYMH6ZhQ93R3IZrNYWV5X7JwuO5r8fmxGoirJ7vLKOgb6u7GysorjQwOqjSTe5aMPAW7w9ImFUZ5QNDGKpF52KJroFQ8jvKFoYgRFvWxwTaVooteMrE9vKJpUGFeKJu8CvPS2BfH44V7PsdssyGQrzDxa4Zxg93cJeNzA/fdlIVdo0pksrt24jc6ONlW6ub2tuShU3OAVhammGnGDV1PhKspZiiZFYaq5RhRNai5kBzrMNfVARDXXgGsqRZOam7Q16DBFkwqDRtGkQoAGd+9qdWN+JbGv1UwWWJdqRAaPS3PVI+Bx2pDK5JDNMWp2ex7BQB6HK01WHmtu8CpnqJsFiia6RcQYfyiaGMNRJysUTXSKhjG+cE2laGLMTKKVexGgaFLh/KBoUiFAg7sftMGLRoG/+bYNi+Fa/9ppMDiaqwkCD78vifDaS2gPyXWjPC7cNwK7zYZ0OqOS4WayWfV7l9OJRDIFh92m3iuTzSGTzcDpcKg/l+tNFqtVFTXKZnJIZdLwez3I54FoPI58Pq9OA7kcDmVH/vvW+BQGe7vQ2hKsmBU3eBUj1M4ARRPtQmKIQwetqYYMQiOmEqBoYipuUwbjmkrRxJSJ1uCDUDSpcAJQNKkQoMHdD9rgiWjytb+2YX6BoonB6GnOBAKPPpKA3fkmzp87gX/5ySWMDA+pBLjHhvqRyWTVCarpmXm0tTUjl8khEosjFovD7/diYzOiBJPjRwewsLgCn9eN8ek55LJZuF0u3HfmhGoTaPLhxugUHA4bhgZ7cWtsSlUjsttt6prVxfedq/hNucGrGKF2BiiaaBcSQxw6aE01ZBAaMZUARRNTcZsyGNdUiiamTLQGH4SiSYUTgKJJhQAN7n7QBo+iicHAac5UAjtFkx+/+ha62tsQXlnD/SJ4RKLqfzaLRSXcFRFkfTOCeCyhTpoEm3yq9HJHqBXjU3NY29hEb3cHpmbmcXyoX/18diGMZCKJlbV1+H1eJJJpOGxWRGIJBAM+BAJ+nDw2WPE7c4NXMUL25xF4AAAgAElEQVTtDFA00S4khjh00JpqyCA0YioBiiam4jZlMK6pFE1MmWgNPghFkwonAEWTCgEa3P2gDV40ZsH3/8mK9TWeNDEYPc2ZQODsqRwuPJDbc6SZOSmz7IPH41YJd8+eOqau1ej4cIOnY1Qq84miSWX8dO190Jqqq9/0a38CFE3qb3ZwTaVoUn+zWr83omhSYUwomlQI0ODu9bLBk2sQsDDxqUwPv9uBeDqLbHZvscDgKaS1uZxckJHEIzX+cINX4wHcw32KJvUXU3mjellT6zM65b0VRZPyuOnci2uqPqLJ3FIW8Xjx+7SmgAXtzVv55/joTYCiSYXxoWhSIUCDu9fLBi+8YsEP/skKuU7EhwQKBO4/l8OF85KktbaZcINX2/Hby3uKJvUXU4om9RlTiib1F1euqXqIJiKV/MtPk/iv/81a1CRzOIDf+d+A86ccRbVno8MlQNGkQv4UTSoEaHD3ehFNlsIW/NXXrVhfr/FvxwbHt9HN/dyjaXT3TmJxaQUjw0fg8bhUhZtkOq1+dTodSKUzSCSTUlwHDlUtx6qq6kiFHa/XrRDGYgmV38RmtSGby8Jht2/biCdTUGV0ADjsDuSxdcInl8+rMWw2G3K5PBKppKqyk8/Jn1tgtVlhtVhUO6nEk83llJlcLqcq9Igdu90Oq9UKn0t8ymMtEldJaG3WrQ2GXCeS6j07KwKJ3/KeqooPLHC5nMqmvJ8kpy08Mq78XD4xwkNsyDWlYLAJvV0dqm3Bb/FDKgvJ6SWnVB3KZHH56i0M9nfD6/UgncmosfLIq0pEYjOVycDtdCKdEV53VyCyWqwqie6/vfoWHrj/FN65NoqhwR4MDfRiYyOCKzduI5VOK07yPHDfSbhcLiV+JVNpxV9Yyq+SdLcWH4omtRi1g32ulzX14DdtnBYUTeov1hRN9BFNfvRKCn/19eLWcYcTePJ/B86frkw0+dJzL+AvvvHiNoRf+chFfO6pj8HjdpY92UcnZvHvn3ke//HpJ3BssKdsO3t1rKZtGU/sP/vlb+KZzzyBlmCTYb5TNKkQJUWTCgEa3L1eNngUTQyeGHVi7hd+PoeunnFVMef4sUH1q4gQ73/gLF594x0M9nUhGk8ilUypijlXb4yhJRhU1XbeunILvV0h+P0+RGNxVUFHKuRIGeLF8BoG+jtVpZyfffg8FpdXlJAQicTg9biRyeUQDkt7O/p6OjG3EMbQQA9ELJhfDGMzGldf9ltbg5idXcRDF04jGkvgp5euYDG8iuagX40jIsLM3AK62oPw+3xYXosq4UIWdqkAJHlZpHrP+kZUJbhtDvixur4Jt9OOPCyIJ5LYjESxuraJo4O9Srg5c/KYEkhWNzaxtraB9c0o0uk0MpmcqhDU0tykfJGkt9OzC4hEY0gmUvD5PEp8+l9/9SO4cn0MXo9LiRriw+BAD9Y3NrG5GUVzcxNuj88okaqzvQ2jE9PwuN0Yn5xVDKZmF/DIxfMIBppwfXQC7a0teOX1t5VY09IcUMl6RcyZmJ7fFq3cLifi8SQmpmZx6/YUujpCiETj+PXHHlV2avGhaFKLUTvY53pZUw9+08ZpQdGk/mJN0aQxRZN4IoXPPvtV9fI7RZJvv/hD9Pd04KHzI2VP9moKG9WyLfvFj3/6z/D21TGcO3UUX/n8H1E0KXsGVKEjRZMqQK3AZL1s8MJhC/77/7Ric7M4tboCZOxaQwTedyGBUOcMlsIr6jSJz+NCLJ5UpYEXllbUSQU5mSHCQzDox5uXbyDg96lKOCIkhEIt6vfySAUdOa4hpyqkj7/Ji6WlVQwfHVCnOfI5YH5xCalUBrFEAgGfF7l8DseHBjA6Pq3ElPZQCzajMSUuiI2VtQ20NQdw6uQQksm0+rOxiVmkkkn1s2gsiVRKRJ2EEjckTc1ATxcWwiv4d4++H9duTajqPfLI2ZSJyTl0tbfC4XQo4UNOpHR1tmF6dhGra+sYOXEUrcEmdZLmjbevYX0jotr093ahu7NNCTZyekVEi6ODfdt+S3vx/eboJD7w0P24dvM21tYj6kSLEkpaAlhYXEaoJQiH046l8CoCTX7Ek0msrW6iuyukTs1IBaKBvm50d7TC5/PirSs30dHWgo1ITIkuFx88h7X1TfzgR6/i5PCR7bLPp08eVazkee2NKxg5MaR8PX92mKJJDX0eG8HVellTGyFWxb4jRZNiSdVOO4omjSmavHrpGr743Av3FAdEoHjyU1/E3MKy2hc994VPqpMjBYHhV//dz+AvX/h79eeFEypCU8SY737/5W2wf/nnn8bU7CJefu2K+ke5//K3P8Dv//Zj+LVf/uC2fWksP/vjJx/f7ic+/t4ffl79Xsb/v/7kD/C1//J377EtAo+IPf/hC1si0M7TMgWR5Vd/4QN45v/++oGCCE+aaPp3F0UTvQJTLxu8VMqCzYilcEtCL8g7vJHrBdXOr+Fx2pDK5JDNFZ9YS1tgFTpmswHBgDEJceVaiJy8OHakb0+vDvrzSl4ll0qoiROJp9WplZaWIDpCLZWY3O47v7iMNhE7HPaS7IkQJKdo5NfTJ4b27Vuu/ZKcqcHGPGlSg0ErwuV6WVOLeNWGaULRpP5CTdGkMUUTuZYjz06RYieJgjDyyScfV6dORMB4+pnnlXDS2tykTmUM9HSoUyoFoeTig6fxG499SF1x2X09pyBqiIBSOMXyvZdewfGhPiXEFASaZ55+4j3jFf5cTgx73K732N4tAMm7zS+uKN9mF8JKmHns59+/77vufG+KJpr+HUfRRK/AcINnbjwWw1aMjlqQzVZvXBEK5NQDNROgvT2PE8ez2pYSLnYWcINXLKnaaUfRpHZiVYqnXFNLoVUbbSma1EacSvGSa2rjiiZH+ruUyLHXs1uIKFznEWHk5372ghJNCoKK9BehomBvP9FETprsly9lp33xaT9RZy/bu9vubCO+lZJfhaJJKX97mNiWoomJsIsYihu8IiAZ2GR6FvjaX9uQTPAakYFY9zW1VyJYSb4qeUHcbheSqRQkX4YkTZWfOyWJqQUqEWsqs5UsVhK5yvUUyQMiyVpVH6dTJUqNxOLI57aSn0p7r9ut8p/ItZ9MLruddFZyw+byWdhsdvUvBpKEVZKjJhIp1U+StIofkpBV/FheXUc0GseJY4O4NT6FtoBHHQW9NjqNzo4QVtc30N7arPKzNDcHMHJ80AycHMNAAhRNDISpkSmuqRoFwyBXKJoYBFIjMxRNGlc0kTff76SJiCbf+s5Ld4kcBWHEKNGkIJTsvMrzJ5/6mBJydoowOyO0n2iyUwCSUzJP/+nzeOoTv6W6UjTR6C+ccl2haFIuuer04wavOlz3s0rRxFzeuxPBjk/MbCdnlWOMfd0hLK+sKzEkvLqOno6QqpJzc2xSVamxWK0YPtqPtY0IUqkUlpbXYLNaVJWdD118ANdvjav28vOBvi4lxkjukKXwmspJcv3muMrNEQz4cWN0Eu1tLQivrKpKM/efGcbla6NobQliem4RzU1N8Hqc6rim5DmRvCWSMHV+aWVbNJleWFY5Rf7t1bfR1hrEQxfOmAuUoxlGgKKJYSi1MsQ1VatwGOIMRRNDMGplhKJJY4omB+U0qfZJk4Jg0tXRqoQbnjTR6q8F/ZyhaKJXTLjBMzceFE3M5f3oIwn09L2bCHZnctbbkzNKGFleW0d/dwfGp+eV8CG5PW7cmsDxoX6V0FRymEjeDjlZIqdM7DY7ervb0d7WiomZOdV+YnJWnfiIxxOqYsyN0QlVBWZhaRmhthZViUYqz7jckjg1gkDAj8Hebrx66R1VhcZisWFtYwMuh1MliJUywlIdRxKmzsyHsbiwoBLBWm0OfOhnLuC1t67C7XSpajNSFnmwr9tcsBytYgIUTSpGqKUBrqlahqUipyiaVIRPy84UTRpTNDmoes7xoV51Befxj35YnfzYK6fJftdzdudDEcKS02Tn9ZzdIkmhz17jSU4TGV+egl87x97pm7TdndOEJ020/KunNKcompTGq9qtucGrNuG77a+tW7C6hqomrJUvY5lcHjkmNYHHDXR31X5CXNngSVlhSQQrgguf2idA0aT2Y7jXG3BNrb+4UjSpv5hSNGlM0aTw1iIw/MU3XtyGsLvyzL2q5+wnmhREkkI1m53Vc3bmNNldHSfUEsDj/8vPbedZ2VkRZ2f1np0/LySWPah6zn98+gmVcHa/Z2fJ4UKb3dV8Kvn0W/L5fO3vwCshUGFfiiYVAjS4Ozd4BgM9wJwIJqsr1a3y47gjmkiujUZ/3B4LenuMqZ5zmCy5wTtM+tUZm6JJdbgetlWuqYcdAePHp2hiPNPDtsg1tbFFk8Oef40yPkWTCiNN0aRCgAZ35wbPYKAHmJuZA77+DRuSSSaCNYP8hx5Jw+54S+UdaWryqes3ktxVEq7aLFaV4FUSwko0UpkMspmsStQqV24kSWs2l1VJWyU5q/xqs1oRicYxN7+EkRNDcDkdEB09lc6oMbJZ+e+U6u+w2RGLJ5HLZWC12JBHHja7DU6HA/lcTuVLsdusKpmsJJmVazmFhLLyayKR3E4oGwp4kEhnEEtkYLdvlQaWZLWwbAljkpPF7/XUfJUgM+aELmNQNNElEsb6wTXVWJ46WKNookMUjPWBookeool48cY7aYxPFvePfFYrcPK4BSPHHMZOCFqrCgGKJhVipWhSIUCDu3ODZzDQA8wxp4m5vD/4M5tobhvDww+cUXlJ0pksxiemlchgtVgx2N+NjUgUM7OLuP/MCaysrSuhYmT4iErSOjTYq5K5ZrI5tLcFIcljfR4PNqIRnDl5DD1d7Upc+cGPXsG65CppasLZkSHcHJvC0EAPNqJxledk+MgArtwcg9/rViKJ/OwD7z+PjY2oypMyentK5TCJJ5Jo8m1VypEqPoWEsmtrq7BbbQivRbEUXsGRIz1w2Z1wuRyYXQiryjv3nRlGwO8zFzBHK5sARZOy0WndkWuq1uEpyzmKJmVh07oTRRN9RBP5B6lS7nBYrZJKn08tEKBoUmGUKJpUCNDg7tzgGQyUoom5QA8Y7ec/nIbD9RZaWwIIr6zB5/NgfX0THrcbwSafEkPWNjaRSG6d6pDEsC63E6eOD6kkrZ2hVmxEY1hf21QjeTwurKxt4PjRAXVKREoPS6LXW7cn1Z/PLS6jo60Fy+sbOHviKFbFdjypyhZHIlHAaoHH5VJCzZmTR5FMpTG/EFa+iWizvrGpTqfMzC/h5PHB7YSyuVwafp8Xs/NrWN/YQFtrM+wOmzr5IjZENBns70FHqEUr/nRmfwIUTepzdnBNrb+4UjSpv5hSNNFHNKm/2cU3KhCgaFLhXKBoUiFAg7tzg2cw0APMLYUtuHbdgky2euPabRaVBJYpTYCerjxOnMirf5WYmVtEk9+HQJMxpzGmZxZU5RopGVzthxu8ahM23z5FE/OZmzEi11QzKJs7BkUTc3mbMRrXVIomZsyzRh+DokmFM4CiSYUADe7ODZ7BQDUw1+J3IJLIIJ0p7o6oBi5X0QWRS2qfg8dpg9zXiSczVWRVuWklT+Xz6moRn3sToGhSnzOEa2r9xZWiSf3FlKIJRZP6m9X6vRFFkwpjQtGkQoAGd+cGz2CgGpjjBu/dIISXLfi771mwuclv8WZMzZMnclhZ/x4efvAs3nznJj7w0H1wuV0q+a5cUYrFE8jl5JiVBVabVV2Jkp8XEuNuJdqNqetGkqxX+snVpbX1TRwf6lc/kwS7uXwOcqtZbEgC3lQqg0wmA5fLqZLqZrNZlWhXxBtJmJvKbNmSsST5r0q8m8nCYbep5LnxZFJdtZK71XLtqpDYt2DX6XJsJeq9k0RY+sv/pL0kAy7noWhSDjX9+3BN1T9GpXrINbVUYvq3p2hC0UT/WVr7HlI0qTCGFE0qBGhwd27wDAaqgTlu8N4NglyH+quvW7G+TtHEjKn54IUcPP4fIxaPo6uzDfF4SlUskiS8x470IZPJIhaLIxhowtjENI4f7cfE1Nx2YlypXiSJd+VskCTllUpFI8ePwOF0YHp6HseO9uPm2KRK0Ds3v6zyxGxGozg62K/y0nhcDhwZ6MX41JwSM8an51Ry3J0+rK5toCXYpPLGiHhzZKAb6xsRzM4t4uL7zsHldG0n9i3YFVGnq6sdk5OzyoerN28jmUjh/Q+cRV9vZ1loKZqUhU37TlxTtQ9RyQ5yTS0ZmfYdKJpQNNF+ktaBgxRNKgwiRZMKARrcnRs8g4FqYI4bPIomhzUNRTRpbn0FD54/jYWlZUxOz6O5OYCNjQhODQ8hkUxjMxrB6tom7FYr2tqCiMWS24lxxydnVTUgOXHS0hyAx+NEJJJAJptR134CTX4shlfQEWpVgkpz0K9OikzOLKA12IS8BUgl01heXVelowf6u7G4tHyXDyKW9Ha149b4NFxOOyLRhGqbSKaUsNPWEtxO7FuwG0+mEAz6sbkhFZL8mFlYUqLMQF83Th4bLAs3RZOysGnfiWuq9iEq2UGuqSUj074DRROKJtpP0jpwcF/R5EvPvaDKUX7uqY+p1/zss1/Fd7//Mro72/DcFz6JY4M9dfD6lb8CRZPKGRppgRs8I2nqYYsbvHfjoK7n/IMVkQhPmpgxO08OZ/Hzj+ZU/pVynqmZefT3dqHwq9jY2IxiMxJFb3eHMrm0vKZ+bW9r3neI8Mo6vB4XvB53OW68p4/RSYRlAIomhoRGOyNcU7ULScUOcU2tGKF2BiiaUDTRblLWoUN7iiar65v4+Kf/DJ988nE8dH4Er166hm995yUloFy+Nrb93x63sw6RlPZKFE1K41Xt1tzgVZuw+fa5wdvJ3CI3MGr+cTu2EsEmUnonghXUkuejDpBXfc5QNKk64kMZgGvqoWCv6qBcU6uK91CMUzShaHIoE6/BBt1XNHn6T5/HU5/4LXWiRE6dyPPHTz6O0YlZPPvlb+KZzzyh7lE3+kPRRK8ZwA2eXvEwwhtu8N6luLZpxZXLFqRSRpA9PBtW65YMIaWkdX7a2vI4dzans4va+EbRRJtQGOoI11RDcWphjGuqFmEw1AmKJhRNDJ1QNLYngT1Fk3gipa7j/OZHP4zjQ73vOXXyxedewFc+/0cUTQBQNNHrk8UNnl7xMMIbbvDepchEsEbMqOJtSE6T4RO30NneitHxGYycOKI6SyJVu1S9QR4elxvxZEJVgr41PoWBnk44XU4gJ6dUsrBabMgjD7fbhWQqpfKNyBOLJbZPDTntjvdU0Mlm80ilU7Db7aoqTjabQy6bQ1rlQ9k6ASM/t1qssDvs25V1bHYrJBmK+ORyOtWYVqsVTrsd2XxOVetJpjNwOqTKTx4Ohx2JRArZXFaNlc/nkUylVdUdGcNqsaifiw1VxcciFX4sqoqP3W5T7yIVfyiaFD+vaqkl19RailZxvnJNLY5TLbWiaELRpJbma636um9OEzlR8uSnvoi5hWX8/m8/pk6ZFK7tPHx+RP2eD0UT3eYAN3i6RaRyf7jBo2hS+Swqz4KIJj/36AZ+8sZl+LweDPZ1K5FifjGMWDyJtrZmLCwu40h/F26Nz6i8I+HwGk6PHEUw4MeN0Un1jwuStySVTmN4qE8lfD05fET9mVTekQSzkVgc58+evKuCTqCpCWdHhvDOtTElSkgektbWrbwnkg/FYbPB7XFhfmEFgSYvZueXVCLZ/p5OzC2EVfLYRCKJi++7Dz+9dFVV3Rkc7MHCYhipVFr92YVzI2jye3H52qiq4PP9H76CwYEe5DI5pDMZtLcF1R6gt6sD41Mz8Hg8CDb5MD23qPr19XQqLl0dbRRNypti2vfimqp9iEp2kGtqyci070DRhKKJ9pO0Dhxk9ZwKg8iTJhUCNLg7N3gGA9XAHDd4d4sm3/iWFRssOWzKzDx/Xw4f/MAa3nj7Bjo6WpFJZ9AeasFmNIbl5TV4vG4kE0l43G7MLoYRagmqkx1ul0sJG4tLK0o8Wd3YxNzc0pbY4XTg9IkhTM7MK9FkbT0Cp9MOCyx3VdCZW1xGR1sLltc3cPxI35Z4YrFi+Hg/srk8ctkMotGE6hNPJFVlnZagHyurG4jG4+pEyWY0jiafB+NTs2gONKmqOym522WRky5J9HW3o7e7E69eegedoVbcGJtSooi81/rapmLsdjvR5PcjnUkhGk0iloirMsgrK6s4PjSg2nS0t1I0MWVGmj8I11TzmVd7RK6p1SZsvn2KJhRNzJ91jTfivjlN3r46hg9dvH9PIj98+U2cO3WU13N4PUe7Tww3eNqFpGKHuMF7F+Fm1ILFxTzyUotW8+deBWdsKqeJBdmc3vlCHA4LBvr29vHqzXGcGt66rlPpE75TQSd0jwo6u8cop0+lft6rP6/nVJPu4dnmmnp47Ks1MtfUapE9PLsUTSiaHN7sa5yRi6qesxOHJIV95dI15jS5A4UnTfT6sHCDp1c8jPCGGzwjKJprY3XdirVVEXf2HldyYijRJKu3aGIutfJH83gt6OrMqtMqh/VQNDks8tUdl2tqdfkehnWuqYdBvbpjUjShaFLdGUbrQuDAnCbPPP2EKjssjwgmL/7gJ3juC59UVXX4MKeJbnOAGzzdIlK5P9zgVc7QbAvTs8DX/tqGZOLwvsSb/c6HOd6jjyQwF/4H/NwHH8JPL13Box94UF35cdxJ4BqLJ5DLZZVQZbFa4HQ4YLPZkMvlYLPaEIvHVQJYh92BvGSwvVNq2eVwIJFMbSexlaSx6XQG8vNkOg2306kSycpD0eQwZ0D1xuaaWj22h2WZa+phka/euBRNKJpUb3bRcoHAPXOavHrpGp5+5nklkvzt3/8LT5jsMW940kSvDxM3eHrFwwhvuMEzgqK5NiiamMtbRJNo8seqIo7f74XT4YLf50Z4ZU3lUclksip/SjDQhNHxKXS2t2F2fhHBYBMeOn8WE9OzqmJOJBKD1+NGJpdDOLyi8resb0QRT8SVDfnfyeEhjE9MY/jYoKoq5Pd5KZqYG25TR+OaaipuUwbjmmoKZlMHoWhC0cTUCdeggx2YCFaEk9/7w8+rHCYsM/zeWULRRK9PDjd4esXDCG+4wTOCork2KJqYy1tEE7vzTXzg4ftx9dY4Nu4kl5WTJEcH+5BIprEZjWB1bRM2iwUOl0Nd5Emns3jfhdNYWVlXbeYXl5BKZRBLJBDweeH3eZDO5TAzu6iq8kjCWafLgfX1TTT5fUqQ6e4MUTQxN9ymjsY11VTcpgzGNdUUzKYOQtGEoompE65BBztQNBEuIpx86zsv4XNPfQwet7NBUe392hRN9JoO3ODpFQ8jvOEGzwiK5tpYDFswOmrFfilLbNYtf5jSxJi4dIbyGB6uLD+MnDSZnl3AsSN9+zolZY9FLAk0+d7ThtdzjImlbla4puoWkcr94ZpaOUPdLFA0oWii25ysR3+2RZPV9U18/NN/Bqmac9DDUyfvEqJoctBsMffPucEzl7cZo3GDZwZlg8eQYwz7JIGVkXxuO2CxIBpPGzxwo5o7ALgJWCiamAD5EIbgmnoI0Ks8JNfUKgM+BPMUTSiaHMK0a7ghizpp0nBUSnhhiiYlwDKhKTd4JkA2eQhu8EwGbsJwumzwJqbncOntGzh94gjmFpdx4b4RleTUYrWqxKjxWEJypyqBx2a1qqSnVosFOZU01YZ0JgubTdoCo7en0NfdAZfLqZKtylWWmbklHOnrRjaXVX3EhtViRSqzJRY5bHbYHXYxr35utVrUuJFYHJKPNZfPwmF3IpvPKhHq1vgUerva0RIMqHLNksx1Z99MNqvsJFMplbDVbrep3+fyW21T6TRcTifsNpsaRx7xX/rFYom72ksSWXkHh8MBu7wjoOxKf/lVWDglcWw+j4nJObQ0+zB8pBPh9aQJM4hDmEWAa6pZpM0bh2uqeazNGkmXNdWs9z1oHPl7iw8JGE2AokmFRCmaVAjQ4O7c4BkMVANz3OBpEASDXdBlgyeiydXrY0r08Pm9SpCYX1hWuTzsdjsy2Qy8Ho+qMjM1s4BQW7MSR86cOo7B3i7807+8ivXNCI4d6Ucg4Mft8Wm4XS488oELmJldgM1mx9zCEoYGe3H95riqOCOChdNhx5GBPty4OQ6f34O5hTAeuXheJWqdmplHKp1BMODHjdFJ+L1eBANe3BqfgdfjwlJ4VQki58+cRCQWw9Tswnbf+cVlzC2GsbERRV9PB+YXw/B5JTGsHQuLK+jublcJXm12G7o7Qirpa0d7K6RfNBa/q71KHhtPqISxLcEgOjpa4fe68c7VUdx/7qTKj7IZjSo7FlFu8jk8eO4oRRODPyuHbY5r6mFHwPjxuaYaz/SwLeqyph42h8L4FE10iUR9+UHRpMJ4UjSpEKDB3bnBMxioBua4wdMgCAa7oMsGT0STeDyJ/t5OXHrnBrwuF2LxJEKhZnjcLqSSKXVCY3Y+rE59NPn92IxE0RJsUkKJVKKRZ2V9E+dGjuH1t64pUeThB85idX0DuTxwe2IanaFWbERjqoJNJp2B1+dGe2srpmYXVbnfo0f6kM1m0N/TpeyLiCJJVheXVpRQIj7NLoYRagkiGk8gnU6jsyOE+YUwBuQky52+Xq8b//N7P8Sp4SG0NAcwPjW3fU9KKuO0tAaRy2TVCZk88krgkRwmicTW6ZBCe/FxMbyqTsEk4im0h5rR1hJUp1vEj56OreSvchJF7HS2tcJut+KBs0MUTQz+rBy2Oa6phx0B48fnmmo808O2qMuaetgcKJroEoH69GNf0eRLz72A+cUVlfxVns8++1V89/svo7uzTZUgPjbYU59ESnwriiYlAqtyc27wqgz4EMxzg3cI0Ks8ZL1t8KZnFtDb07F14uLOk0ikcPXGGO4/e1JduznouXz1FkZODCnRpdSn0FdOzFy7cRtnTx27yxexd+XGbZw+MXSX6f3GlBMmItQUBJtQa/CeLl25PobBvk4M9rRSNKDcIAgAACAASURBVCk1eJq355qqeYDKcI9rahnQNO9Sb2tqpbh50qRSguy/F4E9RZNCUthPPvk4Hjo/clf1nMvXxlhJZwdJiiZ6fbC4wdMrHkZ4ww2eERT1ssENnl7xMMIbh92qEvyuRVJGmKMNTQhwTdUkEAa6wTXVQJiamOKaencgKJpoMjHrzI19RZOn//R5PPWJ31InSuTUiTx//OTjGJ2YxbNf/iae+cwT6ohyoz8UTfSaAdzg6RUPI7zhBs8IinrZ0GWDNzFlwUv/XPrJDr1o0hujCXz40SwG++9R/snoATW2xzVV4+CU6RrX1DLBadxNlzVVF0QUTXSJRH35sadoEk+k1HWc3/zoh3F8qFeVIt556uSLz72Ar3z+jyiaAKBootcHghs8veJhhDfc4BlBUS8bumzwbk9Y8J+/RtFEr9lx+N780i9PI7x8vayqSnIVS/LkqKpLANxOJ3K5vEoqLMmFpaJRNptHKr1VgchmtalEw9lMTlU5kv+WikQOqUyEHKSKkeTVkQpHUulIbEn1IrfLiYTk3LHaVCWnVCajxkqmM3A6bMjn8qpfJBrbtidVnNxup7q6df3mhKq8JEmKxbZURRKXpcqTy+nYDgLX1MOfj0Z7wDXVaKKHb0+XNfXwSWx5QNFEl0jUlx/75jSREyVPfuqLmFtYxu//9mPqlEnh2s7D50fU7/lQNNFtDnCDp1tEKveHG7zKGepmQZcNHkUT3WaGHv6IaLK5OVpWVaVjR3pxc2xKJf1dWFpGHhZ0hlpgtdpw6/YUcrksAk1NODsyhPHJWaxvRlXS3eagXwklQwM9KgGvJO6V6kZLy6tKcGkONKG9rQWjE1OQfDlSA1py4GxsRnFrbBIjw0dUqepUKq0S+144N4JQWwtuT84gmUoreyLALK+uw+t1YXV1Az1d7VgMr+H40T6Vw252bgEf+dDDaG15N4cN11Q95qSRXnBNNZKmHrZ0WVP1oEHRRJc41JsfrJ5TYUR50qRCgAZ35wbPYKAamOMGT4MgGOyCLhs8uZ7zrb/hSRODw1vz5n72g9NoaU6UVVXpzMgxVQZaRJO19QhCrc1YWVtHIpGGy2WHz+vB3OIyOtpaEInG0dXZhrGJWaSSSZweOapOo+RzwPzikjpVIsLLyeEhBPxe5LI53Lw9hdbmgKpaJGWhRRDZ3IzA5/Oq0ydyXCQWS6Kvux3HhvpVBaZEMr1tT/r4vG51ukSUl9WNiBJj5NTK+toGzp0eVpWbCg/X1Jqfzu95Aa6p9RdTXdZUXcjypIkukagvPyiaVBhPiiYVAjS4Ozd4BgPVwBw3eBoEwWAXdNngRaIWJBMHV7Yx+PXr0pxcS3E5rIgn5ct4bT8udx5+nzE5TUTUmJ5dUKWdi33K6XMv2zvtyamUjvY2BJp8RbnDNbUoTDXViGtqTYWrKGd1WVOLctaERhRNTIDcgEMUdT1nN5dzp44yp8kdKBRN9PrUcIOnVzyM8IYbPCMo6mWjVjZ4OQBWvdBp643TbkXA52DJYW0jVJ5jXFPL46ZzL66pOkenPN9qZU0t7+1K70XRpHRm7HEwgXsmgr344Gncf+Y4vv7tf8RTH/8teNxOVUnnkfffp0oR82FOE93mADd4ukWkcn+4waucoW4WammDd+XaGDo7WjE6PoORE0cUynwuB7vNjhzy8LjciCcTKsfErfEpDPR0winXJHKSVDMLq8WmrlK43S6VwNPjdsFmtar8E5KsUxJwpjJpuBwOJNNbv1ptVpW3QvVzOWG1WJHOZFXCT5U0NJuDJPWU/BTRaBwnjg2qn8ficTgdTmQk4afTqdqJbbdra8x0OgOL1QLrnf8We9l8Dg55F5V8tPyrShRNdPuUGeMP11RjOOpkhWuqTtEwxpdaWlONeeN7W6FoYgblxhvjwJLDgmRnieFXL13Dt77zEj731MeUiNLoD0+a6DUDuMHTKx5GeMMNnhEU9bJRSxu8jfUIfnLpsspFMdjXrQSM+cUwYvEk2tqasbC4jCP9Xbg1PgOvx4VweE3lpggG/LgxOqmqzC0tryGVTmN4qE/lsTh2pB/Xb42raig3xybhcDhU0tFHP/AAboxNor01qESVufkwutpb4fG4Mbu4jJ7OkBrb5/WqiiiS8FOEk0cunsfq2iay2Sym5pbQ39OBldV1JdBEYwklnsh6LXkr5BpNc3MAl966jo5QKwYHe7CwGIYFFlx837myJwpFk7LRad2Ra6rW4SnLOa6pZWHTulMtralmgKRoYgblxhvjQNGktbkJz/ynr+PpP/gdtfmTqjo7RZTGQ3b3G1M00WsGcIOnVzyM8IYbPCMo6mWjljZ4a6sbeOPyDXR0tCKTzqA91ILNaAzLy2vweN1IJpLwuEXUCCPUErxTDtalkmlKEk4RT1Y3NjE3t6R+5nA6cHSgFxMzc6rk7I1bEzgy0IPpmQX1a3uoFZNTc5hbWELA70NTwIf2VqmaMo1jg30Yn5pTCTxTqQxW1zcwfGwQ3R2tqgqLnC65OT4Fr8uFjUhUVVYRkWSgpwsL4RXYbTbMLiwpn+LxFNrbmpWAkkqlEAj4cfLYYNkThaJJ2ei07sg1VevwlOUc19SysGndqZbWVDNAUjQxg3LjjXHg9ZzfeOxD6kqO/Eua/Pe3X/whXn7tCk+a3JkrFE30+tBwg6dXPIzwhhs8IyjqZaNWNniS00SevfKaXLlxG6dPDOkFdoc3GxuR7d/NLYTR0hJER6ilav5SNKka2kM1zDX1UPFXZXCuqVXBeqhGa2VNNQsSRROzSDfWOEVVz1ld38THP/1nePvqGLo72/DcFz6JY4M9jUVqn7elaKLXNOAGT694GOENN3hGUNTLRt1s8JgpdntiUTTR6zNmlDdcU40iqY8drqn6xMIoT+pmTTUICEUTg0DSzF0EihJNyGx/AhRN9Jod3ODpFQ8jvOEGzwiKetmopw2e5A6RKzY+v1flPJErN5Jw1W63qfwnOUm0arcjnkjC6XKopKvZXE5d45H/lvaSi8RitcJiAbKZreStfq8HmUxW9YMFsFgsmJqeV4E8OtR3lx1JHru7v9ViUcldxY6MJ0ln5ZH/l7HTyTRujU9jaLAXzcGmu8YWf+V/mWwWLqdDJaV9/e1ruP/MMGxWm0pCK89W8li7SjJrswFtAQ/mlmMqoezOdxIOG5sR3BidwNLyKrxuDzwel8qhsra+iX979S08eP9pjE1Mq9wv6oUBnFW5YZqQSKXgdDhUslsZT64c8TGHANdUczibOQrXVDNpmzNWPa2pRhCjaGIERdrYTeDAnCa7T5QwEezdCCma6PWh4gZPr3gY4Q03eEZQ1MtGPW3w4vEkfvSTN9Dd0aYEjs1ITOUmKSRsdTrs6su+JGwVgaQz1IqJ2QXEY3GVTPaB+0awsLgCn9eN8ek55LJZVe3mvjMnkE6nVR6SVDaL6zfHkUgkVBLZdDar8pAsr6zj1IkhzC8sw+/zqMSyknR2oK8L126Oq9wl950ZVsLE6uqGmgRrmxFEIlGEV9Zx36nj2IjE0BzwbyellbElqWyoLaiq7Pzsw/fj+ugkMpmMEjOkQk9rcxCZXA7h8IoSQ1qCQRw/2ouutib89PKYyvEyPjmLoYEeTM0uqES1In5MzswjEokj1BrEG5evo7O9TV1xuj01i8HebmV7YnoeXq9b+frKa5fR2S75WiKqypD49euPPaps8TGHANdUczibOQrXVDNpmzNWPa2pRhCjaGIERdqoWDRhIliKJjp/jLjB0zk65fnGDV553HTuVU8bvCkRAqJxTE7NIxj0I5ZI4OzJY9sJWyV5rBzjCDT5EYnFVBLYG2MTqmSx2+VAT1eHaru2sakSxYq940P9qrKN/MzrduHarQnYrVZ14kKSwyYzGfX7VCajkr6K+BIKNStRZmJyViV3FUEl2OTDYH8PNjY2cemdm2pKyMmR9rYWeDxOdaolnkht95UTMzK2iDD9vR2YX1zGhXMjeOvKTVWNx+vx3jmrAvWeAZ8XSytryqfO9hZsbKxjanYF3V0h2O125f9AX7dKVOtyutRJk67ONpX0Vk6/PHThjDrNIvZDLc149Y13cHL4iBJiRCySkza93e1KADp+dADTs4s4f3aYoomJH26uqSbCNmkorqkmgTZxmHpaU43ARtHECIq0UbFowkSwFE10/hhxg6dzdMrzjRu88rjp3KteNnhbKU3kqsjW1ZdaeESU6e/tKtlVSXx77EgfpmcX1K+7n0JOk8s3Z9HWElQCDp/aJ8A1tfZjuPsNuKbWX0zrZU01KjIUTYwiSTs7Cdx1PUdOkTz5qS9ibmF5X0pMBEvRROePEDd4OkenPN+4wSuPm8696mmDl8sB1r3K6+gcgCr4xkSwVYCqgUmuqRoEwWAXuKYaDFQDc/W0phqBk6KJERRpYzeBknOaECFFE53nADd4OkenPN+4wSuPm8696mmDJ7k73G6XulZzangIDqdDXXvJZDMqJ0geeUii1kQyBZfLBclhmkylVZ4Tyd0hSVQjsTjy+bw6sCLXefZL0Cp2bDYbcrk8EqmkOs2RSqbhcbsO/WQHRROdP3Hl+8Y1tXx2uvbkmqprZMr3q57W1PIpvNuTookRFGmjKNGEmIonwESwxbMyoyU3eGZQNncMbvDM5W3GaPW0wUul0vjhv72ucoe8+fZ1HDvWryrbzC4sqXwcc/NhtIdaIAlj7Q4bbo/P4P0PnMXtqTn0doXQ19OF67fG0dfbidHbU+qk50Bv53aCVkkOKzlDJLnr6Pi0uhozv7iCvu6QSpoqwkywyY9zp4+bEbp9x6Bocqj4qzY419SqoT00w1xTDw191QaupzXVCEgUTYygSBsUTQyeAxRNDAZaoTlu8CoEqGF3bvA0DEqFLtXTBi8ai+Onb1xRVWpe/unb8Hrc8Pk8SCZTkD+TRK2LK6twOp0IBpsQjUTViROPy4lQqAV93Z2YmJlTp1Ek8Wo8lUTQ51MJWqPxuEoOu7i0rJK7bmxE1GmW25MzqsLORjSGoN+n2v3M++6rMCqVdadoUhk/XXtzTdU1MuX7xTW1fHa69qynNdUIxhRNjKBIGxRNDJ4DFE0MBlqhOW7wKgSoYXdu8DQMSoUuNdIGLxZPqOo2Xs+dKjetwQrp6dmdoomecanUK66plRLUrz/XVP1iUqlHjbSmFsOKokkxlNimVAJ75jQp1Ugjt6doolf0ucHTKx5GeMMNnhEU9bJRLxu8reo5JjwW/Sv0OG1W+L12rGymTABS3SEseYvKRcMH4Jpaf7OAa2r9xbRe1lSjIkPRxCiStLOTAEWTCucDRZMKARrcnRs8g4FqYI4bPA2CYLAL3OCVBnR80orJKRFO9H1EPJIqQhlRkmr8GT6WQ3cXRRMJI9fUGp/Me7jPNbX+Yso19e6YUjSpvzmuwxuVXD3n1UvX8K3vvITPPfUxeNxOHd7hUH2gaHKo+N8zODd4esXDCG+4wTOCol42uMErLR5vXbbhb76tt2hS2hvp3fqXfnka4eXrOH3iCOYWl3HhvhGVc8Yi1ZDyecRjCWTzOdgsVlU5CRbAarEgl8/DarWopL/yM3ncTqeqdiTVlOx2O+x2G7LZPFLpFNwup6qqlMuK0iQijQVWmxXxeAJSlWn4+CACPh+yuRySqZQaQ3LjSFu58uW025HJZWGBRVVjksdusyOPHGxWG7K5LBx2O5Lp9HYFJ6nYZLfZig4A19SiUdVMQ66pNROqoh3lmkrRpOjJwoZlEyhZNBmdmMWzX/4mnvnME2gJNpU9cL10pGiiVyS5wdMrHkZ4ww2eERT1ssENXmnxoGhSGq9KW4tosrk5CqkC7fN70dvVjvmFZfh9HiV8FASQSCSmBAiP142r18dw5tRxHDvSi5tjU4jF4lhYWkYeFnSGWmC12nDr9hRyuSwCTU04OzKkqiFJ1SWX04Gl8CqCgSaMTUwrcSTU1oLF8Cp8PjdSqYzKiRNeXUdPRwiTM/O4/8wwpmcW0dLchJn5sKrUlMvnkEpmlGCzsRlBc6AJi+E1HD3Sg+WVdSXQSDupwFTswzW1WFK1045rau3EqlhPuaZSNCl2rrBd+QRKFk2+/eIP8fJrV3jS5A5ziiblT75q9OQGrxpUD9cmN3iHy78ao3ODVxrVt9+x4b/+N540KY1a+a1/4Ren0daSQH9vJy69c0NVQJKTHaFQMzxuF1LJFDY2okhlMrA7bfC6PVheWVP/kHRm5BimZheUaLK2HkGotRkra+tIJNJwuezweT3q9EpHWwvWNiPwedwItbYgGo9hdW0TdqsV/iYvEokUllbWEGoJIhpPoLczhPHpeXXSRSoqWS3A7MIybFYrnA47+ns6lUAzv7ikRBYRZ2x2G9LpjKralM/lYbFa1OkYqfRU7MM1tVhStdOOa2rtxKpYT7mmUjQpdq6wXfkE7hJN5BTJk5/6IuYWlve12N3Zhue+8EkcG+wpf9Q66knRRK9gcoOnVzyM8IYbPCMo6mWDG7zi4yGnHRaXLIhGi+9zGC0tFgvsdgvS6dpPahIMAG1txuQ0SabSmJ5dKOl0R6XxM3JMrqmVRkO//lxT9YtJpR5xTaVoUukcYv+DCZR80uRgk43VgqKJXvHmBk+veBjhDTd4RlDUywY3eMbGI5/LqXwbh/mw5PBh0q/e2FxTq8f2sCxzTT0s8tUbl2sqRZPqzS5aLhBg9ZwK5wJFkwoBGtydGzyDgWpgjhs8DYJgsAvc4BkLVK5yvPza27hw7gTeuT6KsyPDcDocsDtsKgmpJBGVaxxWixUpSQrqdCKVScPv9agko/FEUuXmkKscDocd127cVlc6utpDKk9GIcmo3+dFIplEJpNVCVDFrlxXkcchJYc9NsyFo6pcryQgTWcycDqc6iqJjCO/l8SoMgaf2iDANbU24lSKl1xTS6FVG225plI0qY2ZWtte7iuafOm5FzC/uHJX7pJ4IoXPPvtVXHzwNH7jsQ/V9psb5D1FE4NAGmSGGzyDQGpkhhs8jYJhkCvc4BkE8o4ZEU3+5n/8o6rGEgj40Rz0YzMSU1dC4skU7FYLpmYlaWgA80vLSrgY6OtS+TWisTjSmSxWV9Zhs1uRTmUQTybh9bqAvBWBJp8STXw+D4YGevH6W1e37CyuoK87hEg0rn7/xltXEYtGcfr0CczNh1Uy056eTiwsLmNxaRkjw0dUAlOHw4Ff/PBFYwHQWtUIcE2tGtpDM8w19dDQV21grqkUTao2uWh4m8CeoklBHPnNj34YD50fuQsXSw7fPXsomuj1aeIGT694GOENN3hGUNTLBjd4xsZj50mTf/7X19HR3gqH04HBvm5MTM2qpKJyKsTn8SCbzyCZTKO5OaASim5sRLARiWJ5eQ1Nfp9KHprLZpFOZ1UyUTlR0t7WogQWsfvm5Rvo7gzh9uQM3C6XGkeSlSYSCSwsLGB1M4GA34fNaAyhUAsS8QTWNyKqryQoleot/b1dxgKgtaoR4JpaNbSHZphr6qGhr9rAXFMpmlRtctHwvUWT1fVNPP2nz+OpT/zWexK+suQwRROdPz/c4OkcnfJ84wavPG469+IGz/joyDUcq9yDKfGZmVtUYomcKKnk2Z3T5MqN2zh9YqgSk+yrAQGuqRoEwWAXuKYaDFQDc1xTKZpoMA3r3gWeNKkwxDxpUiFAg7tzg2cwUA3McYOnQRAMdoEbPIOBFmEuhxysqF6yWCaCLSIINdiEa2oNBu0Al7mm1l9MuaZSNKm/Wa3fG+2b00Su4Tz9zPN3lRculCT+xO/+GnOa3IklRRO9JjU3eHrFwwhvuMEzgqJeNrjBMzceUjz38tVRrKyuqSSwfr8Pg/1dKiGrw2ZHLJ5ELpeB1WLbSuLqdMB+pxpPLp+H02FHJBaHy+FAMp1GPpffTiZbSPja0uTDykoY//b6dXVyxWq1Ibyyiva2ZpXPZGx8BplsFs3BJkxMzSkf4rEEPB4XLr7vnMp3Ir61tgRhkcSxmZxKViu5UbLZ3HbiWcnbkkimYIFF5VqR329VDsojk8nBbrchm83CYrHCZrOoq0nyTuK79JNktnIiJ5/PI5PNqbF2toknErDbHLBYoZLoFsaQ996dTFeuPInPYk+S3AoL4WW1WpHNZFXSXbnelEgkVcLcQgJcSbgreWMkWa+UakYe6l0LPjpdDjjtDqRSaaSzGXjdbpV7RvpLwl55MpJYN5VW7y++2a023J6aRX9vJ5p8XsMmGNdUw1BqY4hrqjahMMwRrqkUTQybTDS0L4F7Vs8piCRzC8vbBv7yzz/9njwnjcyXoole0ecGT694GOENN3hGUNTLBjd45sZDRJMboxN4+8otlX8EViuG+rtwc2wKQwM92IjGEY8nMHxkAFdujqGtJYDl1Q3EYnE8eP60+vIuAsH8wjL8Pg9sNiuWltdUMtkbo5MYGuxFs98Dr9uGueUI2lub8eaVm8hktvKnPHLxPGbnw7g5NqnG62xvU9V+Lj54Dldv3sb7HziHqzfGMHxsEKO3p5R9aSs5U0QQGT7av514dnllHal0BmkRRoCtvCp2mxJdJIfL7PwiPB4Pgk0+uFxOVf2nkJjW7/fi5PFBBANNSii5fmscTqdju01Xeys8Hjdm5pfQ2dGmfHa7HEqgQT6vxpR8LQvhFSUqib1IJAav14NQWzPkqpOIGJIvxmG1YWpuERbkYXc40NneqhLzinD0yuvv4PhQP/7pX17FsaN9yKbzCLUFsbK2jlgsoUQYu92OkeNDuD0xDYvVBhFz5F2avHcEEasFyUQSkc0YvD6Pyjkj+WJEAOvr6TBsgnFNNQylNoa4pmoTCsMc4ZpK0cSwyURD5Ykm5HYwAYomBzMyswU3eGbSNmcsbvDM4WzmKNzgmUlbHWRQoomcGAk2+VVZ4oDfj+X1DZw9cRSrG5tIxJOw2WyIRKJwSRlhC9RJkIG+biVizC+E1RfyUKhZnXiYmJxV4oD8vKszhMHudthtefzo1SvqNIdU22lu8uMnr13Gr/7SIwgvrymhRXyQ0xhyOsLjdKpSxA9dOAPJgdLf3YnZxSVl/8atCSUsLIVXldhQSDwr1X/kpIb874gIPptRJehIctloLKaElGhU/AwqAePW2JQ6eSFihQgkPV0hWGBFqK0FEzNzSnCRNiKGNAV8aG9twc3xKXhdLkzNLKgEtlIz2eV0YGVlAx73nZMl6YyyJ8ltRZyRAyNSKUiS6spJGzlZUijpLO/b0daqTr4cGezFK69dViWdx8an0dYaUKdi5ATJZjSOjrYWbEQiqjy0vKOIVBI/OWmSz+WwuLymJo+INsJdTqggb1GiTai1WfUR8cSoh2uqUST1scM1VZ9YGOUJ11SKJkbNJdrZn8A9T5oQ3MEEKJoczMjMFtzgmUnbnLG4wTOHs5mjcINnJu0t0WTrGoj8l7FPIeFrpTlNZueX1PWZo4O993RwfnEZbS1BLK+uq18LV16KfavpmQV4vW51DWi/R8QdeeRqUTlPLJ7YEpha3x1jcXlVXdmRykNGPFMz83dVIZKrRG9evo5TJ47C7XYaMYSywTXVMJTaGOKaqk0oDHOEa+rdKOXvLT4kYDQBiiYVEqVoUiFAg7tzg2cwUA3McYOnQRAMdoEbPIOBamCuUtFEg1egC3sQ4Jpaf9OCa2r9xZRrKkWT+pvV+r3RvqJJ/P9PnvbZZ7+K737/ZXR3tqmEsD2dIfWziw+eZiLYO7GkaKLXpOYGT694GOENN3hGUNTLBjd45saj2pVz5G0ompgbU7NG45pqFmnzxvn/2nsTGMmu60zzj33JiNz3fanKWlnczMUcS9R4mW6zrXa3AKtluAG7abAJaQYNywIJUYYhCIJNQoRkow1IzSFMewYjmE0D7AHYoq2RZdC0LXNRUcWt9srKfd+32CMG5xYjGRWMzIyMdyPyxss/AKpKWe+ed953bsQ9+ce953BNrRzrSt2JaypFk0rNtaN8n11Fk+889xL6e9rxq7/4IJ793ov4rc/9Mob6OiFddf76ldfwjSceVWd7j/qLoolZM4AJnlnx0OENEzwdFM2ywQSvsvHI1jSRGh8zswvo6W5HQ12t6vYSicbgdrmRyqR2uuPIz+W/WDyhanlIN5ps95jsGKlbIj/fjkRUtxmfx4m6sA9LazGk0ilVyFS9MlA1R6TYiBwRyu8EE08m1bEVqQEinW+kS490tpFxUudDapFIkdNt1dXGpWp2SI0Vl9Ol7qP8THzceUa61WS72kjXGjm+I2Oy3Wt+9t5lZbOluRHTM/NwulyqdovUJbn3rlOq3orUU5lfXMJdZ4fxN3/3E/z6rz6MmpqgOt0kzyx/ejyuW3+6b3WzseuLa6r9Iss11X4x5ZpK0cR+s9q8JyoomqysbeCpP34eT3zpC2p3Sa5oIh11nv3ui3j6a4+hoS5s3hNV2COKJhUGvs/tmOCZFQ8d3jDB00HRLBtM8CobDxFNLl29ifM/+xCxRAr3nhvGytqmqq+xtr6Jgb5OjE/OYGxyDjUBP1ZWN1Q3l/XNbdx9xwlIx5qGuhAmpueVSOHzeVQXGrlORATpNtPd0YyV5WXA5VfdXz68dANnTg+pAquT03NKlJBOM9IJR7rZpJFRf955Zlh1jRG7Uo9DOtp0d7WpLjrStUYKykoRVKlBIj8bGujB3PyyEi2kZe/84ioG+zuVj1ITRdr8Hh/oxszcohJepFjt+samsn/3uZOKg3Tm+YUH7sLI2BRSySQG+rpx8eqIEo/CoSBOnxzEO+9dUvdfWV1XhWrF9k8vXFT3a6irUR187jh1HGdPDVU2mBW+G9fUCgOvwO24plYAcoVvwTWVokmFp9yRvN2BRRPuNLl9nlA0Met9wwTPrHjo8IYJng6KZtlgglfZeOTuNLk5NoWE6vjiweraFpwuB/q6OxGLRzE1s4gzJwdVa+GerlZcvjaKu+84qbq8pNJiJaN2eDicwMnj/Vjb2ILf61XdZmqD7eHbqQAAIABJREFUAaRTMUQTDrWzY3FpRRVSlU48IkbcnJhCR0sTEsmkGifWpJ2viBnSNtjn9+LUsQHV0cbn8UAKvsqOEOn2I6KJ7HhZXF5VIsvoxIzyRWzJvaQTTSadgcPpwMzMAro6WpUgIrtM5OctzQ3K/t1nTyjhRQq9ShFZ2ZEiXxKJUJTtQpNBBssra2isr8NgfzcuXh7BnWePI5lMYWNrGyNj0wjX+FWHII/XgxNDfZUNZoXvxjW1wsArcDuuqRWAXOFbcE2laFLhKXckb7fr8ZyXX30db5y/iKf+y2/hz174H+p4TmN9GF/86p/g85/9DGuafDRdKJqY9b5hgmdWPHR4wwRPB0WzbDDBq2w8pKYJ4IQz57bZDi/BgO8TnV4O6p1qJexyYKivFYtrsT2HZ7u+5Hd/Ocg95diQ7F6RVsS7vXTc5yA+2fVarqn2iyzXVPvFlGsqRRP7zWrznmjP7jmyq+R3fu+Z27z+yz/9Ku6766R5T3JIHlE0OSTwu9yWCZ5Z8dDhDRM8HRTNssEEr7LxyDYadpTxtiwEW0a4h2iaa+ohwi/TrbmmlgnsIZrlmkrR5BCn35G5NVsOWww1RROLADUPZ4KnGagB5pjgGRAEzS4wwdMMdB9zIprMLSzj8pURuNxODA/1q5pkUkDV6XDsFFV1uVxwOZ3qWIwcewkG/cry9vatIqzyc6fTCTnCIgVds8VZ4/E4Aj4f6kIerGwk1Bgp0ipFVcWeHMGJxuPq2I3UBvF5vepojNgXu6/900/R3FSvjtKsrG+ivi6M+YUltLY24fTwANZWN3Ht5jhSqTRODffjBz/6J/zGv/0VuNwuOBxQR2fkJYVkj0Jx1krOHq6plaRdmXtxTa0M50rehWsqRZNKzrejei+KJhYjT9HEIkDNw5ngaQZqgDkmeAYEQbMLTPA0Ay1CNDn/7iVVIDUSjeP6zQmEa2oQDHghxd3DNUHU1YZw8epNtDTW4647hvHexevoam9GKFSjaoo01Ibx/uUbaG6sQ0wKribT6GhtwLWRCQz0dmJuYRFDfW24eH0ataGQKga7srIOp9sBr9uLttZGVaw1nU6ju7MVN0anlP1jg7148/z7WF5ZxwP3nsWFD66itaURrU0NePfDK0inM6quiggiY5OzEFVE6p08/L/ci/HJWYxNTGNqZgFNDfXYjkaORHHWSs4erqmVpF2Ze3FNrQznSt6FaypFk0rOt6N6r9tEEymIJjVL/tN/+Nf4i//+t3j/0sieXO44NYjvPfPlI91Fh6KJWW8dJnhmxUOHN0zwdFA0ywYTvMrGQ3aaSDeZ8fFptbskGAhgY2sLPo9X7SgRQUL+W1xaVd1jpMhpIpFAc3OD6n4jr/nFFWxubsHldsPtciIaiyk7S2vrODs8iJvjk2iur8H0/Dq8Xo+y63Q5kUwmldARCPgxMj6tiq7WBIMI+DzKfl93B0bHp1RXmsaGjzrd+LxIJ1NIptJKoKkNBVVh11MnhtDR2oi33vkAn/r5e1RhWHl9eHkEbc0N6r5HoThrJWcP19RK0q7MvbimVoZzJe/CNZWiSSXn21G9177dc4b6Ondlky0W+40nHkXA7z2SDCmamBV2JnhmxUOHN0zwdFA0ywYTvMrHQ47KyFGc/FcxRVWL8XZtdQ2hoAcub7Dg5ToLzxbjD6/RQ4Brqh6OJlnhmmpSNPT4wjWVoomemUQrexGwJJrItt5nv/sinv7aY0d2twlFE7PeYEzwzIqHDm+Y4OmgaJYNJnhmxUO8kd0oVgrFshCseTHV4RHXVB0UzbLBNdWseOjwhmsqRRMd84g29iZgqaaJdNf561deA3eacJqZQoAJnimR0OcHEzx9LE2xxATPlEh87MfY5Iwq0iovOX7T0tQIv9+HaDS2UwRWjuNEYlF4PG5VPFbqk4jaIkd7HJk0fB5gKw41JuD3weF0qCKyLpdzp9isFIWVI0JSDFZEGjmCI0eBpMCs2PP7vOrf3U6XOt6TyWQgu2E8bheCAT8SyZQq/ipFYdMyNiXHf4BUJg0nHMqu+Ce21DWZtCpEG4nG1PNIAVopPivFa90uDxxOwCn/U0Lx2ob6sDquNDUzjzMnBtHR1oLVtQ1cunYTJ4/3o642rPyQuixej1sV0vV5PeYFfw+PuKZWVbiKcpZralGYquoirqkUTapqwlaps2w5bDFw3GliEaDm4UzwNAM1wBwTPAOCoNkFJniagWowJ6LJ6z95R1m6985TWJD6JjUBxOMJ1dkmnkhiZn4B0WhcCRxSs2RldQP9vR3o7myD2+nA8vISNrYTcHs8aGtpRE0woIrIzs0vw+NxwevxqNolg/2dmJ1fxvTMHH7u7jOqU47YDQR8SKcyasuLz+/DjRvjGBjoRigYUMLEQ/fdidGJ6Y+Kv86jsbFe+dvV0Yqm+josLK1gc2sb/b1if1HVThGxQoSLpZU11VlnoLdjp3jt1OwC2lqbMD27UHLx2ofuO6cK1IpQs7K6ruqySKeiRDyB7WhMMQrV+BEO1Shuv/zwAxqiVTkTXFMrx7pSd+KaWinSlbsP11SKJpWbbUf3TruKJrKL5NvPvXRboVc5jvP4k9/Gl3771/G5Rz59dKnlPDlFE7OmARM8s+KhwxsmeDoommWDCZ5Z8RBvcneaTEzNIRTwY2F5FQ6HQ4kWTY31SgxoaapXO0eksOvk9Dw8bieODfTixsg46sI+rGzEVKvhns42tTNEXqMTM+oAUCKZVGJLXV1Y7WpZW11X13R1tuHDSzdU15yF5RU44IDH7VHXi+DgdLrU7pd7zp3C/NKysinFX10OJ44f60EqnUF0O4LN7ahqg3z2xNDOPZOJJGRrSm04hOXVVdSFwzvFa6+NTiDo82FzK1Jy8dpQKICu9hZMzMwjEomp7kJr65vYWN9EX1+XYiS1ZHq721TXnwfuvcO84O/hEdfUqgpXUc5yTS0KU1VdxDWVoklVTdgqdbagaCItCb/+7Av4jc9+BvfddfK2R+ORnNsjTdHErJnPBM+seOjwhgmeDopm2WCCZ1Y8xJtCNU0mpmbR09WO7J97eb1XTZODFJsVYaGpoU7tDJE/ZQdHuV6ym0ZeIgQVerF4LcA1tVyz7/Dsck09PPblujPXVIom5ZpbtPsxgQMXgmXxV4omJr+BmOCZHJ3SfGOCVxo3k0cxwTM5OqX5xkKwpXEzfRTXVNMjdHD/uKYenJnpI7imUjQxfY7awT/uNLEYRe40sQhQ83AmeJqBGmCOCZ4BQdDsAhM8zUANMOd2OdSxnVg8ZYA3dEEXAa6pukiaY4drqjmx0OUJ11SKJrrmEu3sTmDXmiYvv/o6XnrlNdY02Wf2UDQx6+3FBM+seOjwhgmeDopm2WCCZ1Y8dHiTFU1e/fG/oKujDXPzi+p4jdQ32d6KoLYujNPDA6rgayqdUj+XWh/yp8vpVHVFZmYXcHJ4QHW3kZcUcJXjOXK8R3W8SSSRTCVVzZNUKgmnw4UMMjtdfqRLTjKdUvakI47cx+3+6HhPBognE/B5PHC5pPNPBtF4THXnyaTTcLvcSEO63HhVp56odOxxORFPJuH3elXXHvm5+LSytrHja7V1wzlorLmmHpSY+ddzTTU/Rgf1kGsqRZODzhlef3AC7J5zcGa3jaBoYhGg5uFM8DQDNcAcEzwDgqDZBSZ4moEaYE5Ek1gsjvPvXVGChNQmaaivxc/deRr//PYFDPTc6rLzweUbGOjrwpVro6rdcEtTneqkUxMIYH1rE2dODCmBZHpuEdMz83jkV34Br/7on1RbY+ly09LcoIq5Sjvi4/29uHhtBLWhIOKJhBJkgkE/FpdXVftfEUSkwOzJk/1IJTJobqrDjdFJDPV3Y2ZuEQO9nUpckU4725EYmprqsbK6Cp/Pp1oHLy2tqtbBbS1NuDE2iYDfr3zqaGvG4sqq8rWzvcUA+uVzgWtq+dgelmWuqYdFvnz35ZpK0aR8s4uWswT2FE2IaX8CFE32Z1TJK5jgVZJ2Ze7FBK8ynCt5FyZ4laRdmXuJaDIxPYftSBxbWxFMzczh+GAvpmYWVFccaV184lg/3r7wIdqaG7G+tY211Q3lnLQaXl5dx7HBXjTWhdWOksnpOQT8Ptx5dhg/e++yauX79oVLOD7Qo+zNLyyrHSObm1vY2NrGYH83Ll65gZPH+jE6OYu6cA3i8SQWl1bQ2toAh8OpdqSsr2/i1PEBJZ5I5x4RYWS8CCSBoB+NtWG8/e4lDA/23GpFHA4hEothdWUDHe3Nqo3y3MISens6la/ii51fXFPtF12uqfaLKddUiib2m9XmPdGBC8Ga9wiH6xFFk8Pln393JnhmxUOHN0zwdFA0ywYTPLPiocMbt9OJUI0HqxsxHeYqbuPqyIQSSqRjjuxyOdbffZsP84sraKgPQ44AHaVXW4MfcyvR6n9khwPISI8ovrim2m8OcE2laGK/WW3eE1E0sRgTiiYWAWoeTtFEM1ADzDHBMyAIml1ggqcZqAHmqqV7jvze/OElJ1ZXHQZQM98Fj9uBRLL6xYaWlgyGj6XgEPHkiL+4ptpvAnBNpWhiv1lt3hPtejznO8+9hE89cA733XXSPK8N8oiiiUHBAEDRxKx46PCGCZ4OimbZYIJnVjx0eFM1ogmAV37gwk/P85dnHXGvFhsPfyqKmcX/D//rL9yHn164iIcfuhder1vtHHI6nWqHUTotnZ8ccDgd8O4UDJYiwS5sR6PwSLHgTBrJ1K0OUV63FBV2IhqPKzvyXyKZVP/lFiP2er0QrSaVTKvaPFLzJxKNquNnUui40i+uqZUmXv77cU2laFL+WcY77Cqa3Bibxvdf/js88cUvIOD3ktQuBCiamDU1KJqYFQ8d3jDB00HRLBtM8MyKhw5vKJrooEgb5SIgoslW7CfwelwIhYLwenwI1dwqGtzV0YpkMoXt7QjqasO4MTqhiv9Oz86jri6M++8+i43NLVy+ehOtUhR4dAInjvVhYmoWa+tbavfKyuqGKjQsdqROjtiVTkuxWEIVDq6vC2NxaVV1bJJCxiK8tLU0qqLElX5xTa008fLfj2sqRZPyzzLeYdfjOV/86p/g/UsjBQndcWrwtlbERxkjRROzok/RxKx46PCGCZ4OimbZYIJnVjx0eEPRRAdF2igXARFN3N538dD9d+LS9VGsr22qnSYibAz2dSMaS2Bja1OJHy6HAx6fB7IXKZFI4a5zJ7C4sIKR8WnVxtrrdqGxoQ6LK2tIxJPo7W7H7NwSerpa8d7FazvFiN1OlyoenEilVGHid969hJPDg4hFY1jf3EJPZxv6ezvL9ci72uWaWnHkZb8h11SKJmWfZLwB2D3H4iSgaGIRoObhFE00AzXAHBM8A4Kg2QUmeJqBGmCuakSTTAZTM07E4wZAqwIXfB4XYolbx1Gq+RXwAx3t1V+bRUcMuKbqoGiWDa6pFE3MmpH29KagaCL1TP78r15VT/y7v/kIfv/xz9vz6TU8FUUTDRA1mqBoohGmIaaY4BkSCI1uMMHTCNMQU9UimhiCq2rc4JpaNaEq2lGuqUWjqpoLuaZSNKmayVrFjn5CNHn51dfxxvmL+MYTj6paJiKg9Pe043OPfLqKH7N8rlM0KR/bUiwzwSuFmtljmOCZHZ9SvGOCVwo1s8fYSTQZm5zBhfev4vRwP2bml3D3uZPweTxwOJ3IZDKIbEelXiikuqcU/JRink6HA+lMBl6PW9WxkIKh8pIaF36/DzEpFupxI5FIwu/1qoKg8URSFRJNpTKIJ+LKdiYt4xxwupzw+7xwOpxISW2MeFz5EEskbisyKvfMpDPweDxIppII+PyIxKLqXvFYQtmQMXLPVCqNeDKh/JLipkHZfrHPi2vqfoSq79+5plZfzPbzmGsqRZP95gj/3TqB20STSDSOrz/7An7js5/Z6ZojBWGf/e6LePprj6GhLmz9jjazQNHErIAywTMrHjq8YYKng6JZNpjgmRUPHd7YTTS5dGUE0p64JhREV3uLqlkRqgnA7XYrcSIYCKh6GBNTc2huqseNmxM4c+oYejtbcXVkQokn2SKjs/PL6O5oxpXr4+jt6cD21jZOnxjC3//jW1jb2ERNMKDEExFXGutqVTHSkbFJtLc0IhDwY2JmAT2drZiZXYTP51F2O9palMgSjcZUkdGZ2QV0drZhbn5JfdE1NjmrusKIcNLX24HllTXVrWVzK6qeY35xGQ/ddyf8+xT655qq491hlg2uqWbFQ4c3XFMpmuiYR7SxN4HbRJOVtQ089cfP44kvfQFDfbeKUxX6GaF+TICiiVmzgQmeWfHQ4Q0TPB0UzbLBBM+seOjwxm6iSSQSQ09XGy58eBVBnw/bkRiam+uV8BCPxeFyuTA9u4h0JoVwKKS6q8gXS0P9PXj/0jWFNFtk9Ob4FPw+H+YWl5XA4nW7cWygF9dvjqvrpuYW0d7cqMSSrci2KkbqdjoRrq1BS2MDro1OKB+m5hZwYrAXo5OzqrBoPJ5ETSiApoY6XLk2iubmBlVkNOD3Y31rG3WhGkzMzKGztVkVHl3f2EI8kUA4WINQKIB7zp2iaKJj8leZDa6pVRawItzlmkrRpIhpwkssEihKNJFOOl95/PM7u08s3tNWwymamBVOiiZmxUOHN0zwdFA0ywYTPLPiocMbO4kmUi5UTt/ofk3NzCMcqkFtuEa3aVy8ehOnhwd2tbu+vnnbv9XWhorygWtqUZiq6iKuqVUVrqKc5ZpK0aSoicKLLBGgaGIJH0DRxCJAzcOZ4GkGaoA5JngGBEGzC0zwNAM1wJydRBMDcBrjAtdUY0KhzRGuqdpQGmOIaypFE2Mmo40d+YRoIrtK3r80sucj33FqEN975suscQKKJqa9N5jgmRYR6/4wwbPO0DQLTPBMi4h1f+wkmqyubeD9S9dVEdb+vi60NtWrYqyJZBIel1sVWU2lUqowrLzi8bgqAiuFWuXYTjKVUoVWswVcpQirjInFE+p4jAMOZJBBJBLF6Pg0Tg4PwOFwAGmo4z4+rw9ujwvb21FVMFb8kMKyUrg1kUxJ/VllK5lIquNC6XQGqXRK3VsK08r95b9QMHDLroUX11QL8AwdyjXV0MBYcItrKkUTC9OHQ4skULDlcJFjeRlFE+PmABM840Ji2SEmeJYRGmeACZ5xIbHskJ1Ek+sj4/D6vKpuyE/efh+bm1s4fWJQFWqVgq9DAz2Ym19GQ31YdbkRUWNsYloJI92dbVhd31RCysLSKlxOh+ps87995kG88dP3UV9fi7X1DWxsbKmOO81NDVhcWlXFWqXYrMPpwD13nMTq+ga2tiOYnV9ETTCoCsuK7enZBXWvqel5DB/rV6KKFJGVOiZyRKexPrwjzJw7M4yujhZLseWaagmfkYO5phoZFktOcU2laGJpAnFwUQQomhSFafeLeDzHIkDNw5ngaQZqgDkmeAYEQbMLTPA0AzXAnJ1EE9lpIgKE7BaRdr1bm1toa22GtNORzjV3nhnGzNwijg/14tKVm6rAasDvVbtBpMDrjdFJJWZIm2C3y62Ei56udvzkrXfh8XpUh5vmhjqEwkFEo3FsR2MIBwNqd4jX48GdZ4cxv7Csojo6MQNAqqxACTfLq+vq7z958110dbTC4/NA9rvIbhMRX4JB2XkC9Pd2oLW50XL9FK6pBry5NLvANVUzUAPMcU2laGLANLS9CxRNLIaYoolFgJqHM8HTDNQAc0zwDAiCZheY4GkGaoA5O4km5cK5X7HWUu4rx3Qmp+cw1N9dyvB9x3BN3RdR1V3ANbXqQravw1xTKZrsO0l4gWUCFE0sIqRoYhGg5uFM8DQDNcAcEzwDgqDZBSZ4moEaYI6iiQFBKIMLXFPLAPWQTXJNPeQAlOH2XFMpmpRhWtFkHgGKJhanBEUTiwA1D2eCpxmoAeaY4BkQBM0uMMHTDNQAcxRNDAhCGVzgmloGqIdskmvqIQegDLfnmkrRpAzTiiYpmuidAxRN9PK0ao0JnlWC5o1ngmdeTKx6xATPKkHzxttJNJFCre+8e0XVKenqbEd9fUgVbZUOOX6fF9GY1Cpxqf/iySRSyZTqYiN1TOKJpCrMmkplEE/EVaecVCoJp8OlOuZ4fR7VgSe3s04qlVbFW6X+CRy36pckkyl1bSKRVF15pLaK3E/+v/gg/1+68sjYhLJ/yz/pmCP1Vq7dGEd3VxvWN7cwN7eETz14t7L34aUbqshtX0+HGh+Nx1UdlXQ6DY/bDafz9m47XFPNe69Z9YhrqlWC5o3nmkrRxLxZaT+PuNPEYkwpmlgEqHk4EzzNQA0wxwTPgCBodoEJnmagBpizk2iS7Z7TK8Vb335PCQqNjXWYnp5HS3MDfD4fbo5OYjsSVUVhl1fXlOBwangQf/+Pb2FtYxM1wYAST+rCtzrsHO/vxcVrI6rZsBRwnZhZQE9nK5ZX1tS1I2NTaKgLo6G+VhWblWuWltdQWxvC+Pg0hgZ7VOeeYDCAeCyhuu3IWBFrtiMxNU666tx392klpPzzW+/i2EAPmhrrEYlGVfFZwKHaHGc+KmhbG65Rvvq8XqysbuDfPfIw6mrDt80mrqkGvLk0u8A1VTNQA8xxTaVoYsA0tL0LFE0shpiiiUWAmoczwdMM1ABzTPAMCIJmF5jgaQZqgDk7iSaqe86VEdSGQ0qYkFbC0rWmqb4W/oBP7ehYXl5TO0dELPH7fPD5vTh1bADXb46raEzNLaK9uRGtLY2qE47L5VKtixPpNE4M9uLa6ASCPh82t7YRqglicyuCZCqpBBQRaQb7ulXnHLfHhY31TeXLwtIK2lubMTEzh87WZrWLRDr3ZDJpJeTUhWpw6sQA4okUpmfmkUqn4HA6cWp4ABfeu6I67EgnHhFzpGuPdNi5fG0UxwZ7MTk9j7vOHqdoYsB7qdwucE0tN+HK2+eaStGk8rPu6N2RoonFmFM0sQhQ83CKJpqBGmCOCZ4BQdDsAhM8zUANMGcn0URaC8Nx+zGVLOKpmXmEQzWWW/kWE7L97rW+vnmbGdmVovvFNVU30cO3xzX18GOg2wOuqRRNdM8p2vskAYomFmcFRROLADUPZ4KnGagB5pjgGRAEzS4wwdMM1ABzthJNDOBpigt2WlPTSMMJpyloD80PrqmHhr5sN+aaStGkbJOLhncIUDSxOBkomlgEqHm4nRI8zWiq1hwTvKoN3a6OM8GzX0wpmtgvpvJEdllTk6kU3jz/IdwuhzpOdfrEoDpmlUln1DEmr9erNhelkmm43E71Z0yK5H5UuDeRTMHjdqmjU1IzJp1JIxjwQ+xGojG4HE7191QqhWsjExjs71ZFeePJhJyIgsPpQE3Ajy2pKZPOqDoy8m9yjRQFls1NMjYWT6j7yHEuKQ7s9XghtXmTqbQ6vqUKDrtcliYb11RL+IwczDWVoomRE9NmTlE0sRhQiiYWAWoebpcETzOWqjbHBK+qw1fQeSZ49ospRRP7xdROoonUfpH6Lfffcwav/PAfVE2Xu+84gc3tW4Vxo9EY6uvCWFpZRU9nmxItboxO7RTunZ1fRk1NAKPjU6rGjdSHefihe1WdGRFUFheWkcpkkEgk0NRQh7XNTdTX1sLldCAaT6CrvQUNdbW4emNM1ZRZWFpFb3f7Tg2bn164iKXlddx19hhW1jZVrZyWlkZVwHd+YQldHS1YWdtAS1MD7r/nrKXJxjXVEj4jB3NNpWhi5MS0mVMUTSwGlKKJRYCah1M00QzUAHNM8AwIgmYXmOBpBmqAOYomBgShDC7YZU2VXSBvvP0BGhtrd4SPttZmRCNRxONJ1IQCSuzweT1YXlnHmtSLERHko8K9V26MfdSS2YmtrQj6+zrQ2d6KialZVZB3cmoOrU0NcLpdcDudiETj8Hhu7QiRIr4dbU3weX0Ym5pRosvY+DTq62tVlySkM9jY2sb1kQnVOlrEmXg8gbr6sPJPfKmpCaI2VKMKC3e0NVuKNNdUS/iMHMw1laKJkRPTZk5RNLEYUIomFgFqHm6XBE8zlqo2xwSvqsNX0HkmePaLKUUT+8VUnsg2a6rU9ZXmQZpf+xXrLfV2F6/exOnhgVKH7zmOa2pZsB6qUa6pFE0OdQIekZtTNLEYaIomFgFqHm6bBE8zl2o2xwSvmqNX2HcmePaLKUUT+8XUVqJJMeFJpwGn/QvFck0tZjJU1zVcUymaVNeMrU5vKZpYjBtFE4sANQ+naKIZqAHmmOAZEATNLjDB0wzUAHMUTQwIQhlcOCprqmxCkXojfp8XM7ML6OluVzVIpLaIFHGVGigZZBD0+7G1HYHb5UYqk1KFWV1OJ2KxhCooKy8pMDsxOav+fmywVxWUdcCBVCqpjuhITZPtSEQVeU2mU/B7verIjhSBlSKv0XgcqWQKXo9HFZyVsU7XLTFHCtTCkVFFaEt9cU0tlZy547imUjQxd3baxzOKJhZjSdHEIkDNw49KgqcZm9HmmOAZHZ6SnGOCVxI2owdRNDE6PCU7d1TWVBFNLl29ifM/+xCxRAr3nhtWBVmllkh7SwM2tyOYmV3E8FAvZuYWMTE1h/vuPo3NrQiG+nvw/qVrCPj9SKbTSnSJRqPq5xtbEXR3NGNpZR3RWBz33HESs/OLqlPOxMwCejpbsbyyhvvuPoNXf/RPcLtdSCZTaG6qx/r6Jnp6OjAzu4S5hUX09XZgcXFVFa6VIrS14ZqS4so1tSRsRg/imkrRxOgJahPnKJpYDCRFE4sANQ8/KgmeZmxGm2OCZ3R4SnKOCV5J2IweRNHE6PCU7NxRWVNzd5rcHJtCQorD1gRw+sSQKvY6M7egCrG63U40NNTjvQ+uYLC/Bx6vB4O9XXjv4lVVUHY7GkVtTVDtFpHrE6mPdpJ4PUjEE7jz7DDGp2bV7pJroxMI+nyqVbGIJj977zIaG2rx7gfXVMHXzUgETXW1SpiRQrHhmqDajTI00KWK0ErR2lJeXFNLoWay4O+iAAAgAElEQVT2GK6pFE3MnqH28I6iicU4UjSxCFDz8KOS4GnGZrQ5JnhGh6ck55jglYTN6EEUTYwOT8nOHZU1VUQTh8OhOuYc9CVCxuT0HIb6uw86dM/rpS2xvFqa6rXa5ZqqFacRxrimUjQxYiLa3AmKJhYDTNHEIkDNw49KgqcZm9HmmOAZHZ6SnGOCVxI2owdRNDE6PCU7xzW1ZHTGDuSaamxoSnaMaypFk5InDwcWTYCiSdGoCl9I0cQiQM3DmeBpBmqAOSZ4BgRBswtM8DQDNcAcRRMDglAGF7imfgxV7UYpA+NKm+SaWmni5b8f11SKJuWfZbwDRROLc4CiiUWAmoczwdMM1ABzTPAMCIJmF5jgaQZqgDmKJgYEoQwucE39GOrq2gbev3QdTocTA/1daG1uQCqVVh1v0um0+rvUNHE5HXA63fD7PIgnk6oTjnTZkSKvUlA2k87A5/Uinkx8ohuPdO+RgrHpVBpABh63Bz6fVzmRSCQRi8fgcrlVJx+5r9hZXV3H9dFJDPZ3IxQMqI478pKCsl6fR43zusWXhOrSE/Y6kcg4sLEdU7VVxO+EdPbxeBBLJOB0OFQHILGljizxZTwBrqkUTYyfpDZwkKKJxSBSNLEIUPNwJniagRpgjqKJAUHQ7AITPM1ADTBH0cSAIJTBBa6pH0O9PjIOr8+LunANzl+4pESKlbV1OBxOjI5PoaujFQN9Xbh07SbqQmFcuX4TD91/F6Zm5lTr4lPDg7hyfVS1HJZ6Jb3d7UqwWFld2+nGc2N0En09narI68LiihI+Vjc2cObEEBrr6/DO+5fRUBeGw+nE5NQsmprqMT2ziM62JqxtbqK+thZejxuLy6vKn6XlNdTWhnD56k3cfccwxiZnUV/jxepmFF2d7apzjwg6Umg2lcygo70Jl6+Noq42hHNnjqtitnyZT4BrKkUT82dp9XtI0cRiDCmaWASoeTgTPM1ADTBH0cSAIGh2gQmeZqAGmKNoYkAQyuAC19SPocpOk4tXb6odHm2tTXA5HJiaXVAtgJ1OJ2LxOHq72rC4vI5QKICbo5NK6JBdGz6/F6eODWBsakbt9hgbn0Z9fS0ikSjaWpp2uvGsbmyiJuBHc2MDYom4uq63pxONdWHVUefdD66qrj7rm1vq/jfHp3H6xAA2NyOIROPweFzKYdn5MtjXjdGJGbg9LszNLaqOO+tb2+htq8flkSm0NjcpO+sbW2rnSjgYRH1DrRJaRBgS8UZ20/BlPgGuqRRNzJ+l1e8hRROLMaRoYhGg5uFM8DQDNcAcRRMDgqDZBSZ4moEaYI6iiQFBKIMLXFPLANWiyamZeYRDNQgE/GoHydlTQ7seo8leWxv+eMdI7pq6vr55mzeyK4Wv6iPANZWiSfXN2urzmKKJxZhRNLEIUPNwJniagRpgjqKJAUHQ7AITPM1ADTBH0cSAIJTBBa6pxUOVSiLO4i8/tCu5ph4a+rLdmGsqRZOyTS4a3iFA0cTiZKBoYhGg5uFM8DQDNcAcEzwDgqDZBSZ4moEaYI6iiQFBKIMLXFMPBvV//u3raG5uwLH+bjQ01CGdziASjaojOclUaqfYqhRdlbokUmc1lUyrozjqlYEq7urzeRCLJxGNRm/93OGA2+WE1+vdGSOFZbP2pS6Jw+nA9nZUHQfyuF3IZIBgwK+ODcmOlLq6MNpbmtFU68VGJIHtaGKnUGy2CKwcPZLCsWJP6q1IUVkpfJtbKFaulWK1waBfHVXi6/AJcE2laHL4s9D+HlA0sRhjiiYWAWoezgRPM1ADzFE0MSAIml1ggqcZqAHmKJoYEIQyuMA19WBQ/+Gff4oH7j2HS1dHsLiyiu6ONqytbSCRTKGlpRHj49MYGuzB7NwSQjUBjE7OKGHjzjPDmJyeU2LFzbFJDA/1IZ5IKYHE7XarGiVSv6SpvhahUBCLS6uIxmOoC4eVGNPW0oi+ng5cvTGOeCwOf8CHG6NT6uciymxsbiIY9AEZJ/o6GzA2vYS21uadQrFZv27cnEAwGFBdddwetyoqu7G5pYSYbKFYqXkioklXRwuG+rsPBohXl4UA11SKJmWZWDR6GwGKJhYnBEUTiwA1D2eCpxmoAeYomhgQBM0uMMHTDNQAcxRNDAhCGVzgmnowqFnR5PV/Oa8KuE5PzWE7FlNdcHp72rGxvonacAjbkRi2IhHV4WZ6Zh6dHa1KmJACrCJc1ASDSjBpb2lSosj07KLaAdLUWIe6uhDeefcSTg4PIhaNqWKuPZ1t6O/txPjUrNqdsrUVRSQWxdz8Mh76uXNKnEkkUkinU2htDGErkkBPd+dOodisXwtLK2hvbcbK2gYCfi+2I1HV6Ud2vmQLxUrLZNnV4nI4VYcdvg6fANdUiiaHPwvt7wFFE4sxpmhiEaDm4UzwNAM1wBxFEwOCoNkFJniagRpgjqKJAUEogwtcU4uHKjVN5JVb12RiahY9Xe346YUPMTzUj9yCrMVbPtiVInLIq74uXLBQbO6aWqhQbO7dWCj2YOwP62quqRRNDmvuHaX7UjSxGG2KJhYBah7OBE8zUAPMUTQxIAiaXWCCpxmoAeYomhgQhDK4wDVVI1RDKsVyTdUYU0NMcU2laGLIVLS1GxRNLIaXoolFgJqHM8HTDNQAc0zwDAiCZheY4GkGaoA5iiYGBKEMLnBN1Qv1yo0xVTxVdp78woN3o6m+Xt1ACq563G5EojFVNFaO4vj9PricTlUPRQq7Sl0TKc4qRVlDwYA68hONx+F0ONTRnuyffp9X1RzxuNzKViqVUkVnxYYcC+psrsHaVhwZOBGNxneKvWaLvuYXf3W5XOqIkPidSqdVYdn8QrZSlDYSieHa6Dj6utrRUF+Lze0I0qm0aoecfaZgIKCODcn/j8cScLmccDnFbkoVnM1IJVxA3SdbnDbo92NrO6LuL36wAO0n5yTXVIomej+paK0QAYomFucFRROLADUPZ4KnGagB5iiaGBAEzS4wwdMM1ABzFE0MCEIZXOCaqheqiCbjkzNKrLjzzHHcHJtCqKYGgYBPiSJLK2tY29hCe0sjamoCaGlswI2xSQT8foxPzKClpUGJI2dOHsN7F6/h7MkhvHvxKhxwoLGxDtPT82hpboDP58Pk1CwG+rpUXZNYLI7jgz2YnltAIhbB6ZPH4PcH8MHlG+jv7cD45DycDmBkfApejwetzQ1wiIiRzmB9a1MVnG1qqMXY9Bwi2xFk4EBPRyu8Xs9OUdqGulokkknly11nT+DK9VG0tzXj8rVRtDXXI50B5pdWMdDTjrHJWVXPRXzzeFxKMNnciqCluR7Tc4vqZ9L9R2q1iDi0srKGcKgGiytr6GpvxrHBXr2BqXJrXFMpmlT5FK4K9ymaWAwTRROLADUPZ4KnGagB5iiaGBAEzS4wwdMM1ABzFE0MCEIZXOCaqhfqB5euY3l1A263AyIyzC2sKoHAIQqBw6GEAemi09hQC5/Xg6XVdayubKCjvRl+v1eJLbJL49TwIN778CpaWxpVoVZRGJZX11V3HemcIztPtja3ceJY/61iry4n4vEEtiJRNIb9aGxuQltLC96+8CHamhuVWCO7WKRTTnd3G67dmIDP60Y8nsSpE4OIRKLoam/B1RHZKeNGc2M9Upm06vaTLUorwobsOKmtDaGvqwNjUzNIxJPY3Ny6tWvG5cLC0jKaGuqVQCIijvgmfZaj0QTSmdRHLZITisn6xrYSgFZW1lVBWtkl09vZequl80CP3sBUuTWuqRRNqnwKV4X7FE0shomiiUWAmoczwdMM1ABzFE0MCIJmF5jgaQZqgDmKJgYEoQwucE3VB/VWSROHEgkO8pqdX0JTQ50SS4p57Vfcdb81tZLFX2PxhBKJ9mpdnC2mm/2zGAZH7RquqRRNjtqcP4znpWhikTpFE4sANQ9ngqcZqAHm9kvwDHCRLhyQABO8AwKrgsspmlRBkEpwkWtqCdAMH8I11fAAleAe11SKJiVMGw45IAGKJgcEln85RROLADUPZ4KnGagB5pjgGRAEzS4wwdMM1ABzFE0MCEIZXOCaWgaoe5iUnRf//NYF9Ha1ob21RU7sYGV1HfV1tapI6vWRcVXPoyYQUFa2IhGsrW9iZnYB95w7pQqlxhMJ+LxeVYQ1nc6oQq+bW9uoqw2pf+9trcPM0jo+uDKKsyeG1LEfvqqbANdUiibVPYOrw3uKJhbjRNHEIkDNw5ngaQZqgDmKJgYEQbMLTPA0AzXAHEUTA4JQBhe4ppYB6h4mpW7HP775DupCIdVZJlQTxMLSiupYc+eZExgZnVQFWcPhEFbXNxHweXBtZAItTQ04d+Y43jz/Aerra7G0tILGxlpEI1IfxI31zQ0sL28om+3Ntejsase1G1P4ubtOUzSpbIjLcjeuqRRNyjKxaPQ2AhRNLE4IiiYWAWoezgRPM1ADzFE0MSAIml1ggqcZqAHmKJoYEIQyuMA1tQxQ9zAZicbx5jvvIugPoq4upAqtjo5Po7+3ExOTc0oA6e/pUBbW1jdUcdSl1TXViebEUB9+8ta7CAT9qutNV0cLxlShVcDpdmJtdQt9Pe1wpRNIOpwYG5/D3edOoKnxVttjvqqXANdUiibVO3urx3OKJhZjRdHEIkDNw5ngaQZqgDmKJgYEQbMLTPA0AzXAHEUTA4JQBhe4ppYB6h4mpURsBmk44Szpxhev3sTp4YHbxkoh2SvXx/DQfeeU6MI1tSS0Rg/imkrRxOgJahPnKJpYDCRFE4sANQ9ngqcZqAHmmOAZEATNLjDB0wzUAHMUTQwIQhlc4JpaBqh7mUynAWdpgkmxnnJNLZZU9VzHNZWiSfXM1ur1lKKJxdhRNLEIUPNwJniagRpgjgmeAUHQ7AITPM1ADTBH0cSAIJTBBa6pZYC6p0kHkM5Ib+Kyvbimlg3toRnmmkrR5NAm3xG6MUUTi8GmaGIRoObhTPA0AzXAHBM8A4Kg2QUmeJqBGmCOookBQSiDC1xTywB1D5OJVApv/ex9uB0u+H0+nD4xiFQ6jUQyCZ/HA4fTqTrqpJJpuNxORKNx1VXH7/PC6XAikUzB43YhnU4jJd1zMmkEA35IVx7pquN1exDyOTCzvI6R0WmcHB6AQwymRatJwef1we1xYXs7CrfbpWxmbYhtuVRsJRNJVW9FuvOk0im4XC64nE7VnUf+CwUDt+zyVRECXFMpmlRkoh3xm1A0sTgBKJpYBKh5OBM8zUANMEfRxIAgaHaBCZ5moAaYo2hiQBDK4ALX1DJA3cPk2sYWrly/ifvvPotXfvgPShQZ6O1CQ0MtZueWEKoJwOv1YGllFT2dbdjcjmBmdhHtLY0IBPyYnV9GTU0Ao+NTqn6JiBoPP3QvLl4ZUV11Muk0olsbmJhdRn9vFxaXVtHX26FsO5wO3HPHSayub2BrO4LZ+UXUBIPwetzo7mzD9OwCxiamMTU9j+Fj/UpUkW48Ab8fUkulsT6shBkHHDh3ZlgVouWrMgS4plI0qcxMO9p3oWhiMf4UTSwC1DycCZ5moAaYo2hiQBA0u8AETzNQA8xRNDEgCGVwgWtqGaDuYVJ2mrx5/j001tfvCB/BYABBn091ymlurlc7PHxeD+YXVjAzt4DaUA3CtTVoaWzAlRtj8LjdcDqd2NqKoL+vA53trTh/4aLqqrOxvoXmugDWtmPweLzYjsYQDgbU7hCvx4M7zw5jfmFZeTiqOu9IaVqoHS/Lq+vq7z95813Vrcfj86hTRCLMiPgSDMrOE6C/twOtzY2oDddUFt4RvhvXVIomR3j6V+zRKZpYRE3RxCJAzcOZ4GkGaoA5iiYGBEGzC0zwNAM1wBxFEwOCUAYXuKaWAeoeJtPSHrgMt8ztqqNrTZVjOpPTcxjq7y6DxzR5EAJcUymaHGS+8NrSCFA0KY0bR5EACZAACZAACZAACZAACZAACZAACdicAEUTmweYj0cCJEACJEACJEACJEACJEACJEACJFAaAYompXHjKBIgARIgARIgARIgARIgARIgARIgAZsToGhi8wDz8UiABEiABEiABEiABEiABEiABEiABEojQNGkNG4cpZHAd557CX/+V6/uWOxoa8Jz3/oKhvo6Nd7lY1Mraxt46o+fxxNf+kLBe7z86usYnZjF7z/++bLc/ygYFYZ/+K0XbnvUv/zTr+K+u05qffxINI6vP/sCfvDjN3bs5t7nxtg0Hn/y25iZW9r59ztODeJ7z3wZDXVhrb4cVWP5sf7d33ykqPeOjHvj/EV844lHEfB7d8WXa5+xK88sk8/EL371T/D+pRF1g2I/g7PjvvL45/d8b+d/xn/zyUfxuUc+re6Vf2/GWF+Mcz8fcz8X375wGX/9ymv7vvdK9SQ33sV+HpR6r6MwTuL1O7/3DP7NLz24E7NsbH/js5/Ruq7ut6YK76w/8ne+X/XMwPzPwYN8DlvxIJsjfem3f33nM9mKPY4lATsToGhi5+hWwbMV+sVJFuSJ6XntH+C5yUChXwpyEwEmeqVPHuH47edeuk2YkIX5x/94Hv/5P362dMMFRkqi8Rcv/g2++Nv/Tv3iLfd+6unnd0Q3ue8fPP08/uipx8omwml9oCozJu/fl155bSfW2feYPEYxYsh+okn+XJJfxmbnl/e1XWUYD9XdbLL++c9+ZuczN/tZuJ/QWYxoInPie//X/4v/9IVfVUJlNkl/+qnH1C97+Z/3xYpphwqtSm6efT+2tzbe9r4pp2gi71F58UsHfZNE4pX9YklyE3nflEs0OeiayvernjgX+iwt9nO4VA9yv1TKFbJLtcdxJGB3AhRN7B5hg58vu+g/eO/pPQWS3b7VyP5C/Gu/8hCe/rPvqyctRuzgTpPyTopikub8b1Wyv5xlf/5rv/zz+MuX/lbtEMn9dm0/z/MTD4om+xEr/d93+4W50M/zd4s8+b//Jp785n/b2QFU6NvKQp8PjGfp8dpt5G6/9OT/PP89K0m27MjL3SVYTOK93+d+IdFV/1MfDYtZ1r/2Kz+P//mjf0F2V0K+aLLb53GhubHX53s5xZijEbHCT5nlmo2jCNLykl2WuTtNCu3wKfR5fJDP0fzx+TtxD2LrKMdwv2ffbT3N/zzM3wmU/5lb7M7MbB78fzz67/F/v/RD7JeH7+c//50EjgIBiiZHIcoGP6Ms8q/+/Zu7HsfJ3zmQu2BnVfJHfvEB9a1WMd96CgqKJuWdENlFe7dvqfO/2ZY4PvvdF/H01x5Tjskxgd7OVrWbIJsYFrug5ydw+cdzuJVYX+z3+uVW3tf9Pe1KDM3fjfLBlZsI+H1498Prex7PKfTLdbHvcX1PaW9LewkYhd6X2d0oMu71Ny7g/rtPqffrfsdzcinuF0PuJtI353J3I4jV7JGcDy6P7Pw9/zM2dyfQsYGu246yFrN2VuJYpj5C1WEpK5o89V9+C0//1+8roeTsycHbRJNcgSsbU9lhJLlRvtBxkCPI+Wtqvmi23/u5OggfvpfFfAmRjXk2rvnvx93W2vyj7rn3ytosNsc6fFL0gAQOjwBFk8Njzzt/RCD/vHvuzoL8BTo3kV9e3fjE0Ytidzmwpkl5p19+nYtcsWK3b04kEZQkPf+XsGK3/+73DbY8MX8h0xf3vb5Vzr4P5diUfBtaKCErJq677XY4yC/p+p7Yfpb22uKf+8vS8sr6J47cZQXog4omu31GZz8zKGzqm2e58c39JTtXQJmeW9xzHc0VQPfbSZJ7rdwj/0sPfU92tCzlcs8KXoUElNzP2dx1VnKl7BcTfp/vEztUdqNZaE3NjzFFEz1zcTeOue/hxobagu9V+YLiV3/xwV3X2lwP8z/zi8mb9DwhrZBA9ROgaFL9MbTVE2QXjvvvOqm+IckXVORhs0l1IdGkmG9Qivm2jIVg9U2r/DoXkvRJUbv8l+xMKSSa7Jeoi53cs/t7naXPFd1YCNZajIvZaZJN5AoVKyxGNClUlLDYIqXWnu5ojC52p8n1m1MFC4ce9BemYkRLHs/RN/fyf0EqdMxDRJPsL9TZz8TcdTT381dq02R3kBXyMv8Xav5CpieWuTEQiyJE5x65yt91ItfkrnW5Qon84p0f70Je7ramcqeJnpjmWylmp4nELr+wvdiRIzp7rbW598o/ipf7b8UcryzP09MqCVQHAYom1RGnI+Vl7i9TeyVphc7ScqeJmVMl9xeh3X4BE893q4exV8HQYgWT/ESSoom1uVJMkrfX1t9iRJN8D+U9//2X/w5PfPELe3bcsfZkR2t0MTVNROjML+682/t1N3rFCCZZm3vtBDxa0bH2tLt9q5xbGHa/nSbZLxmkXpgc75EdDrt9duZ/aVGuYqXWqFTf6PwvDvILwxb6nM0XH7OxEdFLXtnuVQcRTORa1jQpz/wppqZJ7o6h/PdgqQJlqePKQ4FWScBsAhRNzI6Prb2TD+tnv/cifutzv7zT2ST/A7zQ9t7vv/wjPPJLDyJ/p0mxBcm406S800p+OfrUA+dua4OYK2bl1zQRbyTO8srfabLfN9n7Lfg/fO0tHBvo3plfxYhq5aVjL+vFdM/JvyYbk92OfOxGaL+5YC+ylXua3d6Pshssv0BztqaJjHn1x2/gc488XNSW8L3edzI/ejpbdz4v8udL5UjY706FRItsYfXsMVh5atm5kK2TkN/dKPuL8g9fexsnhnr27IpTqDNSIbHNfqTL+0T5oknuDrzsezT3fZPdWZKNaa4YmclkIIW48+tcZJ9gvzU1P88qRfwuL63qtF5ofcvvnlPoCyKJx/Wbk/hXn7n/E/XD8vOfvQQy1jSpznlDrytLgKJJZXnzbnkE8mtfyD/nbxHM7Z4j/57tkJNf5FP+ba8WmYW2+ufWT8m/z372GMzCBApxzO9qlL9FNHvkSixKjYT3L43sGN9ry2ihOZA7R/J9OUgnHsa3OAL57+FCHaxyj9llY51N7H/w4zd2jtzlf3uWO094LKe4eJRyVf77sRDr/Pda9n2Z+x4r9F7dbTt49r0oOx1yt5yzpkkpESw8ppBokn9cUlq158cofx0tJKTs5mXufOB7Vk8sCx1Rzf+FWu5UqHtOrgfF7Pbab00Ve7kx5vtVT4wLfU4Wev/k57H51xRaa/faVbufSKbn6WiFBOxBgKKJPeJ4JJ+i2J0lRxJOlT40dxNUaeDoNgmQAAmQAAmQAAmQAAnYlABFE5sG9ig8FkUT+0WZoon9YsonIgESIAESIAESIAESIIFqJkDRpJqjR99JgARIgARIgARIgARIgARIgARIgATKRoCiSdnQ0jAJkAAJkAAJkAAJkAAJkAAJkAAJkEA1E6BoUs3Ro+8kQAIkQAIkQAIkQAIkQAIkQAIkQAJlI0DRpGxoaZgESIAESIAESIAESIAESIAESIAESKCaCVA0qebo0XcSIAESIAESIAESIAESIAESIAESIIGyEaBoUja0NGyFwNsXLuN3fu+ZHRP/5pcexDeeeBQBv1f9LL9X/TeffBSfe+TT6t+kq87jT34bM3NL6v/fcWoQ33vmy8j2qt/PthW/OZYESIAESIAESIAESIAESIAESMA+BCia2CeWtnqSl199HT2drbjvrpM7Akl7ayN+//HPq+f8znMvqT/l/+e3qRVRZGJ6fkdEkWtn55d3RJf9bNsKJB+GBEiABEiABEiABEiABEiABEigZAIUTUpGx4GVJCBCxxvnLyrhIxqL4ak/fh5PfOkLGOrr/ISIku+XiCjffu6l23ab5F6Tazu7k6WSz8Z7kQAJkAAJkAAJkAAJkAAJkAAJmEmAoomZcaFXeQRyd5bI8Zs/ePp5/NFTj+2IJnsJH/uJIrm2CZ4ESIAESIAESIAESIAESIAESIAEsgQomnAuGE8gf6eIiCbPfvdFPP21x3bqlOwmjBQSWHIfeL9dKMbDoYMkQAIkQAIkQAIkQAIkQAIkQAJlI0DRpGxoaVgHARE1nnr6eTz3ra/s7CopdqdJtiDs0089pmqj5L8K2dbhM22QAAmQAAmQAAmQAAmQAAmQAAnYgwBFE3vE0ZZPsZuoIYVf96tpQsHEllOCD0UCJEACJEACJEACJEACJEACFSVA0aSiuHmzYgnsd2xmr+45PJJTLGVeRwIkQAIkQAIkQAIkQAIkQAIksBcBiiacH0YSEFHkz//q1dt862hr2jmmE4nG8fVnX8APfvyGuuabTz6602JY6pv84bde+MRz/eWfflUd09nPtpFA6BQJkAAJkAAJkAAJkAAJkAAJkEDFCVA0qThy3pAESIAESIAESIAESIAESIAESIAESKAaCFA0qYYo0UcSIAESIAESIAESIAESIAESIAESIIGKE6BoUnHkvCEJkAAJkAAJkAAJkAAJkAAJkAAJkEA1EKBoUg1Roo8kQAIkQAIkQAIkQAIkQAIkQAIkQAIVJ0DRpOLIeUMSIAESIAESIAESIAESIAESIAESIIFqIEDRpBqiRB9JgARIgARIgARIgARIgARIgARIgAQqToCiScWR84YkQAIkQAIkQAIkQAIkQAIkQAIkQALVQICiSTVEiT6SAAmQAAmQAAmQAAmQAAmQAAmQAAlUnABFk4oj5w1JgARIgARIgARIgARIgARIgARIgASqgQBFk2qIEn0kARIgARIgARIgARIgARIgARIgARKoOAGKJhVHzhuSAAmQAAmQAAmQAAmQAAmQAAmQAAlUAwGKJtUQJfpIAiRAAiRAAiRAAiRAAiRAAiRAAiRQcQIUTSqOnDckARIgARIgARIgARIgARIgARIgARKoBgIUTaohSvSRBEiABEiABEiABEiABEiABEiABEig4gQomlQcOW9IAiRAAiRAAiRAAiRAAiRAAiRAAiRQDQQomlRDlOgjCZAACZAACZAACZAACZAACZAACZBAxQlQNKk4ct6QBEiABEiABPQT+M5zL+HP/+rV2wx3tDXhuW99BUN9nQe64cuvvo43zl/EN554FHjuBCEAAAV1SURBVAG/90BjeTEJkAAJkAAJkAAJ2IkARRM7RZPPQgIkQAIkcGQJiGgyO798m9Dx9oXL+J3fewa/+5uP4Pcf/3zRbCiaFI2KF5IACZAACZAACdicAEUTmweYj0cCJEACJHA0CBQSTeTJb4xN4/Env40v/fav43OPfFrByN+VcsepQXzvmS+joS6MrNCSS+2bTz5acGypO1mORkT4lCRAAiRAAiRAAnYgQNHEDlHkM5AACZAACRx5AruJJlmRJHcXyv/5/7yCX/rUvTvHdvLH7rbTRK6TV3bXiggsTz39fElHgI58wAiABEiABEiABEigKghQNKmKMNFJEiABEiABEtibwF6iiYggL73y2s5uknxLshvl2e++iKe/9pjabVJINMm/RmxEonF8/dkX8OC9p3d2ojBOJEACJEACJEACJGAnAhRN7BRNPgsJkAAJkMCRJXAQ0SQrdvzgx2/s8Mo9alNINCl0bCc7OPf4zpENAB+cBEiABEiABEjAlgQomtgyrHwoEiABEiCBo0ag2OM503OLqsbJI7/4wM4xG9lF8gdPP48/euoxdWRnN9Hk28+9tOtulaPGm89LAiRAAiRAAiRwNAhQNDkaceZTkgAJkAAJ2JzAfoVgn37qMdx310lV6PWvX3ntti47+aJJMdfYHCcfjwRIgARIgARIgAQUAYomnAgkQAIkQAIkYAMCxbYczi/emj2q884H13YKuhYq8Jq9bnx6/rbdJrIrpaezVQkyfJEACZAACZAACZCA3QhQNLFbRPk8JEACJEACR5JAfhthgbBbS2AROv7wWy8oTnLNE1/8D/iLF/9m53iO/DzX3m4th+W63HbFRxI8H5oESIAESIAESMDWBCia2Dq8fDgSIAESIAESIAESIAESIAESIAESIIFSCVA0KZUcx5EACZAACZAACZAACZAACZAACZAACdiaAEUTW4eXD0cCJEACJEACJEACJEACJEACJEACJFAqAYompZLjOBIgARIgARIgARIgARIgARIgARIgAVsToGhi6/Dy4UiABEiABEiABEiABEiABEiABEiABEolQNGkVHIcRwIkQAIkQAIkQAIkQAIkQAIkQAIkYGsCFE1sHV4+HAmQAAmQAAmQAAmQAAmQAAmQAAmQQKkEKJqUSo7jSIAESIAESIAESIAESIAESIAESIAEbE2Aoomtw8uHIwESIAESIAESIAESIAESIAESIAESKJUARZNSyXEcCZAACZAACZAACZAACZAACZAACZCArQlQNLF1ePlwJEACJEACJEACJEACJEACJEACJEACpRKgaFIqOY4jARIgARIgARIgARIgARIgARIgARKwNQGKJrYOLx+OBEiABEiABEiABEiABEiABEiABEigVAIUTUolx3EkQAIkQAIkQAIkQAIkQAIkQAIkQAK2JkDRxNbh5cORAAmQAAmQAAmQAAmQAAmQAAmQAAmUSoCiSankOI4ESIAESIAESIAESIAESIAESIAESMDWBCia2Dq8fDgSIAESIAESIAESIAESIAESIAESIIFSCVA0KZUcx5EACZAACZAACZAACZAACZAACZAACdiaAEUTW4eXD0cCJEACJEACJEACJEACJEACJEACJFAqAYompZLjOBIgARIgARIgARIgARIgARIgARIgAVsToGhi6/Dy4UiABEiABEiABEiABEiABEiABEiABEolQNGkVHIcRwIkQAIkQAIkQAIkQAIkQAIkQAIkYGsCFE1sHV4+HAmQAAmQAAmQAAmQAAmQAAmQAAmQQKkEKJqUSo7jSIAESIAESIAESIAESIAESIAESIAEbE2Aoomtw8uHIwESIAESIAESIAESIAESIAESIAESKJXA/w8v49LiZ51j+gAAAABJRU5ErkJggg==", + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Получаем объект Schedule со структурой графа работ из объекта ScheduleProject\n", + "raw_project_schedule = schedule_project2.schedule\n", + "\n", + "# Готовим финальное расписание (на вход передаем дату начала проекта в формате YYYY-MM-DD)\n", + "project_schedule = raw_project_schedule.merged_stages_datetime_df('2022-09-01') # в виде DataFrame\n", + "\n", + "# БОНУС Визуализация расписания средствами SAMPO (диаграмма Гантта)\n", + "schedule_fig = schedule_gant_chart_fig(schedule_dataframe=project_schedule,\n", + " visualization=VisualizationMode.ShowFig, # еще есть ReturnFig и SaveFig\n", + " remove_service_tasks=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "id": "6geMLc3RvQDm" + }, + "outputs": [], + "source": [ + "# Сохраняем структуру в JSON для СППР\n", + "# первый параметр - путь до директории, куда положить JSON, второй - название JSON без расширения\n", + "schedule_project2.dump('.', 'gas_network_full_connections_genetic_upd')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "1aXhSuD3abDh" + ], + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/dormitory_field_dev_demo_with_granular_new_measurements.csv b/examples/dormitory_field_dev_demo_with_granular_new_measurements.csv new file mode 100644 index 00000000..815b7c7b --- /dev/null +++ b/examples/dormitory_field_dev_demo_with_granular_new_measurements.csv @@ -0,0 +1,150 @@ +activity_name;granular_name;volume;measurement;granular_measurement +Установка свай с заполнением;Установка в скважины свай;101.0;шт;шт +Изготовление свай (наращивание);Изготовление металлических свай;101.0;шт;шт +Монтаж оголовков;Монтаж оголовков;1.18;тн;т +Монтаж ростверка;Монтаж резервуара;26.05;шт;шт +АКЗ боковой поверхности металлических свай;Антикоррозионная защита боковой поверхности металических свай;420.2;шт;шт +АКЗ мк надземной части свай и оголовков, ростверка;АКЗ надземной части свай (м/к);1079.5;м2;м2 +Монтаж блоков общежития;Монтаж блока электротехнического;80.0;шт;шт +Устройство внутренних лестниц;Монтаж, устройство лестниц;2.0;тн;т +Монтаж ферм стропильных;Монтаж стропильных и подстропильных ферм;3.78;тн;т +Монтаж нащельников на венткамеры;Монтаж вертикальных термостабилизаторов;2.84;шт;шт +Монтаж прогонов;Монтаж траверс;6.36;шт;шт +Монтаж нащельников, элементов примыкания;Установка дефлекторов, зонтов, узлов прохода;3.84;шт;шт +Монтаж крепления радиальных вентиляторов;Монтаж вентиляционных труб;0.11;стык;стык +Монтаж крепления наружных воздуховодов Д 250, 315, 800х400, 1000х600;Монтаж воздуховодов;0.1;м2;м2 +Монтаж балок пола;Монтаж кран-балки;0.14;комплект;комплект +Монтаж крепежных элементов воздуховодов чердака (230 шт);Монтаж воздуховодов;230.0;м2;м2 +Монтаж крыльца №1;Монтаж колонн одноэтажных зданий;1.22;тн;т +Монтаж крыльца №3;Монтаж оптического кросса;0.8;шт;шт +Монтаж крыльца №2;Монтаж системы суфлирования;0.7;комплект;комплект +Монтаж люка-лаза на кровлю;Монтаж кровли навеса агнкс;2.0;м2;м2 +Монтаж подставки под наружный блок кондиционера;Установка блока вентиляции;0.1;комплект;комплект +Устройство подкровельной антиконденсатной пленки;Устройство противоподкопного барьера;1600.0;м;м +Устройство утеплителя рулонного, жесткого;Устройство контура заземления, провод;49.0;м;м +Монтаж панелей кровельных;Монтаж кровли;124.0;м2;м2 +Теплоизоляция техподполья;Теплоизоляция оборудования;1060.0;м3;м3 +Устройство пола венткамер ЦСП толщ.10 мм и 16 мм;Устройство полимерного покрытия пола;32.0;м2;м2 +Внутренняя отделка потолка плитой перфорированной;Теплоизоляция внутренних стен мин. плитами;382.0;м3;м3 +Устройство пола венткамер линолеум;Устройство полов из линолеума;7.0;м2;м2 +Внутренняя отделка плинтуса;Внутренняя отделка;305.0;м2;м2 +Внутренняя отделка пола линолеум;Внутренняя отделка;240.0;м2;м2 +Водоснабжение, монтаж трубопровода;Монтаж водопропускной трубы;545.0;шт;шт +Водоснабжение, монтаж опор;Монтаж опор;950.0;шт;шт +Водоснабжение, монтаж хомутов;Монтаж водосточной системы, системы снегозадержания;170.0;м2;м2 +Водоснабжение, монтаж муфт, угольников, тройников;Монтаж водосточной системы, системы снегозадержания;1253.0;м2;м2 +Водоснабжение, монтаж кранов;Монтаж водосточной системы, системы снегозадержания;243.0;м2;м2 +Теплоизоляция магистрального водопровода, монтаж теплоизоляции;Монтаж теплоизоляции трубопровода;368.0;м3;м3 +Канализация выше отм. +0.000, монтаж трубопровода;Монтаж водосточной системы, системы снегозадержания;133.0;м2;м2 +Канализация ниже отм. -0.000, монтаж трубопровода;Монтаж водосточной системы, системы снегозадержания;169.0;м2;м2 +Подземная прокладка трубопроводов К1, с учетом монтажа греющего кабеля и устройством теплоизоляции;Прокладка греющего кабеля;15.0;м;м +Монтаж стальных колодцев бытовой самотечной канализации К1, с учетом внутренней обвязки;Монтаж сборных железобетонных колодцев;2.0;м3;м3 +Канализация выше отм. +0.000, монтаж муфт, отводов, тройников, ревизии, перехода;Прокладка трубопроводов канализации;40.0;стык;стык +Канализация выше отм. +0.000, монтаж клапанов воздушных;Монтаж огнезадерживающих и регулирующих клапанов сетей вентиляции;40.0;шт;шт +Канализация ниже отм. -0.000, монтаж отводов, тройников, ревизии;Монтаж водосточной системы, системы снегозадержания;169.0;м2;м2 +Теплоизоляция канализации, монтаж теплоизоляции;Монтаж теплоизоляции трубопровода;26.0;комплект;комплект +Прохождение труб через стык блок-модулей;Устройство переездов через эстакаду трубопроводов;72.0;шт;шт +Крепление канализации под зданием;Сооружение внутренних систем канализации;114.0;м;м +Противопожарный трубопровод, монтаж трубопровода;Монтаж теплоизоляции трубопровода;75.0;м3;м3 +Противопожарный трубопровод, монтаж тройников, отводов;Монтаж фасонных элементов и запорной арматуры трубопроводов;35.0;шт;шт +Противопожарный трубопровод, монтаж шкафа пожарного в комплекте с огнетушителем, рукавом пожарным;Монтаж защитных труб и рукавов;6.0;м;м +Противопожарный трубопровод, монтаж задвижек;Установка противопожарных дверных блоков;1.0;м2;м2 +Обвязка бойлера, монтаж трубопровода;Прокладка трубопроводов канализации;33.0;стык;стык +Обвязка бойлера, отводов, тройников, ревизии, перехода, ниппель;Монтаж тройников;185.0;шт;шт +Обвязка бойлера, монтаж оборудования (водонагреватель, расширит. бак, регулятор давления, насос);Монтаж узла подогрева;9.0;шт;шт +Обвязка бойлера, монтаж кранов;Монтаж кран-балки;26.0;комплект;комплект +Обвязка бойлера, монтаж опор;Монтаж опор трубопровода;80.0;шт;шт +Общеобменная вентиляция, монтаж воздуховодов;Монтаж воздуховодов;62.0;м2;м2 +В-8, монтаж воздуховода;Монтаж воздуховодов;5.0;м2;м2 +П-1,2,В12-14.1, монтаж воздуховодов;Монтаж воздуховодов;101.0;м2;м2 +Дымоудаление, огнезащита воздуховодов;Нанесение огнезащитного покрытия воздуховодов, приточно-вытяжных инженерных систем;403.0;м2;м2 +В-8, монтаж переходника, тройника, зонта;Установка дефлекторов, зонтов, узлов прохода;3.0;шт;шт +2, ВП1, ВД1, монтаж клапанов, ниппель;Монтаж огнезадерживающих и регулирующих клапанов сетей вентиляции;365.0;шт;шт +П-1,2,В12-14.1, монтаж шумоглушителя, зонта;Демонтаж заглушек, монтаж промежуточных колец;2.0;комплект;комплект +Дымоудаление, монтаж переходников, отводов;Нанесение огнезащитного покрытия воздуховодов, приточно-вытяжных инженерных систем;39.0;м2;м2 +П-1,2,В12-14.1, монтаж тройников, отводов, переходников, врезки;Монтаж тройников;243.0;шт;шт +Общеобменная вентиляция, монтаж вентилятора;Монтаж системы вентиляции;0.3;шт;шт +П-1,2,В12-14.1, монтаж вентрешетки;Укладка георешетки, габионов;4.0;комплект;комплект +П-1,2,В12-14.1, монтаж крестовины, заглушек, хомутов;Демонтаж заглушек, монтаж промежуточных колец;42.0;комплект;комплект +П-1 монтаж приточной установки;Монтаж системы приточной вентиляции;1.0;комплект;комплект +Дымоудаление, монтаж клапанов;Монтаж огнезадерживающих и регулирующих клапанов сетей вентиляции;10.0;шт;шт +П-1,В12-14.1, монтаж комплекта автоматики;Пульт, рабочее место, шкафы цс, блокировок, управления автоматикой;1.0;шт;шт +П-1,2,В12-14.1, монтаж воздушно-тепловой завесы;Нанесение огнезащитного покрытия воздуховодов, приточно-вытяжных инженерных систем;3.0;м2;м2 +Дымоудаление, монтаж зонтов;Установка дефлекторов, зонтов, узлов прохода;1.0;шт;шт +П-1,2,В12-14.1, монтаж изоляции воздуховодов;Монтаж воздуховодов;195.0;м2;м2 +П-1.2.В12-14.1. монтаж сплит-системы;Монтаж системы суфлирования;3.0;комплект;комплект +Отопление, монтаж трубопровода;Монтаж теплоизоляции трубопровода;1242.0;комплект;комплект +Отопление, монтаж переходов, тройников, уголков, муфт;Установка дефлекторов, зонтов, узлов прохода;1954.0;шт;шт +Отопление, монтаж опор для труб;Монтаж опор трубопровода;620.0;шт;шт +Отопление (П1), монтаж кранов;Монтаж приборов системы отопления;75.0;шт;шт +Отопление (ИТП), монтаж счетчиков, кранов, манометров, термометров и др.;Монтаж приборов системы отопления;122.0;шт;шт +Отопление, монтаж радиаторов;Монтаж приборов системы отопления;100.0;шт;шт +Отопление (ИТП), монтаж опор для труб;Монтаж опор трубопровода;40.0;шт;шт +Отопление, монтаж насоса (ИТП), блока питания;Монтаж приборов системы отопления;2.0;шт;шт +Автоматика к вентиляторам, монтаж шкафов;Пульт, рабочее место, шкафы цс, блокировок, управления автоматикой;6.0;шт;шт +Отопление (ИТП), монтаж переходов, тройников, уголков, муфт;Установка дефлекторов, зонтов, узлов прохода;24.0;шт;шт +Отопление, монтаж изоляции;Монтаж изоляции;470.0;комплект;комплект +Отопление (ИТП), монтаж изоляции;Монтаж изоляции;32.0;комплект;комплект +ЭОМ, монтаж кабеля;Монтаж провода, кабеля связи;1595.0;м;м +ЭОМ, монтаж короба, кабель-канала, перегородки;Монтаж провода, кабеля связи;98.0;м;м +Электрообогрев линии канализации до КНС;Укладка кабеля электрообогрева;30.0;м;м +ЭОМ, монтаж светильников;Монтаж наружных светильников;263.0;шт;шт +ЭОМ, монтаж ламп;Сборка, монтаж контейнера;1000.0;комплект;комплект +ЭОМ, монтаж ящика трансформаторного понижающего;Монтаж модулей, блок-боксов;5.0;шт;шт +ЭОМ, монтаж выключателей, розеток;Монтаж модулей, блок-боксов;113.0;шт;шт +ЭОМ, монтаж знаков безопасности;Установка знаков, сигнальных столбиков;250.0;шт;шт +ЭОМ, монтаж конвектора;Сборка, монтаж контейнера;2.0;комплект;комплект +ЭОМ, монтаж обогревателя;Монтаж узла подогрева;4.0;шт;шт +ЭОМ, монтаж футляра;Монтаж футляра;34.0;шт;шт +ЭОМ, монтаж трубы ПВХ с зондом;Монтаж термометрической трубки;1150.0;шт;шт +ЭОМ, монтаж металлорукава;Монтаж модулей, блок-боксов;80.0;шт;шт +АОВ, монтаж кабеля;Монтаж провода, кабеля связи;2352.0;м;м +АОВ, монтаж щита управления приточной установкой;Монтаж асутп блока контроля и управления;1.0;шт;шт +АОВ, монтаж щита управления вытяжкой;Монтаж щита пожарного;3.0;шт;шт +АОВ, монтаж щита упр-я вентилятором дымоудаления, подпора;Монтаж щита пожарного;4.0;шт;шт +АОВ, монтаж щита пожарной автоматики;Монтаж щита пожарного;1.0;шт;шт +АОВ, монтаж пульта контроля и управления, блока контроля и индикации;Пульт, рабочее место, шкафы цс, блокировок, управления автоматикой;2.0;шт;шт +АОВ, монтаж блока питания;Монтаж модулей, блок-боксов;2.0;шт;шт +АОВ, монтаж трубы ПВХ с зондом;Монтаж модулей, блок-боксов;1000.0;шт;шт +АОВ, монтаж металлорукава;Монтаж модулей, блок-боксов;30.0;шт;шт +АОВ, монтаж лотка;Монтаж модулей, блок-боксов;11.0;шт;шт +СБП. Монтаж кабеля;Монтаж кабеля;10.0;м;м +ПС. Монтаж кабеля;Монтаж кабеля;3040.0;м;м +СКС. Установка коробов;Монтаж соединительных коробок и муфт;660.0;шт;шт +СКС. Монтаж кабеля;Монтаж кабеля;2575.0;м;м +ГГС. Монтаж кабеля;Монтаж кабеля;320.0;м;м +ГГС. Устройство трубы гофрированной с держателями;Монтаж трубы гофрированной;315.0;м;м +СКС. Монтаж блока оптического;Монтаж оптического кросса;1.0;шт;шт +СКС. Монтаж адаптеров, пигтейл, патч корд;Монтаж провода, кабеля связи;89.0;м;м +ЛВС. Установка шкафа Rittal;Монтаж шкафа;1.0;шт;шт +ЛВС. Установка коммутаторов и модуля;Установка и сборка блока промежуточного;5.0;комплект;комплект +СБП. Монтаж источника бесперебойного питания;Преобразователь, блоки питания, источники бесперебойного питания;1.0;шт;шт +СБП. Монтаж карты управления и мониторинга;Монтаж асутп блока контроля и управления;1.0;шт;шт +СКС. Установка коробок с розеткой;Монтаж соединительных коробок и муфт;52.0;шт;шт +ЛВС. Электрическая проверка и настройка;Электрическая проверка технических характеристик приборов и датчиков;72.0;комплект;комплект +СТС. Установка аппаратов телефонных;Монтаж оборудования телефонной связи;50.0;шт;шт +СТС. Проверка и настройка АТС;Конфигурирование и настройка оборудования;1.0;шт;шт +ГГС. Установка громкоговорителей, IP- пульта;Укладка георешетки, габионов;39.0;комплект;комплект +Монтаж МК крепления Профлиста цоколь (Швеллер 100*50*4);Монтаж кровельного покрытия из профлиста;0.86;м2;м2 +Монтаж кронштейнов Кр1;Монтаж колонн одноэтажных зданий;50.0;т;т +Зашивка цоколя профлистом С8-1150-0,7;Устройство стяжек цементно-песчаных;102.7;м2;м2 +Монтаж цветных кассет на фасаде здания;Монтаж витражей, витрин и остекленных панелей фасадов;80.15;м2;м2 +Демонтаж нащельников, с учетом герметика;Демонтаж металлических щитов опалубки;420.0;шт;шт +Монтаж светильников на фасаде Глобус G300 - 8 шт., двухсторонний - 8 шт.;Монтаж наружных светильников;16.0;шт;шт +Монтаж светового короба СК-8 Общежитие №3;Монтаж соединительных коробок и муфт;1.0;шт;шт +Монтаж мк (решетки, ограждения);Монтаж металлоконструкций (м/к);0.27;тн;т +Демонтаж мк (решетки, ограждения);Монтаж металлоконструкций (м/к);0.22;тн;т +Подшивка козырька;Монтаж кожуха;18.0;шт;шт +АКЗ МК входной группы;АКЗ свай и металлоконструкций (м/к);33.86;м2;м2 +Демонтаж мк (решетки, ограждения);Монтаж металлоконструкций (м/к);0.22;тн;т +Монтаж мк (решетки, ограждения);Монтаж металлоконструкций (м/к);0.29;тн;т +Подшивка козырька;Монтаж кожуха;18.0;шт;шт +Монтаж МК крепления Профлиста цоколь (Швеллер 100*50*4);Монтаж кровельного покрытия из профлиста;0.8;м2;м2 +АКЗ МК входной группы;АКЗ свай и металлоконструкций (м/к);30.0;м2;м2 +Демонтаж мк (решетки, ограждения);Монтаж металлоконструкций (м/к);0.22;тн;т +Монтаж мк (решетки, ограждения);Монтаж металлоконструкций (м/к);0.29;тн;т +Подшивка козырька;Монтаж кожуха;18.0;шт;шт +АКЗ МК входной группы;АКЗ свай и металлоконструкций (м/к);33.86;м2;м2 +Монтаж гофры;Монтаж трубы гофрированной;70.0;м;м +Монтаж кабеля 5х6;Монтаж кабеля;100.0;м;м +Монтаж кабеля 3х2.5;Монтаж кабеля;90.0;м;м diff --git a/examples/electroline_field_dev_demo.csv b/examples/electroline_field_dev_demo.csv new file mode 100644 index 00000000..2dc47800 --- /dev/null +++ b/examples/electroline_field_dev_demo.csv @@ -0,0 +1,11 @@ +activity_name;granular_name;volume;measurement;granular_measurement +Бурение лидерных скважин;Бурение лидерных скважин;25.0;шт;шт +Установка в скважины свай;Установка в скважины свай;18.0;шт;шт +Монтаж оголовников;Монтаж оголовков;14.0;шт;шт +Монтаж ростверков и опорных конструкций под порталы, опоры ВЛ;Монтаж ростверков и опорных конструкций под порталы, опоры вл;4.0;шт;шт +Сборка опор/порталов;Сборка опор/порталов;2.0;шт;шт +Установка опор/порталов;Установка опор/порталов;2.0;шт;шт +Подвеска провода;Подвеска провода;200.0;м.;м +Подвеска грозозащитного троса;Подвеска грозозащитного троса;160.0;м.;м +Укладка полосового заземления;Укладка полосового заземления;24.0;м.;м +Укладка активного соляного заземления;Укладка активного соляного заземления;35.6;шт;шт diff --git a/examples/field_dev_resources_time_estimator.py b/examples/field_dev_resources_time_estimator.py new file mode 100644 index 00000000..689b1283 --- /dev/null +++ b/examples/field_dev_resources_time_estimator.py @@ -0,0 +1,75 @@ +from itertools import chain +from operator import attrgetter +from random import Random +from sampo.schemas.time import Time + +from typing import Type + +from sampo.utilities.collections_util import build_index +from sampo.schemas import WorkTimeEstimator, WorkUnit, Worker, WorkerReq, WorkEstimationMode, WorkerProductivityMode +from idbadapter import MschmAdapter +from stairsres.res_time_model import ResTimeModel + + +class FieldDevWorkEstimator(WorkTimeEstimator): + def __init__(self, + url: str, + rand: Random = Random()): + self._url = url + self._model = ResTimeModel(MschmAdapter(url)) + self._use_idle = True + self._estimation_mode = WorkEstimationMode.Realistic + self.rand = rand + self._productivity_mode = WorkerProductivityMode.Static + + def estimate_time(self, work_unit: WorkUnit, worker_list: list[Worker]): + w_u = {'name': work_unit.name.split('_stage_')[0], + 'volume': work_unit.volume, + 'measurement': work_unit.volume_type} + w_l = [{'name': w.name, '_count': w.count} for w in worker_list] + name2worker = build_index(worker_list, attrgetter('name')) + if self._estimation_mode == WorkEstimationMode.Realistic: + mode_str = '0.5' + elif self._estimation_mode == WorkEstimationMode.Optimistic: + mode_str = '0.1' + else: + mode_str = '0.9' + + for res_req in work_unit.worker_reqs: + if name2worker.get(res_req.kind, None) is None: + w_l.append({'name': res_req.kind, '_count': 0}) + if w_u['name'] in ['Начало работ по марке', 'Окончание работ по марке', 'NaN', 'start of project', + 'finish of project']: + return Time(0) + try: + return Time(int(self._model.estimate_time(work_unit=w_u, worker_list=w_l, mode=mode_str))) + except: + print(w_u['name']) + + def find_work_resources(self, work_name: str, work_volume: float, + resource_name: list[str] | None = None, + measurement: str = None) \ + -> list[WorkerReq]: + if work_name in ['Начало работ по марке', 'Окончание работ по марке', 'NaN', 'start of project', + 'finish of project']: + return [] + worker_req_dict = self._model.get_resources_volumes(work_name=work_name, work_volume=work_volume, + measurement=measurement) + + worker_reqs = [[WorkerReq(kind=req['kind'], + volume=Time(req['volume']), + min_count=req['min_count'], + max_count=req['max_count']) for req in worker_req] for + worker_req in + worker_req_dict.values()] + return list(chain.from_iterable(worker_reqs)) + + def set_estimation_mode(self, use_idle: bool = True, mode: WorkEstimationMode = WorkEstimationMode.Realistic): + self._use_idle = use_idle + self._estimation_mode = mode + + def set_productivity_mode(self, mode: WorkerProductivityMode = WorkerProductivityMode.Static): + self._productivity_mode = mode + + def get_recreate_info(self) -> tuple[Type, tuple]: + return FieldDevWorkEstimator, tuple(self._url) diff --git a/examples/gas_network_field_dev_demo.csv b/examples/gas_network_field_dev_demo.csv new file mode 100644 index 00000000..5fe0850a --- /dev/null +++ b/examples/gas_network_field_dev_demo.csv @@ -0,0 +1,27 @@ +activity_name;granular_name;volume;measurement;granular_measurement +Изготовление свай;Изготовление металлических свай;1496.0;шт;шт +Бурение скважин;Бурение скважин;1496.0;шт;шт +Погружение свай;Погружение свай;1496.0;шт;шт +Заполнение полости свай ЦПС;Забивка свай;1500.0;шт;шт +Срезка свай, монтаж оголовков;Срезка голов металлических свай;1496.0;шт;шт +Засыпка пространства между сваями щебнем фракции 15-20 мм;Отсыпка площадки щебнем;82.8;м3;м3 +Монтаж деформационных марок;Монтаж деформационной марки;100.0;шт;шт +Монтаж траверс;Монтаж траверс;945.0;шт;шт +Монтаж м/к (связи, стойки, упоры, подкосы);Монтаж металлоконструкций (м/к);148.6;шт;шт +Устройство термометрических скважин;Устройство термометрических скважин;11.0;шт;шт +Монтаж термометрических трубок;Монтаж термометрической трубки;59.0;шт;шт +Устройство песчанной подушки;Устройство песчаного основания (подушки);144.47;м3;м3 +Укладка габионов;Укладка георешетки, габионов;92.0;м2;м2 +Заполнение габионов щебнем фракции 70-120мм;Укладка геосеток, георешеток, габионов с заполнением щебнем;247.97;м2;м2 +Монтаж термостабилизаторов;Монтаж термостабилизаторов;81.0;шт;шт +АКЗ свай и металлоконструкций;АКЗ свай и металлоконструкций (м/к);11017.0;м2;м2 +Монтаж опор DN 500 (неподвижная, направляющая, скользящая);Монтаж опор;84.0;шт;шт +Сварка газопровода 530х24 мм;Сварка трубопроводов;203.0;стык;стык +Надземная прокладка газопровода 530х24 мм;Прокладка наружной канализации;1267.12;м;м +Монтаж опор метанолопровода;Монтаж опор трубопровода;238.0;шт;шт +Сварка метанолопровода 57х6мм;Автоматическая сварка труб;121.0;стык;стык +Надземная прокладка метанолопровода 57х6мм;Провод для систем опс, прокладываемый по металлическим основаниям;1200.17;м;м +Монтаж заземления;Монтаж заземлений;100.0;м;м +Очистка полости трубопроводов;Очистка полости трубопровода;100.0;м3;м3 +Гидроиспытания трубопроводов;Гидроиспытания резервуара;100.0;шт;шт +Изоляция сварных соединений газопровода;Изоляция сварных стыков;203.0;стык;стык diff --git a/examples/smeta1_house_building_demo.csv b/examples/smeta1_house_building_demo.csv new file mode 100644 index 00000000..7e347e4e --- /dev/null +++ b/examples/smeta1_house_building_demo.csv @@ -0,0 +1,33 @@ +activity_name;granular_name;volume;measurement;granular_measurement +Разработка скального грунта отбойными молотками, группа грунтов: 7;Разработка грунта вручную;74.7;м3;м3 +Разработка грунта с погрузкой на автомобили-самосвалы экскаваторами с ковшом вместимостью 0,65 (0,5-1) м3, группа грунтов: 6;Разработка экскаватором грунта;747.0;м3;м3 +Работа на отвале, группа грунтов: 5-6;Отсыпка грунтом;747.0;м3;м3 +Разработка грунта с погрузкой на автомобили-самосвалы экскаваторами с ковшом вместимостью 0,65 (0,5-1) м3, группа грунтов: 3;Разработка экскаватором грунта;388.0;м3;м3 +Засыпка траншей и котлованов с перемещением грунта до 5 м бульдозерами мощностью 96 (130) кВт (л.с.), группа грунтов: 2;Засыпка траншей и котлованов;204.0;м3;м3 +При перемещении грунта на каждые последующие 5 м добавлять: к расценке 01-01-034-2;Дополнительная перекидка грунта экскаватором;204.0;м3;м3 +Уплотнение грунта пневматическими трамбовками, группа грунтов: 1, 2;Уплотнение грунта;204.0;м3;м3 +Засыпка вручную траншей, пазух котлованов и ям, группа грунтов: 2;Засыпка траншей и котлованов;184.0;м3;м3 +Устройство бетонной подготовки;Устройство бетонной подготовки;12.0;м3;м3 +Устройство ленточных фундаментов железобетонных;Устройство монолитных железобетонных конструкций оснований;29.0;м3;м3 +Установка блоков стен подвалов массой: до 0,5 т;Установка фундаментных блоков;230.0;шт;шт +Установка блоков стен подвалов массой: до 1 т;Установка фундаментных блоков;128.0;шт;шт +Установка блоков стен подвалов массой: до 1,5 т;Установка фундаментных блоков;127.0;шт;шт +Устройство стен подвалов и подпорных стен: бетонных (заделки);Устройство песчаного основания (подушки);12.0;м3;м3 +Устройство поясов: в опалубке;Установка опалубки;15.0;м3;м3 +Гидроизоляция стен, фундаментов горизонтальная оклеечная: в 2 слоя;Гидроизоляция оклеечная;125.0;м2;м2 +Кладка стен наружных простых при высоте этажа до 4 м из кирпича: керамического одинарного;Кирпичная кладка наружных стен;1.84;м3;м3 +Кладка стен внутренних при высоте этажа до 4 м из кирпича: керамического одинарного;Кирпичная кладка наружных стен;11.64;м3;м3 +Кладка стен из легкобетонных камней без облицовки при высоте этажа: до 4 м;Кладка наружных стен;0.45;м2;м2 +Установка арматурных стыковых накладок ;Установка арматурных сеток;0.06;т;т +Устройство монолитных участков;Устройство монолитных участков из бетона;3.2;м2;м2 +Устройство подстилающих слоев: бетонных;Устройство подстилающего слоя бетонного;2.33;м3;м3 +Устройство стяжек цементных: на каждые 5 мм изменения толщины стяжки добавлять или исключать к расценке 11-01-011-01;Устройство цементной стяжки;13.0;м2;м2 +Устройство стяжек цементных: на каждые 5 мм изменения толщины стяжки добавлять или исключать к расценке 11-01-011-01;Устройство цементной стяжки;16.0;м2;м2 +Устройство покрытий бетонных: толщиной 30 мм;Устройство бетонного основания;29.0;м3;м3 +Устройство покрытий бетонных: на каждые 5 мм изменения толщины;Устройство бетонного основания;29.0;м3;м3 +Установка блоков в наружных и внутренних дверных проемах: в каменных стенах площадью проема до 3 м2;Установка дверных блоков;1.6;м2;м2 +Установка блоков в наружных и внутренних дверных проемах: в каменных стенах площадью проема до 3 м2;Установка дверных блоков;1.8;м2;м2 +Установка блоков в наружных и внутренних дверных проемах: в перегородках и деревянных нерубленых стенах площадью проема до 3 м2;Установка дверных блоков;1.8;м2;м2 +Кладка стен внутренних при высоте этажа до 4 м из кирпича: керамического одинарного;Кирпичная кладка наружных стен;0.76;м3;м3 +Устройство лестниц по готовому основанию из отдельных ступеней: гладких;Устройство песчаного основания (подушки);14.4;м3;м3 +Монтаж связей и распорок из одиночных и парных уголков, гнутосварных профилей для пролетов до 24 м при высоте здания: до 25 м;Сооружение пролетных строений;0.008;м;м diff --git a/examples/smeta2_house_building_demo.csv b/examples/smeta2_house_building_demo.csv new file mode 100644 index 00000000..8b5d65d9 --- /dev/null +++ b/examples/smeta2_house_building_demo.csv @@ -0,0 +1,39 @@ +activity_name;granular_name;volume;measurement;granular_measurement +Ручная разработка грунта под ленточный фундамент без вывоза;Разработка грунта вручную;22.0;м3;м3 +Работы по установке опалубки, армированию, бетонированию фундамента и демонтажа опалубки;Установка опалубки;35.0;м3;м3 +Устройство вводов водоснабжения и канализации в дом (работа и материал, необходимо выполнить до бетонирования пола);Сооружение внутренних систем канализации;1.0;м;м +Работа по обратной засыпке цоколя с уплотнением вибротрамбовкой;Обратная засыпка грунта экскаватором;1.0;м3;м3 +Работа по устройству железобетонного пола (армирование и бетонирование);Устройство полов бетонных с армированием;14.0;м2;м2 +Работа по устройству монолитных железобетонных балок в конструкции пола;Устройство монолитных железобетонных конструкций оснований;12.4;м3;м3 +Кладка лицевого кирпича Вид 1;Кирпичная кладка;5354.0;м2;м2 +Кладка выделений лицевого кирпича Вид 2 (баварская кладка на белом шве);Кирпичная кладка наружных стен;664.0;м3;м3 +Устройство арок (Кладка криволинейных элементов входной группы,изготовление лекал, установка, демонтаж);Установка дефлекторов, зонтов, узлов прохода;1.7;шт;шт +Запил лицевого кирпича под углом на эркерной группе;Кирпичная кладка наружных стен;45.0;м3;м3 +Кладка кирпича на перевязку плит;Укладка переходных плит;595.0;шт;шт +Кладка вентиляционных каналов из кирпича пластического формирования;Кладка наружных стен;66.0;м2;м2 +Сборка и разборка лесов;Установка и разборка наружных трубчатых, инвентарных лесов;100.0;м2;м2 +Работа по монтажу монолитных железобетонных балок;Устройство монолитных железобетонных конструкций оснований;2.0;м3;м3 +Устройство монолитных армированных перемычек над оконными и дверными проемами в несущих стенах шириной 250 мм с опиранием на стены 250мм (установка опалубки, армирование, бетонирование).;Монтаж металлических перемычек;18.2;шт;шт +Устройство металлических перемычек в перегородках (резка, покраска, монтаж);Монтаж металлических перемычек;7.0;шт;шт +Монтаж плит перекрытия;Монтаж плит;10.0;шт;шт +Работа по монтажу монолитного участка перекрытия ( установка инвентарной опалубки, армирование и бетонирование);Устройство монолитных участков из бетона;21.5;м2;м2 +Работа по устройству монолитной железобетонной лестницы;Устройство монолитных железобетонных конструкций оснований;18.0;м3;м3 +Кладка лицевого кирпича Вид 1;Кирпичная кладка;4856.0;м2;м2 +Кладка выделений лицевого кирпича Вид 2 (баварская кладка на белом шве);Кирпичная кладка наружных стен;817.0;м3;м3 +Устройство арок (Кладка криволинейных элементов входной группы,изготовление лекал, установка, демонтаж);Установка дефлекторов, зонтов, узлов прохода;2.7;шт;шт +Запил лицевого кирпича под углом на эркерной группе;Кирпичная кладка наружных стен;44.0;м3;м3 +Кладка вентиляционных каналов из кирпича пластического формования;Кирпичная кладка наружных стен;927.0;м3;м3 +Кладка вентиляционных каналов из лицевого кирпича Вид 1;Кирпичная кладка наружных стен;522.0;м3;м3 +Монтаж асбестоцементной трубы с утеплением в вентиляционный канал;Монтаж вентиляционных труб;1.0;стык;стык +Сборка и разборка лесов;Установка и разборка наружных трубчатых, инвентарных лесов;100.0;м2;м2 +Устройство монолитных армированных перемычек над оконными и дверными проемами в несущих стенах шириной 250 мм с опиранием на стены 250мм (установка опалубки, армирование, бетонирование).;Монтаж металлических перемычек;20.8;шт;шт +Устройство металлических перемычек в перегородках (резка, покраска, монтаж);Монтаж металлических перемычек;5.5;шт;шт +Устройство мауэрлат из доски 150х50мм (в том числе монтаж гидроизоляции);Устройство гидроизоляции опор мостов;63.0;м2;м2 +Устройство стропильной системы из доски 150х50мм с шагом 780мм;Установка в одноэтажных зданиях стропильных ферм;154.0;т;т +Устройство контробрешетки по скатам из бруса 25х50мм;Устройство покрытия из брусчатки и отмосток;154.0;м2;м2 +Монтаж водосточной системы;Монтаж водоотводных устройств;46.0;м2;м2 +Монтаж доборных элементов (планки, примыкания);Монтаж модулей, блок-боксов;230.0;шт;шт +Утепление толщиной 150мм и пароизоляция (закрывается тепловой контур);Теплоизоляция покрытий и перекрытий мин. плитами;117.0;м3;м3 +Монтаж металлочерепицы;Монтаж металлоконструкций;154.0;т;т +Обшивка вентиляционных каналов профлистом С-8 с утеплением;Монтаж системы приточной вентиляции;2.0;комплект;комплект +Монтаж козырька на вентиляционную трубу;Монтаж вентиляционных труб;2.0;стык;стык diff --git a/poetry.lock b/poetry.lock index 24a4d23c..b71e58d7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,29 +1,28 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "attrs" -version = "22.2.0" +version = "23.2.0" description = "Classes Without Boilerplate" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -33,96 +32,86 @@ files = [ [[package]] name = "contourpy" -version = "1.0.7" +version = "1.2.1" description = "Python library for calculating contours of 2D quadrilateral grids" -category = "main" optional = false -python-versions = ">=3.8" -files = [ - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, - {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, - {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, - {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, - {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, - {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, - {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, - {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, - {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, - {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, ] [package.dependencies] -numpy = ">=1.16" +numpy = ">=1.20" [package.extras] -bokeh = ["bokeh", "chromedriver", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] -test = ["Pillow", "matplotlib", "pytest"] -test-no-images = ["pytest"] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "cycler" -version = "0.11.0" +version = "0.12.1" description = "Composable style cycles" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "deap" version = "1.3.3" description = "Distributed Evolutionary Algorithms in Python" -category = "main" optional = false python-versions = "*" files = [ @@ -154,29 +143,28 @@ numpy = "*" [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" -category = "main" +version = "0.3.8" +description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -184,35 +172,73 @@ test = ["pytest (>=6)"] [[package]] name = "fonttools" -version = "4.39.0" +version = "4.53.0" description = "Tools to manipulate font files" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.39.0-py3-none-any.whl", hash = "sha256:f5e764e1fd6ad54dfc201ff32af0ba111bcfbe0d05b24540af74c63db4ed6390"}, - {file = "fonttools-4.39.0.zip", hash = "sha256:909c104558835eac27faeb56be5a4c32694192dca123d073bf746ce9254054af"}, + {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, + {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, + {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, + {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, + {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, + {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, + {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, + {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, + {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, + {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, + {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, + {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, + {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, + {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -222,87 +248,121 @@ files = [ [[package]] name = "kiwisolver" -version = "1.4.4" +version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] [[package]] name = "matplotlib" version = "3.6.3" description = "Python plotting package" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -361,304 +421,273 @@ pyparsing = ">=2.2.1" python-dateutil = ">=2.7" [[package]] -name = "multiprocess" -version = "0.70.14" -description = "better multiprocessing and multithreading in python" -category = "main" +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" files = [ - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:560a27540daef4ce8b24ed3cc2496a3c670df66c96d02461a4da67473685adf3"}, - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-manylinux_2_24_i686.whl", hash = "sha256:bfbbfa36f400b81d1978c940616bc77776424e5e34cb0c94974b178d727cfcd5"}, - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:89fed99553a04ec4f9067031f83a886d7fdec5952005551a896a4b6a59575bb9"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:40a5e3685462079e5fdee7c6789e3ef270595e1755199f0d50685e72523e1d2a"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-manylinux_2_24_i686.whl", hash = "sha256:44936b2978d3f2648727b3eaeab6d7fa0bedf072dc5207bf35a96d5ee7c004cf"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e628503187b5d494bf29ffc52d3e1e57bb770ce7ce05d67c4bbdb3a0c7d3b05f"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d5da0fc84aacb0e4bd69c41b31edbf71b39fe2fb32a54eaedcaea241050855c"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-manylinux_2_24_i686.whl", hash = "sha256:6a7b03a5b98e911a7785b9116805bd782815c5e2bd6c91c6a320f26fd3e7b7ad"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:cea5bdedd10aace3c660fedeac8b087136b4366d4ee49a30f1ebf7409bce00ae"}, - {file = "multiprocess-0.70.14-py310-none-any.whl", hash = "sha256:7dc1f2f6a1d34894c8a9a013fbc807971e336e7cc3f3ff233e61b9dc679b3b5c"}, - {file = "multiprocess-0.70.14-py37-none-any.whl", hash = "sha256:93a8208ca0926d05cdbb5b9250a604c401bed677579e96c14da3090beb798193"}, - {file = "multiprocess-0.70.14-py38-none-any.whl", hash = "sha256:6725bc79666bbd29a73ca148a0fb5f4ea22eed4a8f22fce58296492a02d18a7b"}, - {file = "multiprocess-0.70.14-py39-none-any.whl", hash = "sha256:63cee628b74a2c0631ef15da5534c8aedbc10c38910b9c8b18dcd327528d1ec7"}, - {file = "multiprocess-0.70.14.tar.gz", hash = "sha256:3eddafc12f2260d27ae03fe6069b12570ab4764ab59a75e81624fac453fbf46a"}, + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, ] -[package.dependencies] -dill = ">=0.3.6" +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numpy" -version = "1.23.5" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, - {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, - {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, - {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, - {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, - {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, - {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, - {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, - {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, - {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, - {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, +version = "1.25.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, + {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, + {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, + {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, + {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, + {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, + {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, + {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, + {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, + {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, + {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, + {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, ] [[package]] name = "packaging" -version = "23.0" +version = "24.1" description = "Core utilities for Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "pandas" -version = "1.5.3" +version = "2.2.2" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, - {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, - {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, - {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, - {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, - {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, - {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, - {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, ] [package.dependencies] -numpy = {version = ">=1.21.0", markers = "python_version >= \"3.10\""} -python-dateutil = ">=2.8.1" +numpy = {version = ">=1.22.4", markers = "python_version < \"3.11\""} +python-dateutil = ">=2.8.2" pytz = ">=2020.1" +tzdata = ">=2022.7" [package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] - -[[package]] -name = "pathos" -version = "0.3.0" -description = "parallel graph management and execution in heterogeneous computing" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathos-0.3.0-py3-none-any.whl", hash = "sha256:b1f5a79b1c79a594330d451832642ee5bb61dd77dc75ba9e5c72087c77e8994c"}, - {file = "pathos-0.3.0.tar.gz", hash = "sha256:24fa8db51fbd9284da8e191794097c4bb2aa3fce411090e57af6385e61b97e09"}, -] - -[package.dependencies] -dill = ">=0.3.6" -multiprocess = ">=0.70.14" -pox = ">=0.3.2" -ppft = ">=1.7.6.6" +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] [[package]] name = "pillow" -version = "9.4.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, - {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, - {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, - {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, - {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, - {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, - {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, - {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, - {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, - {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, - {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, - {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, - {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, - {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, - {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, - {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, - {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, - {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, - {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, - {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, - {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, - {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, - {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, - {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, - {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, - {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "plotly" -version = "5.11.0" +version = "5.17.0" description = "An open-source, interactive data visualization library for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "plotly-5.11.0-py2.py3-none-any.whl", hash = "sha256:52fd74b08aa4fd5a55b9d3034a30dbb746e572d7ed84897422f927fdf687ea5f"}, - {file = "plotly-5.11.0.tar.gz", hash = "sha256:4efef479c2ec1d86dcdac8405b6ca70ca65649a77408e39a7e84a1ea2db6c787"}, + {file = "plotly-5.17.0-py2.py3-none-any.whl", hash = "sha256:7c84cdf11da162423da957bb093287134f2d6f170eb9a74f1459f825892247c3"}, + {file = "plotly-5.17.0.tar.gz", hash = "sha256:290d796bf7bab87aad184fe24b86096234c4c95dcca6ecbca02d02bdf17d3d97"}, ] [package.dependencies] +packaging = "*" tenacity = ">=6.2.0" [[package]] name = "pluggy" -version = "1.0.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pox" -version = "0.3.2" -description = "utilities for filesystem exploration and automated builds" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pox-0.3.2-py3-none-any.whl", hash = "sha256:56fe2f099ecd8a557b8948082504492de90e8598c34733c9b1fdeca8f7b6de61"}, - {file = "pox-0.3.2.tar.gz", hash = "sha256:e825225297638d6e3d49415f8cfb65407a5d15e56f2fb7fe9d9b9e3050c65ee1"}, -] - -[[package]] -name = "ppft" -version = "1.7.6.6" -description = "distributed and parallel python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ppft-1.7.6.6-py3-none-any.whl", hash = "sha256:f355d2caeed8bd7c9e4a860c471f31f7e66d1ada2791ab5458ea7dca15a51e41"}, - {file = "ppft-1.7.6.6.tar.gz", hash = "sha256:f933f0404f3e808bc860745acb3b79cd4fe31ea19a20889a645f900415be60f1"}, -] - -[package.extras] -dill = ["dill (>=0.3.6)"] - [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -668,7 +697,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pytest" version = "7.2.2" description = "pytest: simple powerful testing with Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -690,14 +718,13 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -705,21 +732,19 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2022.7.1" +version = "2024.1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ - {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, - {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] name = "scipy" version = "1.9.3" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -758,7 +783,6 @@ test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "sciki name = "seaborn" version = "0.12.2" description = "Statistical data visualization" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -780,7 +804,6 @@ stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -792,7 +815,6 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" optional = false python-versions = "*" files = [ @@ -802,24 +824,23 @@ files = [ [[package]] name = "tenacity" -version = "8.2.2" +version = "8.4.2" description = "Retry code until it succeeds" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, + {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, ] [package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -831,7 +852,6 @@ files = [ name = "toposort" version = "1.10" description = "Implements a topological sort algorithm." -category = "main" optional = false python-versions = "*" files = [ @@ -839,7 +859,18 @@ files = [ {file = "toposort-1.10.tar.gz", hash = "sha256:bfbb479c53d0a696ea7402601f4e693c97b0367837c8898bc6471adfca37a6bd"}, ] +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.11" -content-hash = "03ed0c6fd94974b8dfdaabe1dc372ea5f942ff8bbb0ecc83a8fb66c9f6ed76a7" +content-hash = "9c4d54683b0680df2d2775438b847f9af74f4a0c817a9bd6ec53a8cfdb3b1a17" diff --git a/pyproject.toml b/pyproject.toml index 72fd8cb9..7a25dd74 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "sampo" -version = "0.1.1.341" +version = "0.1.1.342" description = "Open-source framework for adaptive manufacturing processes scheduling" authors = ["iAirLab "] license = "BSD-3-Clause" @@ -21,6 +21,8 @@ seaborn = ">=0.12.1,<0.13.0" matplotlib = ">=3.6.2,<3.7.0" plotly = ">=5.17.0,<5.18.0" pytest = ">=7.2.0,<7.3.0" +dill = "0.3.8" +networkx = "3.3" [build-system] diff --git a/sampo/scheduler/timeline/just_in_time_timeline.py b/sampo/scheduler/timeline/just_in_time_timeline.py index 61cd0f77..37e4fb69 100644 --- a/sampo/scheduler/timeline/just_in_time_timeline.py +++ b/sampo/scheduler/timeline/just_in_time_timeline.py @@ -250,7 +250,8 @@ def schedule(self, if assigned_time is not None: exec_times = {n: (Time(0), assigned_time // len(inseparable_chain)) - for n in inseparable_chain} + for n in inseparable_chain[:-1]} + exec_times[inseparable_chain[-1]] = Time(0), assigned_time - sum([v for _, v in exec_times.values()]) return self._schedule_with_inseparables(node, node2swork, workers, contractor, spec, inseparable_chain, start_time, exec_times, work_estimator) else: diff --git a/sampo/scheduler/timeline/momentum_timeline.py b/sampo/scheduler/timeline/momentum_timeline.py index 860ea3cd..e5bbc474 100644 --- a/sampo/scheduler/timeline/momentum_timeline.py +++ b/sampo/scheduler/timeline/momentum_timeline.py @@ -403,7 +403,8 @@ def schedule(self, assigned_parent_time, work_estimator) if assigned_time is not None: exec_times = {n: (Time(0), assigned_time // len(inseparable_chain)) - for n in inseparable_chain} + for n in inseparable_chain[:-1]} + exec_times[inseparable_chain[-1]] = Time(0), assigned_time - sum([v for _, v in exec_times.values()]) # TODO Decide how to deal with exec_times(maybe we should remove using pre-computed exec_times) self._schedule_with_inseparables(node, node2swork, inseparable_chain, spec, diff --git a/sampo/schemas/time_estimator.py b/sampo/schemas/time_estimator.py index a7e9b7b2..cf6fc988 100644 --- a/sampo/schemas/time_estimator.py +++ b/sampo/schemas/time_estimator.py @@ -36,7 +36,9 @@ def set_productivity_mode(self, mode: WorkerProductivityMode = WorkerProductivit ... @abstractmethod - def find_work_resources(self, work_name: str, work_volume: float, resource_name: list[str] | None = None) \ + def find_work_resources(self, work_name: str, work_volume: float, + resource_name: list[str] | None = None, + measurement: str | None = None) \ -> list[WorkerReq]: ... @@ -60,7 +62,8 @@ def __init__(self, self._productivity = {worker: {'__ALL__': IntervalGaussian(1, 0.2, 1, 0)} for worker in ['driver', 'fitter', 'manager', 'handyman', 'electrician', 'engineer']} - def find_work_resources(self, work_name: str, work_volume: float, resource_name: list[str] | None = None) \ + def find_work_resources(self, work_name: str, work_volume: float, measurement: str | None = None, + resource_name: list[str] | None = None) \ -> list[WorkerReq]: if resource_name is None: resource_name = ['driver', 'fitter', 'manager', 'handyman', 'electrician', 'engineer'] diff --git a/sampo/userinput/parser/csv_parser.py b/sampo/userinput/parser/csv_parser.py index fa540152..be2d34f5 100644 --- a/sampo/userinput/parser/csv_parser.py +++ b/sampo/userinput/parser/csv_parser.py @@ -124,11 +124,12 @@ def work_graph(works_info: pd.DataFrame, works_info.activity_name = works_info.activity_name.apply(lambda name: name_mapper[name]) resources = [dict((worker_req.kind, int(worker_req.volume)) - for worker_req in work_resource_estimator.find_work_resources(w[0], float(w[1]))) - for w in works_info.loc[:, ['granular_name', 'volume']].to_numpy()] + for worker_req in work_resource_estimator.find_work_resources(work_name=w[0], + work_volume=float(w[1]), + measurement=w[2])) + for w in works_info.loc[:, ['granular_name', 'volume', 'measurement']].to_numpy()] unique_res = list(set(chain(*[r.keys() for r in resources]))) - # works_info.loc[:, unique_res] = DataFrame(resources).fillna(0) works_resources = add_graph_info(works_info) works_resources = topsort_graph_df(works_resources) diff --git a/sampo/userinput/parser/general_build.py b/sampo/userinput/parser/general_build.py index 8aa99425..f37fa828 100644 --- a/sampo/userinput/parser/general_build.py +++ b/sampo/userinput/parser/general_build.py @@ -245,7 +245,9 @@ def build_work_graph(frame: pd.DataFrame, resource_names: list[str], work_estima row['min_req'][res_name], row['max_req'][res_name])) else: - reqs = work_estimator.find_work_resources(row['granular_name'], float(row['volume'])) + reqs = work_estimator.find_work_resources(work_name=row['granular_name'], + work_volume=float(row['volume']), + measurement=row['measurement']) is_service_unit = len(reqs) == 0 zone_reqs = [ZoneReq(*v) for v in eval(row['required_statuses']).items()] \ diff --git a/sampo/utilities/visualization/schedule.py b/sampo/utilities/visualization/schedule.py index 357c02f3..e9eb72d0 100644 --- a/sampo/utilities/visualization/schedule.py +++ b/sampo/utilities/visualization/schedule.py @@ -108,7 +108,7 @@ def get_zone_usage_info(swork) -> str: .apply(lambda r: 'Defect' if ':' in r['task_name'] else r['contractor'], axis=1) schedule_dataframe['idx'] = (schedule_dataframe[['idx', 'task_name']] .apply(lambda r: schedule_dataframe[schedule_dataframe['task_name'] == - r['task_name'].split(':')[0]]['idx'].iloc[0] + r['task_name'].split('&')[0]]['idx'].iloc[0] if ':' in r['task_name'] else r['idx'], axis=1)) fig = px.timeline(schedule_dataframe, x_start='start', x_end='finish', y='idx', hover_name='task_name',