diff --git a/.flake8 b/.flake8 index 20a4d6b..c526365 100644 --- a/.flake8 +++ b/.flake8 @@ -7,6 +7,7 @@ per-file-ignores = exclude = MapAnalyzer sc2_helper + cython_extensions tests/generate_pickle_data.py.py tests/test_run.py tests/conftest.py diff --git a/.gitignore b/.gitignore index 899dfd3..ad2b152 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,10 @@ # Byte-compiled / optimized / DLL files __pycache__/ -*.py[cod] -*$py.class +#*.py[cod] +#*$py.class # C extensions -*.so +# *.so # Distribution / packaging .Python @@ -130,6 +130,3 @@ dmypy.json # PyCharm .idea - -# cython compiled c code -src/ares/*/*.c diff --git a/build.py b/build.py deleted file mode 100644 index d504e69..0000000 --- a/build.py +++ /dev/null @@ -1,60 +0,0 @@ -import os -import platform -import shutil -from distutils.command.build_ext import build_ext -from distutils.core import Distribution, Extension - -import numpy -from Cython.Build import cythonize - -link_args = [] -include_dirs = [numpy.get_include()] -libraries = [] - - -def build(): - ext_modules = [] - for root, directories, files in os.walk("src"): - for file in files: - if file.endswith("pyx"): - file_name = file.split(".")[0] - if platform.system() == "Windows": - _path = root.replace("\\", ".") - else: - _path = root.replace("/", ".") - - module = Extension( - name=f"{_path}.{file_name}", - sources=[ - os.path.join(root, file), - ], - extra_link_args=link_args, - include_dirs=include_dirs, - libraries=libraries, - ) - ext_modules.append(module) - - ext_modules = cythonize( - ext_modules, - include_path=include_dirs, - compiler_directives={"binding": True, "language_level": 3}, - ) - - distribution = Distribution({"name": "extended", "ext_modules": ext_modules}) - distribution.package_dir = "extended" - - cmd = build_ext(distribution) - cmd.ensure_finalized() - cmd.run() - - # Copy built extensions back to the project - for output in cmd.get_outputs(): - relative_extension = os.path.relpath(output, cmd.build_lib) - shutil.copyfile(output, relative_extension) - mode = os.stat(relative_extension).st_mode - mode |= (mode & 0o444) >> 2 - os.chmod(relative_extension, mode) - - -if __name__ == "__main__": - build() diff --git a/docs/api_reference/cython_extensions/combat_utils.md b/docs/api_reference/cython_extensions/combat_utils.md deleted file mode 100644 index 87ec7fa..0000000 --- a/docs/api_reference/cython_extensions/combat_utils.md +++ /dev/null @@ -1,4 +0,0 @@ - -::: ares.stubs.combat_utils - options: - show_root_heading: false diff --git a/docs/api_reference/cython_extensions/general_utils.md b/docs/api_reference/cython_extensions/general_utils.md deleted file mode 100644 index 8ec4083..0000000 --- a/docs/api_reference/cython_extensions/general_utils.md +++ /dev/null @@ -1,3 +0,0 @@ -::: ares.stubs.general_utils - options: - show_root_heading: false diff --git a/docs/api_reference/cython_extensions/geometry.md b/docs/api_reference/cython_extensions/geometry.md deleted file mode 100644 index e0bb6e0..0000000 --- a/docs/api_reference/cython_extensions/geometry.md +++ /dev/null @@ -1,3 +0,0 @@ -::: ares.stubs.geometry - options: - show_root_heading: false diff --git a/docs/api_reference/cython_extensions/index.md b/docs/api_reference/cython_extensions/index.md deleted file mode 100644 index d0f7ebf..0000000 --- a/docs/api_reference/cython_extensions/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Cython Extensions - -Use the menu to select a cython extension module. diff --git a/docs/api_reference/cython_extensions/placement_solver.md b/docs/api_reference/cython_extensions/placement_solver.md deleted file mode 100644 index ccddf7f..0000000 --- a/docs/api_reference/cython_extensions/placement_solver.md +++ /dev/null @@ -1,4 +0,0 @@ - -::: ares.stubs.placement_solver - options: - show_root_heading: false diff --git a/docs/api_reference/cython_extensions/units_utils.md b/docs/api_reference/cython_extensions/units_utils.md deleted file mode 100644 index ba8a0eb..0000000 --- a/docs/api_reference/cython_extensions/units_utils.md +++ /dev/null @@ -1,3 +0,0 @@ -::: ares.stubs.units_utils - options: - show_root_heading: false diff --git a/docs/api_reference/index.md b/docs/api_reference/index.md index d5269ad..b651951 100644 --- a/docs/api_reference/index.md +++ b/docs/api_reference/index.md @@ -7,9 +7,6 @@ Utilize the menu to delve into the available functionalities, currently organize - `Behaviors` - Discover the art of crafting personalized combat maneuvers or macro plans. Each Behavior can be executed individually, tailored to your specific requirements. - - `Cython Extensions` - Acquaint yourself with optimized functions that harness the power of cython. -Many of these functions exhibit multiple-fold speed enhancements compared to their Python counterparts, -many of which serve as alternatives to `python-sc2` functions. - `Manager mediator` - Seamlessly orchestrating numerous managers in the background, the mediator serves as the recommended approach to access data and functions within these managers. diff --git a/mkdocs.yml b/mkdocs.yml index ebfaa25..b92bebb 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,13 +49,6 @@ nav: - Individual Combat Behaviors: api_reference/behaviors/combat_behaviors.md - Group Combat Behaviors: api_reference/behaviors/group_combat_behaviors.md - Macro Behaviors: api_reference/behaviors/macro_behaviors.md - - Cython Extensions: - - api_reference/cython_extensions/index.md - - Combat Utils: api_reference/cython_extensions/combat_utils.md - - General Utils: api_reference/cython_extensions/general_utils.md - - Geometry: api_reference/cython_extensions/geometry.md - - Placement Solver: api_reference/cython_extensions/placement_solver.md - - Units Utils: api_reference/cython_extensions/units_utils.md - api_reference/manager_mediator.md - Contributing: diff --git a/notebooks/geometry_and_terrain_cython.ipynb b/notebooks/geometry_and_terrain_cython.ipynb deleted file mode 100644 index d4ba2fe..0000000 --- a/notebooks/geometry_and_terrain_cython.ipynb +++ /dev/null @@ -1,466 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 9, - "id": "3fbeff04-0b4a-46b8-b4bd-43df3d33b0f9", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-06-26 19:37:37.022 | INFO | MapAnalyzer.MapData:__init__:122 - dev Compiling Berlingrad AIE \u001b[32m\n", - "\u001b[32m Version dev Map Compilation Progress \u001b[37m: 0.4it [00:00, 1.68it/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The line_profiler extension is already loaded. To reload it, use:\n", - " %reload_ext line_profiler\n", - "The Cython extension is already loaded. To reload it, use:\n", - " %reload_ext Cython\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "# This cell imports stuff, and sets up a bot instance etc\n", - "\n", - "import sys\n", - "import lzma\n", - "from s2clientprotocol.sc2api_pb2 import Response, ResponseObservation\n", - "from MapAnalyzer.MapData import MapData\n", - "from MapAnalyzer.constructs import (ChokeArea, MDRamp, RawChoke,\n", - " VisionBlockerArea)\n", - "import pickle\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "sys.path.append(\"../src\")\n", - "sys.path.append(\"../src/ares\")\n", - "from sc2.position import Point2\n", - "from sc2.client import Client\n", - "from sc2.game_data import GameData\n", - "from sc2.game_info import GameInfo\n", - "from sc2.game_state import GameState\n", - "from unittest.mock import patch\n", - "from ares import AresBot\n", - "from ares.dicts.unit_data import UNIT_DATA\n", - "from sc2.bot_ai import BotAI\n", - "from typing import Optional, Union\n", - "\n", - "async def build_bot_object_from_pickle_data(raw_game_data, raw_game_info, raw_observation) -> AresBot:\n", - " # Build fresh bot object, and load the pickled data into the bot object\n", - " bot = BotAI()\n", - " game_data = GameData(raw_game_data.data)\n", - " game_info = GameInfo(raw_game_info.game_info)\n", - " game_state = GameState(raw_observation)\n", - " bot._initialize_variables()\n", - " client = Client(True)\n", - " \n", - " bot._prepare_start(client=client, player_id=1, game_info=game_info, game_data=game_data)\n", - " with patch.object(Client, \"query_available_abilities_with_tag\", return_value={}):\n", - " await bot._prepare_step(state=game_state, proto_game_info=raw_game_info)\n", - " bot._prepare_first_step()\n", - " # await bot.register_managers()\n", - " return bot\n", - "\n", - "BERLINGRAD = \"../tests/pickle_data/BerlingradAIE.xz\"\n", - "with lzma.open(BERLINGRAD, \"rb\") as f:\n", - " raw_game_data, raw_game_info, raw_observation = pickle.load(f)\n", - "\n", - "# initiate a BotAI and MapAnalyzer instance\n", - "bot = await build_bot_object_from_pickle_data(raw_game_data, raw_game_info, raw_observation)\n", - "data = MapData(bot)\n", - "\n", - "# common variables\n", - "grid = data.get_pyastar_grid()\n", - "position = bot.enemy_start_locations[0]\n", - "units = bot.all_units\n", - "\n", - "%load_ext line_profiler\n", - "%load_ext Cython" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "3d7154ca-d6a2-483c-a977-e24480b05e6f", - "metadata": {}, - "outputs": [], - "source": [ - "target = bot.game_info.map_center\n", - "chokes = [\n", - " ch\n", - " for ch in data.in_region_p(target).region_chokes\n", - " if type(ch) != VisionBlockerArea\n", - "]\n", - "raw_choke = chokes[-1]\n", - "assert type(raw_choke) == RawChoke" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "08fc17da-e8cd-4150-bcd0-91bb012e3d17", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(92, 67)" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "raw_choke.side_a" - ] - }, - { - "cell_type": "markdown", - "id": "9690a3b7-35dd-48f6-b897-6064a67ea68c", - "metadata": {}, - "source": [ - "# Finding siege points" - ] - }, - { - "cell_type": "markdown", - "id": "8fcbc5ff-0337-49e8-819f-1792ed5b11e9", - "metadata": {}, - "source": [ - "## Get line between points\n", - "\n", - "We need this function in the final find siege function" - ] - }, - { - "cell_type": "markdown", - "id": "31c3262e-26b7-4c44-bf06-1f9bb2d078f5", - "metadata": {}, - "source": [ - "### python" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "4bf30229-a179-4a93-8189-525764c99f2a", - "metadata": {}, - "outputs": [], - "source": [ - "def get_line_between_points(pa, pb) -> list[float]:\n", - " \"\"\"\n", - " Given points a and b, return the line in the form Ax + By = C.\n", - " Returns [A, B, C]\n", - " \"\"\"\n", - " x1, y1 = pa\n", - " x2, y2 = pb\n", - " if x1 == x2:\n", - " return [1, 0, x1]\n", - " else:\n", - " slope = (y2 - y1) / (x2 - x1)\n", - " return [-slope, 1, y1 - (slope * x1)]" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "3f08d92a-cf06-4d34-b8d0-8f0adfab22cd", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "390 ns ± 1.15 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit choke_a, choke_b, choke_c = get_line_between_points(raw_choke.side_a, raw_choke.side_b)" - ] - }, - { - "cell_type": "markdown", - "id": "2e4abce4-ab0d-4ad0-b2b8-aaed7afe49c7", - "metadata": {}, - "source": [ - "### cython" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "929f30c3-3305-40a1-8d46-43a31921a3d0", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "cpdef list cy_get_line_between_points((unsigned int, unsigned int) pa, (unsigned int, unsigned int) pb):\n", - " \"\"\"\n", - " Given points a and b, return the line in the form Ax + By = C.\n", - " Returns [A, B, C]\n", - " \"\"\"\n", - " cdef:\n", - " unsigned int x1, y1, x2, y2\n", - " double slope\n", - "\n", - " x1, y1 = pa\n", - " x2, y2 = pb\n", - " if x1 == x2:\n", - " return [1, 0, x1]\n", - " else:\n", - " slope = (y2 - y1) / (x2 - x1)\n", - " return [-slope, 1, y1 - (slope * x1)]" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "a0f1c568-a9ef-4d4d-970f-446b2f5a7bd0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "134 ns ± 0.0732 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit choke_a, choke_b, choke_c = cy_get_line_between_points(raw_choke.side_a, raw_choke.side_b)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0ed1f2bb-3af3-4a9d-ad4c-8f8d673ca6be", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "d61aa87d-9245-460f-ab26-f0d12f12eacc", - "metadata": {}, - "outputs": [], - "source": [ - "def get_siege_chokes(\n", - " target: Point2,\n", - " chokes: Optional[\n", - " tuple[Union[ChokeArea, MDRamp, RawChoke, VisionBlockerArea]]\n", - " ] = None,\n", - " max_distance: int = 30,\n", - " min_setup_area: int = 0,\n", - ") -> tuple[\n", - " dict[Point2, Union[MDRamp, RawChoke, VisionBlockerArea]],\n", - " dict[Point2, Union[MDRamp, RawChoke, VisionBlockerArea]],\n", - "]:\n", - " \"\"\"\n", - " Find the chokes for sieging a position. Criteria are:\n", - " - The side of the choke closest to the position must not be higher ground\n", - " - There must be at least min_setup_area points on our side of the choke\n", - " TODO: add more stuff\n", - " @param target: the point to siege\n", - " @param chokes: a list of chokes we want to check, if we know them\n", - " @param max_distance: how far away from the point the near side of the choke is allowed to be\n", - " @param min_setup_area: minimum number of valid points on the near side of the choke\n", - " @return: A dictionary with the side we want to go to as the key and the ChokeArea as the value\n", - " \"\"\"\n", - " raw_pathfind = self.manager_mediator.find_raw_path\n", - " grid = self.manager_mediator.get_cached_ground_grid\n", - " # if we're not given chokes (such as the point isn't a base that we calculated earlier), find them\n", - " if not chokes:\n", - " chokes = [\n", - " ch\n", - " for ch in self.map_data.in_region_p(target).region_chokes\n", - " if type(ch) != VisionBlockerArea\n", - " ]\n", - " chokes_points: List[Set[Point2]] = [ch.points for ch in chokes]\n", - " # go through the chokes and check heights of both sides so we can see if we'll have the high ground\n", - " high_or_even_ground_chokes: Dict[\n", - " Point2, Union[MDRamp, RawChoke, VisionBlockerArea]\n", - " ] = {}\n", - " low_ground_or_small_chokes: Dict[\n", - " Point2, Union[MDRamp, RawChoke, VisionBlockerArea]\n", - " ] = {}\n", - " for ch in chokes:\n", - " if type(ch) == RawChoke:\n", - " # get the line between sides of the choke\n", - " choke_a, choke_b, choke_c = get_line_between_points(\n", - " ch.side_a, ch.side_b\n", - " )\n", - " # the A value of the line bisecting Ax + By = C is -B/A\n", - " if choke_a == 0:\n", - " # horizontal line, the value is 1 (can't divide by 0)\n", - " bisect_a = 1\n", - " else:\n", - " bisect_a = -choke_b / choke_a\n", - " # get the intersection of the two lines (the intersection is the midpoint of the choke line)\n", - " if choke_a == 0:\n", - " # the choke makes a horizontal line, so we want the average of the x values\n", - " intersect_x = (ch.side_b.x + ch.side_a.x) / 2\n", - " intersect_y = ch.side_a.y\n", - " elif choke_b == 0:\n", - " # the choke makes a vertical line, so we want the average of the y values\n", - " intersect_x = ch.side_a.x\n", - " intersect_y = (ch.side_b.y + ch.side_a.y) / 2\n", - " else:\n", - " # the line is neither horizontal nor vertical, use the x midpoint to find y\n", - " intersect_x = (ch.side_b.x + ch.side_a.x) / 2\n", - " intersect_y = choke_c - choke_a * intersect_x\n", - " # find a point on either side of the choke line to check heights for\n", - " raw_a = translate_point_along_line(\n", - " (intersect_x, intersect_y), bisect_a, 4\n", - " )\n", - " raw_b = translate_point_along_line(\n", - " (intersect_x, intersect_y), bisect_a, -4\n", - " )\n", - " point_a = Point2(raw_a).rounded\n", - " point_b = Point2(raw_b).rounded\n", - " elif type(ch) == MDRamp:\n", - " point_a = ch.top_center.towards(ch.bottom_center, -2).rounded\n", - " point_b = ch.bottom_center.towards(ch.top_center, -2).rounded\n", - " else:\n", - " continue\n", - " # get the heights on either side of the choke\n", - " height_a = self.ai.get_terrain_height(point_a)\n", - " height_b = self.ai.get_terrain_height(point_b)\n", - "\n", - " # find the pathing distances or skip this choke since something's wrong\n", - " # also skip if either side goes through more than one choke\n", - " # noinspection PyProtectedMember\n", - " path_a = raw_pathfind(\n", - " start=point_a,\n", - " target=target,\n", - " grid=grid,\n", - " sensitivity=1,\n", - " )\n", - " if path_a:\n", - " if number_of_chokes_pathed_through(path_a, chokes_points) > 1:\n", - " continue\n", - " dist_a = len(path_a)\n", - " else:\n", - " continue\n", - " # noinspection PyProtectedMember\n", - " path_b = raw_pathfind(\n", - " start=point_b,\n", - " target=target,\n", - " grid=grid,\n", - " sensitivity=1,\n", - " )\n", - " if path_b:\n", - " if number_of_chokes_pathed_through(path_b, chokes_points) > 1:\n", - " continue\n", - " dist_b = len(path_b)\n", - " else:\n", - " continue\n", - "\n", - " \"\"\"\n", - " Siege points should be:\n", - " - the same height or higher than the target\n", - " - within the maximum distance\n", - " - within a large enough area\n", - " - only path through one choke to get to the target\n", - " \"\"\"\n", - " if height_a < height_b:\n", - " # side_a is lower\n", - " if dist_a < dist_b and dist_a < max_distance:\n", - " if self.get_flood_fill_area(point_b)[0] >= min_setup_area:\n", - " high_or_even_ground_chokes[point_b] = ch\n", - " else:\n", - " low_ground_or_small_chokes[point_b] = ch\n", - " elif height_b < height_a:\n", - " # side_b is lower\n", - " if dist_b < dist_a and dist_b < max_distance:\n", - " if self.get_flood_fill_area(point_a)[0] >= min_setup_area:\n", - " high_or_even_ground_chokes[point_a] = ch\n", - " else:\n", - " low_ground_or_small_chokes[point_a] = ch\n", - " else:\n", - " # the chokes are of equal height, give the side further from the target if it's large enough\n", - " # if they're somehow the same height and same distance away, skip for now\n", - " # TODO: find some way to handle this if we want- it shouldn't happen much though\n", - " if dist_a < dist_b and dist_a < max_distance:\n", - " if self.get_flood_fill_area(point_b)[0] >= min_setup_area:\n", - " high_or_even_ground_chokes[point_b] = ch\n", - " else:\n", - " low_ground_or_small_chokes[point_b] = ch\n", - " elif dist_b < dist_a and dist_b < max_distance:\n", - " if self.get_flood_fill_area(point_a)[0] >= min_setup_area:\n", - " high_or_even_ground_chokes[point_a] = ch\n", - " else:\n", - " low_ground_or_small_chokes[point_a] = ch\n", - " return high_or_even_ground_chokes, low_ground_or_small_chokes" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "98faa705-fdb6-4e39-b90f-92138abbedbc", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'self' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[17], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mget_siege_chokes\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbot\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgame_info\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap_center\u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[1;32mIn[16], line 23\u001b[0m, in \u001b[0;36mget_siege_chokes\u001b[1;34m(target, chokes, max_distance, min_setup_area)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_siege_chokes\u001b[39m(\n\u001b[0;32m 2\u001b[0m target: Point2,\n\u001b[0;32m 3\u001b[0m chokes: Optional[\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;28mdict\u001b[39m[Point2, Union[MDRamp, RawChoke, VisionBlockerArea]],\n\u001b[0;32m 11\u001b[0m ]:\n\u001b[0;32m 12\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;124;03m Find the chokes for sieging a position. Criteria are:\u001b[39;00m\n\u001b[0;32m 14\u001b[0m \u001b[38;5;124;03m - The side of the choke closest to the position must not be higher ground\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[38;5;124;03m @return: A dictionary with the side we want to go to as the key and the ChokeArea as the value\u001b[39;00m\n\u001b[0;32m 22\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m---> 23\u001b[0m raw_pathfind \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241m.\u001b[39mmanager_mediator\u001b[38;5;241m.\u001b[39mfind_raw_path\n\u001b[0;32m 24\u001b[0m grid \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmanager_mediator\u001b[38;5;241m.\u001b[39mget_cached_ground_grid\n\u001b[0;32m 25\u001b[0m \u001b[38;5;66;03m# if we're not given chokes (such as the point isn't a base that we calculated earlier), find them\u001b[39;00m\n", - "\u001b[1;31mNameError\u001b[0m: name 'self' is not defined" - ] - } - ], - "source": [ - "get_siege_chokes(bot.game_info.map_center)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c28e2a8d-1028-4e3d-9496-88511bb0163b", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Poetry", - "language": "python", - "name": "poetry-kernel" - }, - "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.11.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/python_to_cython.ipynb b/notebooks/python_to_cython.ipynb deleted file mode 100644 index f6a6022..0000000 --- a/notebooks/python_to_cython.ipynb +++ /dev/null @@ -1,2115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "e5a716a2-bfd6-4ba5-91bb-83d043d4f0f9", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Tom\\AppData\\Local\\pypoetry\\Cache\\virtualenvs\\ares-sc2-S437wHWG-py3.11\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n", - "2023-08-21 19:48:16.818 | INFO | MapAnalyzer.MapData:__init__:122 - dev Compiling GresvanAIE \u001b[32m\n", - "\u001b[32m Version dev Map Compilation Progress \u001b[37m: 0.4it [00:00, 1.23it/s]\n", - "2023-08-21 19:48:17.226 | INFO | ares.managers.placement_manager:initialise:175 - Solved placement formation in 13.519048690795898 ms\n", - "2023-08-21 19:48:17.397 | INFO | MapAnalyzer.MapData:__init__:122 - dev Compiling GresvanAIE \u001b[32m\n", - "\u001b[32m Version dev Map Compilation Progress \u001b[37m: 0.4it [00:00, 1.21it/s]\n" - ] - } - ], - "source": [ - "# This cell imports stuff, and sets up a bot instance etc\n", - "\n", - "import sys\n", - "import lzma\n", - "from s2clientprotocol.sc2api_pb2 import Response, ResponseObservation\n", - "from MapAnalyzer.MapData import MapData\n", - "import pickle\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "sys.path.append(\"../src\")\n", - "sys.path.append(\"../tests\")\n", - "sys.path.append(\"../src/ares\")\n", - "from sc2.position import Point2\n", - "from sc2.client import Client\n", - "from sc2.game_data import GameData\n", - "from sc2.game_info import GameInfo\n", - "from sc2.game_state import GameState\n", - "from unittest.mock import patch\n", - "from ares import AresBot\n", - "from ares.dicts.unit_data import UNIT_DATA\n", - "from sc2.bot_ai import BotAI\n", - "\n", - "# load AresBot and MapAnalyzer object instances from pickled files\n", - "from tests.load_bot_from_pickle import build_bot_object_from_pickle_data\n", - "GRESVAN = \"../tests/pickle_data/GresvanAIE.xz\"\n", - "bot = await build_bot_object_from_pickle_data(GRESVAN)\n", - "data = MapData(bot)\n", - "\n", - "# common variables\n", - "grid = data.get_pyastar_grid()\n", - "position = bot.enemy_start_locations[0]\n", - "units = bot.all_units\n", - "\n", - "%load_ext line_profiler\n", - "%load_ext Cython" - ] - }, - { - "cell_type": "markdown", - "id": "002419d1-a1d9-4937-8e9b-6fa47d97250a", - "metadata": {}, - "source": [ - "# Cythonizing commonly used functions in a python-sc2 bot\n", - "\n", - "Actual speedups many vary as notebook gets rerun\n", - "\n", - "* [Converting is_position_safe](#Python-version-of-is_position_safe) **6.57x speedup**\n", - "* [Alternative to python-sc2's units.closest_to](#Alternative-to-python-sc2's-units.closest_to) **6.7x speedup**\n", - "* [Speeding up `Units.center`](#Speeding-up-Units.center) **2.01x speedup**\n", - "* [Distance to / `unit.distance_to`](#Distance-to-/-unit.distance_to) **2.47x speedup**\n", - "* [Convert `already_pending` for units](#Convert-already_pending-for-units) **6.62x speedup**\n", - "* [Alternative to `python-sc2`'s `units.in_attack_range`](#Alternative-to-python-sc2's-units.in_attack_range) **4.17x speedup**\n", - "* [Calculate if attack is ready](#Calculate-if-attack-is-ready) **3.87x speedup**\n", - "* [Pick enemy target](#Pick-enemy-target) **1.63x speedup**\n", - "* [Converting `units.sorted_by_distance_to`](#Converting-units.sorted_by_distance_to) **7.3x speedup**\n", - "* [Convert `unit.is_facing()`](#Convert-unit.is_facing()) **9.1x speedup**\n", - "* [Convert `Point2.towards()`](#Convert-Point2.towards()) **14.29x speedup**" - ] - }, - { - "cell_type": "markdown", - "id": "b05ffcbc-92a8-4bb2-9f13-ce2c5ecd7796", - "metadata": {}, - "source": [ - "# Converting `is_position_safe` to cython" - ] - }, - { - "cell_type": "markdown", - "id": "9fc1c710-be0c-4aa8-8f05-6d9c1e8e0373", - "metadata": {}, - "source": [ - "## Python version of `is_position_safe`" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a811bbf3-7a19-4ede-9332-cfe8f301965c", - "metadata": {}, - "outputs": [], - "source": [ - "def is_position_safe(\n", - " grid: np.ndarray,\n", - " position: Point2,\n", - " weight_safety_limit: float = 1.0,\n", - ") -> bool:\n", - " weight: float = grid[position.rounded]\n", - " # np.inf check if drone is pathing near a spore crawler\n", - " return weight == np.inf or weight <= weight_safety_limit" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "078f2253-0351-4fbe-ab21-132c84e6567e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.3 µs ± 17.3 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit is_position_safe(grid, position)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "e8e29398-6514-49a4-bc45-2bf48b4d0d46", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Timer unit: 1e-07 s\n", - "\n", - "Total time: 4.81e-05 s\n", - "File: C:\\Users\\Tom\\AppData\\Local\\Temp\\ipykernel_23956\\2777119042.py\n", - "Function: is_position_safe at line 1\n", - "\n", - "Line # Hits Time Per Hit % Time Line Contents\n", - "==============================================================\n", - " 1 def is_position_safe(\n", - " 2 grid: np.ndarray,\n", - " 3 position: Point2,\n", - " 4 weight_safety_limit: float = 1.0,\n", - " 5 ) -> bool:\n", - " 6 1 174.0 174.0 36.2 weight: float = grid[position.rounded]\n", - " 7 # np.inf check if drone is pathing near a spore crawler\n", - " 8 1 307.0 307.0 63.8 return weight == np.inf or weight <= weight_safety_limit" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%lprun -f is_position_safe is_position_safe(grid, position)" - ] - }, - { - "cell_type": "markdown", - "id": "cf584263-83aa-4d3e-8618-bc1b0cb93222", - "metadata": {}, - "source": [ - "## Cython version of `is_position_safe`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "8e29b67e-a9db-404e-9a3d-558e50ca92ab", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "import numpy as np\n", - "cimport numpy as cnp\n", - "from cython cimport boundscheck, wraparound\n", - "@boundscheck(False)\n", - "@wraparound(False)\n", - "cpdef bint is_position_safe(\n", - " cnp.ndarray[cnp.npy_float32, ndim=2] grid,\n", - " (unsigned int, unsigned int) position,\n", - " double weight_safety_limit = 1.0,\n", - "):\n", - " cdef double weight = 0.0\n", - " weight = grid[position[0], position[1]]\n", - " # np.inf check if drone is pathing near a spore crawler\n", - " return weight == np.inf or weight <= weight_safety_limit" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "9493b417-438e-480d-a07e-a1945ebc8a72", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "612 ns ± 2.97 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit is_position_safe(grid, position.rounded)" - ] - }, - { - "cell_type": "markdown", - "id": "09627f82-7a06-4cf6-8598-53a4d0d02089", - "metadata": {}, - "source": [ - "# Alternative to `python-sc2`'s `units.closest_to`" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "22dfffb3-d960-4de3-b91f-ca70404e23d6", - "metadata": {}, - "outputs": [], - "source": [ - "units = bot.all_units\n", - "position = bot.enemy_start_locations[0]\n", - "unit = units[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "30394917-a822-4240-9d10-59a513dedbeb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "242 µs ± 1.11 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" - ] - } - ], - "source": [ - "# slower using closest_to(Point2)\n", - "%timeit units.closest_to(position)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "cd0da159-95b9-421c-9a3a-c0b18981f2b0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "125 µs ± 918 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "# this is faster since distance between all units is cached\n", - "%timeit units.closest_to(unit)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "e62eb7cf-ba00-429f-9e4d-32b54e592fc0", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "from cython cimport boundscheck, wraparound\n", - "\n", - "cdef double euclidean_distance_squared(\n", - " (float, float) p1,\n", - " (float, float) p2\n", - "):\n", - " return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2\n", - "\n", - "@boundscheck(False)\n", - "@wraparound(False)\n", - "cpdef object closest_to((float, float) position, object units):\n", - " cdef:\n", - " object closest = units[0]\n", - " double closest_dist = 999.9\n", - " double dist = 0.0\n", - " unsigned int len_units = len(units)\n", - " (float, float) pos\n", - " \n", - " for i in range(len_units):\n", - " unit = units[i]\n", - " pos = unit.position\n", - " dist = euclidean_distance_squared((pos[0], pos[1]), (position[0], position[1]))\n", - " if dist < closest_dist:\n", - " closest_dist = dist\n", - " closest = unit\n", - " \n", - " return closest\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "37d3042d-bf7d-44c5-8992-50f97df8e781", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "16.4 µs ± 103 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit closest_to(position, units)" - ] - }, - { - "cell_type": "markdown", - "id": "850be58c-42d2-4c14-824b-dc20d76f7435", - "metadata": {}, - "source": [ - "# Speeding up `Units.center`" - ] - }, - { - "cell_type": "markdown", - "id": "70ae0f3e-eed2-42f5-856e-8b93140f33a8", - "metadata": {}, - "source": [ - "Similar to `units.center` in `python-sc2`, but tweaked to work in this notebook" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "01918ede-b9f9-448a-adda-06ae400ec399", - "metadata": {}, - "outputs": [], - "source": [ - "from sc2.position import Point2\n", - "def center(units) -> Point2:\n", - " \"\"\"Returns the central position of all units.\"\"\"\n", - " assert units, f\"Units object is empty\"\n", - " amount = units.amount\n", - " return Point2(\n", - " (\n", - " sum(unit._proto.pos.x for unit in units) / amount,\n", - " sum(unit._proto.pos.y for unit in units) / amount,\n", - " )\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "324a2d0e-2e0d-4791-b488-0f73b2035865", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "134 µs ± 515 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit center(units)" - ] - }, - { - "cell_type": "markdown", - "id": "4da61abc-7654-44e0-b2d6-6fcf80db7007", - "metadata": {}, - "source": [ - "## Convert `Units.center` to cython" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "9f75b773-c480-4767-82ac-6a026117aba3", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "cimport cython\n", - "from sc2.position import Point2\n", - "\n", - "@cython.boundscheck(False)\n", - "@cython.wraparound(False)\n", - "cpdef (double, double) cy_center(object units):\n", - " \"\"\"Returns the central position of all units.\"\"\"\n", - " cdef:\n", - " unsigned int i = 0\n", - " unsigned int num_units = len(units)\n", - " double sum_x, sum_y = 0.0\n", - " (double, double) position\n", - " object unit\n", - "\n", - " for i in range(num_units):\n", - " pos = units[i]._proto.pos\n", - " position = (pos.x, pos.y)\n", - " sum_x += position[0]\n", - " sum_y += position[1]\n", - "\n", - " return (sum_x / num_units, sum_y / num_units)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "092e7ada-ca61-4d39-a8a8-83b6908527f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "65.3 µs ± 278 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit Point2(cy_center(units))" - ] - }, - { - "cell_type": "markdown", - "id": "47028923-1d3f-40eb-aba5-1e87c67a9d51", - "metadata": {}, - "source": [ - "# Distance to / `unit.distance_to`" - ] - }, - { - "cell_type": "markdown", - "id": "fab1ee77-9ce9-4119-a617-b7eac3e8f97d", - "metadata": {}, - "source": [ - "Check and profile distances between 2 units / 1 unit and a Point2 / two Point2's using `python-sc2` implementation of `distance_to`. \n", - "\n", - "Then see if cython does it faster" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "e3accea5-8efd-4f60-abaa-efab48d41a76", - "metadata": {}, - "outputs": [], - "source": [ - "unit1 = bot.workers[0]\n", - "unit2 = bot.workers[4]\n", - "position1 = bot.game_info.map_center\n", - "position2 = bot.main_base_ramp.top_center" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "5ad995bd-333b-4c88-8756-855b478959a4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.0901554167386" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "unit1.distance_to(unit2)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "79d7255d-e556-4188-b019-3616ccac108b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "620 ns ± 6.94 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit unit1.distance_to(unit2)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "d2b51945-e464-4db4-b670-6c2b3ea97487", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "75.3884622135151" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "unit1.distance_to(position1)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "8b02671b-ec26-4838-a4ad-895111cc4983", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.04 µs ± 5.32 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit unit1.distance_to(position1)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "e4eea364-e872-4200-a8af-b155e46cee54", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "66.7720001198107" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "position1.distance_to(position2)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "ed755f14-7385-415b-9eea-7d45d98fa7ee", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "383 ns ± 1.77 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit position1.distance_to(position2)" - ] - }, - { - "cell_type": "markdown", - "id": "8f6dac76-590a-46cd-8bcf-6cb8be505276", - "metadata": {}, - "source": [ - "## Convert `distance_to` to cython" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "e1f147c7-c407-4ecc-ac94-8fb7330c908d", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "cpdef double cy_distance_to(\n", - " (float, float) p1,\n", - " (float, float) p2\n", - "):\n", - " return ((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) ** 0.5" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "5f3cf30e-fa15-4a55-8a7d-2799afdbcc8d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.090155377590407" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_distance_to(unit1.position, unit2.position)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "6da6ce8a-4bde-43c4-a9bf-e0857474c2a7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "200 ns ± 1.11 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_distance_to(unit1.position, unit2.position)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "49b5b7d9-a42f-44ae-94a0-663aa902463c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "75.38846337574635" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_distance_to(unit1.position, position1)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "e9bb5188-6143-436d-8a8a-3facb46b5d91", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "169 ns ± 0.74 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_distance_to(unit1.position, position1)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "272df370-2135-4da4-bef7-b666da31913a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "66.7720001198107" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_distance_to(position1, position2)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "df359679-ffbd-4fd5-bbea-3f83e4780201", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "156 ns ± 0.755 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_distance_to(position1, position2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "307c39f2-cc0f-49dc-9c9e-562459b110ab", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "6c6702bc-163c-4c9b-b4ad-50323d97332b", - "metadata": {}, - "source": [ - "# Convert `already_pending` for units" - ] - }, - { - "cell_type": "markdown", - "id": "7969aaaa-12f9-4dc4-ada3-751316050802", - "metadata": {}, - "source": [ - "This seems like a slow function in profiles, make an alternative for units and structures" - ] - }, - { - "cell_type": "markdown", - "id": "c6a008e6-13eb-4053-a574-4fba42ea5200", - "metadata": {}, - "source": [ - "## `python-sc2`'s `already_pending` function:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "234d4f86-3395-44f4-9192-14435df5e44b", - "metadata": {}, - "outputs": [], - "source": [ - "from sc2.ids.unit_typeid import UnitTypeId" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "7e3c9a87-6837-4262-8194-fa9312fc74f4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.61 µs ± 10.8 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit bot.already_pending(UnitTypeId.MARINE)" - ] - }, - { - "cell_type": "markdown", - "id": "ce17fb82-e9b9-4d33-a7b8-07f4daa87f27", - "metadata": {}, - "source": [ - "## Making a python alternative that's already more than 2x faster" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "a6004be6-4c61-48be-83c6-1964c7b3201d", - "metadata": {}, - "outputs": [], - "source": [ - "from sc2.dicts.unit_trained_from import UNIT_TRAINED_FROM\n", - "from sc2.game_info import Race\n", - "from ares.dicts.does_not_use_larva import DOES_NOT_USE_LARVA" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "8e3f2c9b-793a-4057-b9f0-caf61e2ed153", - "metadata": {}, - "outputs": [], - "source": [ - "def unit_pending(unit_type: UnitTypeId) -> int:\n", - " trained_from = UNIT_TRAINED_FROM[unit_type]\n", - " if bot.race != Race.Zerg or unit_type == UnitTypeId.QUEEN:\n", - " return len(\n", - " [\n", - " s\n", - " for s in bot.structures\n", - " if s.orders and s.type_id in trained_from\n", - " and s.orders[0].ability.button_name.upper() == UnitTypeId.MARINE.name\n", - " ]\n", - " )\n", - " # check eggs and cocoons for Zerg\n", - " else:\n", - " if type_id in DOES_NOT_USE_LARVA:\n", - " if type_id == UnitTypeId.LURKERMP:\n", - " return len(bot.own_units(UnitTypeId.LURKERMPEGG))\n", - " elif type_id == UnitTypeId.OVERSEER:\n", - " return len(bot.own_units(UnitTypeId.OVERLORDCOCOON))\n", - " return len(bot.own_units(UnitTypeId[f\"{type_id.name}COCOON\"]))\n", - " else:\n", - " return len(\n", - " [\n", - " egg\n", - " for egg in self.eggs\n", - " if egg.orders[0].ability.button_name.upper() == type_id.name\n", - " ]\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "d498b2fd-5271-4ac1-b774-47ab1b7814c0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.18 µs ± 4.4 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit unit_pending(UnitTypeId.MARINE)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "fb89df1e-e0c5-454f-b21f-0b584bd29614", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "from sc2.ids.unit_typeid import UnitTypeId\n", - "from sc2.dicts.unit_trained_from import UNIT_TRAINED_FROM\n", - "from sc2.game_info import Race\n", - "from ares.dicts.does_not_use_larva import DOES_NOT_USE_LARVA\n", - "\n", - "cimport cython\n", - "\n", - "cpdef unsigned int cy_unit_pending(object unit_type, object bot):\n", - " cdef:\n", - " unsigned int num_pending = 0\n", - " unsigned int len_units, x\n", - " set trained_from = UNIT_TRAINED_FROM[unit_type]\n", - " object units_collection, unit\n", - "\n", - " if bot.race == Race.Zerg and unit_type != UnitTypeId.QUEEN:\n", - " if unit_type in DOES_NOT_USE_LARVA:\n", - " units_collection = bot.own_units\n", - " len_units = len(bot.own_units)\n", - " trained_from = {UnitTypeId[f\"{unit_type.name}COCOON\"]}\n", - " if unit_type == UnitTypeId.LURKERMP:\n", - " trained_from = {UnitTypeId.LURKERMPEGG}\n", - " elif unit_type == UnitTypeId.OVERSEER:\n", - " trained_from = {UnitTypeId.OVERLORDCOCOON}\n", - " \n", - " for x in range(len_units):\n", - " unit = units_collection[x]\n", - " if unit.type_id in trained_from:\n", - " num_pending += 1\n", - " return num_pending\n", - " # unit will be pending in eggs\n", - " else:\n", - " units_collection = bot.eggs\n", - " len_units = len(units_collection)\n", - " for x in range(len_units):\n", - " egg = units_collection[x]\n", - " if egg.orders and egg.orders[0].ability.button_name.upper() == unit_type.name:\n", - " num_pending += 1\n", - " return num_pending\n", - "\n", - " # all other units, check the structures they are built from\n", - " else:\n", - " units_collection = bot.structures\n", - " len_units = len(units_collection)\n", - " for x in range(len_units):\n", - " structure = units_collection[x]\n", - " if structure.orders and structure.orders[0].ability.button_name.upper() == unit_type.name:\n", - " num_pending += 1\n", - " return num_pending" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "a46c1518-6954-468d-a060-694324425832", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "416 ns ± 3.42 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_unit_pending(UnitTypeId.MARINE, bot)" - ] - }, - { - "cell_type": "markdown", - "id": "8b0f3a65-f278-4830-94a4-44aaa47b2d1d", - "metadata": {}, - "source": [ - "## Cython version 6-7 times faster with a warning that this doesn't factor in warp ins" - ] - }, - { - "cell_type": "markdown", - "id": "04edc294-9a50-4cc5-a3a3-47ea0b980a7e", - "metadata": {}, - "source": [ - "Something similar may be done for structures, but for this we rely on a building tracker which is not present in this notebook" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "435faecd-df32-48e9-ac06-077529b84eac", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "2b370a4c-b337-400e-9b38-c6390e059b10", - "metadata": {}, - "source": [ - "# Alternative to `python-sc2`'s `units.in_attack_range`" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "85e30b99-6f07-4056-8971-a9bc1d02b573", - "metadata": {}, - "outputs": [], - "source": [ - "from sc2.units import Units\n", - "_units = Units([u for u in units if not u.is_mineral_field and not u.is_vespene_geyser and u not in bot.destructables], bot)\n", - "bigger_units = Units([u for u in units if not u.is_mineral_field and not u.is_vespene_geyser and u not in bot.destructables], bot)\n", - "bigger_units.extend(_units)\n", - "bigger_units.extend(_units)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "e9ed112b-6719-4cca-8ad6-825d98c4c492", - "metadata": {}, - "outputs": [], - "source": [ - "unit = _units[-6]" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "76a9da32-6dfb-4374-9c88-d415d4e5a5ed", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "66.5 µs ± 659 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit _units.in_attack_range_of(unit)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "03b1e8f5-3421-4c56-b3bd-f5a0bfb363ef", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Unit(name='SCV', tag=4348182529)]" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "_units.in_attack_range_of(unit)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "7434ff39-5e92-490b-94ce-a11277c1da20", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "195 µs ± 389 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit bigger_units.in_attack_range_of(unit)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "368c1b36-0fe9-4580-9364-20de3856aaac", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "import cython\n", - "from sc2.ids.unit_typeid import UnitTypeId\n", - "from ares.dicts.unit_data import UNIT_DATA\n", - "\n", - "UNIT_DATA_INT_KEYS = {k.value: v for k, v in UNIT_DATA.items()}\n", - "\n", - "cdef double cy_distance_to(\n", - " (float, float) p1,\n", - " (float, float) p2\n", - "):\n", - " return ((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) ** 0.5\n", - "\n", - "@cython.boundscheck(False)\n", - "@cython.wraparound(False)\n", - "cpdef list cy_in_attack_range(object unit, object units, double bonus_distance = 0.0):\n", - " if not unit.can_attack:\n", - " return []\n", - "\n", - " cdef:\n", - " unsigned int x, len_units, type_id_int\n", - " double dist, air_range, ground_range, radius, other_u_radius\n", - " (float, float) unit_pos, other_unit_pos\n", - " bint other_unit_flying, can_shoot_air, can_shoot_ground\n", - "\n", - " can_shoot_air = unit.can_attack_air\n", - " can_shoot_ground = unit.can_attack_ground\n", - " len_units = len(units)\n", - " returned_units = []\n", - " unit_pos = unit.position\n", - " radius = unit.radius\n", - " air_range = unit.air_range\n", - " ground_range = unit.ground_range\n", - "\n", - " for x in range(len_units):\n", - " u = units[x]\n", - " type_id_int = unit._proto.unit_type\n", - " unit_data = UNIT_DATA_INT_KEYS.get(type_id_int, None)\n", - " if unit_data:\n", - " other_unit_flying = unit_data[\"flying\"]\n", - " other_unit_pos = u.position\n", - " other_u_radius = u.radius\n", - " dist = cy_distance_to(unit_pos, other_unit_pos)\n", - " \n", - " if can_shoot_air and (other_unit_flying or type_id_int == 4):\n", - " if dist <= air_range + radius + other_u_radius + bonus_distance:\n", - " returned_units.append(u)\n", - " # already added, no need to attempt logic below\n", - " continue\n", - " \n", - " if can_shoot_ground and not other_unit_flying:\n", - " if dist <= ground_range + radius + other_u_radius + bonus_distance:\n", - " returned_units.append(u)\n", - "\n", - " return returned_units " - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "f5823ead-3ead-4fb0-803b-85dd2ad8d39d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "16.5 µs ± 47.4 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_in_attack_range(unit, _units)" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "8fedba87-40d7-4085-8495-8f447651ccd9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Unit(name='SCV', tag=4348182529)]" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_in_attack_range(unit, _units)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "a6d856e0-c29f-480e-8f44-a2b6fa4e8ca0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "48.8 µs ± 345 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_in_attack_range(unit, bigger_units)" - ] - }, - { - "cell_type": "markdown", - "id": "80771f0c-b8de-4d81-ad5b-def097b9a5e7", - "metadata": {}, - "source": [ - "# Calculate if attack is ready" - ] - }, - { - "cell_type": "markdown", - "id": "917692a4-628a-4022-9b9c-959b632de063", - "metadata": {}, - "source": [ - "## First python implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "465c2b27-369c-468a-b662-904a05660280", - "metadata": {}, - "outputs": [], - "source": [ - "from sc2.ids.unit_typeid import UnitTypeId as UnitID\n", - "from sc2.unit import Unit\n", - "from ares.dicts.turn_rate import TURN_RATE\n", - "import math\n", - "\n", - "def angle_to(from_pos: Point2, to_pos: Point2) -> float:\n", - " \"\"\"Angle from point to other point in radians\"\"\"\n", - " return math.atan2(to_pos.y - from_pos.y, to_pos.x - to_pos.x)\n", - "\n", - "def angle_diff(a, b) -> float:\n", - " \"\"\"Absolute angle difference between 2 angles\"\"\"\n", - " if a < 0:\n", - " a += math.pi * 2\n", - " if b < 0:\n", - " b += math.pi * 2\n", - " return math.fabs(a - b)\n", - "\n", - "def get_turn_speed(unit) -> float:\n", - " \"\"\"Returns turn speed of unit in radians\"\"\"\n", - " if unit.type_id in TURN_RATE:\n", - " return TURN_RATE[unit.type_id] * 1.4 * math.pi / 180\n", - "\n", - "def range_vs_target(unit, target) -> float:\n", - " \"\"\"Get the range of a unit to a target.\"\"\"\n", - " if unit.can_attack_air and target.is_flying:\n", - " return unit.air_range\n", - " else:\n", - " return unit.ground_range\n", - "\n", - "def attack_ready(bot, unit: Unit, target: Unit) -> bool:\n", - " \"\"\"\n", - " Determine whether the unit can attack the target by the time the unit faces the target.\n", - " Thanks Sasha for writing this out.\n", - " \"\"\"\n", - " # fix for units, where this method returns False so the unit moves\n", - " # but the attack animation is still active, so the move command cancels the attack\n", - " # need to think of a better fix later, but this is better then a unit not attacking\n", - " # and still better then using simple weapon.cooldown == 0 micro\n", - " type_id = unit.type_id\n", - " if unit.weapon_cooldown > 7 and type_id == UnitID.HYDRALISK:\n", - " return True\n", - " # prevents crash, since unit can't move\n", - " if type_id == UnitID.LURKERMPBURROWED:\n", - " return True\n", - " if not unit.can_attack:\n", - " return False\n", - " # Time elapsed per game step\n", - " step_time: float = bot.client.game_step / 22.4\n", - "\n", - " # Time it will take for unit to turn to face target\n", - " angle: float = angle_diff(\n", - " unit.facing, angle_to(unit.position, target.position)\n", - " )\n", - " turn_time: float = angle / get_turn_speed(unit)\n", - "\n", - " # Time it will take for unit to move in range of target\n", - " distance = (\n", - " unit.position.distance_to(target)\n", - " - unit.radius\n", - " - target.radius\n", - " - range_vs_target(unit, target)\n", - " )\n", - " distance = max(0, distance)\n", - " move_time = distance / ((unit.real_speed + 1e-16) * 1.4)\n", - "\n", - " return step_time + turn_time + move_time >= unit.weapon_cooldown / 22.4" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "1948ba89-41b9-4645-a28a-eac0a5ca258f", - "metadata": {}, - "outputs": [], - "source": [ - "target = cy_in_attack_range(unit, _units)[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "45b5ed5b-d2a7-4d8c-9789-a8064089702f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "attack_ready(bot, unit, target)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "8b250555-37bc-489c-9c5c-c369e1ccd3f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5.33 µs ± 32.3 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit attack_ready(bot, unit, target)" - ] - }, - { - "cell_type": "markdown", - "id": "4c7c11ec-3a35-4c92-a796-22745c2b51a0", - "metadata": {}, - "source": [ - "### Work out where any bottlenecks are" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "da851d90-3ad0-4ccc-9680-fdc82e42cb53", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Timer unit: 1e-07 s\n", - "\n", - "Total time: 9.14e-05 s\n", - "File: C:\\Users\\Tom\\AppData\\Local\\Temp\\ipykernel_23956\\1118029139.py\n", - "Function: attack_ready at line 30\n", - "\n", - "Line # Hits Time Per Hit % Time Line Contents\n", - "==============================================================\n", - " 30 def attack_ready(bot, unit: Unit, target: Unit) -> bool:\n", - " 31 \"\"\"\n", - " 32 Determine whether the unit can attack the target by the time the unit faces the target.\n", - " 33 Thanks Sasha for writing this out.\n", - " 34 \"\"\"\n", - " 35 # fix for units, where this method returns False so the unit moves\n", - " 36 # but the attack animation is still active, so the move command cancels the attack\n", - " 37 # need to think of a better fix later, but this is better then a unit not attacking\n", - " 38 # and still better then using simple weapon.cooldown == 0 micro\n", - " 39 1 195.0 195.0 21.3 type_id = unit.type_id\n", - " 40 1 78.0 78.0 8.5 if unit.weapon_cooldown > 7 and type_id == UnitID.HYDRALISK:\n", - " 41 return True\n", - " 42 # prevents crash, since unit can't move\n", - " 43 1 15.0 15.0 1.6 if type_id == UnitID.LURKERMPBURROWED:\n", - " 44 return True\n", - " 45 1 4.0 4.0 0.4 if not unit.can_attack:\n", - " 46 return False\n", - " 47 # Time elapsed per game step\n", - " 48 1 44.0 44.0 4.8 step_time: float = bot.client.game_step / 22.4\n", - " 49 \n", - " 50 # Time it will take for unit to turn to face target\n", - " 51 2 55.0 27.5 6.0 angle: float = angle_diff(\n", - " 52 1 150.0 150.0 16.4 unit.facing, angle_to(unit.position, target.position)\n", - " 53 )\n", - " 54 1 169.0 169.0 18.5 turn_time: float = angle / get_turn_speed(unit)\n", - " 55 \n", - " 56 # Time it will take for unit to move in range of target\n", - " 57 1 3.0 3.0 0.3 distance = (\n", - " 58 4 67.0 16.8 7.3 unit.position.distance_to(target)\n", - " 59 1 31.0 31.0 3.4 - unit.radius\n", - " 60 1 19.0 19.0 2.1 - target.radius\n", - " 61 1 33.0 33.0 3.6 - range_vs_target(unit, target)\n", - " 62 )\n", - " 63 1 10.0 10.0 1.1 distance = max(0, distance)\n", - " 64 1 14.0 14.0 1.5 move_time = distance / ((unit.real_speed + 1e-16) * 1.4)\n", - " 65 \n", - " 66 1 27.0 27.0 3.0 return step_time + turn_time + move_time >= unit.weapon_cooldown / 22.4" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%lprun -f attack_ready attack_ready(bot, unit, target)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "cac83172-2749-4e2c-8c7d-dd30122403d9", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "from sc2.ids.unit_typeid import UnitTypeId as UnitID\n", - "from sc2.unit import Unit\n", - "from ares.dicts.turn_rate import TURN_RATE\n", - "from ares.dicts.unit_data import UNIT_DATA\n", - "UNIT_DATA_INT_KEYS = {k.value: v for k, v in UNIT_DATA.items()}\n", - "TURN_RATE_INT_KEYS = {k.value: v for k, v in TURN_RATE.items()}\n", - "import math\n", - "from libc.math cimport atan2, fabs, pi\n", - "\n", - "cdef double cy_distance_to(\n", - " (float, float) p1,\n", - " (float, float) p2\n", - "):\n", - " return ((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) ** 0.5\n", - "\n", - "cdef double angle_to((float, float) from_pos, (float, float) to_pos):\n", - " \"\"\"Angle from point to other point in radians\"\"\"\n", - " return atan2(to_pos[1] - from_pos[1], to_pos[0] - to_pos[0])\n", - "\n", - "cdef double angle_diff(double a, double b):\n", - " \"\"\"Absolute angle difference between 2 angles\"\"\"\n", - " if a < 0:\n", - " a += pi * 2\n", - " if b < 0:\n", - " b += pi * 2\n", - " return fabs(a - b)\n", - "\n", - "cdef double get_turn_speed(unit, unsigned int unit_type_int):\n", - " \"\"\"Returns turn speed of unit in radians\"\"\"\n", - " cdef double turn_rate\n", - "\n", - " turn_rate = TURN_RATE_INT_KEYS.get(unit_type_int, None)\n", - " if turn_rate:\n", - " return turn_rate * 1.4 * pi / 180\n", - "\n", - "cdef double range_vs_target(unit, target):\n", - " \"\"\"Get the range of a unit to a target.\"\"\"\n", - " if unit.can_attack_air and target.is_flying:\n", - " return unit.air_range\n", - " else:\n", - " return unit.ground_range\n", - "\n", - "cpdef bint cy_attack_ready(bot, unit, target):\n", - " \"\"\"\n", - " Determine whether the unit can attack the target by the time the unit faces the target.\n", - " Thanks Sasha for writing this out.\n", - " \"\"\"\n", - " cdef:\n", - " unsigned int unit_type_int = unit._proto.unit_type\n", - " unsigned int weapon_cooldown\n", - " double angle, distance, move_time, step_time, turn_time, unit_speed\n", - " (float, float) unit_pos\n", - " (float, float) target_pos\n", - "\n", - " # fix for units, where this method returns False so the unit moves\n", - " # but the attack animation is still active, so the move command cancels the attack\n", - " # need to think of a better fix later, but this is better then a unit not attacking\n", - " # and still better then using simple weapon.cooldown == 0 micro\n", - " weapon_cooldown = unit.weapon_cooldown\n", - " if weapon_cooldown > 7 and unit_type_int == 91: # 91 == UnitID.HYDRALISK\n", - " return True\n", - " # prevents crash, since unit can't move\n", - " if unit_type_int == 91: # == UnitID.LURKERMPBURROWED\n", - " return True\n", - " if not unit.can_attack:\n", - " return False\n", - " # Time elapsed per game step\n", - " step_time = bot.client.game_step / 22.4\n", - "\n", - " unit_pos = unit.position\n", - " target_pos = target.position\n", - " # Time it will take for unit to turn to face target\n", - " angle = angle_diff(\n", - " unit.facing, angle_to(unit_pos, target_pos)\n", - " )\n", - " turn_time = angle / get_turn_speed(unit, unit_type_int)\n", - "\n", - " # Time it will take for unit to move in range of target\n", - " distance = (\n", - " cy_distance_to(unit_pos, target_pos)\n", - " - unit.radius\n", - " - target.radius\n", - " - range_vs_target(unit, target)\n", - " )\n", - " distance = max(0, distance)\n", - " unit_speed = (unit.real_speed + 1e-16) * 1.4\n", - " move_time = distance / unit_speed\n", - "\n", - " return step_time + turn_time + move_time >= weapon_cooldown / 22.4" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "bb91ac21-abcd-4cab-b55d-edbb3ca1e29b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.42 µs ± 8.85 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_attack_ready(bot, unit, target)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "2e69ab7a-bcd7-4454-9e62-b74d4a451469", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_attack_ready(bot, unit, target)" - ] - }, - { - "cell_type": "markdown", - "id": "537e4e14-f593-47f7-9e83-7f47e13a8473", - "metadata": {}, - "source": [ - "# Pick enemy target" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "0a1f81f4-1bec-4f3c-b01c-79a447ddac9a", - "metadata": {}, - "outputs": [], - "source": [ - "def pick_enemy_target(enemies: Units) -> Unit:\n", - " \"\"\"For best enemy target from the provided enemies\n", - " TODO: If there are multiple units that can be killed, pick the highest value one\n", - " Unit parameter to allow for this in the future\n", - "\n", - " For now this returns the lowest health enemy\n", - " \"\"\"\n", - " return min(\n", - " enemies,\n", - " key=lambda e: (e.health + e.shield, e.tag),\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "700edb96-d97a-4947-820e-b9454f1af7df", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Unit(name='KarakMale', tag=4316200961)" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pick_enemy_target(units)" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "667b453e-1a3d-4cf6-8bb9-d07ceda8ef5f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "150 µs ± 358 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit pick_enemy_target(units)" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "93057360-3331-4b31-86d8-318e75b0b986", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "cpdef object cy_pick_enemy_target(enemies):\n", - " \"\"\"For best enemy target from the provided enemies\n", - " TODO: If there are multiple units that can be killed, pick the highest value one\n", - " Unit parameter to allow for this in the future\n", - "\n", - " For now this returns the lowest health enemy\n", - " \"\"\"\n", - " cdef:\n", - " object returned_unit\n", - " unsigned int num_enemies, x\n", - " double lowest_health, total_health\n", - " \n", - " num_enemies = len(enemies)\n", - " returned_unit = enemies[0]\n", - " lowest_health = 999.9\n", - " for x in range(num_enemies):\n", - " unit = enemies[x]\n", - " total_health = unit.health + unit.shield\n", - " if total_health < lowest_health:\n", - " lowest_health = total_health\n", - " returned_unit = unit\n", - "\n", - " return unit" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "d99207b2-832b-4018-8188-4d2fc4f7edb4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "92.7 µs ± 239 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_pick_enemy_target(units)" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "4ccdc590-7300-49af-b928-c32f82575c9e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Unit(name='MineralField750', tag=4326162433)" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_pick_enemy_target(units)" - ] - }, - { - "cell_type": "markdown", - "id": "247a71ed-20f4-4c16-ba61-440f2ed890c8", - "metadata": {}, - "source": [ - "# Converting `units.sorted_by_distance_to`\n" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "5ff685e4-c530-437e-ba74-9c846327cdf4", - "metadata": {}, - "outputs": [], - "source": [ - "position = bot.start_location" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "d092dcd0-d1a3-41f5-b721-6b537686f078", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "332 µs ± 2.45 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit units.sorted_by_distance_to(position)" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "039037e9-7f90-45c4-8068-b9e0759f4625", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Unit(name='CommandCenter', tag=4347396097),\n", - " Unit(name='SCV', tag=4349231105),\n", - " Unit(name='SCV', tag=4348968961),\n", - " Unit(name='SCV', tag=4349755393),\n", - " Unit(name='SCV', tag=4349493249),\n", - " Unit(name='SCV', tag=4348706817),\n", - " Unit(name='SCV', tag=4348444673),\n", - " Unit(name='SCV', tag=4350279681),\n", - " Unit(name='SCV', tag=4350017537),\n", - " Unit(name='SCV', tag=4348182529),\n", - " Unit(name='SCV', tag=4347920385),\n", - " Unit(name='SCV', tag=4350541825)]" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "units.sorted_by_distance_to(position)[:12]" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "87b1745b-56ed-48c0-871f-cdb8580dbc36", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "import numpy as np\n", - "cimport numpy as cnp\n", - "\n", - "cdef double cy_distance_to_squared(\n", - " (float, float) p1,\n", - " (float, float) p2\n", - "):\n", - " return ((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)\n", - "\n", - "cpdef object cy_sorted_by_distance_to(object units, (float, float) position, bint reverse=False):\n", - " cdef:\n", - " unsigned int len_units = len(units)\n", - " cnp.ndarray[cnp.npy_double, ndim=1] distances = np.empty(len_units)\n", - " # couldn't get this to work\n", - " # cnp.ndarray[cnp.npy_double, ndim=1] indices = np.empty(len_units)\n", - " unsigned int i, j\n", - " \n", - " for i in range(len_units):\n", - " distances[i] = cy_distance_to_squared(units[i].position, position)\n", - "\n", - " indices = distances.argsort()\n", - "\n", - " return [units[j] for j in indices]" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "bfd7beab-7c06-4977-b6ab-9092d640dd1c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Unit(name='CommandCenter', tag=4347396097),\n", - " Unit(name='SCV', tag=4349231105),\n", - " Unit(name='SCV', tag=4348968961),\n", - " Unit(name='SCV', tag=4349755393),\n", - " Unit(name='SCV', tag=4349493249),\n", - " Unit(name='SCV', tag=4348706817),\n", - " Unit(name='SCV', tag=4348444673),\n", - " Unit(name='SCV', tag=4350279681),\n", - " Unit(name='SCV', tag=4350017537),\n", - " Unit(name='SCV', tag=4348182529),\n", - " Unit(name='SCV', tag=4347920385),\n", - " Unit(name='SCV', tag=4350541825)]" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_sorted_by_distance_to(units, position)[:12]" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "50e65960-d155-4d62-965b-e6762b9b77af", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "38.1 µs ± 344 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_sorted_by_distance_to(units, position)" - ] - }, - { - "cell_type": "markdown", - "id": "c8729a1b-7c8f-4df4-90db-3f15d9e23bf7", - "metadata": {}, - "source": [ - "# Convert `unit.is_facing()`" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "73d6e22b-7eca-46d7-a242-ca8a10de942f", - "metadata": {}, - "outputs": [], - "source": [ - "my_unit = bot.workers[0]\n", - "other_unit = bot.townhalls[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "6f794938-68ff-4f52-a15b-583f9221f686", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3.06 µs ± 14.9 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit my_unit.is_facing(other_unit)" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "6ec9a659-5e55-47e4-b0b2-8ad950f76952", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "from libc.math cimport atan2, fabs, pi\n", - "\n", - "\n", - "\n", - "import numpy as np\n", - "\n", - "\n", - "\n", - "cpdef bint cy_is_facing(unit, other_unit, double angle_error=0.05):\n", - " cdef:\n", - " (double, double) p1 = unit.position\n", - " (double, double) p2 = other_unit.position\n", - " double angle, angle_difference\n", - " double unit_facing = unit.facing\n", - "\n", - " angle = atan2(\n", - " p2[1] - p1[1],\n", - " p2[0] - p1[0],\n", - " )\n", - " if angle < 0:\n", - " angle += pi * 2\n", - " angle_difference = fabs(angle - unit_facing)\n", - " return angle_difference < angle_error" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "2f6716e2-9464-404b-9bd5-eb7a8cdcda8d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "320 ns ± 3.32 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_is_facing(my_unit, other_unit)" - ] - }, - { - "cell_type": "markdown", - "id": "7b6e0ac6-59e0-47fd-b573-13b787508207", - "metadata": {}, - "source": [ - "# Convert `Point2.towards()`" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "bdd5715e-1f91-403a-ae0a-561f340c0c3d", - "metadata": {}, - "outputs": [], - "source": [ - "pos = bot.game_info.map_center\n", - "towards_pos = bot.start_location" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "67fa4682-3fcd-4b39-b85c-7dd628c96699", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.79 µs ± 12.5 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit pos.towards(towards_pos, 10.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "4144311b-e66b-4c0e-b669-86eaf44e2fec", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(108.41400663899812, 76.59588191478983)" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pos.towards(towards_pos, 10.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "ad97a789-32d7-4334-9f44-192b1bdce327", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(91.58599336100188, 87.40411808521017)" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pos.towards(towards_pos, -10.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "9c2e1ff8-1b30-4593-8d19-256e6631ab78", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "from libc.math cimport sqrt\n", - "from sc2.position import Point2\n", - "\n", - "cpdef (double, double) cy_towards((double, double) start_pos, (double, double) target_pos, double distance):\n", - " cdef:\n", - " (double, double) vector, displacement, new_pos, normalized_vector\n", - " double magnitude \n", - "\n", - " # Calculate the vector between the points\n", - " vector = (target_pos[0] - start_pos[0], target_pos[1] - start_pos[1])\n", - "\n", - " # Normalize the vector\n", - " magnitude = sqrt(vector[0]**2 + vector[1]**2)\n", - " normalized_vector = (vector[0] / magnitude, vector[1] / magnitude)\n", - "\n", - " # Calculate the displacement vector\n", - " displacement = (normalized_vector[0] * distance, normalized_vector[1] * distance)\n", - "\n", - " # Calculate the new position\n", - " new_pos = (start_pos[0] + displacement[0], start_pos[1] + displacement[1])\n", - "\n", - " return new_pos" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "24cd3f81-3e58-47cd-bb2f-df2ed8688416", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "193 ns ± 0.571 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)\n" - ] - } - ], - "source": [ - "%timeit cy_towards(pos, towards_pos, 10.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "74144641-6471-40ec-b04f-39ee29dea2ee", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(108.41400663899812, 76.59588191478983)" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_towards(pos, towards_pos, 10.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "94d065ad-f04d-4eb4-8389-f3479c4f5a88", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(91.58599336100188, 87.40411808521017)" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cy_towards(pos, towards_pos, -10.0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5e42b4de-8a45-49cd-a486-cf39da22e0c4", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Poetry", - "language": "python", - "name": "poetry-kernel" - }, - "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.11.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/terran_building_locations.ipynb b/notebooks/terran_building_locations.ipynb deleted file mode 100644 index 3d527da..0000000 --- a/notebooks/terran_building_locations.ipynb +++ /dev/null @@ -1,835 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "ecf29ab2-cf1f-4736-8b02-71958a9b83d3", - "metadata": {}, - "source": [ - "# Terran building formation solver using cython, featuring flood fill and convolution algorithms." - ] - }, - { - "cell_type": "markdown", - "id": "3432b3c6-de37-4066-b9a1-725cd2144398", - "metadata": {}, - "source": [ - "#### See `placement_manager._solve_terran_building_formation()` for full building formation logic." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "176c43e5-0956-48a9-8522-a5dd6884c631", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Tom\\AppData\\Local\\pypoetry\\Cache\\virtualenvs\\ares-sc2-S437wHWG-py3.9\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], - "source": [ - "import sys\n", - "import lzma\n", - "from s2clientprotocol.sc2api_pb2 import Response, ResponseObservation\n", - "from MapAnalyzer.utils import import_bot_instance\n", - "from MapAnalyzer import MapData\n", - "import pickle\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "sys.path.append(\"../src\")\n", - "sys.path.append(\"../src/ares\")\n", - "from sc2.position import Point2\n", - "%load_ext line_profiler\n", - "%load_ext Cython" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1dfa943c-b9f9-4cb9-aa76-3d759602f0df", - "metadata": {}, - "outputs": [], - "source": [ - "BERLINGRAD = \"../tests/pickle_data/BerlingradAIE.xz\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "4e56754a-9845-4ae2-ad9a-043a728035bb", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-05-13 19:26:31.626 | INFO | MapAnalyzer.MapData:__init__:122 - dev Compiling Berlingrad AIE \u001b[32m\n", - "\u001b[32m Version dev Map Compilation Progress \u001b[37m: 0.4it [00:00, 1.58it/s]\n" - ] - } - ], - "source": [ - "with lzma.open(BERLINGRAD, \"rb\") as f:\n", - " raw_game_data, raw_game_info, raw_observation = pickle.load(f)\n", - "bot = import_bot_instance(raw_game_data, raw_game_info, raw_observation)\n", - "data = MapData(bot)" - ] - }, - { - "cell_type": "markdown", - "id": "afb91306-f5f6-46dc-8b6c-0b21154e6b25", - "metadata": {}, - "source": [ - "# FLOOD FILL" - ] - }, - { - "cell_type": "markdown", - "id": "8d29a1ea-ead2-47bb-b2c0-8e992326f03e", - "metadata": {}, - "source": [ - "Alternative - `%%cython --annotate`" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "0b0b03e6-b04b-4198-97f2-3e9fc2ab1be7", - "metadata": {}, - "outputs": [], - "source": [ - "start_point=bot.enemy_start_locations[0].rounded\n", - "terrain_grid=bot.game_info.terrain_height.data_numpy.T\n", - "pathing_grid=data.get_pyastar_grid().astype(np.uint8)\n", - "max_distance=20\n", - "choke_points=set([point for ch in data.map_chokes for point in ch.points])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "3081927f-3d05-4363-ab34-461267d17ddf", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "from cython cimport boundscheck, wraparound\n", - "\n", - "cdef unsigned int euclidean_distance_squared_int((unsigned int, unsigned int) p1, (unsigned int, unsigned int) p2):\n", - " return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2\n", - "\n", - "cpdef set flood_fill(\n", - " (unsigned int, unsigned int) start_point, \n", - " const unsigned char[:, :] terrain_grid, \n", - " const unsigned char[:, :] pathing_grid, \n", - " unsigned int max_distance, \n", - " set choke_points\n", - "):\n", - " cdef:\n", - " unsigned int terrain_height = terrain_grid[start_point[0], start_point[1]]\n", - " unsigned int pathing_value = pathing_grid[start_point[0], start_point[1]]\n", - " set filled_points = set()\n", - "\n", - " # Only continue if we can get a height for the starting point\n", - " if not terrain_height:\n", - " return filled_points\n", - " \n", - " if pathing_value != 1:\n", - " return filled_points\n", - " \n", - " grid_flood_fill(start_point, terrain_grid, pathing_grid, terrain_height, filled_points, start_point, max_distance, choke_points)\n", - " return filled_points\n", - "\n", - "cdef set grid_flood_fill(\n", - " (unsigned int, unsigned int) point, \n", - " const unsigned char[:, :] terrain_grid, \n", - " const unsigned char[:, :] pathing_grid, \n", - " unsigned int target_val, \n", - " set current_vec, \n", - " (unsigned int, unsigned int) start_point, \n", - " unsigned int max_distance, \n", - " set choke_points):\n", - " cdef:\n", - " unsigned int terrain_height = terrain_grid[start_point[0], start_point[1]]\n", - " unsigned int pathing_value = pathing_grid[start_point[0], start_point[1]]\n", - " # Check that we haven't already added this point.\n", - " if point in current_vec:\n", - " return current_vec\n", - "\n", - " # Check that this point isn't too far away from the start\n", - " if euclidean_distance_squared_int(point, start_point) > max_distance ** 2:\n", - " return current_vec\n", - "\n", - " if point in choke_points:\n", - " return current_vec\n", - "\n", - " terrain_height = terrain_grid[point[0], point[1]]\n", - " pathing_value = pathing_grid[point[0], point[1]]\n", - " if terrain_height != target_val or pathing_value != 1:\n", - " return current_vec\n", - " \n", - " current_vec.add(point)\n", - " grid_flood_fill((point[0]+1, point[1]), terrain_grid, pathing_grid, terrain_height, current_vec, start_point, max_distance, choke_points)\n", - " grid_flood_fill((point[0]-1, point[1]), terrain_grid, pathing_grid, terrain_height, current_vec, start_point, max_distance, choke_points)\n", - " grid_flood_fill((point[0], point[1]+1), terrain_grid, pathing_grid, terrain_height, current_vec, start_point, max_distance, choke_points)\n", - " grid_flood_fill((point[0], point[1]-1), terrain_grid, pathing_grid, terrain_height, current_vec, start_point, max_distance, choke_points)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "88165f9c-4cb3-4291-8a1a-20bed3872e6c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "314 µs ± 9.62 µs per loop (mean ± std. dev. of 1000 runs, 5 loops each)\n" - ] - } - ], - "source": [ - "%timeit -r 1000 -n 5 flood_fill(start_point, terrain_grid, pathing_grid, max_distance, choke_points)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "d9687e26-facb-4847-8662-d97178ee3173", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "data": { - "text/plain": [ - " 60 function calls in 0.001 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 1 0.000 0.000 0.001 0.001 {built-in method builtins.exec}\n", - " 1 0.000 0.000 0.001 0.001 :1()\n", - " 1 0.001 0.001 0.001 0.001 {built-in method _cython_magic_555d3061e85bd04edd4ce018b1179997.flood_fill}\n", - " 8 0.000 0.000 0.000 0.000 position.py:136(__eq__)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method builtins.all}\n", - " 24 0.000 0.000 0.000 0.000 position.py:138()\n", - " 16 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%prun -s cumulative flood_fill(start_point, terrain_grid, pathing_grid, max_distance, choke_points)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "baba26e5-ef9b-405c-a7db-40c989d681cb", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Tom\\AppData\\Local\\pypoetry\\Cache\\virtualenvs\\ares-sc2-S437wHWG-py3.9\\lib\\site-packages\\line_profiler\\ipython_extension.py:71: UserWarning: Could not extract a code object for the object \n", - " profile = LineProfiler(*funcs)\n" - ] - }, - { - "data": { - "text/plain": [ - "Timer unit: 1e-07 s" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%lprun -f flood_fill flood_fill(start_point, terrain_grid, pathing_grid, max_distance, choke_points)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "87dbe28c-5386-4ca8-afc2-4a3a0d14a6ee", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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EezZs8fZ57LLLsM999yDO+64A2vXrsUbb7yBM844o4WlLs/jjz+Of/u3f8Ohhx5asD3K5/Duu+/i2GOPRTKZxG9+8xs888wz+Na3voV99tnH2ef666/HjTfeiJtvvhkbNmzA+PHjsXTpUoyOjraw5GNcd911uOmmm/D9738fzz77LK677jpcf/31+N73vufsE7Vz2LNnDw477DCsWrXK830/5V22bBn++Mc/YvXq1bj33nuxbt06nH/++S0v/969e7Fp0yZcddVV2LRpE+68805s2bIFp556asF+rSw/UP030Nx111149NFHMTAwUPJe1M/hpZdewnHHHYc5c+bgoYcewu9//3tcddVV6OrqcvZp2P2JYsjRRx9NF154ofO3ZVk0MDBAK1eubGGp/LF9+3YCQGvXriUiop07d1IymaQ77rjD2efZZ58lALR+/fpWFdOTXbt20ezZs2n16tX0oQ99iL74xS8SUfTP4corr6Tjjjuu7PtSSurv76d/+Zd/cbbt3LmT0uk0/fznP29GEaty8skn02c/+9mCbWeccQYtW7aMiKJ/DgDorrvucv72U95nnnmGANDjjz/u7POb3/yGhBD0+uuvN63sRKXl9+Kxxx4jAPTyyy8TUbTKT1T+HF577TXaf//96emnn6YDDjiAvvOd7zjvxeEcPvnJT9KnP/3psp9p5P0pdj3QbDaLjRs3YsmSJc42wzCwZMkSrF+/voUl88fQ0BAAYPLkyQCAjRs3IpfLFZzPnDlzMHPmzMidz4UXXoiTTz65oKxA9M/h17/+NRYuXIi//uu/xtSpU7FgwQL88Ic/dN7funUrBgcHC8rf29uLRYsWRaL8AHDMMcdgzZo1eP755wEATz31FB5++GF89KMfBRCPc3Djp7zr16/HpEmTsHDhQmefJUuWwDAMbNiwoellrsbQ0BCEEJg0aRKAeJRfSomzzz4bl19+OQ4++OCS96N+DlJK/Pd//zfe9773YenSpZg6dSoWLVpUMMzbyPtT7ALo22+/Dcuy0NfXV7C9r68Pg4ODLSqVP6SUuPTSS3HsscfikEMOAQAMDg4ilUo5F50maudz++23Y9OmTVi5cmXJe1E/hz/96U+46aabMHv2bNx///244IILcMkll+AnP/kJADhljHKb+spXvoKzzjoLc+bMQTKZxIIFC3DppZdi2bJlAOJxDm78lHdwcBBTp04teD+RSGDy5MmRO6fR0VFceeWV+NSnPuU4gcSh/Ndddx0SiQQuueQSz/ejfg7bt2/H7t27ce211+LEE0/E//7v/+JjH/sYzjjjDKxduxZAY+9PsbQziysXXnghnn76aTz88MOtLkpNvPrqq/jiF7+I1atXF8wrxAUpJRYuXIhvfvObAIAFCxbg6aefxs0334xzzjmnxaXzxy9/+UvceuutuO2223DwwQdj8+bNuPTSSzEwMBCbc2hXcrkcPvGJT4CIcNNNN7W6OL7ZuHEjvvvd72LTpk0QQrS6OIGQUgIATjvtNFx22WUAgMMPPxyPPPIIbr75ZnzoQx9q6PfHrge67777wjTNEgXVtm3b0N/f36JSVeeiiy7CvffeiwcffBDTp093tvf39yObzWLnzp0F+0fpfDZu3Ijt27fjiCOOQCKRQCKRwNq1a3HjjTcikUigr68v0ucwbdo0zJs3r2Db3LlzHZWeLmOU29Tll1/u9ELnz5+Ps88+G5dddpkzIhCHc3Djp7z9/f0lwsB8Po8dO3ZE5px08Hz55ZexevXqAh/KqJf/d7/7HbZv346ZM2c61/XLL7+ML33pSzjwwAMBRP8c9t13XyQSiarXd6PuT7ELoKlUCkceeSTWrFnjbJNSYs2aNVi8eHELS+YNEeGiiy7CXXfdhQceeACzZs0qeP/II49EMpksOJ8tW7bglVdeicz5nHDCCfjDH/6AzZs3O6+FCxdi2bJlzv+jfA7HHntsydKh559/HgcccAAAYNasWejv7y8o//DwMDZs2BCJ8gNK9WkYhZeraZrOE3gczsGNn/IuXrwYO3fuxMaNG519HnjgAUgpsWjRoqaXuRgdPF944QX89re/xZQpUwrej3r5zz77bPz+978vuK4HBgZw+eWX4/777wcQ/XNIpVI46qijKl7fDb3H1iVBahG33347pdNp+vGPf0zPPPMMnX/++TRp0iQaHBxsddFKuOCCC6i3t5ceeughevPNN53X3r17nX0+//nP08yZM+mBBx6gJ554ghYvXkyLFy9uYamr41bhEkX7HB577DFKJBL0jW98g1544QW69dZbady4cfSzn/3M2efaa6+lSZMm0a9+9Sv6/e9/T6eddhrNmjWLRkZGWljyMc455xzaf//96d5776WtW7fSnXfeSfvuuy9dccUVzj5RO4ddu3bRk08+SU8++SQBoG9/+9v05JNPOipVP+U98cQTacGCBbRhwwZ6+OGHafbs2fSpT32q5eXPZrN06qmn0vTp02nz5s0F13Ymk4lE+audgxfFKlyi6J/DnXfeSclkkm655RZ64YUX6Hvf+x6Zpkm/+93vnGM06v4UywBKRPS9732PZs6cSalUio4++mh69NFHW10kTwB4vn70ox85+4yMjNAXvvAF2meffWjcuHH0sY99jN58883WFdoHxQE06udwzz330CGHHELpdJrmzJlDt9xyS8H7Ukq66qqrqK+vj9LpNJ1wwgm0ZcuWFpW2lOHhYfriF79IM2fOpK6uLnrPe95D//AP/1Bws47aOTz44IOebf+cc87xXd533nmHPvWpT9GECROop6eHzj33XNq1a1fLy79169ay1/aDDz4YifJXOwcvvAJoHM7hP/7jP+i9730vdXV10WGHHUZ33313wTEadX9iP1CGYRiGCUDs5kAZhmEYJgpwAGUYhmGYAHAAZRiGYZgAcABlGIZhmABwAGUYhmGYAHAAZRiGYZgAcABlGIZhmABwAGUYhmGYAHAAZRiGYZgAcABlGIZhmABwAGUYhmGYAPz/xC5/n1wPdYEAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "h = pathing_grid.copy()\n", - "for value in flood_fill(start_point, terrain_grid, pathing_grid, max_distance, choke_points):\n", - " h[value] = 25\n", - "plt.imshow(h)" - ] - }, - { - "cell_type": "markdown", - "id": "9723d500-8a1d-44c3-b9a9-6d97a5e187fb", - "metadata": {}, - "source": [ - "# Bounding Box" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "d88a5886-8c98-4822-89d8-d0d5bcd37fee", - "metadata": {}, - "outputs": [], - "source": [ - "%%cython\n", - "from cython cimport boundscheck, wraparound\n", - "# The boundscheck(False) decorator tells Cython that we know that we will not access elements outside the bounds of the units list, which allows for faster indexing. \n", - "# The wraparound(False) decorator tells Cython that we know that we will not use negative indices to access elements of the list, which also allows for faster indexing.\n", - "@boundscheck(False)\n", - "@wraparound(False)\n", - "cpdef ((float, float), (float, float)) get_bounding_box(set coordinates):\n", - " cdef:\n", - " float x_min = 9999.0\n", - " float x_max = 0.0\n", - " float x_val = 0.0\n", - " float y_min = 9999.0\n", - " float y_max = 0.0\n", - " float y_val = 0.0\n", - " int start = 0\n", - " int stop = len(coordinates)\n", - " (float, float) position\n", - " for i in range(start, stop):\n", - " position = coordinates.pop()\n", - " x_val = position[0]\n", - " y_val = position[1]\n", - " if x_val < x_min:\n", - " x_min = x_val\n", - " if x_val > x_max:\n", - " x_max = x_val\n", - " if y_val < y_min:\n", - " y_min = y_val\n", - " if y_val > y_max:\n", - " y_max = y_val\n", - " return (x_min, x_max), (y_min, y_max)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "3b50a5a4-d3f7-4cbe-94fc-663ef198b38e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "340 µs ± 7.18 µs per loop (mean ± std. dev. of 1000 runs, 10 loops each)\n" - ] - } - ], - "source": [ - "%timeit -r 1000 -n 10 get_bounding_box(flood_fill(start_point, terrain_grid, pathing_grid, max_distance, choke_points))" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "4e2df8da-1a77-48f1-851e-9437dc5cdb32", - "metadata": {}, - "outputs": [], - "source": [ - "raw_x_bounds, raw_y_bounds = get_bounding_box(flood_fill(start_point, terrain_grid, pathing_grid, max_distance, choke_points))" - ] - }, - { - "cell_type": "markdown", - "id": "443f7269-b6ea-46cb-813c-c991265a214e", - "metadata": {}, - "source": [ - "# Find building locations with convolution pass" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "0cac97ff-5b48-4fb7-bdab-bb61760c95c1", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "%%cython\n", - "\n", - "from scipy.signal import convolve2d\n", - "import numpy as np\n", - "cimport numpy as np\n", - "cimport cython\n", - "\n", - "@cython.boundscheck(False) # Deactivate bounds checking\n", - "@cython.wraparound(False) # Deactivate negative indexing.\n", - "cpdef bint can_place_structure(\n", - " (int, int) building_origin,\n", - " (int, int) building_size,\n", - " const unsigned char[:, :] creep_grid,\n", - " const unsigned char[:, :] placement_grid,\n", - " const unsigned char[:, :] pathing_grid,\n", - " bint avoid_creep = 1,\n", - " bint include_addon = 0\n", - "):\n", - " cdef:\n", - " unsigned int size_x = building_size[0]\n", - " unsigned int size_y = building_size[1]\n", - " unsigned int x = building_origin[0]\n", - " unsigned int y = building_origin[1]\n", - " unsigned int total = 0\n", - " unsigned int area = size_x * size_y\n", - " unsigned int creep_check = 1 if avoid_creep else 0\n", - " \n", - " cdef Py_ssize_t i, j\n", - " for i in range(size_y):\n", - " for j in range(size_x):\n", - " if placement_grid[y + i, x + j] == 0:\n", - " return 0\n", - " if creep_grid[y + i, x + j] == creep_check:\n", - " return 0\n", - " if pathing_grid[y + i, x + j] == 1:\n", - " return 0\n", - " return 1\n", - "\n", - "@cython.boundscheck(False) # Deactivate bounds checking\n", - "@cython.wraparound(False) # Deactivate negative indexing.\n", - "cpdef list find_building_locations(\n", - " np.ndarray[np.uint8_t, ndim=2] kernel,\n", - " unsigned int x_stride,\n", - " unsigned int y_stride,\n", - " (unsigned int, unsigned int) x_bounds,\n", - " (unsigned int, unsigned int) y_bounds,\n", - " const unsigned char[:, :] creep_grid,\n", - " const unsigned char[:, :] placement_grid,\n", - " const unsigned char[:, :] pathing_grid,\n", - " const unsigned char[:, :] points_to_avoid_grid,\n", - " unsigned int building_width,\n", - " unsigned int building_height,\n", - " bint avoid_creep = 1,\n", - " bint include_addon = 0\n", - "):\n", - " \"\"\"\n", - " Use a convolution pass to find all possible building locations in an area\n", - " See full docs in `placement_solver.pyi`\n", - " \"\"\"\n", - " cdef:\n", - " # unsigned int i = 0\n", - " # unsigned int j = 0\n", - " unsigned int _x = 0\n", - " unsigned int _y = 0\n", - " unsigned int valid_idx = 0\n", - " float x, y\n", - " float weighted_x, weighted_y\n", - " int x_min = x_bounds[0]\n", - " int x_max = x_bounds[1]\n", - " int y_min = y_bounds[0]\n", - " int y_max = y_bounds[1]\n", - " unsigned char[:, :] to_convolve = np.ones((x_max - x_min + 1, y_max - y_min + 1), dtype=np.uint8)\n", - " (float, float) [500] valid_spots\n", - " (float, float) center\n", - " float half_width = building_width / 2\n", - " cdef bint avoid = 0\n", - " \n", - " cdef Py_ssize_t i, j\n", - " for i in range(x_min, x_max + 1):\n", - " for j in range(y_min, y_max + 1):\n", - " if points_to_avoid_grid[j][i] == 0 and creep_grid[j][i] == 0 and placement_grid[j][i] == 1 and pathing_grid[j][i] == 1:\n", - " to_convolve[i - x_min][j - y_min] = 0\n", - "\n", - " cdef unsigned char[:, :] result = convolve2d(to_convolve, kernel, mode=\"valid\")\n", - " cdef Py_ssize_t k, l\n", - " \n", - " for i in range(0, result.shape[0], x_stride):\n", - " for j in range(0, result.shape[1], y_stride):\n", - " if result[i][j] == 0:\n", - " x = i + x_min + half_width\n", - " y = j + y_min + half_width\n", - "\n", - " if include_addon:\n", - " _x = int(x + 1.5)\n", - " _y = int(y + 0.5)\n", - " if not can_place_structure((_x, _y), (2, 2), creep_grid, placement_grid, pathing_grid, avoid_creep):\n", - " continue\n", - " \n", - " avoid = 0\n", - " for k in range(2):\n", - " for l in range(2):\n", - " if points_to_avoid_grid[_y+k, _x+l]:\n", - " avoid = 1\n", - " if avoid:\n", - " continue\n", - "\n", - " # valid building placement is building center, so add half to x and y\n", - " valid_spots[valid_idx][0] = x\n", - " valid_spots[valid_idx][1] = y\n", - " valid_idx += 1\n", - "\n", - " if valid_idx == 0:\n", - " return []\n", - "\n", - " return list(valid_spots)[:valid_idx]" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "827030a1-c1cc-40e3-99a5-e073bc7aae89", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(24.5, 139.5), (29.5, 127.5), (29.5, 130.5), (29.5, 133.5), (34.5, 124.5), (34.5, 127.5), (34.5, 130.5), (34.5, 133.5), (39.5, 121.5), (39.5, 124.5), (39.5, 127.5), (39.5, 130.5), (39.5, 133.5), (39.5, 136.5), (39.5, 139.5), (44.5, 118.5), (44.5, 121.5), (44.5, 124.5), (44.5, 127.5), (44.5, 130.5), (44.5, 133.5), (44.5, 136.5), (44.5, 139.5), (49.5, 121.5), (49.5, 124.5), (49.5, 127.5), (49.5, 130.5), (49.5, 133.5), (49.5, 136.5), (49.5, 139.5)]\n" - ] - } - ], - "source": [ - "kernel: np.ndarray = np.ones(\n", - " (3, 3), dtype=np.uint8\n", - " )\n", - "\n", - "points_to_avoid_grid = np.zeros(bot.game_info.placement_grid.data_numpy.shape, dtype=np.uint8)\n", - "\n", - "# avoid within 5.5 distance of base location\n", - "start_x = int(bot.townhalls[0].position.x - 5.5)\n", - "start_y = int(bot.townhalls[0].position.y - 5.5)\n", - "\n", - "points_to_avoid_grid[start_x:start_x+11, start_y:start_y+11] = 1\n", - "\n", - "production_positions = find_building_locations(\n", - " kernel, \n", - " 5,\n", - " 3,\n", - " raw_x_bounds, \n", - " raw_y_bounds, \n", - " bot.state.creep.data_numpy, \n", - " bot.game_info.placement_grid.data_numpy,\n", - " data.get_pyastar_grid().astype(np.uint8).T,\n", - " # bot.game_info.pathing_grid.data_numpy, \n", - " points_to_avoid_grid, \n", - " 3, \n", - " 3,\n", - " True\n", - ")\n", - "print(production_positions)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "0697d8b7-a77e-4d1b-b3a4-065bb7947a1c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The slowest run took 17.90 times longer than the fastest. This could mean that an intermediate result is being cached.\n", - "1.24 µs ± 633 ns per loop (mean ± std. dev. of 1000 runs, 10 loops each)\n" - ] - } - ], - "source": [ - "%timeit -r 1000 -n 10 can_place_structure((25, 25), (3, 3), bot.state.creep.data_numpy, bot.game_info.placement_grid.data_numpy, pathing_grid)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "5f670f55-1c6a-496c-8e57-183a457360c1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "63.3 µs ± 2.66 µs per loop (mean ± std. dev. of 1000 runs, 10 loops each)\n" - ] - } - ], - "source": [ - "%timeit -r 1000 -n 10 find_building_locations(kernel, 5,3, raw_x_bounds, raw_y_bounds, bot.state.creep.data_numpy, bot.game_info.placement_grid.data_numpy, pathing_grid, points_to_avoid_grid, 3, 3,True)" - ] - }, - { - "cell_type": "markdown", - "id": "7a791013-e4dd-4a22-bfed-473b568f9b32", - "metadata": {}, - "source": [ - "## Example of how placement locations could be stored" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "05e12441-690f-4ced-804e-07c3e0403e22", - "metadata": {}, - "outputs": [], - "source": [ - "placements_dict = dict()" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "7e15a4d5-254c-49bb-ba6a-05fdec191c9f", - "metadata": {}, - "outputs": [], - "source": [ - "placements_dict[bot.townhalls[0].position] = {}\n", - "placements_dict[bot.townhalls[0].position][\"3x3\"] = {}\n", - "for pos in production_positions:\n", - " x: float = pos[0]\n", - " y: float = pos[1]\n", - " point2_pos: Point2 = Point2((x, y))\n", - " placements_dict[bot.townhalls[0].position][\"3x3\"][point2_pos] = {\n", - " \"available\": True,\n", - " \"has_addon\": False,\n", - " \"is_wall\": False,\n", - " \"tag\": 0, # structure tag if not available\n", - " \"worker_on_route\": False # available but recently requested\n", - " }\n", - "placements_dict[Point2((300.0, 300.0))] = {}" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "3d5660d6-f32a-4486-98d4-d30059a286a7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(120.5,\n", - " 24.5): {'3x3': {(24.5, 139.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (29.5, 127.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (29.5, 130.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (29.5, 133.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (34.5, 124.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (34.5, 127.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (34.5, 130.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (34.5, 133.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (39.5, 121.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (39.5, 124.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (39.5, 127.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (39.5, 130.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (39.5, 133.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (39.5, 136.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (39.5, 139.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (44.5, 118.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (44.5, 121.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (44.5, 124.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (44.5, 127.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (44.5, 130.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (44.5, 133.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (44.5, 136.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (44.5, 139.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (49.5, 121.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (49.5, 124.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (49.5, 127.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (49.5, 130.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (49.5, 133.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (49.5, 136.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False},\n", - " (49.5, 139.5): {'available': True,\n", - " 'has_addon': False,\n", - " 'is_wall': False,\n", - " 'tag': 0,\n", - " 'worker_on_route': False}}},\n", - " (300.0, 300.0): {}}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "placements_dict" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "035e0b4d-ac64-4dcc-bf6c-061e22c0bd5e", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Poetry", - "language": "python", - "name": "poetry-kernel" - }, - "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.11.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/poetry.lock b/poetry.lock index 7ad95e2..8627eb5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,111 +2,98 @@ [[package]] name = "aiohttp" -version = "3.8.6" +version = "3.9.3" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, - {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, - {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, - {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, - {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, - {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, - {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, - {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, - {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, - {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, - {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, - {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, - {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, - {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, - {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, - {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, - {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, - {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, - {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, - {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, - {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, - {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, - {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, - {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, - {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, - {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, - {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, + {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, + {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, + {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, + {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, + {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, + {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, + {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, + {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, + {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, + {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, + {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiosignal" @@ -124,86 +111,66 @@ frozenlist = ">=1.1.0" [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] name = "asttokens" -version = "2.4.0" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, - {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] - -[[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {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[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +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-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +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 = "babel" -version = "2.13.0" +version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.13.0-py3-none-any.whl", hash = "sha256:fbfcae1575ff78e26c7449136f1abbefc3c13ce542eeb13d43d50d8b047216ec"}, - {file = "Babel-2.13.0.tar.gz", hash = "sha256:04c3e2d28d2b7681644508f836be388ae49e0cfe91465095340395b60d00f210"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - [[package]] name = "black" version = "22.12.0" @@ -264,13 +231,13 @@ resolved_reference = "774ba1afaf98f52beafb905ecde05dac7e34d202" [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -339,101 +306,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, - {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -477,153 +444,143 @@ files = [ [[package]] name = "comm" -version = "0.1.4" +version = "0.2.1" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, - {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, ] [package.dependencies] traitlets = ">=4" [package.extras] -lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] test = ["pytest"] -typing = ["mypy (>=0.990)"] [[package]] name = "contourpy" -version = "1.1.1" +version = "1.2.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, - {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, - {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, - {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, - {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, - {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, - {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, - {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, - {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, - {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, - {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, - {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, - {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, - {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, - {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, - {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, - {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, - {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, ] [package.dependencies] -numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} +numpy = ">=1.20,<2.0" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.2" +version = "7.4.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, + {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, + {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, + {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, + {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, + {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, + {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, + {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, + {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, + {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, + {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, + {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, + {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, ] [package.extras] @@ -631,47 +588,56 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "41.0.4" +version = "42.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"}, - {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"}, - {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"}, - {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"}, - {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"}, - {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"}, - {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"}, + {file = "cryptography-42.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be"}, + {file = "cryptography-42.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2"}, + {file = "cryptography-42.0.2-cp37-abi3-win32.whl", hash = "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee"}, + {file = "cryptography-42.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee"}, + {file = "cryptography-42.0.2-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33"}, + {file = "cryptography-42.0.2-cp39-abi3-win32.whl", hash = "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635"}, + {file = "cryptography-42.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65"}, + {file = "cryptography-42.0.2.tar.gz", hash = "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888"}, ] [package.dependencies] -cffi = ">=1.12" +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -690,14 +656,15 @@ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] -name = "cython" -version = "0.29.36" -description = "The Cython compiler for writing C extensions for the Python language." +name = "cython-extensions-sc2" +version = "0.3.3" +description = "" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.11,<3.13" files = [ - {file = "Cython-0.29.36-py2.py3-none-any.whl", hash = "sha256:95bb13d8be507425d03ebe051f90d4b2a9fdccc64e4f30b35645fdb7542742eb"}, - {file = "Cython-0.29.36.tar.gz", hash = "sha256:41c0cfd2d754e383c9eeb95effc9aa4ab847d0c9747077ddd7c0dcb68c3bc01f"}, + {file = "cython_extensions_sc2-0.3.3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7950e35f358303f01a207f9680e7113ae11b08e560aa27dc68f6720c1846b3ef"}, + {file = "cython_extensions_sc2-0.3.3-cp311-cp311-manylinux_2_35_x86_64.whl", hash = "sha256:d71a7b87c39336c3e9aea4bdc04e88e1897ffdedfb0a476285a96253b23bb23a"}, + {file = "cython_extensions_sc2-0.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:cef3e1b8f3f0cfe0deb7fbd2c3ffb5ff0d84c166818aab2a89556178eb99fd9e"}, ] [[package]] @@ -762,13 +729,13 @@ files = [ [[package]] name = "executing" -version = "2.0.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "executing-2.0.0-py2.py3-none-any.whl", hash = "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657"}, - {file = "executing-2.0.0.tar.gz", hash = "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] @@ -792,137 +759,153 @@ pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "fonttools" -version = "4.43.1" +version = "4.48.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273"}, - {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c"}, - {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca"}, - {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6"}, - {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184"}, - {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7"}, - {file = "fonttools-4.43.1-cp310-cp310-win32.whl", hash = "sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02"}, - {file = "fonttools-4.43.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef"}, - {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b"}, - {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f"}, - {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0"}, - {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8"}, - {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd"}, - {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b"}, - {file = "fonttools-4.43.1-cp311-cp311-win32.whl", hash = "sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204"}, - {file = "fonttools-4.43.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8"}, - {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5"}, - {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c"}, - {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680"}, - {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215"}, - {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3"}, - {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b"}, - {file = "fonttools-4.43.1-cp312-cp312-win32.whl", hash = "sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f"}, - {file = "fonttools-4.43.1-cp312-cp312-win_amd64.whl", hash = "sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72"}, - {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590"}, - {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7"}, - {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6"}, - {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d"}, - {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0"}, - {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933"}, - {file = "fonttools-4.43.1-cp38-cp38-win32.whl", hash = "sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b"}, - {file = "fonttools-4.43.1-cp38-cp38-win_amd64.whl", hash = "sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896"}, - {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba"}, - {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13"}, - {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477"}, - {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860"}, - {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86"}, - {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3"}, - {file = "fonttools-4.43.1-cp39-cp39-win32.whl", hash = "sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad"}, - {file = "fonttools-4.43.1-cp39-cp39-win_amd64.whl", hash = "sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a"}, - {file = "fonttools-4.43.1-py3-none-any.whl", hash = "sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9"}, - {file = "fonttools-4.43.1.tar.gz", hash = "sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212"}, + {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:702ae93058c81f46461dc4b2c79f11d3c3d8fd7296eaf8f75b4ba5bbf813cd5f"}, + {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97f0a49fa6aa2d6205c6f72f4f98b74ef4b9bfdcb06fd78e6fe6c7af4989b63e"}, + {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3260db55f1843e57115256e91247ad9f68cb02a434b51262fe0019e95a98738"}, + {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e740a7602c2bb71e1091269b5dbe89549749a8817dc294b34628ffd8b2bf7124"}, + {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4108b1d247953dd7c90ec8f457a2dec5fceb373485973cc852b14200118a51ee"}, + {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56339ec557f0c342bddd7c175f5e41c45fc21282bee58a86bd9aa322bec715f2"}, + {file = "fonttools-4.48.1-cp310-cp310-win32.whl", hash = "sha256:bff5b38d0e76eb18e0b8abbf35d384e60b3371be92f7be36128ee3e67483b3ec"}, + {file = "fonttools-4.48.1-cp310-cp310-win_amd64.whl", hash = "sha256:f7449493886da6a17472004d3818cc050ba3f4a0aa03fb47972e4fa5578e6703"}, + {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18b35fd1a850ed7233a99bbd6774485271756f717dac8b594958224b54118b61"}, + {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cad5cfd044ea2e306fda44482b3dd32ee47830fa82dfa4679374b41baa294f5f"}, + {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f30e605c7565d0da6f0aec75a30ec372072d016957cd8fc4469721a36ea59b7"}, + {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee76fd81a8571c68841d6ef0da750d5ff08ff2c5f025576473016f16ac3bcf7"}, + {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5057ade278e67923000041e2b195c9ea53e87f227690d499b6a4edd3702f7f01"}, + {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b10633aafc5932995a391ec07eba5e79f52af0003a1735b2306b3dab8a056d48"}, + {file = "fonttools-4.48.1-cp311-cp311-win32.whl", hash = "sha256:0d533f89819f9b3ee2dbedf0fed3825c425850e32bdda24c558563c71be0064e"}, + {file = "fonttools-4.48.1-cp311-cp311-win_amd64.whl", hash = "sha256:d20588466367f05025bb1efdf4e5d498ca6d14bde07b6928b79199c588800f0a"}, + {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0a2417547462e468edf35b32e3dd06a6215ac26aa6316b41e03b8eeaf9f079ea"}, + {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cf5a0cd974f85a80b74785db2d5c3c1fd6cc09a2ba3c837359b2b5da629ee1b0"}, + {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0452fcbfbce752ba596737a7c5ec5cf76bc5f83847ce1781f4f90eab14ece252"}, + {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578c00f93868f64a4102ecc5aa600a03b49162c654676c3fadc33de2ddb88a81"}, + {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:63dc592a16cd08388d8c4c7502b59ac74190b23e16dfc863c69fe1ea74605b68"}, + {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9b58638d8a85e3a1b32ec0a91d9f8171a877b4b81c408d4cb3257d0dee63e092"}, + {file = "fonttools-4.48.1-cp312-cp312-win32.whl", hash = "sha256:d10979ef14a8beaaa32f613bb698743f7241d92f437a3b5e32356dfb9769c65d"}, + {file = "fonttools-4.48.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdfd7557d1bd294a200bd211aa665ca3b02998dcc18f8211a5532da5b8fad5c5"}, + {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3cdb9a92521b81bf717ebccf592bd0292e853244d84115bfb4db0c426de58348"}, + {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b4ec6d42a7555f5ae35f3b805482f0aad0f1baeeef54859492ea3b782959d4a"}, + {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902e9c4e9928301912f34a6638741b8ae0b64824112b42aaf240e06b735774b1"}, + {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c8b54bd1420c184a995f980f1a8076f87363e2bb24239ef8c171a369d85a31"}, + {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:12ee86abca46193359ea69216b3a724e90c66ab05ab220d39e3fc068c1eb72ac"}, + {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6978bade7b6c0335095bdd0bd97f8f3d590d2877b370f17e03e0865241694eb5"}, + {file = "fonttools-4.48.1-cp38-cp38-win32.whl", hash = "sha256:bcd77f89fc1a6b18428e7a55dde8ef56dae95640293bfb8f4e929929eba5e2a2"}, + {file = "fonttools-4.48.1-cp38-cp38-win_amd64.whl", hash = "sha256:f40441437b039930428e04fb05ac3a132e77458fb57666c808d74a556779e784"}, + {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d2b01428f7da26f229a5656defc824427b741e454b4e210ad2b25ed6ea2aed4"}, + {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:df48798f9a4fc4c315ab46e17873436c8746f5df6eddd02fad91299b2af7af95"}, + {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eb4167bde04e172a93cf22c875d8b0cff76a2491f67f5eb069566215302d45d"}, + {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c900508c46274d32d308ae8e82335117f11aaee1f7d369ac16502c9a78930b0a"}, + {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:594206b31c95fcfa65f484385171fabb4ec69f7d2d7f56d27f17db26b7a31814"}, + {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:292922dc356d7f11f5063b4111a8b719efb8faea92a2a88ed296408d449d8c2e"}, + {file = "fonttools-4.48.1-cp39-cp39-win32.whl", hash = "sha256:4709c5bf123ba10eac210d2d5c9027d3f472591d9f1a04262122710fa3d23199"}, + {file = "fonttools-4.48.1-cp39-cp39-win_amd64.whl", hash = "sha256:63c73b9dd56a94a3cbd2f90544b5fca83666948a9e03370888994143b8d7c070"}, + {file = "fonttools-4.48.1-py3-none-any.whl", hash = "sha256:e3e33862fc5261d46d9aae3544acb36203b1a337d00bdb5d3753aae50dac860e"}, + {file = "fonttools-4.48.1.tar.gz", hash = "sha256:8b8a45254218679c7f1127812761e7854ed5c8e34349aebf581e8c9204e7495a"}, ] [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 = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] [[package]] @@ -944,13 +927,13 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" -version = "4.0.10" +version = "4.0.11" description = "Git Object Database" optional = false python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] @@ -958,30 +941,30 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.40" +version = "3.1.41" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, - {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, + {file = "GitPython-3.1.41-py3-none-any.whl", hash = "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c"}, + {file = "GitPython-3.1.41.tar.gz", hash = "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "sumtypes"] [[package]] name = "griffe" -version = "0.36.7" +version = "0.40.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.36.7-py3-none-any.whl", hash = "sha256:7a09f8e9b97c7ebe227f6529a298bf7e0e742a9837ee261cc8260d50b4aa039f"}, - {file = "griffe-0.36.7.tar.gz", hash = "sha256:a6fe60b16720ca0cf63c9e667a4c05eea40dfe4abcf114741885f945b74c7071"}, + {file = "griffe-0.40.0-py3-none-any.whl", hash = "sha256:db1da6d1d8e08cbb20f1a7dee8c09da940540c2d4c1bfa26a9091cf6fc36a9ec"}, + {file = "griffe-0.40.0.tar.gz", hash = "sha256:76c4439eaa2737af46ae003c331ab6ca79c5365b552f7b5aed263a3b4125735b"}, ] [package.dependencies] @@ -989,31 +972,31 @@ colorama = ">=0.4" [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "7.0.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] @@ -1041,13 +1024,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.25.2" +version = "6.29.2" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.25.2-py3-none-any.whl", hash = "sha256:2e2ee359baba19f10251b99415bb39de1e97d04e1fab385646f24f0596510b77"}, - {file = "ipykernel-6.25.2.tar.gz", hash = "sha256:f468ddd1f17acb48c8ce67fcfa49ba6d46d4f9ac0438c1f441be7c3d1372230b"}, + {file = "ipykernel-6.29.2-py3-none-any.whl", hash = "sha256:50384f5c577a260a1d53f1f59a828c7266d321c9b7d00d345693783f66616055"}, + {file = "ipykernel-6.29.2.tar.gz", hash = "sha256:3bade28004e3ff624ed57974948116670604ac5f676d12339693f3142176d3f0"}, ] [package.dependencies] @@ -1061,7 +1044,7 @@ matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=20" +pyzmq = ">=24" tornado = ">=6.1" traitlets = ">=5.4.0" @@ -1070,80 +1053,74 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (==0.23.4)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.16.1" +version = "8.21.0" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "ipython-8.16.1-py3-none-any.whl", hash = "sha256:0852469d4d579d9cd613c220af7bf0c9cc251813e12be647cb9d463939db9b1e"}, - {file = "ipython-8.16.1.tar.gz", hash = "sha256:ad52f58fca8f9f848e256c629eff888efc0528c12fe0f8ec14f33205f23ef938"}, + {file = "ipython-8.21.0-py3-none-any.whl", hash = "sha256:1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5"}, + {file = "ipython-8.21.0.tar.gz", hash = "sha256:48fbc236fbe0e138b88773fa0437751f14c3645fb483f1d4c5dee58b37e5ce73"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" [package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.23)", "pandas", "pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test = ["pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jaraco-classes" -version = "3.3.0" +version = "3.3.1" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" files = [ - {file = "jaraco.classes-3.3.0-py3-none-any.whl", hash = "sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb"}, - {file = "jaraco.classes-3.3.0.tar.gz", hash = "sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621"}, + {file = "jaraco.classes-3.3.1-py3-none-any.whl", hash = "sha256:86b534de565381f6b3c1c830d13f931d7be1a75f0081c57dff615578676e2206"}, + {file = "jaraco.classes-3.3.1.tar.gz", hash = "sha256:cb28a5ebda8bc47d8c8015307d93163464f9f2b91ab4006e09ff0ce07e8bfb30"}, ] [package.dependencies] more-itertools = "*" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "jedi" @@ -1181,13 +1158,13 @@ trio = ["async_generator", "trio"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -1209,13 +1186,13 @@ files = [ [[package]] name = "jupyter-client" -version = "8.4.0" +version = "8.6.0" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.4.0-py3-none-any.whl", hash = "sha256:6a2a950ec23a8f62f9e4c66acec7f0ea6c7d1f80ba0992e747b10c56ce2e6dbe"}, - {file = "jupyter_client-8.4.0.tar.gz", hash = "sha256:dc1b857d5d7d76ac101766c6e9b646bf18742721126e72e5d484c75a993cada2"}, + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, ] [package.dependencies] @@ -1231,13 +1208,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.4.0" +version = "5.7.1" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.4.0-py3-none-any.whl", hash = "sha256:66e252f675ac04dcf2feb6ed4afb3cd7f68cf92f483607522dc251f32d471571"}, - {file = "jupyter_core-5.4.0.tar.gz", hash = "sha256:e4b98344bb94ee2e3e6c4519a97d001656009f9cb2b7f2baf15b3c205770011d"}, + {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, + {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, ] [package.dependencies] @@ -1246,18 +1223,18 @@ pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_ traitlets = ">=5.3" [package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "keyring" -version = "24.2.0" +version = "24.3.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.8" files = [ - {file = "keyring-24.2.0-py3-none-any.whl", hash = "sha256:4901caaf597bfd3bbd78c9a0c7c4c29fcd8310dab2cffefe749e916b6527acd6"}, - {file = "keyring-24.2.0.tar.gz", hash = "sha256:ca0746a19ec421219f4d713f848fa297a661a8a8c1504867e55bfb5e09091509"}, + {file = "keyring-24.3.0-py3-none-any.whl", hash = "sha256:4446d35d636e6a10b8bce7caa66913dd9eca5fd222ca03a3d42c38608ac30836"}, + {file = "keyring-24.3.0.tar.gz", hash = "sha256:e730ecffd309658a08ee82535a3b5ec4b4c8669a9be11efb66249d8e0aeb9a25"}, ] [package.dependencies] @@ -1268,9 +1245,9 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -completion = ["shtab"] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +completion = ["shtab (>=1.1.0)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "kiwisolver" @@ -1387,59 +1364,75 @@ files = [ [[package]] name = "line-profiler" -version = "4.1.1" +version = "4.1.2" description = "Line-by-line profiler" optional = false python-versions = ">=3.6" files = [ - {file = "line_profiler-4.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a33d728098af1c0d24a7d6cb121bf4627d423fcd6bc6759525df4b1713fcf7cb"}, - {file = "line_profiler-4.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832fb1b2fcec6f466d1b28456ea6bd5208784326202569631100b7281331ca3c"}, - {file = "line_profiler-4.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86851d76cbc3c74c6cb1685cb22802e75b61f8c1d5cf4c1e7c9f3d8c7a032053"}, - {file = "line_profiler-4.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:99991e9af0b94aa41e3bf7745a21ea194076bd18640d63fdd6f2a535aaa030d0"}, - {file = "line_profiler-4.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b0707458ce16be63855c12f42790bef520ec9674a7373cbb2eec28e3c00dffeb"}, - {file = "line_profiler-4.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:1e750b1575e1e8c16da4a045ba4d566eb119a40b0a4ec9c4290cde6f7b2aa292"}, - {file = "line_profiler-4.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c0c4367077cb77187aca50ee79df1e09348d05dbf0a15341f50741101daa3"}, - {file = "line_profiler-4.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14944cf27c355f37e577d5c9a19192d9225766065fc3ea6bfc244ea10f6a4b9b"}, - {file = "line_profiler-4.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c00f4740640aa729fe7118d0dd3c2b96af201c20afcbb5c5f71e1a3cfa10d8"}, - {file = "line_profiler-4.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e9712fcae893ada6217586e3a4d73eaf7a1146596bb9e8152c963413eeb06384"}, - {file = "line_profiler-4.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9f7fec0d06f96e963cc30647f65442e5264f31c80d0f60dcd4a059973bf24281"}, - {file = "line_profiler-4.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:521eae25a5629e30e3f93a1aedfd20e423352316af29ba1805f8a60fe2b8ec37"}, - {file = "line_profiler-4.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d89030daef504e4d329f9405e1aae5e1191d8bb51c2bb75f8842b2b910544521"}, - {file = "line_profiler-4.1.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cbaa08adac1df3b16440ed00b73645cba008355e6e36ffd44f114e91ae554f6"}, - {file = "line_profiler-4.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e6c83a2a5cee7fb3b313141b3be12ff4eb1ba7ec31fb6739ac16a2f45cd001"}, - {file = "line_profiler-4.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e9873556c851423c4ef112d5391b4d51b8e9f57f031d54a64687f36e17d5efd"}, - {file = "line_profiler-4.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b3ed8a4150f7005c477853a97e3d7d36359d0bbdf5992b22cc050eb2b915a9a0"}, - {file = "line_profiler-4.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d231d8ebda1c0daa8b5c9467932a30602855e6cec7d3e8bd1593a3be0f7e4764"}, - {file = "line_profiler-4.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4d3b9026d2ee110a67b696783f5ad6c198d707701d563401a99d0dd386c5339"}, - {file = "line_profiler-4.1.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dea7e688ede3bf1ab85fa71963847472ab5e88ca0d70d46ad5acdd788af584e0"}, - {file = "line_profiler-4.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f67eed9a168293b7ebc5082ec003b4f72c5bd16853a57188d1060e5b6bb2232"}, - {file = "line_profiler-4.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:66288d7b28c65a647186d5127593041f4ffe9e78649bc4fc2b309d74d2ca6c1f"}, - {file = "line_profiler-4.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b987232d30f659591c978a40192e66f3815c9be8300cc927d264af9cd9eb73b8"}, - {file = "line_profiler-4.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7e37b62e47814081e36e33c9aee27c966e22ae4ac05b45515e45e5992d121698"}, - {file = "line_profiler-4.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:93401ea36653105568824becebe21e2a3c0c3e14b671268692b0af979ffa3cda"}, - {file = "line_profiler-4.1.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c0f4953090cb280ea6ab3d1fe1b194c4233deb1ee13ce5dc7701b6351fc244f"}, - {file = "line_profiler-4.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebea1e3a07f5f2925e6acc52007f041f173fe925b4876ce8c8b169620bf04f3"}, - {file = "line_profiler-4.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:508f5b6fd43047b0da2cf746f89b56064f23ac9040a1bdc258323634a1e17789"}, - {file = "line_profiler-4.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d161a6e34a8998cd7b94cd7e59c0501a4c06e32a9b0211125f03cbe7643c8142"}, - {file = "line_profiler-4.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:b432ab2424763103ab01cd7cd38d02de921530b05bc488240be587b29d64fa94"}, - {file = "line_profiler-4.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec5850c0fdcd7d2b55065c4c3fa92578e0d1331d610431f19af99ed056ef53dd"}, - {file = "line_profiler-4.1.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afa938b78de445f418825017732d4d4ff7a04398c02b57b15803e7936dfd0b39"}, - {file = "line_profiler-4.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ada23285e774adfec4088ca8a53565fcd55397d0c2287a03835f9e319785b3e"}, - {file = "line_profiler-4.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:924ab02db0d4572dd5f4945c1e0239ec300003fdce47a8ae1775a72477442d92"}, - {file = "line_profiler-4.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fc9703f7aeff1e445661e3cc5b65f139e5e9a0f0666d0cde173586b841401fda"}, - {file = "line_profiler-4.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:583f3e6282a47f5f1c2aeb1234114f0d49d2eba0bb9c1f05c268d1543fe85794"}, - {file = "line_profiler-4.1.1.tar.gz", hash = "sha256:2fa73d2ac736902e0a6d1e74cf663244218d9c238a7aa5b5acfd6ac6d4672830"}, + {file = "line_profiler-4.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4344c1504ad1a57029a8ab30812d967a0917cad7b654077e8787e4a7d7ea3469"}, + {file = "line_profiler-4.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0720b356db3e9ca297c3260f280c5be3bb4b230eda61ce73b4df5e553418d37a"}, + {file = "line_profiler-4.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:09f742af37166768f92495bd3d3a71da1ba41d3004307a66c108f29ed947d6e1"}, + {file = "line_profiler-4.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:443a5df10eb7910df694340c8a81c1668a88bb59ca44149a3291f7b2ae960891"}, + {file = "line_profiler-4.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a906f9d1687eea7e5b22e3bd367d4b63706fcea1906baaad76b1cc4c1142553d"}, + {file = "line_profiler-4.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3b2c8cc34a776c5cfaa4a4a09a51541efcc9082dce15b19e494000e82576ced"}, + {file = "line_profiler-4.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:55ca0a78eb8d52515486c374ec53fa9e65e3c4128e8bbc909d8bfce267a91fdd"}, + {file = "line_profiler-4.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:f4a11389f06831d7984b63be0743fbbbae1ffb56fad04b4e538d3e6933b5c265"}, + {file = "line_profiler-4.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:32fa07f6fecfd209329559e4ae945dc7bdc0703355c8924bbf19101495b2373f"}, + {file = "line_profiler-4.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6f8e9e8af6660629f214e424613c56a6622cf36d9c638c569c926b21374d7029"}, + {file = "line_profiler-4.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4753113c4e2c30a547937dbc456900d7f3a1b99bc8bc81a640a89306cd729c0f"}, + {file = "line_profiler-4.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f0989302404850a2a041ba60afe6c7240aea10fdd9432d5c1d464aca39a0369"}, + {file = "line_profiler-4.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f4b25ee412b0cd624614edd16c4c0af02dbeb73db2a08a49a14b120005a5630"}, + {file = "line_profiler-4.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93c6a49009ee75dcd8ff644c5fd39eeb8bb672d5a41bacdd239db14ae1ba3098"}, + {file = "line_profiler-4.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b96964cdb306741a01b95d210d634cc79ed70d2904336cbd8f69a9b5f284426d"}, + {file = "line_profiler-4.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:46a8cad2cb4b6a1229ddccf06694b1d01fd5acd1cf8c502caf937765a7c877de"}, + {file = "line_profiler-4.1.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a102fd8e13abd367379e39fd9426fd60e1e3a39fcd80fa25641618969464c022"}, + {file = "line_profiler-4.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44ee51bce974d6b2269492299d4abae6db1b06ae7617760c7436c597dbdbd032"}, + {file = "line_profiler-4.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e4cafd9a1effe1b9646f6a86716dbd291684fde1f8a297930d845d8a9340299"}, + {file = "line_profiler-4.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b433a2918e522d6dd0e6bdcf1216cede15c4f201f7eeb0d816114fbac5031cd7"}, + {file = "line_profiler-4.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad96accb1f5cdedfe2e6607f9be86d28196d3f743229e2b67bd28a40f76f133"}, + {file = "line_profiler-4.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4eb9df035861f7c2e9852773dff72a3324e2e5aebc0b8c7c2ba22437387ef5e7"}, + {file = "line_profiler-4.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e733c0e6626d0e9f1b434da40b93ed1c00ea503f3ced04f5a58c22d1163fe1c1"}, + {file = "line_profiler-4.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:8cc0c24384e29e99da5627669dbf312a23d11138de0169aa58d4ea5187522ba0"}, + {file = "line_profiler-4.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:900ad7be6d609fb1442200c7757de3534b381d6eeac22fa0135c5d0a900b5787"}, + {file = "line_profiler-4.1.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c6c6e19c3c0d7cc8f1641ece9e52fec5e99c56472e26156c16473b7568d374"}, + {file = "line_profiler-4.1.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ed1edd85f9a005a3e1316b3962a5fc42a159257cf2dfd13d10fcbefaece8ce"}, + {file = "line_profiler-4.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:2ed7027f7d1b3ae9a379a2f407f512b84ccf82d6a3a7b53a90bb17ada61928a9"}, + {file = "line_profiler-4.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e8537be16b46133ab86d6e805ca83b012b17ef36a7445dd5c89c45ba70b97aad"}, + {file = "line_profiler-4.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:934870b5e451c938f149c5475cc0286133d8718ba99ff4ec04fb1a87f7bfb985"}, + {file = "line_profiler-4.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbda8e0bb98b1790ba8819d0a72ee3e11e669c79fc703eaf0e5ed747cac2d441"}, + {file = "line_profiler-4.1.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78cfd263c79927f74f174e32b83e4692e26ada2fefcdfef0c1dae5cfabb37a37"}, + {file = "line_profiler-4.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390f5e5dc047a62ffb7dbd236b4d44c6175d4f66aabe654f4b35df9b9aa79d02"}, + {file = "line_profiler-4.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dce014572ee599b2d571cf45fbd0c7d5f1a1e822dabe82581e18dd0229b16799"}, + {file = "line_profiler-4.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4fe92a239d8097a3a0cacb280e0a2455be6633da3c844b784ba011043d090b36"}, + {file = "line_profiler-4.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3df9b30cdd8b3652e658acb38a9533bac47f2b8f5c320c5a03dbdd378ac11b35"}, + {file = "line_profiler-4.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5643cb19c89f6749039452913803a8cfb554c07676f6c00bc96e0632a054abb6"}, + {file = "line_profiler-4.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:163d26586511b68551735052a1bcca173c9d8366573ab4a91c470c7f7bd89967"}, + {file = "line_profiler-4.1.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8fa3128e93e49ad8b5216e40dc9d2bc2e354e896c1512feead3d6db1668ce649"}, + {file = "line_profiler-4.1.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a1eb88cec273300377b364eee9ceffce2e639906bf210e7d7233c88dc87e62f"}, + {file = "line_profiler-4.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7f213eeb846c9bc950fd210dfcd0fa93b1d2991f218b8788c0759f06bd00557"}, + {file = "line_profiler-4.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ec6f137dbbdc0af6b88a1053c1430681c07a3b2d1719dc1f59be70d464851a23"}, + {file = "line_profiler-4.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3af457b2dfad6e2019f7e5bbe9eabac9b2c34824fb2ea574aee7b17998c48c98"}, + {file = "line_profiler-4.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:9dd72adc753019788ff0498dd686068c4d8e65d38c0eca1b4b58b5719c14fa7d"}, + {file = "line_profiler-4.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:62776d67dfc6c358de5c19d606eccbd95e6feb75928064850be0232e9276f751"}, + {file = "line_profiler-4.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:060d71ba11ff5476d7c10774a34955566bab545ab5ff39231306b4d84081725d"}, + {file = "line_profiler-4.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ad13e1d5a174336508bbf275202822c8898cd1f014881059103b748310d5bc84"}, + {file = "line_profiler-4.1.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77824dfc1f58dc7fe62fb053aa54586979ef60fea221dcdbba2022608c1314f"}, + {file = "line_profiler-4.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8ffc44a030789f7bc6594de581b39e8da0591fc6c598dd4243cf140b200528"}, + {file = "line_profiler-4.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4729820d8da3ed92f14e30dbd28a851eeefe2ba70b8b897f2d9c886ade8007c1"}, + {file = "line_profiler-4.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0bce5c04d0daf6dd19348540012b0a6d69206ae40db096de222e6d5f824922e8"}, + {file = "line_profiler-4.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:a65b70d6ecef4f2e61cf504a5c77085718f1dae9508b21c9058ad483ae7e16ee"}, + {file = "line_profiler-4.1.2.tar.gz", hash = "sha256:aa56578b0ff5a756fe180b3fda7bd67c27bbd478b3d0124612d8cf00e4a21df2"}, ] [package.extras] -all = ["Cython (==3.0.0a11)", "Cython (>=0.29.24,<=3.0.0a11)", "IPython (>=7.14.0)", "IPython (>=7.18.0)", "IPython (>=8.12.2)", "IPython (>=8.14.0)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.8.1)", "cmake (>=3.21.2)", "coverage[toml] (>=5.3)", "ninja (>=1.10.2)", "pytest (>=4.6.0)", "pytest (>=4.6.0)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=6.1.2)", "pytest (>=6.2.5)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.9.0)", "pytest-cov (>=3.0.0)", "rich (>=12.3.0)", "scikit-build (>=0.11.1)", "ubelt (>=1.3.3)", "xdoctest (>=1.1.1)"] -all-strict = ["Cython (==0.29.24)", "Cython (==3.0.0a11)", "IPython (==7.14.0)", "IPython (==7.18.0)", "IPython (==8.12.2)", "IPython (==8.14.0)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.8.1)", "cmake (==3.21.2)", "coverage[toml] (==5.3)", "ninja (==1.10.2)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==2.8.1)", "pytest-cov (==2.8.1)", "pytest-cov (==2.9.0)", "pytest-cov (==3.0.0)", "rich (==12.3.0)", "scikit-build (==0.11.1)", "ubelt (==1.3.3)", "xdoctest (==1.1.1)"] +all = ["Cython (>=3.0.3)", "IPython (>=7.14.0)", "IPython (>=7.18.0)", "IPython (>=8.12.2)", "IPython (>=8.14.0)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.8.1)", "cmake (>=3.21.2)", "coverage[toml] (>=5.3)", "ninja (>=1.10.2)", "pytest (>=4.6.0)", "pytest (>=4.6.0)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=6.1.2)", "pytest (>=6.2.5)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.9.0)", "pytest-cov (>=3.0.0)", "rich (>=12.3.0)", "scikit-build (>=0.11.1)", "setuptools (>=41.0.1)", "setuptools (>=68.2.2)", "ubelt (>=1.3.4)", "xdoctest (>=1.1.2)"] +all-strict = ["Cython (==3.0.3)", "IPython (==7.14.0)", "IPython (==7.18.0)", "IPython (==8.12.2)", "IPython (==8.14.0)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.8.1)", "cmake (==3.21.2)", "coverage[toml] (==5.3)", "ninja (==1.10.2)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==2.8.1)", "pytest-cov (==2.8.1)", "pytest-cov (==2.9.0)", "pytest-cov (==3.0.0)", "rich (==12.3.0)", "scikit-build (==0.11.1)", "setuptools (==41.0.1)", "setuptools (==68.2.2)", "ubelt (==1.3.4)", "xdoctest (==1.1.2)"] ipython = ["IPython (>=7.14.0)", "IPython (>=7.18.0)", "IPython (>=8.12.2)", "IPython (>=8.14.0)"] ipython-strict = ["IPython (==7.14.0)", "IPython (==7.18.0)", "IPython (==8.12.2)", "IPython (==8.14.0)"] optional = ["IPython (>=7.14.0)", "IPython (>=7.18.0)", "IPython (>=8.12.2)", "IPython (>=8.14.0)", "rich (>=12.3.0)"] optional-strict = ["IPython (==7.14.0)", "IPython (==7.18.0)", "IPython (==8.12.2)", "IPython (==8.14.0)", "rich (==12.3.0)"] -tests = ["coverage[toml] (>=5.3)", "pytest (>=4.6.0)", "pytest (>=4.6.0)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=6.1.2)", "pytest (>=6.2.5)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.9.0)", "pytest-cov (>=3.0.0)", "ubelt (>=1.3.3)", "xdoctest (>=1.1.1)"] -tests-strict = ["coverage[toml] (==5.3)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==2.8.1)", "pytest-cov (==2.8.1)", "pytest-cov (==2.9.0)", "pytest-cov (==3.0.0)", "ubelt (==1.3.3)", "xdoctest (==1.1.1)"] +tests = ["coverage[toml] (>=5.3)", "pytest (>=4.6.0)", "pytest (>=4.6.0)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=6.1.2)", "pytest (>=6.2.5)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.9.0)", "pytest-cov (>=3.0.0)", "ubelt (>=1.3.4)", "xdoctest (>=1.1.2)"] +tests-strict = ["coverage[toml] (==5.3)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==2.8.1)", "pytest-cov (==2.8.1)", "pytest-cov (==2.9.0)", "pytest-cov (==3.0.0)", "ubelt (==1.3.4)", "xdoctest (==1.1.2)"] [[package]] name = "loguru" @@ -1461,7 +1454,7 @@ dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils [[package]] name = "map-analyzer" -version = "0.1.0" +version = "0.2.0" description = "" optional = false python-versions = ">=3.11,<3.12" @@ -1474,18 +1467,18 @@ numpy = "^1.25.2" [package.source] type = "git" url = "https://github.com/spudde123/SC2MapAnalysis" -reference = "develop" -resolved_reference = "320c6c3454bd9d4a058515da40d2e02633ef9b68" +reference = "HEAD" +resolved_reference = "1e76decb33b9c622f90ef7e91f60ae652b25c8a7" [[package]] name = "markdown" -version = "3.5" +version = "3.5.2" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5-py3-none-any.whl", hash = "sha256:4afb124395ce5fc34e6d9886dab977fd9ae987fc6e85689f08278cf0c69d4bf3"}, - {file = "Markdown-3.5.tar.gz", hash = "sha256:a807eb2e4778d9156c8f07876c6e4d50b5494c5665c4834f67b06459dfd877b3"}, + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, ] [package.extras] @@ -1494,111 +1487,94 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, ] [[package]] name = "matplotlib" -version = "3.8.0" +version = "3.8.2" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c4940bad88a932ddc69734274f6fb047207e008389489f2b6f77d9ca485f0e7a"}, - {file = "matplotlib-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a33bd3045c7452ca1fa65676d88ba940867880e13e2546abb143035fa9072a9d"}, - {file = "matplotlib-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea6886e93401c22e534bbfd39201ce8931b75502895cfb115cbdbbe2d31f287"}, - {file = "matplotlib-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d670b9348e712ec176de225d425f150dc8e37b13010d85233c539b547da0be39"}, - {file = "matplotlib-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7b37b74f00c4cb6af908cb9a00779d97d294e89fd2145ad43f0cdc23f635760c"}, - {file = "matplotlib-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:0e723f5b96f3cd4aad99103dc93e9e3cdc4f18afdcc76951f4857b46f8e39d2d"}, - {file = "matplotlib-3.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5dc945a9cb2deb7d197ba23eb4c210e591d52d77bf0ba27c35fc82dec9fa78d4"}, - {file = "matplotlib-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b5a1bf27d078453aa7b5b27f52580e16360d02df6d3dc9504f3d2ce11f6309"}, - {file = "matplotlib-3.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f25ffb6ad972cdffa7df8e5be4b1e3cadd2f8d43fc72085feb1518006178394"}, - {file = "matplotlib-3.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee482731c8c17d86d9ddb5194d38621f9b0f0d53c99006275a12523ab021732"}, - {file = "matplotlib-3.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36eafe2128772195b373e1242df28d1b7ec6c04c15b090b8d9e335d55a323900"}, - {file = "matplotlib-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:061ee58facb3580cd2d046a6d227fb77e9295599c5ec6ad069f06b5821ad1cfc"}, - {file = "matplotlib-3.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3cc3776836d0f4f22654a7f2d2ec2004618d5cf86b7185318381f73b80fd8a2d"}, - {file = "matplotlib-3.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c49a2bd6981264bddcb8c317b6bd25febcece9e2ebfcbc34e7f4c0c867c09dc"}, - {file = "matplotlib-3.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ed11654fc83cd6cfdf6170b453e437674a050a452133a064d47f2f1371f8d3"}, - {file = "matplotlib-3.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae97fdd6996b3a25da8ee43e3fc734fff502f396801063c6b76c20b56683196"}, - {file = "matplotlib-3.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:87df75f528020a6299f76a1d986c0ed4406e3b2bd44bc5e306e46bca7d45e53e"}, - {file = "matplotlib-3.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:90d74a95fe055f73a6cd737beecc1b81c26f2893b7a3751d52b53ff06ca53f36"}, - {file = "matplotlib-3.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c3499c312f5def8f362a2bf761d04fa2d452b333f3a9a3f58805273719bf20d9"}, - {file = "matplotlib-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31e793c8bd4ea268cc5d3a695c27b30650ec35238626961d73085d5e94b6ab68"}, - {file = "matplotlib-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5ee602ef517a89d1f2c508ca189cfc395dd0b4a08284fb1b97a78eec354644"}, - {file = "matplotlib-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5de39dc61ca35342cf409e031f70f18219f2c48380d3886c1cf5ad9f17898e06"}, - {file = "matplotlib-3.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dd386c80a98b5f51571b9484bf6c6976de383cd2a8cd972b6a9562d85c6d2087"}, - {file = "matplotlib-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f691b4ef47c7384d0936b2e8ebdeb5d526c81d004ad9403dfb9d4c76b9979a93"}, - {file = "matplotlib-3.8.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0b11f354aae62a2aa53ec5bb09946f5f06fc41793e351a04ff60223ea9162955"}, - {file = "matplotlib-3.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f54b9fb87ca5acbcdd0f286021bedc162e1425fa5555ebf3b3dfc167b955ad9"}, - {file = "matplotlib-3.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:60a6e04dfd77c0d3bcfee61c3cd335fff1b917c2f303b32524cd1235e194ef99"}, - {file = "matplotlib-3.8.0.tar.gz", hash = "sha256:df8505e1c19d5c2c26aff3497a7cbd3ccfc2e97043d1e4db3e76afa399164b69"}, + {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, + {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, + {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, + {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, + {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, + {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, + {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, + {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, + {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, + {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, + {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, ] [package.dependencies] contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" -kiwisolver = ">=1.0.1" +kiwisolver = ">=1.3.1" numpy = ">=1.21,<2" packaging = ">=20.0" -pillow = ">=6.2.0" +pillow = ">=8" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=7" [[package]] name = "matplotlib-inline" @@ -1683,13 +1659,13 @@ mkdocs = ">=1.1" [[package]] name = "mkdocs-material" -version = "9.4.6" +version = "9.5.8" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.4.6-py3-none-any.whl", hash = "sha256:78802035d5768a78139c84ad7dce0c6493e8f7dc4861727d36ed91d1520a54da"}, - {file = "mkdocs_material-9.4.6.tar.gz", hash = "sha256:09665e60df7ee9e5ff3a54af173f6d45be718b1ee7dd962bcff3102b81fb0c14"}, + {file = "mkdocs_material-9.5.8-py3-none-any.whl", hash = "sha256:14563314bbf97da4bfafc69053772341babfaeb3329cde01d3e63cec03997af8"}, + {file = "mkdocs_material-9.5.8.tar.gz", hash = "sha256:2a429213e83f84eda7a588e2b186316d806aac602b7f93990042f7a1f3d3cf65"}, ] [package.dependencies] @@ -1697,8 +1673,8 @@ babel = ">=2.10,<3.0" colorama = ">=0.4,<1.0" jinja2 = ">=3.0,<4.0" markdown = ">=3.2,<4.0" -mkdocs = ">=1.5.3,<2.0" -mkdocs-material-extensions = ">=1.2,<2.0" +mkdocs = ">=1.5.3,<1.6.0" +mkdocs-material-extensions = ">=1.3,<2.0" paginate = ">=0.5,<1.0" pygments = ">=2.16,<3.0" pymdown-extensions = ">=10.2,<11.0" @@ -1706,19 +1682,19 @@ regex = ">=2022.4" requests = ">=2.26,<3.0" [package.extras] -git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] -imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] [[package]] name = "mkdocs-material-extensions" -version = "1.3" +version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material_extensions-1.3-py3-none-any.whl", hash = "sha256:0297cc48ba68a9fdd1ef3780a3b41b534b0d0df1d1181a44676fda5f464eeadc"}, - {file = "mkdocs_material_extensions-1.3.tar.gz", hash = "sha256:f0446091503acb110a7cab9349cbc90eeac51b58d1caa92a704a81ca1e24ddbd"}, + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] [[package]] @@ -1748,28 +1724,28 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.7.3" +version = "1.8.0" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings_python-1.7.3-py3-none-any.whl", hash = "sha256:2439d6ad3e34f0bb4c643b845fb3c06ae9233499a1736f9fa273424b75cc5894"}, - {file = "mkdocstrings_python-1.7.3.tar.gz", hash = "sha256:c20128fa96c24dbc6437b10dfedaf33b0415d4503e51ce9ce5e84b271278268e"}, + {file = "mkdocstrings_python-1.8.0-py3-none-any.whl", hash = "sha256:4209970cc90bec194568682a535848a8d8489516c6ed4adbe58bbc67b699ca9d"}, + {file = "mkdocstrings_python-1.8.0.tar.gz", hash = "sha256:1488bddf50ee42c07d9a488dddc197f8e8999c2899687043ec5dd1643d057192"}, ] [package.dependencies] -griffe = ">=0.35" +griffe = ">=0.37" mkdocstrings = ">=0.20" [[package]] name = "more-itertools" -version = "10.1.0" +version = "10.2.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.8" files = [ - {file = "more-itertools-10.1.0.tar.gz", hash = "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a"}, - {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"}, + {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, + {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, ] [[package]] @@ -1784,85 +1760,101 @@ files = [ [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] @@ -1927,79 +1919,83 @@ files = [ [[package]] name = "nest-asyncio" -version = "1.5.8" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] name = "nh3" -version = "0.2.14" -description = "Ammonia HTML sanitizer Python binding" +version = "0.2.15" +description = "Python bindings to the ammonia HTML sanitization library." optional = false python-versions = "*" files = [ - {file = "nh3-0.2.14-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:9be2f68fb9a40d8440cbf34cbf40758aa7f6093160bfc7fb018cce8e424f0c3a"}, - {file = "nh3-0.2.14-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:f99212a81c62b5f22f9e7c3e347aa00491114a5647e1f13bbebd79c3e5f08d75"}, - {file = "nh3-0.2.14-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7771d43222b639a4cd9e341f870cee336b9d886de1ad9bec8dddab22fe1de450"}, - {file = "nh3-0.2.14-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:525846c56c2bcd376f5eaee76063ebf33cf1e620c1498b2a40107f60cfc6054e"}, - {file = "nh3-0.2.14-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e8986f1dd3221d1e741fda0a12eaa4a273f1d80a35e31a1ffe579e7c621d069e"}, - {file = "nh3-0.2.14-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18415df36db9b001f71a42a3a5395db79cf23d556996090d293764436e98e8ad"}, - {file = "nh3-0.2.14-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:377aaf6a9e7c63962f367158d808c6a1344e2b4f83d071c43fbd631b75c4f0b2"}, - {file = "nh3-0.2.14-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0be5c792bd43d0abef8ca39dd8acb3c0611052ce466d0401d51ea0d9aa7525"}, - {file = "nh3-0.2.14-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:93a943cfd3e33bd03f77b97baa11990148687877b74193bf777956b67054dcc6"}, - {file = "nh3-0.2.14-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ac8056e937f264995a82bf0053ca898a1cb1c9efc7cd68fa07fe0060734df7e4"}, - {file = "nh3-0.2.14-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:203cac86e313cf6486704d0ec620a992c8bc164c86d3a4fd3d761dd552d839b5"}, - {file = "nh3-0.2.14-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:5529a3bf99402c34056576d80ae5547123f1078da76aa99e8ed79e44fa67282d"}, - {file = "nh3-0.2.14-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:aed56a86daa43966dd790ba86d4b810b219f75b4bb737461b6886ce2bde38fd6"}, - {file = "nh3-0.2.14-cp37-abi3-win32.whl", hash = "sha256:116c9515937f94f0057ef50ebcbcc10600860065953ba56f14473ff706371873"}, - {file = "nh3-0.2.14-cp37-abi3-win_amd64.whl", hash = "sha256:88c753efbcdfc2644a5012938c6b9753f1c64a5723a67f0301ca43e7b85dcf0e"}, - {file = "nh3-0.2.14.tar.gz", hash = "sha256:a0c509894fd4dccdff557068e5074999ae3b75f4c5a2d6fb5415e782e25679c4"}, + {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9c0d415f6b7f2338f93035bba5c0d8c1b464e538bfbb1d598acd47d7969284f0"}, + {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f42f99f0cf6312e470b6c09e04da31f9abaadcd3eb591d7d1a88ea931dca7f3"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac19c0d68cd42ecd7ead91a3a032fdfff23d29302dbb1311e641a130dfefba97"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0d77272ce6d34db6c87b4f894f037d55183d9518f948bba236fe81e2bb4e28"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8d595df02413aa38586c24811237e95937ef18304e108b7e92c890a06793e3bf"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86e447a63ca0b16318deb62498db4f76fc60699ce0a1231262880b38b6cff911"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3277481293b868b2715907310c7be0f1b9d10491d5adf9fce11756a97e97eddf"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60684857cfa8fdbb74daa867e5cad3f0c9789415aba660614fe16cd66cbb9ec7"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3b803a5875e7234907f7d64777dfde2b93db992376f3d6d7af7f3bc347deb305"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0d02d0ff79dfd8208ed25a39c12cbda092388fff7f1662466e27d97ad011b770"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1e97221cedaf15a54f5243f2c5894bb12ca951ae4ddfd02a9d4ea9df9e1a29d"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5167a6403d19c515217b6bcaaa9be420974a6ac30e0da9e84d4fc67a5d474c5"}, + {file = "nh3-0.2.15-cp37-abi3-win32.whl", hash = "sha256:427fecbb1031db085eaac9931362adf4a796428ef0163070c484b5a768e71601"}, + {file = "nh3-0.2.15-cp37-abi3-win_amd64.whl", hash = "sha256:bc2d086fb540d0fa52ce35afaded4ea526b8fc4d3339f783db55c95de40ef02e"}, + {file = "nh3-0.2.15.tar.gz", hash = "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3"}, ] [[package]] name = "numpy" -version = "1.26.1" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "numpy-1.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af"}, - {file = "numpy-1.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575"}, - {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244"}, - {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67"}, - {file = "numpy-1.26.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2"}, - {file = "numpy-1.26.1-cp310-cp310-win32.whl", hash = "sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297"}, - {file = "numpy-1.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab"}, - {file = "numpy-1.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a"}, - {file = "numpy-1.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9"}, - {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3"}, - {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974"}, - {file = "numpy-1.26.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c"}, - {file = "numpy-1.26.1-cp311-cp311-win32.whl", hash = "sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b"}, - {file = "numpy-1.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53"}, - {file = "numpy-1.26.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f"}, - {file = "numpy-1.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24"}, - {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e"}, - {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124"}, - {file = "numpy-1.26.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c"}, - {file = "numpy-1.26.1-cp312-cp312-win32.whl", hash = "sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66"}, - {file = "numpy-1.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7"}, - {file = "numpy-1.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e"}, - {file = "numpy-1.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617"}, - {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e"}, - {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908"}, - {file = "numpy-1.26.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5"}, - {file = "numpy-1.26.1-cp39-cp39-win32.whl", hash = "sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104"}, - {file = "numpy-1.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f"}, - {file = "numpy-1.26.1.tar.gz", hash = "sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe"}, +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -2040,106 +2036,113 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - [[package]] name = "pillow" -version = "10.1.0" +version = "10.2.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, - {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, - {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, - {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, - {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, - {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, - {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, - {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "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 = "pkginfo" @@ -2157,28 +2160,28 @@ testing = ["pytest", "pytest-cov"] [[package]] name = "platformdirs" -version = "3.11.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -2201,13 +2204,13 @@ psutil = "*" [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -2246,27 +2249,27 @@ files = [ [[package]] name = "psutil" -version = "5.9.6" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -2332,31 +2335,32 @@ files = [ [[package]] name = "pygments" -version = "2.16.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.3" +version = "10.7" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.3-py3-none-any.whl", hash = "sha256:77a82c621c58a83efc49a389159181d570e370fff9f810d3a4766a75fc678b66"}, - {file = "pymdown_extensions-10.3.tar.gz", hash = "sha256:94a0d8a03246712b64698af223848fd80aaf1ae4c4be29c8c61939b0467b5722"}, + {file = "pymdown_extensions-10.7-py3-none-any.whl", hash = "sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c"}, + {file = "pymdown_extensions-10.7.tar.gz", hash = "sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb"}, ] [package.dependencies] -markdown = ">=3.2" +markdown = ">=3.5" pyyaml = "*" [package.extras] @@ -2378,13 +2382,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.4.2" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -2595,104 +2599,104 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "25.1.1" +version = "25.1.2" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, - {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, - {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, - {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, - {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, - {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, - {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, - {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, - {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, - {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, - {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, - {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, ] [package.dependencies] @@ -2719,99 +2723,104 @@ md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "regex" -version = "2023.10.3" +version = "2023.12.25" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.7" files = [ - {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, - {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, - {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, - {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, - {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, - {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, - {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, - {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, - {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, - {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, - {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, - {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, - {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, - {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, - {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, - {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, - {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, - {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, - {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, - {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, - {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, - {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, - {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, - {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, ] [[package]] @@ -2878,92 +2887,107 @@ protobuf = "*" [[package]] name = "scikit-learn" -version = "1.3.1" +version = "1.4.0" description = "A set of python modules for machine learning and data mining" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "scikit-learn-1.3.1.tar.gz", hash = "sha256:1a231cced3ee3fa04756b4a7ab532dc9417acd581a330adff5f2c01ac2831fcf"}, - {file = "scikit_learn-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3153612ff8d36fa4e35ef8b897167119213698ea78f3fd130b4068e6f8d2da5a"}, - {file = "scikit_learn-1.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6bb9490fdb8e7e00f1354621689187bef3cab289c9b869688f805bf724434755"}, - {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7135a03af71138669f19bc96e7d0cc8081aed4b3565cc3b131135d65fc642ba"}, - {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d8dee8c1f40eeba49a85fe378bdf70a07bb64aba1a08fda1e0f48d27edfc3e6"}, - {file = "scikit_learn-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4d379f2b34096105a96bd857b88601dffe7389bd55750f6f29aaa37bc6272eb5"}, - {file = "scikit_learn-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14e8775eba072ab10866a7e0596bc9906873e22c4c370a651223372eb62de180"}, - {file = "scikit_learn-1.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:58b0c2490eff8355dc26e884487bf8edaccf2ba48d09b194fb2f3a026dd64f9d"}, - {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66eddfda9d45dd6cadcd706b65669ce1df84b8549875691b1f403730bdef217"}, - {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6448c37741145b241eeac617028ba6ec2119e1339b1385c9720dae31367f2be"}, - {file = "scikit_learn-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c413c2c850241998168bbb3bd1bb59ff03b1195a53864f0b80ab092071af6028"}, - {file = "scikit_learn-1.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ef540e09873e31569bc8b02c8a9f745ee04d8e1263255a15c9969f6f5caa627f"}, - {file = "scikit_learn-1.3.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9147a3a4df4d401e618713880be023e36109c85d8569b3bf5377e6cd3fecdeac"}, - {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cd3634695ad192bf71645702b3df498bd1e246fc2d529effdb45a06ab028b4"}, - {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c275a06c5190c5ce00af0acbb61c06374087949f643ef32d355ece12c4db043"}, - {file = "scikit_learn-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e1aa8f206d0de814b81b41d60c1ce31f7f2c7354597af38fae46d9c47c45122"}, - {file = "scikit_learn-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:52b77cc08bd555969ec5150788ed50276f5ef83abb72e6f469c5b91a0009bbca"}, - {file = "scikit_learn-1.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a683394bc3f80b7c312c27f9b14ebea7766b1f0a34faf1a2e9158d80e860ec26"}, - {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15d964d9eb181c79c190d3dbc2fff7338786bf017e9039571418a1d53dab236"}, - {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ce9233cdf0cdcf0858a5849d306490bf6de71fa7603a3835124e386e62f2311"}, - {file = "scikit_learn-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:1ec668ce003a5b3d12d020d2cde0abd64b262ac5f098b5c84cf9657deb9996a8"}, - {file = "scikit_learn-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccbbedae99325628c1d1cbe3916b7ef58a1ce949672d8d39c8b190e10219fd32"}, - {file = "scikit_learn-1.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:845f81c7ceb4ea6bac64ab1c9f2ce8bef0a84d0f21f3bece2126adcc213dfecd"}, - {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8454d57a22d856f1fbf3091bd86f9ebd4bff89088819886dc0c72f47a6c30652"}, - {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d993fb70a1d78c9798b8f2f28705bfbfcd546b661f9e2e67aa85f81052b9c53"}, - {file = "scikit_learn-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f7bb1fec37d65f4ef85953e1df5d3c98a0f0141d394dcdaead5a6de9170347"}, + {file = "scikit-learn-1.4.0.tar.gz", hash = "sha256:d4373c984eba20e393216edd51a3e3eede56cbe93d4247516d205643c3b93121"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fce93a7473e2f4ee4cc280210968288d6a7d7ad8dc6fa7bb7892145e407085f9"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d77df3d1e15fc37a9329999979fa7868ba8655dbab21fe97fc7ddabac9e08cc7"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404659fedec40eeafa310cd14d613e564d13dbf8f3c752d31c095195ec05de6"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e98632da8f6410e6fb6bf66937712c949b4010600ccd3f22a5388a83e610cc3c"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-win_amd64.whl", hash = "sha256:11b3b140f70fbc9f6a08884631ae8dd60a4bb2d7d6d1de92738ea42b740d8992"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8341eabdc754d5ab91641a7763243845e96b6d68e03e472531e88a4f1b09f21"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d1f6bce875ac2bb6b52514f67c185c564ccd299a05b65b7bab091a4c13dde12d"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c408b46b2fd61952d519ea1af2f8f0a7a703e1433923ab1704c4131520b2083b"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b465dd1dcd237b7b1dcd1a9048ccbf70a98c659474324fa708464c3a2533fad"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-win_amd64.whl", hash = "sha256:0db8e22c42f7980fe5eb22069b1f84c48966f3e0d23a01afde5999e3987a2501"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7eef6ea2ed289af40e88c0be9f7704ca8b5de18508a06897c3fe21e0905efdf"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:349669b01435bc4dbf25c6410b0892073befdaec52637d1a1d1ff53865dc8db3"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d439c584e58434d0350701bd33f6c10b309e851fccaf41c121aed55f6851d8cf"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e2427d9ef46477625ab9b55c1882844fe6fc500f418c3f8e650200182457bc"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-win_amd64.whl", hash = "sha256:d3d75343940e7bf9b85c830c93d34039fa015eeb341c5c0b4cd7a90dadfe00d4"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:76986d22e884ab062b1beecdd92379656e9d3789ecc1f9870923c178de55f9fe"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e22446ad89f1cb7657f0d849dcdc345b48e2d10afa3daf2925fdb740f85b714c"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74812c9eabb265be69d738a8ea8d4884917a59637fcbf88a5f0e9020498bc6b3"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad2a63e0dd386b92da3270887a29b308af4d7c750d8c4995dfd9a4798691bcc"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-win_amd64.whl", hash = "sha256:53b9e29177897c37e2ff9d4ba6ca12fdb156e22523e463db05def303f5c72b5c"}, + {file = "scikit_learn-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb8f044a8f5962613ce1feb4351d66f8d784bd072d36393582f351859b065f7d"}, + {file = "scikit_learn-1.4.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a6372c90bbf302387792108379f1ec77719c1618d88496d0df30cb8e370b4661"}, + {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:785ce3c352bf697adfda357c3922c94517a9376002971bc5ea50896144bc8916"}, + {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0aba2a20d89936d6e72d95d05e3bf1db55bca5c5920926ad7b92c34f5e7d3bbe"}, + {file = "scikit_learn-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2bac5d56b992f8f06816f2cd321eb86071c6f6d44bb4b1cb3d626525820d754b"}, + {file = "scikit_learn-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27ae4b0f1b2c77107c096a7e05b33458354107b47775428d1f11b23e30a73e8a"}, + {file = "scikit_learn-1.4.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5c5c62ffb52c3ffb755eb21fa74cc2cbf2c521bd53f5c04eaa10011dbecf5f80"}, + {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f0d2018ac6fa055dab65fe8a485967990d33c672d55bc254c56c35287b02fab"}, + {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a8918c415c4b4bf1d60c38d32958849a9191c2428ab35d30b78354085c7c7a"}, + {file = "scikit_learn-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:80a21de63275f8bcd7877b3e781679d2ff1eddfed515a599f95b2502a3283d42"}, + {file = "scikit_learn-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0f33bbafb310c26b81c4d41ecaebdbc1f63498a3f13461d50ed9a2e8f24d28e4"}, + {file = "scikit_learn-1.4.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:8b6ac1442ec714b4911e5aef8afd82c691b5c88b525ea58299d455acc4e8dcec"}, + {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05fc5915b716c6cc60a438c250108e9a9445b522975ed37e416d5ea4f9a63381"}, + {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:842b7d6989f3c574685e18da6f91223eb32301d0f93903dd399894250835a6f7"}, + {file = "scikit_learn-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:88bcb586fdff865372df1bc6be88bb7e6f9e0aa080dab9f54f5cac7eca8e2b6b"}, + {file = "scikit_learn-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f77674647dd31f56cb12ed13ed25b6ed43a056fffef051715022d2ebffd7a7d1"}, + {file = "scikit_learn-1.4.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:833999872e2920ce00f3a50839946bdac7539454e200eb6db54898a41f4bfd43"}, + {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:970ec697accaef10fb4f51763f3a7b1250f9f0553cf05514d0e94905322a0172"}, + {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923d778f378ebacca2c672ab1740e5a413e437fb45ab45ab02578f8b689e5d43"}, + {file = "scikit_learn-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d041bc95006b545b59e458399e3175ab11ca7a03dc9a74a573ac891f5df1489"}, ] [package.dependencies] -joblib = ">=1.1.1" -numpy = ">=1.17.3,<2.0" -scipy = ">=1.5.0" +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" threadpoolctl = ">=2.0.0" [package.extras] -benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] +benchmark = ["matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "pandas (>=1.1.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.19.12)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" -version = "1.11.3" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "scipy-1.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:370f569c57e1d888304052c18e58f4a927338eafdaef78613c685ca2ea0d1fa0"}, - {file = "scipy-1.11.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:9885e3e4f13b2bd44aaf2a1a6390a11add9f48d5295f7a592393ceb8991577a3"}, - {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04aa19acc324a1a076abb4035dabe9b64badb19f76ad9c798bde39d41025cdc"}, - {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1a8a4657673bfae1e05e1e1d6e94b0cabe5ed0c7c144c8aa7b7dbb774ce5c1"}, - {file = "scipy-1.11.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7abda0e62ef00cde826d441485e2e32fe737bdddee3324e35c0e01dee65e2a88"}, - {file = "scipy-1.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:033c3fd95d55012dd1148b201b72ae854d5086d25e7c316ec9850de4fe776929"}, - {file = "scipy-1.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:925c6f09d0053b1c0f90b2d92d03b261e889b20d1c9b08a3a51f61afc5f58165"}, - {file = "scipy-1.11.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5664e364f90be8219283eeb844323ff8cd79d7acbd64e15eb9c46b9bc7f6a42a"}, - {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f325434b6424952fbb636506f0567898dca7b0f7654d48f1c382ea338ce9a3"}, - {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f290cf561a4b4edfe8d1001ee4be6da60c1c4ea712985b58bf6bc62badee221"}, - {file = "scipy-1.11.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:91770cb3b1e81ae19463b3c235bf1e0e330767dca9eb4cd73ba3ded6c4151e4d"}, - {file = "scipy-1.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1f97cd89c0fe1a0685f8f89d85fa305deb3067d0668151571ba50913e445820"}, - {file = "scipy-1.11.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dfcc1552add7cb7c13fb70efcb2389d0624d571aaf2c80b04117e2755a0c5d15"}, - {file = "scipy-1.11.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0d3a136ae1ff0883fffbb1b05b0b2fea251cb1046a5077d0b435a1839b3e52b7"}, - {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae66a2d7d5768eaa33008fa5a974389f167183c87bf39160d3fefe6664f8ddc"}, - {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2f6dee6cbb0e263b8142ed587bc93e3ed5e777f1f75448d24fb923d9fd4dce6"}, - {file = "scipy-1.11.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:74e89dc5e00201e71dd94f5f382ab1c6a9f3ff806c7d24e4e90928bb1aafb280"}, - {file = "scipy-1.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:90271dbde4be191522b3903fc97334e3956d7cfb9cce3f0718d0ab4fd7d8bfd6"}, - {file = "scipy-1.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a63d1ec9cadecce838467ce0631c17c15c7197ae61e49429434ba01d618caa83"}, - {file = "scipy-1.11.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:5305792c7110e32ff155aed0df46aa60a60fc6e52cd4ee02cdeb67eaccd5356e"}, - {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea7f579182d83d00fed0e5c11a4aa5ffe01460444219dedc448a36adf0c3917"}, - {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c77da50c9a91e23beb63c2a711ef9e9ca9a2060442757dffee34ea41847d8156"}, - {file = "scipy-1.11.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15f237e890c24aef6891c7d008f9ff7e758c6ef39a2b5df264650eb7900403c0"}, - {file = "scipy-1.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:4b4bb134c7aa457e26cc6ea482b016fef45db71417d55cc6d8f43d799cdf9ef2"}, - {file = "scipy-1.11.3.tar.gz", hash = "sha256:bba4d955f54edd61899776bad459bf7326e14b9fa1c552181f0479cc60a568cd"}, +python-versions = ">=3.9" +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "secretstorage" @@ -2991,43 +3015,6 @@ files = [ {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] -[[package]] -name = "setuptools" -version = "68.2.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "setuptools-scm" -version = "8.0.4" -description = "the blessed package to manage your versions by scm tags" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-scm-8.0.4.tar.gz", hash = "sha256:b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7"}, - {file = "setuptools_scm-8.0.4-py3-none-any.whl", hash = "sha256:b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f"}, -] - -[package.dependencies] -packaging = ">=20" -setuptools = "*" -typing-extensions = "*" - -[package.extras] -docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] -rich = ["rich"] -test = ["build", "pytest", "rich", "wheel"] - [[package]] name = "six" version = "1.16.0" @@ -3082,33 +3069,33 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.1" +version = "0.12.3" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, - {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, ] [[package]] name = "tornado" -version = "6.3.3" +version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] [[package]] @@ -3133,18 +3120,18 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.11.2" +version = "5.14.1" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.11.2-py3-none-any.whl", hash = "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae"}, - {file = "traitlets-5.11.2.tar.gz", hash = "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e"}, + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "twine" @@ -3171,66 +3158,68 @@ urllib3 = ">=1.26.0" [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] name = "urllib3" -version = "2.0.7" +version = "2.2.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, + {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, + {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "3.0.0" +version = "4.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, - {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, - {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, - {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, - {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, - {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, - {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, - {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, - {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, ] [package.extras] @@ -3238,24 +3227,24 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.8" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, - {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] name = "wheel" -version = "0.41.2" +version = "0.42.0" description = "A built-package format for Python" optional = false python-versions = ">=3.7" files = [ - {file = "wheel-0.41.2-py3-none-any.whl", hash = "sha256:75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8"}, - {file = "wheel-0.41.2.tar.gz", hash = "sha256:0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985"}, + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, ] [package.extras] @@ -3277,85 +3266,101 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [[package]] name = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -3380,4 +3385,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.11, <3.12" -content-hash = "524075dee11ef2ee4a5cbeac274616bed8f3dcd68ad49adb3a34bfbb90e574a2" +content-hash = "7c26bf680081812e13b6d035a3aedff55bb77cc1e23c9d03330b03dc678fe3b7" diff --git a/pyproject.toml b/pyproject.toml index bcff465..cb090c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,10 +13,10 @@ license = "MIT" python = ">=3.11, <3.12" burnysc2 = { git = "https://github.com/august-k/python-sc2", branch = "develop" } PyYAML = "6.0" -cython = "^0.29.33" tqdm = "^4.64.1" scikit-learn = "^1.2.2" -map-analyzer = { git = "https://github.com/spudde123/SC2MapAnalysis", branch = "develop" } +map-analyzer = { git = "https://github.com/spudde123/SC2MapAnalysis" } +cython-extensions-sc2 = "^0.3.1" [tool.poetry.group.docs] @@ -59,10 +59,6 @@ line-profiler = "^4.0.3" requires = ["poetry-core", "Cython", "numpy", "setuptools"] build-backend = "poetry.core.masonry.api" -[tool.poetry.build] -generate-setup-file = false -script = 'build.py' - [tool.coverage.report] exclude_lines = [ 'if __name__ == "__main__":' diff --git a/src/ares/behaviors/combat/group/a_move_group.py b/src/ares/behaviors/combat/group/a_move_group.py index 571018f..ad6e913 100644 --- a/src/ares/behaviors/combat/group/a_move_group.py +++ b/src/ares/behaviors/combat/group/a_move_group.py @@ -1,12 +1,12 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Union +from cython_extensions import cy_sorted_by_distance_to from sc2.ids.ability_id import AbilityId from sc2.position import Point2 from sc2.unit import Unit from ares.behaviors.combat.group.combat_group_behavior import CombatGroupBehavior -from ares.cython_extensions.units_utils import cy_sorted_by_distance_to from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: diff --git a/src/ares/behaviors/combat/group/combat_group_behavior.py b/src/ares/behaviors/combat/group/combat_group_behavior.py index 4694143..44dddab 100644 --- a/src/ares/behaviors/combat/group/combat_group_behavior.py +++ b/src/ares/behaviors/combat/group/combat_group_behavior.py @@ -1,11 +1,11 @@ from typing import TYPE_CHECKING, Protocol, Union +from cython_extensions import cy_distance_to_squared from sc2.ids.ability_id import AbilityId from sc2.position import Point2 from sc2.unit import Unit from ares.behaviors.behavior import Behavior -from ares.cython_extensions.geometry import cy_distance_to from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: @@ -39,9 +39,12 @@ def duplicate_or_similar_order( unit: Unit, target: Union[Point2, Unit], order_type: AbilityId, - distance_check: float = 0.75, + distance_check_squared: float = 0.75, ) -> bool: - if cy_distance_to(unit.position, target.position) < distance_check: + if ( + cy_distance_to_squared(unit.position, target.position) + < distance_check_squared + ): return True if order_target := unit.order_target: diff --git a/src/ares/behaviors/combat/group/path_group_to_target.py b/src/ares/behaviors/combat/group/path_group_to_target.py index 1faf637..a4dd827 100644 --- a/src/ares/behaviors/combat/group/path_group_to_target.py +++ b/src/ares/behaviors/combat/group/path_group_to_target.py @@ -2,13 +2,12 @@ from typing import TYPE_CHECKING import numpy as np +from cython_extensions import cy_closest_to, cy_distance_to from sc2.ids.ability_id import AbilityId from sc2.position import Point2 from sc2.unit import Unit from ares.behaviors.combat.group.combat_group_behavior import CombatGroupBehavior -from ares.cython_extensions.geometry import cy_distance_to -from ares.cython_extensions.units_utils import cy_closest_to from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: @@ -71,7 +70,7 @@ class PathGroupToTarget(CombatGroupBehavior): group_tags: set[int] grid: np.ndarray target: Point2 - distance_check: float = 2.5 + distance_check_squared: float = 26.25 success_at_distance: float = 0.0 sensitivity: int = 12 smoothing: bool = False @@ -104,7 +103,10 @@ def execute(self, ai: "AresBot", config: dict, mediator: ManagerMediator) -> boo sample_unit: Unit = cy_closest_to(self.start, self.group) if sample_unit and self.duplicate_or_similar_order( - sample_unit, move_to, AbilityId.MOVE, distance_check=self.distance_check + sample_unit, + move_to, + AbilityId.MOVE, + distance_check_squared=self.distance_check_squared, ): return False diff --git a/src/ares/behaviors/combat/group/stutter_group_back.py b/src/ares/behaviors/combat/group/stutter_group_back.py index 374a3e9..f2ea9d6 100644 --- a/src/ares/behaviors/combat/group/stutter_group_back.py +++ b/src/ares/behaviors/combat/group/stutter_group_back.py @@ -2,12 +2,12 @@ from typing import TYPE_CHECKING, Union import numpy as np +from cython_extensions import cy_sorted_by_distance_to from sc2.ids.ability_id import AbilityId from sc2.position import Point2 from sc2.unit import Unit from ares.behaviors.combat.group.combat_group_behavior import CombatGroupBehavior -from ares.cython_extensions.units_utils import cy_sorted_by_distance_to from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: diff --git a/src/ares/behaviors/combat/group/stutter_group_forward.py b/src/ares/behaviors/combat/group/stutter_group_forward.py index 9464803..acaa6f8 100644 --- a/src/ares/behaviors/combat/group/stutter_group_forward.py +++ b/src/ares/behaviors/combat/group/stutter_group_forward.py @@ -1,16 +1,13 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Union +from cython_extensions import cy_in_attack_range, cy_sorted_by_distance_to from sc2.ids.ability_id import AbilityId from sc2.position import Point2 from sc2.unit import Unit from sc2.units import Units from ares.behaviors.combat.group.combat_group_behavior import CombatGroupBehavior -from ares.cython_extensions.units_utils import ( - cy_in_attack_range, - cy_sorted_by_distance_to, -) from ares.managers.manager_mediator import ManagerMediator from src.ares.consts import UnitTreeQueryType diff --git a/src/ares/behaviors/combat/individual/path_unit_to_target.py b/src/ares/behaviors/combat/individual/path_unit_to_target.py index 6db449a..655a779 100644 --- a/src/ares/behaviors/combat/individual/path_unit_to_target.py +++ b/src/ares/behaviors/combat/individual/path_unit_to_target.py @@ -2,13 +2,13 @@ from typing import TYPE_CHECKING import numpy as np +from cython_extensions import cy_distance_to from sc2.position import Point2 from sc2.unit import Unit from ares.behaviors.combat.individual.combat_individual_behavior import ( CombatIndividualBehavior, ) -from ares.cython_extensions.geometry import cy_distance_to from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: diff --git a/src/ares/behaviors/combat/individual/pick_up_cargo.py b/src/ares/behaviors/combat/individual/pick_up_cargo.py index 1ecfe66..f36a71f 100644 --- a/src/ares/behaviors/combat/individual/pick_up_cargo.py +++ b/src/ares/behaviors/combat/individual/pick_up_cargo.py @@ -2,6 +2,7 @@ from typing import TYPE_CHECKING, Optional, Union import numpy as np +from cython_extensions import cy_closest_to, cy_distance_to from sc2.ids.ability_id import AbilityId from sc2.position import Point2 from sc2.unit import Unit @@ -11,8 +12,6 @@ CombatIndividualBehavior, ) from ares.consts import UnitRole -from ares.cython_extensions.geometry import cy_distance_to -from ares.cython_extensions.units_utils import cy_closest_to from ares.dicts.pickup_range import PICKUP_RANGE from ares.managers.manager_mediator import ManagerMediator diff --git a/src/ares/behaviors/combat/individual/shoot_target_in_range.py b/src/ares/behaviors/combat/individual/shoot_target_in_range.py index 268a3ee..2b16fb8 100644 --- a/src/ares/behaviors/combat/individual/shoot_target_in_range.py +++ b/src/ares/behaviors/combat/individual/shoot_target_in_range.py @@ -1,14 +1,13 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Union +from cython_extensions import cy_attack_ready, cy_in_attack_range, cy_pick_enemy_target from sc2.unit import Unit from sc2.units import Units from ares.behaviors.combat.individual.combat_individual_behavior import ( CombatIndividualBehavior, ) -from ares.cython_extensions.combat_utils import cy_attack_ready, cy_pick_enemy_target -from ares.cython_extensions.units_utils import cy_in_attack_range from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: diff --git a/src/ares/behaviors/combat/individual/stutter_unit_back.py b/src/ares/behaviors/combat/individual/stutter_unit_back.py index b8cbf7c..4ed27f6 100644 --- a/src/ares/behaviors/combat/individual/stutter_unit_back.py +++ b/src/ares/behaviors/combat/individual/stutter_unit_back.py @@ -2,6 +2,7 @@ from typing import TYPE_CHECKING, Optional import numpy as np +from cython_extensions import cy_attack_ready from loguru import logger from sc2.unit import Unit @@ -9,7 +10,6 @@ from ares.behaviors.combat.individual.combat_individual_behavior import ( CombatIndividualBehavior, ) -from ares.cython_extensions.combat_utils import cy_attack_ready from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: diff --git a/src/ares/behaviors/combat/individual/stutter_unit_forward.py b/src/ares/behaviors/combat/individual/stutter_unit_forward.py index 86eaff6..b6c06e8 100644 --- a/src/ares/behaviors/combat/individual/stutter_unit_forward.py +++ b/src/ares/behaviors/combat/individual/stutter_unit_forward.py @@ -1,13 +1,13 @@ from dataclasses import dataclass from typing import TYPE_CHECKING +from cython_extensions import cy_attack_ready from sc2.unit import Unit from ares.behaviors.combat.individual import AttackTarget from ares.behaviors.combat.individual.combat_individual_behavior import ( CombatIndividualBehavior, ) -from ares.cython_extensions.combat_utils import cy_attack_ready from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: diff --git a/src/ares/behaviors/combat/individual/worker_kite_back.py b/src/ares/behaviors/combat/individual/worker_kite_back.py index 6bb7800..de86f77 100644 --- a/src/ares/behaviors/combat/individual/worker_kite_back.py +++ b/src/ares/behaviors/combat/individual/worker_kite_back.py @@ -1,14 +1,13 @@ from dataclasses import dataclass from typing import TYPE_CHECKING +from cython_extensions import cy_attack_ready, cy_closest_to from sc2.unit import Unit from ares.behaviors.combat.individual import AttackTarget from ares.behaviors.combat.individual.combat_individual_behavior import ( CombatIndividualBehavior, ) -from ares.cython_extensions.combat_utils import cy_attack_ready -from ares.cython_extensions.units_utils import cy_closest_to from ares.managers.manager_mediator import ManagerMediator if TYPE_CHECKING: diff --git a/src/ares/behaviors/macro/addon_swap.py b/src/ares/behaviors/macro/addon_swap.py index 3880379..437b7b7 100644 --- a/src/ares/behaviors/macro/addon_swap.py +++ b/src/ares/behaviors/macro/addon_swap.py @@ -7,8 +7,10 @@ if TYPE_CHECKING: from ares import AresBot + +from cython_extensions import cy_sorted_by_distance_to + from ares.behaviors.macro.macro_behavior import MacroBehavior -from ares.cython_extensions.units_utils import cy_sorted_by_distance_to from ares.managers.manager_mediator import ManagerMediator ADDON_TYPES: set[UnitID] = {UnitID.TECHLAB, UnitID.REACTOR} diff --git a/src/ares/behaviors/macro/auto_supply.py b/src/ares/behaviors/macro/auto_supply.py index bf849b2..75f1013 100644 --- a/src/ares/behaviors/macro/auto_supply.py +++ b/src/ares/behaviors/macro/auto_supply.py @@ -8,10 +8,12 @@ if TYPE_CHECKING: from ares import AresBot + +from cython_extensions import cy_unit_pending + from ares.behaviors.macro.build_structure import BuildStructure from ares.behaviors.macro.macro_behavior import MacroBehavior from ares.consts import ALL_PRODUCTION_STRUCTURES, RACE_SUPPLY -from ares.cython_extensions.general_utils import cy_unit_pending from ares.managers.manager_mediator import ManagerMediator diff --git a/src/ares/behaviors/macro/mining.py b/src/ares/behaviors/macro/mining.py index b9ff962..6c7797a 100644 --- a/src/ares/behaviors/macro/mining.py +++ b/src/ares/behaviors/macro/mining.py @@ -12,11 +12,18 @@ if TYPE_CHECKING: from ares import AresBot +from cython_extensions import ( + cy_attack_ready, + cy_closest_to, + cy_distance_to, + cy_distance_to_squared, + cy_in_attack_range, + cy_pick_enemy_target, + cy_towards, +) + from ares.behaviors.macro import MacroBehavior from ares.consts import MINING, TOWNHALL_DISTANCE_FACTOR, UnitRole, UnitTreeQueryType -from ares.cython_extensions.combat_utils import cy_attack_ready, cy_pick_enemy_target -from ares.cython_extensions.geometry import cy_distance_to, cy_towards -from ares.cython_extensions.units_utils import cy_closest_to, cy_in_attack_range from ares.managers.manager_mediator import ManagerMediator TOWNHALL_RADIUS: float = 2.75 @@ -276,7 +283,7 @@ def _do_standard_mining(self, ai: "AresBot", worker: Unit, resource: Unit) -> No else: # work out when we need to issue command to mine resource if worker.is_idle or ( - worker.distance_to(resource) > 9.0 + cy_distance_to_squared(worker.position, resource.position) > 81.0 and worker.order_target and worker.order_target != resource ): @@ -372,7 +379,8 @@ def _long_distance_mining( grid=grid, position=worker_position, ) - and cy_distance_to(worker_position, target_mineral_position) > 5 + and cy_distance_to_squared(worker_position, target_mineral_position) + > 25.0 ): move_to: Point2 = mediator.find_path_next_point( start=worker_position, @@ -393,7 +401,7 @@ def _long_distance_mining( return_base_position: Point2 = return_base.position if ( not mediator.is_position_safe(grid=grid, position=worker_position) - and cy_distance_to(worker_position, return_base_position) > 8 + and cy_distance_to_squared(worker_position, return_base_position) > 64.0 ): move_to: Point2 = mediator.find_path_next_point( start=worker_position, @@ -493,7 +501,7 @@ def _do_mining_boost( ) ) - if 0.75 < cy_distance_to(worker_position, target_pos) < 2: + if 0.5625 < cy_distance_to_squared(worker_position, target_pos) < 4.0: worker.move(target_pos) worker(AbilityId.SMART, townhall, True) # not at right distance to get boost command, but doesn't have return @@ -502,11 +510,11 @@ def _do_mining_boost( worker(AbilityId.SMART, townhall) elif not worker.is_returning and len(worker.orders) < 2: - min_distance: float = 0.75 if target.is_mineral_field else 0.1 - max_distance: float = 2.0 if target.is_mineral_field else 0.5 + min_distance: float = 0.5625 if target.is_mineral_field else 0.01 + max_distance: float = 4.0 if target.is_mineral_field else 0.25 if ( min_distance - < cy_distance_to(worker_position, resource_target_pos) + < cy_distance_to_squared(worker_position, resource_target_pos) < max_distance or worker.is_idle ): diff --git a/src/ares/behaviors/macro/production_controller.py b/src/ares/behaviors/macro/production_controller.py index e71b2a3..d8e3789 100644 --- a/src/ares/behaviors/macro/production_controller.py +++ b/src/ares/behaviors/macro/production_controller.py @@ -1,6 +1,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING +from cython_extensions import cy_distance_to_squared from loguru import logger from sc2.data import Race from sc2.dicts.unit_trained_from import UNIT_TRAINED_FROM @@ -10,7 +11,6 @@ from sc2.units import Units from ares.consts import ADD_ONS, ID, TARGET, TECHLAB_TYPES -from ares.cython_extensions.geometry import cy_distance_to from ares.dicts.unit_tech_requirement import UNIT_TECH_REQUIREMENT if TYPE_CHECKING: @@ -237,7 +237,7 @@ def _not_started_but_in_building_tracker( target: Point2 = building_tracker[tag][TARGET] if not ai.structures.filter( - lambda s: cy_distance_to(s.position, target.position) < 1.0 + lambda s: cy_distance_to_squared(s.position, target.position) < 1.0 ): return True diff --git a/src/ares/behaviors/maneuver_recipes/ranged_micro_recipes.py b/src/ares/behaviors/maneuver_recipes/ranged_micro_recipes.py index f200dd3..099b14b 100644 --- a/src/ares/behaviors/maneuver_recipes/ranged_micro_recipes.py +++ b/src/ares/behaviors/maneuver_recipes/ranged_micro_recipes.py @@ -1,6 +1,7 @@ from dataclasses import dataclass import numpy as np +from cython_extensions import cy_distance_to from sc2.position import Point2 from sc2.unit import Unit @@ -11,7 +12,6 @@ PathUnitToTarget, ShootTargetInRange, ) -from ares.cython_extensions.geometry import cy_distance_to @dataclass diff --git a/src/ares/custom_bot_ai.py b/src/ares/custom_bot_ai.py index 02d17f6..3e0aa90 100644 --- a/src/ares/custom_bot_ai.py +++ b/src/ares/custom_bot_ai.py @@ -3,6 +3,7 @@ """ from typing import Dict, List, Optional, Tuple, Union +from cython_extensions import cy_distance_to_squared from loguru import logger from s2clientprotocol import raw_pb2 as raw_pb from s2clientprotocol import sc2api_pb2 as sc_pb @@ -16,7 +17,6 @@ from sc2.units import Units from ares.consts import ALL_STRUCTURES -from ares.cython_extensions.geometry import cy_distance_to from ares.dicts.unit_data import UNIT_DATA from ares.dicts.unit_tech_requirement import UNIT_TECH_REQUIREMENT @@ -283,8 +283,9 @@ def get_enemy_proxies( distance: float, from_position: Point2, ) -> list[Unit]: + dist: float = distance**2 return [ s for s in self.enemy_structures - if cy_distance_to(s.position, from_position) < distance + if cy_distance_to_squared(s.position, from_position) < dist ] diff --git a/src/ares/cython_extensions/__init__.py b/src/ares/cython_extensions/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/ares/cython_extensions/combat_utils.pyx b/src/ares/cython_extensions/combat_utils.pyx deleted file mode 100644 index 93e845c..0000000 --- a/src/ares/cython_extensions/combat_utils.pyx +++ /dev/null @@ -1,150 +0,0 @@ -import numpy as np - -cimport numpy as cnp -from cython cimport boundscheck, wraparound -from libc.math cimport atan2, fabs, pi - -from ares.cython_extensions.geometry import cy_distance_to -from ares.dicts.turn_rate import TURN_RATE -from ares.dicts.unit_data import UNIT_DATA - -UNIT_DATA_INT_KEYS = {k.value: v for k, v in UNIT_DATA.items()} -TURN_RATE_INT_KEYS = {k.value: v for k, v in TURN_RATE.items()} - -# `cdef` functions only for internal use, change to `cpdef` if -# needed elsewhere -cdef double angle_to((float, float) from_pos, (float, float) to_pos): - """Angle from point to other point in radians""" - return atan2(to_pos[1] - from_pos[1], to_pos[0] - to_pos[0]) - -cdef double angle_diff(double a, double b): - """Absolute angle difference between 2 angles""" - if a < 0: - a += pi * 2 - if b < 0: - b += pi * 2 - return fabs(a - b) - -cdef double get_turn_speed(unit, unsigned int unit_type_int): - """Returns turn speed of unit in radians""" - cdef double turn_rate - - turn_rate = TURN_RATE_INT_KEYS.get(unit_type_int, None) - if turn_rate: - return turn_rate * 1.4 * pi / 180 - -cdef double range_vs_target(unit, target): - """Get the range of a unit to a target.""" - if unit.can_attack_air and target.is_flying: - return unit.air_range - else: - return unit.ground_range - -""" -End of `cdef` functions -""" - -cpdef bint cy_is_facing(unit, other_unit, double angle_error=0.05): - cdef: - (double, double) p1 = unit.position - (double, double) p2 = other_unit.position - double angle, angle_difference - double unit_facing = unit.facing - - angle = atan2( - p2[1] - p1[1], - p2[0] - p1[0], - ) - if angle < 0: - angle += pi * 2 - angle_difference = fabs(angle - unit_facing) - return angle_difference < angle_error - -cpdef bint cy_attack_ready(bot, unit, target): - """ - Determine whether the unit can attack the target by the time the unit faces the target. - Thanks Sasha for writing this out. - """ - cdef: - unsigned int unit_type_int = unit._proto.unit_type - int weapon_cooldown - double angle, distance, move_time, step_time, turn_time, unit_speed - (float, float) unit_pos - (float, float) target_pos - - # fix for units, where this method returns False so the unit moves - # but the attack animation is still active, so the move command cancels the attack - # need to think of a better fix later, but this is better than a unit not attacking - # and still better than using simple weapon.cooldown == 0 micro - weapon_cooldown = unit.weapon_cooldown - # if weapon_cooldown > 7: # and unit_type_int == 91: # 91 == UnitID.HYDRALISK - # return True - # prevents crash, since unit can't move - if unit_type_int == 503: # 503 == UnitID.LURKERMPBURROWED - return True - if not unit.can_attack: - return False - # Time elapsed per game step - step_time = bot.client.game_step / 22.4 - - unit_pos = unit.position - target_pos = target.position - # Time it will take for unit to turn to face target - angle = angle_diff( - unit.facing, angle_to(unit_pos, target_pos) - ) - turn_time = angle / get_turn_speed(unit, unit_type_int) - - # Time it will take for unit to move in range of target - distance = ( - cy_distance_to(unit_pos, target_pos) - - unit.radius - - target.radius - - range_vs_target(unit, target) - ) - distance = max(0, distance) - unit_speed = (unit.real_speed + 1e-16) * 1.4 - move_time = distance / unit_speed - - return step_time + turn_time + move_time >= weapon_cooldown / 22.4 - -@boundscheck(False) -@wraparound(False) -cpdef bint cy_is_position_safe( - cnp.ndarray[cnp.npy_float32, ndim=2] grid, - (unsigned int, unsigned int) position, - double weight_safety_limit = 1.0, -): - """ - 987 ns ± 10.1 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - Python alternative: - 4.66 µs ± 64.8 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - """ - cdef double weight = 0.0 - weight = grid[position[0], position[1]] - # np.inf check if drone is pathing near a spore crawler - return weight == np.inf or weight <= weight_safety_limit - -cpdef object cy_pick_enemy_target(object enemies): - """For best enemy target from the provided enemies - TODO: If there are multiple units that can be killed, pick the highest value one - Unit parameter to allow for this in the future - - For now this returns the lowest health enemy - """ - cdef: - object returned_unit - unsigned int num_enemies, x - double lowest_health, total_health - - num_enemies = len(enemies) - returned_unit = enemies[0] - lowest_health = 999.9 - for x in range(num_enemies): - unit = enemies[x] - total_health = unit.health + unit.shield - if total_health < lowest_health: - lowest_health = total_health - returned_unit = unit - - return returned_unit diff --git a/src/ares/cython_extensions/cython_functions.pyx b/src/ares/cython_extensions/cython_functions.pyx deleted file mode 100644 index 39a41f1..0000000 --- a/src/ares/cython_extensions/cython_functions.pyx +++ /dev/null @@ -1,203 +0,0 @@ -import numpy as np - -cimport numpy as np -from cython cimport boundscheck, wraparound -from libc.math cimport atan2, cos, floor, sin - -from sc2.units import Units -from sklearn.cluster import DBSCAN - -DEF ANGLE_STEP = .314159 # the angle step for iteration in radians - -np.import_array() - - -cpdef add_neighbors_to_ignore( - points_to_ignore -): - cdef: - int current_idx = 0 - int i = 0 - int x = 0 - int y = 0 - (int, int) [1008] all_avoid # 112 base points, chosen arbitrarily - - for i in range(len(points_to_ignore)): - point = points_to_ignore[i] - for x in range(-1, 2): - for y in range(-1, 2): - all_avoid[current_idx][0] = point[0] + x - all_avoid[current_idx][1] = point[1] + y - current_idx += 1 - if current_idx >= 1008: - return set(list(all_avoid)[:1008]) - return set(list(all_avoid)[:current_idx]) - - -cpdef add_units_to_ignore( - units_to_avoid, -): - cdef: - int current_idx = 0 - int i, x, y - (int, int) [1008] all_avoid # 112 base points, chosen arbitrarily - - for i in range(len(units_to_avoid)): - point = units_to_avoid[i].position - for x in range(-1, 2): - for y in range(-1, 2): - all_avoid[current_idx][0] = point[0] + x - all_avoid[current_idx][1] = point[1] + y - current_idx += 1 - if current_idx >= 1008: - return set(list(all_avoid)[:1008]) - return set(list(all_avoid)[:current_idx]) - - -cpdef bint all_points_below_max_value( - const np.float32_t[:, :] grid, - np.float32_t max_value, - points_to_check -): - cdef: - int x - int y - - for p in points_to_check: - x = p[0] - y = p[1] - if np.inf > grid[x][y] > max_value: - return False - - return True - - -cpdef bint all_points_have_value( - const unsigned char[:, :] grid, - const unsigned char value, - points -): - cdef: - int x - int y - - if len(points) == 0: - return False - - for p in points: - x = p[0] - y = p[1] - if grid[y][x] != value: - return False - return True - - -cdef float euclidean_distance_squared_char((unsigned char, unsigned char) p1, (unsigned char, unsigned char) p2): - return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 - - -cdef float euclidean_distance_squared_float((float, float) p1, (float, float) p2): - return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 - - -@boundscheck(False) -@wraparound(False) -cpdef ((float, float), (float, float)) get_bounding_box(set coordinates): - cdef: - float x_min = 9999.0 - float x_max = 0.0 - float x_val = 0.0 - float y_min = 9999.0 - float y_max = 0.0 - float y_val = 0.0 - int start = 0 - int stop = len(coordinates) - (float, float) position - for i in range(start, stop): - position = coordinates.pop() - x_val = position[0] - y_val = position[1] - if x_val < x_min: - x_min = x_val - if x_val > x_max: - x_max = x_val - if y_val < y_min: - y_min = y_val - if y_val > y_max: - y_max = y_val - return (x_min, x_max), (y_min, y_max) - - -cpdef get_neighbors8((float, float) point): - cdef: - int i, j - int idx = 0 - double x, y - (double, double) [8] neighbors - - x = floor(point[0]) - y = floor(point[1]) - - for i in range(-1, 2): - for j in range(-1, 2): - if i == 0 and j == 0: - continue - neighbors[idx] = (x + i, y + j) - idx += 1 - return set(neighbors) - - -cpdef int last_index_with_value( - const unsigned char[:, :] grid, - const unsigned char value, - points -): - cdef: - int x - int y - int last_valid_idx = 0 - int stop_val = len(points) - - if stop_val == 0: - return -1 - - for last_valid_idx in range(stop_val): - x = points[last_valid_idx][0] - y = points[last_valid_idx][1] - if grid[y][x] != value: - return last_valid_idx - 1 - return last_valid_idx - - -cpdef points_with_value( - const unsigned char[:, :] grid, - const unsigned char value, - points, -): - cdef: - int i, x, y - int idx = 0 - (int, int) [2000] valid_points - - for i in range(len(points)): - x = points[i][0] - y = points[i][1] - if grid[y][x] == value: - valid_points[idx] = (x, y) - idx += 1 - if idx >= 2000: - break - return list(valid_points)[:idx] - - -cpdef (float, float) translate_point_along_line((float, float) point, float A_value, float distance): - cdef: - float angle - float x_offset - float y_offset - - angle = atan2(1, -A_value) - x_offset = distance * cos(angle) - y_offset = distance * sin(angle) - - return (point[0] + x_offset, point[1] + y_offset) diff --git a/src/ares/cython_extensions/flood_fill.pyx b/src/ares/cython_extensions/flood_fill.pyx deleted file mode 100644 index 987d425..0000000 --- a/src/ares/cython_extensions/flood_fill.pyx +++ /dev/null @@ -1,58 +0,0 @@ -cdef unsigned int euclidean_distance_squared_int( - (unsigned int, unsigned int) p1, - (unsigned int, unsigned int) p2 -): - return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 - -cpdef set flood_fill_grid( - (unsigned int, unsigned int) start_point, - const unsigned char[:, :] terrain_grid, - const unsigned char[:, :] pathing_grid, - unsigned int max_distance, - set choke_points -): - cdef: - unsigned int terrain_height = terrain_grid[start_point[0], start_point[1]] - unsigned int pathing_value = pathing_grid[start_point[0], start_point[1]] - set filled_points = set() - - # Only continue if we can get a height for the starting point - if not terrain_height: - return filled_points - - grid_flood_fill(start_point, terrain_grid, pathing_grid, terrain_height, filled_points, start_point, max_distance, choke_points) - return filled_points - -cdef set grid_flood_fill( - (unsigned int, unsigned int) point, - const unsigned char[:, :] terrain_grid, - const unsigned char[:, :] pathing_grid, - unsigned int target_val, - set current_vec, - (unsigned int, unsigned int) start_point, - unsigned int max_distance, - set choke_points): - cdef: - unsigned int terrain_height = terrain_grid[start_point[0], start_point[1]] - unsigned int pathing_value = pathing_grid[start_point[0], start_point[1]] - # Check that we haven't already added this point. - if point in current_vec: - return current_vec - - # Check that this point isn't too far away from the start - if euclidean_distance_squared_int(point, start_point) > max_distance ** 2: - return current_vec - - if point in choke_points: - return current_vec - - terrain_height = terrain_grid[point[0], point[1]] - pathing_value = pathing_grid[point[0], point[1]] - if terrain_height != target_val: - return current_vec - - current_vec.add(point) - grid_flood_fill((point[0]+1, point[1]), terrain_grid, pathing_grid, terrain_height, current_vec, start_point, max_distance, choke_points) - grid_flood_fill((point[0]-1, point[1]), terrain_grid, pathing_grid, terrain_height, current_vec, start_point, max_distance, choke_points) - grid_flood_fill((point[0], point[1]+1), terrain_grid, pathing_grid, terrain_height, current_vec, start_point, max_distance, choke_points) - grid_flood_fill((point[0], point[1]-1), terrain_grid, pathing_grid, terrain_height, current_vec, start_point, max_distance, choke_points) diff --git a/src/ares/cython_extensions/general_utils.pyx b/src/ares/cython_extensions/general_utils.pyx deleted file mode 100644 index 0571162..0000000 --- a/src/ares/cython_extensions/general_utils.pyx +++ /dev/null @@ -1,98 +0,0 @@ -from cython cimport boundscheck, wraparound - -from sc2.dicts.unit_trained_from import UNIT_TRAINED_FROM -from sc2.game_info import Race -from sc2.ids.unit_typeid import UnitTypeId - -from ares.dicts.does_not_use_larva import DOES_NOT_USE_LARVA - - -cdef double cy_distance_to( - (double, double) p1, - (double, double) p2 -): - return ((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) ** 0.5 - -@boundscheck(False) -@wraparound(False) -cpdef bint cy_pylon_matrix_covers( - (double, double) position, - object pylons, - const unsigned char[:, :] height_grid, - double pylon_build_progress = 1.0 - ): - - cdef: - unsigned int x = int(position[0]) - unsigned int y = int(position[1]) - unsigned int len_pylons = len(pylons) - unsigned int position_height = height_grid[y, x] - (double, double) pylon_position - unsigned int pylon_height, i, _x, _y - # range + pylon radius - double pylon_powered_distance = 6.5# + 1.125 - - - for i in range(len_pylons): - pylon = pylons[i] - pylon_position = pylon.position - _x = int(pylon_position[0]) - _y = int(pylon_position[1]) - pylon_height = height_grid[_y, _x] - if ( - pylon.build_progress >= pylon_build_progress - and pylon_height >= position_height - and cy_distance_to(position, pylon_position) < pylon_powered_distance - ): - return True - - return False - -cpdef unsigned int cy_unit_pending(object bot, object unit_type): - cdef: - unsigned int num_pending = 0 - unsigned int len_units, x - set trained_from = UNIT_TRAINED_FROM[unit_type] - object units_collection, unit - - if bot.race == Race.Zerg and unit_type != UnitTypeId.QUEEN: - if unit_type in DOES_NOT_USE_LARVA: - units_collection = bot.own_units - len_units = len(bot.own_units) - trained_from = {UnitTypeId[f"{unit_type.name}COCOON"]} - if unit_type == UnitTypeId.LURKERMP: - trained_from = {UnitTypeId.LURKERMPEGG} - elif unit_type == UnitTypeId.OVERSEER: - trained_from = {UnitTypeId.OVERLORDCOCOON} - - for x in range(len_units): - unit = units_collection[x] - if unit.type_id in trained_from: - num_pending += 1 - return num_pending - # unit will be pending in eggs - else: - units_collection = bot.eggs - len_units = len(units_collection) - for x in range(len_units): - egg = units_collection[x] - if egg.orders and egg.orders[0].ability.button_name.upper() == unit_type.name: - num_pending += 1 - return num_pending - - # all other units, check the structures they are built from - else: - units_collection = bot.structures - len_units = len(units_collection) - for x in range(len_units): - structure = units_collection[x] - if structure.orders and structure.orders[0].ability.button_name.upper() == unit_type.name: - num_pending += 1 - if ( - structure.has_reactor - and structure.orders - and len(structure.orders) > 1 - and structure.orders[1].ability.button_name.upper() == unit_type.name - ): - num_pending += 1 - return num_pending diff --git a/src/ares/cython_extensions/geometry.pyx b/src/ares/cython_extensions/geometry.pyx deleted file mode 100644 index 7684921..0000000 --- a/src/ares/cython_extensions/geometry.pyx +++ /dev/null @@ -1,28 +0,0 @@ -from libc.math cimport sqrt - - -cpdef double cy_distance_to( - (float, float) p1, - (float, float) p2 -): - return ((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) ** 0.5 - -cpdef (double, double) cy_towards((double, double) start_pos, (double, double) target_pos, double distance): - cdef: - (double, double) vector, displacement, new_pos, normalized_vector - double magnitude - - # Calculate the vector between the points - vector = (target_pos[0] - start_pos[0], target_pos[1] - start_pos[1]) - - # Normalize the vector - magnitude = sqrt(vector[0]**2 + vector[1]**2) - normalized_vector = (vector[0] / magnitude, vector[1] / magnitude) - - # Calculate the displacement vector - displacement = (normalized_vector[0] * distance, normalized_vector[1] * distance) - - # Calculate the new position - new_pos = (start_pos[0] + displacement[0], start_pos[1] + displacement[1]) - - return new_pos diff --git a/src/ares/cython_extensions/placement_solver.pyx b/src/ares/cython_extensions/placement_solver.pyx deleted file mode 100644 index 0bf32cf..0000000 --- a/src/ares/cython_extensions/placement_solver.pyx +++ /dev/null @@ -1,115 +0,0 @@ -import numpy as np -from scipy.signal import convolve2d - -cimport cython -cimport numpy as np - - -@cython.boundscheck(False) # Deactivate bounds checking -@cython.wraparound(False) # Deactivate negative indexing. -cpdef bint can_place_structure( - (int, int) building_origin, - (int, int) building_size, - const unsigned char[:, :] creep_grid, - const unsigned char[:, :] placement_grid, - const unsigned char[:, :] pathing_grid, - bint avoid_creep = 1, - bint include_addon = 0 -): - """ - Fast alternative to python-sc2 `can_place` - # TODO: Test if this works / Fix if it doesn't - # TODO: Addon check - # 1.21 µs ± 891 ns per loop (mean ± std. dev. of 1000 runs, 10 loops each) - """ - cdef: - unsigned int size_x = building_size[0] - unsigned int size_y = building_size[1] - unsigned int x = building_origin[0] - unsigned int y = building_origin[1] - unsigned int creep_check = 1 if avoid_creep else 0 - - cdef Py_ssize_t i, j - for i in range(size_y): - for j in range(size_x): - if placement_grid[y + j, x + i] == 0: - return 0 - if creep_grid[y + j, x + i] == creep_check: - return 0 - if pathing_grid[y + j, x + i] == 0: - return 0 - return 1 - -@cython.boundscheck(False) # Deactivate bounds checking -@cython.wraparound(False) # Deactivate negative indexing. -cpdef list find_building_locations( - np.ndarray[np.uint8_t, ndim=2] kernel, - unsigned int x_stride, - unsigned int y_stride, - (unsigned int, unsigned int) x_bounds, - (unsigned int, unsigned int) y_bounds, - const unsigned char[:, :] creep_grid, - const unsigned char[:, :] placement_grid, - const unsigned char[:, :] pathing_grid, - const unsigned char[:, :] points_to_avoid_grid, - unsigned int building_width, - unsigned int building_height, - bint avoid_creep = 1 -): - """ - Use a convolution pass to find all possible building locations in an area - See full docs in `placement_solver.pyi` - 64.8 µs ± 4.05 µs per loop (mean ± std. dev. of 1000 runs, 10 loops each) - """ - cdef: - unsigned int _x = 0 - unsigned int _y = 0 - unsigned int valid_idx = 0 - float x, y - int x_min = x_bounds[0] - int x_max = x_bounds[1] - int y_min = y_bounds[0] - int y_max = y_bounds[1] - unsigned char[:, :] to_convolve = np.ones((x_max - x_min + 1, y_max - y_min + 1), dtype=np.uint8) - (float, float) [500] valid_spots - (float, float) center - float half_width = building_width / 2 - unsigned int creep_check = 0 if avoid_creep else 1 - unsigned int found_this_many_on_y = 0 - Py_ssize_t i, j - - blocked_y = set() - - for i in range(x_min, x_max + 1): - for j in range(y_min, y_max + 1): - if points_to_avoid_grid[j][i] == 0 and creep_grid[j][i] == creep_check and placement_grid[j][i] == 1 and pathing_grid[j][i] == 1: - to_convolve[i - x_min][j - y_min] = 0 - - cdef unsigned char[:, :] result = convolve2d(to_convolve, kernel, mode="valid") - - for i in range(0, result.shape[0], x_stride): - found_this_many_on_y = 0 - for j in range(0, result.shape[1], y_stride): - if result[i][j] == 0: - if j in blocked_y: - continue - - found_this_many_on_y += 1 - # idea here is to leave a gap sometimes to prevent stuck units - if j > 0 and found_this_many_on_y % 4 == 0: - blocked_y.add(j) - continue - - x = i + x_min + half_width - y = j + y_min + half_width - - # valid building placement is building center, so add half to x and y - valid_spots[valid_idx][0] = x - valid_spots[valid_idx][1] = y - valid_idx += 1 - - if valid_idx == 0: - return [] - - return list(valid_spots)[:valid_idx] - diff --git a/src/ares/cython_extensions/units_utils.pyx b/src/ares/cython_extensions/units_utils.pyx deleted file mode 100644 index 964b1fe..0000000 --- a/src/ares/cython_extensions/units_utils.pyx +++ /dev/null @@ -1,181 +0,0 @@ -from cython cimport boundscheck, wraparound - -import numpy as np -from sklearn.cluster import DBSCAN - -from ares.cython_extensions.geometry import cy_distance_to -from ares.dicts.unit_data import UNIT_DATA - -cimport numpy as cnp - -UNIT_DATA_INT_KEYS = {k.value: v for k, v in UNIT_DATA.items()} - - -cdef double euclidean_distance_squared( - (float, float) p1, - (float, float) p2 -): - return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 - -@boundscheck(False) -@wraparound(False) -cpdef (double, double) cy_center(object units): - """Returns the central position of all units.""" - cdef: - unsigned int i = 0 - unsigned int num_units = len(units) - double sum_x, sum_y = 0.0 - (double, double) position - object unit - - for i in range(num_units): - pos = units[i]._proto.pos - position = (pos.x, pos.y) - sum_x += position[0] - sum_y += position[1] - - return sum_x / num_units, sum_y / num_units - -@boundscheck(False) -@wraparound(False) -cpdef object cy_closest_to((float, float) position, object units): - """ - 14.9 µs ± 159 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - - python-sc2 `units.closest_to` alternative: - Closest to a Point2: - 301 µs ± 4.34 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each) - Closest to a Unit - 115 µs ± 2.25 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each) - """ - cdef: - object closest = units[0] - double closest_dist = 999.9 - double dist = 0.0 - unsigned int len_units = len(units) - (float, float) pos - - for i in range(len_units): - unit = units[i] - pos = unit.position - dist = euclidean_distance_squared((pos[0], pos[1]), (position[0], position[1])) - if dist < closest_dist: - closest_dist = dist - closest = unit - - return closest - -@boundscheck(False) -@wraparound(False) -cpdef list cy_in_attack_range(object unit, object units, double bonus_distance = 0.0): - if not unit.can_attack: - return [] - - cdef: - unsigned int x, len_units, type_id_int - double dist, air_range, ground_range, radius, other_u_radius - (float, float) unit_pos, other_unit_pos - bint other_unit_flying, can_shoot_air, can_shoot_ground - - can_shoot_air = unit.can_attack_air - can_shoot_ground = unit.can_attack_ground - len_units = len(units) - returned_units = [] - unit_pos = unit.position - radius = unit.radius - air_range = unit.air_range - ground_range = unit.ground_range - - for x in range(len_units): - u = units[x] - # this is faster than getting the UnitTypeID - type_id_int = unit._proto.unit_type - unit_data = UNIT_DATA_INT_KEYS.get(type_id_int, None) - if unit_data: - other_unit_flying = unit_data["flying"] - other_unit_pos = u.position - other_u_radius = u.radius - dist = cy_distance_to(unit_pos, other_unit_pos) - - # type_id_int == 4 is colossus - if can_shoot_air and (other_unit_flying or type_id_int == 4): - if dist <= air_range + radius + other_u_radius + bonus_distance: - returned_units.append(u) - # already added, no need to attempt logic below - continue - - if can_shoot_ground and not other_unit_flying: - if dist <= ground_range + radius + other_u_radius + bonus_distance: - returned_units.append(u) - - return returned_units - -@boundscheck(False) # turn off bounds-checking for entire function -@wraparound(False) # turn off negative index wrapping for entire function -cpdef tuple group_by_spatial( - object units, - float distance = 0.5, - unsigned int min_samples = 1 -): - """ - Use DBSCAN to group units. Returns grouped units and the tags of units that were not placed in a group. - """ - cdef unsigned int num_units = len(units) - - if num_units == 0: - return [], set() - - cdef: - cnp.ndarray[cnp.int64_t, ndim = 1] clustering_labels - cnp.ndarray[cnp.double_t, ndim = 2] vectors = np.empty((num_units, 2), dtype=np.double) - list groups - set ungrouped_unit_tags - int label - unsigned int index, _index, groups_length, max_range, num_clusters - (double, double) position - # array.array groups - - for _index in range(num_units): - position = units[_index].position - vectors[_index, 0] = position[0] - vectors[_index, 1] = position[1] - - clustering_labels = DBSCAN(eps=distance, algorithm='kd_tree', min_samples=min_samples).fit(vectors).labels_ - #num_clusters = len(set(clustering_labels)) - (1 if -1 in clustering_labels else 0) - - groups = [] - # groups = array.array('i', [j for j in range(num_clusters_)]) - - max_range = len(clustering_labels) - ungrouped_unit_tags = set() - - for index in range(max_range): - unit = units[index] - label = clustering_labels[index] - if label == -1: - # not part of a group - ungrouped_unit_tags.add(unit.tag) - continue - # groups[label].append(unit) - groups_length = len(groups) - if label >= groups_length: - groups.append([unit]) - else: - groups[label].append(unit) - - return groups, ungrouped_unit_tags - -cpdef list cy_sorted_by_distance_to(object units, (float, float) position, bint reverse=False): - cdef: - unsigned int len_units = len(units) - cnp.ndarray[cnp.npy_double, ndim=1] distances = np.empty(len_units) - # TODO: couldn't get this to work, so no speedup for `indices` currently - # cnp.ndarray[cnp.npy_double, ndim=1] indices = np.empty(len_units) - unsigned int i, j - - for i in range(len_units): - distances[i] = euclidean_distance_squared(units[i].position, position) - - indices = distances.argsort() - - return [units[j] for j in indices] diff --git a/src/ares/main.py b/src/ares/main.py index 00b2ff6..b4d46b2 100644 --- a/src/ares/main.py +++ b/src/ares/main.py @@ -7,6 +7,7 @@ from typing import DefaultDict, Dict, List, Optional, Set, Tuple, Union import yaml +from cython_extensions import cy_unit_pending from loguru import logger from s2clientprotocol.raw_pb2 import Unit as RawUnit from sc2.constants import ALL_GAS, IS_PLACEHOLDER, FakeEffectID, geyser_ids, mineral_ids @@ -47,7 +48,6 @@ UnitTreeQueryType, ) from ares.custom_bot_ai import CustomBotAI -from ares.cython_extensions.general_utils import cy_unit_pending from ares.dicts.cost_dict import COST_DICT from ares.dicts.enemy_detector_ranges import ENEMY_DETECTOR_RANGES from ares.dicts.enemy_vs_ground_static_defense_ranges import ( diff --git a/src/ares/managers/building_manager.py b/src/ares/managers/building_manager.py index a8ad5b9..563dd8e 100644 --- a/src/ares/managers/building_manager.py +++ b/src/ares/managers/building_manager.py @@ -14,6 +14,12 @@ Union, ) +from cython_extensions import ( + cy_center, + cy_closest_to, + cy_distance_to, + cy_distance_to_squared, +) from sc2.constants import ALL_GAS from sc2.data import Race from sc2.ids.ability_id import AbilityId @@ -36,8 +42,6 @@ ManagerRequestType, UnitRole, ) -from ares.cython_extensions.geometry import cy_distance_to -from ares.cython_extensions.units_utils import cy_center, cy_closest_to from ares.managers.manager import Manager from ares.managers.manager_mediator import IManagerMediator, ManagerMediator @@ -213,7 +217,7 @@ def _handle_construction_orders(self) -> None: # check if we are finished with the building worker if close_structures := self.ai.structures.filter( - lambda s: cy_distance_to(s.position, target.position) < 1.0 + lambda s: cy_distance_to_squared(s.position, target.position) < 2.0 ): structure: Unit = close_structures[0] target_progress: float = 1.0 if self.ai.race == Race.Terran else 0.01 @@ -230,7 +234,7 @@ def _handle_construction_orders(self) -> None: s for s in structures_dict[structure_id] if s.type_id == structure_id - and cy_distance_to(s.position, target.position) < 1.5 + and cy_distance_to_squared(s.position, target.position) < 2.25 and s.build_progress < 1.0 ]: existing_unfinished_structure = existing_unfinished_structures[0] @@ -240,7 +244,7 @@ def _handle_construction_orders(self) -> None: # check if target geyser got taken by enemy if self.ai.enemy_structures.filter( lambda u: u.type_id in GAS_BUILDINGS - and cy_distance_to(target.position, u.position) < 4.5 + and cy_distance_to_squared(target.position, u.position) < 20.25 ): # gas blocked, update with new target and continue # in the next frame worker will try different geyser @@ -388,10 +392,10 @@ async def construct_gas( else: # target geyser closest to mf so worker doesn't have to move as far if close_mf := self.ai.mineral_field.filter( - lambda mf: cy_distance_to( + lambda mf: cy_distance_to_squared( mf.position, cy_center(possible_geysers) ) - < 12.0 + < 144.0 ): target_geyser: Unit = possible_geysers.closest_to( close_mf.center diff --git a/src/ares/managers/enemy_to_base_manager.py b/src/ares/managers/enemy_to_base_manager.py index 54549e5..0797463 100644 --- a/src/ares/managers/enemy_to_base_manager.py +++ b/src/ares/managers/enemy_to_base_manager.py @@ -2,6 +2,7 @@ from enum import Enum, auto from typing import DefaultDict, Union +from cython_extensions import cy_closest_to from sc2.unit import Unit from sc2.units import Units @@ -16,7 +17,6 @@ ManagerRequestType, UnitTreeQueryType, ) -from ares.cython_extensions.units_utils import cy_closest_to from ares.managers.manager import Manager from ares.managers.manager_mediator import IManagerMediator, ManagerMediator diff --git a/src/ares/managers/flying_structure_manager.py b/src/ares/managers/flying_structure_manager.py index b5f8c29..360c7d4 100644 --- a/src/ares/managers/flying_structure_manager.py +++ b/src/ares/managers/flying_structure_manager.py @@ -3,12 +3,12 @@ """ from typing import TYPE_CHECKING, Dict, Optional +from cython_extensions import cy_distance_to_squared from sc2.ids.ability_id import AbilityId from sc2.position import Point2 from sc2.unit import Unit from ares.consts import ManagerName, ManagerRequestType -from ares.cython_extensions.geometry import cy_distance_to from ares.managers.manager import Manager from ares.managers.manager_mediator import IManagerMediator, ManagerMediator @@ -140,7 +140,7 @@ def _handle_flying_structures(self) -> None: tags_to_remove.append(structure_tag) continue - dist_to_target: float = cy_distance_to(structure.position, target) + dist_to_target: float = cy_distance_to_squared(structure.position, target) if not structure.is_flying: if structure.position == target: tags_to_remove.append(structure_tag) @@ -149,7 +149,7 @@ def _handle_flying_structures(self) -> None: structure(AbilityId.CANCEL_QUEUE5) structure(AbilityId.LIFT, queue=True) else: - if dist_to_target < 5.5: + if dist_to_target < 30.25: # 5.5 if should_land: structure(AbilityId.LAND, target) else: diff --git a/src/ares/managers/path_manager.py b/src/ares/managers/path_manager.py index f2d3881..74ab293 100644 --- a/src/ares/managers/path_manager.py +++ b/src/ares/managers/path_manager.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Union import numpy as np +from cython_extensions import cy_distance_to_squared, cy_point_below_value from map_analyzer import MapData from sc2.ids.effect_id import EffectId from sc2.ids.unit_typeid import UnitTypeId as UnitID @@ -51,8 +52,6 @@ ManagerName, ManagerRequestType, ) -from ares.cython_extensions.combat_utils import cy_is_position_safe -from ares.cython_extensions.geometry import cy_distance_to from ares.dicts.weight_costs import WEIGHT_COSTS from ares.managers.manager import Manager from ares.managers.manager_mediator import IManagerMediator, ManagerMediator @@ -577,7 +576,7 @@ def is_position_safe( True if the position is considered safe, False otherwise. """ - return cy_is_position_safe(grid, position.rounded, weight_safety_limit) + return cy_point_below_value(grid, position.rounded, weight_safety_limit) def reset_grids(self, iteration: int) -> None: """Get fresh grids so that the influence can be updated. @@ -820,7 +819,7 @@ def _add_structure_influence(self, structure: Unit) -> None: elif structure.type_id == UnitID.BUNKER: if self.ai.enemy_structures.filter( lambda g: g.type_id in TOWNHALL_TYPES - and cy_distance_to(g.position, structure.position) < 9.0 + and cy_distance_to_squared(g.position, structure.position) < 81.0 # 9.0 ): return # add range of marine + 1 diff --git a/src/ares/managers/placement_manager.py b/src/ares/managers/placement_manager.py index f5c55fb..e9d764b 100644 --- a/src/ares/managers/placement_manager.py +++ b/src/ares/managers/placement_manager.py @@ -2,6 +2,13 @@ from typing import TYPE_CHECKING, Any, Callable, Coroutine, DefaultDict, Optional, Union import numpy as np +from cython_extensions import ( + cy_can_place_structure, + cy_distance_to_squared, + cy_find_building_locations, + cy_get_bounding_box, + cy_pylon_matrix_covers, +) from loguru import logger from sc2.constants import ALL_GAS from sc2.data import Race @@ -21,13 +28,6 @@ ManagerName, ManagerRequestType, ) -from ares.cython_extensions.cython_functions import get_bounding_box -from ares.cython_extensions.general_utils import cy_pylon_matrix_covers -from ares.cython_extensions.geometry import cy_distance_to -from ares.cython_extensions.placement_solver import ( - can_place_structure, - find_building_locations, -) from ares.dicts.structure_to_building_size import STRUCTURE_TO_BUILDING_SIZE from ares.managers.manager import Manager from ares.managers.manager_mediator import IManagerMediator, ManagerMediator @@ -202,7 +202,8 @@ def can_place_structure( if structure_type in GAS_BUILDINGS: pos: Point2 = position.position existing_gas_buildings: Units = self.ai.all_units.filter( - lambda u: u.type_id in ALL_GAS and cy_distance_to(pos, u.position) < 3.5 + lambda u: u.type_id in ALL_GAS + and cy_distance_to_squared(pos, u.position) < 12.25 ) return len(existing_gas_buildings) == 0 @@ -212,7 +213,7 @@ def can_place_structure( origin_y: int = int(position[1] - offset) size: tuple[int, int] = self.BUILDING_SIZE_ENUM_TO_TUPLE[size] - return can_place_structure( + return cy_can_place_structure( (origin_x, origin_y), size, self.ai.state.creep.data_numpy, @@ -279,7 +280,7 @@ def request_building_placement( if base_location in self.placements_dict else min( base_locations, - key=lambda k: cy_distance_to(k, base_location), + key=lambda k: cy_distance_to_squared(k, base_location), ) ) @@ -306,7 +307,7 @@ def request_building_placement( base_locations.remove(location) locations = sorted( base_locations, - key=lambda k: cy_distance_to(k, base_location), + key=lambda k: cy_distance_to_squared(k, base_location), ) for location in locations: logger.warning( @@ -338,11 +339,11 @@ def request_building_placement( # get closest available by default if not closest_to: final_placement: Point2 = min( - available, key=lambda k: cy_distance_to(k, base_location) + available, key=lambda k: cy_distance_to_squared(k, base_location) ) else: final_placement: Point2 = min( - available, key=lambda k: cy_distance_to(k, closest_to) + available, key=lambda k: cy_distance_to_squared(k, closest_to) ) # if wall placement is requested swap final_placement if possible @@ -353,12 +354,13 @@ def request_building_placement( if self.placements_dict[location][building_size][a]["is_wall"] ]: final_placement = min( - _available, key=lambda k: cy_distance_to(k, base_location) + _available, + key=lambda k: cy_distance_to_squared(k, base_location), ) else: final_placement = min( available, - key=lambda k: cy_distance_to( + key=lambda k: cy_distance_to_squared( k, self.ai.main_base_ramp.top_center ), ) @@ -374,7 +376,8 @@ def request_building_placement( and not self.placements_dict[location][building_size][a]["is_wall"] ]: final_placement = min( - available, key=lambda k: cy_distance_to(k, base_location) + available, + key=lambda k: cy_distance_to_squared(k, base_location), ) if self.ai.race == Race.Protoss and within_psionic_matrix: @@ -415,7 +418,9 @@ def _fine_placement_near_pylon( pylon_build_progress=1.0, ) ]: - return min(available, key=lambda k: cy_distance_to(k, base_location)) + return min( + available, key=lambda k: cy_distance_to_squared(k, base_location) + ) # then check for those in progress else: if available := [ @@ -428,7 +433,9 @@ def _fine_placement_near_pylon( pylon_build_progress=pylon_build_progress, ) ]: - return min(available, key=lambda k: cy_distance_to(k, base_location)) + return min( + available, key=lambda k: cy_distance_to_squared(k, base_location) + ) def on_building_started(self, unit: Unit) -> None: """On structure starting, update placements_dict with this new information. @@ -590,9 +597,9 @@ def _solve_terran_building_formation(self): ] = self.manager_mediator.get_flood_fill_area( start_point=el, max_dist=max_dist ) - raw_x_bounds, raw_y_bounds = get_bounding_box(area_points) + raw_x_bounds, raw_y_bounds = cy_get_bounding_box(area_points) - three_by_three_positions = find_building_locations( + three_by_three_positions = cy_find_building_locations( kernel=np.ones((5, 3), dtype=np.uint8), x_stride=5, y_stride=3, @@ -630,7 +637,7 @@ def _solve_terran_building_formation(self): self.points_to_avoid_grid[ start_y : start_y + 15, start_x : start_x + 15 ] = 1 - supply_positions = find_building_locations( + supply_positions = cy_find_building_locations( kernel=np.ones((2, 2), dtype=np.uint8), x_stride=2, y_stride=2, @@ -701,10 +708,10 @@ def _solve_protoss_building_formation(self): ] = self.manager_mediator.get_flood_fill_area( start_point=el, max_dist=max_dist ) - raw_x_bounds, raw_y_bounds = get_bounding_box(area_points) + raw_x_bounds, raw_y_bounds = cy_get_bounding_box(area_points) # find production pylon positions first - production_pylon_positions = find_building_locations( + production_pylon_positions = cy_find_building_locations( kernel=np.ones((2, 2), dtype=np.uint8), x_stride=6, y_stride=6, @@ -740,7 +747,7 @@ def _solve_protoss_building_formation(self): start_x: int = int(el.x - 4.5) start_y: int = int(el.y - 4.5) self.points_to_avoid_grid[start_y : start_y + 9, start_x : start_x + 9] = 1 - three_by_three_positions = find_building_locations( + three_by_three_positions = cy_find_building_locations( kernel=np.ones((3, 3), dtype=np.uint8), x_stride=3, y_stride=3, @@ -772,7 +779,7 @@ def _solve_protoss_building_formation(self): ] = 1 # find extra 2x2 last - two_by_two_positions = find_building_locations( + two_by_two_positions = cy_find_building_locations( kernel=np.ones((2, 2), dtype=np.uint8), x_stride=2, y_stride=2, diff --git a/src/ares/managers/resource_manager.py b/src/ares/managers/resource_manager.py index e3e851d..b7266e3 100644 --- a/src/ares/managers/resource_manager.py +++ b/src/ares/managers/resource_manager.py @@ -7,6 +7,11 @@ from typing import TYPE_CHECKING, Any, DefaultDict, Dict, List, Optional, Set import numpy as np +from cython_extensions import ( + cy_closest_to, + cy_distance_to_squared, + cy_sorted_by_distance_to, +) from sc2.position import Point2 from sc2.unit import Unit from sc2.units import Units @@ -23,8 +28,6 @@ UnitRole, UnitTreeQueryType, ) -from ares.cython_extensions.geometry import cy_distance_to -from ares.cython_extensions.units_utils import cy_closest_to, cy_sorted_by_distance_to from ares.managers.manager import Manager from ares.managers.manager_mediator import IManagerMediator, ManagerMediator @@ -411,7 +414,10 @@ def select_worker( if close_workers := available_workers.filter( lambda w: w.tag in self.mineral_patch_to_list_of_workers[mineral.tag] - and cy_distance_to(w.position, townhall.position) < 10.0 + and cy_distance_to_squared( + w.position, townhall.position + ) + < 100.0 ): worker: Unit = cy_closest_to( target_position, close_workers diff --git a/src/ares/managers/squad_manager.py b/src/ares/managers/squad_manager.py index 4bf3b73..7ade0b3 100644 --- a/src/ares/managers/squad_manager.py +++ b/src/ares/managers/squad_manager.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Optional, Union +from cython_extensions import cy_center, cy_distance_to_squared from loguru import logger from sc2.ids.unit_typeid import UnitTypeId as UnitID from sc2.position import Point2 @@ -12,8 +13,6 @@ from sc2.units import Units from ares.consts import DEBUG, ManagerName, ManagerRequestType, UnitRole -from ares.cython_extensions.geometry import cy_distance_to -from ares.cython_extensions.units_utils import cy_center from ares.managers.manager import Manager from ares.managers.manager_mediator import IManagerMediator, ManagerMediator @@ -298,11 +297,13 @@ def _closest_squad_id( return "" closest_squad: UnitSquad = squads[0] - min_distance: float = 9998.9 + min_distance: float = 999999.9 for squad in squads: if squad.squad_id == avoid_squad_id: continue - current_distance: float = cy_distance_to(position, squad.squad_position) + current_distance: float = cy_distance_to_squared( + position, squad.squad_position + ) if current_distance < min_distance: closest_squad = squad min_distance = current_distance @@ -382,12 +383,14 @@ def _remove_squad(self, role: UnitRole, squad_id: str) -> None: def _handle_existing_squads_assignment( self, role: UnitRole, squads: list[UnitSquad], radius: float ) -> None: + radius_squared: float = radius**2 # Stray units get too far from squad -> Remove from current squad for squad in squads: in_range_tags: set[int] = { u.tag for u in squad.squad_units - if cy_distance_to(u.position, squad.squad_position) < radius + if cy_distance_to_squared(u.position, squad.squad_position) + < radius_squared } for unit in squad.squad_units: if unit.tag not in in_range_tags: diff --git a/src/ares/managers/terrain_manager.pyx b/src/ares/managers/terrain_manager.py similarity index 77% rename from src/ares/managers/terrain_manager.pyx rename to src/ares/managers/terrain_manager.py index 8c6535b..7c21198 100644 --- a/src/ares/managers/terrain_manager.pyx +++ b/src/ares/managers/terrain_manager.py @@ -1,15 +1,11 @@ """Calculations involving terrain. """ -# cython imports - -from libc.math cimport acos, sqrt - import math -from functools import lru_cache from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple import numpy as np +from cython_extensions import cy_flood_fill_grid from map_analyzer import MapData from map_analyzer.constructs import ChokeArea, VisionBlockerArea from sc2.game_info import Ramp @@ -32,7 +28,6 @@ ManagerRequestType, UnitTreeQueryType, ) -from ares.cython_extensions.flood_fill import flood_fill_grid from ares.managers.manager import Manager from ares.managers.manager_mediator import IManagerMediator, ManagerMediator @@ -81,19 +76,13 @@ def __init__( super().__init__(ai, config, mediator) self.manager_requests_dict = { ManagerRequestType.BUILDING_POSITION_BLOCKED_BY_BURROWED_UNIT: ( - lambda kwargs: self.building_position_blocked_by_burrowed_unit( - **kwargs - ) + lambda kwargs: self.building_position_blocked_by_burrowed_unit(**kwargs) ), ManagerRequestType.GET_BEHIND_MINERAL_POSITIONS: lambda kwargs: ( - self.get_behind_mineral_positions( - **kwargs - ) + self.get_behind_mineral_positions(**kwargs) ), ManagerRequestType.GET_CLOSEST_OVERLORD_SPOT: lambda kwargs: ( - self.get_closest_overlord_spot( - **kwargs - ) + self.get_closest_overlord_spot(**kwargs) ), ManagerRequestType.GET_DEFENSIVE_THIRD: lambda kwargs: self.defensive_third, ManagerRequestType.GET_ENEMY_EXPANSIONS: lambda kwargs: ( @@ -104,9 +93,7 @@ def __init__( ManagerRequestType.GET_ENEMY_THIRD: lambda kwargs: self.enemy_third, ManagerRequestType.GET_ENEMY_FOURTH: lambda kwargs: self.enemy_fourth, ManagerRequestType.GET_FLOOD_FILL_AREA: lambda kwargs: ( - self.get_flood_fill_area( - **kwargs - ) + self.get_flood_fill_area(**kwargs) ), ManagerRequestType.GET_INITIAL_PATHING_GRID: lambda kwargs: ( self.initial_pathing_grid @@ -288,7 +275,6 @@ def enemy_fourth(self) -> Point2: else: return self.enemy_expansions[1][0] - @property_cache_once_per_frame def enemy_main_base_ramp(self) -> Ramp: """Identify which ramp is the enemies main. @@ -406,11 +392,10 @@ def get_closest_overlord_spot(self, from_pos: Point2) -> Point2: self.ol_spots.pop(self.ol_spots.index(closest_spot)) return closest_spot - def get_flood_fill_area( - self, start_point: Point2, max_dist: int = 25 - ): + def get_flood_fill_area(self, start_point: Point2, max_dist: int = 25): """ - Given a point, flood fill outward from it and return the valid points. Does not continue through chokes. + Given a point, flood fill outward from it and return the valid points. + Does not continue through chokes. Parameters ---------- @@ -424,16 +409,15 @@ def get_flood_fill_area( set : Set of points (as tuples) that are filled in """ - all_points = flood_fill_grid( + all_points = cy_flood_fill_grid( start_point=start_point.rounded, terrain_grid=self.ai.game_info.terrain_height.data_numpy.T, pathing_grid=self.cached_pathing_grid.astype(np.uint8), max_distance=max_dist, - choke_points=self.choke_points, + cutoff_points=self.choke_points, ) return all_points - def location_is_blocked( self, position: Point2, enemy_only: bool = False, structures_only: bool = False ) -> bool: @@ -461,13 +445,13 @@ def location_is_blocked( close_enemy: Units = self.manager_mediator.get_units_in_range( start_points=[position], distances=distance, - query_tree=UnitTreeQueryType.AllEnemy + query_tree=UnitTreeQueryType.AllEnemy, )[0] close_enemy: Units = close_enemy.filter( lambda u: u.type_id not in FLYING_IGNORE - and u.type_id != UnitID.AUTOTURRET - and u.type_id != UnitID.MARINE + and u.type_id != UnitID.AUTOTURRET + and u.type_id != UnitID.MARINE ) if structures_only and close_enemy(ALL_STRUCTURES): return True @@ -478,7 +462,7 @@ def location_is_blocked( close_own: Units = self.manager_mediator.get_units_in_range( start_positions=[position], distances=3, - query_tree=UnitTreeQueryType.AllOwn + query_tree=UnitTreeQueryType.AllOwn, )[0].filter(lambda u: u.type_id in TOWNHALL_TYPES) if close_own: return True @@ -509,7 +493,7 @@ def building_position_blocked_by_burrowed_unit( close_mines: Units = self.manager_mediator.get_units_in_range( start_points=[position], distance=3, - query_tree=UnitTreeQueryType.EnemyGround + query_tree=UnitTreeQueryType.EnemyGround, )[0].filter(lambda u: u.type_id == UnitID.WIDOWMINEBURROWED) if close_mines: self.positions_blocked_by_enemy_burrowed_units.append(position) @@ -550,7 +534,9 @@ def _calculate_expansion_path_distances( if from_pos.distance_to(el) < self.ai.EXPANSION_GAP_THRESHOLD: continue - if path := self.manager_mediator.get_map_data_object.pathfind(from_pos, el, grid): + if path := self.manager_mediator.get_map_data_object.pathfind( + from_pos, el, grid + ): expansion_distances.append((el, len(path))) # sort by path length to each expansion @@ -651,7 +637,7 @@ def get_base_to_choke_information(self) -> Dict[Point2, Dict[ChokeArea, int]]: ) ) for ch in self.map_data.in_region_p(base_loc).region_chokes - if type(ch) != VisionBlockerArea + if type(ch) is not VisionBlockerArea } for base_loc in self.ai.expansion_locations_list } @@ -669,14 +655,12 @@ def _clear_positions_blocked_by_burrowed_enemy(self) -> None: _positions_blocked_by_enemy_burrowed_units: List[Point2] = [] for position in self.positions_blocked_by_enemy_burrowed_units: detectors: Units = self.manager_mediator.get_units_in_range( - start_points=[position], - distance=7, - query_tree=UnitTreeQueryType.AllOwn + start_points=[position], distance=7, query_tree=UnitTreeQueryType.AllOwn )[0].filter(lambda u: u.type_id in {DETECTORS}) enemies_in_range: Units = self.manager_mediator.get_units_in_range( start_points=[position], distance=9, - query_tree=UnitTreeQueryType.AllEnemy + query_tree=UnitTreeQueryType.AllEnemy, )[0] # looks like there is nothing here, no need to add it to the blocked @@ -702,179 +686,3 @@ async def _draw_information(self) -> None: for i, el in enumerate(self.own_expansions): self.ai.draw_text_on_world(el[0], str(i), y_offset=2) - -cdef (float, float, float) get_line_to_point((int, int) pa, (int, int) pb): - """Cython version of get_line_between_points, probably not actually necessary""" - cdef: - int x1 = pa[0] - int y1 = pa[1] - int x2 = pb[0] - int y2 = pb[1] - (float, float, float) line - float slope - - if x1 == x2: - line = (1, 0, -x1) - else: - slope = (y2 - y1) / (x2 - x1) - line = (-slope, 1, -(y1 - (slope * x1))) - return line - -cpdef ((float, float, float), (float, float)) find_correct_line(points, base_location): - """ - - Given a list of points and a center point, find if there's a line such that all - other points are above or below the line. Returns the line in the form - Ax + By + C = 0 and the point that was used. - - If no such line is found, it returns ((0, 0, 0), ). - - Parameters - ---------- - points : - Points that need to be on one side of the line. - base_location : - Starting point for the line. - - Returns - ------- - Tuple[Tuple[float, float, float], Tuple[float, float]] : - First element is the coefficients of Ax + By + C = 0. - Second element is the point used to form the line. - - """ - cdef: - float a, b, c, value - int idx - (float, float, float) line - int last_temp_idx = 0 - int positive - int negative - - if len(points) == 1: - return get_line_to_point(points[0], base_location), points[0] - - for idx in range(len(points)): - positive = 0 - negative = 0 - temporary = points.copy() - start_point = temporary.pop(idx) - a, b, c = get_line_to_point(base_location, start_point) - for point_idx in range(len(temporary)): - value = a * temporary[point_idx][0] + b * temporary[point_idx][1] + c - if value > 0: - positive += 1 - elif value < 0: - negative += 1 - if positive > 0 and negative > 0: - break - if positive > 0 and negative > 0: - continue - else: - line = (a, b, c) - break - - return line, points[idx] - -cpdef find_average_angle( - (float, float) start_point, (float, float) reference_point, points -): - """Find the average angle between the points and the reference point. - - Given a starting point, a reference point, and a list of points, find the average - angle between the vectors from the starting point to the reference point and the - starting point to the points. - - Parameters - ---------- - start_point : - Origin for the vectors to the other given points. - reference_point : - Vector forming one leg of the angle. - points : - Points to calculate the angle between relative to the reference point. - - Returns - ------- - double : - Average angle in radians between the reference point and the given points. - - """ - cdef: - float[50] angles - (float, float) ref_point = reference_point - float ref_magnitude - float angle_sum = 0 - float x, y - (float, float) point - # iterators - int angle_idx, point_idx - - ref_point[0] = reference_point[0] - start_point[0] - ref_point[1] = reference_point[1] - start_point[1] - ref_magnitude = sqrt(ref_point[0] ** 2 + ref_point[1] ** 2) - - for point_idx in range(len(points)): - point = points[point_idx] - x = point[0] - start_point[0] - y = point[1] - start_point[1] - if (x, y) == ref_point: - angle = 0 - else: - angle = get_angle_between_points((x, y), ref_point) - angles[point_idx] = angle - - for idx in range(point_idx + 1): - angle_sum += angles[idx] - - return angle_sum / (point_idx + 1) - -cpdef (float, float) get_average_of_points(points): - """Given a list of points, return the average x and y coordinates. - - Parameters - ---------- - points : - Points to take the average x and y coordinates of. - - Returns - ------- - Tuple[float, float] : - Average x and y coordinates. - - """ - cdef: - float x_value = 0 - float y_value = 0 - int point_idx - - for point_idx in range(len(points)): - x_value += points[point_idx][0] - y_value += points[point_idx][1] - - return (x_value / (point_idx + 1)), (y_value / (point_idx + 1)) - -cpdef get_angle_between_points((float, float) point_a, (float, float) point_b): - """Get the angle between two points as if they were vectors from the origin. - - Parameters - ---------- - point_a : - One point. - point_b : - The other point. - - Returns - ------- - double : - The angle between the two points. - - """ - cdef: - float a_dot_b, a_magnitude, b_magnitude - - a_dot_b = point_a[0] * point_b[0] + point_a[1] * point_b[1] - a_magnitude = sqrt(point_a[0] ** 2 + point_a[1] ** 2) - b_magnitude = sqrt(point_b[0] ** 2 + point_b[1] ** 2) - - return acos(a_dot_b / (a_magnitude * b_magnitude)) diff --git a/src/ares/managers/unit_cache_manager.py b/src/ares/managers/unit_cache_manager.py index 03117c9..bf7ac7b 100644 --- a/src/ares/managers/unit_cache_manager.py +++ b/src/ares/managers/unit_cache_manager.py @@ -4,6 +4,7 @@ from collections import defaultdict from typing import TYPE_CHECKING, Any, Dict, List, Set, Union +from cython_extensions import cy_unit_pending from sc2.data import Race from sc2.game_data import AbilityData from sc2.ids.unit_typeid import UnitTypeId as UnitID @@ -24,7 +25,6 @@ ManagerRequestType, UnitTreeQueryType, ) -from ares.cython_extensions.general_utils import cy_unit_pending from ares.dicts.does_not_use_larva import DOES_NOT_USE_LARVA from ares.dicts.unit_alias import UNIT_ALIAS from ares.managers.manager import Manager diff --git a/src/ares/stubs/__init__.pyi b/src/ares/stubs/__init__.pyi deleted file mode 100644 index e69de29..0000000 diff --git a/src/ares/stubs/combat_utils.pyi b/src/ares/stubs/combat_utils.pyi deleted file mode 100644 index a24ae24..0000000 --- a/src/ares/stubs/combat_utils.pyi +++ /dev/null @@ -1,149 +0,0 @@ -from typing import Union - -import numpy as np -from sc2.unit import Unit -from sc2.units import Units - -from ares import AresBot - -def cy_attack_ready(ai: AresBot, unit: Unit, target: Unit) -> bool: - """Check if the unit is ready to attack the target. - - Takes into account turn rate and unit speeds - - Example: - ```py - from ares.cython_extensions.combat_utils import cy_attack_ready - - worker = self.workers[0] - target = self.enemy_units[0] - - attack_ready: bool = cy_attack_ready(self, worker, target) - ``` - - 1.46 µs ± 5.45 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - - Python alternative: - 5.66 µs ± 21.2 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - - Parameters - ---------- - ai : - Bot object that will be running the game. - unit : - The unit we want to check. - target : - The thing we want to shoot. - - Returns - ------- - bool : - Is the unit ready to attack the target? - - """ - ... - -def cy_is_facing(unit: Unit, other_unit: Unit, angle_error: float = 0.05) -> bool: - """Given a grid of influence, check if the given position is above weight_safety_limit. - - Example: - ```py - from ares.cython_extensions.combat_utils import cy_is_facing - - unit = self.workers[0] - other_unit = self.enemy_units[0] - - is_facing: bool = cy_is_facing(unit, other_unit) - ``` - - 323 ns ± 3.93 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - - Python-sc2's `unit.is_facing(other_unit)` alternative: - 2.94 µs ± 8 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - - Parameters - ---------- - unit : - 2D grid to check with influence. - other_unit : - Position converted to x/y integers. - angle_error : - At what threshold is this position deemed unsafe. - - Returns - ------- - bool : - True if unit is facing other_unit. - - """ - ... - -def cy_is_position_safe( - grid: np.ndarray, position: tuple[int, int], weight_safety_limit: float -) -> bool: - """Given a grid of influence, check if the given position is above weight_safety_limit. - - Example: - ```py - from ares.cython_extensions.combat_utils import cy_is_position_safe - - grid = self.mediator.get_ground_grid - unit = self.workers[0] - - is_safe: bool = cy_is_position_safe(grid, unit.position) - ``` - - 627 ns ± 3.12 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - - Python alternative: - 4.02 µs ± 20.4 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - - Parameters - ---------- - grid : - 2D grid to check with influence. - position : - Position converted to x/y integers. - weight_safety_limit : - At what threshold is this position deemed unsafe. - - Returns - ------- - bool : - This position is safe accoring to weight_safety_limit - - """ - ... - -def cy_pick_enemy_target(enemies: Union[Units, list[Unit]]) -> Unit: - """Pick the best thing to shoot at out of all enemies. - - Example: - ```py - from ares.cython_extensions.combat_utils import cy_pick_enemy_target - - enemies = self.enemy_units - - target = cy_pick_enemy_target(enemies) - ``` - - TODO: If there are multiple units that can be killed, pick the highest value one - Unit parameter to allow for this in the future. - TODO: There might be other things to consider here. - - 70.5 µs ± 818 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each) - - Python alternative: - 115 µs ± 766 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each) - - Parameters - ---------- - enemies : - All enemy units we would like to check. - - Returns - ------- - Unit : - The best unit to target. - """ - ... diff --git a/src/ares/stubs/cython_functions.pyi b/src/ares/stubs/cython_functions.pyi deleted file mode 100644 index 40b3637..0000000 --- a/src/ares/stubs/cython_functions.pyi +++ /dev/null @@ -1,205 +0,0 @@ -"""Functions written in Cython to give better performance than Python. - -Used primarily for numerical tasks and iteration. - -""" - -from typing import List, Set, Tuple, Union - -import numpy as np -from sc2.position import Point2 -from sc2.unit import Unit - -def add_neighbors_to_ignore( - points_to_ignore: List[Union[Point2, Tuple[int, int]]] -) -> Set[Tuple[int, int]]: - """Given a list of points, add each point's neighbors for ease of ignoring. - - Typically used if a tile needs a 3x3 square centered on it to be blocked out - - Parameters - ---------- - points_to_ignore : - List of positions whose neighbors should be returned. - - Returns - ------- - Set[Tuple[int, int]] : - Set of points that neighbor at least one point in `points_to_ignore` - - """ - ... - -def add_units_to_ignore( - units_to_avoid: List[Unit], -) -> Set[Tuple[int, int]]: - """Given a list of units, add each unit's position's neighbors for ease of ignoring. - - Typically used if a unit needs a 3x3 square centered on it to be blocked out - - Parameters - ---------- - units_to_avoid : - List of `Unit`s whose neighboring tiles should be returned - - Returns - ------- - Set of points that neighbor at least one unit in `units_to_avoid` - """ - ... - -def all_points_below_max_value( - grid: np.ndarray, - max_value: float, - points_to_check: List[Union[Point2, Tuple[int, int], List[int]]], -) -> bool: - """Checks whether every point has a value on the grid equal to or below the maximum value. - - Parameters - ---------- - grid : - The grid to check. - max_value : - The highest value that any point in the grid is allowed to have. - points_to_check : - The points in the grid that should be checked. - - Returns - ------- - bool : - True if every point checked has a value equal to or lesser than `max_value`, - False otherwise - - """ - ... - -def all_points_have_value( - grid: np.ndarray, value: int, points: List[Union[List[int], Tuple[int, int]]] -) -> bool: - """Checks whether every point's value on the grid matches the desired value. - - Parameters - ---------- - grid : - The grid to check. - value : - The desired value for each point to have. - points : - The points in the grid that should be checked. - - Returns - ------- - bool : - True if every point checked has the desired value, False otherwise. - - """ - ... - -def get_bounding_box( - coordinates: set[Union[Point2, List[float], Tuple[float, float]]] -) -> Tuple[Tuple[float, float], Tuple[float, float]]: - """Given a list of coordinates, find a rectangle such that all points are contained in it. - - The rectangle will have its sides parallel to the respective vertical and - horizontal axes. - - Parameters - ---------- - coordinates : - List of coordinates the box should be formed around. - - Returns - ------- - Tuple[Tuple[float, float], Tuple[float, float]] : - A tuple of tuples containing ((xmin, xmax), (ymin, ymax)) - - """ - ... - -def get_neighbors8( - point: Union[Point2, List[float], Tuple[float, float]] -) -> Set[Tuple[float, float]]: - """Get the 8 neighboring tiles of a single point. - - Parameters - ---------- - point : - The point to get the neighbors of - - Returns - ------- - Set[Tuple[float, float]] : - Set of the 8 tiles that are adjacent to the given point. - - """ - ... - -def last_index_with_value( - grid: np.ndarray, value: int, points: List[Union[List[int], Tuple[int, int]]] -) -> int: - """Finds the index of the last point in `points` where `grid[point] == value` - - Iterates over `points`, stopping as soon as a value doesn't match. - - Parameters - ---------- - grid : - Grid to check the value of points in - value : - What value the points in the grid should have - points : - Which points should be checked in the grid - - Returns - ------- - int : - The index of the last point that has the desired value. Returns -1 if points is - empty or the first value doesn't match. - - """ - ... - -def points_with_value( - grid: np.ndarray, value: int, points: List[Tuple[int, int]] -) -> List[Tuple[int, int]]: - """Return all points from a grid that match a given value. - - Parameters - ---------- - grid : - The grid to check - value : - The desired value for points to have in the grid. - points : - Which points to check. - - Returns - ------- - List[Tuple[int, int]] : - List of points from `points` that have the desired value. - - """ - ... - -def translate_point_along_line( - point: Tuple[float, float], a_value: float, distance: float -) -> Tuple[float, float]: - """Given a point and slope of a line, translate the point along the line with the - given slope. - - Parameters - ---------- - point : - The point to translate - a_value : - A in the equation Ax + y = C (representing the line to translate along) - distance : - How far to translate the point - - Returns - ------- - Tuple[float, float] : - The translated point - - """ - ... diff --git a/src/ares/stubs/flood_fill.pyi b/src/ares/stubs/flood_fill.pyi deleted file mode 100644 index 8fc00b3..0000000 --- a/src/ares/stubs/flood_fill.pyi +++ /dev/null @@ -1,32 +0,0 @@ -import numpy as np -from sc2.position import Point2 - -def flood_fill_grid( - start_point: Point2, - terrain_grid: np.ndarray, - pathing_grid: np.ndarray, - max_distance: int, - choke_points: set[Point2], -) -> set[tuple[int, int]]: - """ - Given a point, flood fill outward from it and return the valid points. Does not continue through chokes. - - Parameters - ---------- - start_point : - Start flood fill outwards from this point. - terrain_grid : - Terrain grid from python-sc2, make sure this is transposed. - pathing_grid : - Pathing grid from MapAnalyzer - python-sc2 pathing grid may work, but doesn't include rocks etc - max_distance : - Distance from start point before finishing the algorithm. - choke_points : - Set of choke points to prevent the flood fill spreading through. - - Returns - ------- - Set of points that are filled in - """ - ... diff --git a/src/ares/stubs/general_utils.pyi b/src/ares/stubs/general_utils.pyi deleted file mode 100644 index 66a34f6..0000000 --- a/src/ares/stubs/general_utils.pyi +++ /dev/null @@ -1,84 +0,0 @@ -from typing import TYPE_CHECKING, Union - -import numpy as np -from sc2.ids.unit_typeid import UnitTypeId as UnitID -from sc2.position import Point2 -from sc2.unit import Unit -from sc2.units import Units - -if TYPE_CHECKING: - from ares import AresBot - -def cy_pylon_matrix_covers( - position: Union[Point2, tuple[float, float]], - pylons: Union[Units, list[Unit]], - height_grid: np.ndarray, - pylon_build_progress: float, -) -> bool: - """Check if a position is powered by a pylon. - - 1.85 µs ± 8.72 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - - Example: - ```py - from ares.cython_functions.general_utils import cy_pylon_matrix_covers - - # check if start location is powered by pylon - position = self.start_location - - can_place_structure_here: bool = cy_pylon_matrix_covers( - position, - self.structures(UnitTypeId.PYLON), - self.game_info.terrain_height.data_numpy - ) - ``` - - Parameters - ---------- - position : - Position to check for power. - pylons : - The pylons we want to check. - height_grid : - Height grid supplied from `python-sc2` as a numpy array. - pylon_build_progress : Optional (default=1.0) - If less than 1.0, check near pending pylons. - - Returns - ------- - bool : - True if `position` has power. - """ - -def cy_unit_pending(ai: "AresBot", unit_type: UnitID) -> int: - """Check how many unit_type are pending. - - Faster unit specific alternative to `python-sc2`'s `already_pending` - - Example: - ```py - from ares.cython_functions.general_utils import cy_unit_pending - from sc2.ids.unit_typeid import UnitTypeId - - num_marines_pending: int = cy_unit_pending(UnitTypeId.MARINE) - ``` - - 453 ns ± 9.35 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - - Python-sc2 `already_pending` alternative: - 2.82 µs ± 29 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - - Parameters - ---------- - ai : - Bot object that will be running the game. - unit_type : - Unit type we want to check. - - Returns - ------- - int : - How many unit_type are currently building. - - """ - ... diff --git a/src/ares/stubs/geometry.pyi b/src/ares/stubs/geometry.pyi deleted file mode 100644 index 613c257..0000000 --- a/src/ares/stubs/geometry.pyi +++ /dev/null @@ -1,86 +0,0 @@ -from typing import Union - -from sc2.position import Point2 - -def cy_distance_to( - p1: Union[Point2, tuple[float, float]], p2: Union[Point2, tuple[float, float]] -) -> float: - """Check distance between two Point2 positions. - - Example: - ```py - from ares.cython_functions.geometry import cy_distance_to - - dist: float = cy_distance_to(self.start_location, self.game_info.map_center) - ``` - - cy_distance_to(Point2, Point2) - 157 ns ± 2.69 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each) - - cy_distance_to(unit1.position, unit2.position) - 219 ns ± 10.5 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - - Python alternative: - - Point1.distance_to(Point2) - 386 ns ± 2.71 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - unit1.distance_to(unit2) - 583 ns ± 7.89 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) - - Parameters - ---------- - p1 : - p2 : - - Returns - ------- - float : - - """ - ... - -def cy_towards( - start_pos: Point2, target_pos: Point2, distance: float -) -> tuple[float, float]: - """Get position from start_pos towards target_pos based on distance. - - Example: - ```py - from ares.cython_functions.geometry import cy_towards - - new_pos: Tuple[float, float] = cy_towards( - self.start_location, - self.game_info.map_center, - 12.0 - ) - ``` - - Note: For performance reasons this returns the point2 as a tuple, if a - python-sc2 Point2 is required it's up to the user to convert it. - Example: - `new_pos: Point2 = Point2(cy_towards(self.start_location, self.enemy_start_locations, 10.0))` - - Though for best performance it is recommended to simply work with the tuple if possible: - `new_pos: tuple[float, float] = cy_towards(self.start_location, self.enemy_start_locations, 10.0)` - - 191 ns ± 0.855 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each) - - Python-sc2's `start_pos.towards(target_pos, distance)` alternative: - 2.73 µs ± 18.9 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - - - Parameters - ---------- - start_pos : - Start from this 2D position. - target_pos : - Go towards this 2D position. - distance : - How far we go towards target_pos. - - Returns - ------- - tuple[float, float] : - - """ - ... diff --git a/src/ares/stubs/placement_solver.pyi b/src/ares/stubs/placement_solver.pyi deleted file mode 100644 index f7db933..0000000 --- a/src/ares/stubs/placement_solver.pyi +++ /dev/null @@ -1,66 +0,0 @@ -import numpy as np - -def can_place_structure( - building_origin: tuple[int, int], - building_size: tuple[int, int], - creep_grid: np.ndarray, - placement_grid: np.ndarray, - pathing_grid: np.ndarray, - avoid_creep: bool, - include_addon: bool, -) -> bool: - """Simulate whether a structure can be placed at `building_origin` - - Parameters - ---------- - building_origin - building_size - creep_grid - placement_grid - pathing_grid - avoid_creep - include_addon - - Returns - ------- - - """ - ... - -def find_building_locations( - kernel: np.ndarray, - x_stride: int, - y_stride: int, - x_bounds: tuple[float, float], - y_bounds: tuple[float, float], - creep_grid: np.ndarray, - placement_grid: np.ndarray, - pathing_grid: np.ndarray, - points_to_avoid_grid: np.ndarray, - building_width: int, - building_height: int, - avoid_creep: bool, -) -> list[tuple[int, int]]: - """Use convolution to find building placements in an area. - Used by `placement_manager` - - Parameters - ---------- - kernel - x_stride - y_stride - x_bounds - y_bounds - creep_grid - placement_grid - pathing_grid - points_to_avoid_grid - building_width - building_height - avoid_creep - - Returns - ------- - - """ - ... diff --git a/src/ares/stubs/units_utils.pyi b/src/ares/stubs/units_utils.pyi deleted file mode 100644 index 8bc2387..0000000 --- a/src/ares/stubs/units_utils.pyi +++ /dev/null @@ -1,184 +0,0 @@ -from typing import Union - -import numpy as np -from sc2.position import Point2 -from sc2.unit import Unit -from sc2.units import Units - -def cy_center(units: Union[Units, list[Unit]]) -> tuple[float, float]: - """ - 54.2 µs ± 137 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each) - - `python-sc2`'s `units.center` alternative: - 107 µs ± 255 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each) - - Example: - ```py - from ares.cython_functions.units_utils import cy_center - - centroid: Tuple[float, float] = cy_center(self.workers) - - # centroid_point2 = Point2(centroid) - ``` - - Parameters - ---------- - units : - - Returns - ------- - tuple[float, float] : - Centroid of all units positions - """ - ... - -def cy_closest_to( - position: Union[Point2, tuple[float, float]], units: Union[Units, list[Unit]] -) -> Unit: - """Iterate through `units` to find closest to `position`. - - Example: - ```py - from ares.cython_functions.units_utils import cy_closest_to - - closest_unit = cy_closest_to(self.start_location, self.workers) - ``` - - 14.3 µs ± 135 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - - python-sc2's `units.closest_to()` alternative: - 98.9 µs ± 240 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each) - If using `units.closest_to(Point2): - 200 µs ± 1.02 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each) - - Parameters - ---------- - position : - Position to measure distance from. - units : - Collection of units we want to check. - - Returns - ------- - Unit : - Unit closest to `position`. - - """ - ... - -def cy_in_attack_range( - unit: Unit, units: Union[Units, list[Unit]], bonus_distance: float = 0.0 -) -> list[Unit]: - """Find all units that unit can shoot at. - - Doesn't check if the unit weapon is ready. See: - `ares.cython_functions.combat_utils.attack_ready` - - Example: - ```py - from ares.cython_functions.units_utils import cy_in_attack_range - - in_attack_range = cy_in_attack_range(self.workers[0], self.enemy_units) - ``` - - 7.28 µs ± 26.3 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) - - python-sc2's `units.in_attack_range_of(unit)` alternative: - 30.4 µs ± 271 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each) - - Parameters - ---------- - unit : - Position to measure distance from. - units : - Collection of units we want to check. - bonus_distance : - - Returns - ------- - list[Unit] : - Units that are in attack range of `unit`. - - """ - ... - -def group_by_spatial( - ai: "AresBot", units: "Units", distance: float = 0.5, min_samples: int = 1 -) -> tuple[list["Units"], set[int]]: - """Use DBSCAN to group units. Returns grouped units and the tags of units that - were not placed in a group. - - Example: - ```py - from ares.cython_functions.units_utils import group_by_spatial - - groups: List[Units] # list of Units where each item is a group - ungrouped_tags: Set[int] # tags of units not in a group - groups, ungrouped_tags = group_by_spatial( - self, self.workers, distance=3, min_samples=4) - ``` - - Warning: - Do not spam this function - - See https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html - for additional information on distance and min_samples. - - 1.25 ms ± 6.92 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each) - (DBSCAN takes up most of this time) - - Parameters - ---------- - ai : - Bot object used for creating `Units` objects - units : - Units to form groups from - distance : - DBSCAN eps (essentially the maximum distance between units for them to be - considered as part of the same group) - min_samples : - DBSCAN min_samples (essentially the number of other units that need to be - around a unit for that unit to start forming a group) - - Returns - ------- - Tuple[List["Units"], Set[int]] : - Tuple of: - List of `Units` objects representing the groups formed - Set of tags of the `Unit`s that were not placed into a group - - """ - ... - -def cy_sorted_by_distance_to( - units: Union[Units, list[Unit]], position: Point2, reverse: bool = False -) -> list[Unit]: - """Sort units by distance to `position` - - Example: - ```py - from ares.cython_functions.units_utils import cy_sorted_by_distance_to - - sorted_by_distance = cy_sorted_by_distance_to(self.workers, self.start_location) - ``` - - 33.7 µs ± 190 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each) - - python-sc2's `units.sorted_by_distance_to(position)` alternative: - 246 µs ± 830 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each) - - Parameters - ---------- - units : - Units we want to sort. - position : - Sort by distance to this position. - reverse : - Not currently used. - Returns - ------- - list[Unit] : - Units sorted by distance to position. - - """ - ...