From c15804215e9c79912c9c2c23ab1ce4e180a8b70e Mon Sep 17 00:00:00 2001 From: Mike A Date: Sun, 11 Feb 2024 15:41:24 +0100 Subject: [PATCH 01/14] Initial proper documentation --- docs/conf.py | 9 ++- docs/getstarted/account.md | 5 ++ docs/getstarted/index.md | 10 ++++ docs/index.md | 33 ++++++++++ docs/index.rst | 18 ------ docs/technical/1-Network.md | 2 + docs/technical/index.md | 17 ++++++ poetry.lock | 116 +++++++++++++++++++++++++++++++++++- pyproject.toml | 2 + 9 files changed, 191 insertions(+), 21 deletions(-) create mode 100644 docs/getstarted/account.md create mode 100644 docs/getstarted/index.md create mode 100644 docs/index.md delete mode 100644 docs/index.rst create mode 100644 docs/technical/1-Network.md create mode 100644 docs/technical/index.md diff --git a/docs/conf.py b/docs/conf.py index 81edb15..c2231c5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,13 +14,18 @@ release = "0.2.1" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = ["sphinx.ext.duration", "autoapi.extension"] +extensions = [ + "myst_parser", + "sphinx.ext.duration", + "autoapi.extension" +] templates_path = ["_templates"] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # -- AutoAPI Options --------------------------------------------------------- autoapi_dirs = ["../findmy/"] +autoapi_add_toctree_entry = False autoapi_options = [ "members", "undoc-members", @@ -33,5 +38,5 @@ autoapi_options = [ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = "alabaster" +html_theme = "furo" html_static_path = ["_static"] diff --git a/docs/getstarted/account.md b/docs/getstarted/account.md new file mode 100644 index 0000000..2835f0b --- /dev/null +++ b/docs/getstarted/account.md @@ -0,0 +1,5 @@ +# Logging in + +Some useful features of this library require an active login session with Apple in order to work correctly. +That's because the remote endpoints require authentication to actually retrieve data. +This page will guide you through the steps needed to log into an Apple account using FindMy.py. diff --git a/docs/getstarted/index.md b/docs/getstarted/index.md new file mode 100644 index 0000000..60bc24b --- /dev/null +++ b/docs/getstarted/index.md @@ -0,0 +1,10 @@ +# Getting Started + +* * * + +```{toctree} +:maxdepth: 1 +:glob: + +* +``` \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..3cbf821 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,33 @@ +# FindMy.py + += 🍏 + 🎯 + 🐍! + +FindMy.py is a Python library aiming to provide everything you need +to interact with **Apple's FindMy Network**. +Its primary aims are feature completeness, reliability and elegant API design. +It abstracts all the heavy lifting away, while keeping the control flow in your hands. + +## Jump To + +[//]: # (This is hidden to prevent it from showing on the home page) +```{toctree} +:hidden: + +Home +``` + +[//]: # (Documentation can be expanded to maxdepth 2) +```{toctree} +:maxdepth: 2 + +getstarted/index +technical/index +``` + +[//]: # (Show these with a maxdepth of 1) +```{toctree} +:maxdepth: 1 + +API Reference +genindex +``` diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 6adf9ee..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -.. FindMy.py documentation master file, created by - sphinx-quickstart on Tue Jan 2 21:16:55 2024. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to FindMy.py's documentation! -===================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/technical/1-Network.md b/docs/technical/1-Network.md new file mode 100644 index 0000000..3c2ff43 --- /dev/null +++ b/docs/technical/1-Network.md @@ -0,0 +1,2 @@ +# Overview of the Network + diff --git a/docs/technical/index.md b/docs/technical/index.md new file mode 100644 index 0000000..3f48b28 --- /dev/null +++ b/docs/technical/index.md @@ -0,0 +1,17 @@ +# Technical Documentation + +This category serves as a place to provide technical documentation about the Find My network. +More specifically, it serves as a technical reference for how certain features in this +library have been implemented. + +Most of the knowledge in this section has been sourced from other genius minds. +Make sure to check out the references section on the specific pages to read more about the topics. + +* * * + +```{toctree} +:maxdepth: 1 +:glob: + +* +``` diff --git a/poetry.lock b/poetry.lock index c78d880..3dd32d3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -675,6 +675,23 @@ files = [ {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] +[[package]] +name = "furo" +version = "2024.1.29" +description = "A clean customisable Sphinx documentation theme." +optional = false +python-versions = ">=3.8" +files = [ + {file = "furo-2024.1.29-py3-none-any.whl", hash = "sha256:3548be2cef45a32f8cdc0272d415fcb3e5fa6a0eb4ddfe21df3ecf1fe45a13cf"}, + {file = "furo-2024.1.29.tar.gz", hash = "sha256:4d6b2fe3f10a6e36eb9cc24c1e7beb38d7a23fc7b3c382867503b7fcac8a1e02"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +pygments = ">=2.7" +sphinx = ">=6.0,<8.0" +sphinx-basic-ng = "*" + [[package]] name = "identify" version = "2.5.33" @@ -747,6 +764,30 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.1.5" @@ -816,6 +857,36 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "mdit-py-plugins" +version = "0.4.0" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "multidict" version = "6.0.5" @@ -915,6 +986,32 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] +[[package]] +name = "myst-parser" +version = "2.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +optional = false +python-versions = ">=3.8" +files = [ + {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, + {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, +] + +[package.dependencies] +docutils = ">=0.16,<0.21" +jinja2 = "*" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" +pyyaml = "*" +sphinx = ">=6,<8" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] + [[package]] name = "nodeenv" version = "1.8.0" @@ -1280,6 +1377,23 @@ sphinx = ">=6.1.0" [package.extras] docs = ["furo", "sphinx", "sphinx-design"] +[[package]] +name = "sphinx-basic-ng" +version = "1.0.0b2" +description = "A modern skeleton for Sphinx themes." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"}, + {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"}, +] + +[package.dependencies] +sphinx = ">=4.0" + +[package.extras] +docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] + [[package]] name = "sphinxcontrib-applehelp" version = "1.0.8" @@ -1778,4 +1892,4 @@ scan = ["bleak"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "696a56ccbba231e3ec702aaee911977819b996d21074b37807c42a45d107c7ab" +content-hash = "ac0ef4ca30b86c4ef5b45db550b69e6ef85203e9c667cc5002ae8998cd05edd6" diff --git a/pyproject.toml b/pyproject.toml index 02c3e8e..773b4b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,8 @@ pre-commit = "^3.6.0" sphinx = "^7.2.6" sphinx-autoapi = "^3.0.0" pyright = "^1.1.350" +furo = "^2024.1.29" +myst-parser = "^2.0.0" [tool.pyright] venvPath = "." From 3a80044825995f14b2395a481f7e42fbd0040ab3 Mon Sep 17 00:00:00 2001 From: Mike A Date: Sat, 17 Feb 2024 21:15:59 +0100 Subject: [PATCH 02/14] Add inheritance diagrams --- docs/conf.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index c2231c5..b93a27a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,6 +17,8 @@ release = "0.2.1" extensions = [ "myst_parser", "sphinx.ext.duration", + "sphinx.ext.autodoc", + "sphinx.ext.inheritance_diagram", "autoapi.extension" ] @@ -30,6 +32,7 @@ autoapi_options = [ "members", "undoc-members", "show-inheritance", + "show-inheritance-diagram", "show-module-summary", "special-members", "imported-members", From 57b1ebd43c18795a2df3b3c6029c78e4eec31cf2 Mon Sep 17 00:00:00 2001 From: Mike A Date: Fri, 23 Feb 2024 14:38:39 +0100 Subject: [PATCH 03/14] feat(docs): Add network overview --- docs/getstarted/account.md | 5 ---- docs/technical/1-Network.md | 41 +++++++++++++++++++++++++- docs/technical/dependency_diagram.png | Bin 0 -> 33298 bytes 3 files changed, 40 insertions(+), 6 deletions(-) delete mode 100644 docs/getstarted/account.md create mode 100644 docs/technical/dependency_diagram.png diff --git a/docs/getstarted/account.md b/docs/getstarted/account.md deleted file mode 100644 index 2835f0b..0000000 --- a/docs/getstarted/account.md +++ /dev/null @@ -1,5 +0,0 @@ -# Logging in - -Some useful features of this library require an active login session with Apple in order to work correctly. -That's because the remote endpoints require authentication to actually retrieve data. -This page will guide you through the steps needed to log into an Apple account using FindMy.py. diff --git a/docs/technical/1-Network.md b/docs/technical/1-Network.md index 3c2ff43..1de4d8c 100644 --- a/docs/technical/1-Network.md +++ b/docs/technical/1-Network.md @@ -1,2 +1,41 @@ -# Overview of the Network +# The Network +This page aims to provide an overview of how the Find My-network works on a technical level. +It does this by explaining in detail what data the tags are broadcasting, how this is picked up +by surrounding iDevices, and how generated location reports can be retrieved. + +```{note} +While official AirTags (and compatible 3rd party tags) use the same principles as described +in this document, they also offer a key rotation feature. To learn more about +how this works, please check out the dedicated [AirTags](#10-AirTags) page. +``` + +## Overview + +Simply said, the FindMy-network works by having accessories such as AirTags broadcast a unique signal over bluetooth. +Any nearby iDevice, such as iPhones or iPads, are able to receive this signal. Once the device is aware of the nearby +accessory, it will upload its current location to Apple's servers, from where it can be retrieved by the owner of the accessory. + +Apple has put a lot of effort into making the network as private as possible. By utilizing encryption, +it is possible for finder devices to encrypt their location with a key that the accessory is broadcasting +before sending it to Apple. This public key allows encryption of certain data, but not decryption. In order +to download location reports for the accessory, we therefore need the private key corresponding to said public key. +These keys, together called a key pair, were generated and exchanged when the accessory was first paired and are now +stored on the owner's devices. By downloading the correct encrypted location reports and then locally decrypting +said reports using the private key, users are able to track their devices without Apple ever being able to read the location. + +![](https://github.com/seemoo-lab/openhaystack/raw/main/Resources/FindMyOverview.png) + +*An overview of the FindMy-network. Source: [SEEMOO-LAB](https://www.petsymposium.org/2021/files/papers/issue3/popets-2021-0045.pdf)*. + +Fetching (encrypted) location reports still requires an Apple account. It is worth noting however, that anyone can download +anyone else's location reports for any of their devices; however, due to the encryption scheme discussed above, +doing this would be rather useless as none of the retrieved reports could be decrypted. This scheme allows devices +to operate without being linked to a specific Apple account. The below dependency diagram visually explains how this entire +system hinges on the availability of the private key; without it, location reports could not be retrieved and decrypted. + + +![](dependency_diagram.png) + +*A dependency diagram of data in the network. An arrow pointing from A to B means that in order +to retrieve B, we first require A.* diff --git a/docs/technical/dependency_diagram.png b/docs/technical/dependency_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..506f5d0acb100aaab7dc75d4e40b795ae1c8b462 GIT binary patch literal 33298 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 literal 0 HcmV?d00001 From e2043eb910ccf0c6b4b7ed3dedd35cd9853fe01b Mon Sep 17 00:00:00 2001 From: Mike A Date: Fri, 23 Feb 2024 14:39:21 +0100 Subject: [PATCH 04/14] feat(docs): Initial getting started page --- docs/getstarted/1-account.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docs/getstarted/1-account.md diff --git a/docs/getstarted/1-account.md b/docs/getstarted/1-account.md new file mode 100644 index 0000000..8bfec34 --- /dev/null +++ b/docs/getstarted/1-account.md @@ -0,0 +1,7 @@ +# Logging in + +Some useful features of this library require an active login session with Apple in order to work correctly. +The reason for this is that the remote endpoints require authentication to actually retrieve data. +This page will guide you through the steps needed to log into an Apple account using FindMy.py. + + From 0c835e80846a41f3e866e53fba60a5c4aef359b6 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Tue, 3 Sep 2024 22:11:38 +0200 Subject: [PATCH 05/14] chore: Update dependencies --- poetry.lock | 977 +++++++++++++++++++++++++++------------------------- 1 file changed, 500 insertions(+), 477 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2372b2d..b10c188 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,91 +1,118 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "aiohappyeyeballs" +version = "2.4.0" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, + {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, +] + [[package]] name = "aiohttp" -version = "3.9.5" +version = "3.10.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, - {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, - {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, - {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, - {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, - {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, - {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, - {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, - {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, - {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, + {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, + {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, + {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, + {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, + {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, + {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, + {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, + {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, + {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, + {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, + {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, + {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, + {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, ] [package.dependencies] +aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" @@ -94,7 +121,7 @@ multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "brotlicffi"] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" @@ -123,13 +150,13 @@ files = [ [[package]] name = "astroid" -version = "3.1.0" +version = "3.3.2" description = "An abstract syntax tree for Python with inference support." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, - {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, + {file = "astroid-3.3.2-py3-none-any.whl", hash = "sha256:9f8136ce9770e0f912401b25a0f15d5c2ec20b50e99b1b413ac0778fe53ff6f1"}, + {file = "astroid-3.3.2.tar.gz", hash = "sha256:99e9b5b602cbb005434084309213d6af32bf7a9b743c836749168b8e2b330cbd"}, ] [package.dependencies] @@ -148,32 +175,32 @@ files = [ [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "babel" -version = "2.14.0" +version = "2.16.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, - {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] @@ -250,74 +277,89 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [package.dependencies] @@ -446,43 +488,38 @@ files = [ [[package]] name = "cryptography" -version = "42.0.5" +version = "43.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, + {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] [package.dependencies] @@ -495,50 +532,48 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "dbus-fast" -version = "2.21.1" +version = "2.24.0" description = "A faster version of dbus-next" optional = false -python-versions = ">=3.7,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "dbus_fast-2.21.1-cp310-cp310-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:b04b88be594dad81b33f6770283eed2125763632515c5112f8aa30f259cd334c"}, - {file = "dbus_fast-2.21.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7333896544a4d0a3d708bd092f8c05eb3599dc2b34ae6e4c4b44d04d5514b0ec"}, - {file = "dbus_fast-2.21.1-cp310-cp310-manylinux_2_31_x86_64.whl", hash = "sha256:4591e0962c272d42d305ab3fb8889f13d47255e412fd3b9839620836662c91fe"}, - {file = "dbus_fast-2.21.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:52641305461660c8969c6bb12364206a108c5c9e014c9220c70b99c4f48b6750"}, - {file = "dbus_fast-2.21.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:237db4ab0b90e5284ea7659264630d693273cdbda323a40368f320869bf6470f"}, - {file = "dbus_fast-2.21.1-cp311-cp311-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:999fed45cb391126107b804be0e344e75556fceaee4cc30a0ca06d77309bdf3c"}, - {file = "dbus_fast-2.21.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2309b9cafba799e9d343fdfdd5ae46276adf3929fef60f296f23b97ed1aa2f6"}, - {file = "dbus_fast-2.21.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b7d1f35218549762e52a782c0b548e0681332beee773d3dfffe2efc38b2ee960"}, - {file = "dbus_fast-2.21.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47aa28520fe274414b655c74cbe2e91d8b76e22f40cd41a758bb6975e526827b"}, - {file = "dbus_fast-2.21.1-cp312-cp312-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:0ff6c72bcd6539d798015bda33c7ce35c7de76276b9bd45e48db13672713521a"}, - {file = "dbus_fast-2.21.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d8cd43b3799e766158f1bb0b27cc4eef685fd892417b0382b7fdfdd94f1e6c"}, - {file = "dbus_fast-2.21.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d4da8d58064f0a3dd07bfc283ba912b9d5a4cb38f1c0fcd9ecb2b9d43111243c"}, - {file = "dbus_fast-2.21.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:66e160f496ac79248feb09a0acf4aab5d139d823330cbd9377f6e19ae007330a"}, - {file = "dbus_fast-2.21.1-cp37-cp37m-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:670b5c4d78c9c2d25e7ba650d212d98bf24d40292f91fe4e2f3ad4f80dc6d7e5"}, - {file = "dbus_fast-2.21.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15d62adfab7c6f4a491085f53f9634d24745ca5a2772549945b7e2de27c0d534"}, - {file = "dbus_fast-2.21.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:54e8771e31ee1deb01feef2475c12123cab770c371ecc97af98eb6ca10a2858e"}, - {file = "dbus_fast-2.21.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2db4d0d60a891a8b20a4c6de68a088efe73b29ab4a5949fe6aad2713c131e174"}, - {file = "dbus_fast-2.21.1-cp38-cp38-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:65e76b20099c33352d5e7734a219982858873cf66fe510951d9bd27cb690190f"}, - {file = "dbus_fast-2.21.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:927f294b1dc7cea9372ef8c7c46ebeb5c7e6c1c7345358f952e7499bdbdf7eb4"}, - {file = "dbus_fast-2.21.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9e9a43ea42b8a9f2c62ca50ce05582de7b4f1f7eb27091f904578c29124af246"}, - {file = "dbus_fast-2.21.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:78c84ecf19459571784fd6a8ad8b3e9006cf96c3282e8220bc49098866ef4cc7"}, - {file = "dbus_fast-2.21.1-cp39-cp39-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:a5b3895ea12c4e636dfaacf75fa5bd1e8450b2ffb97507520991eaf1989d102e"}, - {file = "dbus_fast-2.21.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85be33bb04e918833ac6f28f68f83a1e83425eb6e08b9c482cc3318820dfd55f"}, - {file = "dbus_fast-2.21.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:13ab6a0f64d345cb42c489239962261f724bd441458bef245b39828ed94ea6f4"}, - {file = "dbus_fast-2.21.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c585e7a94bb723a70b4966677b882be8bda324cc41bd129765e3ceab428889bb"}, - {file = "dbus_fast-2.21.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:62331ee3871f6881f517ca65ae185fb2462a0bf2fe78acc4a4d621fc4da08396"}, - {file = "dbus_fast-2.21.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbfd6892fa092cbd6f52edcb24797af62fba8baa50995db856b0a342184c850d"}, - {file = "dbus_fast-2.21.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:a999e35628988ad4f81af36192cd592b8fd1e72e1bbc76a64d80808e6f4b9540"}, - {file = "dbus_fast-2.21.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cae9a6b9bb54f3f89424fdd960b60ac53239b9e5d4a5d9a598d222fbf8d3173"}, - {file = "dbus_fast-2.21.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:39a3f3662391b49553bf9d9d2e9a6cb31e0d7d337557ee0c0be5c558a3c7d230"}, - {file = "dbus_fast-2.21.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffc2b6beb212d0d231816dcb7bd8bcdafccd04750ba8f5e915f40ad312f5adf2"}, - {file = "dbus_fast-2.21.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:c938eb7130067ca3b74b248ee376228776d8f013a206ae78e6fc644c9db0f4f5"}, - {file = "dbus_fast-2.21.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fae9609d972f0c2b72017796a8140b8a6fb842426f0aed4f43f0fa7d780a16f"}, - {file = "dbus_fast-2.21.1.tar.gz", hash = "sha256:87b852d2005f1d59399ca51c5f3538f28a4742d739d7abe82b7ae8d01d8a5d02"}, + {file = "dbus_fast-2.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0f69c272ef1376b5f3a8c899b6aa34d72a568935f90ac269abdf4a74241b57b"}, + {file = "dbus_fast-2.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:014441b49e250f5709b9e43dbdd3fee680edf2d2b50d934ef6ffe1814d16457d"}, + {file = "dbus_fast-2.24.0-cp310-cp310-manylinux_2_31_x86_64.whl", hash = "sha256:1516eef9726da1de870adaad690ed4b2dc45d2c7e3926e07abb3ac5309fd04e2"}, + {file = "dbus_fast-2.24.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aaf255b28b18c1b3caef03a1e3c66716ed23a4fc3e153ccdc8a0558c1078b257"}, + {file = "dbus_fast-2.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:884b09ee6034fae49dde65fd2d2575d1876ff96e893a877778be86417922f139"}, + {file = "dbus_fast-2.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87ed7661e38457789c8d7f10b067c83267b0610c0de39896bec2ff083a2e0047"}, + {file = "dbus_fast-2.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb5116858e01dcad2326f0519bb805c71da93e0c47ad8a0cfa3730b72de9a79"}, + {file = "dbus_fast-2.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7be081fd6c1a78fd12a98c6ee47fc2d7437e85f800b037cde189beabf5067a71"}, + {file = "dbus_fast-2.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3acc7893804d1ca9d438df9742e08b45a9f6e70924e2f706378742f766570191"}, + {file = "dbus_fast-2.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1bc8a95cc83556b0e12469ad7c14830419ab3a8bdb1f6ff2a0844c3d0558740"}, + {file = "dbus_fast-2.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e19be18299601f04510bac045172aee53fc04f027f58ee5ade960ef58f8bd716"}, + {file = "dbus_fast-2.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f7f45957f3f705d52b586677a44e16a7338e7ac72d616a06048a73755e11553"}, + {file = "dbus_fast-2.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aec31051f632898b12f4ad0841fc89b32ef7918ee0590a7ff31c729660bc4262"}, + {file = "dbus_fast-2.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d14686d9709924888735c88f941c7c4fba95672abd658c050ba6dfd21ce3ea92"}, + {file = "dbus_fast-2.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3697fbf642ea0d36cd8907e6b5a28c336b45e08710e42d96f32a0e881ed3111c"}, + {file = "dbus_fast-2.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:11f69848d86d5f68e4efcf7e40d1c2f1de912b5d8ca0a76ebe4e20e68e6603f8"}, + {file = "dbus_fast-2.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d5d630c165148c76daef056a5443daacf9c0eabcc28e67d5e9951d5a1a7504"}, + {file = "dbus_fast-2.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aac69b8e0b3f3b918e06a3448c2b40c8868bddfa715dfaf7f5bbde4d76783f6"}, + {file = "dbus_fast-2.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90ce8cc1f99da1fac661fda7ae76afc3373d1afb709a8f1c525ddd38c63f7c4c"}, + {file = "dbus_fast-2.24.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:81621cbd5a172cdfe3649032405e5bfeeb8dafef114bbc48949563d56a082a8b"}, + {file = "dbus_fast-2.24.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fcd754fd6cca77fb73815f7ca4d8ae14b72aacdfb027359adfb9ab03e21615ab"}, + {file = "dbus_fast-2.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84ac47e47ee88f80e28004722b3a0398777309c47cb0cd502e8db6afdd836fa6"}, + {file = "dbus_fast-2.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4065c11993e70c0cae849b2045862b6f221f3d81074488b22257aa898b04c803"}, + {file = "dbus_fast-2.24.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c291dbbd3920f4ff4a3051e82d107489cabdb5725c57638b379db74b631b016d"}, + {file = "dbus_fast-2.24.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:637fa5db4c6c0916cd9b08ba31a59688bd61ff5f796c20ab6801eefb1d9ac712"}, + {file = "dbus_fast-2.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48869b2eafdcb62d0344e1ed93c97e4a55e981c399dfd9feb3874ebd461feba7"}, + {file = "dbus_fast-2.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a2290482d5b5723d0008ba422c0270d6ba7ca28440acfc5bcb96b4da28a21b7"}, + {file = "dbus_fast-2.24.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:415c5e0673d219cd2254c3d261ca90f4fe0ebc618ab9735b994365387d83f94c"}, + {file = "dbus_fast-2.24.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e33f70bf79fe431d7914981ef7792041306675877611c898a1da3a87089fc2de"}, + {file = "dbus_fast-2.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10c8046391cce8e04f5c6be328743d32614c8c3b59ed2878f7b1edc55ac1c473"}, + {file = "dbus_fast-2.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04269b8301944b320a40b08909db26d719d35f5ed5d2f05947436428a1bab99"}, + {file = "dbus_fast-2.24.0.tar.gz", hash = "sha256:72b59c51e882300fd7f6d5bec8fb84ae8dea58040ade1d15c62c7fd9fa546f35"}, ] [[package]] @@ -579,18 +614,18 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.13.4" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, - {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -681,30 +716,30 @@ files = [ [[package]] name = "furo" -version = "2024.1.29" +version = "2024.8.6" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.8" files = [ - {file = "furo-2024.1.29-py3-none-any.whl", hash = "sha256:3548be2cef45a32f8cdc0272d415fcb3e5fa6a0eb4ddfe21df3ecf1fe45a13cf"}, - {file = "furo-2024.1.29.tar.gz", hash = "sha256:4d6b2fe3f10a6e36eb9cc24c1e7beb38d7a23fc7b3c382867503b7fcac8a1e02"}, + {file = "furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c"}, + {file = "furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01"}, ] [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" -sphinx = ">=6.0,<8.0" -sphinx-basic-ng = "*" +sphinx = ">=6.0,<9.0" +sphinx-basic-ng = ">=1.0.0.beta2" [[package]] name = "identify" -version = "2.5.36" +version = "2.6.0" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, ] [package.extras] @@ -712,13 +747,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.7" +version = "3.8" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, ] [[package]] @@ -734,22 +769,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.4.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, + {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -764,13 +799,13 @@ files = [ [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -874,13 +909,13 @@ files = [ [[package]] name = "mdit-py-plugins" -version = "0.4.0" +version = "0.4.1" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, - {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, + {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, + {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, ] [package.dependencies] @@ -1029,18 +1064,15 @@ testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4, [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "packaging" version = "24.1" @@ -1054,13 +1086,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.1" +version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, - {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] @@ -1114,17 +1146,16 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -1245,73 +1276,75 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1351,22 +1384,6 @@ files = [ {file = "ruff-0.6.3.tar.gz", hash = "sha256:183b99e9edd1ef63be34a3b51fee0a9f4ab95add123dbf89a71f7b1f0c991983"}, ] -[[package]] -name = "setuptools" -version = "69.5.1" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, -] - -[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-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "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.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - [[package]] name = "six" version = "1.16.0" @@ -1391,38 +1408,38 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] name = "sphinx" -version = "7.3.7" +version = "7.4.7" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, - {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, + {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, + {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, ] [package.dependencies] alabaster = ">=0.7.14,<0.8.0" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.22" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.14" -requests = ">=2.25.0" -snowballstemmer = ">=2.0" +importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" @@ -1433,8 +1450,8 @@ tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] -test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] +lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinx-autoapi" @@ -1479,49 +1496,49 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.8" +version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, - {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.6" +version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, - {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.5" +version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, - {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] @@ -1541,33 +1558,33 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.7" +version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, - {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] -test = ["pytest"] +test = ["defusedxml (>=0.7.1)", "pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.10" +version = "2.0.0" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, - {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] @@ -1627,13 +1644,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -1644,13 +1661,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.0" +version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.0-py3-none-any.whl", hash = "sha256:0846377ea76e818daaa3e00a4365c018bc3ac9760cbb3544de542885aad61fb3"}, - {file = "virtualenv-20.26.0.tar.gz", hash = "sha256:ec25a9671a5102c8d2657f62792a27b48f016664c6873f6beed3800008577210"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [package.dependencies] @@ -1906,101 +1923,103 @@ all = ["winrt-Windows.Foundation.Collections[all] (==2.2.0)", "winrt-Windows.Fou [[package]] name = "yarl" -version = "1.9.4" +version = "1.9.7" description = "Yet another URL library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {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"}, + {file = "yarl-1.9.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:60c04415b31a1611ef5989a6084dd6f6b95652c6a18378b58985667b65b2ecb6"}, + {file = "yarl-1.9.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1787dcfdbe730207acb454548a6e19f80ae75e6d2d1f531c5a777bc1ab6f7952"}, + {file = "yarl-1.9.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f5ddad20363f9f1bbedc95789c897da62f939e6bc855793c3060ef8b9f9407bf"}, + {file = "yarl-1.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdb156a06208fc9645ae7cc0fca45c40dd40d7a8c4db626e542525489ca81a9"}, + {file = "yarl-1.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:522fa3d300d898402ae4e0fa7c2c21311248ca43827dc362a667de87fdb4f1be"}, + {file = "yarl-1.9.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7f9cabfb8b980791b97a3ae3eab2e38b2ba5eab1af9b7495bdc44e1ce7c89e3"}, + {file = "yarl-1.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fc728857df4087da6544fc68f62d7017fa68d74201d5b878e18ed4822c31fb3"}, + {file = "yarl-1.9.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dba2ebac677184d56374fa3e452b461f5d6a03aa132745e648ae8859361eb6b"}, + {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a95167ae34667c5cc7d9206c024f793e8ffbadfb307d5c059de470345de58a21"}, + {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9d319ac113ca47352319cbea92d1925a37cb7bd61a8c2f3e3cd2e96eb33cccae"}, + {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2d71a5d818d82586ac46265ae01466e0bda0638760f18b21f1174e0dd58a9d2f"}, + {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ff03f1c1ac474c66d474929ae7e4dd195592c1c7cc8c36418528ed81b1ca0a79"}, + {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78250f635f221dde97d02c57aade3313310469bc291888dfe32acd1012594441"}, + {file = "yarl-1.9.7-cp310-cp310-win32.whl", hash = "sha256:f3aaf9fa960d55bd7876d55d7ea3cc046f3660df1ff73fc1b8c520a741ed1f21"}, + {file = "yarl-1.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:e8362c941e07fbcde851597672a5e41b21dc292b7d5a1dc439b7a93c9a1af5d9"}, + {file = "yarl-1.9.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:596069ddeaf72b5eb36cd714dcd2b5751d0090d05a8d65113b582ed9e1c801fb"}, + {file = "yarl-1.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cb870907e8b86b2f32541403da9455afc1e535ce483e579bea0e6e79a0cc751c"}, + {file = "yarl-1.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ca5e86be84492fa403c4dcd4dcaf8e1b1c4ffc747b5176f7c3d09878c45719b0"}, + {file = "yarl-1.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99cecfb51c84d00132db909e83ae388793ca86e48df7ae57f1be0beab0dcce5"}, + {file = "yarl-1.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25508739e9b44d251172145f54c084b71747b09e4d237dc2abb045f46c36a66e"}, + {file = "yarl-1.9.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:60f3b5aec3146b6992640592856414870f5b20eb688c1f1d5f7ac010a7f86561"}, + {file = "yarl-1.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1557456afce5db3d655b5f8a31cdcaae1f47e57958760525c44b76e812b4987"}, + {file = "yarl-1.9.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71bb1435a84688ed831220c5305d96161beb65cac4a966374475348aa3de4575"}, + {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f87d8645a7a806ec8f66aac5e3b1dcb5014849ff53ffe2a1f0b86ca813f534c7"}, + {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:58e3f01673873b8573da3abe138debc63e4e68541b2104a55df4c10c129513a4"}, + {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8af0bbd4d84f8abdd9b11be9488e32c76b1501889b73c9e2292a15fb925b378b"}, + {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7fc441408ed0d9c6d2d627a02e281c21f5de43eb5209c16636a17fc704f7d0f8"}, + {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a9552367dc440870556da47bb289a806f08ad06fbc4054072d193d9e5dd619ba"}, + {file = "yarl-1.9.7-cp311-cp311-win32.whl", hash = "sha256:628619008680a11d07243391271b46f07f13b75deb9fe92ef342305058c70722"}, + {file = "yarl-1.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:bc23d870864971c8455cfba17498ccefa53a5719ea9f5fce5e7e9c1606b5755f"}, + {file = "yarl-1.9.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d8cf3d0b67996edc11957aece3fbce4c224d0451c7c3d6154ec3a35d0e55f6b"}, + {file = "yarl-1.9.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a7748cd66fef49c877e59503e0cc76179caf1158d1080228e67e1db14554f08"}, + {file = "yarl-1.9.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a6fa3aeca8efabb0fbbb3b15e0956b0cb77f7d9db67c107503c30af07cd9e00"}, + {file = "yarl-1.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf37dd0008e5ac5c3880198976063c491b6a15b288d150d12833248cf2003acb"}, + {file = "yarl-1.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87aa5308482f248f8c3bd9311cd6c7dfd98ea1a8e57e35fb11e4adcac3066003"}, + {file = "yarl-1.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:867b13c1b361f9ba5d2f84dc5408082f5d744c83f66de45edc2b96793a9c5e48"}, + {file = "yarl-1.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ce93947554c2c85fe97fc4866646ec90840bc1162e4db349b37d692a811755"}, + {file = "yarl-1.9.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcd3d94b848cba132f39a5b40d80b0847d001a91a6f35a2204505cdd46afe1b2"}, + {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d06d6a8f98dd87646d98f0c468be14b201e47ec6092ad569adf835810ad0dffb"}, + {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:91567ff4fce73d2e7ac67ed5983ad26ba2343bc28cb22e1e1184a9677df98d7c"}, + {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1d5594512541e63188fea640b7f066c218d2176203d6e6f82abf702ae3dca3b2"}, + {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c2743e43183e4afbb07d5605693299b8756baff0b086c25236c761feb0e3c56"}, + {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:daa69a3a2204355af39f4cfe7f3870d87c53d77a597b5100b97e3faa9460428b"}, + {file = "yarl-1.9.7-cp312-cp312-win32.whl", hash = "sha256:36b16884336c15adf79a4bf1d592e0c1ffdb036a760e36a1361565b66785ec6c"}, + {file = "yarl-1.9.7-cp312-cp312-win_amd64.whl", hash = "sha256:2ead2f87a1174963cc406d18ac93d731fbb190633d3995fa052d10cefae69ed8"}, + {file = "yarl-1.9.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:808eddabcb6f7b2cdb6929b3e021ac824a2c07dc7bc83f7618e18438b1b65781"}, + {file = "yarl-1.9.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:395ab0d8ce6d104a988da429bcbfd445e03fb4c911148dfd523f69d13f772e47"}, + {file = "yarl-1.9.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:49827dfccbd59c4499605c13805e947349295466e490860a855b7c7e82ec9c75"}, + {file = "yarl-1.9.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b8bbdd425d0978311520ea99fb6c0e9e04e64aee84fac05f3157ace9f81b05"}, + {file = "yarl-1.9.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71d33fd1c219b5b28ee98cd76da0c9398a4ed4792fd75c94135237db05ba5ca8"}, + {file = "yarl-1.9.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62440431741d0b7d410e5cbad800885e3289048140a43390ecab4f0b96dde3bb"}, + {file = "yarl-1.9.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db97210433366dfba55590e48285b89ad0146c52bf248dd0da492dd9f0f72cf"}, + {file = "yarl-1.9.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653597b615809f2e5f4dba6cd805608b6fd3597128361a22cc612cf7c7a4d1bf"}, + {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df47612129e66f7ce7c9994d4cd4e6852f6e3bf97699375d86991481796eeec8"}, + {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5e338b6febbae6c9fe86924bac3ea9c1944e33255c249543cd82a4af6df6047b"}, + {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e649d37d04665dddb90994bbf0034331b6c14144cc6f3fbce400dc5f28dc05b7"}, + {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0a1b8fd849567be56342e988e72c9d28bd3c77b9296c38b9b42d2fe4813c9d3f"}, + {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f9d715b2175dff9a49c6dafdc2ab3f04850ba2f3d4a77f69a5a1786b057a9d45"}, + {file = "yarl-1.9.7-cp313-cp313-win32.whl", hash = "sha256:bc9233638b07c2e4a3a14bef70f53983389bffa9e8cb90a2da3f67ac9c5e1842"}, + {file = "yarl-1.9.7-cp313-cp313-win_amd64.whl", hash = "sha256:62e110772330d7116f91e79cd83fef92545cb2f36414c95881477aa01971f75f"}, + {file = "yarl-1.9.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a564155cc2194ecd9c0d8f8dc57059b822a507de5f08120063675eb9540576aa"}, + {file = "yarl-1.9.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03e917cc44a01e1be60a83ee1a17550b929490aaa5df2a109adc02137bddf06b"}, + {file = "yarl-1.9.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eefda67ba0ba44ab781e34843c266a76f718772b348f7c5d798d8ea55b95517f"}, + {file = "yarl-1.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:316c82b499b6df41444db5dea26ee23ece9356e38cea43a8b2af9e6d8a3558e4"}, + {file = "yarl-1.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10452727843bc847596b75e30a7fe92d91829f60747301d1bd60363366776b0b"}, + {file = "yarl-1.9.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:050f3e4d886be55728fef268587d061c5ce6f79a82baba71840801b63441c301"}, + {file = "yarl-1.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0aabe557446aa615693a82b4d3803c102fd0e7a6a503bf93d744d182a510184"}, + {file = "yarl-1.9.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23404842228e6fa8ace235024519df37f3f8e173620407644d40ddca571ff0f4"}, + {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:34736fcc9d6d7080ebbeb0998ecb91e4f14ad8f18648cf0b3099e2420a225d86"}, + {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:48f7a158f3ca67509d21cb02a96964e4798b6f133691cc0c86cf36e26e26ec8f"}, + {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6639444d161c693cdabb073baaed1945c717d3982ecedf23a219bc55a242e728"}, + {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:1cd450e10cb53d63962757c3f6f7870be49a3e448c46621d6bd46f8088d532de"}, + {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74d3ef5e81f81507cea04bf5ae22f18ef538607a7c754aac2b6e3029956a2842"}, + {file = "yarl-1.9.7-cp38-cp38-win32.whl", hash = "sha256:4052dbd0c900bece330e3071c636f99dff06e4628461a29b38c6e222a427cf98"}, + {file = "yarl-1.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:dd08da4f2d171e19bd02083c921f1bef89f8f5f87000d0ffc49aa257bc5a9802"}, + {file = "yarl-1.9.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ab906a956d2109c6ea11e24c66592b06336e2743509290117f0f7f47d2c1dd3"}, + {file = "yarl-1.9.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d8ad761493d5aaa7ab2a09736e62b8a220cb0b10ff8ccf6968c861cd8718b915"}, + {file = "yarl-1.9.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d35f9cdab0ec5e20cf6d2bd46456cf599052cf49a1698ef06b9592238d1cf1b1"}, + {file = "yarl-1.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a48d2b9f0ae29a456fb766ae461691378ecc6cf159dd9f938507d925607591c3"}, + {file = "yarl-1.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf85599c9336b89b92c313519bcaa223d92fa5d98feb4935a47cce2e8722b4b8"}, + {file = "yarl-1.9.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e8916b1ff7680b1f2b1608c82dc15c569b9f2cb2da100c747c291f1acf18a14"}, + {file = "yarl-1.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29c80890e0a64fb0e5f71350d48da330995073881f8b8e623154aef631febfb0"}, + {file = "yarl-1.9.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9163d21aa40ff8528db2aee2b0b6752efe098055b41ab8e5422b2098457199fe"}, + {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:65e3098969baf221bb45e3b2f60735fc2b154fc95902131ebc604bae4c629ea6"}, + {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cddebd096effe4be90fd378e4224cd575ac99e1c521598a6900e94959006e02e"}, + {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8525f955a2dcc281573b6aadeb8ab9c37e2d3428b64ca6a2feec2a794a69c1da"}, + {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:5d585c7d834c13f24c7e3e0efaf1a4b7678866940802e11bd6c4d1f99c935e6b"}, + {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78805148e780a9ca66f3123e04741e344b66cf06b4fb13223e3a209f39a6da55"}, + {file = "yarl-1.9.7-cp39-cp39-win32.whl", hash = "sha256:3f53df493ec80b76969d6e1ae6e4411a55ab1360e02b80c84bd4b33d61a567ba"}, + {file = "yarl-1.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:c81c28221a85add23a0922a6aeb2cdda7f9723e03e2dfae06fee5c57fe684262"}, + {file = "yarl-1.9.7-py3-none-any.whl", hash = "sha256:49935cc51d272264358962d050d726c3e5603a616f53e52ea88e9df1728aa2ee"}, + {file = "yarl-1.9.7.tar.gz", hash = "sha256:f28e602edeeec01fc96daf7728e8052bc2e12a672e2a138561a1ebaf30fd9df7"}, ] [package.dependencies] @@ -2009,18 +2028,22 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.18.1" +version = "3.20.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, + {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" From ea880d5d4968e10e48a2a55c0f39183834372c21 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Mon, 4 Aug 2025 16:09:40 +0200 Subject: [PATCH 06/14] docs: switch to book-theme --- docs/conf.py | 4 ++-- docs/technical/10-AirTags.md | 3 +++ pyproject.toml | 1 + shell.nix | 15 +++++++++------ uv.lock | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 docs/technical/10-AirTags.md diff --git a/docs/conf.py b/docs/conf.py index b0e0e45..13c0610 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -10,7 +10,7 @@ project = "FindMy.py" copyright = "2024, Mike Almeloo" author = "Mike Almeloo" -release = "0.2.1" +release = "0.8.0" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration @@ -42,5 +42,5 @@ autoapi_options = [ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = "furo" +html_theme = "sphinx_book_theme" html_static_path = ["_static"] diff --git a/docs/technical/10-AirTags.md b/docs/technical/10-AirTags.md new file mode 100644 index 0000000..2b34213 --- /dev/null +++ b/docs/technical/10-AirTags.md @@ -0,0 +1,3 @@ +# AirTags + +TODO diff --git a/pyproject.toml b/pyproject.toml index 4b87f45..7d9dc78 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ docs = [ "myst-parser>=4.0.1", "sphinx>=8.2.3,<8.3.0", "sphinx-autoapi==3.6.0", + "sphinx-book-theme>=1.1.4", ] [tool.pyright] diff --git a/shell.nix b/shell.nix index 46f84b7..828be14 100644 --- a/shell.nix +++ b/shell.nix @@ -1,18 +1,21 @@ -{ pkgs ? import {} }: +{ + pkgs ? import { }, +}: let - unstable = import (fetchTarball https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz) { }; + unstable = import (fetchTarball "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz") { }; in pkgs.mkShell { packages = with pkgs; [ python312 unstable.uv gh + graphviz ]; shellHook = '' - if [[ -d .venv/ ]]; then - source .venv/bin/activate - fi + if [[ -d .venv/ ]]; then + source .venv/bin/activate + fi ''; -} \ No newline at end of file +} diff --git a/uv.lock b/uv.lock index 29893e0..e48a8a6 100644 --- a/uv.lock +++ b/uv.lock @@ -593,6 +593,7 @@ docs = [ { name = "myst-parser", marker = "python_full_version >= '3.11'" }, { name = "sphinx", marker = "python_full_version >= '3.11'" }, { name = "sphinx-autoapi", marker = "python_full_version >= '3.11'" }, + { name = "sphinx-book-theme", marker = "python_full_version >= '3.11'" }, ] test = [ { name = "pytest" }, @@ -622,6 +623,7 @@ docs = [ { name = "myst-parser", marker = "python_full_version >= '3.11'", specifier = ">=4.0.1" }, { name = "sphinx", marker = "python_full_version >= '3.11'", specifier = ">=8.2.3,<8.3.0" }, { name = "sphinx-autoapi", marker = "python_full_version >= '3.11'", specifier = "==3.6.0" }, + { name = "sphinx-book-theme", marker = "python_full_version >= '3.11'", specifier = ">=1.1.4" }, ] test = [{ name = "pytest", specifier = ">=8.3.2,<9.0.0" }] @@ -1232,6 +1234,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, ] +[[package]] +name = "pydata-sphinx-theme" +version = "0.15.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accessible-pygments", marker = "python_full_version >= '3.11'" }, + { name = "babel", marker = "python_full_version >= '3.11'" }, + { name = "beautifulsoup4", marker = "python_full_version >= '3.11'" }, + { name = "docutils", marker = "python_full_version >= '3.11'" }, + { name = "packaging", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "sphinx", marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/ea/3ab478cccacc2e8ef69892c42c44ae547bae089f356c4b47caf61730958d/pydata_sphinx_theme-0.15.4.tar.gz", hash = "sha256:7762ec0ac59df3acecf49fd2f889e1b4565dbce8b88b2e29ee06fdd90645a06d", size = 2400673, upload-time = "2024-06-25T19:28:45.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl", hash = "sha256:2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6", size = 4640157, upload-time = "2024-06-25T19:28:42.383Z" }, +] + [[package]] name = "pyelftools" version = "0.32" @@ -1528,6 +1549,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496, upload-time = "2023-07-08T18:40:52.659Z" }, ] +[[package]] +name = "sphinx-book-theme" +version = "1.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydata-sphinx-theme", marker = "python_full_version >= '3.11'" }, + { name = "sphinx", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/19/d002ed96bdc7738c15847c730e1e88282d738263deac705d5713b4d8fa94/sphinx_book_theme-1.1.4.tar.gz", hash = "sha256:73efe28af871d0a89bd05856d300e61edce0d5b2fbb7984e84454be0fedfe9ed", size = 439188, upload-time = "2025-02-20T16:32:32.581Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl", hash = "sha256:843b3f5c8684640f4a2d01abd298beb66452d1b2394cd9ef5be5ebd5640ea0e1", size = 433952, upload-time = "2025-02-20T16:32:31.009Z" }, +] + [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" From def535f8193f74982fda9738f3bd3f60b22be60a Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Mon, 4 Aug 2025 16:16:30 +0200 Subject: [PATCH 07/14] docs: somewhat fix references in source code --- findmy/accessory.py | 2 +- findmy/errors.py | 2 +- findmy/keys.py | 12 +++--- findmy/plist.py | 2 +- findmy/reports/account.py | 82 ++++++++++++++++++------------------- findmy/reports/anisette.py | 28 ++++++------- findmy/reports/reports.py | 26 +++++++----- findmy/reports/state.py | 6 +-- findmy/reports/twofactor.py | 32 +++++++-------- findmy/scanner/scanner.py | 14 +++---- findmy/util/abc.py | 12 +++--- findmy/util/http.py | 4 +- 12 files changed, 113 insertions(+), 109 deletions(-) diff --git a/findmy/accessory.py b/findmy/accessory.py index 544170a..18b0e58 100644 --- a/findmy/accessory.py +++ b/findmy/accessory.py @@ -41,7 +41,7 @@ class FindMyAccessoryMapping(TypedDict): class RollingKeyPairSource(ABC): - """A class that generates rolling `KeyPair`s.""" + """A class that generates rolling :meth:`KeyPair`s.""" @property @abstractmethod diff --git a/findmy/errors.py b/findmy/errors.py index fbf88c7..b876ebc 100644 --- a/findmy/errors.py +++ b/findmy/errors.py @@ -21,5 +21,5 @@ class InvalidStateError(RuntimeError): """ Raised when a method is used that is in conflict with the internal account state. - For example: calling `BaseAppleAccount.login` while already logged in. + For example: calling :meth:`BaseAppleAccount.login` while already logged in. """ diff --git a/findmy/keys.py b/findmy/keys.py index 76b849f..6a8188b 100644 --- a/findmy/keys.py +++ b/findmy/keys.py @@ -91,7 +91,7 @@ class HasPublicKey(HasHashedPublicKey, ABC): @property @override def hashed_adv_key_bytes(self) -> bytes: - """See `HasHashedPublicKey.hashed_adv_key_bytes`.""" + """See :meth:`HasHashedPublicKey.hashed_adv_key_bytes`.""" return hashlib.sha256(self.adv_key_bytes).digest() @property @@ -136,7 +136,7 @@ class KeyPair(HasPublicKey, Serializable[KeyPairMapping]): key_type: KeyType = KeyType.UNKNOWN, name: str | None = None, ) -> None: - """Initialize the `KeyPair` with the private key bytes.""" + """Initialize the :meth:`KeyPair` with the private key bytes.""" priv_int = crypto.bytes_to_int(private_key) self._priv_key = ec.derive_private_key( priv_int, @@ -162,15 +162,15 @@ class KeyPair(HasPublicKey, Serializable[KeyPairMapping]): @classmethod def new(cls) -> KeyPair: - """Generate a new random `KeyPair`.""" + """Generate a new random :meth:`KeyPair`.""" return cls(secrets.token_bytes(28)) @classmethod def from_b64(cls, key_b64: str) -> KeyPair: """ - Import an existing `KeyPair` from its base64-encoded representation. + Import an existing :meth:`KeyPair` from its base64-encoded representation. - Same format as returned by `KeyPair.private_key_b64`. + Same format as returned by :meth:`KeyPair.private_key_b64`. """ return cls(base64.b64decode(key_b64)) @@ -185,7 +185,7 @@ class KeyPair(HasPublicKey, Serializable[KeyPairMapping]): """ Return the private key as a base64-encoded string. - Can be re-imported using `KeyPair.from_b64`. + Can be re-imported using :meth:`KeyPair.from_b64`. """ return base64.b64encode(self.private_key_bytes).decode("ascii") diff --git a/findmy/plist.py b/findmy/plist.py index 76872a2..046243e 100644 --- a/findmy/plist.py +++ b/findmy/plist.py @@ -31,7 +31,7 @@ def get_key() -> bytes: def decrypt_plist(encrypted: str | Path | bytes | IO[bytes], key: bytes) -> dict: """ - Decrypts the encrypted plist file at `encrypted` using the provided `key`. + Decrypts the encrypted plist file at :meth:`encrypted` using the provided :meth:`key`. :param encrypted: If bytes or IO, the encrypted plist data. If str or Path, the path to the encrypted plist file, which is diff --git a/findmy/reports/account.py b/findmy/reports/account.py index 6aef1d1..53f1ab1 100644 --- a/findmy/reports/account.py +++ b/findmy/reports/account.py @@ -200,7 +200,7 @@ class BaseAppleAccount(Closable, Serializable[AccountStateMapping], ABC): """ Request a 2FA code to be sent to a specific phone number ID. - Consider using `BaseSecondFactorMethod.request` instead. + Consider using :meth:`BaseSecondFactorMethod.request` instead. """ raise NotImplementedError @@ -209,7 +209,7 @@ class BaseAppleAccount(Closable, Serializable[AccountStateMapping], ABC): """ Submit a 2FA code that was sent to a specific phone number ID. - Consider using `BaseSecondFactorMethod.submit` instead. + Consider using :meth:`BaseSecondFactorMethod.submit` instead. """ raise NotImplementedError @@ -218,7 +218,7 @@ class BaseAppleAccount(Closable, Serializable[AccountStateMapping], ABC): """ Request a 2FA code to be sent to a trusted device. - Consider using `BaseSecondFactorMethod.request` instead. + Consider using :meth:`BaseSecondFactorMethod.request` instead. """ raise NotImplementedError @@ -227,7 +227,7 @@ class BaseAppleAccount(Closable, Serializable[AccountStateMapping], ABC): """ Submit a 2FA code that was sent to a trusted device. - Consider using `BaseSecondFactorMethod.submit` instead. + Consider using :meth:`BaseSecondFactorMethod.submit` instead. """ raise NotImplementedError @@ -270,9 +270,9 @@ class BaseAppleAccount(Closable, Serializable[AccountStateMapping], ABC): list[LocationReport] | dict[HasHashedPublicKey | RollingKeyPairSource, list[LocationReport]] ]: """ - Fetch location reports for `HasHashedPublicKey`s between `date_from` and `date_end`. + Fetch location reports for :class:`HasHashedPublicKey`s between `date_from` and `date_end`. - Returns a dictionary mapping `HasHashedPublicKey`s to a list of their location reports. + Returns a dictionary mapping :class:`HasHashedPublicKey`s to their location reports. """ raise NotImplementedError @@ -311,9 +311,9 @@ class BaseAppleAccount(Closable, Serializable[AccountStateMapping], ABC): list[LocationReport] | dict[HasHashedPublicKey | RollingKeyPairSource, list[LocationReport]] ]: """ - Fetch location reports for a sequence of `HasHashedPublicKey`s for the last `hours` hours. + Fetch location reports for :class:`HasHashedPublicKey`s for the last `hours` hours. - Utility method as an alternative to using `BaseAppleAccount.fetch_reports` directly. + Utility method as an alternative to using :meth:`BaseAppleAccount.fetch_reports` directly. """ raise NotImplementedError @@ -326,13 +326,13 @@ class BaseAppleAccount(Closable, Serializable[AccountStateMapping], ABC): """ Retrieve a complete dictionary of Anisette headers. - Utility method for `AnisetteProvider.get_headers` using this account's user and device ID. + Utility method for :meth:`AnisetteProvider.get_headers` using this account's user/device ID. """ raise NotImplementedError class AsyncAppleAccount(BaseAppleAccount): - """An async implementation of `BaseAppleAccount`.""" + """An async implementation of :meth:`BaseAppleAccount`.""" # auth endpoints _ENDPOINT_GSA = "https://gsa.apple.com/grandslam/GsService2" @@ -357,7 +357,7 @@ class AsyncAppleAccount(BaseAppleAccount): """ Initialize the apple account. - :param anisette: An instance of `AsyncAnisetteProvider`. + :param anisette: An instance of :meth:`AsyncAnisetteProvider`. """ super().__init__() @@ -401,7 +401,7 @@ class AsyncAppleAccount(BaseAppleAccount): @property @override def login_state(self) -> LoginState: - """See `BaseAppleAccount.login_state`.""" + """See :meth:`BaseAppleAccount.login_state`.""" return self._login_state @property @@ -412,7 +412,7 @@ class AsyncAppleAccount(BaseAppleAccount): ) @override def account_name(self) -> str | None: - """See `BaseAppleAccount.account_name`.""" + """See :meth:`BaseAppleAccount.account_name`.""" return self._account_info["account_name"] if self._account_info else None @property @@ -423,7 +423,7 @@ class AsyncAppleAccount(BaseAppleAccount): ) @override def first_name(self) -> str | None: - """See `BaseAppleAccount.first_name`.""" + """See :meth:`BaseAppleAccount.first_name`.""" return self._account_info["first_name"] if self._account_info else None @property @@ -434,7 +434,7 @@ class AsyncAppleAccount(BaseAppleAccount): ) @override def last_name(self) -> str | None: - """See `BaseAppleAccount.last_name`.""" + """See :meth:`BaseAppleAccount.last_name`.""" return self._account_info["last_name"] if self._account_info else None @override @@ -501,7 +501,7 @@ class AsyncAppleAccount(BaseAppleAccount): @require_login_state(LoginState.LOGGED_OUT) @override async def login(self, username: str, password: str) -> LoginState: - """See `BaseAppleAccount.login`.""" + """See :meth:`BaseAppleAccount.login`.""" # LOGGED_OUT -> (REQUIRE_2FA or AUTHENTICATED) new_state = await self._gsa_authenticate(username, password) if new_state == LoginState.REQUIRE_2FA: # pass control back to handle 2FA @@ -513,7 +513,7 @@ class AsyncAppleAccount(BaseAppleAccount): @require_login_state(LoginState.REQUIRE_2FA) @override async def get_2fa_methods(self) -> Sequence[AsyncSecondFactorMethod]: - """See `BaseAppleAccount.get_2fa_methods`.""" + """See :meth:`BaseAppleAccount.get_2fa_methods`.""" methods: list[AsyncSecondFactorMethod] = [] if self._account_info is None: @@ -542,7 +542,7 @@ class AsyncAppleAccount(BaseAppleAccount): @require_login_state(LoginState.REQUIRE_2FA) @override async def sms_2fa_request(self, phone_number_id: int) -> None: - """See `BaseAppleAccount.sms_2fa_request`.""" + """See :meth:`BaseAppleAccount.sms_2fa_request`.""" data = {"phoneNumber": {"id": phone_number_id}, "mode": "sms"} await self._sms_2fa_request( @@ -554,7 +554,7 @@ class AsyncAppleAccount(BaseAppleAccount): @require_login_state(LoginState.REQUIRE_2FA) @override async def sms_2fa_submit(self, phone_number_id: int, code: str) -> LoginState: - """See `BaseAppleAccount.sms_2fa_submit`.""" + """See :meth:`BaseAppleAccount.sms_2fa_submit`.""" data = { "phoneNumber": {"id": phone_number_id}, "securityCode": {"code": str(code)}, @@ -579,7 +579,7 @@ class AsyncAppleAccount(BaseAppleAccount): @require_login_state(LoginState.REQUIRE_2FA) @override async def td_2fa_request(self) -> None: - """See `BaseAppleAccount.td_2fa_request`.""" + """See :meth:`BaseAppleAccount.td_2fa_request`.""" headers = { "Content-Type": "text/x-xml-plist", "Accept": "text/x-xml-plist", @@ -593,7 +593,7 @@ class AsyncAppleAccount(BaseAppleAccount): @require_login_state(LoginState.REQUIRE_2FA) @override async def td_2fa_submit(self, code: str) -> LoginState: - """See `BaseAppleAccount.td_2fa_submit`.""" + """See :meth:`BaseAppleAccount.td_2fa_submit`.""" headers = { "security-code": code, "Content-Type": "text/x-xml-plist", @@ -717,7 +717,7 @@ class AsyncAppleAccount(BaseAppleAccount): ) -> ( list[LocationReport] | dict[HasHashedPublicKey | RollingKeyPairSource, list[LocationReport]] ): - """See `BaseAppleAccount.fetch_reports`.""" + """See :meth:`BaseAppleAccount.fetch_reports`.""" date_to = date_to or datetime.now().astimezone() return await self._reports.fetch_reports( @@ -758,7 +758,7 @@ class AsyncAppleAccount(BaseAppleAccount): ) -> ( list[LocationReport] | dict[HasHashedPublicKey | RollingKeyPairSource, list[LocationReport]] ): - """See `BaseAppleAccount.fetch_last_reports`.""" + """See :meth:`BaseAppleAccount.fetch_last_reports`.""" end = datetime.now(tz=timezone.utc) start = end - timedelta(hours=hours) @@ -971,15 +971,15 @@ class AsyncAppleAccount(BaseAppleAccount): with_client_info: bool = False, serial: str = "0", ) -> dict[str, str]: - """See `BaseAppleAccount.get_anisette_headers`.""" + """See :meth:`BaseAppleAccount.get_anisette_headers`.""" return await self._anisette.get_headers(self._uid, self._devid, serial, with_client_info) class AppleAccount(BaseAppleAccount): """ - A sync implementation of `BaseappleAccount`. + A sync implementation of :meth:`BaseappleAccount`. - Uses `AsyncappleAccount` internally. + Uses :meth:`AsyncappleAccount` internally. """ def __init__( @@ -988,7 +988,7 @@ class AppleAccount(BaseAppleAccount): *, state_info: AccountStateMapping | None = None, ) -> None: - """See `AsyncAppleAccount.__init__`.""" + """See :meth:`AsyncAppleAccount.__init__`.""" self._asyncacc = AsyncAppleAccount(anisette=anisette, state_info=state_info) try: @@ -1001,31 +1001,31 @@ class AppleAccount(BaseAppleAccount): @override async def close(self) -> None: - """See `AsyncAppleAccount.close`.""" + """See :meth:`AsyncAppleAccount.close`.""" await self._asyncacc.close() @property @override def login_state(self) -> LoginState: - """See `AsyncAppleAccount.login_state`.""" + """See :meth:`AsyncAppleAccount.login_state`.""" return self._asyncacc.login_state @property @override def account_name(self) -> str | None: - """See `AsyncAppleAccount.login_state`.""" + """See :meth:`AsyncAppleAccount.login_state`.""" return self._asyncacc.account_name @property @override def first_name(self) -> str | None: - """See `AsyncAppleAccount.first_name`.""" + """See :meth:`AsyncAppleAccount.first_name`.""" return self._asyncacc.first_name @property @override def last_name(self) -> str | None: - """See `AsyncAppleAccount.last_name`.""" + """See :meth:`AsyncAppleAccount.last_name`.""" return self._asyncacc.last_name @override @@ -1051,13 +1051,13 @@ class AppleAccount(BaseAppleAccount): @override def login(self, username: str, password: str) -> LoginState: - """See `AsyncAppleAccount.login`.""" + """See :meth:`AsyncAppleAccount.login`.""" coro = self._asyncacc.login(username, password) return self._evt_loop.run_until_complete(coro) @override def get_2fa_methods(self) -> Sequence[SyncSecondFactorMethod]: - """See `AsyncAppleAccount.get_2fa_methods`.""" + """See :meth:`AsyncAppleAccount.get_2fa_methods`.""" coro = self._asyncacc.get_2fa_methods() methods = self._evt_loop.run_until_complete(coro) @@ -1078,25 +1078,25 @@ class AppleAccount(BaseAppleAccount): @override def sms_2fa_request(self, phone_number_id: int) -> None: - """See `AsyncAppleAccount.sms_2fa_request`.""" + """See :meth:`AsyncAppleAccount.sms_2fa_request`.""" coro = self._asyncacc.sms_2fa_request(phone_number_id) return self._evt_loop.run_until_complete(coro) @override def sms_2fa_submit(self, phone_number_id: int, code: str) -> LoginState: - """See `AsyncAppleAccount.sms_2fa_submit`.""" + """See :meth:`AsyncAppleAccount.sms_2fa_submit`.""" coro = self._asyncacc.sms_2fa_submit(phone_number_id, code) return self._evt_loop.run_until_complete(coro) @override def td_2fa_request(self) -> None: - """See `AsyncAppleAccount.td_2fa_request`.""" + """See :meth:`AsyncAppleAccount.td_2fa_request`.""" coro = self._asyncacc.td_2fa_request() return self._evt_loop.run_until_complete(coro) @override def td_2fa_submit(self, code: str) -> LoginState: - """See `AsyncAppleAccount.td_2fa_submit`.""" + """See :meth:`AsyncAppleAccount.td_2fa_submit`.""" coro = self._asyncacc.td_2fa_submit(code) return self._evt_loop.run_until_complete(coro) @@ -1135,7 +1135,7 @@ class AppleAccount(BaseAppleAccount): ) -> ( list[LocationReport] | dict[HasHashedPublicKey | RollingKeyPairSource, list[LocationReport]] ): - """See `AsyncAppleAccount.fetch_reports`.""" + """See :meth:`AsyncAppleAccount.fetch_reports`.""" coro = self._asyncacc.fetch_reports(keys, date_from, date_to) return self._evt_loop.run_until_complete(coro) @@ -1170,7 +1170,7 @@ class AppleAccount(BaseAppleAccount): ) -> ( list[LocationReport] | dict[HasHashedPublicKey | RollingKeyPairSource, list[LocationReport]] ): - """See `AsyncAppleAccount.fetch_last_reports`.""" + """See :meth:`AsyncAppleAccount.fetch_last_reports`.""" coro = self._asyncacc.fetch_last_reports(keys, hours) return self._evt_loop.run_until_complete(coro) @@ -1180,6 +1180,6 @@ class AppleAccount(BaseAppleAccount): with_client_info: bool = False, serial: str = "0", ) -> dict[str, str]: - """See `AsyncAppleAccount.get_anisette_headers`.""" + """See :meth:`AsyncAppleAccount.get_anisette_headers`.""" coro = self._asyncacc.get_anisette_headers(with_client_info, serial) return self._evt_loop.run_until_complete(coro) diff --git a/findmy/reports/anisette.py b/findmy/reports/anisette.py index 240533c..a16eae1 100644 --- a/findmy/reports/anisette.py +++ b/findmy/reports/anisette.py @@ -135,7 +135,7 @@ class BaseAnisetteProvider(Closable, Serializable, ABC): """ Generate a complete dictionary of Anisette headers. - Consider using `BaseAppleAccount.get_anisette_headers` instead. + Consider using :meth:`BaseAppleAccount.get_anisette_headers` instead. """ headers = { # Current Time @@ -207,7 +207,7 @@ class RemoteAnisetteProvider(BaseAnisetteProvider, Serializable[RemoteAnisetteMa @override def to_json(self, dst: str | Path | None = None, /) -> RemoteAnisetteMapping: - """See `BaseAnisetteProvider.serialize`.""" + """See :meth:`BaseAnisetteProvider.serialize`.""" return save_and_return_json( { "type": "aniRemote", @@ -219,7 +219,7 @@ class RemoteAnisetteProvider(BaseAnisetteProvider, Serializable[RemoteAnisetteMa @classmethod @override def from_json(cls, val: str | Path | RemoteAnisetteMapping) -> RemoteAnisetteProvider: - """See `BaseAnisetteProvider.deserialize`.""" + """See :meth:`BaseAnisetteProvider.deserialize`.""" val = read_data_json(val) assert val["type"] == "aniRemote" @@ -231,7 +231,7 @@ class RemoteAnisetteProvider(BaseAnisetteProvider, Serializable[RemoteAnisetteMa @property @override def otp(self) -> str: - """See `BaseAnisetteProvider.otp`_.""" + """See :meth:`BaseAnisetteProvider.otp`.""" otp = (self._anisette_data or {}).get("X-Apple-I-MD") if otp is None: logger.warning("X-Apple-I-MD header not found! Returning fallback...") @@ -240,7 +240,7 @@ class RemoteAnisetteProvider(BaseAnisetteProvider, Serializable[RemoteAnisetteMa @property @override def machine(self) -> str: - """See `BaseAnisetteProvider.machine`_.""" + """See :meth:`BaseAnisetteProvider.machine`.""" machine = (self._anisette_data or {}).get("X-Apple-I-MD-M") if machine is None: logger.warning("X-Apple-I-MD-M header not found! Returning fallback...") @@ -254,7 +254,7 @@ class RemoteAnisetteProvider(BaseAnisetteProvider, Serializable[RemoteAnisetteMa serial: str = "0", with_client_info: bool = False, ) -> dict[str, str]: - """See `BaseAnisetteProvider.get_headers`_.""" + """See :meth::meth:`BaseAnisetteProvider.get_headers`.""" if self._closed: msg = "RemoteAnisetteProvider has been closed and cannot be used" raise RuntimeError(msg) @@ -270,7 +270,7 @@ class RemoteAnisetteProvider(BaseAnisetteProvider, Serializable[RemoteAnisetteMa @override async def close(self) -> None: - """See `AnisetteProvider.close`.""" + """See :meth:`AnisetteProvider.close`.""" if self._closed: return # Already closed, make it idempotent @@ -283,7 +283,7 @@ class RemoteAnisetteProvider(BaseAnisetteProvider, Serializable[RemoteAnisetteMa class LocalAnisetteProvider(BaseAnisetteProvider, Serializable[LocalAnisetteMapping]): - """Anisette provider. Generates headers without a remote server using the `anisette` library.""" + """Local anisette provider using the `anisette` library.""" def __init__( self, @@ -328,7 +328,7 @@ class LocalAnisetteProvider(BaseAnisetteProvider, Serializable[LocalAnisetteMapp @override def to_json(self, dst: str | Path | None = None, /) -> LocalAnisetteMapping: - """See `BaseAnisetteProvider.serialize`.""" + """See :meth:`BaseAnisetteProvider.serialize`.""" with BytesIO() as buf: self._ani.save_provisioning(buf) prov_data = base64.b64encode(buf.getvalue()).decode("utf-8") @@ -349,7 +349,7 @@ class LocalAnisetteProvider(BaseAnisetteProvider, Serializable[LocalAnisetteMapp *, libs_path: str | Path | None = None, ) -> LocalAnisetteProvider: - """See `BaseAnisetteProvider.deserialize`.""" + """See :meth:`BaseAnisetteProvider.deserialize`.""" val = read_data_json(val) assert val["type"] == "aniLocal" @@ -366,7 +366,7 @@ class LocalAnisetteProvider(BaseAnisetteProvider, Serializable[LocalAnisetteMapp serial: str = "0", with_client_info: bool = False, ) -> dict[str, str]: - """See `BaseAnisetteProvider.get_headers`_.""" + """See :meth:`BaseAnisetteProvider.get_headers`.""" self._ani_data = self._ani.get_data() return await super().get_headers(user_id, device_id, serial, with_client_info) @@ -374,7 +374,7 @@ class LocalAnisetteProvider(BaseAnisetteProvider, Serializable[LocalAnisetteMapp @property @override def otp(self) -> str: - """See `BaseAnisetteProvider.otp`_.""" + """See :meth:`BaseAnisetteProvider.otp`.""" machine = (self._ani_data or {}).get("X-Apple-I-MD") if machine is None: logger.warning("X-Apple-I-MD header not found! Returning fallback...") @@ -383,7 +383,7 @@ class LocalAnisetteProvider(BaseAnisetteProvider, Serializable[LocalAnisetteMapp @property @override def machine(self) -> str: - """See `BaseAnisetteProvider.machine`_.""" + """See :meth:`BaseAnisetteProvider.machine`.""" machine = (self._ani_data or {}).get("X-Apple-I-MD-M") if machine is None: logger.warning("X-Apple-I-MD-M header not found! Returning fallback...") @@ -391,4 +391,4 @@ class LocalAnisetteProvider(BaseAnisetteProvider, Serializable[LocalAnisetteMapp @override async def close(self) -> None: - """See `BaseAnisetteProvider.close`_.""" + """See :meth:`BaseAnisetteProvider.close`.""" diff --git a/findmy/reports/reports.py b/findmy/reports/reports.py index 68c97f3..a8062b8 100644 --- a/findmy/reports/reports.py +++ b/findmy/reports/reports.py @@ -52,14 +52,18 @@ LocationReportMapping = Union[LocationReportEncryptedMapping, LocationReportDecr class LocationReport(HasHashedPublicKey, Serializable[LocationReportMapping]): - """Location report corresponding to a certain `HasHashedPublicKey`.""" + """Location report corresponding to a certain :meth:`HasHashedPublicKey`.""" def __init__( self, payload: bytes, hashed_adv_key: bytes, ) -> None: - """Initialize a `KeyReport`. You should probably use `KeyReport.from_payload` instead.""" + """ + Initialize a :class:`LocationReport`. + + You should probably use :meth:`LocationReport.from_payload` instead. + """ self._payload: bytes = payload self._hashed_adv_key: bytes = hashed_adv_key @@ -68,7 +72,7 @@ class LocationReport(HasHashedPublicKey, Serializable[LocationReportMapping]): @property @override def hashed_adv_key_bytes(self) -> bytes: - """See `HasHashedPublicKey.hashed_adv_key_bytes`.""" + """See :meth:`HasHashedPublicKey.hashed_adv_key_bytes`.""" return self._hashed_adv_key @property @@ -96,7 +100,7 @@ class LocationReport(HasHashedPublicKey, Serializable[LocationReportMapping]): return key.hashed_adv_key_bytes == self._hashed_adv_key def decrypt(self, key: KeyPair) -> None: - """Decrypt the report using its corresponding `KeyPair`.""" + """Decrypt the report using its corresponding :meth:`KeyPair`.""" if not self.can_decrypt(key): msg = "Cannot decrypt with this key!" raise ValueError(msg) @@ -136,7 +140,7 @@ class LocationReport(HasHashedPublicKey, Serializable[LocationReportMapping]): @property def timestamp(self) -> datetime: - """The `datetime` when this report was recorded by a device.""" + """The :meth:`datetime` when this report was recorded by a device.""" timestamp_int = int.from_bytes(self._payload[0:4], "big") + (60 * 60 * 24 * 11323) return datetime.fromtimestamp(timestamp_int, tz=timezone.utc).astimezone() @@ -302,9 +306,9 @@ class LocationReport(HasHashedPublicKey, Serializable[LocationReportMapping]): def __lt__(self, other: LocationReport) -> bool: """ - Compare against another `KeyReport`. + Compare against another :meth:`KeyReport`. - A `KeyReport` is said to be "less than" another `KeyReport` iff its recorded + A :meth:`KeyReport` is said to be "less than" another :meth:`KeyReport` iff its recorded timestamp is strictly less than the other report. """ if isinstance(other, LocationReport): @@ -369,12 +373,12 @@ class LocationReportsFetcher: """ Fetch location reports for a certain device. - When ``device`` is a single :class:`.HasHashedPublicKey`, this method will return + When `device` is a single :class:`HasHashedPublicKey`, this method will return a list of location reports corresponding to that key. - When ``device`` is a :class:`.RollingKeyPairSource`, it will return a list of + When `device` is a :class:`RollingKeyPairSource`, it will return a list of location reports corresponding to that source. - When ``device`` is a sequence of :class:`.HasHashedPublicKey`s or RollingKeyPairSource's, - it will return a dictionary with the :class:`.HasHashedPublicKey` or `.RollingKeyPairSource` + When `device` is a sequence of :class:`HasHashedPublicKey`s or RollingKeyPairSource's, + it will return a dictionary with the provided object as key, and a list of location reports as value. """ key_devs: dict[HasHashedPublicKey, HasHashedPublicKey | RollingKeyPairSource] = {} diff --git a/findmy/reports/state.py b/findmy/reports/state.py index 165f5ae..852ace0 100644 --- a/findmy/reports/state.py +++ b/findmy/reports/state.py @@ -6,7 +6,7 @@ from typing_extensions import override class LoginState(Enum): - """Enum of possible login states. Used for `AppleAccount`'s internal state machine.""" + """Enum of possible login states. Used for :meth:`AppleAccount`'s internal state machine.""" LOGGED_OUT = 0 REQUIRE_2FA = 1 @@ -15,9 +15,9 @@ class LoginState(Enum): def __lt__(self, other: "LoginState") -> bool: """ - Compare against another `LoginState`. + Compare against another :meth:`LoginState`. - A `LoginState` is said to be "less than" another `LoginState` iff it is in + A :meth:`LoginState` is said to be "less than" another :meth:`LoginState` iff it is in an "earlier" stage of the login process, going from LOGGED_OUT to LOGGED_IN. """ if isinstance(other, LoginState): diff --git a/findmy/reports/twofactor.py b/findmy/reports/twofactor.py index 6a51e5b..c7bbb67 100644 --- a/findmy/reports/twofactor.py +++ b/findmy/reports/twofactor.py @@ -63,13 +63,13 @@ class AsyncSecondFactorMethod(BaseSecondFactorMethod, ABC): @override @abstractmethod async def request(self) -> None: - """See `BaseSecondFactorMethod.request`.""" + """See :meth:`BaseSecondFactorMethod.request`.""" raise NotImplementedError @override @abstractmethod async def submit(self, code: str) -> LoginState: - """See `BaseSecondFactorMethod.submit`.""" + """See :meth:`BaseSecondFactorMethod.submit`.""" raise NotImplementedError @@ -93,13 +93,13 @@ class SyncSecondFactorMethod(BaseSecondFactorMethod, ABC): @override @abstractmethod def request(self) -> None: - """See `BaseSecondFactorMethod.request`.""" + """See :meth:`BaseSecondFactorMethod.request`.""" raise NotImplementedError @override @abstractmethod def submit(self, code: str) -> LoginState: - """See `BaseSecondFactorMethod.submit`.""" + """See :meth:`BaseSecondFactorMethod.submit`.""" raise NotImplementedError @@ -128,7 +128,7 @@ class TrustedDeviceSecondFactorMethod(BaseSecondFactorMethod, ABC): class AsyncSmsSecondFactor(AsyncSecondFactorMethod, SmsSecondFactorMethod): - """An async implementation of `SmsSecondFactorMethod`.""" + """An async implementation of :meth:`SmsSecondFactorMethod`.""" def __init__( self, @@ -139,7 +139,7 @@ class AsyncSmsSecondFactor(AsyncSecondFactorMethod, SmsSecondFactorMethod): """ Initialize the second factor method. - Should not be done manually; use `AsyncAppleAccount.get_2fa_methods` instead. + Should not be done manually; use :meth:`AsyncAppleAccount.get_2fa_methods` instead. """ super().__init__(account) @@ -174,7 +174,7 @@ class AsyncSmsSecondFactor(AsyncSecondFactorMethod, SmsSecondFactorMethod): class SyncSmsSecondFactor(SyncSecondFactorMethod, SmsSecondFactorMethod): - """A sync implementation of `SmsSecondFactorMethod`.""" + """A sync implementation of :meth:`SmsSecondFactorMethod`.""" def __init__( self, @@ -182,7 +182,7 @@ class SyncSmsSecondFactor(SyncSecondFactorMethod, SmsSecondFactorMethod): number_id: int, phone_number: str, ) -> None: - """See `AsyncSmsSecondFactor.__init__`.""" + """See :meth:`AsyncSmsSecondFactor.__init__`.""" super().__init__(account) self._phone_number_id: int = number_id @@ -191,28 +191,28 @@ class SyncSmsSecondFactor(SyncSecondFactorMethod, SmsSecondFactorMethod): @property @override def phone_number_id(self) -> int: - """See `AsyncSmsSecondFactor.phone_number_id`.""" + """See :meth:`AsyncSmsSecondFactor.phone_number_id`.""" return self._phone_number_id @property @override def phone_number(self) -> str: - """See `AsyncSmsSecondFactor.phone_number`.""" + """See :meth:`AsyncSmsSecondFactor.phone_number`.""" return self._phone_number @override def request(self) -> None: - """See `AsyncSmsSecondFactor.request`.""" + """See :meth:`AsyncSmsSecondFactor.request`.""" return self.account.sms_2fa_request(self._phone_number_id) @override def submit(self, code: str) -> LoginState: - """See `AsyncSmsSecondFactor.submit`.""" + """See :meth:`AsyncSmsSecondFactor.submit`.""" return self.account.sms_2fa_submit(self._phone_number_id, code) class AsyncTrustedDeviceSecondFactor(AsyncSecondFactorMethod, TrustedDeviceSecondFactorMethod): - """An async implementation of `TrustedDeviceSecondFactorMethod`.""" + """An async implementation of :meth:`TrustedDeviceSecondFactorMethod`.""" @override async def request(self) -> None: @@ -224,14 +224,14 @@ class AsyncTrustedDeviceSecondFactor(AsyncSecondFactorMethod, TrustedDeviceSecon class SyncTrustedDeviceSecondFactor(SyncSecondFactorMethod, TrustedDeviceSecondFactorMethod): - """A sync implementation of `TrustedDeviceSecondFactorMethod`.""" + """A sync implementation of :meth:`TrustedDeviceSecondFactorMethod`.""" @override def request(self) -> None: - """See `AsyncTrustedDeviceSecondFactor.request`.""" + """See :meth:`AsyncTrustedDeviceSecondFactor.request`.""" return self.account.td_2fa_request() @override def submit(self, code: str) -> LoginState: - """See `AsyncTrustedDeviceSecondFactor.submit`.""" + """See :meth:`AsyncTrustedDeviceSecondFactor.submit`.""" return self.account.td_2fa_submit(code) diff --git a/findmy/scanner/scanner.py b/findmy/scanner/scanner.py index af10f12..ad50589 100644 --- a/findmy/scanner/scanner.py +++ b/findmy/scanner/scanner.py @@ -211,7 +211,7 @@ class SeparatedOfflineFindingDevice(OfflineFindingDevice, HasPublicKey): detected_at: datetime, additional_data: dict[Any, Any] | None = None, ) -> None: - """Initialize a `SeparatedOfflineFindingDevice`.""" + """Initialize a :meth:`SeparatedOfflineFindingDevice`.""" super().__init__(mac_bytes, status, detected_at, additional_data) self._public_key: bytes = public_key @@ -225,7 +225,7 @@ class SeparatedOfflineFindingDevice(OfflineFindingDevice, HasPublicKey): @property @override def adv_key_bytes(self) -> bytes: - """See `HasPublicKey.adv_key_bytes`.""" + """See :meth:`HasPublicKey.adv_key_bytes`.""" return self._public_key @override @@ -300,7 +300,7 @@ _DEVICE_TYPES = { class OfflineFindingScanner: - """BLE scanner that searches for `OfflineFindingDevice`s.""" + """BLE scanner that searches for :meth:`OfflineFindingDevice`s.""" _scan_ctrl_lock = asyncio.Lock() @@ -311,7 +311,7 @@ class OfflineFindingScanner: Initialize an instance of the Scanner using an event loop. You most likely do not want to use this yourself; - check out `OfflineFindingScanner.create` instead. + check out :meth:`OfflineFindingScanner.create` instead. """ self._scanner: BleakScanner = BleakScanner(self._scan_callback, cb={"use_bdaddr": True}) @@ -377,10 +377,10 @@ class OfflineFindingScanner: extend_timeout: bool = False, ) -> AsyncGenerator[OfflineFindingDevice, None]: """ - Scan for `OfflineFindingDevice`s for up to `timeout` seconds. + Scan for :meth:`OfflineFindingDevice`s for up to :meth:`timeout` seconds. - If `extend_timeout` is set, the timer will be extended - by `timeout` seconds every time a new device is discovered. + If :meth:`extend_timeout` is set, the timer will be extended + by :meth:`timeout` seconds every time a new device is discovered. """ await self._start_scan() diff --git a/findmy/util/abc.py b/findmy/util/abc.py index a88da3b..a660575 100644 --- a/findmy/util/abc.py +++ b/findmy/util/abc.py @@ -19,9 +19,9 @@ class Closable(ABC): def __init__(self, loop: asyncio.AbstractEventLoop | None = None) -> None: """ - Initialize the ``Closable``. + Initialize the :class:`Closable`. - If an event loop is given, the ``Closable`` will attempt to close itself + If an event loop is given, the :class:`Closable` will attempt to close itself using the loop when it is garbage collected. """ self._loop: asyncio.AbstractEventLoop | None = loop @@ -57,7 +57,7 @@ class Serializable(Generic[_T], ABC): If an argument is provided, the output will also be written to that file. The output of this method is guaranteed to be JSON-serializable, and passing - the return value of this function as an argument to `Serializable.from_json` + the return value of this function as an argument to :meth:`Serializable.from_json` will always result in an exact copy of the internal state as it was when exported. You are encouraged to save and load object states to and from disk whenever possible, @@ -69,11 +69,11 @@ class Serializable(Generic[_T], ABC): @abstractmethod def from_json(cls, val: str | Path | _T, /) -> Self: """ - Restore state from a previous `Closable.to_json` export. + Restore state from a previous :meth:`Closable.to_json` export. - If given a str or Path, it must point to a json file from `Serializable.to_json`. + If given a str or Path, it must point to a json file from :meth:`Serializable.to_json`. Otherwise, it should be the Mapping itself. - See `Serializable.to_json` for more information. + See :meth:`Serializable.to_json` for more information. """ raise NotImplementedError diff --git a/findmy/util/http.py b/findmy/util/http.py index 69190d5..780a23d 100644 --- a/findmy/util/http.py +++ b/findmy/util/http.py @@ -33,7 +33,7 @@ class _HttpRequestOptions(_RequestOptions, total=False): class HttpResponse: - """Response of a request made by `HttpSession`.""" + """Response of a request made by :meth:`HttpSession`.""" def __init__(self, status_code: int, content: bytes) -> None: """Initialize the response.""" @@ -115,7 +115,7 @@ class HttpSession(Closable): """ Make an HTTP request. - Keyword arguments will directly be passed to `aiohttp.ClientSession.request`. + Keyword arguments will directly be passed to :meth:`aiohttp.ClientSession.request`. """ session = await self._get_session() From 4f450882b88e1650f0aed19d26e4c1847c68d995 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Mon, 4 Aug 2025 16:36:35 +0200 Subject: [PATCH 08/14] docs: more page fixes --- docs/getstarted/{1-account.md => 01-account.md} | 0 docs/index.md | 12 +++++++----- docs/reveng/20-Network_Requests.md | 13 +++++++++++++ docs/reveng/index.md | 14 ++++++++++++++ docs/technical/{1-Network.md => 10-Network.md} | 0 docs/technical/{10-AirTags.md => 11-AirTags.md} | 0 6 files changed, 34 insertions(+), 5 deletions(-) rename docs/getstarted/{1-account.md => 01-account.md} (100%) create mode 100644 docs/reveng/20-Network_Requests.md create mode 100644 docs/reveng/index.md rename docs/technical/{1-Network.md => 10-Network.md} (100%) rename docs/technical/{10-AirTags.md => 11-AirTags.md} (100%) diff --git a/docs/getstarted/1-account.md b/docs/getstarted/01-account.md similarity index 100% rename from docs/getstarted/1-account.md rename to docs/getstarted/01-account.md diff --git a/docs/index.md b/docs/index.md index 3cbf821..6b4b655 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,5 @@ # FindMy.py -= 🍏 + 🎯 + 🐍! - FindMy.py is a Python library aiming to provide everything you need to interact with **Apple's FindMy Network**. Its primary aims are feature completeness, reliability and elegant API design. @@ -9,22 +7,26 @@ It abstracts all the heavy lifting away, while keeping the control flow in your ## Jump To -[//]: # (This is hidden to prevent it from showing on the home page) +[//]: # "This is hidden to prevent it from showing on the home page" + ```{toctree} :hidden: Home ``` -[//]: # (Documentation can be expanded to maxdepth 2) +[//]: # "Documentation can be expanded to maxdepth 2" + ```{toctree} :maxdepth: 2 getstarted/index technical/index +reveng/index ``` -[//]: # (Show these with a maxdepth of 1) +[//]: # "Show these with a maxdepth of 1" + ```{toctree} :maxdepth: 1 diff --git a/docs/reveng/20-Network_Requests.md b/docs/reveng/20-Network_Requests.md new file mode 100644 index 0000000..312d274 --- /dev/null +++ b/docs/reveng/20-Network_Requests.md @@ -0,0 +1,13 @@ +# Intercepting Network Requests + +A big part of our understanding of how the FindMy network functions originates from +network captures detailing how official apps query location reports. +This page aims to provide a quickstart on setting up an environment in which you can +freely inspect network requests made the FindMy app on a Mac. + +```{note} +This guide has only been tested on Sonoma, but it will likely work on other +versions of MacOS as well. +``` + +TODO diff --git a/docs/reveng/index.md b/docs/reveng/index.md new file mode 100644 index 0000000..57a03eb --- /dev/null +++ b/docs/reveng/index.md @@ -0,0 +1,14 @@ +# Reverse Engineering + +Want to help reverse engineer pieces of the FindMy network? That's great! +The pages in this category aim to provide documentation on how various parts +of the FindMy network have been reverse engineered, and how you can replicate this setup. + +--- + +```{toctree} +:maxdepth: 1 +:glob: + +* +``` diff --git a/docs/technical/1-Network.md b/docs/technical/10-Network.md similarity index 100% rename from docs/technical/1-Network.md rename to docs/technical/10-Network.md diff --git a/docs/technical/10-AirTags.md b/docs/technical/11-AirTags.md similarity index 100% rename from docs/technical/10-AirTags.md rename to docs/technical/11-AirTags.md From e2978b66a04ee67292f7645847c40e1bf9429a81 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Tue, 5 Aug 2025 15:08:56 +0200 Subject: [PATCH 09/14] docs: hide typevar definitions --- findmy/keys.py | 12 ++++++------ findmy/util/files.py | 8 ++++---- findmy/util/types.py | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/findmy/keys.py b/findmy/keys.py index 6a8188b..b899616 100644 --- a/findmy/keys.py +++ b/findmy/keys.py @@ -233,10 +233,10 @@ class KeyPair(HasPublicKey, Serializable[KeyPairMapping]): return f'KeyPair(name="{self.name}", public_key="{self.adv_key_b64}", type={self.key_type})' -K = TypeVar("K") +_K = TypeVar("_K") -class KeyGenerator(ABC, Generic[K]): +class KeyGenerator(ABC, Generic[_K]): """KeyPair generator.""" @abstractmethod @@ -244,17 +244,17 @@ class KeyGenerator(ABC, Generic[K]): return NotImplemented @abstractmethod - def __next__(self) -> K: + def __next__(self) -> _K: return NotImplemented @overload @abstractmethod - def __getitem__(self, val: int) -> K: ... + def __getitem__(self, val: int) -> _K: ... @overload @abstractmethod - def __getitem__(self, val: slice) -> Generator[K, None, None]: ... + def __getitem__(self, val: slice) -> Generator[_K, None, None]: ... @abstractmethod - def __getitem__(self, val: int | slice) -> K | Generator[K, None, None]: + def __getitem__(self, val: int | slice) -> _K | Generator[_K, None, None]: return NotImplemented diff --git a/findmy/util/files.py b/findmy/util/files.py index e58bfd9..1686bbf 100644 --- a/findmy/util/files.py +++ b/findmy/util/files.py @@ -7,10 +7,10 @@ from collections.abc import Mapping from pathlib import Path from typing import TypeVar, cast -T = TypeVar("T", bound=Mapping) +_T = TypeVar("_T", bound=Mapping) -def save_and_return_json(data: T, dst: str | Path | None) -> T: +def save_and_return_json(data: _T, dst: str | Path | None) -> _T: """Save and return a JSON-serializable data structure.""" if dst is None: return data @@ -23,12 +23,12 @@ def save_and_return_json(data: T, dst: str | Path | None) -> T: return data -def read_data_json(val: str | Path | T) -> T: +def read_data_json(val: str | Path | _T) -> _T: """Read JSON data from a file if a path is passed, or return the argument itself.""" if isinstance(val, str): val = Path(val) if isinstance(val, Path): - val = cast("T", json.loads(val.read_text())) + val = cast("_T", json.loads(val.read_text())) return val diff --git a/findmy/util/types.py b/findmy/util/types.py index 9326eda..370ad61 100644 --- a/findmy/util/types.py +++ b/findmy/util/types.py @@ -3,8 +3,8 @@ from collections.abc import Coroutine from typing import TypeVar, Union -T = TypeVar("T") +_T = TypeVar("_T") # Cannot use `|` operator (PEP 604) in python 3.9, # even with __future__ import since it is evaluated directly -MaybeCoro = Union[T, Coroutine[None, None, T]] +MaybeCoro = Union[_T, Coroutine[None, None, _T]] From e2383ed61faee1a575a6fbe67967f89b27a00103 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Tue, 5 Aug 2025 15:09:15 +0200 Subject: [PATCH 10/14] docs: finish network intercept tutorial --- docs/reveng/20-Network_Requests.md | 73 +++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/docs/reveng/20-Network_Requests.md b/docs/reveng/20-Network_Requests.md index 312d274..970e8d0 100644 --- a/docs/reveng/20-Network_Requests.md +++ b/docs/reveng/20-Network_Requests.md @@ -10,4 +10,75 @@ This guide has only been tested on Sonoma, but it will likely work on other versions of MacOS as well. ``` -TODO +## Disabling SSL pinning + +Applications on MacOS implement SSL pinning by default. This means that Apple can determine which server-side +certificates are allowed to be used when an application makes a network request. This presents a problem +when we want to inspect these requests: typically, to inspect encrypted traffic using a proxy, we need to perform +a Man-In-The-Middle (MITM) attack on ourselves in order to 'swap out' the certificate with one that we have the private key of. +This is not possible while SSL pinning is active, because the application will simply reject our certificate. + +For this reason, we will first need to disable SSL pinning. We will do this by utilizing [Frida](https://frida.re/) +to attach to the processes that we want to inspect, and then using a script to bypass SSL pinning. + +Start off by downloading [this JavaScript file](https://gist.github.com/azenla/37f941de24c5dfe46f3b8e93d94ce909) and saving +it to a location where you can easily find it again. + +Next, let's actually install Frida by running the following command: + +```bash +pip install frida-tools==13.7.1 +``` + +```{hint} +The above command installs an older version of Frida that is compatible with the script we are going to use. +If you need to use a newer version for whatever reason, you need to apply [these fixes](https://gist.github.com/azenla/37f941de24c5dfe46f3b8e93d94ce909?permalink_comment_id=5675248#gistcomment-5675248) +to the script we downloaded before continuing. + +Note that I will not be able to provide support if you use a version other than the one suggested above. +``` + +To inspect network requests for FindMy, we want to attach Frida to the `searchpartyuseragent` daemon. +Open a terminal and enter the following command, substituting the path to the script if necessary: + +```bash +frida -l disable-ssl-pin.js searchpartyuseragent +``` + +```{important} +If the above command does not work, you may need to temporarily disable [System Integrity Protection](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection). +Make sure to re-enable it once you're done intercepting! +``` + +If all went well, Frida should now be running. Keep the terminal open while capturing network requests. + +## Intercepting requests + +If you're already familiar with MITM proxies, you can probably skip this step; just use your favorite proxy +while Frida is running. If you're not, read on. + +We will be using [mitmproxy](https://www.mitmproxy.org/) in order to intercept network requests. Install it before continuing: + +```bash +brew install --cask mitmproxy +``` + +Mitmproxy supports several methods to intercept local traffic. We will be using `Local Capture` mode, as it's the easiest to set up +and tear down afterwards. Run the following command to start the proxy: + +```bash +mitmweb --mode local +``` + +```{tip} +Mitmproxy / MacOS may bug you about enabling the correct profile in system settings. If it does, simply do what it says +and come back here. +``` + +```{tip} +Applications other than FindMy may lose their network connection while the capture is running. Simply stop mitmproxy +once you're done and it will go back to normal. +``` + +If all went well, your browser should open the mitmweb interface. From here, you will see all network requests being made +by `searchpartyuseragent`, as well as their responses. From 7445bfae2e9f211dfc9dfc966c4207bb125a3280 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Tue, 5 Aug 2025 15:17:26 +0200 Subject: [PATCH 11/14] ci: install `graphviz` for docs build --- .github/workflows/docs.yml | 47 ++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 27120bb..4e53f27 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,7 +3,7 @@ name: Deploy documentation on: workflow_dispatch: push: - tags: + tags: - 'v[0-9]\.[0-9]+\.[0-9]+' jobs: @@ -15,26 +15,29 @@ jobs: id-token: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - - name: Install uv and set the python version - uses: astral-sh/setup-uv@v6 - with: - python-version: ${{ matrix.python-version }} - - - name: Build documentation - run: | - cd docs - uv run make html - - - name: Setup Pages - uses: actions/configure-pages@v5 - - - name: Upload Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: 'docs/_build/html/' + - name: Install uv and set the python version + uses: astral-sh/setup-uv@v6 + with: + python-version: ${{ matrix.python-version }} - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + - name: Install graphviz + run: sudo apt-get install -y graphviz + + - name: Build documentation + run: | + cd docs + uv run make html + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: "docs/_build/html/" + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From d20ec0c90042b8d722936a1fe87e3c81e612f915 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Tue, 5 Aug 2025 15:26:40 +0200 Subject: [PATCH 12/14] docs: automatically infer version --- docs/conf.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 13c0610..f595d85 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -6,11 +6,14 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information +import os +import re project = "FindMy.py" copyright = "2024, Mike Almeloo" author = "Mike Almeloo" -release = "0.8.0" +version = re.sub("^v", "", os.popen("git describe --tags").read().strip()) # noqa: S605, S607 +release = version # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration From ba76f66e08a3721c4265fb76281f68c586d936b1 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Tue, 5 Aug 2025 15:28:09 +0200 Subject: [PATCH 13/14] docs: fix page reference --- docs/technical/10-Network.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/technical/10-Network.md b/docs/technical/10-Network.md index 1de4d8c..bee3c16 100644 --- a/docs/technical/10-Network.md +++ b/docs/technical/10-Network.md @@ -7,7 +7,7 @@ by surrounding iDevices, and how generated location reports can be retrieved. ```{note} While official AirTags (and compatible 3rd party tags) use the same principles as described in this document, they also offer a key rotation feature. To learn more about -how this works, please check out the dedicated [AirTags](#10-AirTags) page. +how this works, please check out the dedicated [AirTags](#11-AirTags) page. ``` ## Overview @@ -26,7 +26,7 @@ said reports using the private key, users are able to track their devices withou ![](https://github.com/seemoo-lab/openhaystack/raw/main/Resources/FindMyOverview.png) -*An overview of the FindMy-network. Source: [SEEMOO-LAB](https://www.petsymposium.org/2021/files/papers/issue3/popets-2021-0045.pdf)*. +_An overview of the FindMy-network. Source: [SEEMOO-LAB](https://www.petsymposium.org/2021/files/papers/issue3/popets-2021-0045.pdf)_. Fetching (encrypted) location reports still requires an Apple account. It is worth noting however, that anyone can download anyone else's location reports for any of their devices; however, due to the encryption scheme discussed above, @@ -34,8 +34,7 @@ doing this would be rather useless as none of the retrieved reports could be dec to operate without being linked to a specific Apple account. The below dependency diagram visually explains how this entire system hinges on the availability of the private key; without it, location reports could not be retrieved and decrypted. - ![](dependency_diagram.png) -*A dependency diagram of data in the network. An arrow pointing from A to B means that in order -to retrieve B, we first require A.* +_A dependency diagram of data in the network. An arrow pointing from A to B means that in order +to retrieve B, we first require A._ From 5e8a4431804c7095588b4ecbb890fa9498ff2a21 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Tue, 5 Aug 2025 15:38:36 +0200 Subject: [PATCH 14/14] docs: small autoapi improvements --- docs/.gitignore | 1 + docs/conf.py | 2 ++ docs/index.md | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 docs/.gitignore diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..10e83c6 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +reference/ \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index f595d85..6041c7b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,9 @@ exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # -- AutoAPI Options --------------------------------------------------------- autoapi_dirs = ["../findmy/"] +autoapi_root = "reference/" autoapi_add_toctree_entry = False +autoapi_keep_files = True autoapi_options = [ "members", "undoc-members", diff --git a/docs/index.md b/docs/index.md index 6b4b655..f292edc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -30,6 +30,6 @@ reveng/index ```{toctree} :maxdepth: 1 -API Reference +API Reference genindex ```