pax_global_header00006660000000000000000000000064147455160270014525gustar00rootroot0000000000000052 comment=438c8c94a5ff8ba4d5bad2b83374ae5168727fdb IceBotYT-nice-go-438c8c9/000077500000000000000000000000001474551602700150355ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/.cruft.json000066400000000000000000000011641474551602700171330ustar00rootroot00000000000000{ "template": "https://github.com/woltapp/wolt-python-package-cookiecutter", "commit": "b25684a2c63387153b83a1cc03ea332be8c8279a", "checkout": null, "context": { "cookiecutter": { "author_name": "IceBotYT", "author_email": "34712694+IceBotYT@users.noreply.github.com", "github_username": "IceBotYT", "project_name": "Nice G.O.", "project_slug": "nice-go", "package_name": "nice_go", "project_short_description": "Control various Nice access control products", "_template": "https://github.com/woltapp/wolt-python-package-cookiecutter" } }, "directory": null } IceBotYT-nice-go-438c8c9/.github/000077500000000000000000000000001474551602700163755ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/.github/ISSUE_TEMPLATE/000077500000000000000000000000001474551602700205605ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000014631474551602700225540ustar00rootroot00000000000000blank_issues_enabled: true contact_links: - name: Report a bug with the Nice G.O. integration url: https://github.com/home-assistant/core/issues about: Please report issues with Nice G.O. in the Home Assistant core repository unless a developer told you otherwise. - name: I have a question or need support url: https://www.home-assistant.io/help about: We use GitHub for tracking bugs, check the Home Assistant website for resources on getting help. - name: Feature Request url: https://community.home-assistant.io/c/feature-requests about: Please use the Home Assistant Community Forum for making feature requests. - name: I'm unsure where to go url: https://www.home-assistant.io/join-chat about: If you are unsure where to go, then joining our chat is recommended; Just ask! IceBotYT-nice-go-438c8c9/.github/actions/000077500000000000000000000000001474551602700200355ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/.github/actions/python-poetry-env/000077500000000000000000000000001474551602700234645ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/.github/actions/python-poetry-env/action.yml000066400000000000000000000007731474551602700254730ustar00rootroot00000000000000name: 'Setup Python + Poetry environment' description: 'Setup Python + Poetry environment' inputs: python-version: required: false description: 'Python version' default: '3.12' outputs: {} runs: using: 'composite' steps: - uses: actions/setup-python@v5 with: python-version: ${{inputs.python-version}} - name: Install poetry run: python -m pip install poetry shell: bash - name: Create virtual environment run: poetry install shell: bash IceBotYT-nice-go-438c8c9/.github/pull_request_template.md000066400000000000000000000005631474551602700233420ustar00rootroot00000000000000## Description A short description about the changes in this pull request. If the pull request is related to some issue, mention it here. ## Checklist - [ ] Tests covering the new functionality have been added - [ ] Documentation has been updated OR the change is too minor to be documented - [ ] Changes are listed in the `CHANGELOG.md` OR changes are insignificant IceBotYT-nice-go-438c8c9/.github/workflows/000077500000000000000000000000001474551602700204325ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/.github/workflows/cookiecutter.yml000066400000000000000000000055701474551602700236640ustar00rootroot00000000000000name: Autoupdate project structure on: workflow_dispatch: schedule: - cron: "0 0 * * *" # at the end of every day jobs: auto-update-project: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install dependencies run: python -m pip install cruft poetry jello tabulate - name: Update project structure run: | cruft update -y - name: Check if there are changes id: changes run: echo "::set-output name=changed::$(git status --porcelain | wc -l)" - name: apply additional changes and fixes if: steps.changes.outputs.changed > 0 run: | poetry lock --no-update # add new dependencies poetry install poetry run pre-commit run -a || true # we have to fix other issues manually - name: Get template versions id: get_versions if: steps.changes.outputs.changed > 0 shell: bash run: | CURRENT_VERSION=$(git show HEAD:.cruft.json | jello -r "_['commit'][:8]") NEXT_VERSION=$(jello -r "_['commit'][:8]" < .cruft.json) echo ::set-output name="current_version::$CURRENT_VERSION" echo ::set-output name="next_version::$NEXT_VERSION" - name: Get changelog id: get_changelog if: steps.changes.outputs.changed > 0 shell: bash run: | TEMPLATE=$(jello -r "_['template']" < .cruft.json) git clone "$TEMPLATE" /tmp/template cd /tmp/template body=$( (echo "Date;Change;Hash"; git log --pretty=format:"%as;%s;%h" ${{ steps.get_versions.outputs.current_version }}..${{ steps.get_versions.outputs.next_version }}) | tabulate --header --format github -s ';' -) body=$(cat < 0 && env.GITHUB_TOKEN != 0 }} uses: peter-evans/create-pull-request@v7 with: token: ${{ env.GITHUB_TOKEN }} commit-message: >- chore: update project structure to ${{ steps.get_versions.outputs.next_version }} title: "[Actions] Auto-Update cookiecutter template" body: ${{ steps.get_changelog.outputs.changelog }} branch: chore/auto-update-project-from-template delete-branch: true IceBotYT-nice-go-438c8c9/.github/workflows/draft_release.yml000066400000000000000000000035541474551602700237640ustar00rootroot00000000000000name: Draft a release on: workflow_dispatch: inputs: version: description: 'The version number (e.g. 1.2.3) OR one of: patch|minor|major|prepatch|preminor|premajor|prerelease' required: true default: 'patch' jobs: draft-release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: ./.github/actions/python-poetry-env - name: Update version id: updated_version shell: bash run: | poetry version ${{ github.event.inputs.version }} version=$(poetry version --short) echo ::set-output name="version::$version" - name: Update changelog id: changelog shell: bash run: | poetry run kacl-cli release ${{ steps.updated_version.outputs.version }} --modify --auto-link echo "" >> CHANGELOG.md body=$(poetry run kacl-cli get ${{ steps.updated_version.outputs.version }}) body="${body//'%'/'%25'}" body="${body//$'\n'/'%0A'}" body="${body//$'\r'/'%0D'}" echo ::set-output name="body::$body" - name: Commit changes uses: EndBug/add-and-commit@v9 with: add: 'CHANGELOG.md pyproject.toml' message: 'Release ${{ steps.updated_version.outputs.version }}' default_author: github_actions - name: Create tag run: | git tag ${{ steps.updated_version.outputs.version }} git push origin ${{ steps.updated_version.outputs.version }} - name: Create a draft release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ steps.updated_version.outputs.version }} release_name: Release ${{ steps.updated_version.outputs.version }} body: ${{ steps.changelog.outputs.body }} draft: true IceBotYT-nice-go-438c8c9/.github/workflows/release.yml000066400000000000000000000006711474551602700226010ustar00rootroot00000000000000name: Release on: release: types: [ published ] jobs: build-and-publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: ./.github/actions/python-poetry-env - name: Publish to pypi run: | poetry config pypi-token.pypi ${{ secrets.PYPI_TOKEN }} poetry publish --build --no-interaction - name: Deploy docs run: poetry run mkdocs gh-deploy --force IceBotYT-nice-go-438c8c9/.github/workflows/test.yml000066400000000000000000000037051474551602700221410ustar00rootroot00000000000000name: Test on: pull_request: push: branches: - "main" jobs: actionlint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Download actionlint run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) 1.6.21 shell: bash - name: Check workflow files run: ./actionlint -color shell: bash lint-cruft: name: Check if automatic project update was successful runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Fail if .rej files exist as structure update was not successful run: test -z "$(find . -iname '*.rej')" pre-commit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: ./.github/actions/python-poetry-env - run: poetry run pre-commit run --all-files test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ["3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 - uses: ./.github/actions/python-poetry-env with: python-version: ${{ matrix.python-version }} - run: poetry run pytest --cov=src tests --cov-report=xml - name: Upload coverage artifact uses: actions/upload-artifact@v4.6.0 with: name: coverage-${{ matrix.python-version }} path: coverage.xml docs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: ./.github/actions/python-poetry-env - run: poetry run mkdocs build coverage: runs-on: ubuntu-latest needs: test steps: - name: Checkout code from GitHub uses: actions/checkout@v4 - name: Download coverage artifacts uses: actions/download-artifact@v4.1.8 - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v5.3.1 with: token: ${{ secrets.CODECOV_TOKEN }} IceBotYT-nice-go-438c8c9/.gitignore000066400000000000000000000015521474551602700170300ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ # IDEs .idea/ # Ruff .ruff_cache/ # For testing src/test.py src/refresh_token.txt IceBotYT-nice-go-438c8c9/.pre-commit-config.yaml000066400000000000000000000025741474551602700213260ustar00rootroot00000000000000repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.0.1 hooks: - id: check-ast - id: check-added-large-files - id: check-merge-conflict - id: check-case-conflict - id: check-docstring-first - id: check-json - id: check-yaml - id: debug-statements - id: end-of-file-fixer exclude: 'CHANGELOG.md' - id: trailing-whitespace - id: mixed-line-ending - repo: https://github.com/sourcery-ai/sourcery rev: v1.21.0 hooks: - id: sourcery args: [--diff=git diff HEAD, --no-summary] - repo: local hooks: - id: ruff-format name: ruff-format entry: poetry run ruff format require_serial: true language: system types: [ python ] - id: ruff name: ruff # Add --fix, in case you want it to autofix when this hook runs entry: poetry run ruff check --force-exclude require_serial: true language: system types: [ python ] - id: mypy name: mypy entry: poetry run mypy --strict tests src require_serial: true language: system types: [python] pass_filenames: false - id: kacl-verify name: kacl-verify entry: poetry run kacl-cli verify language: system files: 'CHANGELOG.md' pass_filenames: false IceBotYT-nice-go-438c8c9/.sourcery.yaml000066400000000000000000000035231474551602700176550ustar00rootroot00000000000000# 🪄 This is your project's Sourcery configuration file. # You can use it to get Sourcery working in the way you want, such as # ignoring specific refactorings, skipping directories in your project, # or writing custom rules. # 📚 For a complete reference to this file, see the documentation at # https://docs.sourcery.ai/Configuration/Project-Settings/ # This file was auto-generated by Sourcery on 2024-07-24 at 18:39. version: '1' # The schema version of this config file ignore: # A list of paths or files which Sourcery will ignore. - .git - env - .env - .tox - node_modules - vendor - venv - .venv - ~/.pyenv - ~/.rye - ~/.vscode - .vscode - ~/.cache - ~/.config - ~/.local - .pytest_cache - .mypy_cache - src/test.py rule_settings: enable: - default - gpsg disable: [] # A list of rule IDs Sourcery will never suggest. rule_types: - refactoring - suggestion - comment python_version: '3.9' # A string specifying the lowest Python version your project supports. Sourcery will not suggest refactorings requiring a higher Python version. # rules: # A list of custom rules Sourcery will include in its analysis. # - id: no-print-statements # description: Do not use print statements in the test directory. # pattern: print(...) # language: python # replacement: # condition: # explanation: # paths: # include: # - test # exclude: # - conftest.py # tests: [] # tags: [] # rule_tags: {} # Additional rule tags. # metrics: # quality_threshold: 25.0 # github: # labels: [] # ignore_labels: # - sourcery-ignore # request_review: author # sourcery_branch: sourcery/{base_branch} # clone_detection: # min_lines: 3 # min_duplicates: 2 # identical_clones_only: false # proxy: # url: # ssl_certs_file: # no_ssl_verify: false # coding_assistant: # project_description: '' # enabled: IceBotYT-nice-go-438c8c9/.vscode/000077500000000000000000000000001474551602700163765ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/.vscode/settings.json000066400000000000000000000002241474551602700211270ustar00rootroot00000000000000{ "python.testing.pytestArgs": [ "tests" ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true } IceBotYT-nice-go-438c8c9/CHANGELOG.md000066400000000000000000000070161474551602700166520ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [1.0.1] - 2025-01-26 ### Fixed - Added more exception handling ## [1.0.0] - 2024-12-14 ### Removed - Removed `desired` from `BarrierState` since it's useless ## [0.3.10] - 2024-11-08 ### Fixed - Increased receive timeout for WS polling - Added extra debug logging to connection_ack check ## [0.3.9] - 2024-09-21 ### Added - Added more debug logging ## [0.3.8] - 2024-08-30 ### Fixed - Loosen tenacity pin ## [0.3.7] - 2024-08-29 ### Fixed - Downgrade `tenacity` to 8.5.0, fixes dep conflict in HA ## [0.3.6] - 2024-08-29 ### Fixed - Switch to `tenacity` for retrying, should be completely backwards compatible ## [0.3.5] - 2024-08-26 ### Fixed - More fixes (see commit history) ## [0.3.4] - 2024-08-26 ### Fixed - Try to prevent more errors ## [0.3.3] - 2024-08-26 ### Fixed - Try to prevent 'Task exception was never retrieved' (again) ## [0.3.2] - 2024-08-26 ### Fixed - Try to prevent 'Task exception was never retrieved' ## [0.3.1] - 2024-08-25 ### Fixed - Fixed reconnection logic - Detects no keepalive ## [0.3.0] - 2024-08-19 ### Added - Add listen function ## [0.2.1] - 2024-08-19 ### Fixed - Allow multiple events to be added ## [0.2.0] - 2024-08-19 ### Added - Vacation mode support - Barrier obstruction support ## [0.1.6] - 2024-08-01 ### Added - Add extra debug logging ## [0.1.5] - 2024-07-30 ### Fixed - Reverted unpin `pycognito` - Moved type stubs to dev dependencies ## [0.1.4] - 2024-07-29 ### Changed - Last resort: unpinning `pycognito` ## [0.1.3] - 2024-07-29 ### Changed - Made `boto3` pinned version, hopefully fixing dep conflict in HA ## [0.1.2] - 2024-07-28 ### Added - Made all barrier commands public ## [0.1.1] - 2024-07-25 ### Added - Made BarrierState and ConnectionState public ## [0.1.0] - 2024-07-25 ### Added - Initial release! [Unreleased]: https://github.com/IceBotYT/nice-go/compare/1.0.1...master [1.0.1]: https://github.com/IceBotYT/nice-go/compare/1.0.0...1.0.1 [1.0.0]: https://github.com/IceBotYT/nice-go/compare/0.3.10...1.0.0 [0.3.10]: https://github.com/IceBotYT/nice-go/compare/0.3.9...0.3.10 [0.3.9]: https://github.com/IceBotYT/nice-go/compare/0.3.8...0.3.9 [0.3.8]: https://github.com/IceBotYT/nice-go/compare/0.3.7...0.3.8 [0.3.7]: https://github.com/IceBotYT/nice-go/compare/0.3.6...0.3.7 [0.3.6]: https://github.com/IceBotYT/nice-go/compare/0.3.5...0.3.6 [0.3.5]: https://github.com/IceBotYT/nice-go/compare/0.3.4...0.3.5 [0.3.4]: https://github.com/IceBotYT/nice-go/compare/0.3.3...0.3.4 [0.3.3]: https://github.com/IceBotYT/nice-go/compare/0.3.2...0.3.3 [0.3.2]: https://github.com/IceBotYT/nice-go/compare/0.3.1...0.3.2 [0.3.1]: https://github.com/IceBotYT/nice-go/compare/0.3.0...0.3.1 [0.3.0]: https://github.com/IceBotYT/nice-go/compare/0.2.1...0.3.0 [0.2.1]: https://github.com/IceBotYT/nice-go/compare/0.2.0...0.2.1 [0.2.0]: https://github.com/IceBotYT/nice-go/compare/0.1.6...0.2.0 [0.1.6]: https://github.com/IceBotYT/nice-go/compare/0.1.5...0.1.6 [0.1.5]: https://github.com/IceBotYT/nice-go/compare/0.1.4...0.1.5 [0.1.4]: https://github.com/IceBotYT/nice-go/compare/0.1.3...0.1.4 [0.1.3]: https://github.com/IceBotYT/nice-go/compare/0.1.2...0.1.3 [0.1.2]: https://github.com/IceBotYT/nice-go/compare/0.1.1...0.1.2 [0.1.1]: https://github.com/IceBotYT/nice-go/compare/0.1.0...0.1.1 [0.1.0]: https://github.com/IceBotYT/nice-go/tree/0.1.0 IceBotYT-nice-go-438c8c9/LICENSE000066400000000000000000000021401474551602700160370ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2024 IceBotYT <34712694+IceBotYT@users.noreply.github.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. IceBotYT-nice-go-438c8c9/README.md000066400000000000000000000056701474551602700163240ustar00rootroot00000000000000# Nice G.O. [![PyPI](https://img.shields.io/pypi/v/nice-go?style=flat-square)](https://pypi.python.org/pypi/nice-go/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/nice-go?style=flat-square)](https://pypi.python.org/pypi/nice-go/) [![PyPI - License](https://img.shields.io/pypi/l/nice-go?style=flat-square)](https://pypi.python.org/pypi/nice-go/) [![codecov](https://codecov.io/github/IceBotYT/nice-go/graph/badge.svg?token=CR93ZO1FNN)](https://codecov.io/github/IceBotYT/nice-go) [![Coookiecutter - Wolt](https://img.shields.io/badge/cookiecutter-Wolt-00c2e8?style=flat-square&logo=cookiecutter&logoColor=D4AA00&link=https://github.com/woltapp/wolt-python-package-cookiecutter)](https://github.com/woltapp/wolt-python-package-cookiecutter) --- **Documentation**: [https://IceBotYT.github.io/nice-go](https://IceBotYT.github.io/nice-go) **Source Code**: [https://github.com/IceBotYT/nice-go](https://github.com/IceBotYT/nice-go) **PyPI**: [https://pypi.org/project/nice-go/](https://pypi.org/project/nice-go/) --- Control various Nice garage door and gate products ## Installation ```sh pip install nice-go ``` ## Development * Clone this repository * Requirements: * [Poetry](https://python-poetry.org/) * Python 3.9+ * Create a virtual environment and install the dependencies ```sh poetry install ``` * Activate the virtual environment ```sh poetry shell ``` ### Testing ```sh pytest ``` ### Documentation The documentation is automatically generated from the content of the [docs directory](https://github.com/IceBotYT/nice-go/tree/master/docs) and from the docstrings of the public signatures of the source code. The documentation is updated and published as a [Github Pages page](https://pages.github.com/) automatically as part each release. ### Releasing Trigger the [Draft release workflow](https://github.com/IceBotYT/nice-go/actions/workflows/draft_release.yml) (press _Run workflow_). This will update the changelog & version and create a GitHub release which is in _Draft_ state. Find the draft release from the [GitHub releases](https://github.com/IceBotYT/nice-go/releases) and publish it. When a release is published, it'll trigger [release](https://github.com/IceBotYT/nice-go/blob/master/.github/workflows/release.yml) workflow which creates PyPI release and deploys updated documentation. ### Pre-commit Pre-commit hooks run all the auto-formatting (`ruff format`), linters (e.g. `ruff` and `mypy`), and other quality checks to make sure the changeset is in good shape before a commit/push happens. You can install the hooks with (runs for each commit): ```sh pre-commit install ``` Or if you want them to run only for each push: ```sh pre-commit install -t pre-push ``` Or if you want e.g. want to run all checks manually for all files: ```sh pre-commit run --all-files ``` --- This project was generated using the [wolt-python-package-cookiecutter](https://github.com/woltapp/wolt-python-package-cookiecutter) template. IceBotYT-nice-go-438c8c9/docs/000077500000000000000000000000001474551602700157655ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/docs/api_docs.md000066400000000000000000000000401474551602700200620ustar00rootroot00000000000000# API documentation :::nice_go IceBotYT-nice-go-438c8c9/docs/changelog.md000066400000000000000000000000261474551602700202340ustar00rootroot00000000000000--8<-- "CHANGELOG.md" IceBotYT-nice-go-438c8c9/docs/index.md000066400000000000000000000000231474551602700174110ustar00rootroot00000000000000--8<-- "README.md" IceBotYT-nice-go-438c8c9/mkdocs.yml000066400000000000000000000016031474551602700170400ustar00rootroot00000000000000site_name: "Nice G.O." repo_url: https://github.com/IceBotYT/nice-go theme: name: material palette: - scheme: default toggle: icon: material/toggle-switch-off-outline name: Switch to dark mode - scheme: slate toggle: icon: material/toggle-switch name: Switch to light mode nav: - Introduction: 'index.md' - api_docs.md - changelog.md markdown_extensions: - pymdownx.snippets: check_paths: true - pymdownx.highlight: anchor_linenums: true line_spans: __span pygments_lang_class: true - pymdownx.inlinehilite - pymdownx.superfences watch: - mkdocs.yml - docs/ - src/ plugins: - search: - mkdocstrings: default_handler: python handlers: python: options: show_signature_annotations: true show_source: true show_submodules: true IceBotYT-nice-go-438c8c9/poetry.lock000066400000000000000000011447171474551602700172500ustar00rootroot00000000000000# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiobotocore" version = "2.19.0" description = "Async client for aws services using botocore and aiohttp" optional = false python-versions = ">=3.8" files = [ {file = "aiobotocore-2.19.0-py3-none-any.whl", hash = "sha256:12c2960a21472b8eb3452cde5eb31d541ca1464d236f4221556320fa8aed2ee8"}, {file = "aiobotocore-2.19.0.tar.gz", hash = "sha256:552d5756989621b5274f1b4a4840cd76ae83dd930d0b1839af6443743a893faf"}, ] [package.dependencies] aiohttp = ">=3.9.2,<4.0.0" aioitertools = ">=0.5.1,<1.0.0" botocore = ">=1.36.0,<1.36.4" jmespath = ">=0.7.1,<2.0.0" multidict = ">=6.0.0,<7.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] wrapt = ">=1.10.10,<2.0.0" [package.extras] awscli = ["awscli (>=1.37.0,<1.37.4)"] boto3 = ["boto3 (>=1.36.0,<1.36.4)"] [[package]] name = "aiohappyeyeballs" version = "2.3.7" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ {file = "aiohappyeyeballs-2.3.7-py3-none-any.whl", hash = "sha256:337ce4dc0e99eb697c3c5a77d6cb3c52925824d9a67ac0dea7c55b8a2d60b222"}, {file = "aiohappyeyeballs-2.3.7.tar.gz", hash = "sha256:e794cd29ba6a14078092984e43688212a19081de3a73b6796c2fdeb3706dd6ce"}, ] [[package]] name = "aiohttp" version = "3.11.11" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" files = [ {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, ] [package.dependencies] aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aioitertools" version = "0.11.0" description = "itertools and builtins for AsyncIO and mixed iterables" optional = false python-versions = ">=3.6" files = [ {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, ] [package.dependencies] typing_extensions = {version = ">=4.0", markers = "python_version < \"3.10\""} [[package]] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.7" files = [ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, ] [package.dependencies] frozenlist = ">=1.1.0" [[package]] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.7" files = [ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "attrs" version = "23.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"}, ] [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]"] [[package]] name = "babel" version = "2.15.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "backports-strenum" version = "1.3.1" description = "Base class for creating enumerated constants that are also subclasses of str" optional = false python-versions = ">=3.8.6,<3.11" files = [ {file = "backports_strenum-1.3.1-py3-none-any.whl", hash = "sha256:cdcfe36dc897e2615dc793b7d3097f54d359918fc448754a517e6f23044ccf83"}, {file = "backports_strenum-1.3.1.tar.gz", hash = "sha256:77c52407342898497714f0596e86188bb7084f89063226f4ba66863482f42414"}, ] [[package]] name = "boto3" version = "1.36.1" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ {file = "boto3-1.36.1-py3-none-any.whl", hash = "sha256:eb21380d73fec6645439c0d802210f72a0cdb3295b02953f246ff53f512faa8f"}, {file = "boto3-1.36.1.tar.gz", hash = "sha256:258ab77225a81d3cf3029c9afe9920cd9dec317689dfadec6f6f0a23130bb60a"}, ] [package.dependencies] botocore = ">=1.36.1,<1.37.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.11.0,<0.12.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" version = "1.36.6" description = "Type annotations for boto3 1.36.6 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ {file = "boto3_stubs-1.36.6-py3-none-any.whl", hash = "sha256:fa601aa025e328848b6159d1e8c8cb374e4a8421f2514d962d5f468d26e92b37"}, {file = "boto3_stubs-1.36.6.tar.gz", hash = "sha256:f5ec1a5a6ecb92912903631163482f6ce84f092d5bc36ec08f770700befccc7b"}, ] [package.dependencies] botocore-stubs = "*" types-s3transfer = "*" typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [package.extras] accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.36.0,<1.37.0)"] account = ["mypy-boto3-account (>=1.36.0,<1.37.0)"] acm = ["mypy-boto3-acm (>=1.36.0,<1.37.0)"] acm-pca = ["mypy-boto3-acm-pca (>=1.36.0,<1.37.0)"] all = ["mypy-boto3-accessanalyzer (>=1.36.0,<1.37.0)", "mypy-boto3-account (>=1.36.0,<1.37.0)", "mypy-boto3-acm (>=1.36.0,<1.37.0)", "mypy-boto3-acm-pca (>=1.36.0,<1.37.0)", "mypy-boto3-amp (>=1.36.0,<1.37.0)", "mypy-boto3-amplify (>=1.36.0,<1.37.0)", "mypy-boto3-amplifybackend (>=1.36.0,<1.37.0)", "mypy-boto3-amplifyuibuilder (>=1.36.0,<1.37.0)", "mypy-boto3-apigateway (>=1.36.0,<1.37.0)", "mypy-boto3-apigatewaymanagementapi (>=1.36.0,<1.37.0)", "mypy-boto3-apigatewayv2 (>=1.36.0,<1.37.0)", "mypy-boto3-appconfig (>=1.36.0,<1.37.0)", "mypy-boto3-appconfigdata (>=1.36.0,<1.37.0)", "mypy-boto3-appfabric (>=1.36.0,<1.37.0)", "mypy-boto3-appflow (>=1.36.0,<1.37.0)", "mypy-boto3-appintegrations (>=1.36.0,<1.37.0)", "mypy-boto3-application-autoscaling (>=1.36.0,<1.37.0)", "mypy-boto3-application-insights (>=1.36.0,<1.37.0)", "mypy-boto3-application-signals (>=1.36.0,<1.37.0)", "mypy-boto3-applicationcostprofiler (>=1.36.0,<1.37.0)", "mypy-boto3-appmesh (>=1.36.0,<1.37.0)", "mypy-boto3-apprunner (>=1.36.0,<1.37.0)", "mypy-boto3-appstream (>=1.36.0,<1.37.0)", "mypy-boto3-appsync (>=1.36.0,<1.37.0)", "mypy-boto3-apptest (>=1.36.0,<1.37.0)", "mypy-boto3-arc-zonal-shift (>=1.36.0,<1.37.0)", "mypy-boto3-artifact (>=1.36.0,<1.37.0)", "mypy-boto3-athena (>=1.36.0,<1.37.0)", "mypy-boto3-auditmanager (>=1.36.0,<1.37.0)", "mypy-boto3-autoscaling (>=1.36.0,<1.37.0)", "mypy-boto3-autoscaling-plans (>=1.36.0,<1.37.0)", "mypy-boto3-b2bi (>=1.36.0,<1.37.0)", "mypy-boto3-backup (>=1.36.0,<1.37.0)", "mypy-boto3-backup-gateway (>=1.36.0,<1.37.0)", "mypy-boto3-backupsearch (>=1.36.0,<1.37.0)", "mypy-boto3-batch (>=1.36.0,<1.37.0)", "mypy-boto3-bcm-data-exports (>=1.36.0,<1.37.0)", "mypy-boto3-bcm-pricing-calculator (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-agent (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-agent-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-data-automation (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-data-automation-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-billing (>=1.36.0,<1.37.0)", "mypy-boto3-billingconductor (>=1.36.0,<1.37.0)", "mypy-boto3-braket (>=1.36.0,<1.37.0)", "mypy-boto3-budgets (>=1.36.0,<1.37.0)", "mypy-boto3-ce (>=1.36.0,<1.37.0)", "mypy-boto3-chatbot (>=1.36.0,<1.37.0)", "mypy-boto3-chime (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-identity (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-meetings (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-messaging (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-voice (>=1.36.0,<1.37.0)", "mypy-boto3-cleanrooms (>=1.36.0,<1.37.0)", "mypy-boto3-cleanroomsml (>=1.36.0,<1.37.0)", "mypy-boto3-cloud9 (>=1.36.0,<1.37.0)", "mypy-boto3-cloudcontrol (>=1.36.0,<1.37.0)", "mypy-boto3-clouddirectory (>=1.36.0,<1.37.0)", "mypy-boto3-cloudformation (>=1.36.0,<1.37.0)", "mypy-boto3-cloudfront (>=1.36.0,<1.37.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.36.0,<1.37.0)", "mypy-boto3-cloudhsm (>=1.36.0,<1.37.0)", "mypy-boto3-cloudhsmv2 (>=1.36.0,<1.37.0)", "mypy-boto3-cloudsearch (>=1.36.0,<1.37.0)", "mypy-boto3-cloudsearchdomain (>=1.36.0,<1.37.0)", "mypy-boto3-cloudtrail (>=1.36.0,<1.37.0)", "mypy-boto3-cloudtrail-data (>=1.36.0,<1.37.0)", "mypy-boto3-cloudwatch (>=1.36.0,<1.37.0)", "mypy-boto3-codeartifact (>=1.36.0,<1.37.0)", "mypy-boto3-codebuild (>=1.36.0,<1.37.0)", "mypy-boto3-codecatalyst (>=1.36.0,<1.37.0)", "mypy-boto3-codecommit (>=1.36.0,<1.37.0)", "mypy-boto3-codeconnections (>=1.36.0,<1.37.0)", "mypy-boto3-codedeploy (>=1.36.0,<1.37.0)", "mypy-boto3-codeguru-reviewer (>=1.36.0,<1.37.0)", "mypy-boto3-codeguru-security (>=1.36.0,<1.37.0)", "mypy-boto3-codeguruprofiler (>=1.36.0,<1.37.0)", "mypy-boto3-codepipeline (>=1.36.0,<1.37.0)", "mypy-boto3-codestar-connections (>=1.36.0,<1.37.0)", "mypy-boto3-codestar-notifications (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-identity (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-idp (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-sync (>=1.36.0,<1.37.0)", "mypy-boto3-comprehend (>=1.36.0,<1.37.0)", "mypy-boto3-comprehendmedical (>=1.36.0,<1.37.0)", "mypy-boto3-compute-optimizer (>=1.36.0,<1.37.0)", "mypy-boto3-config (>=1.36.0,<1.37.0)", "mypy-boto3-connect (>=1.36.0,<1.37.0)", "mypy-boto3-connect-contact-lens (>=1.36.0,<1.37.0)", "mypy-boto3-connectcampaigns (>=1.36.0,<1.37.0)", "mypy-boto3-connectcampaignsv2 (>=1.36.0,<1.37.0)", "mypy-boto3-connectcases (>=1.36.0,<1.37.0)", "mypy-boto3-connectparticipant (>=1.36.0,<1.37.0)", "mypy-boto3-controlcatalog (>=1.36.0,<1.37.0)", "mypy-boto3-controltower (>=1.36.0,<1.37.0)", "mypy-boto3-cost-optimization-hub (>=1.36.0,<1.37.0)", "mypy-boto3-cur (>=1.36.0,<1.37.0)", "mypy-boto3-customer-profiles (>=1.36.0,<1.37.0)", "mypy-boto3-databrew (>=1.36.0,<1.37.0)", "mypy-boto3-dataexchange (>=1.36.0,<1.37.0)", "mypy-boto3-datapipeline (>=1.36.0,<1.37.0)", "mypy-boto3-datasync (>=1.36.0,<1.37.0)", "mypy-boto3-datazone (>=1.36.0,<1.37.0)", "mypy-boto3-dax (>=1.36.0,<1.37.0)", "mypy-boto3-deadline (>=1.36.0,<1.37.0)", "mypy-boto3-detective (>=1.36.0,<1.37.0)", "mypy-boto3-devicefarm (>=1.36.0,<1.37.0)", "mypy-boto3-devops-guru (>=1.36.0,<1.37.0)", "mypy-boto3-directconnect (>=1.36.0,<1.37.0)", "mypy-boto3-discovery (>=1.36.0,<1.37.0)", "mypy-boto3-dlm (>=1.36.0,<1.37.0)", "mypy-boto3-dms (>=1.36.0,<1.37.0)", "mypy-boto3-docdb (>=1.36.0,<1.37.0)", "mypy-boto3-docdb-elastic (>=1.36.0,<1.37.0)", "mypy-boto3-drs (>=1.36.0,<1.37.0)", "mypy-boto3-ds (>=1.36.0,<1.37.0)", "mypy-boto3-ds-data (>=1.36.0,<1.37.0)", "mypy-boto3-dsql (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodb (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodbstreams (>=1.36.0,<1.37.0)", "mypy-boto3-ebs (>=1.36.0,<1.37.0)", "mypy-boto3-ec2 (>=1.36.0,<1.37.0)", "mypy-boto3-ec2-instance-connect (>=1.36.0,<1.37.0)", "mypy-boto3-ecr (>=1.36.0,<1.37.0)", "mypy-boto3-ecr-public (>=1.36.0,<1.37.0)", "mypy-boto3-ecs (>=1.36.0,<1.37.0)", "mypy-boto3-efs (>=1.36.0,<1.37.0)", "mypy-boto3-eks (>=1.36.0,<1.37.0)", "mypy-boto3-eks-auth (>=1.36.0,<1.37.0)", "mypy-boto3-elastic-inference (>=1.36.0,<1.37.0)", "mypy-boto3-elasticache (>=1.36.0,<1.37.0)", "mypy-boto3-elasticbeanstalk (>=1.36.0,<1.37.0)", "mypy-boto3-elastictranscoder (>=1.36.0,<1.37.0)", "mypy-boto3-elb (>=1.36.0,<1.37.0)", "mypy-boto3-elbv2 (>=1.36.0,<1.37.0)", "mypy-boto3-emr (>=1.36.0,<1.37.0)", "mypy-boto3-emr-containers (>=1.36.0,<1.37.0)", "mypy-boto3-emr-serverless (>=1.36.0,<1.37.0)", "mypy-boto3-entityresolution (>=1.36.0,<1.37.0)", "mypy-boto3-es (>=1.36.0,<1.37.0)", "mypy-boto3-events (>=1.36.0,<1.37.0)", "mypy-boto3-evidently (>=1.36.0,<1.37.0)", "mypy-boto3-finspace (>=1.36.0,<1.37.0)", "mypy-boto3-finspace-data (>=1.36.0,<1.37.0)", "mypy-boto3-firehose (>=1.36.0,<1.37.0)", "mypy-boto3-fis (>=1.36.0,<1.37.0)", "mypy-boto3-fms (>=1.36.0,<1.37.0)", "mypy-boto3-forecast (>=1.36.0,<1.37.0)", "mypy-boto3-forecastquery (>=1.36.0,<1.37.0)", "mypy-boto3-frauddetector (>=1.36.0,<1.37.0)", "mypy-boto3-freetier (>=1.36.0,<1.37.0)", "mypy-boto3-fsx (>=1.36.0,<1.37.0)", "mypy-boto3-gamelift (>=1.36.0,<1.37.0)", "mypy-boto3-geo-maps (>=1.36.0,<1.37.0)", "mypy-boto3-geo-places (>=1.36.0,<1.37.0)", "mypy-boto3-geo-routes (>=1.36.0,<1.37.0)", "mypy-boto3-glacier (>=1.36.0,<1.37.0)", "mypy-boto3-globalaccelerator (>=1.36.0,<1.37.0)", "mypy-boto3-glue (>=1.36.0,<1.37.0)", "mypy-boto3-grafana (>=1.36.0,<1.37.0)", "mypy-boto3-greengrass (>=1.36.0,<1.37.0)", "mypy-boto3-greengrassv2 (>=1.36.0,<1.37.0)", "mypy-boto3-groundstation (>=1.36.0,<1.37.0)", "mypy-boto3-guardduty (>=1.36.0,<1.37.0)", "mypy-boto3-health (>=1.36.0,<1.37.0)", "mypy-boto3-healthlake (>=1.36.0,<1.37.0)", "mypy-boto3-iam (>=1.36.0,<1.37.0)", "mypy-boto3-identitystore (>=1.36.0,<1.37.0)", "mypy-boto3-imagebuilder (>=1.36.0,<1.37.0)", "mypy-boto3-importexport (>=1.36.0,<1.37.0)", "mypy-boto3-inspector (>=1.36.0,<1.37.0)", "mypy-boto3-inspector-scan (>=1.36.0,<1.37.0)", "mypy-boto3-inspector2 (>=1.36.0,<1.37.0)", "mypy-boto3-internetmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-invoicing (>=1.36.0,<1.37.0)", "mypy-boto3-iot (>=1.36.0,<1.37.0)", "mypy-boto3-iot-data (>=1.36.0,<1.37.0)", "mypy-boto3-iot-jobs-data (>=1.36.0,<1.37.0)", "mypy-boto3-iotanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-iotdeviceadvisor (>=1.36.0,<1.37.0)", "mypy-boto3-iotevents (>=1.36.0,<1.37.0)", "mypy-boto3-iotevents-data (>=1.36.0,<1.37.0)", "mypy-boto3-iotfleethub (>=1.36.0,<1.37.0)", "mypy-boto3-iotfleetwise (>=1.36.0,<1.37.0)", "mypy-boto3-iotsecuretunneling (>=1.36.0,<1.37.0)", "mypy-boto3-iotsitewise (>=1.36.0,<1.37.0)", "mypy-boto3-iotthingsgraph (>=1.36.0,<1.37.0)", "mypy-boto3-iottwinmaker (>=1.36.0,<1.37.0)", "mypy-boto3-iotwireless (>=1.36.0,<1.37.0)", "mypy-boto3-ivs (>=1.36.0,<1.37.0)", "mypy-boto3-ivs-realtime (>=1.36.0,<1.37.0)", "mypy-boto3-ivschat (>=1.36.0,<1.37.0)", "mypy-boto3-kafka (>=1.36.0,<1.37.0)", "mypy-boto3-kafkaconnect (>=1.36.0,<1.37.0)", "mypy-boto3-kendra (>=1.36.0,<1.37.0)", "mypy-boto3-kendra-ranking (>=1.36.0,<1.37.0)", "mypy-boto3-keyspaces (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-archived-media (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-media (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-signaling (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisvideo (>=1.36.0,<1.37.0)", "mypy-boto3-kms (>=1.36.0,<1.37.0)", "mypy-boto3-lakeformation (>=1.36.0,<1.37.0)", "mypy-boto3-lambda (>=1.36.0,<1.37.0)", "mypy-boto3-launch-wizard (>=1.36.0,<1.37.0)", "mypy-boto3-lex-models (>=1.36.0,<1.37.0)", "mypy-boto3-lex-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-lexv2-models (>=1.36.0,<1.37.0)", "mypy-boto3-lexv2-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.36.0,<1.37.0)", "mypy-boto3-lightsail (>=1.36.0,<1.37.0)", "mypy-boto3-location (>=1.36.0,<1.37.0)", "mypy-boto3-logs (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutequipment (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutmetrics (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutvision (>=1.36.0,<1.37.0)", "mypy-boto3-m2 (>=1.36.0,<1.37.0)", "mypy-boto3-machinelearning (>=1.36.0,<1.37.0)", "mypy-boto3-macie2 (>=1.36.0,<1.37.0)", "mypy-boto3-mailmanager (>=1.36.0,<1.37.0)", "mypy-boto3-managedblockchain (>=1.36.0,<1.37.0)", "mypy-boto3-managedblockchain-query (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-agreement (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-catalog (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-deployment (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-entitlement (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-reporting (>=1.36.0,<1.37.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-mediaconnect (>=1.36.0,<1.37.0)", "mypy-boto3-mediaconvert (>=1.36.0,<1.37.0)", "mypy-boto3-medialive (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackage (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackage-vod (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackagev2 (>=1.36.0,<1.37.0)", "mypy-boto3-mediastore (>=1.36.0,<1.37.0)", "mypy-boto3-mediastore-data (>=1.36.0,<1.37.0)", "mypy-boto3-mediatailor (>=1.36.0,<1.37.0)", "mypy-boto3-medical-imaging (>=1.36.0,<1.37.0)", "mypy-boto3-memorydb (>=1.36.0,<1.37.0)", "mypy-boto3-meteringmarketplace (>=1.36.0,<1.37.0)", "mypy-boto3-mgh (>=1.36.0,<1.37.0)", "mypy-boto3-mgn (>=1.36.0,<1.37.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhub-config (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhuborchestrator (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhubstrategy (>=1.36.0,<1.37.0)", "mypy-boto3-mq (>=1.36.0,<1.37.0)", "mypy-boto3-mturk (>=1.36.0,<1.37.0)", "mypy-boto3-mwaa (>=1.36.0,<1.37.0)", "mypy-boto3-neptune (>=1.36.0,<1.37.0)", "mypy-boto3-neptune-graph (>=1.36.0,<1.37.0)", "mypy-boto3-neptunedata (>=1.36.0,<1.37.0)", "mypy-boto3-network-firewall (>=1.36.0,<1.37.0)", "mypy-boto3-networkflowmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-networkmanager (>=1.36.0,<1.37.0)", "mypy-boto3-networkmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-notifications (>=1.36.0,<1.37.0)", "mypy-boto3-notificationscontacts (>=1.36.0,<1.37.0)", "mypy-boto3-oam (>=1.36.0,<1.37.0)", "mypy-boto3-observabilityadmin (>=1.36.0,<1.37.0)", "mypy-boto3-omics (>=1.36.0,<1.37.0)", "mypy-boto3-opensearch (>=1.36.0,<1.37.0)", "mypy-boto3-opensearchserverless (>=1.36.0,<1.37.0)", "mypy-boto3-opsworks (>=1.36.0,<1.37.0)", "mypy-boto3-opsworkscm (>=1.36.0,<1.37.0)", "mypy-boto3-organizations (>=1.36.0,<1.37.0)", "mypy-boto3-osis (>=1.36.0,<1.37.0)", "mypy-boto3-outposts (>=1.36.0,<1.37.0)", "mypy-boto3-panorama (>=1.36.0,<1.37.0)", "mypy-boto3-partnercentral-selling (>=1.36.0,<1.37.0)", "mypy-boto3-payment-cryptography (>=1.36.0,<1.37.0)", "mypy-boto3-payment-cryptography-data (>=1.36.0,<1.37.0)", "mypy-boto3-pca-connector-ad (>=1.36.0,<1.37.0)", "mypy-boto3-pca-connector-scep (>=1.36.0,<1.37.0)", "mypy-boto3-pcs (>=1.36.0,<1.37.0)", "mypy-boto3-personalize (>=1.36.0,<1.37.0)", "mypy-boto3-personalize-events (>=1.36.0,<1.37.0)", "mypy-boto3-personalize-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-pi (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-email (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-sms-voice (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.36.0,<1.37.0)", "mypy-boto3-pipes (>=1.36.0,<1.37.0)", "mypy-boto3-polly (>=1.36.0,<1.37.0)", "mypy-boto3-pricing (>=1.36.0,<1.37.0)", "mypy-boto3-privatenetworks (>=1.36.0,<1.37.0)", "mypy-boto3-proton (>=1.36.0,<1.37.0)", "mypy-boto3-qapps (>=1.36.0,<1.37.0)", "mypy-boto3-qbusiness (>=1.36.0,<1.37.0)", "mypy-boto3-qconnect (>=1.36.0,<1.37.0)", "mypy-boto3-qldb (>=1.36.0,<1.37.0)", "mypy-boto3-qldb-session (>=1.36.0,<1.37.0)", "mypy-boto3-quicksight (>=1.36.0,<1.37.0)", "mypy-boto3-ram (>=1.36.0,<1.37.0)", "mypy-boto3-rbin (>=1.36.0,<1.37.0)", "mypy-boto3-rds (>=1.36.0,<1.37.0)", "mypy-boto3-rds-data (>=1.36.0,<1.37.0)", "mypy-boto3-redshift (>=1.36.0,<1.37.0)", "mypy-boto3-redshift-data (>=1.36.0,<1.37.0)", "mypy-boto3-redshift-serverless (>=1.36.0,<1.37.0)", "mypy-boto3-rekognition (>=1.36.0,<1.37.0)", "mypy-boto3-repostspace (>=1.36.0,<1.37.0)", "mypy-boto3-resiliencehub (>=1.36.0,<1.37.0)", "mypy-boto3-resource-explorer-2 (>=1.36.0,<1.37.0)", "mypy-boto3-resource-groups (>=1.36.0,<1.37.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.36.0,<1.37.0)", "mypy-boto3-robomaker (>=1.36.0,<1.37.0)", "mypy-boto3-rolesanywhere (>=1.36.0,<1.37.0)", "mypy-boto3-route53 (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-cluster (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-control-config (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-readiness (>=1.36.0,<1.37.0)", "mypy-boto3-route53domains (>=1.36.0,<1.37.0)", "mypy-boto3-route53profiles (>=1.36.0,<1.37.0)", "mypy-boto3-route53resolver (>=1.36.0,<1.37.0)", "mypy-boto3-rum (>=1.36.0,<1.37.0)", "mypy-boto3-s3 (>=1.36.0,<1.37.0)", "mypy-boto3-s3control (>=1.36.0,<1.37.0)", "mypy-boto3-s3outposts (>=1.36.0,<1.37.0)", "mypy-boto3-s3tables (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-edge (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-geospatial (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-metrics (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-savingsplans (>=1.36.0,<1.37.0)", "mypy-boto3-scheduler (>=1.36.0,<1.37.0)", "mypy-boto3-schemas (>=1.36.0,<1.37.0)", "mypy-boto3-sdb (>=1.36.0,<1.37.0)", "mypy-boto3-secretsmanager (>=1.36.0,<1.37.0)", "mypy-boto3-security-ir (>=1.36.0,<1.37.0)", "mypy-boto3-securityhub (>=1.36.0,<1.37.0)", "mypy-boto3-securitylake (>=1.36.0,<1.37.0)", "mypy-boto3-serverlessrepo (>=1.36.0,<1.37.0)", "mypy-boto3-service-quotas (>=1.36.0,<1.37.0)", "mypy-boto3-servicecatalog (>=1.36.0,<1.37.0)", "mypy-boto3-servicecatalog-appregistry (>=1.36.0,<1.37.0)", "mypy-boto3-servicediscovery (>=1.36.0,<1.37.0)", "mypy-boto3-ses (>=1.36.0,<1.37.0)", "mypy-boto3-sesv2 (>=1.36.0,<1.37.0)", "mypy-boto3-shield (>=1.36.0,<1.37.0)", "mypy-boto3-signer (>=1.36.0,<1.37.0)", "mypy-boto3-simspaceweaver (>=1.36.0,<1.37.0)", "mypy-boto3-sms (>=1.36.0,<1.37.0)", "mypy-boto3-sms-voice (>=1.36.0,<1.37.0)", "mypy-boto3-snow-device-management (>=1.36.0,<1.37.0)", "mypy-boto3-snowball (>=1.36.0,<1.37.0)", "mypy-boto3-sns (>=1.36.0,<1.37.0)", "mypy-boto3-socialmessaging (>=1.36.0,<1.37.0)", "mypy-boto3-sqs (>=1.36.0,<1.37.0)", "mypy-boto3-ssm (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-contacts (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-incidents (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-quicksetup (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-sap (>=1.36.0,<1.37.0)", "mypy-boto3-sso (>=1.36.0,<1.37.0)", "mypy-boto3-sso-admin (>=1.36.0,<1.37.0)", "mypy-boto3-sso-oidc (>=1.36.0,<1.37.0)", "mypy-boto3-stepfunctions (>=1.36.0,<1.37.0)", "mypy-boto3-storagegateway (>=1.36.0,<1.37.0)", "mypy-boto3-sts (>=1.36.0,<1.37.0)", "mypy-boto3-supplychain (>=1.36.0,<1.37.0)", "mypy-boto3-support (>=1.36.0,<1.37.0)", "mypy-boto3-support-app (>=1.36.0,<1.37.0)", "mypy-boto3-swf (>=1.36.0,<1.37.0)", "mypy-boto3-synthetics (>=1.36.0,<1.37.0)", "mypy-boto3-taxsettings (>=1.36.0,<1.37.0)", "mypy-boto3-textract (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-influxdb (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-query (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-write (>=1.36.0,<1.37.0)", "mypy-boto3-tnb (>=1.36.0,<1.37.0)", "mypy-boto3-transcribe (>=1.36.0,<1.37.0)", "mypy-boto3-transfer (>=1.36.0,<1.37.0)", "mypy-boto3-translate (>=1.36.0,<1.37.0)", "mypy-boto3-trustedadvisor (>=1.36.0,<1.37.0)", "mypy-boto3-verifiedpermissions (>=1.36.0,<1.37.0)", "mypy-boto3-voice-id (>=1.36.0,<1.37.0)", "mypy-boto3-vpc-lattice (>=1.36.0,<1.37.0)", "mypy-boto3-waf (>=1.36.0,<1.37.0)", "mypy-boto3-waf-regional (>=1.36.0,<1.37.0)", "mypy-boto3-wafv2 (>=1.36.0,<1.37.0)", "mypy-boto3-wellarchitected (>=1.36.0,<1.37.0)", "mypy-boto3-wisdom (>=1.36.0,<1.37.0)", "mypy-boto3-workdocs (>=1.36.0,<1.37.0)", "mypy-boto3-workmail (>=1.36.0,<1.37.0)", "mypy-boto3-workmailmessageflow (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces-thin-client (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces-web (>=1.36.0,<1.37.0)", "mypy-boto3-xray (>=1.36.0,<1.37.0)"] amp = ["mypy-boto3-amp (>=1.36.0,<1.37.0)"] amplify = ["mypy-boto3-amplify (>=1.36.0,<1.37.0)"] amplifybackend = ["mypy-boto3-amplifybackend (>=1.36.0,<1.37.0)"] amplifyuibuilder = ["mypy-boto3-amplifyuibuilder (>=1.36.0,<1.37.0)"] apigateway = ["mypy-boto3-apigateway (>=1.36.0,<1.37.0)"] apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (>=1.36.0,<1.37.0)"] apigatewayv2 = ["mypy-boto3-apigatewayv2 (>=1.36.0,<1.37.0)"] appconfig = ["mypy-boto3-appconfig (>=1.36.0,<1.37.0)"] appconfigdata = ["mypy-boto3-appconfigdata (>=1.36.0,<1.37.0)"] appfabric = ["mypy-boto3-appfabric (>=1.36.0,<1.37.0)"] appflow = ["mypy-boto3-appflow (>=1.36.0,<1.37.0)"] appintegrations = ["mypy-boto3-appintegrations (>=1.36.0,<1.37.0)"] application-autoscaling = ["mypy-boto3-application-autoscaling (>=1.36.0,<1.37.0)"] application-insights = ["mypy-boto3-application-insights (>=1.36.0,<1.37.0)"] application-signals = ["mypy-boto3-application-signals (>=1.36.0,<1.37.0)"] applicationcostprofiler = ["mypy-boto3-applicationcostprofiler (>=1.36.0,<1.37.0)"] appmesh = ["mypy-boto3-appmesh (>=1.36.0,<1.37.0)"] apprunner = ["mypy-boto3-apprunner (>=1.36.0,<1.37.0)"] appstream = ["mypy-boto3-appstream (>=1.36.0,<1.37.0)"] appsync = ["mypy-boto3-appsync (>=1.36.0,<1.37.0)"] apptest = ["mypy-boto3-apptest (>=1.36.0,<1.37.0)"] arc-zonal-shift = ["mypy-boto3-arc-zonal-shift (>=1.36.0,<1.37.0)"] artifact = ["mypy-boto3-artifact (>=1.36.0,<1.37.0)"] athena = ["mypy-boto3-athena (>=1.36.0,<1.37.0)"] auditmanager = ["mypy-boto3-auditmanager (>=1.36.0,<1.37.0)"] autoscaling = ["mypy-boto3-autoscaling (>=1.36.0,<1.37.0)"] autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.36.0,<1.37.0)"] b2bi = ["mypy-boto3-b2bi (>=1.36.0,<1.37.0)"] backup = ["mypy-boto3-backup (>=1.36.0,<1.37.0)"] backup-gateway = ["mypy-boto3-backup-gateway (>=1.36.0,<1.37.0)"] backupsearch = ["mypy-boto3-backupsearch (>=1.36.0,<1.37.0)"] batch = ["mypy-boto3-batch (>=1.36.0,<1.37.0)"] bcm-data-exports = ["mypy-boto3-bcm-data-exports (>=1.36.0,<1.37.0)"] bcm-pricing-calculator = ["mypy-boto3-bcm-pricing-calculator (>=1.36.0,<1.37.0)"] bedrock = ["mypy-boto3-bedrock (>=1.36.0,<1.37.0)"] bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.36.0,<1.37.0)"] bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.36.0,<1.37.0)"] bedrock-data-automation = ["mypy-boto3-bedrock-data-automation (>=1.36.0,<1.37.0)"] bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime (>=1.36.0,<1.37.0)"] bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] boto3 = ["boto3 (==1.36.6)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] chatbot = ["mypy-boto3-chatbot (>=1.36.0,<1.37.0)"] chime = ["mypy-boto3-chime (>=1.36.0,<1.37.0)"] chime-sdk-identity = ["mypy-boto3-chime-sdk-identity (>=1.36.0,<1.37.0)"] chime-sdk-media-pipelines = ["mypy-boto3-chime-sdk-media-pipelines (>=1.36.0,<1.37.0)"] chime-sdk-meetings = ["mypy-boto3-chime-sdk-meetings (>=1.36.0,<1.37.0)"] chime-sdk-messaging = ["mypy-boto3-chime-sdk-messaging (>=1.36.0,<1.37.0)"] chime-sdk-voice = ["mypy-boto3-chime-sdk-voice (>=1.36.0,<1.37.0)"] cleanrooms = ["mypy-boto3-cleanrooms (>=1.36.0,<1.37.0)"] cleanroomsml = ["mypy-boto3-cleanroomsml (>=1.36.0,<1.37.0)"] cloud9 = ["mypy-boto3-cloud9 (>=1.36.0,<1.37.0)"] cloudcontrol = ["mypy-boto3-cloudcontrol (>=1.36.0,<1.37.0)"] clouddirectory = ["mypy-boto3-clouddirectory (>=1.36.0,<1.37.0)"] cloudformation = ["mypy-boto3-cloudformation (>=1.36.0,<1.37.0)"] cloudfront = ["mypy-boto3-cloudfront (>=1.36.0,<1.37.0)"] cloudfront-keyvaluestore = ["mypy-boto3-cloudfront-keyvaluestore (>=1.36.0,<1.37.0)"] cloudhsm = ["mypy-boto3-cloudhsm (>=1.36.0,<1.37.0)"] cloudhsmv2 = ["mypy-boto3-cloudhsmv2 (>=1.36.0,<1.37.0)"] cloudsearch = ["mypy-boto3-cloudsearch (>=1.36.0,<1.37.0)"] cloudsearchdomain = ["mypy-boto3-cloudsearchdomain (>=1.36.0,<1.37.0)"] cloudtrail = ["mypy-boto3-cloudtrail (>=1.36.0,<1.37.0)"] cloudtrail-data = ["mypy-boto3-cloudtrail-data (>=1.36.0,<1.37.0)"] cloudwatch = ["mypy-boto3-cloudwatch (>=1.36.0,<1.37.0)"] codeartifact = ["mypy-boto3-codeartifact (>=1.36.0,<1.37.0)"] codebuild = ["mypy-boto3-codebuild (>=1.36.0,<1.37.0)"] codecatalyst = ["mypy-boto3-codecatalyst (>=1.36.0,<1.37.0)"] codecommit = ["mypy-boto3-codecommit (>=1.36.0,<1.37.0)"] codeconnections = ["mypy-boto3-codeconnections (>=1.36.0,<1.37.0)"] codedeploy = ["mypy-boto3-codedeploy (>=1.36.0,<1.37.0)"] codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (>=1.36.0,<1.37.0)"] codeguru-security = ["mypy-boto3-codeguru-security (>=1.36.0,<1.37.0)"] codeguruprofiler = ["mypy-boto3-codeguruprofiler (>=1.36.0,<1.37.0)"] codepipeline = ["mypy-boto3-codepipeline (>=1.36.0,<1.37.0)"] codestar-connections = ["mypy-boto3-codestar-connections (>=1.36.0,<1.37.0)"] codestar-notifications = ["mypy-boto3-codestar-notifications (>=1.36.0,<1.37.0)"] cognito-identity = ["mypy-boto3-cognito-identity (>=1.36.0,<1.37.0)"] cognito-idp = ["mypy-boto3-cognito-idp (>=1.36.0,<1.37.0)"] cognito-sync = ["mypy-boto3-cognito-sync (>=1.36.0,<1.37.0)"] comprehend = ["mypy-boto3-comprehend (>=1.36.0,<1.37.0)"] comprehendmedical = ["mypy-boto3-comprehendmedical (>=1.36.0,<1.37.0)"] compute-optimizer = ["mypy-boto3-compute-optimizer (>=1.36.0,<1.37.0)"] config = ["mypy-boto3-config (>=1.36.0,<1.37.0)"] connect = ["mypy-boto3-connect (>=1.36.0,<1.37.0)"] connect-contact-lens = ["mypy-boto3-connect-contact-lens (>=1.36.0,<1.37.0)"] connectcampaigns = ["mypy-boto3-connectcampaigns (>=1.36.0,<1.37.0)"] connectcampaignsv2 = ["mypy-boto3-connectcampaignsv2 (>=1.36.0,<1.37.0)"] connectcases = ["mypy-boto3-connectcases (>=1.36.0,<1.37.0)"] connectparticipant = ["mypy-boto3-connectparticipant (>=1.36.0,<1.37.0)"] controlcatalog = ["mypy-boto3-controlcatalog (>=1.36.0,<1.37.0)"] controltower = ["mypy-boto3-controltower (>=1.36.0,<1.37.0)"] cost-optimization-hub = ["mypy-boto3-cost-optimization-hub (>=1.36.0,<1.37.0)"] cur = ["mypy-boto3-cur (>=1.36.0,<1.37.0)"] customer-profiles = ["mypy-boto3-customer-profiles (>=1.36.0,<1.37.0)"] databrew = ["mypy-boto3-databrew (>=1.36.0,<1.37.0)"] dataexchange = ["mypy-boto3-dataexchange (>=1.36.0,<1.37.0)"] datapipeline = ["mypy-boto3-datapipeline (>=1.36.0,<1.37.0)"] datasync = ["mypy-boto3-datasync (>=1.36.0,<1.37.0)"] datazone = ["mypy-boto3-datazone (>=1.36.0,<1.37.0)"] dax = ["mypy-boto3-dax (>=1.36.0,<1.37.0)"] deadline = ["mypy-boto3-deadline (>=1.36.0,<1.37.0)"] detective = ["mypy-boto3-detective (>=1.36.0,<1.37.0)"] devicefarm = ["mypy-boto3-devicefarm (>=1.36.0,<1.37.0)"] devops-guru = ["mypy-boto3-devops-guru (>=1.36.0,<1.37.0)"] directconnect = ["mypy-boto3-directconnect (>=1.36.0,<1.37.0)"] discovery = ["mypy-boto3-discovery (>=1.36.0,<1.37.0)"] dlm = ["mypy-boto3-dlm (>=1.36.0,<1.37.0)"] dms = ["mypy-boto3-dms (>=1.36.0,<1.37.0)"] docdb = ["mypy-boto3-docdb (>=1.36.0,<1.37.0)"] docdb-elastic = ["mypy-boto3-docdb-elastic (>=1.36.0,<1.37.0)"] drs = ["mypy-boto3-drs (>=1.36.0,<1.37.0)"] ds = ["mypy-boto3-ds (>=1.36.0,<1.37.0)"] ds-data = ["mypy-boto3-ds-data (>=1.36.0,<1.37.0)"] dsql = ["mypy-boto3-dsql (>=1.36.0,<1.37.0)"] dynamodb = ["mypy-boto3-dynamodb (>=1.36.0,<1.37.0)"] dynamodbstreams = ["mypy-boto3-dynamodbstreams (>=1.36.0,<1.37.0)"] ebs = ["mypy-boto3-ebs (>=1.36.0,<1.37.0)"] ec2 = ["mypy-boto3-ec2 (>=1.36.0,<1.37.0)"] ec2-instance-connect = ["mypy-boto3-ec2-instance-connect (>=1.36.0,<1.37.0)"] ecr = ["mypy-boto3-ecr (>=1.36.0,<1.37.0)"] ecr-public = ["mypy-boto3-ecr-public (>=1.36.0,<1.37.0)"] ecs = ["mypy-boto3-ecs (>=1.36.0,<1.37.0)"] efs = ["mypy-boto3-efs (>=1.36.0,<1.37.0)"] eks = ["mypy-boto3-eks (>=1.36.0,<1.37.0)"] eks-auth = ["mypy-boto3-eks-auth (>=1.36.0,<1.37.0)"] elastic-inference = ["mypy-boto3-elastic-inference (>=1.36.0,<1.37.0)"] elasticache = ["mypy-boto3-elasticache (>=1.36.0,<1.37.0)"] elasticbeanstalk = ["mypy-boto3-elasticbeanstalk (>=1.36.0,<1.37.0)"] elastictranscoder = ["mypy-boto3-elastictranscoder (>=1.36.0,<1.37.0)"] elb = ["mypy-boto3-elb (>=1.36.0,<1.37.0)"] elbv2 = ["mypy-boto3-elbv2 (>=1.36.0,<1.37.0)"] emr = ["mypy-boto3-emr (>=1.36.0,<1.37.0)"] emr-containers = ["mypy-boto3-emr-containers (>=1.36.0,<1.37.0)"] emr-serverless = ["mypy-boto3-emr-serverless (>=1.36.0,<1.37.0)"] entityresolution = ["mypy-boto3-entityresolution (>=1.36.0,<1.37.0)"] es = ["mypy-boto3-es (>=1.36.0,<1.37.0)"] essential = ["mypy-boto3-cloudformation (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodb (>=1.36.0,<1.37.0)", "mypy-boto3-ec2 (>=1.36.0,<1.37.0)", "mypy-boto3-lambda (>=1.36.0,<1.37.0)", "mypy-boto3-rds (>=1.36.0,<1.37.0)", "mypy-boto3-s3 (>=1.36.0,<1.37.0)", "mypy-boto3-sqs (>=1.36.0,<1.37.0)"] events = ["mypy-boto3-events (>=1.36.0,<1.37.0)"] evidently = ["mypy-boto3-evidently (>=1.36.0,<1.37.0)"] finspace = ["mypy-boto3-finspace (>=1.36.0,<1.37.0)"] finspace-data = ["mypy-boto3-finspace-data (>=1.36.0,<1.37.0)"] firehose = ["mypy-boto3-firehose (>=1.36.0,<1.37.0)"] fis = ["mypy-boto3-fis (>=1.36.0,<1.37.0)"] fms = ["mypy-boto3-fms (>=1.36.0,<1.37.0)"] forecast = ["mypy-boto3-forecast (>=1.36.0,<1.37.0)"] forecastquery = ["mypy-boto3-forecastquery (>=1.36.0,<1.37.0)"] frauddetector = ["mypy-boto3-frauddetector (>=1.36.0,<1.37.0)"] freetier = ["mypy-boto3-freetier (>=1.36.0,<1.37.0)"] fsx = ["mypy-boto3-fsx (>=1.36.0,<1.37.0)"] full = ["boto3-stubs-full (>=1.36.0,<1.37.0)"] gamelift = ["mypy-boto3-gamelift (>=1.36.0,<1.37.0)"] geo-maps = ["mypy-boto3-geo-maps (>=1.36.0,<1.37.0)"] geo-places = ["mypy-boto3-geo-places (>=1.36.0,<1.37.0)"] geo-routes = ["mypy-boto3-geo-routes (>=1.36.0,<1.37.0)"] glacier = ["mypy-boto3-glacier (>=1.36.0,<1.37.0)"] globalaccelerator = ["mypy-boto3-globalaccelerator (>=1.36.0,<1.37.0)"] glue = ["mypy-boto3-glue (>=1.36.0,<1.37.0)"] grafana = ["mypy-boto3-grafana (>=1.36.0,<1.37.0)"] greengrass = ["mypy-boto3-greengrass (>=1.36.0,<1.37.0)"] greengrassv2 = ["mypy-boto3-greengrassv2 (>=1.36.0,<1.37.0)"] groundstation = ["mypy-boto3-groundstation (>=1.36.0,<1.37.0)"] guardduty = ["mypy-boto3-guardduty (>=1.36.0,<1.37.0)"] health = ["mypy-boto3-health (>=1.36.0,<1.37.0)"] healthlake = ["mypy-boto3-healthlake (>=1.36.0,<1.37.0)"] iam = ["mypy-boto3-iam (>=1.36.0,<1.37.0)"] identitystore = ["mypy-boto3-identitystore (>=1.36.0,<1.37.0)"] imagebuilder = ["mypy-boto3-imagebuilder (>=1.36.0,<1.37.0)"] importexport = ["mypy-boto3-importexport (>=1.36.0,<1.37.0)"] inspector = ["mypy-boto3-inspector (>=1.36.0,<1.37.0)"] inspector-scan = ["mypy-boto3-inspector-scan (>=1.36.0,<1.37.0)"] inspector2 = ["mypy-boto3-inspector2 (>=1.36.0,<1.37.0)"] internetmonitor = ["mypy-boto3-internetmonitor (>=1.36.0,<1.37.0)"] invoicing = ["mypy-boto3-invoicing (>=1.36.0,<1.37.0)"] iot = ["mypy-boto3-iot (>=1.36.0,<1.37.0)"] iot-data = ["mypy-boto3-iot-data (>=1.36.0,<1.37.0)"] iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.36.0,<1.37.0)"] iotanalytics = ["mypy-boto3-iotanalytics (>=1.36.0,<1.37.0)"] iotdeviceadvisor = ["mypy-boto3-iotdeviceadvisor (>=1.36.0,<1.37.0)"] iotevents = ["mypy-boto3-iotevents (>=1.36.0,<1.37.0)"] iotevents-data = ["mypy-boto3-iotevents-data (>=1.36.0,<1.37.0)"] iotfleethub = ["mypy-boto3-iotfleethub (>=1.36.0,<1.37.0)"] iotfleetwise = ["mypy-boto3-iotfleetwise (>=1.36.0,<1.37.0)"] iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (>=1.36.0,<1.37.0)"] iotsitewise = ["mypy-boto3-iotsitewise (>=1.36.0,<1.37.0)"] iotthingsgraph = ["mypy-boto3-iotthingsgraph (>=1.36.0,<1.37.0)"] iottwinmaker = ["mypy-boto3-iottwinmaker (>=1.36.0,<1.37.0)"] iotwireless = ["mypy-boto3-iotwireless (>=1.36.0,<1.37.0)"] ivs = ["mypy-boto3-ivs (>=1.36.0,<1.37.0)"] ivs-realtime = ["mypy-boto3-ivs-realtime (>=1.36.0,<1.37.0)"] ivschat = ["mypy-boto3-ivschat (>=1.36.0,<1.37.0)"] kafka = ["mypy-boto3-kafka (>=1.36.0,<1.37.0)"] kafkaconnect = ["mypy-boto3-kafkaconnect (>=1.36.0,<1.37.0)"] kendra = ["mypy-boto3-kendra (>=1.36.0,<1.37.0)"] kendra-ranking = ["mypy-boto3-kendra-ranking (>=1.36.0,<1.37.0)"] keyspaces = ["mypy-boto3-keyspaces (>=1.36.0,<1.37.0)"] kinesis = ["mypy-boto3-kinesis (>=1.36.0,<1.37.0)"] kinesis-video-archived-media = ["mypy-boto3-kinesis-video-archived-media (>=1.36.0,<1.37.0)"] kinesis-video-media = ["mypy-boto3-kinesis-video-media (>=1.36.0,<1.37.0)"] kinesis-video-signaling = ["mypy-boto3-kinesis-video-signaling (>=1.36.0,<1.37.0)"] kinesis-video-webrtc-storage = ["mypy-boto3-kinesis-video-webrtc-storage (>=1.36.0,<1.37.0)"] kinesisanalytics = ["mypy-boto3-kinesisanalytics (>=1.36.0,<1.37.0)"] kinesisanalyticsv2 = ["mypy-boto3-kinesisanalyticsv2 (>=1.36.0,<1.37.0)"] kinesisvideo = ["mypy-boto3-kinesisvideo (>=1.36.0,<1.37.0)"] kms = ["mypy-boto3-kms (>=1.36.0,<1.37.0)"] lakeformation = ["mypy-boto3-lakeformation (>=1.36.0,<1.37.0)"] lambda = ["mypy-boto3-lambda (>=1.36.0,<1.37.0)"] launch-wizard = ["mypy-boto3-launch-wizard (>=1.36.0,<1.37.0)"] lex-models = ["mypy-boto3-lex-models (>=1.36.0,<1.37.0)"] lex-runtime = ["mypy-boto3-lex-runtime (>=1.36.0,<1.37.0)"] lexv2-models = ["mypy-boto3-lexv2-models (>=1.36.0,<1.37.0)"] lexv2-runtime = ["mypy-boto3-lexv2-runtime (>=1.36.0,<1.37.0)"] license-manager = ["mypy-boto3-license-manager (>=1.36.0,<1.37.0)"] license-manager-linux-subscriptions = ["mypy-boto3-license-manager-linux-subscriptions (>=1.36.0,<1.37.0)"] license-manager-user-subscriptions = ["mypy-boto3-license-manager-user-subscriptions (>=1.36.0,<1.37.0)"] lightsail = ["mypy-boto3-lightsail (>=1.36.0,<1.37.0)"] location = ["mypy-boto3-location (>=1.36.0,<1.37.0)"] logs = ["mypy-boto3-logs (>=1.36.0,<1.37.0)"] lookoutequipment = ["mypy-boto3-lookoutequipment (>=1.36.0,<1.37.0)"] lookoutmetrics = ["mypy-boto3-lookoutmetrics (>=1.36.0,<1.37.0)"] lookoutvision = ["mypy-boto3-lookoutvision (>=1.36.0,<1.37.0)"] m2 = ["mypy-boto3-m2 (>=1.36.0,<1.37.0)"] machinelearning = ["mypy-boto3-machinelearning (>=1.36.0,<1.37.0)"] macie2 = ["mypy-boto3-macie2 (>=1.36.0,<1.37.0)"] mailmanager = ["mypy-boto3-mailmanager (>=1.36.0,<1.37.0)"] managedblockchain = ["mypy-boto3-managedblockchain (>=1.36.0,<1.37.0)"] managedblockchain-query = ["mypy-boto3-managedblockchain-query (>=1.36.0,<1.37.0)"] marketplace-agreement = ["mypy-boto3-marketplace-agreement (>=1.36.0,<1.37.0)"] marketplace-catalog = ["mypy-boto3-marketplace-catalog (>=1.36.0,<1.37.0)"] marketplace-deployment = ["mypy-boto3-marketplace-deployment (>=1.36.0,<1.37.0)"] marketplace-entitlement = ["mypy-boto3-marketplace-entitlement (>=1.36.0,<1.37.0)"] marketplace-reporting = ["mypy-boto3-marketplace-reporting (>=1.36.0,<1.37.0)"] marketplacecommerceanalytics = ["mypy-boto3-marketplacecommerceanalytics (>=1.36.0,<1.37.0)"] mediaconnect = ["mypy-boto3-mediaconnect (>=1.36.0,<1.37.0)"] mediaconvert = ["mypy-boto3-mediaconvert (>=1.36.0,<1.37.0)"] medialive = ["mypy-boto3-medialive (>=1.36.0,<1.37.0)"] mediapackage = ["mypy-boto3-mediapackage (>=1.36.0,<1.37.0)"] mediapackage-vod = ["mypy-boto3-mediapackage-vod (>=1.36.0,<1.37.0)"] mediapackagev2 = ["mypy-boto3-mediapackagev2 (>=1.36.0,<1.37.0)"] mediastore = ["mypy-boto3-mediastore (>=1.36.0,<1.37.0)"] mediastore-data = ["mypy-boto3-mediastore-data (>=1.36.0,<1.37.0)"] mediatailor = ["mypy-boto3-mediatailor (>=1.36.0,<1.37.0)"] medical-imaging = ["mypy-boto3-medical-imaging (>=1.36.0,<1.37.0)"] memorydb = ["mypy-boto3-memorydb (>=1.36.0,<1.37.0)"] meteringmarketplace = ["mypy-boto3-meteringmarketplace (>=1.36.0,<1.37.0)"] mgh = ["mypy-boto3-mgh (>=1.36.0,<1.37.0)"] mgn = ["mypy-boto3-mgn (>=1.36.0,<1.37.0)"] migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1.36.0,<1.37.0)"] migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.36.0,<1.37.0)"] migrationhuborchestrator = ["mypy-boto3-migrationhuborchestrator (>=1.36.0,<1.37.0)"] migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.36.0,<1.37.0)"] mq = ["mypy-boto3-mq (>=1.36.0,<1.37.0)"] mturk = ["mypy-boto3-mturk (>=1.36.0,<1.37.0)"] mwaa = ["mypy-boto3-mwaa (>=1.36.0,<1.37.0)"] neptune = ["mypy-boto3-neptune (>=1.36.0,<1.37.0)"] neptune-graph = ["mypy-boto3-neptune-graph (>=1.36.0,<1.37.0)"] neptunedata = ["mypy-boto3-neptunedata (>=1.36.0,<1.37.0)"] network-firewall = ["mypy-boto3-network-firewall (>=1.36.0,<1.37.0)"] networkflowmonitor = ["mypy-boto3-networkflowmonitor (>=1.36.0,<1.37.0)"] networkmanager = ["mypy-boto3-networkmanager (>=1.36.0,<1.37.0)"] networkmonitor = ["mypy-boto3-networkmonitor (>=1.36.0,<1.37.0)"] notifications = ["mypy-boto3-notifications (>=1.36.0,<1.37.0)"] notificationscontacts = ["mypy-boto3-notificationscontacts (>=1.36.0,<1.37.0)"] oam = ["mypy-boto3-oam (>=1.36.0,<1.37.0)"] observabilityadmin = ["mypy-boto3-observabilityadmin (>=1.36.0,<1.37.0)"] omics = ["mypy-boto3-omics (>=1.36.0,<1.37.0)"] opensearch = ["mypy-boto3-opensearch (>=1.36.0,<1.37.0)"] opensearchserverless = ["mypy-boto3-opensearchserverless (>=1.36.0,<1.37.0)"] opsworks = ["mypy-boto3-opsworks (>=1.36.0,<1.37.0)"] opsworkscm = ["mypy-boto3-opsworkscm (>=1.36.0,<1.37.0)"] organizations = ["mypy-boto3-organizations (>=1.36.0,<1.37.0)"] osis = ["mypy-boto3-osis (>=1.36.0,<1.37.0)"] outposts = ["mypy-boto3-outposts (>=1.36.0,<1.37.0)"] panorama = ["mypy-boto3-panorama (>=1.36.0,<1.37.0)"] partnercentral-selling = ["mypy-boto3-partnercentral-selling (>=1.36.0,<1.37.0)"] payment-cryptography = ["mypy-boto3-payment-cryptography (>=1.36.0,<1.37.0)"] payment-cryptography-data = ["mypy-boto3-payment-cryptography-data (>=1.36.0,<1.37.0)"] pca-connector-ad = ["mypy-boto3-pca-connector-ad (>=1.36.0,<1.37.0)"] pca-connector-scep = ["mypy-boto3-pca-connector-scep (>=1.36.0,<1.37.0)"] pcs = ["mypy-boto3-pcs (>=1.36.0,<1.37.0)"] personalize = ["mypy-boto3-personalize (>=1.36.0,<1.37.0)"] personalize-events = ["mypy-boto3-personalize-events (>=1.36.0,<1.37.0)"] personalize-runtime = ["mypy-boto3-personalize-runtime (>=1.36.0,<1.37.0)"] pi = ["mypy-boto3-pi (>=1.36.0,<1.37.0)"] pinpoint = ["mypy-boto3-pinpoint (>=1.36.0,<1.37.0)"] pinpoint-email = ["mypy-boto3-pinpoint-email (>=1.36.0,<1.37.0)"] pinpoint-sms-voice = ["mypy-boto3-pinpoint-sms-voice (>=1.36.0,<1.37.0)"] pinpoint-sms-voice-v2 = ["mypy-boto3-pinpoint-sms-voice-v2 (>=1.36.0,<1.37.0)"] pipes = ["mypy-boto3-pipes (>=1.36.0,<1.37.0)"] polly = ["mypy-boto3-polly (>=1.36.0,<1.37.0)"] pricing = ["mypy-boto3-pricing (>=1.36.0,<1.37.0)"] privatenetworks = ["mypy-boto3-privatenetworks (>=1.36.0,<1.37.0)"] proton = ["mypy-boto3-proton (>=1.36.0,<1.37.0)"] qapps = ["mypy-boto3-qapps (>=1.36.0,<1.37.0)"] qbusiness = ["mypy-boto3-qbusiness (>=1.36.0,<1.37.0)"] qconnect = ["mypy-boto3-qconnect (>=1.36.0,<1.37.0)"] qldb = ["mypy-boto3-qldb (>=1.36.0,<1.37.0)"] qldb-session = ["mypy-boto3-qldb-session (>=1.36.0,<1.37.0)"] quicksight = ["mypy-boto3-quicksight (>=1.36.0,<1.37.0)"] ram = ["mypy-boto3-ram (>=1.36.0,<1.37.0)"] rbin = ["mypy-boto3-rbin (>=1.36.0,<1.37.0)"] rds = ["mypy-boto3-rds (>=1.36.0,<1.37.0)"] rds-data = ["mypy-boto3-rds-data (>=1.36.0,<1.37.0)"] redshift = ["mypy-boto3-redshift (>=1.36.0,<1.37.0)"] redshift-data = ["mypy-boto3-redshift-data (>=1.36.0,<1.37.0)"] redshift-serverless = ["mypy-boto3-redshift-serverless (>=1.36.0,<1.37.0)"] rekognition = ["mypy-boto3-rekognition (>=1.36.0,<1.37.0)"] repostspace = ["mypy-boto3-repostspace (>=1.36.0,<1.37.0)"] resiliencehub = ["mypy-boto3-resiliencehub (>=1.36.0,<1.37.0)"] resource-explorer-2 = ["mypy-boto3-resource-explorer-2 (>=1.36.0,<1.37.0)"] resource-groups = ["mypy-boto3-resource-groups (>=1.36.0,<1.37.0)"] resourcegroupstaggingapi = ["mypy-boto3-resourcegroupstaggingapi (>=1.36.0,<1.37.0)"] robomaker = ["mypy-boto3-robomaker (>=1.36.0,<1.37.0)"] rolesanywhere = ["mypy-boto3-rolesanywhere (>=1.36.0,<1.37.0)"] route53 = ["mypy-boto3-route53 (>=1.36.0,<1.37.0)"] route53-recovery-cluster = ["mypy-boto3-route53-recovery-cluster (>=1.36.0,<1.37.0)"] route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config (>=1.36.0,<1.37.0)"] route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.36.0,<1.37.0)"] route53domains = ["mypy-boto3-route53domains (>=1.36.0,<1.37.0)"] route53profiles = ["mypy-boto3-route53profiles (>=1.36.0,<1.37.0)"] route53resolver = ["mypy-boto3-route53resolver (>=1.36.0,<1.37.0)"] rum = ["mypy-boto3-rum (>=1.36.0,<1.37.0)"] s3 = ["mypy-boto3-s3 (>=1.36.0,<1.37.0)"] s3control = ["mypy-boto3-s3control (>=1.36.0,<1.37.0)"] s3outposts = ["mypy-boto3-s3outposts (>=1.36.0,<1.37.0)"] s3tables = ["mypy-boto3-s3tables (>=1.36.0,<1.37.0)"] sagemaker = ["mypy-boto3-sagemaker (>=1.36.0,<1.37.0)"] sagemaker-a2i-runtime = ["mypy-boto3-sagemaker-a2i-runtime (>=1.36.0,<1.37.0)"] sagemaker-edge = ["mypy-boto3-sagemaker-edge (>=1.36.0,<1.37.0)"] sagemaker-featurestore-runtime = ["mypy-boto3-sagemaker-featurestore-runtime (>=1.36.0,<1.37.0)"] sagemaker-geospatial = ["mypy-boto3-sagemaker-geospatial (>=1.36.0,<1.37.0)"] sagemaker-metrics = ["mypy-boto3-sagemaker-metrics (>=1.36.0,<1.37.0)"] sagemaker-runtime = ["mypy-boto3-sagemaker-runtime (>=1.36.0,<1.37.0)"] savingsplans = ["mypy-boto3-savingsplans (>=1.36.0,<1.37.0)"] scheduler = ["mypy-boto3-scheduler (>=1.36.0,<1.37.0)"] schemas = ["mypy-boto3-schemas (>=1.36.0,<1.37.0)"] sdb = ["mypy-boto3-sdb (>=1.36.0,<1.37.0)"] secretsmanager = ["mypy-boto3-secretsmanager (>=1.36.0,<1.37.0)"] security-ir = ["mypy-boto3-security-ir (>=1.36.0,<1.37.0)"] securityhub = ["mypy-boto3-securityhub (>=1.36.0,<1.37.0)"] securitylake = ["mypy-boto3-securitylake (>=1.36.0,<1.37.0)"] serverlessrepo = ["mypy-boto3-serverlessrepo (>=1.36.0,<1.37.0)"] service-quotas = ["mypy-boto3-service-quotas (>=1.36.0,<1.37.0)"] servicecatalog = ["mypy-boto3-servicecatalog (>=1.36.0,<1.37.0)"] servicecatalog-appregistry = ["mypy-boto3-servicecatalog-appregistry (>=1.36.0,<1.37.0)"] servicediscovery = ["mypy-boto3-servicediscovery (>=1.36.0,<1.37.0)"] ses = ["mypy-boto3-ses (>=1.36.0,<1.37.0)"] sesv2 = ["mypy-boto3-sesv2 (>=1.36.0,<1.37.0)"] shield = ["mypy-boto3-shield (>=1.36.0,<1.37.0)"] signer = ["mypy-boto3-signer (>=1.36.0,<1.37.0)"] simspaceweaver = ["mypy-boto3-simspaceweaver (>=1.36.0,<1.37.0)"] sms = ["mypy-boto3-sms (>=1.36.0,<1.37.0)"] sms-voice = ["mypy-boto3-sms-voice (>=1.36.0,<1.37.0)"] snow-device-management = ["mypy-boto3-snow-device-management (>=1.36.0,<1.37.0)"] snowball = ["mypy-boto3-snowball (>=1.36.0,<1.37.0)"] sns = ["mypy-boto3-sns (>=1.36.0,<1.37.0)"] socialmessaging = ["mypy-boto3-socialmessaging (>=1.36.0,<1.37.0)"] sqs = ["mypy-boto3-sqs (>=1.36.0,<1.37.0)"] ssm = ["mypy-boto3-ssm (>=1.36.0,<1.37.0)"] ssm-contacts = ["mypy-boto3-ssm-contacts (>=1.36.0,<1.37.0)"] ssm-incidents = ["mypy-boto3-ssm-incidents (>=1.36.0,<1.37.0)"] ssm-quicksetup = ["mypy-boto3-ssm-quicksetup (>=1.36.0,<1.37.0)"] ssm-sap = ["mypy-boto3-ssm-sap (>=1.36.0,<1.37.0)"] sso = ["mypy-boto3-sso (>=1.36.0,<1.37.0)"] sso-admin = ["mypy-boto3-sso-admin (>=1.36.0,<1.37.0)"] sso-oidc = ["mypy-boto3-sso-oidc (>=1.36.0,<1.37.0)"] stepfunctions = ["mypy-boto3-stepfunctions (>=1.36.0,<1.37.0)"] storagegateway = ["mypy-boto3-storagegateway (>=1.36.0,<1.37.0)"] sts = ["mypy-boto3-sts (>=1.36.0,<1.37.0)"] supplychain = ["mypy-boto3-supplychain (>=1.36.0,<1.37.0)"] support = ["mypy-boto3-support (>=1.36.0,<1.37.0)"] support-app = ["mypy-boto3-support-app (>=1.36.0,<1.37.0)"] swf = ["mypy-boto3-swf (>=1.36.0,<1.37.0)"] synthetics = ["mypy-boto3-synthetics (>=1.36.0,<1.37.0)"] taxsettings = ["mypy-boto3-taxsettings (>=1.36.0,<1.37.0)"] textract = ["mypy-boto3-textract (>=1.36.0,<1.37.0)"] timestream-influxdb = ["mypy-boto3-timestream-influxdb (>=1.36.0,<1.37.0)"] timestream-query = ["mypy-boto3-timestream-query (>=1.36.0,<1.37.0)"] timestream-write = ["mypy-boto3-timestream-write (>=1.36.0,<1.37.0)"] tnb = ["mypy-boto3-tnb (>=1.36.0,<1.37.0)"] transcribe = ["mypy-boto3-transcribe (>=1.36.0,<1.37.0)"] transfer = ["mypy-boto3-transfer (>=1.36.0,<1.37.0)"] translate = ["mypy-boto3-translate (>=1.36.0,<1.37.0)"] trustedadvisor = ["mypy-boto3-trustedadvisor (>=1.36.0,<1.37.0)"] verifiedpermissions = ["mypy-boto3-verifiedpermissions (>=1.36.0,<1.37.0)"] voice-id = ["mypy-boto3-voice-id (>=1.36.0,<1.37.0)"] vpc-lattice = ["mypy-boto3-vpc-lattice (>=1.36.0,<1.37.0)"] waf = ["mypy-boto3-waf (>=1.36.0,<1.37.0)"] waf-regional = ["mypy-boto3-waf-regional (>=1.36.0,<1.37.0)"] wafv2 = ["mypy-boto3-wafv2 (>=1.36.0,<1.37.0)"] wellarchitected = ["mypy-boto3-wellarchitected (>=1.36.0,<1.37.0)"] wisdom = ["mypy-boto3-wisdom (>=1.36.0,<1.37.0)"] workdocs = ["mypy-boto3-workdocs (>=1.36.0,<1.37.0)"] workmail = ["mypy-boto3-workmail (>=1.36.0,<1.37.0)"] workmailmessageflow = ["mypy-boto3-workmailmessageflow (>=1.36.0,<1.37.0)"] workspaces = ["mypy-boto3-workspaces (>=1.36.0,<1.37.0)"] workspaces-thin-client = ["mypy-boto3-workspaces-thin-client (>=1.36.0,<1.37.0)"] workspaces-web = ["mypy-boto3-workspaces-web (>=1.36.0,<1.37.0)"] xray = ["mypy-boto3-xray (>=1.36.0,<1.37.0)"] [[package]] name = "botocore" version = "1.36.1" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ {file = "botocore-1.36.1-py3-none-any.whl", hash = "sha256:dec513b4eb8a847d79bbefdcdd07040ed9d44c20b0001136f0890a03d595705a"}, {file = "botocore-1.36.1.tar.gz", hash = "sha256:f789a6f272b5b3d8f8756495019785e33868e5e00dd9662a3ee7959ac939bb12"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] [package.extras] crt = ["awscrt (==0.23.4)"] [[package]] name = "botocore-stubs" version = "1.36.6" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" files = [ {file = "botocore_stubs-1.36.6-py3-none-any.whl", hash = "sha256:e4b35ed9557e15d6ba0cb110bffe89f5ed6a8a202e7cf4c9a67667e7e4a7790c"}, {file = "botocore_stubs-1.36.6.tar.gz", hash = "sha256:f47c30036a5e3c842ef7347aeb2067a952959a7b9c32c7dc0ed27040a231350d"}, ] [package.dependencies] types-awscrt = "*" [package.extras] botocore = ["botocore"] [[package]] name = "certifi" version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] name = "cffi" version = "1.16.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"}, ] [package.dependencies] pycparser = "*" [[package]] name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] name = "coverage" version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] toml = ["tomli"] [[package]] name = "cryptography" 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-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] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] [[package]] name = "distlib" version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" files = [ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] name = "envs" version = "1.4" description = "Easy access of environment variables from Python with support for strings, booleans, list, tuples, and dicts." optional = false python-versions = ">=3.6,<4.0" files = [ {file = "envs-1.4-py3-none-any.whl", hash = "sha256:4a1fcf85e4d4443e77c348ff7cdd3bfc4c0178b181d447057de342e4172e5ed1"}, {file = "envs-1.4.tar.gz", hash = "sha256:9d8435c6985d1cdd68299e04c58e2bdb8ae6cf66b2596a8079e6f9a93f2a0398"}, ] [package.extras] cli = ["Jinja2[cli] (>=3.0.3,<4.0.0)", "click[cli] (>=8.0.3,<9.0.0)", "terminaltables[cli] (>=3.1.10,<4.0.0)"] [[package]] name = "exceptiongroup" version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] test = ["pytest (>=6)"] [[package]] name = "filelock" version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ {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-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]] name = "frozenlist" version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] [[package]] name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, ] [package.dependencies] python-dateutil = ">=2.8.1" [package.extras] dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" version = "4.0.11" description = "Git Object Database" optional = false python-versions = ">=3.7" files = [ {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] smmap = ">=3.0.1,<6" [[package]] name = "gitpython" version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] [[package]] name = "griffe" version = "0.48.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ {file = "griffe-0.48.0-py3-none-any.whl", hash = "sha256:f944c6ff7bd31cf76f264adcd6ab8f3d00a2f972ae5cc8db2d7b6dcffeff65a2"}, {file = "griffe-0.48.0.tar.gz", hash = "sha256:f099461c02f016b6be4af386d5aa92b01fb4efe6c1c2c360dda9a5d0a863bb7f"}, ] [package.dependencies] backports-strenum = {version = ">=1.3", markers = "python_version < \"3.11\""} colorama = ">=0.4" [[package]] name = "identify" version = "2.6.0" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ {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] license = ["ukkonen"] [[package]] name = "idna" version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" version = "8.2.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] 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" version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] [[package]] name = "jira" version = "3.8.0" description = "Python library for interacting with JIRA via REST APIs." optional = false python-versions = ">=3.8" files = [ {file = "jira-3.8.0-py3-none-any.whl", hash = "sha256:12190dc84dad00b8a6c0341f7e8a254b0f38785afdec022bd5941e1184a5a3fb"}, {file = "jira-3.8.0.tar.gz", hash = "sha256:63719c529a570aaa01c3373dbb5a104dab70381c5be447f6c27f997302fa335a"}, ] [package.dependencies] defusedxml = "*" packaging = "*" Pillow = ">=2.1.0" requests = ">=2.10.0" requests-oauthlib = ">=1.1.0" requests-toolbelt = "*" typing-extensions = ">=3.7.4.2" [package.extras] async = ["requests-futures (>=0.9.7)"] cli = ["ipython (>=4.0.0)", "keyring"] docs = ["furo", "sphinx (>=5.0.0)", "sphinx-copybutton"] opt = ["PyJWT", "filemagic (>=1.6)", "requests-jwt", "requests-kerberos"] test = ["MarkupSafe (>=0.23)", "PyYAML (>=5.1)", "docutils (>=0.12)", "flaky", "oauthlib", "parameterized (>=0.8.1)", "pytest (>=6.0.0)", "pytest-cache", "pytest-cov", "pytest-instafail", "pytest-sugar", "pytest-timeout (>=1.3.1)", "pytest-xdist (>=2.2)", "requests-mock", "requires.io", "tenacity", "wheel (>=0.24.0)", "yanc (>=0.3.3)"] [[package]] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] [[package]] name = "markdown" version = "3.6" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, ] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] [[package]] name = "mkdocs" version = "1.6.0" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" files = [ {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"}, {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"}, ] [package.dependencies] click = ">=7.0" colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} jinja2 = ">=2.11.1" markdown = ">=3.3.6" markupsafe = ">=2.0.1" mergedeep = ">=1.3.4" mkdocs-get-deps = ">=0.2.0" packaging = ">=20.5" pathspec = ">=0.11.1" pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" version = "1.2.0" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.8" files = [ {file = "mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f"}, {file = "mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f"}, ] [package.dependencies] Markdown = ">=3.3" markupsafe = ">=2.0.1" mkdocs = ">=1.1" [[package]] name = "mkdocs-get-deps" version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, ] [package.dependencies] importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} mergedeep = ">=1.3.4" platformdirs = ">=2.2.0" pyyaml = ">=5.1" [[package]] name = "mkdocs-material" version = "9.5.50" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, ] [package.dependencies] babel = ">=2.10,<3.0" colorama = ">=0.4,<1.0" jinja2 = ">=3.0,<4.0" markdown = ">=3.2,<4.0" mkdocs = ">=1.6,<2.0" mkdocs-material-extensions = ">=1.3,<2.0" paginate = ">=0.5,<1.0" pygments = ">=2.16,<3.0" pymdown-extensions = ">=10.2,<11.0" regex = ">=2022.4" requests = ">=2.26,<3.0" [package.extras] git = ["mkdocs-git-committers-plugin-2 (>=1.1,<3)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] [[package]] name = "mkdocs-material-extensions" version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] [[package]] name = "mkdocstrings" version = "0.27.0" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.9" files = [ {file = "mkdocstrings-0.27.0-py3-none-any.whl", hash = "sha256:6ceaa7ea830770959b55a16203ac63da24badd71325b96af950e59fd37366332"}, {file = "mkdocstrings-0.27.0.tar.gz", hash = "sha256:16adca6d6b0a1f9e0c07ff0b02ced8e16f228a9d65a37c063ec4c14d7b76a657"}, ] [package.dependencies] click = ">=7.0" importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} Jinja2 = ">=2.11.1" Markdown = ">=3.6" MarkupSafe = ">=1.1" mkdocs = ">=1.4" mkdocs-autorefs = ">=1.2" mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} platformdirs = ">=2.2" pymdown-extensions = ">=6.3" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} [package.extras] crystal = ["mkdocstrings-crystal (>=0.3.4)"] python = ["mkdocstrings-python (>=0.5.2)"] python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" version = "1.10.5" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.8" files = [ {file = "mkdocstrings_python-1.10.5-py3-none-any.whl", hash = "sha256:92e3c588ef1b41151f55281d075de7558dd8092e422cb07a65b18ee2b0863ebb"}, {file = "mkdocstrings_python-1.10.5.tar.gz", hash = "sha256:acdc2a98cd9d46c7ece508193a16ca03ccabcb67520352b7449f84b57c162bdf"}, ] [package.dependencies] griffe = ">=0.47" mkdocstrings = ">=0.25" [[package]] name = "multidict" version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] name = "mypy" version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] name = "nodeenv" version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] [[package]] name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false python-versions = ">=3.6" files = [ {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, ] [package.extras] rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "packaging" version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "paginate" version = "0.5.6" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" files = [ {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, ] [[package]] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pillow" version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] typing = ["typing-extensions"] xmp = ["defusedxml"] [[package]] name = "platformdirs" 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.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] type = ["mypy (>=1.8)"] [[package]] name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" version = "4.1.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ {file = "pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b"}, {file = "pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4"}, ] [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" [[package]] name = "propcache" version = "0.2.0" description = "Accelerated property cache" optional = false python-versions = ">=3.8" files = [ {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, ] [[package]] name = "pycognito" version = "2024.5.1" description = "Python class to integrate Boto3's Cognito client so it is easy to login users. With SRP support." optional = false python-versions = ">=3.8" files = [ {file = "pycognito-2024.5.1-py3-none-any.whl", hash = "sha256:c821895dc62b7aea410fdccae4f96d8be7cab374182339f50a03de0fcb93f9ea"}, {file = "pycognito-2024.5.1.tar.gz", hash = "sha256:e211c66698c2c3dc8680e95107c2b4a922f504c3f7c179c27b8ee1ab0fc23ae4"}, ] [package.dependencies] boto3 = ">=1.10.49" envs = ">=1.3" pyjwt = {version = ">=2.8.0", extras = ["crypto"]} requests = ">=2.22.0" [[package]] name = "pycparser" version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pygments" version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.7" files = [ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] [package.dependencies] cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} [package.extras] crypto = ["cryptography (>=3.4.0)"] dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pymdown-extensions" version = "10.14.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, ] [package.dependencies] markdown = ">=3.6" pyyaml = "*" [package.extras] extra = ["pygments (>=2.19.1)"] [[package]] name = "pytest" version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-aiohttp" version = "1.1.0" description = "Pytest plugin for aiohttp support" optional = false python-versions = ">=3.9" files = [ {file = "pytest_aiohttp-1.1.0-py3-none-any.whl", hash = "sha256:f39a11693a0dce08dd6c542d241e199dd8047a6e6596b2bcfa60d373f143456d"}, {file = "pytest_aiohttp-1.1.0.tar.gz", hash = "sha256:147de8cb164f3fc9d7196967f109ab3c0b93ea3463ab50631e56438eab7b5adc"}, ] [package.dependencies] aiohttp = ">=3.11.0b0" pytest = ">=6.1.0" pytest-asyncio = ">=0.17.2" [package.extras] testing = ["coverage (==6.2)", "mypy (==1.12.1)"] [[package]] name = "pytest-asyncio" version = "0.25.2" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" files = [ {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, ] [package.dependencies] pytest = ">=8.2,<9" [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] name = "pytest-cov" version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" files = [ {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, ] [package.dependencies] coverage = {version = ">=7.5", extras = ["toml"]} pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-github-actions-annotate-failures" version = "0.3.0" description = "pytest plugin to annotate failed tests with a workflow command for GitHub Actions" optional = false python-versions = ">=3.8" files = [ {file = "pytest_github_actions_annotate_failures-0.3.0-py3-none-any.whl", hash = "sha256:41ea558ba10c332c0bfc053daeee0c85187507b2034e990f21e4f7e5fef044cf"}, {file = "pytest_github_actions_annotate_failures-0.3.0.tar.gz", hash = "sha256:d4c3177c98046c3900a7f8ddebb22ea54b9f6822201b5d3ab8fcdea51e010db7"}, ] [package.dependencies] pytest = ">=6.0.0" [[package]] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] six = ">=1.5" [[package]] name = "python-kacl" version = "0.6.2" description = "Python module and CLI tool for validating and modifying Changelogs in \"keep-a-changelog\" format\"" optional = false python-versions = ">=3.9" files = [ {file = "python_kacl-0.6.2-py3-none-any.whl", hash = "sha256:7cbc4848cd7d6f40fef9efc189c65009904cfd7eb3418846a30720db9feae82e"}, {file = "python_kacl-0.6.2.tar.gz", hash = "sha256:ed73011c07a466884899bed6ab161774d0138dcfcba4b688b8d3385656cea31d"}, ] [package.dependencies] click = "*" gitpython = "*" jira = "*" pyyaml = "*" semver = "*" [[package]] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" 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"}, ] [[package]] name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] [package.dependencies] pyyaml = "*" [[package]] name = "regex" version = "2024.7.24" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] name = "requests" version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false python-versions = ">=3.4" files = [ {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] oauthlib = ">=3.0.0" requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "requests-toolbelt" version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, ] [package.dependencies] requests = ">=2.0.1,<3.0.0" [[package]] name = "ruff" version = "0.7.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ {file = "ruff-0.7.4-py3-none-linux_armv6l.whl", hash = "sha256:a4919925e7684a3f18e18243cd6bea7cfb8e968a6eaa8437971f681b7ec51478"}, {file = "ruff-0.7.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfb365c135b830778dda8c04fb7d4280ed0b984e1aec27f574445231e20d6c63"}, {file = "ruff-0.7.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:63a569b36bc66fbadec5beaa539dd81e0527cb258b94e29e0531ce41bacc1f20"}, {file = "ruff-0.7.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d06218747d361d06fd2fdac734e7fa92df36df93035db3dc2ad7aa9852cb109"}, {file = "ruff-0.7.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0cea28d0944f74ebc33e9f934238f15c758841f9f5edd180b5315c203293452"}, {file = "ruff-0.7.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80094ecd4793c68b2571b128f91754d60f692d64bc0d7272ec9197fdd09bf9ea"}, {file = "ruff-0.7.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:997512325c6620d1c4c2b15db49ef59543ef9cd0f4aa8065ec2ae5103cedc7e7"}, {file = "ruff-0.7.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00b4cf3a6b5fad6d1a66e7574d78956bbd09abfd6c8a997798f01f5da3d46a05"}, {file = "ruff-0.7.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7dbdc7d8274e1422722933d1edddfdc65b4336abf0b16dfcb9dedd6e6a517d06"}, {file = "ruff-0.7.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e92dfb5f00eaedb1501b2f906ccabfd67b2355bdf117fea9719fc99ac2145bc"}, {file = "ruff-0.7.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3bd726099f277d735dc38900b6a8d6cf070f80828877941983a57bca1cd92172"}, {file = "ruff-0.7.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2e32829c429dd081ee5ba39aef436603e5b22335c3d3fff013cd585806a6486a"}, {file = "ruff-0.7.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:662a63b4971807623f6f90c1fb664613f67cc182dc4d991471c23c541fee62dd"}, {file = "ruff-0.7.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:876f5e09eaae3eb76814c1d3b68879891d6fde4824c015d48e7a7da4cf066a3a"}, {file = "ruff-0.7.4-py3-none-win32.whl", hash = "sha256:75c53f54904be42dd52a548728a5b572344b50d9b2873d13a3f8c5e3b91f5cac"}, {file = "ruff-0.7.4-py3-none-win_amd64.whl", hash = "sha256:745775c7b39f914238ed1f1b0bebed0b9155a17cd8bc0b08d3c87e4703b990d6"}, {file = "ruff-0.7.4-py3-none-win_arm64.whl", hash = "sha256:11bff065102c3ae9d3ea4dc9ecdfe5a5171349cdd0787c1fc64761212fc9cf1f"}, {file = "ruff-0.7.4.tar.gz", hash = "sha256:cd12e35031f5af6b9b93715d8c4f40360070b2041f81273d0527683d5708fce2"}, ] [[package]] name = "s3transfer" version = "0.11.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" files = [ {file = "s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:8fa0aa48177be1f3425176dfe1ab85dcd3d962df603c3dbfc585e6bf857ef0ff"}, {file = "s3transfer-0.11.1.tar.gz", hash = "sha256:3f25c900a367c8b7f7d8f9c34edc87e300bde424f779dc9f0a8ae4f9df9264f6"}, ] [package.dependencies] botocore = ">=1.36.0,<2.0a.0" [package.extras] crt = ["botocore[crt] (>=1.36.0,<2.0a.0)"] [[package]] name = "semver" version = "3.0.2" description = "Python helper for Semantic Versioning (https://semver.org)" optional = false python-versions = ">=3.7" files = [ {file = "semver-3.0.2-py3-none-any.whl", hash = "sha256:b1ea4686fe70b981f85359eda33199d60c53964284e0cfb4977d243e37cf4bf4"}, {file = "semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc"}, ] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] [[package]] name = "smmap" version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" files = [ {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] [[package]] name = "sourcery" version = "1.32.0" description = "Magically refactor Python" optional = false python-versions = "*" files = [ {file = "sourcery-1.32.0-py2.py3-none-macosx_10_9_universal2.whl", hash = "sha256:5cac2d767908f0806e09aea59d98d47b0241283d328c90f9d796c9f5888b082a"}, {file = "sourcery-1.32.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:8787cfc9b16c23c05cf8998b28a9fe97c5e2e96e021debbef25b92b07e562a06"}, {file = "sourcery-1.32.0-py2.py3-none-win_amd64.whl", hash = "sha256:9b3cce1522685bdd21a4086b97f67795faf68954bad6a88980a7c0239c9cb45d"}, ] [[package]] name = "syrupy" version = "4.8.1" description = "Pytest Snapshot Test Utility" optional = false python-versions = ">=3.8.1" files = [ {file = "syrupy-4.8.1-py3-none-any.whl", hash = "sha256:274f97cbaf44175f5e478a2f3a53559d31f41c66c6bf28131695f94ac893ea00"}, {file = "syrupy-4.8.1.tar.gz", hash = "sha256:8da8c0311e6d92de0b15767768c6ab98982b7b4a4c67083c08fbac3fbad4d44c"}, ] [package.dependencies] pytest = ">=7.0.0,<9.0.0" [[package]] name = "tenacity" version = "8.5.0" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, ] [package.extras] doc = ["reno", "sphinx"] test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] [[package]] name = "types-aiobotocore" version = "2.19.0" description = "Type annotations for aiobotocore 2.19.0 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ {file = "types_aiobotocore-2.19.0-py3-none-any.whl", hash = "sha256:9264d2f4b5b9c3167fce8212a9c62ecdda15d52d8d77811040c653ca69aca74f"}, {file = "types_aiobotocore-2.19.0.tar.gz", hash = "sha256:e96380593f1f7edc81f9d9786d96ca693d941be00fc65af7c759f9cf25fc69c7"}, ] [package.dependencies] botocore-stubs = "*" typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [package.extras] accessanalyzer = ["types-aiobotocore-accessanalyzer (>=2.19.0,<2.20.0)"] account = ["types-aiobotocore-account (>=2.19.0,<2.20.0)"] acm = ["types-aiobotocore-acm (>=2.19.0,<2.20.0)"] acm-pca = ["types-aiobotocore-acm-pca (>=2.19.0,<2.20.0)"] aiobotocore = ["aiobotocore (==2.19.0)"] all = ["types-aiobotocore-accessanalyzer (>=2.19.0,<2.20.0)", "types-aiobotocore-account (>=2.19.0,<2.20.0)", "types-aiobotocore-acm (>=2.19.0,<2.20.0)", "types-aiobotocore-acm-pca (>=2.19.0,<2.20.0)", "types-aiobotocore-amp (>=2.19.0,<2.20.0)", "types-aiobotocore-amplify (>=2.19.0,<2.20.0)", "types-aiobotocore-amplifybackend (>=2.19.0,<2.20.0)", "types-aiobotocore-amplifyuibuilder (>=2.19.0,<2.20.0)", "types-aiobotocore-apigateway (>=2.19.0,<2.20.0)", "types-aiobotocore-apigatewaymanagementapi (>=2.19.0,<2.20.0)", "types-aiobotocore-apigatewayv2 (>=2.19.0,<2.20.0)", "types-aiobotocore-appconfig (>=2.19.0,<2.20.0)", "types-aiobotocore-appconfigdata (>=2.19.0,<2.20.0)", "types-aiobotocore-appfabric (>=2.19.0,<2.20.0)", "types-aiobotocore-appflow (>=2.19.0,<2.20.0)", "types-aiobotocore-appintegrations (>=2.19.0,<2.20.0)", "types-aiobotocore-application-autoscaling (>=2.19.0,<2.20.0)", "types-aiobotocore-application-insights (>=2.19.0,<2.20.0)", "types-aiobotocore-application-signals (>=2.19.0,<2.20.0)", "types-aiobotocore-applicationcostprofiler (>=2.19.0,<2.20.0)", "types-aiobotocore-appmesh (>=2.19.0,<2.20.0)", "types-aiobotocore-apprunner (>=2.19.0,<2.20.0)", "types-aiobotocore-appstream (>=2.19.0,<2.20.0)", "types-aiobotocore-appsync (>=2.19.0,<2.20.0)", "types-aiobotocore-apptest (>=2.19.0,<2.20.0)", "types-aiobotocore-arc-zonal-shift (>=2.19.0,<2.20.0)", "types-aiobotocore-artifact (>=2.19.0,<2.20.0)", "types-aiobotocore-athena (>=2.19.0,<2.20.0)", "types-aiobotocore-auditmanager (>=2.19.0,<2.20.0)", "types-aiobotocore-autoscaling (>=2.19.0,<2.20.0)", "types-aiobotocore-autoscaling-plans (>=2.19.0,<2.20.0)", "types-aiobotocore-b2bi (>=2.19.0,<2.20.0)", "types-aiobotocore-backup (>=2.19.0,<2.20.0)", "types-aiobotocore-backup-gateway (>=2.19.0,<2.20.0)", "types-aiobotocore-backupsearch (>=2.19.0,<2.20.0)", "types-aiobotocore-batch (>=2.19.0,<2.20.0)", "types-aiobotocore-bcm-data-exports (>=2.19.0,<2.20.0)", "types-aiobotocore-bcm-pricing-calculator (>=2.19.0,<2.20.0)", "types-aiobotocore-bedrock (>=2.19.0,<2.20.0)", "types-aiobotocore-bedrock-agent (>=2.19.0,<2.20.0)", "types-aiobotocore-bedrock-agent-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-bedrock-data-automation (>=2.19.0,<2.20.0)", "types-aiobotocore-bedrock-data-automation-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-bedrock-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-billing (>=2.19.0,<2.20.0)", "types-aiobotocore-billingconductor (>=2.19.0,<2.20.0)", "types-aiobotocore-braket (>=2.19.0,<2.20.0)", "types-aiobotocore-budgets (>=2.19.0,<2.20.0)", "types-aiobotocore-ce (>=2.19.0,<2.20.0)", "types-aiobotocore-chatbot (>=2.19.0,<2.20.0)", "types-aiobotocore-chime (>=2.19.0,<2.20.0)", "types-aiobotocore-chime-sdk-identity (>=2.19.0,<2.20.0)", "types-aiobotocore-chime-sdk-media-pipelines (>=2.19.0,<2.20.0)", "types-aiobotocore-chime-sdk-meetings (>=2.19.0,<2.20.0)", "types-aiobotocore-chime-sdk-messaging (>=2.19.0,<2.20.0)", "types-aiobotocore-chime-sdk-voice (>=2.19.0,<2.20.0)", "types-aiobotocore-cleanrooms (>=2.19.0,<2.20.0)", "types-aiobotocore-cleanroomsml (>=2.19.0,<2.20.0)", "types-aiobotocore-cloud9 (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudcontrol (>=2.19.0,<2.20.0)", "types-aiobotocore-clouddirectory (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudformation (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudfront (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudfront-keyvaluestore (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudhsm (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudhsmv2 (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudsearch (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudsearchdomain (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudtrail (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudtrail-data (>=2.19.0,<2.20.0)", "types-aiobotocore-cloudwatch (>=2.19.0,<2.20.0)", "types-aiobotocore-codeartifact (>=2.19.0,<2.20.0)", "types-aiobotocore-codebuild (>=2.19.0,<2.20.0)", "types-aiobotocore-codecatalyst (>=2.19.0,<2.20.0)", "types-aiobotocore-codecommit (>=2.19.0,<2.20.0)", "types-aiobotocore-codeconnections (>=2.19.0,<2.20.0)", "types-aiobotocore-codedeploy (>=2.19.0,<2.20.0)", "types-aiobotocore-codeguru-reviewer (>=2.19.0,<2.20.0)", "types-aiobotocore-codeguru-security (>=2.19.0,<2.20.0)", "types-aiobotocore-codeguruprofiler (>=2.19.0,<2.20.0)", "types-aiobotocore-codepipeline (>=2.19.0,<2.20.0)", "types-aiobotocore-codestar-connections (>=2.19.0,<2.20.0)", "types-aiobotocore-codestar-notifications (>=2.19.0,<2.20.0)", "types-aiobotocore-cognito-identity (>=2.19.0,<2.20.0)", "types-aiobotocore-cognito-idp (>=2.19.0,<2.20.0)", "types-aiobotocore-cognito-sync (>=2.19.0,<2.20.0)", "types-aiobotocore-comprehend (>=2.19.0,<2.20.0)", "types-aiobotocore-comprehendmedical (>=2.19.0,<2.20.0)", "types-aiobotocore-compute-optimizer (>=2.19.0,<2.20.0)", "types-aiobotocore-config (>=2.19.0,<2.20.0)", "types-aiobotocore-connect (>=2.19.0,<2.20.0)", "types-aiobotocore-connect-contact-lens (>=2.19.0,<2.20.0)", "types-aiobotocore-connectcampaigns (>=2.19.0,<2.20.0)", "types-aiobotocore-connectcampaignsv2 (>=2.19.0,<2.20.0)", "types-aiobotocore-connectcases (>=2.19.0,<2.20.0)", "types-aiobotocore-connectparticipant (>=2.19.0,<2.20.0)", "types-aiobotocore-controlcatalog (>=2.19.0,<2.20.0)", "types-aiobotocore-controltower (>=2.19.0,<2.20.0)", "types-aiobotocore-cost-optimization-hub (>=2.19.0,<2.20.0)", "types-aiobotocore-cur (>=2.19.0,<2.20.0)", "types-aiobotocore-customer-profiles (>=2.19.0,<2.20.0)", "types-aiobotocore-databrew (>=2.19.0,<2.20.0)", "types-aiobotocore-dataexchange (>=2.19.0,<2.20.0)", "types-aiobotocore-datapipeline (>=2.19.0,<2.20.0)", "types-aiobotocore-datasync (>=2.19.0,<2.20.0)", "types-aiobotocore-datazone (>=2.19.0,<2.20.0)", "types-aiobotocore-dax (>=2.19.0,<2.20.0)", "types-aiobotocore-deadline (>=2.19.0,<2.20.0)", "types-aiobotocore-detective (>=2.19.0,<2.20.0)", "types-aiobotocore-devicefarm (>=2.19.0,<2.20.0)", "types-aiobotocore-devops-guru (>=2.19.0,<2.20.0)", "types-aiobotocore-directconnect (>=2.19.0,<2.20.0)", "types-aiobotocore-discovery (>=2.19.0,<2.20.0)", "types-aiobotocore-dlm (>=2.19.0,<2.20.0)", "types-aiobotocore-dms (>=2.19.0,<2.20.0)", "types-aiobotocore-docdb (>=2.19.0,<2.20.0)", "types-aiobotocore-docdb-elastic (>=2.19.0,<2.20.0)", "types-aiobotocore-drs (>=2.19.0,<2.20.0)", "types-aiobotocore-ds (>=2.19.0,<2.20.0)", "types-aiobotocore-ds-data (>=2.19.0,<2.20.0)", "types-aiobotocore-dsql (>=2.19.0,<2.20.0)", "types-aiobotocore-dynamodb (>=2.19.0,<2.20.0)", "types-aiobotocore-dynamodbstreams (>=2.19.0,<2.20.0)", "types-aiobotocore-ebs (>=2.19.0,<2.20.0)", "types-aiobotocore-ec2 (>=2.19.0,<2.20.0)", "types-aiobotocore-ec2-instance-connect (>=2.19.0,<2.20.0)", "types-aiobotocore-ecr (>=2.19.0,<2.20.0)", "types-aiobotocore-ecr-public (>=2.19.0,<2.20.0)", "types-aiobotocore-ecs (>=2.19.0,<2.20.0)", "types-aiobotocore-efs (>=2.19.0,<2.20.0)", "types-aiobotocore-eks (>=2.19.0,<2.20.0)", "types-aiobotocore-eks-auth (>=2.19.0,<2.20.0)", "types-aiobotocore-elastic-inference (>=2.19.0,<2.20.0)", "types-aiobotocore-elasticache (>=2.19.0,<2.20.0)", "types-aiobotocore-elasticbeanstalk (>=2.19.0,<2.20.0)", "types-aiobotocore-elastictranscoder (>=2.19.0,<2.20.0)", "types-aiobotocore-elb (>=2.19.0,<2.20.0)", "types-aiobotocore-elbv2 (>=2.19.0,<2.20.0)", "types-aiobotocore-emr (>=2.19.0,<2.20.0)", "types-aiobotocore-emr-containers (>=2.19.0,<2.20.0)", "types-aiobotocore-emr-serverless (>=2.19.0,<2.20.0)", "types-aiobotocore-entityresolution (>=2.19.0,<2.20.0)", "types-aiobotocore-es (>=2.19.0,<2.20.0)", "types-aiobotocore-events (>=2.19.0,<2.20.0)", "types-aiobotocore-evidently (>=2.19.0,<2.20.0)", "types-aiobotocore-finspace (>=2.19.0,<2.20.0)", "types-aiobotocore-finspace-data (>=2.19.0,<2.20.0)", "types-aiobotocore-firehose (>=2.19.0,<2.20.0)", "types-aiobotocore-fis (>=2.19.0,<2.20.0)", "types-aiobotocore-fms (>=2.19.0,<2.20.0)", "types-aiobotocore-forecast (>=2.19.0,<2.20.0)", "types-aiobotocore-forecastquery (>=2.19.0,<2.20.0)", "types-aiobotocore-frauddetector (>=2.19.0,<2.20.0)", "types-aiobotocore-freetier (>=2.19.0,<2.20.0)", "types-aiobotocore-fsx (>=2.19.0,<2.20.0)", "types-aiobotocore-gamelift (>=2.19.0,<2.20.0)", "types-aiobotocore-geo-maps (>=2.19.0,<2.20.0)", "types-aiobotocore-geo-places (>=2.19.0,<2.20.0)", "types-aiobotocore-geo-routes (>=2.19.0,<2.20.0)", "types-aiobotocore-glacier (>=2.19.0,<2.20.0)", "types-aiobotocore-globalaccelerator (>=2.19.0,<2.20.0)", "types-aiobotocore-glue (>=2.19.0,<2.20.0)", "types-aiobotocore-grafana (>=2.19.0,<2.20.0)", "types-aiobotocore-greengrass (>=2.19.0,<2.20.0)", "types-aiobotocore-greengrassv2 (>=2.19.0,<2.20.0)", "types-aiobotocore-groundstation (>=2.19.0,<2.20.0)", "types-aiobotocore-guardduty (>=2.19.0,<2.20.0)", "types-aiobotocore-health (>=2.19.0,<2.20.0)", "types-aiobotocore-healthlake (>=2.19.0,<2.20.0)", "types-aiobotocore-iam (>=2.19.0,<2.20.0)", "types-aiobotocore-identitystore (>=2.19.0,<2.20.0)", "types-aiobotocore-imagebuilder (>=2.19.0,<2.20.0)", "types-aiobotocore-importexport (>=2.19.0,<2.20.0)", "types-aiobotocore-inspector (>=2.19.0,<2.20.0)", "types-aiobotocore-inspector-scan (>=2.19.0,<2.20.0)", "types-aiobotocore-inspector2 (>=2.19.0,<2.20.0)", "types-aiobotocore-internetmonitor (>=2.19.0,<2.20.0)", "types-aiobotocore-invoicing (>=2.19.0,<2.20.0)", "types-aiobotocore-iot (>=2.19.0,<2.20.0)", "types-aiobotocore-iot-data (>=2.19.0,<2.20.0)", "types-aiobotocore-iot-jobs-data (>=2.19.0,<2.20.0)", "types-aiobotocore-iotanalytics (>=2.19.0,<2.20.0)", "types-aiobotocore-iotdeviceadvisor (>=2.19.0,<2.20.0)", "types-aiobotocore-iotevents (>=2.19.0,<2.20.0)", "types-aiobotocore-iotevents-data (>=2.19.0,<2.20.0)", "types-aiobotocore-iotfleethub (>=2.19.0,<2.20.0)", "types-aiobotocore-iotfleetwise (>=2.19.0,<2.20.0)", "types-aiobotocore-iotsecuretunneling (>=2.19.0,<2.20.0)", "types-aiobotocore-iotsitewise (>=2.19.0,<2.20.0)", "types-aiobotocore-iotthingsgraph (>=2.19.0,<2.20.0)", "types-aiobotocore-iottwinmaker (>=2.19.0,<2.20.0)", "types-aiobotocore-iotwireless (>=2.19.0,<2.20.0)", "types-aiobotocore-ivs (>=2.19.0,<2.20.0)", "types-aiobotocore-ivs-realtime (>=2.19.0,<2.20.0)", "types-aiobotocore-ivschat (>=2.19.0,<2.20.0)", "types-aiobotocore-kafka (>=2.19.0,<2.20.0)", "types-aiobotocore-kafkaconnect (>=2.19.0,<2.20.0)", "types-aiobotocore-kendra (>=2.19.0,<2.20.0)", "types-aiobotocore-kendra-ranking (>=2.19.0,<2.20.0)", "types-aiobotocore-keyspaces (>=2.19.0,<2.20.0)", "types-aiobotocore-kinesis (>=2.19.0,<2.20.0)", "types-aiobotocore-kinesis-video-archived-media (>=2.19.0,<2.20.0)", "types-aiobotocore-kinesis-video-media (>=2.19.0,<2.20.0)", "types-aiobotocore-kinesis-video-signaling (>=2.19.0,<2.20.0)", "types-aiobotocore-kinesis-video-webrtc-storage (>=2.19.0,<2.20.0)", "types-aiobotocore-kinesisanalytics (>=2.19.0,<2.20.0)", "types-aiobotocore-kinesisanalyticsv2 (>=2.19.0,<2.20.0)", "types-aiobotocore-kinesisvideo (>=2.19.0,<2.20.0)", "types-aiobotocore-kms (>=2.19.0,<2.20.0)", "types-aiobotocore-lakeformation (>=2.19.0,<2.20.0)", "types-aiobotocore-lambda (>=2.19.0,<2.20.0)", "types-aiobotocore-launch-wizard (>=2.19.0,<2.20.0)", "types-aiobotocore-lex-models (>=2.19.0,<2.20.0)", "types-aiobotocore-lex-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-lexv2-models (>=2.19.0,<2.20.0)", "types-aiobotocore-lexv2-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-license-manager (>=2.19.0,<2.20.0)", "types-aiobotocore-license-manager-linux-subscriptions (>=2.19.0,<2.20.0)", "types-aiobotocore-license-manager-user-subscriptions (>=2.19.0,<2.20.0)", "types-aiobotocore-lightsail (>=2.19.0,<2.20.0)", "types-aiobotocore-location (>=2.19.0,<2.20.0)", "types-aiobotocore-logs (>=2.19.0,<2.20.0)", "types-aiobotocore-lookoutequipment (>=2.19.0,<2.20.0)", "types-aiobotocore-lookoutmetrics (>=2.19.0,<2.20.0)", "types-aiobotocore-lookoutvision (>=2.19.0,<2.20.0)", "types-aiobotocore-m2 (>=2.19.0,<2.20.0)", "types-aiobotocore-machinelearning (>=2.19.0,<2.20.0)", "types-aiobotocore-macie2 (>=2.19.0,<2.20.0)", "types-aiobotocore-mailmanager (>=2.19.0,<2.20.0)", "types-aiobotocore-managedblockchain (>=2.19.0,<2.20.0)", "types-aiobotocore-managedblockchain-query (>=2.19.0,<2.20.0)", "types-aiobotocore-marketplace-agreement (>=2.19.0,<2.20.0)", "types-aiobotocore-marketplace-catalog (>=2.19.0,<2.20.0)", "types-aiobotocore-marketplace-deployment (>=2.19.0,<2.20.0)", "types-aiobotocore-marketplace-entitlement (>=2.19.0,<2.20.0)", "types-aiobotocore-marketplace-reporting (>=2.19.0,<2.20.0)", "types-aiobotocore-marketplacecommerceanalytics (>=2.19.0,<2.20.0)", "types-aiobotocore-mediaconnect (>=2.19.0,<2.20.0)", "types-aiobotocore-mediaconvert (>=2.19.0,<2.20.0)", "types-aiobotocore-medialive (>=2.19.0,<2.20.0)", "types-aiobotocore-mediapackage (>=2.19.0,<2.20.0)", "types-aiobotocore-mediapackage-vod (>=2.19.0,<2.20.0)", "types-aiobotocore-mediapackagev2 (>=2.19.0,<2.20.0)", "types-aiobotocore-mediastore (>=2.19.0,<2.20.0)", "types-aiobotocore-mediastore-data (>=2.19.0,<2.20.0)", "types-aiobotocore-mediatailor (>=2.19.0,<2.20.0)", "types-aiobotocore-medical-imaging (>=2.19.0,<2.20.0)", "types-aiobotocore-memorydb (>=2.19.0,<2.20.0)", "types-aiobotocore-meteringmarketplace (>=2.19.0,<2.20.0)", "types-aiobotocore-mgh (>=2.19.0,<2.20.0)", "types-aiobotocore-mgn (>=2.19.0,<2.20.0)", "types-aiobotocore-migration-hub-refactor-spaces (>=2.19.0,<2.20.0)", "types-aiobotocore-migrationhub-config (>=2.19.0,<2.20.0)", "types-aiobotocore-migrationhuborchestrator (>=2.19.0,<2.20.0)", "types-aiobotocore-migrationhubstrategy (>=2.19.0,<2.20.0)", "types-aiobotocore-mq (>=2.19.0,<2.20.0)", "types-aiobotocore-mturk (>=2.19.0,<2.20.0)", "types-aiobotocore-mwaa (>=2.19.0,<2.20.0)", "types-aiobotocore-neptune (>=2.19.0,<2.20.0)", "types-aiobotocore-neptune-graph (>=2.19.0,<2.20.0)", "types-aiobotocore-neptunedata (>=2.19.0,<2.20.0)", "types-aiobotocore-network-firewall (>=2.19.0,<2.20.0)", "types-aiobotocore-networkflowmonitor (>=2.19.0,<2.20.0)", "types-aiobotocore-networkmanager (>=2.19.0,<2.20.0)", "types-aiobotocore-networkmonitor (>=2.19.0,<2.20.0)", "types-aiobotocore-notifications (>=2.19.0,<2.20.0)", "types-aiobotocore-notificationscontacts (>=2.19.0,<2.20.0)", "types-aiobotocore-oam (>=2.19.0,<2.20.0)", "types-aiobotocore-observabilityadmin (>=2.19.0,<2.20.0)", "types-aiobotocore-omics (>=2.19.0,<2.20.0)", "types-aiobotocore-opensearch (>=2.19.0,<2.20.0)", "types-aiobotocore-opensearchserverless (>=2.19.0,<2.20.0)", "types-aiobotocore-opsworks (>=2.19.0,<2.20.0)", "types-aiobotocore-opsworkscm (>=2.19.0,<2.20.0)", "types-aiobotocore-organizations (>=2.19.0,<2.20.0)", "types-aiobotocore-osis (>=2.19.0,<2.20.0)", "types-aiobotocore-outposts (>=2.19.0,<2.20.0)", "types-aiobotocore-panorama (>=2.19.0,<2.20.0)", "types-aiobotocore-partnercentral-selling (>=2.19.0,<2.20.0)", "types-aiobotocore-payment-cryptography (>=2.19.0,<2.20.0)", "types-aiobotocore-payment-cryptography-data (>=2.19.0,<2.20.0)", "types-aiobotocore-pca-connector-ad (>=2.19.0,<2.20.0)", "types-aiobotocore-pca-connector-scep (>=2.19.0,<2.20.0)", "types-aiobotocore-pcs (>=2.19.0,<2.20.0)", "types-aiobotocore-personalize (>=2.19.0,<2.20.0)", "types-aiobotocore-personalize-events (>=2.19.0,<2.20.0)", "types-aiobotocore-personalize-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-pi (>=2.19.0,<2.20.0)", "types-aiobotocore-pinpoint (>=2.19.0,<2.20.0)", "types-aiobotocore-pinpoint-email (>=2.19.0,<2.20.0)", "types-aiobotocore-pinpoint-sms-voice (>=2.19.0,<2.20.0)", "types-aiobotocore-pinpoint-sms-voice-v2 (>=2.19.0,<2.20.0)", "types-aiobotocore-pipes (>=2.19.0,<2.20.0)", "types-aiobotocore-polly (>=2.19.0,<2.20.0)", "types-aiobotocore-pricing (>=2.19.0,<2.20.0)", "types-aiobotocore-privatenetworks (>=2.19.0,<2.20.0)", "types-aiobotocore-proton (>=2.19.0,<2.20.0)", "types-aiobotocore-qapps (>=2.19.0,<2.20.0)", "types-aiobotocore-qbusiness (>=2.19.0,<2.20.0)", "types-aiobotocore-qconnect (>=2.19.0,<2.20.0)", "types-aiobotocore-qldb (>=2.19.0,<2.20.0)", "types-aiobotocore-qldb-session (>=2.19.0,<2.20.0)", "types-aiobotocore-quicksight (>=2.19.0,<2.20.0)", "types-aiobotocore-ram (>=2.19.0,<2.20.0)", "types-aiobotocore-rbin (>=2.19.0,<2.20.0)", "types-aiobotocore-rds (>=2.19.0,<2.20.0)", "types-aiobotocore-rds-data (>=2.19.0,<2.20.0)", "types-aiobotocore-redshift (>=2.19.0,<2.20.0)", "types-aiobotocore-redshift-data (>=2.19.0,<2.20.0)", "types-aiobotocore-redshift-serverless (>=2.19.0,<2.20.0)", "types-aiobotocore-rekognition (>=2.19.0,<2.20.0)", "types-aiobotocore-repostspace (>=2.19.0,<2.20.0)", "types-aiobotocore-resiliencehub (>=2.19.0,<2.20.0)", "types-aiobotocore-resource-explorer-2 (>=2.19.0,<2.20.0)", "types-aiobotocore-resource-groups (>=2.19.0,<2.20.0)", "types-aiobotocore-resourcegroupstaggingapi (>=2.19.0,<2.20.0)", "types-aiobotocore-robomaker (>=2.19.0,<2.20.0)", "types-aiobotocore-rolesanywhere (>=2.19.0,<2.20.0)", "types-aiobotocore-route53 (>=2.19.0,<2.20.0)", "types-aiobotocore-route53-recovery-cluster (>=2.19.0,<2.20.0)", "types-aiobotocore-route53-recovery-control-config (>=2.19.0,<2.20.0)", "types-aiobotocore-route53-recovery-readiness (>=2.19.0,<2.20.0)", "types-aiobotocore-route53domains (>=2.19.0,<2.20.0)", "types-aiobotocore-route53profiles (>=2.19.0,<2.20.0)", "types-aiobotocore-route53resolver (>=2.19.0,<2.20.0)", "types-aiobotocore-rum (>=2.19.0,<2.20.0)", "types-aiobotocore-s3 (>=2.19.0,<2.20.0)", "types-aiobotocore-s3control (>=2.19.0,<2.20.0)", "types-aiobotocore-s3outposts (>=2.19.0,<2.20.0)", "types-aiobotocore-s3tables (>=2.19.0,<2.20.0)", "types-aiobotocore-sagemaker (>=2.19.0,<2.20.0)", "types-aiobotocore-sagemaker-a2i-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-sagemaker-edge (>=2.19.0,<2.20.0)", "types-aiobotocore-sagemaker-featurestore-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-sagemaker-geospatial (>=2.19.0,<2.20.0)", "types-aiobotocore-sagemaker-metrics (>=2.19.0,<2.20.0)", "types-aiobotocore-sagemaker-runtime (>=2.19.0,<2.20.0)", "types-aiobotocore-savingsplans (>=2.19.0,<2.20.0)", "types-aiobotocore-scheduler (>=2.19.0,<2.20.0)", "types-aiobotocore-schemas (>=2.19.0,<2.20.0)", "types-aiobotocore-sdb (>=2.19.0,<2.20.0)", "types-aiobotocore-secretsmanager (>=2.19.0,<2.20.0)", "types-aiobotocore-security-ir (>=2.19.0,<2.20.0)", "types-aiobotocore-securityhub (>=2.19.0,<2.20.0)", "types-aiobotocore-securitylake (>=2.19.0,<2.20.0)", "types-aiobotocore-serverlessrepo (>=2.19.0,<2.20.0)", "types-aiobotocore-service-quotas (>=2.19.0,<2.20.0)", "types-aiobotocore-servicecatalog (>=2.19.0,<2.20.0)", "types-aiobotocore-servicecatalog-appregistry (>=2.19.0,<2.20.0)", "types-aiobotocore-servicediscovery (>=2.19.0,<2.20.0)", "types-aiobotocore-ses (>=2.19.0,<2.20.0)", "types-aiobotocore-sesv2 (>=2.19.0,<2.20.0)", "types-aiobotocore-shield (>=2.19.0,<2.20.0)", "types-aiobotocore-signer (>=2.19.0,<2.20.0)", "types-aiobotocore-simspaceweaver (>=2.19.0,<2.20.0)", "types-aiobotocore-sms (>=2.19.0,<2.20.0)", "types-aiobotocore-sms-voice (>=2.19.0,<2.20.0)", "types-aiobotocore-snow-device-management (>=2.19.0,<2.20.0)", "types-aiobotocore-snowball (>=2.19.0,<2.20.0)", "types-aiobotocore-sns (>=2.19.0,<2.20.0)", "types-aiobotocore-socialmessaging (>=2.19.0,<2.20.0)", "types-aiobotocore-sqs (>=2.19.0,<2.20.0)", "types-aiobotocore-ssm (>=2.19.0,<2.20.0)", "types-aiobotocore-ssm-contacts (>=2.19.0,<2.20.0)", "types-aiobotocore-ssm-incidents (>=2.19.0,<2.20.0)", "types-aiobotocore-ssm-quicksetup (>=2.19.0,<2.20.0)", "types-aiobotocore-ssm-sap (>=2.19.0,<2.20.0)", "types-aiobotocore-sso (>=2.19.0,<2.20.0)", "types-aiobotocore-sso-admin (>=2.19.0,<2.20.0)", "types-aiobotocore-sso-oidc (>=2.19.0,<2.20.0)", "types-aiobotocore-stepfunctions (>=2.19.0,<2.20.0)", "types-aiobotocore-storagegateway (>=2.19.0,<2.20.0)", "types-aiobotocore-sts (>=2.19.0,<2.20.0)", "types-aiobotocore-supplychain (>=2.19.0,<2.20.0)", "types-aiobotocore-support (>=2.19.0,<2.20.0)", "types-aiobotocore-support-app (>=2.19.0,<2.20.0)", "types-aiobotocore-swf (>=2.19.0,<2.20.0)", "types-aiobotocore-synthetics (>=2.19.0,<2.20.0)", "types-aiobotocore-taxsettings (>=2.19.0,<2.20.0)", "types-aiobotocore-textract (>=2.19.0,<2.20.0)", "types-aiobotocore-timestream-influxdb (>=2.19.0,<2.20.0)", "types-aiobotocore-timestream-query (>=2.19.0,<2.20.0)", "types-aiobotocore-timestream-write (>=2.19.0,<2.20.0)", "types-aiobotocore-tnb (>=2.19.0,<2.20.0)", "types-aiobotocore-transcribe (>=2.19.0,<2.20.0)", "types-aiobotocore-transfer (>=2.19.0,<2.20.0)", "types-aiobotocore-translate (>=2.19.0,<2.20.0)", "types-aiobotocore-trustedadvisor (>=2.19.0,<2.20.0)", "types-aiobotocore-verifiedpermissions (>=2.19.0,<2.20.0)", "types-aiobotocore-voice-id (>=2.19.0,<2.20.0)", "types-aiobotocore-vpc-lattice (>=2.19.0,<2.20.0)", "types-aiobotocore-waf (>=2.19.0,<2.20.0)", "types-aiobotocore-waf-regional (>=2.19.0,<2.20.0)", "types-aiobotocore-wafv2 (>=2.19.0,<2.20.0)", "types-aiobotocore-wellarchitected (>=2.19.0,<2.20.0)", "types-aiobotocore-wisdom (>=2.19.0,<2.20.0)", "types-aiobotocore-workdocs (>=2.19.0,<2.20.0)", "types-aiobotocore-workmail (>=2.19.0,<2.20.0)", "types-aiobotocore-workmailmessageflow (>=2.19.0,<2.20.0)", "types-aiobotocore-workspaces (>=2.19.0,<2.20.0)", "types-aiobotocore-workspaces-thin-client (>=2.19.0,<2.20.0)", "types-aiobotocore-workspaces-web (>=2.19.0,<2.20.0)", "types-aiobotocore-xray (>=2.19.0,<2.20.0)"] amp = ["types-aiobotocore-amp (>=2.19.0,<2.20.0)"] amplify = ["types-aiobotocore-amplify (>=2.19.0,<2.20.0)"] amplifybackend = ["types-aiobotocore-amplifybackend (>=2.19.0,<2.20.0)"] amplifyuibuilder = ["types-aiobotocore-amplifyuibuilder (>=2.19.0,<2.20.0)"] apigateway = ["types-aiobotocore-apigateway (>=2.19.0,<2.20.0)"] apigatewaymanagementapi = ["types-aiobotocore-apigatewaymanagementapi (>=2.19.0,<2.20.0)"] apigatewayv2 = ["types-aiobotocore-apigatewayv2 (>=2.19.0,<2.20.0)"] appconfig = ["types-aiobotocore-appconfig (>=2.19.0,<2.20.0)"] appconfigdata = ["types-aiobotocore-appconfigdata (>=2.19.0,<2.20.0)"] appfabric = ["types-aiobotocore-appfabric (>=2.19.0,<2.20.0)"] appflow = ["types-aiobotocore-appflow (>=2.19.0,<2.20.0)"] appintegrations = ["types-aiobotocore-appintegrations (>=2.19.0,<2.20.0)"] application-autoscaling = ["types-aiobotocore-application-autoscaling (>=2.19.0,<2.20.0)"] application-insights = ["types-aiobotocore-application-insights (>=2.19.0,<2.20.0)"] application-signals = ["types-aiobotocore-application-signals (>=2.19.0,<2.20.0)"] applicationcostprofiler = ["types-aiobotocore-applicationcostprofiler (>=2.19.0,<2.20.0)"] appmesh = ["types-aiobotocore-appmesh (>=2.19.0,<2.20.0)"] apprunner = ["types-aiobotocore-apprunner (>=2.19.0,<2.20.0)"] appstream = ["types-aiobotocore-appstream (>=2.19.0,<2.20.0)"] appsync = ["types-aiobotocore-appsync (>=2.19.0,<2.20.0)"] apptest = ["types-aiobotocore-apptest (>=2.19.0,<2.20.0)"] arc-zonal-shift = ["types-aiobotocore-arc-zonal-shift (>=2.19.0,<2.20.0)"] artifact = ["types-aiobotocore-artifact (>=2.19.0,<2.20.0)"] athena = ["types-aiobotocore-athena (>=2.19.0,<2.20.0)"] auditmanager = ["types-aiobotocore-auditmanager (>=2.19.0,<2.20.0)"] autoscaling = ["types-aiobotocore-autoscaling (>=2.19.0,<2.20.0)"] autoscaling-plans = ["types-aiobotocore-autoscaling-plans (>=2.19.0,<2.20.0)"] b2bi = ["types-aiobotocore-b2bi (>=2.19.0,<2.20.0)"] backup = ["types-aiobotocore-backup (>=2.19.0,<2.20.0)"] backup-gateway = ["types-aiobotocore-backup-gateway (>=2.19.0,<2.20.0)"] backupsearch = ["types-aiobotocore-backupsearch (>=2.19.0,<2.20.0)"] batch = ["types-aiobotocore-batch (>=2.19.0,<2.20.0)"] bcm-data-exports = ["types-aiobotocore-bcm-data-exports (>=2.19.0,<2.20.0)"] bcm-pricing-calculator = ["types-aiobotocore-bcm-pricing-calculator (>=2.19.0,<2.20.0)"] bedrock = ["types-aiobotocore-bedrock (>=2.19.0,<2.20.0)"] bedrock-agent = ["types-aiobotocore-bedrock-agent (>=2.19.0,<2.20.0)"] bedrock-agent-runtime = ["types-aiobotocore-bedrock-agent-runtime (>=2.19.0,<2.20.0)"] bedrock-data-automation = ["types-aiobotocore-bedrock-data-automation (>=2.19.0,<2.20.0)"] bedrock-data-automation-runtime = ["types-aiobotocore-bedrock-data-automation-runtime (>=2.19.0,<2.20.0)"] bedrock-runtime = ["types-aiobotocore-bedrock-runtime (>=2.19.0,<2.20.0)"] billing = ["types-aiobotocore-billing (>=2.19.0,<2.20.0)"] billingconductor = ["types-aiobotocore-billingconductor (>=2.19.0,<2.20.0)"] braket = ["types-aiobotocore-braket (>=2.19.0,<2.20.0)"] budgets = ["types-aiobotocore-budgets (>=2.19.0,<2.20.0)"] ce = ["types-aiobotocore-ce (>=2.19.0,<2.20.0)"] chatbot = ["types-aiobotocore-chatbot (>=2.19.0,<2.20.0)"] chime = ["types-aiobotocore-chime (>=2.19.0,<2.20.0)"] chime-sdk-identity = ["types-aiobotocore-chime-sdk-identity (>=2.19.0,<2.20.0)"] chime-sdk-media-pipelines = ["types-aiobotocore-chime-sdk-media-pipelines (>=2.19.0,<2.20.0)"] chime-sdk-meetings = ["types-aiobotocore-chime-sdk-meetings (>=2.19.0,<2.20.0)"] chime-sdk-messaging = ["types-aiobotocore-chime-sdk-messaging (>=2.19.0,<2.20.0)"] chime-sdk-voice = ["types-aiobotocore-chime-sdk-voice (>=2.19.0,<2.20.0)"] cleanrooms = ["types-aiobotocore-cleanrooms (>=2.19.0,<2.20.0)"] cleanroomsml = ["types-aiobotocore-cleanroomsml (>=2.19.0,<2.20.0)"] cloud9 = ["types-aiobotocore-cloud9 (>=2.19.0,<2.20.0)"] cloudcontrol = ["types-aiobotocore-cloudcontrol (>=2.19.0,<2.20.0)"] clouddirectory = ["types-aiobotocore-clouddirectory (>=2.19.0,<2.20.0)"] cloudformation = ["types-aiobotocore-cloudformation (>=2.19.0,<2.20.0)"] cloudfront = ["types-aiobotocore-cloudfront (>=2.19.0,<2.20.0)"] cloudfront-keyvaluestore = ["types-aiobotocore-cloudfront-keyvaluestore (>=2.19.0,<2.20.0)"] cloudhsm = ["types-aiobotocore-cloudhsm (>=2.19.0,<2.20.0)"] cloudhsmv2 = ["types-aiobotocore-cloudhsmv2 (>=2.19.0,<2.20.0)"] cloudsearch = ["types-aiobotocore-cloudsearch (>=2.19.0,<2.20.0)"] cloudsearchdomain = ["types-aiobotocore-cloudsearchdomain (>=2.19.0,<2.20.0)"] cloudtrail = ["types-aiobotocore-cloudtrail (>=2.19.0,<2.20.0)"] cloudtrail-data = ["types-aiobotocore-cloudtrail-data (>=2.19.0,<2.20.0)"] cloudwatch = ["types-aiobotocore-cloudwatch (>=2.19.0,<2.20.0)"] codeartifact = ["types-aiobotocore-codeartifact (>=2.19.0,<2.20.0)"] codebuild = ["types-aiobotocore-codebuild (>=2.19.0,<2.20.0)"] codecatalyst = ["types-aiobotocore-codecatalyst (>=2.19.0,<2.20.0)"] codecommit = ["types-aiobotocore-codecommit (>=2.19.0,<2.20.0)"] codeconnections = ["types-aiobotocore-codeconnections (>=2.19.0,<2.20.0)"] codedeploy = ["types-aiobotocore-codedeploy (>=2.19.0,<2.20.0)"] codeguru-reviewer = ["types-aiobotocore-codeguru-reviewer (>=2.19.0,<2.20.0)"] codeguru-security = ["types-aiobotocore-codeguru-security (>=2.19.0,<2.20.0)"] codeguruprofiler = ["types-aiobotocore-codeguruprofiler (>=2.19.0,<2.20.0)"] codepipeline = ["types-aiobotocore-codepipeline (>=2.19.0,<2.20.0)"] codestar-connections = ["types-aiobotocore-codestar-connections (>=2.19.0,<2.20.0)"] codestar-notifications = ["types-aiobotocore-codestar-notifications (>=2.19.0,<2.20.0)"] cognito-identity = ["types-aiobotocore-cognito-identity (>=2.19.0,<2.20.0)"] cognito-idp = ["types-aiobotocore-cognito-idp (>=2.19.0,<2.20.0)"] cognito-sync = ["types-aiobotocore-cognito-sync (>=2.19.0,<2.20.0)"] comprehend = ["types-aiobotocore-comprehend (>=2.19.0,<2.20.0)"] comprehendmedical = ["types-aiobotocore-comprehendmedical (>=2.19.0,<2.20.0)"] compute-optimizer = ["types-aiobotocore-compute-optimizer (>=2.19.0,<2.20.0)"] config = ["types-aiobotocore-config (>=2.19.0,<2.20.0)"] connect = ["types-aiobotocore-connect (>=2.19.0,<2.20.0)"] connect-contact-lens = ["types-aiobotocore-connect-contact-lens (>=2.19.0,<2.20.0)"] connectcampaigns = ["types-aiobotocore-connectcampaigns (>=2.19.0,<2.20.0)"] connectcampaignsv2 = ["types-aiobotocore-connectcampaignsv2 (>=2.19.0,<2.20.0)"] connectcases = ["types-aiobotocore-connectcases (>=2.19.0,<2.20.0)"] connectparticipant = ["types-aiobotocore-connectparticipant (>=2.19.0,<2.20.0)"] controlcatalog = ["types-aiobotocore-controlcatalog (>=2.19.0,<2.20.0)"] controltower = ["types-aiobotocore-controltower (>=2.19.0,<2.20.0)"] cost-optimization-hub = ["types-aiobotocore-cost-optimization-hub (>=2.19.0,<2.20.0)"] cur = ["types-aiobotocore-cur (>=2.19.0,<2.20.0)"] customer-profiles = ["types-aiobotocore-customer-profiles (>=2.19.0,<2.20.0)"] databrew = ["types-aiobotocore-databrew (>=2.19.0,<2.20.0)"] dataexchange = ["types-aiobotocore-dataexchange (>=2.19.0,<2.20.0)"] datapipeline = ["types-aiobotocore-datapipeline (>=2.19.0,<2.20.0)"] datasync = ["types-aiobotocore-datasync (>=2.19.0,<2.20.0)"] datazone = ["types-aiobotocore-datazone (>=2.19.0,<2.20.0)"] dax = ["types-aiobotocore-dax (>=2.19.0,<2.20.0)"] deadline = ["types-aiobotocore-deadline (>=2.19.0,<2.20.0)"] detective = ["types-aiobotocore-detective (>=2.19.0,<2.20.0)"] devicefarm = ["types-aiobotocore-devicefarm (>=2.19.0,<2.20.0)"] devops-guru = ["types-aiobotocore-devops-guru (>=2.19.0,<2.20.0)"] directconnect = ["types-aiobotocore-directconnect (>=2.19.0,<2.20.0)"] discovery = ["types-aiobotocore-discovery (>=2.19.0,<2.20.0)"] dlm = ["types-aiobotocore-dlm (>=2.19.0,<2.20.0)"] dms = ["types-aiobotocore-dms (>=2.19.0,<2.20.0)"] docdb = ["types-aiobotocore-docdb (>=2.19.0,<2.20.0)"] docdb-elastic = ["types-aiobotocore-docdb-elastic (>=2.19.0,<2.20.0)"] drs = ["types-aiobotocore-drs (>=2.19.0,<2.20.0)"] ds = ["types-aiobotocore-ds (>=2.19.0,<2.20.0)"] ds-data = ["types-aiobotocore-ds-data (>=2.19.0,<2.20.0)"] dsql = ["types-aiobotocore-dsql (>=2.19.0,<2.20.0)"] dynamodb = ["types-aiobotocore-dynamodb (>=2.19.0,<2.20.0)"] dynamodbstreams = ["types-aiobotocore-dynamodbstreams (>=2.19.0,<2.20.0)"] ebs = ["types-aiobotocore-ebs (>=2.19.0,<2.20.0)"] ec2 = ["types-aiobotocore-ec2 (>=2.19.0,<2.20.0)"] ec2-instance-connect = ["types-aiobotocore-ec2-instance-connect (>=2.19.0,<2.20.0)"] ecr = ["types-aiobotocore-ecr (>=2.19.0,<2.20.0)"] ecr-public = ["types-aiobotocore-ecr-public (>=2.19.0,<2.20.0)"] ecs = ["types-aiobotocore-ecs (>=2.19.0,<2.20.0)"] efs = ["types-aiobotocore-efs (>=2.19.0,<2.20.0)"] eks = ["types-aiobotocore-eks (>=2.19.0,<2.20.0)"] eks-auth = ["types-aiobotocore-eks-auth (>=2.19.0,<2.20.0)"] elastic-inference = ["types-aiobotocore-elastic-inference (>=2.19.0,<2.20.0)"] elasticache = ["types-aiobotocore-elasticache (>=2.19.0,<2.20.0)"] elasticbeanstalk = ["types-aiobotocore-elasticbeanstalk (>=2.19.0,<2.20.0)"] elastictranscoder = ["types-aiobotocore-elastictranscoder (>=2.19.0,<2.20.0)"] elb = ["types-aiobotocore-elb (>=2.19.0,<2.20.0)"] elbv2 = ["types-aiobotocore-elbv2 (>=2.19.0,<2.20.0)"] emr = ["types-aiobotocore-emr (>=2.19.0,<2.20.0)"] emr-containers = ["types-aiobotocore-emr-containers (>=2.19.0,<2.20.0)"] emr-serverless = ["types-aiobotocore-emr-serverless (>=2.19.0,<2.20.0)"] entityresolution = ["types-aiobotocore-entityresolution (>=2.19.0,<2.20.0)"] es = ["types-aiobotocore-es (>=2.19.0,<2.20.0)"] essential = ["types-aiobotocore-cloudformation (>=2.19.0,<2.20.0)", "types-aiobotocore-dynamodb (>=2.19.0,<2.20.0)", "types-aiobotocore-ec2 (>=2.19.0,<2.20.0)", "types-aiobotocore-lambda (>=2.19.0,<2.20.0)", "types-aiobotocore-rds (>=2.19.0,<2.20.0)", "types-aiobotocore-s3 (>=2.19.0,<2.20.0)", "types-aiobotocore-sqs (>=2.19.0,<2.20.0)"] events = ["types-aiobotocore-events (>=2.19.0,<2.20.0)"] evidently = ["types-aiobotocore-evidently (>=2.19.0,<2.20.0)"] finspace = ["types-aiobotocore-finspace (>=2.19.0,<2.20.0)"] finspace-data = ["types-aiobotocore-finspace-data (>=2.19.0,<2.20.0)"] firehose = ["types-aiobotocore-firehose (>=2.19.0,<2.20.0)"] fis = ["types-aiobotocore-fis (>=2.19.0,<2.20.0)"] fms = ["types-aiobotocore-fms (>=2.19.0,<2.20.0)"] forecast = ["types-aiobotocore-forecast (>=2.19.0,<2.20.0)"] forecastquery = ["types-aiobotocore-forecastquery (>=2.19.0,<2.20.0)"] frauddetector = ["types-aiobotocore-frauddetector (>=2.19.0,<2.20.0)"] freetier = ["types-aiobotocore-freetier (>=2.19.0,<2.20.0)"] fsx = ["types-aiobotocore-fsx (>=2.19.0,<2.20.0)"] full = ["types-aiobotocore-full (>=2.19.0,<2.20.0)"] gamelift = ["types-aiobotocore-gamelift (>=2.19.0,<2.20.0)"] geo-maps = ["types-aiobotocore-geo-maps (>=2.19.0,<2.20.0)"] geo-places = ["types-aiobotocore-geo-places (>=2.19.0,<2.20.0)"] geo-routes = ["types-aiobotocore-geo-routes (>=2.19.0,<2.20.0)"] glacier = ["types-aiobotocore-glacier (>=2.19.0,<2.20.0)"] globalaccelerator = ["types-aiobotocore-globalaccelerator (>=2.19.0,<2.20.0)"] glue = ["types-aiobotocore-glue (>=2.19.0,<2.20.0)"] grafana = ["types-aiobotocore-grafana (>=2.19.0,<2.20.0)"] greengrass = ["types-aiobotocore-greengrass (>=2.19.0,<2.20.0)"] greengrassv2 = ["types-aiobotocore-greengrassv2 (>=2.19.0,<2.20.0)"] groundstation = ["types-aiobotocore-groundstation (>=2.19.0,<2.20.0)"] guardduty = ["types-aiobotocore-guardduty (>=2.19.0,<2.20.0)"] health = ["types-aiobotocore-health (>=2.19.0,<2.20.0)"] healthlake = ["types-aiobotocore-healthlake (>=2.19.0,<2.20.0)"] iam = ["types-aiobotocore-iam (>=2.19.0,<2.20.0)"] identitystore = ["types-aiobotocore-identitystore (>=2.19.0,<2.20.0)"] imagebuilder = ["types-aiobotocore-imagebuilder (>=2.19.0,<2.20.0)"] importexport = ["types-aiobotocore-importexport (>=2.19.0,<2.20.0)"] inspector = ["types-aiobotocore-inspector (>=2.19.0,<2.20.0)"] inspector-scan = ["types-aiobotocore-inspector-scan (>=2.19.0,<2.20.0)"] inspector2 = ["types-aiobotocore-inspector2 (>=2.19.0,<2.20.0)"] internetmonitor = ["types-aiobotocore-internetmonitor (>=2.19.0,<2.20.0)"] invoicing = ["types-aiobotocore-invoicing (>=2.19.0,<2.20.0)"] iot = ["types-aiobotocore-iot (>=2.19.0,<2.20.0)"] iot-data = ["types-aiobotocore-iot-data (>=2.19.0,<2.20.0)"] iot-jobs-data = ["types-aiobotocore-iot-jobs-data (>=2.19.0,<2.20.0)"] iotanalytics = ["types-aiobotocore-iotanalytics (>=2.19.0,<2.20.0)"] iotdeviceadvisor = ["types-aiobotocore-iotdeviceadvisor (>=2.19.0,<2.20.0)"] iotevents = ["types-aiobotocore-iotevents (>=2.19.0,<2.20.0)"] iotevents-data = ["types-aiobotocore-iotevents-data (>=2.19.0,<2.20.0)"] iotfleethub = ["types-aiobotocore-iotfleethub (>=2.19.0,<2.20.0)"] iotfleetwise = ["types-aiobotocore-iotfleetwise (>=2.19.0,<2.20.0)"] iotsecuretunneling = ["types-aiobotocore-iotsecuretunneling (>=2.19.0,<2.20.0)"] iotsitewise = ["types-aiobotocore-iotsitewise (>=2.19.0,<2.20.0)"] iotthingsgraph = ["types-aiobotocore-iotthingsgraph (>=2.19.0,<2.20.0)"] iottwinmaker = ["types-aiobotocore-iottwinmaker (>=2.19.0,<2.20.0)"] iotwireless = ["types-aiobotocore-iotwireless (>=2.19.0,<2.20.0)"] ivs = ["types-aiobotocore-ivs (>=2.19.0,<2.20.0)"] ivs-realtime = ["types-aiobotocore-ivs-realtime (>=2.19.0,<2.20.0)"] ivschat = ["types-aiobotocore-ivschat (>=2.19.0,<2.20.0)"] kafka = ["types-aiobotocore-kafka (>=2.19.0,<2.20.0)"] kafkaconnect = ["types-aiobotocore-kafkaconnect (>=2.19.0,<2.20.0)"] kendra = ["types-aiobotocore-kendra (>=2.19.0,<2.20.0)"] kendra-ranking = ["types-aiobotocore-kendra-ranking (>=2.19.0,<2.20.0)"] keyspaces = ["types-aiobotocore-keyspaces (>=2.19.0,<2.20.0)"] kinesis = ["types-aiobotocore-kinesis (>=2.19.0,<2.20.0)"] kinesis-video-archived-media = ["types-aiobotocore-kinesis-video-archived-media (>=2.19.0,<2.20.0)"] kinesis-video-media = ["types-aiobotocore-kinesis-video-media (>=2.19.0,<2.20.0)"] kinesis-video-signaling = ["types-aiobotocore-kinesis-video-signaling (>=2.19.0,<2.20.0)"] kinesis-video-webrtc-storage = ["types-aiobotocore-kinesis-video-webrtc-storage (>=2.19.0,<2.20.0)"] kinesisanalytics = ["types-aiobotocore-kinesisanalytics (>=2.19.0,<2.20.0)"] kinesisanalyticsv2 = ["types-aiobotocore-kinesisanalyticsv2 (>=2.19.0,<2.20.0)"] kinesisvideo = ["types-aiobotocore-kinesisvideo (>=2.19.0,<2.20.0)"] kms = ["types-aiobotocore-kms (>=2.19.0,<2.20.0)"] lakeformation = ["types-aiobotocore-lakeformation (>=2.19.0,<2.20.0)"] lambda = ["types-aiobotocore-lambda (>=2.19.0,<2.20.0)"] launch-wizard = ["types-aiobotocore-launch-wizard (>=2.19.0,<2.20.0)"] lex-models = ["types-aiobotocore-lex-models (>=2.19.0,<2.20.0)"] lex-runtime = ["types-aiobotocore-lex-runtime (>=2.19.0,<2.20.0)"] lexv2-models = ["types-aiobotocore-lexv2-models (>=2.19.0,<2.20.0)"] lexv2-runtime = ["types-aiobotocore-lexv2-runtime (>=2.19.0,<2.20.0)"] license-manager = ["types-aiobotocore-license-manager (>=2.19.0,<2.20.0)"] license-manager-linux-subscriptions = ["types-aiobotocore-license-manager-linux-subscriptions (>=2.19.0,<2.20.0)"] license-manager-user-subscriptions = ["types-aiobotocore-license-manager-user-subscriptions (>=2.19.0,<2.20.0)"] lightsail = ["types-aiobotocore-lightsail (>=2.19.0,<2.20.0)"] location = ["types-aiobotocore-location (>=2.19.0,<2.20.0)"] logs = ["types-aiobotocore-logs (>=2.19.0,<2.20.0)"] lookoutequipment = ["types-aiobotocore-lookoutequipment (>=2.19.0,<2.20.0)"] lookoutmetrics = ["types-aiobotocore-lookoutmetrics (>=2.19.0,<2.20.0)"] lookoutvision = ["types-aiobotocore-lookoutvision (>=2.19.0,<2.20.0)"] m2 = ["types-aiobotocore-m2 (>=2.19.0,<2.20.0)"] machinelearning = ["types-aiobotocore-machinelearning (>=2.19.0,<2.20.0)"] macie2 = ["types-aiobotocore-macie2 (>=2.19.0,<2.20.0)"] mailmanager = ["types-aiobotocore-mailmanager (>=2.19.0,<2.20.0)"] managedblockchain = ["types-aiobotocore-managedblockchain (>=2.19.0,<2.20.0)"] managedblockchain-query = ["types-aiobotocore-managedblockchain-query (>=2.19.0,<2.20.0)"] marketplace-agreement = ["types-aiobotocore-marketplace-agreement (>=2.19.0,<2.20.0)"] marketplace-catalog = ["types-aiobotocore-marketplace-catalog (>=2.19.0,<2.20.0)"] marketplace-deployment = ["types-aiobotocore-marketplace-deployment (>=2.19.0,<2.20.0)"] marketplace-entitlement = ["types-aiobotocore-marketplace-entitlement (>=2.19.0,<2.20.0)"] marketplace-reporting = ["types-aiobotocore-marketplace-reporting (>=2.19.0,<2.20.0)"] marketplacecommerceanalytics = ["types-aiobotocore-marketplacecommerceanalytics (>=2.19.0,<2.20.0)"] mediaconnect = ["types-aiobotocore-mediaconnect (>=2.19.0,<2.20.0)"] mediaconvert = ["types-aiobotocore-mediaconvert (>=2.19.0,<2.20.0)"] medialive = ["types-aiobotocore-medialive (>=2.19.0,<2.20.0)"] mediapackage = ["types-aiobotocore-mediapackage (>=2.19.0,<2.20.0)"] mediapackage-vod = ["types-aiobotocore-mediapackage-vod (>=2.19.0,<2.20.0)"] mediapackagev2 = ["types-aiobotocore-mediapackagev2 (>=2.19.0,<2.20.0)"] mediastore = ["types-aiobotocore-mediastore (>=2.19.0,<2.20.0)"] mediastore-data = ["types-aiobotocore-mediastore-data (>=2.19.0,<2.20.0)"] mediatailor = ["types-aiobotocore-mediatailor (>=2.19.0,<2.20.0)"] medical-imaging = ["types-aiobotocore-medical-imaging (>=2.19.0,<2.20.0)"] memorydb = ["types-aiobotocore-memorydb (>=2.19.0,<2.20.0)"] meteringmarketplace = ["types-aiobotocore-meteringmarketplace (>=2.19.0,<2.20.0)"] mgh = ["types-aiobotocore-mgh (>=2.19.0,<2.20.0)"] mgn = ["types-aiobotocore-mgn (>=2.19.0,<2.20.0)"] migration-hub-refactor-spaces = ["types-aiobotocore-migration-hub-refactor-spaces (>=2.19.0,<2.20.0)"] migrationhub-config = ["types-aiobotocore-migrationhub-config (>=2.19.0,<2.20.0)"] migrationhuborchestrator = ["types-aiobotocore-migrationhuborchestrator (>=2.19.0,<2.20.0)"] migrationhubstrategy = ["types-aiobotocore-migrationhubstrategy (>=2.19.0,<2.20.0)"] mq = ["types-aiobotocore-mq (>=2.19.0,<2.20.0)"] mturk = ["types-aiobotocore-mturk (>=2.19.0,<2.20.0)"] mwaa = ["types-aiobotocore-mwaa (>=2.19.0,<2.20.0)"] neptune = ["types-aiobotocore-neptune (>=2.19.0,<2.20.0)"] neptune-graph = ["types-aiobotocore-neptune-graph (>=2.19.0,<2.20.0)"] neptunedata = ["types-aiobotocore-neptunedata (>=2.19.0,<2.20.0)"] network-firewall = ["types-aiobotocore-network-firewall (>=2.19.0,<2.20.0)"] networkflowmonitor = ["types-aiobotocore-networkflowmonitor (>=2.19.0,<2.20.0)"] networkmanager = ["types-aiobotocore-networkmanager (>=2.19.0,<2.20.0)"] networkmonitor = ["types-aiobotocore-networkmonitor (>=2.19.0,<2.20.0)"] notifications = ["types-aiobotocore-notifications (>=2.19.0,<2.20.0)"] notificationscontacts = ["types-aiobotocore-notificationscontacts (>=2.19.0,<2.20.0)"] oam = ["types-aiobotocore-oam (>=2.19.0,<2.20.0)"] observabilityadmin = ["types-aiobotocore-observabilityadmin (>=2.19.0,<2.20.0)"] omics = ["types-aiobotocore-omics (>=2.19.0,<2.20.0)"] opensearch = ["types-aiobotocore-opensearch (>=2.19.0,<2.20.0)"] opensearchserverless = ["types-aiobotocore-opensearchserverless (>=2.19.0,<2.20.0)"] opsworks = ["types-aiobotocore-opsworks (>=2.19.0,<2.20.0)"] opsworkscm = ["types-aiobotocore-opsworkscm (>=2.19.0,<2.20.0)"] organizations = ["types-aiobotocore-organizations (>=2.19.0,<2.20.0)"] osis = ["types-aiobotocore-osis (>=2.19.0,<2.20.0)"] outposts = ["types-aiobotocore-outposts (>=2.19.0,<2.20.0)"] panorama = ["types-aiobotocore-panorama (>=2.19.0,<2.20.0)"] partnercentral-selling = ["types-aiobotocore-partnercentral-selling (>=2.19.0,<2.20.0)"] payment-cryptography = ["types-aiobotocore-payment-cryptography (>=2.19.0,<2.20.0)"] payment-cryptography-data = ["types-aiobotocore-payment-cryptography-data (>=2.19.0,<2.20.0)"] pca-connector-ad = ["types-aiobotocore-pca-connector-ad (>=2.19.0,<2.20.0)"] pca-connector-scep = ["types-aiobotocore-pca-connector-scep (>=2.19.0,<2.20.0)"] pcs = ["types-aiobotocore-pcs (>=2.19.0,<2.20.0)"] personalize = ["types-aiobotocore-personalize (>=2.19.0,<2.20.0)"] personalize-events = ["types-aiobotocore-personalize-events (>=2.19.0,<2.20.0)"] personalize-runtime = ["types-aiobotocore-personalize-runtime (>=2.19.0,<2.20.0)"] pi = ["types-aiobotocore-pi (>=2.19.0,<2.20.0)"] pinpoint = ["types-aiobotocore-pinpoint (>=2.19.0,<2.20.0)"] pinpoint-email = ["types-aiobotocore-pinpoint-email (>=2.19.0,<2.20.0)"] pinpoint-sms-voice = ["types-aiobotocore-pinpoint-sms-voice (>=2.19.0,<2.20.0)"] pinpoint-sms-voice-v2 = ["types-aiobotocore-pinpoint-sms-voice-v2 (>=2.19.0,<2.20.0)"] pipes = ["types-aiobotocore-pipes (>=2.19.0,<2.20.0)"] polly = ["types-aiobotocore-polly (>=2.19.0,<2.20.0)"] pricing = ["types-aiobotocore-pricing (>=2.19.0,<2.20.0)"] privatenetworks = ["types-aiobotocore-privatenetworks (>=2.19.0,<2.20.0)"] proton = ["types-aiobotocore-proton (>=2.19.0,<2.20.0)"] qapps = ["types-aiobotocore-qapps (>=2.19.0,<2.20.0)"] qbusiness = ["types-aiobotocore-qbusiness (>=2.19.0,<2.20.0)"] qconnect = ["types-aiobotocore-qconnect (>=2.19.0,<2.20.0)"] qldb = ["types-aiobotocore-qldb (>=2.19.0,<2.20.0)"] qldb-session = ["types-aiobotocore-qldb-session (>=2.19.0,<2.20.0)"] quicksight = ["types-aiobotocore-quicksight (>=2.19.0,<2.20.0)"] ram = ["types-aiobotocore-ram (>=2.19.0,<2.20.0)"] rbin = ["types-aiobotocore-rbin (>=2.19.0,<2.20.0)"] rds = ["types-aiobotocore-rds (>=2.19.0,<2.20.0)"] rds-data = ["types-aiobotocore-rds-data (>=2.19.0,<2.20.0)"] redshift = ["types-aiobotocore-redshift (>=2.19.0,<2.20.0)"] redshift-data = ["types-aiobotocore-redshift-data (>=2.19.0,<2.20.0)"] redshift-serverless = ["types-aiobotocore-redshift-serverless (>=2.19.0,<2.20.0)"] rekognition = ["types-aiobotocore-rekognition (>=2.19.0,<2.20.0)"] repostspace = ["types-aiobotocore-repostspace (>=2.19.0,<2.20.0)"] resiliencehub = ["types-aiobotocore-resiliencehub (>=2.19.0,<2.20.0)"] resource-explorer-2 = ["types-aiobotocore-resource-explorer-2 (>=2.19.0,<2.20.0)"] resource-groups = ["types-aiobotocore-resource-groups (>=2.19.0,<2.20.0)"] resourcegroupstaggingapi = ["types-aiobotocore-resourcegroupstaggingapi (>=2.19.0,<2.20.0)"] robomaker = ["types-aiobotocore-robomaker (>=2.19.0,<2.20.0)"] rolesanywhere = ["types-aiobotocore-rolesanywhere (>=2.19.0,<2.20.0)"] route53 = ["types-aiobotocore-route53 (>=2.19.0,<2.20.0)"] route53-recovery-cluster = ["types-aiobotocore-route53-recovery-cluster (>=2.19.0,<2.20.0)"] route53-recovery-control-config = ["types-aiobotocore-route53-recovery-control-config (>=2.19.0,<2.20.0)"] route53-recovery-readiness = ["types-aiobotocore-route53-recovery-readiness (>=2.19.0,<2.20.0)"] route53domains = ["types-aiobotocore-route53domains (>=2.19.0,<2.20.0)"] route53profiles = ["types-aiobotocore-route53profiles (>=2.19.0,<2.20.0)"] route53resolver = ["types-aiobotocore-route53resolver (>=2.19.0,<2.20.0)"] rum = ["types-aiobotocore-rum (>=2.19.0,<2.20.0)"] s3 = ["types-aiobotocore-s3 (>=2.19.0,<2.20.0)"] s3control = ["types-aiobotocore-s3control (>=2.19.0,<2.20.0)"] s3outposts = ["types-aiobotocore-s3outposts (>=2.19.0,<2.20.0)"] s3tables = ["types-aiobotocore-s3tables (>=2.19.0,<2.20.0)"] sagemaker = ["types-aiobotocore-sagemaker (>=2.19.0,<2.20.0)"] sagemaker-a2i-runtime = ["types-aiobotocore-sagemaker-a2i-runtime (>=2.19.0,<2.20.0)"] sagemaker-edge = ["types-aiobotocore-sagemaker-edge (>=2.19.0,<2.20.0)"] sagemaker-featurestore-runtime = ["types-aiobotocore-sagemaker-featurestore-runtime (>=2.19.0,<2.20.0)"] sagemaker-geospatial = ["types-aiobotocore-sagemaker-geospatial (>=2.19.0,<2.20.0)"] sagemaker-metrics = ["types-aiobotocore-sagemaker-metrics (>=2.19.0,<2.20.0)"] sagemaker-runtime = ["types-aiobotocore-sagemaker-runtime (>=2.19.0,<2.20.0)"] savingsplans = ["types-aiobotocore-savingsplans (>=2.19.0,<2.20.0)"] scheduler = ["types-aiobotocore-scheduler (>=2.19.0,<2.20.0)"] schemas = ["types-aiobotocore-schemas (>=2.19.0,<2.20.0)"] sdb = ["types-aiobotocore-sdb (>=2.19.0,<2.20.0)"] secretsmanager = ["types-aiobotocore-secretsmanager (>=2.19.0,<2.20.0)"] security-ir = ["types-aiobotocore-security-ir (>=2.19.0,<2.20.0)"] securityhub = ["types-aiobotocore-securityhub (>=2.19.0,<2.20.0)"] securitylake = ["types-aiobotocore-securitylake (>=2.19.0,<2.20.0)"] serverlessrepo = ["types-aiobotocore-serverlessrepo (>=2.19.0,<2.20.0)"] service-quotas = ["types-aiobotocore-service-quotas (>=2.19.0,<2.20.0)"] servicecatalog = ["types-aiobotocore-servicecatalog (>=2.19.0,<2.20.0)"] servicecatalog-appregistry = ["types-aiobotocore-servicecatalog-appregistry (>=2.19.0,<2.20.0)"] servicediscovery = ["types-aiobotocore-servicediscovery (>=2.19.0,<2.20.0)"] ses = ["types-aiobotocore-ses (>=2.19.0,<2.20.0)"] sesv2 = ["types-aiobotocore-sesv2 (>=2.19.0,<2.20.0)"] shield = ["types-aiobotocore-shield (>=2.19.0,<2.20.0)"] signer = ["types-aiobotocore-signer (>=2.19.0,<2.20.0)"] simspaceweaver = ["types-aiobotocore-simspaceweaver (>=2.19.0,<2.20.0)"] sms = ["types-aiobotocore-sms (>=2.19.0,<2.20.0)"] sms-voice = ["types-aiobotocore-sms-voice (>=2.19.0,<2.20.0)"] snow-device-management = ["types-aiobotocore-snow-device-management (>=2.19.0,<2.20.0)"] snowball = ["types-aiobotocore-snowball (>=2.19.0,<2.20.0)"] sns = ["types-aiobotocore-sns (>=2.19.0,<2.20.0)"] socialmessaging = ["types-aiobotocore-socialmessaging (>=2.19.0,<2.20.0)"] sqs = ["types-aiobotocore-sqs (>=2.19.0,<2.20.0)"] ssm = ["types-aiobotocore-ssm (>=2.19.0,<2.20.0)"] ssm-contacts = ["types-aiobotocore-ssm-contacts (>=2.19.0,<2.20.0)"] ssm-incidents = ["types-aiobotocore-ssm-incidents (>=2.19.0,<2.20.0)"] ssm-quicksetup = ["types-aiobotocore-ssm-quicksetup (>=2.19.0,<2.20.0)"] ssm-sap = ["types-aiobotocore-ssm-sap (>=2.19.0,<2.20.0)"] sso = ["types-aiobotocore-sso (>=2.19.0,<2.20.0)"] sso-admin = ["types-aiobotocore-sso-admin (>=2.19.0,<2.20.0)"] sso-oidc = ["types-aiobotocore-sso-oidc (>=2.19.0,<2.20.0)"] stepfunctions = ["types-aiobotocore-stepfunctions (>=2.19.0,<2.20.0)"] storagegateway = ["types-aiobotocore-storagegateway (>=2.19.0,<2.20.0)"] sts = ["types-aiobotocore-sts (>=2.19.0,<2.20.0)"] supplychain = ["types-aiobotocore-supplychain (>=2.19.0,<2.20.0)"] support = ["types-aiobotocore-support (>=2.19.0,<2.20.0)"] support-app = ["types-aiobotocore-support-app (>=2.19.0,<2.20.0)"] swf = ["types-aiobotocore-swf (>=2.19.0,<2.20.0)"] synthetics = ["types-aiobotocore-synthetics (>=2.19.0,<2.20.0)"] taxsettings = ["types-aiobotocore-taxsettings (>=2.19.0,<2.20.0)"] textract = ["types-aiobotocore-textract (>=2.19.0,<2.20.0)"] timestream-influxdb = ["types-aiobotocore-timestream-influxdb (>=2.19.0,<2.20.0)"] timestream-query = ["types-aiobotocore-timestream-query (>=2.19.0,<2.20.0)"] timestream-write = ["types-aiobotocore-timestream-write (>=2.19.0,<2.20.0)"] tnb = ["types-aiobotocore-tnb (>=2.19.0,<2.20.0)"] transcribe = ["types-aiobotocore-transcribe (>=2.19.0,<2.20.0)"] transfer = ["types-aiobotocore-transfer (>=2.19.0,<2.20.0)"] translate = ["types-aiobotocore-translate (>=2.19.0,<2.20.0)"] trustedadvisor = ["types-aiobotocore-trustedadvisor (>=2.19.0,<2.20.0)"] verifiedpermissions = ["types-aiobotocore-verifiedpermissions (>=2.19.0,<2.20.0)"] voice-id = ["types-aiobotocore-voice-id (>=2.19.0,<2.20.0)"] vpc-lattice = ["types-aiobotocore-vpc-lattice (>=2.19.0,<2.20.0)"] waf = ["types-aiobotocore-waf (>=2.19.0,<2.20.0)"] waf-regional = ["types-aiobotocore-waf-regional (>=2.19.0,<2.20.0)"] wafv2 = ["types-aiobotocore-wafv2 (>=2.19.0,<2.20.0)"] wellarchitected = ["types-aiobotocore-wellarchitected (>=2.19.0,<2.20.0)"] wisdom = ["types-aiobotocore-wisdom (>=2.19.0,<2.20.0)"] workdocs = ["types-aiobotocore-workdocs (>=2.19.0,<2.20.0)"] workmail = ["types-aiobotocore-workmail (>=2.19.0,<2.20.0)"] workmailmessageflow = ["types-aiobotocore-workmailmessageflow (>=2.19.0,<2.20.0)"] workspaces = ["types-aiobotocore-workspaces (>=2.19.0,<2.20.0)"] workspaces-thin-client = ["types-aiobotocore-workspaces-thin-client (>=2.19.0,<2.20.0)"] workspaces-web = ["types-aiobotocore-workspaces-web (>=2.19.0,<2.20.0)"] xray = ["types-aiobotocore-xray (>=2.19.0,<2.20.0)"] [[package]] name = "types-awscrt" version = "0.21.2" description = "Type annotations and code completion for awscrt" optional = false python-versions = "<4.0,>=3.7" files = [ {file = "types_awscrt-0.21.2-py3-none-any.whl", hash = "sha256:0839fe12f0f914d8f7d63ed777c728cb4eccc2d5d79a26e377d12b0604e7bf0e"}, {file = "types_awscrt-0.21.2.tar.gz", hash = "sha256:84a9f4f422ec525c314fdf54c23a1e73edfbcec968560943ca2d41cfae623b38"}, ] [[package]] name = "types-s3transfer" version = "0.10.1" description = "Type annotations and code completion for s3transfer" optional = false python-versions = "<4.0,>=3.8" files = [ {file = "types_s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:49a7c81fa609ac1532f8de3756e64b58afcecad8767933310228002ec7adff74"}, {file = "types_s3transfer-0.10.1.tar.gz", hash = "sha256:02154cce46528287ad76ad1a0153840e0492239a0887e8833466eccf84b98da0"}, ] [[package]] name = "typing-extensions" version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" version = "1.26.19" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, ] [package.extras] brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "urllib3" 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.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "watchdog" version = "4.0.1" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" files = [ {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, ] [package.extras] watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wrapt" version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.6" files = [ {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] [[package]] name = "yarl" version = "1.18.3" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" propcache = ">=0.2.0" [[package]] name = "zipp" version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = ">=3.9.1, <4.0" content-hash = "a4aabd1efcb115befeffd36b026feb84c7b6a1b48f034a5166d759f83d4123ca" IceBotYT-nice-go-438c8c9/poetry.toml000066400000000000000000000000401474551602700172460ustar00rootroot00000000000000[virtualenvs] in-project = true IceBotYT-nice-go-438c8c9/pyproject.toml000066400000000000000000000065271474551602700177630ustar00rootroot00000000000000[tool.poetry] name = "nice-go" version = "1.0.1" description = "Control various Nice access control products" authors = [ "IceBotYT <34712694+IceBotYT@users.noreply.github.com>", ] license = "MIT" readme = "README.md" documentation = "https://IceBotYT.github.io/nice-go" homepage = "https://IceBotYT.github.io/nice-go" repository = "https://github.com/IceBotYT/nice-go" classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Software Development :: Libraries :: Python Modules", "Typing :: Typed", ] packages = [ { include = "nice_go", from = "src" } ] [tool.poetry.dependencies] python = ">=3.9.1, <4.0" aiohttp = "^3.9.5" aiobotocore = "^2.13.1" yarl = "^1.9.4" pycognito = "^2024.5.1" tenacity = "^8.5.0" [tool.poetry.group.dev.dependencies] mkdocstrings = {version = ">=0.23", extras = ["python"]} mkdocs-material = "*" mypy = "*" pre-commit = "*" pymdown-extensions = "*" pytest = "*" pytest-github-actions-annotate-failures = "*" pytest-cov = "*" python-kacl = "*" ruff = ">=0.2.0" pytest-asyncio = "^0.25.0" pytest-aiohttp = "^1.0.5" syrupy = "^4.6.1" sourcery = "^1.21.0" botocore-stubs = "^1.34.150" boto3-stubs = "^1.34.150" types-aiobotocore = "^2.13.1" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.ruff] target-version = "py38" # The lowest supported version [tool.ruff.lint] # By default, enable all the lint rules. # Add to the ignore list below if you don't want some rules. # If you need some ignores for certain modules, see tool.ruff.lint.per-file-ignores below. # For individual ignore cases, prefer inline `# noqa`s within the code. select = ["ALL"] ignore = [ "ANN", # Type hints related, let mypy handle these. "D", # Docstrings related, way too strict to our taste ] [tool.ruff.lint.per-file-ignores] "tests/**" = [ "S101", # "Use of `assert` detected" "ARG", # "Unused function argument". Fixtures are often unused. "S105", # "Possible hardcoded password". ] [tool.ruff.lint.mccabe] max-complexity = 10 [tool.ruff.lint.pep8-naming] classmethod-decorators = [ "classmethod", "pydantic.validator", "pydantic.root_validator", ] [tool.pytest.ini_options] addopts = """\ --cov nice_go \ --cov tests \ --cov-report term-missing \ --no-cov-on-fail \ """ asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" [tool.coverage.report] fail_under = 100 exclude_lines = [ 'if TYPE_CHECKING:', 'pragma: no cover' ] [tool.mypy] # This is the global mypy configuration. # Avoid changing this! strict = true # See all the enabled flags `mypy --help | grep -A 10 'Strict mode'` disallow_any_unimported = true # If you need to ignore something for some specific module, # add overrides for them. Avoid changing the global config! # For example: # [[tool.mypy.overrides]] # module = [ # "my_unpyted_dependency1.*", # "my_unpyted_dependency2.*" # ] # ignore_missing_imports = true # [[tool.mypy.overrides]] # module = [ # "tests/my_thing/test_my_thing", # ] # disallow_untyped_defs = false IceBotYT-nice-go-438c8c9/renovate.json000066400000000000000000000002771474551602700175610ustar00rootroot00000000000000{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:recommended" ], "automerge": true, "automergeType": "pr", "automergeStrategy": "auto" } IceBotYT-nice-go-438c8c9/src/000077500000000000000000000000001474551602700156245ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/src/nice_go/000077500000000000000000000000001474551602700172275ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/src/nice_go/__init__.py000066400000000000000000000011171474551602700213400ustar00rootroot00000000000000"""The Nice G.O. API client for Python. To start, see the [`NiceGOApi`][nice_go.NiceGOApi] class.""" from nice_go._barrier import Barrier, BarrierState, ConnectionState from nice_go._const import BARRIER_STATUS from nice_go._exceptions import ( ApiError, AuthFailedError, NiceGOError, NoAuthError, WebSocketError, ) from nice_go.nice_go_api import NiceGOApi __all__ = [ "BARRIER_STATUS", "Barrier", "NiceGOApi", "ApiError", "AuthFailedError", "NiceGOError", "WebSocketError", "NoAuthError", "BarrierState", "ConnectionState", ] IceBotYT-nice-go-438c8c9/src/nice_go/_authentication_tokens.py000066400000000000000000000017561474551602700243530ustar00rootroot00000000000000"""Holds the tokens retrieved from authentication.""" from __future__ import annotations class AuthenticationTokens: """ A class to handle authentication tokens. Initializes an AuthenticationTokens object with the provided data dictionary. It extracts the 'IdToken' and 'RefreshToken' if available, storing them as attributes. Args: data (dict[str, str]): A dictionary containing authentication tokens. Attributes: id_token (str): The IdToken retrieved from authentication. refresh_token (str | None): The RefreshToken retrieved from authentication. If no RefreshToken is available, it is set to None. """ def __init__(self, data: dict[str, str]) -> None: """Initialize the AuthenticationTokens object.""" self.id_token = data["IdToken"] self.refresh_token: str | None = None try: self.refresh_token = data["RefreshToken"] except KeyError: self.refresh_token = None IceBotYT-nice-go-438c8c9/src/nice_go/_aws_cognito_authenticator.py000066400000000000000000000077221474551602700252160ustar00rootroot00000000000000"""AWS Cognito authentication and identity management. This module provides a class to handle AWS Cognito authentication and identity management. Info: You do not need to use this module directly. It is used by the `nice_go_api` module to authenticate with AWS Cognito. """ import logging import boto3 from aiobotocore.session import get_session from pycognito import AWSSRP # type: ignore[import-untyped] from nice_go._authentication_tokens import AuthenticationTokens _LOGGER = logging.getLogger(__name__) class AwsCognitoAuthenticator: """Handles AWS Cognito authentication and identity management. This class provides methods to authenticate with AWS Cognito and retrieve authentication tokens. It can be used to refresh tokens or to get new tokens by providing a username and password. Args: region_name (str): The AWS region name. client_id (str): The AWS Cognito client ID. pool_id (str): The AWS Cognito pool ID. identity_pool_id (str): The AWS Cognito identity pool ID. Attributes: region_name (str): The AWS region name. identity_pool_id (str): The AWS Cognito identity pool ID. client_id (str): The AWS Cognito client ID. pool_id (str): The AWS Cognito pool ID. session (botocore.session.Session): The botocore session object. """ def __init__( self, region_name: str, client_id: str, pool_id: str, identity_pool_id: str, ) -> None: """Initialize the AwsCognitoAuthenticator object.""" self.region_name = region_name self.identity_pool_id = identity_pool_id self.client_id = client_id self.pool_id = pool_id self.session = get_session() def refresh_token(self, refresh_token: str) -> AuthenticationTokens: """Regenerates the token by providing a refresh token. Args: refresh_token (str): The refresh token. Returns: The new authentication tokens. """ _LOGGER.debug("Refreshing token") cognito_identity_provider = boto3.client("cognito-idp", self.region_name) resp = cognito_identity_provider.initiate_auth( AuthFlow="REFRESH_TOKEN_AUTH", AuthParameters={ "REFRESH_TOKEN": refresh_token, }, ClientId=self.client_id, ) _LOGGER.debug("Token refreshed") return AuthenticationTokens(resp["AuthenticationResult"]) def get_new_token(self, username: str, password: str) -> AuthenticationTokens: """Gets the initial token by providing username and password. Args: username (str): The username. password (str): The password. Returns: The new authentication tokens. """ _LOGGER.debug("Getting new token") cognito_identity_provider = boto3.client("cognito-idp", self.region_name) # Start the authentication flow aws_srp = AWSSRP( username=username, password=password, pool_id=self.pool_id, client_id=self.client_id, client=cognito_identity_provider, ) _LOGGER.debug("Initiating auth") auth_params = aws_srp.get_auth_params() resp = cognito_identity_provider.initiate_auth( AuthFlow="USER_SRP_AUTH", AuthParameters=auth_params, ClientId=self.client_id, ) _LOGGER.debug("Auth initiated, responding to challenge") challenge_response = aws_srp.process_challenge( resp["ChallengeParameters"], auth_params, ) # Respond to PASSWORD_VERIFIER resp = cognito_identity_provider.respond_to_auth_challenge( ClientId=self.client_id, ChallengeName="PASSWORD_VERIFIER", ChallengeResponses=challenge_response, ) _LOGGER.debug("Token received") return AuthenticationTokens(resp["AuthenticationResult"]) IceBotYT-nice-go-438c8c9/src/nice_go/_barrier.py000066400000000000000000000101371474551602700213700ustar00rootroot00000000000000# sourcery skip: snake-case-variable-declarations """Module containing classes for barriers. This module contains classes for barriers and their states. The Barrier class provides methods to interact with the barrier, such as opening and closing it, and turning the light on and off. Classes: ConnectionState: Represents the connection state of a barrier. BarrierState: Represents the state of a barrier. Barrier: Represents a barrier. """ # ruff: noqa: SLF001 from __future__ import annotations from dataclasses import dataclass from typing import TYPE_CHECKING, Any if TYPE_CHECKING: # This is a forward reference to avoid circular imports from datetime import datetime from nice_go.nice_go_api import NiceGOApi @dataclass class ConnectionState: """Class representing the connection state of a barrier. Attributes: connected (bool): A boolean indicating whether the barrier is connected. updatedTimestamp (datetime): The timestamp of the last update. """ connected: bool updatedTimestamp: datetime # noqa: N815 @dataclass class BarrierState: """Class representing the state of a barrier. Attributes: deviceId (str): The device ID of the barrier. reported (dict[str, Any]): The reported state of the barrier. timestamp (str): The timestamp of the last update. version (str): The version of the barrier. connectionState (ConnectionState | None): The connection state of the barrier. """ deviceId: str # noqa: N815 reported: dict[str, Any] timestamp: str version: str connectionState: ConnectionState | None # noqa: N815 @dataclass class Barrier: """Class representing a barrier. Attributes: id (str): The ID of the barrier. type (str): The type of the barrier. controlLevel (str): The control level of the barrier. attr (list[dict[str, str]]): A list of attributes of the barrier. state (BarrierState): The state of the barrier. api (NiceGOApi): The NiceGO API object. Methods: open: Open the barrier. close: Close the barrier. light_on: Turn on the light of the barrier. light_off: Turn off the light of the barrier. get_attr: Get the value of an attribute. """ id: str type: str controlLevel: str # noqa: N815 attr: list[dict[str, str]] state: BarrierState api: NiceGOApi async def open(self) -> bool: """Open the barrier. Returns: A boolean indicating whether the command was successful. """ return await self.api.open_barrier(self.id) async def close(self) -> bool: """Close the barrier. Returns: A boolean indicating whether the command was successful. """ return await self.api.close_barrier(self.id) async def light_on(self) -> bool: """Turn on the light of the barrier. Returns: A boolean indicating whether the command was successful. """ return await self.api.light_on(self.id) async def light_off(self) -> bool: """Turn off the light of the barrier. Returns: A boolean indicating whether the command was successful. """ return await self.api.light_off(self.id) async def get_attr(self, key: str) -> str: """Get the value of an attribute. Args: key (str): The key of the attribute. Returns: The value of the attribute. Raises: KeyError: If the attribute with the given key is not found. """ attr = next((attr for attr in self.attr if attr["key"] == key), None) if attr is None: msg = f"Attribute with key {key} not found." raise KeyError(msg) return attr["value"] async def vacation_mode_on(self) -> None: """Turn on vacation mode for the barrier.""" await self.api.vacation_mode_on(self.id) async def vacation_mode_off(self) -> None: """Turn off vacation mode for the barrier.""" await self.api.vacation_mode_off(self.id) IceBotYT-nice-go-438c8c9/src/nice_go/_const.py000066400000000000000000000120171474551602700210670ustar00rootroot00000000000000"""Constants for Nice G.O. API.""" import json ENDPOINTS_URL = "https://prod.api.nortek-smartcontrol.com/endpoints" BARRIER_STATUS = ["STATIONARY", "OPENING", "CLOSING"] REQUEST_TEMPLATES = { "get_all_barriers": { "operationName": "devicesListAll", "variables": {"nextToken": None}, "query": "query devicesListAll($nextToken: String) {\n devicesListAll(nextToken: $nextToken) {\n devices {\n ...deviceFields\n __typename\n }\n nextToken\n __typename\n }\n}\n\nfragment deviceFields on Device {\n id\n type\n controlLevel\n attr {\n key\n value\n __typename\n }\n state {\n ...deviceStateFields\n __typename\n }\n groupIds\n __typename\n}\n\nfragment deviceStateFields on DeviceState {\n deviceId\n desired\n reported\n timestamp\n version\n connectionState {\n connected\n updatedTimestamp\n __typename\n }\n version\n __typename\n}\n", # noqa: E501 }, "open_barrier": { "operationName": "devicesControl", "variables": { "deviceId": "$barrier_id", "payload": {"target": "B", "action": 1}, }, "query": "mutation devicesControl($deviceId: ID!, $payload: ControlPayload!) {\n devicesControl(deviceId: $deviceId, payload: $payload)\n}\n", # noqa: E501 }, "close_barrier": { "operationName": "devicesControl", "variables": { "deviceId": "$barrier_id", "payload": {"target": "B", "action": 0}, }, "query": "mutation devicesControl($deviceId: ID!, $payload: ControlPayload!) {\n devicesControl(deviceId: $deviceId, payload: $payload)\n}\n", # noqa: E501 }, "light_on": { "operationName": "devicesControl", "variables": { "deviceId": "$barrier_id", "payload": {"target": "L", "action": 1}, }, "query": "mutation devicesControl($deviceId: ID!, $payload: ControlPayload!) {\n devicesControl(deviceId: $deviceId, payload: $payload)\n}\n", # noqa: E501 }, "light_off": { "operationName": "devicesControl", "variables": { "deviceId": "$barrier_id", "payload": {"target": "L", "action": 0}, }, "query": "mutation devicesControl($deviceId: ID!, $payload: ControlPayload!) {\n devicesControl(deviceId: $deviceId, payload: $payload)\n}\n", # noqa: E501 }, "subscribe": { "id": "$uuid", "payload": { "data": json.dumps( { "query": "subscription devicesStatesUpdateFeed($receiver: ID!) {\n devicesStatesUpdateFeed(receiver: $receiver) {\n receiver\n item {\n ...deviceStateFields\n __typename\n }\n __typename\n }\n}\n\nfragment deviceStateFields on DeviceState {\n deviceId\n desired\n reported\n timestamp\n version\n connectionState {\n connected\n updatedTimestamp\n __typename\n }\n version\n __typename\n}\n", # noqa: E501 "variables": {"receiver": "$receiver_id"}, }, ), "extensions": { "authorization": { "Authorization": "$id_token", "host": "$host", "x-amz-user-agent": "aws-amplify/2.0.8 js", }, }, }, "type": "start", }, "unsubscribe": {"id": "$id", "type": "stop"}, "vacation_mode_on": { "operationName": "devicesStatesUpdate", "variables": { "deviceId": "$barrier_id", "state": '{"vcnMode": true}', }, "query": "mutation devicesStatesUpdate($deviceId: ID!, $state: AWSJSON!) {\n devicesStatesUpdate(deviceId: $deviceId, state: $state)\n}\n", # noqa: E501 }, "vacation_mode_off": { "operationName": "devicesStatesUpdate", "variables": { "deviceId": "$barrier_id", "state": '{"vcnMode": false}', }, "query": "mutation devicesStatesUpdate($deviceId: ID!, $state: AWSJSON!) {\n devicesStatesUpdate(deviceId: $deviceId, state: $state)\n}\n", # noqa: E501 }, "event_subscribe": { "id": "$uuid", "payload": { "data": json.dumps( { "query": "subscription eventsFeed($receiver: ID!) {\n eventsFeed(receiver: $receiver) {\n receiver\n item {\n ...eventFields\n __typename\n }\n __typename\n }\n}\n\nfragment eventFields on Event {\n deviceId\n timestamp\n eventId\n organizationId\n updatedTimestamp\n type\n eventState\n severity\n sensorName\n sensorValue\n metadata\n __typename\n}\n", # noqa: E501 "variables": { "receiver": "$receiver_id", }, }, ), "extensions": { "authorization": { "Authorization": "$id_token", "host": "$host", "x-amz-user-agent": "aws-amplify/2.0.8 react-native", }, }, }, "type": "start", }, } IceBotYT-nice-go-438c8c9/src/nice_go/_exceptions.py000066400000000000000000000007421474551602700221240ustar00rootroot00000000000000"""Exceptions for Nice G.O. API.""" class NiceGOError(Exception): """Base exception for Nice G.O. API.""" class NoAuthError(NiceGOError): """Not authenticated exception.""" class ApiError(NiceGOError): """API error.""" class AuthFailedError(NiceGOError): """Authentication failed. Check your credentials.""" class WebSocketError(NiceGOError): """WebSocket error.""" class ReconnectWebSocketError(WebSocketError): """Reconnect WebSocket error.""" IceBotYT-nice-go-438c8c9/src/nice_go/_util.py000066400000000000000000000013441474551602700207170ustar00rootroot00000000000000"""Utilities for the nice_go package.""" from __future__ import annotations import json from typing import Any from nice_go._const import REQUEST_TEMPLATES async def get_request_template( request_name: str, arguments: dict[str, str] | None, ) -> Any: """Get a request template with optional arguments. Args: request_name: The name of the request template. arguments: Optional arguments to replace in the template. Returns: The request template with optional arguments. """ template = json.dumps(REQUEST_TEMPLATES[request_name]) if arguments: for key, value in arguments.items(): template = template.replace(f"${key}", value) return json.loads(template) IceBotYT-nice-go-438c8c9/src/nice_go/_ws_client.py000066400000000000000000000372641474551602700217430ustar00rootroot00000000000000"""This module contains the WebSocketClient class, which is used to interact with the WebSocket server. Classes: WebSocketClient: A class that represents a WebSocket client. """ from __future__ import annotations import asyncio import base64 import json import logging import uuid from typing import TYPE_CHECKING, Any, Callable, NamedTuple import aiohttp from nice_go._exceptions import ReconnectWebSocketError, WebSocketError from nice_go._util import get_request_template if TYPE_CHECKING: import yarl _LOGGER = logging.getLogger(__name__) class EventListener(NamedTuple): """A class representing an event listener.""" predicate: Callable[[dict[str, Any]], bool] | None event: str result: Callable[[dict[str, Any]], Any] | None future: asyncio.Future[Any] class WebSocketClient: """A class that represents a WebSocket client. Attributes: ws (aiohttp.ClientWebSocketResponse | None): The WebSocket connection. _dispatch_listeners (list[EventListener]): A list of event listeners. _subscriptions (list[str]): A list of subscription IDs. """ def __init__(self, client_session: aiohttp.ClientSession) -> None: """Initialize the WebSocketClient.""" self.ws: aiohttp.ClientWebSocketResponse | None = None self._dispatch_listeners: list[EventListener] = [] self._subscriptions: list[str] = [] self.client_session = client_session self.reconnecting = False self._timeout_task: asyncio.Task[None] | None = None def _redact_message(self, message: str | dict[str, Any]) -> Any: """Redact sensitive information from a message. Args: message: The message to redact. Returns: The redacted message. """ if isinstance(message, dict): return json.loads(json.dumps(message).replace(self.id_token, "")) return message.replace(self.id_token, "") async def _watch_keepalive(self) -> None: """A task that handles the timeout for the WebSocket connection. Raises: WebSocketError: If the WebSocket connection is closed. """ if self.ws is None or self.ws.closed: msg = "WebSocket connection is closed" raise WebSocketError(msg) await asyncio.sleep(self._timeout / 1000) _LOGGER.debug("WebSocket keepalive timeout reached, reconnecting") await self._reconnect() async def _reconnect(self) -> None: """Reconnect to the WebSocket server. Raises: WebSocketError: If the WebSocket connection is closed or an error occurs. """ if self.ws is None or self.ws.closed: msg = "WebSocket connection is closed" raise WebSocketError(msg) self.reconnecting = True _LOGGER.debug("Reconnecting to WebSocket server") await self.close() raise ReconnectWebSocketError async def connect( self, id_token: str, endpoint: yarl.URL, api_type: str, dispatch: Callable[[str, dict[str, Any] | None], None], host: str | None = None, ) -> None: """Connect to the WebSocket server. Args: client_session: The aiohttp ClientSession. id_token: The IdToken retrieved from authentication. endpoint: The endpoint URL. dispatch: The dispatch function. host: The host URL. Raises: ValueError: If host is not provided. WebSocketError: If the WebSocket connection is closed or an error occurs. """ if host is None: msg = "host must be provided" raise ValueError(msg) self._dispatch = dispatch self.id_token = id_token self.host = host self.api_type = api_type # Should be "device" or "events" self._endpoint = endpoint raw_header = { "Authorization": id_token, "host": host, } # Base64 encode the header header = base64.b64encode(json.dumps(raw_header).encode()).decode() # Construct the URL url = endpoint.with_query({"header": header, "payload": "e30="}) # URL contains sensitive information, so we don't want to log it _LOGGER.debug("Connecting to WebSocket server at %s", endpoint) headers = {"sec-websocket-protocol": "graphql-ws"} self.ws = await self.client_session.ws_connect(url, headers=headers) await self.init() async def init(self) -> None: """Initialize the WebSocket connection. Raises: WebSocketError: If the WebSocket connection is closed or an error occurs. """ if self.ws is None or self.ws.closed: msg = "WebSocket connection is closed" raise WebSocketError(msg) _LOGGER.debug("Initializing WebSocket connection") await self.send({"type": "connection_init"}) try: _LOGGER.debug("Waiting for connection_ack") message = await self.ws.receive(timeout=10) data = json.loads(message.data) _LOGGER.debug("Received message: %s", data) if data["type"] != "connection_ack": msg = f'Expected connection_ack, but received {data["type"]}' raise WebSocketError( msg, ) except asyncio.TimeoutError as e: msg = "Connection to the websocket server timed out" raise WebSocketError(msg) from e _LOGGER.debug("Received connection_ack, WebSocket connection established") self._timeout = data.get("payload", {}).get("timeout", 300000) self._timeout_task = asyncio.create_task(self._watch_keepalive()) self._dispatch(f"{self.api_type}_connected", None) async def send(self, message: str | dict[str, Any]) -> None: """Send a message to the WebSocket server. Args: message: The message to send. Raises: WebSocketError: If the WebSocket connection is closed """ if self.ws is None or self.ws.closed: msg = "WebSocket connection is closed" raise WebSocketError(msg) redacted_message = self._redact_message(message) _LOGGER.debug("Sending message: %s", redacted_message) if isinstance(message, dict): await self.ws.send_json(message) else: await self.ws.send_str(message) async def close(self) -> None: """Close the WebSocket connection. Raises: WebSocketError: If the WebSocket connection is closed """ if self.ws is None or self.ws.closed: return _LOGGER.debug("Closing WebSocket client") # Unsubscribe from all subscriptions for subscription_id in self._subscriptions: _LOGGER.debug("Unsubscribing from subscription %s", subscription_id) await self.unsubscribe(subscription_id) if self._timeout_task is not None and not self._timeout_task.done(): _LOGGER.debug("Cancelling keepalive task") # Cancel the keepalive task self._timeout_task.cancel() try: await self._timeout_task except asyncio.CancelledError: _LOGGER.debug("Keepalive task was cancelled") except Exception: _LOGGER.exception("Exception occurred while cancelling keepalive task") _LOGGER.debug("Closing WebSocket connection") await self.ws.close() _LOGGER.debug("WebSocket connection closed") async def poll(self) -> None: """Poll the WebSocket connection for messages. Raises: WebSocketError: If the WebSocket connection is closed or an error occurs. """ if self.ws is None or self.ws.closed: error_msg = "WebSocket connection is closed" raise WebSocketError(error_msg) msg = await self.ws.receive(timeout=300.0) if msg.type == aiohttp.WSMsgType.TEXT: await self.received_message(msg.data) elif msg.type == aiohttp.WSMsgType.ERROR: error_msg = f"WebSocket connection closed with error {msg}" raise WebSocketError(error_msg) elif msg.type in ( aiohttp.WSMsgType.CLOSE, aiohttp.WSMsgType.CLOSING, aiohttp.WSMsgType.CLOSED, ): error_msg = "WebSocket connection closed" if self._timeout_task is not None and not self._timeout_task.done(): # Cancel the keepalive task self._timeout_task.cancel() if self.reconnecting: # Don't raise an error, just return return raise WebSocketError(error_msg) def load_message(self, message: str) -> Any: """Load a message from a string. Args: message: The message to load. Returns: The parsed message. Raises: WebSocketError: If the message is not valid JSON. """ try: parsed_message = json.loads(message) except json.JSONDecodeError as e: msg = f"Received invalid JSON message: {message}" raise WebSocketError(msg) from e return parsed_message def dispatch_message(self, message: dict[str, Any]) -> None: """Dispatch a message to the appropriate handler. Args: message: The message to dispatch. Raises: WebSocketError: If the message type is not valid. """ if message["type"] == "data": if self.api_type == "events" and message["payload"]["data"]["eventsFeed"][ "item" ]["eventId"] == ("event-error-barrier-obstructed"): self._dispatch( "barrier_obstructed", message["payload"]["data"]["eventsFeed"]["item"], ) if self.api_type == "events": return self._dispatch(message["type"], message["payload"]) elif message["type"] == "error": msg = f"Received error message: {message}" raise WebSocketError(msg) elif message["type"] == "ka": _LOGGER.debug("Received keepalive message") if self._timeout_task is not None and not self._timeout_task.done(): # Restart the keepalive task self._timeout_task.cancel() self._timeout_task = asyncio.create_task(self._watch_keepalive()) else: _LOGGER.debug("Received message of type %s: %s", message["type"], message) async def received_message(self, message: str) -> None: """Handle a received message. Args: message: The message to handle. Raises: WebSocketError: If the message does not contain 'type """ _LOGGER.debug("Received message: %s", message) parsed_message = self.load_message(message) if "type" not in message: msg = f"Received message does not contain 'type', got {message}" raise WebSocketError(msg) _LOGGER.debug("Dispatching message") self.dispatch_message(parsed_message) removed = [] for index, entry in enumerate(self._dispatch_listeners): if entry.event != parsed_message["type"]: continue future = entry.future if future.cancelled(): removed.append(index) continue if entry.predicate is not None: try: valid = entry.predicate(parsed_message) except Exception as e: # noqa: BLE001 future.set_exception(e) removed.append(index) continue else: valid = True if valid: ret = ( parsed_message if entry.result is None else entry.result(parsed_message) ) future.set_result(ret) removed.append(index) _LOGGER.debug("Event %s occurred, no longer waiting", entry.event) for index in reversed(removed): del self._dispatch_listeners[index] def wait_for( self, event: str, predicate: Callable[[dict[str, Any]], bool] | None = None, result: Callable[[dict[str, Any]], Any] | None = None, ) -> asyncio.Future[Any]: """Wait for an event to occur. Args: event: The event to wait for. predicate: A predicate function. result: A result function. Returns: A future that resolves when the event occurs. Raises: WebSocketError: If the event is not valid. """ _LOGGER.debug("Waiting for event %s", event) future: asyncio.Future[dict[str, Any]] = asyncio.Future() self._dispatch_listeners.append(EventListener(predicate, event, result, future)) return future async def subscribe(self, receiver: str) -> str: """Subscribe to the WebSocket server. Args: receiver: The receiver ID. Typically, it's the organization ID, which can be found in the attributes of any barrier. (Don't ask me why.) Returns: The subscription ID. Raises: WebSocketError: If the subscription times out. """ subscription_id = str(uuid.uuid4()) payload = await get_request_template( "subscribe" if self.api_type == "device" else "event_subscribe", { "receiver_id": receiver, "uuid": subscription_id, "id_token": self.id_token, "host": self.host, }, ) _LOGGER.debug( "Subscribing to receiver %s with subscription ID %s", receiver, subscription_id, ) await self.send(payload) def _predicate(message: dict[str, Any]) -> bool: valid: bool = ( message["type"] == "start_ack" and message["id"] == subscription_id ) _LOGGER.debug("Checking if start_ack is valid: %s", valid) return valid try: await asyncio.wait_for(self.wait_for("start_ack", _predicate), timeout=10) except asyncio.TimeoutError as e: msg = "Subscription to the websocket server timed out" raise WebSocketError(msg) from e _LOGGER.debug("Subscription successful") self._subscriptions.append(subscription_id) _LOGGER.debug("Subscription added") return subscription_id async def unsubscribe(self, subscription_id: str) -> None: """Unsubscribe from the WebSocket server. Args: subscription_id: The subscription ID. Raises: WebSocketError: If the WebSocket connection is closed """ try: self._subscriptions.remove(subscription_id) except ValueError: _LOGGER.debug("Subscription %s not found", subscription_id) return finally: _LOGGER.debug("Removing subscription %s", subscription_id) payload = await get_request_template("unsubscribe", {"id": subscription_id}) _LOGGER.debug("Unsubscribing from subscription %s", subscription_id) await self.send(payload) _LOGGER.debug("Unsubscribed from subscription %s", subscription_id) @property def closed(self) -> bool: """Check if the WebSocket connection is closed. Returns: True if the WebSocket connection is closed, False otherwise. """ return True if self.ws is None else self.ws.closed IceBotYT-nice-go-438c8c9/src/nice_go/nice_go_api.py000066400000000000000000000716461474551602700220530ustar00rootroot00000000000000# sourcery skip: avoid-single-character-names-variables """Parses data from the Nice G.O. API. This module provides a class to interact with the Nice G.O. API. It allows the user to authenticate, connect to the WebSocket API, and interact with barriers. Classes: NiceGOApi: A class to interact with the Nice G.O. API. """ from __future__ import annotations import asyncio import contextlib import json import logging from typing import Any, Callable, Coroutine, TypeVar import aiohttp import botocore import yarl from tenacity import ( RetryCallState, before_sleep_log, retry, retry_base, retry_if_exception_type, wait_random_exponential, ) from nice_go._aws_cognito_authenticator import AwsCognitoAuthenticator from nice_go._barrier import Barrier, BarrierState, ConnectionState from nice_go._const import ENDPOINTS_URL from nice_go._exceptions import ( ApiError, AuthFailedError, NoAuthError, ReconnectWebSocketError, WebSocketError, ) from nice_go._util import get_request_template from nice_go._ws_client import WebSocketClient T = TypeVar("T") Coro = Coroutine[Any, Any, T] CoroT = TypeVar("CoroT", bound=Callable[..., Coro[Any]]) _LOGGER = logging.getLogger(__name__) class _RetryIfReconnect(retry_base): """Retries only if reconnect is set to True.""" def __call__(self, retry_state: RetryCallState) -> Any: """Check if the retry should be retried.""" return retry_state.kwargs.get("reconnect", True) class NiceGOApi: """A class to interact with the Nice G.O. API. This class provides methods to authenticate, connect to the WebSocket API, and interact with barriers. Attributes: id_token (str | None): The ID token. Functions: event: Decorator to add an event listener. authenticate_refresh: Authenticate using a refresh token. authenticate: Authenticate using username and password. connect: Connect to the WebSocket API. subscribe: Subscribe to a receiver. unsubscribe: Unsubscribe from a receiver. close: Close the connection. get_all_barriers: Get all barriers. """ def __init__(self) -> None: """Initialize the NiceGOApi object.""" self.id_token: str | None = None self._closing_task: asyncio.Task[None] | None = None self._device_ws: WebSocketClient | None = None self._endpoints: dict[str, Any] | None = None self._session: aiohttp.ClientSession | None = None self._event_tasks: set[asyncio.Task[None]] = set() self._events_ws: WebSocketClient | None = None self._device_connected: bool = False self._events_connected: bool = False self._events: dict[str, list[Callable[..., Coroutine[Any, Any, Any]]]] = {} self.event(self.on_device_connected) self.event(self.on_events_connected) async def on_device_connected(self) -> None: """Handle the device connected event.""" self._device_connected = True if self._device_connected and self._events_connected: # Only dispatch when both feeds are connected self._dispatch("connected") async def on_events_connected(self) -> None: """Handle the events connected event.""" self._events_connected = True if self._device_connected and self._events_connected: # Only dispatch when both feeds are connected self._dispatch("connected") def event(self, coro: CoroT) -> CoroT: """Decorator to add an event listener. Just a wrapper around `listen`. Info: This can only decorate coroutine functions. Args: coro (CoroT): The coroutine function to decorate. Examples: You can use this decorator to add event listeners to the API object. Some events include but are not limited to: - `connection_lost`: Triggered when the connection to the WebSocket API is lost. - `connected`: Triggered when the connection to the WebSocket API is established. - `data`: Triggered when data is received from an active subscription. See `subscribe`. >>> @api.event ... async def on_data( ... data: dict[str, Any] | None = None, ... ) -> None: ... if data is not None: ... print(data) """ self.listen(coro.__name__, coro) return coro def listen(self, event_name: str, coro: CoroT) -> Callable[[], None]: """Add an event listener. Args: event_name (str): The name of the event. coro (CoroT): The coroutine to run when the event is dispatched. Returns: A function to remove the event listener. Examples: You can use this method to add event listeners to the API object. Some events include but are not limited to: - `connection_lost`: Triggered when the connection to the WebSocket API is lost. - `connected`: Triggered when the connection to the WebSocket API is established. - `data`: Triggered when data is received from an active subscription. See `subscribe`. >>> def on_data(data: dict[str, Any] | None = None) -> None: ... if data is not None: ... print(data) ... >>> remove_listener = api.listen("data", on_data) """ if not asyncio.iscoroutinefunction(coro): msg = "The decorated function must be a coroutine" raise TypeError(msg) _LOGGER.debug("Adding event listener %s", coro.__name__) self._events.setdefault(event_name, []).append(coro) return lambda: self._events[event_name].remove(coro) async def _run_event( self, coro: Callable[..., Coroutine[Any, Any, Any]], event_name: str, data: dict[str, Any] | None = None, ) -> None: """Run an event coroutine. For internal use only. Args: coro (Callable[..., Coroutine[Any, Any, Any]]): The coroutine to run. event_name (str): The name of the event. data (dict[str, Any] | None): The data to pass to the event coroutine. """ kwargs = {} if data is not None: kwargs["data"] = data try: await coro(**kwargs) except asyncio.CancelledError: pass except Exception: _LOGGER.exception("Error while handling event %s", event_name) def _schedule_event( self, coro: Callable[..., Coroutine[Any, Any, Any]], event_name: str, data: dict[str, Any] | None, ) -> None: """Schedule an event to be dispatched. For internal use only. Args: coro (Callable[..., Coroutine[Any, Any, Any]]): The coroutine to schedule. event_name (str): The name of the event. data (dict[str, Any] | None): The data to pass to the event coroutine. """ wrapped = self._run_event(coro, event_name, data) task = asyncio.create_task(wrapped, name=f"NiceGO: {event_name}") self._event_tasks.add(task) # See RUF006 task.add_done_callback(self._event_tasks.discard) def _dispatch(self, event: str, data: dict[str, Any] | None = None) -> None: """Dispatch an event to listeners. For internal use only. Args: event (str): The name of the event. data (dict[str, Any] | None): The data to pass to the event coroutine. """ method = f"on_{event}" coros = self._events.get(method, []) if not coros: _LOGGER.debug("No listeners for event %s", event) return _LOGGER.debug("Dispatching event %s", event) for coro in coros: self._schedule_event(coro, method, data) async def authenticate_refresh( self, refresh_token: str, session: aiohttp.ClientSession, ) -> None: """Authenticate using a previous obtained refresh token. Args: refresh_token (str): The refresh token. session (aiohttp.ClientSession): The client session to use. Raises: AuthFailedError: If the authentication fails. ApiError: If an API error occurs. """ self._session = session await self.__authenticate(None, None, refresh_token) async def authenticate( self, user_name: str, password: str, session: aiohttp.ClientSession, ) -> str | None: """Authenticate using username and password. Args: user_name (str): The username. password (str): The password. session (aiohttp.ClientSession): The client session to use. Returns: The refresh token. Raises: AuthFailedError: If the authentication fails. ApiError: If an API error occurs. """ self._session = session return await self.__authenticate(user_name, password, None) async def __authenticate( self, user_name: str | None, password: str | None, refresh_token: str | None, ) -> str | None: """Authenticate using username and password or refresh token. Args: user_name (str | None): The username. password (str | None): The password. refresh_token (str | None): The refresh token. Returns: The refresh token. Raises: AuthFailedError: If the authentication fails. ApiError: If an API error occurs. """ try: _LOGGER.debug("Authenticating") if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) # Get the endpoints data = await self._session.get(ENDPOINTS_URL) endpoints = await data.json() self._endpoints = endpoints["endpoints"] if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) authenticator = AwsCognitoAuthenticator( self._endpoints["Config"]["Region"], self._endpoints["Config"]["ClientId"], self._endpoints["Config"]["UserPoolId"], self._endpoints["Config"]["IdentityPoolId"], ) if user_name and password: token = await asyncio.to_thread( authenticator.get_new_token, user_name, password, ) elif refresh_token: token = await asyncio.to_thread( authenticator.refresh_token, refresh_token, ) _LOGGER.debug("Authenticated") self.id_token = token.id_token except botocore.exceptions.ClientError as e: _LOGGER.exception("Exception while authenticating") if e.response["Error"]["Code"] == "NotAuthorizedException": raise AuthFailedError from e raise ApiError from e else: return token.refresh_token @property def closed(self) -> bool: """Check if the connection is closed.""" return self._closing_task is not None async def _poll_device_ws(self) -> None: """Continuously polls the device WebSocket to maintain an active connection. This function will repeatedly call the poll method on the WebSocket if it is initialized. Returns: None """ if self._device_ws is None: return while True: await self._device_ws.poll() async def _poll_events_ws(self) -> None: """Continuously polls the device WebSocket to maintain an active connection. This function will repeatedly call the poll method on the WebSocket if it is initialized. Returns: None """ if self._events_ws is None: return while True: await self._events_ws.poll() async def _check_response_errors(self, response: dict[str, Any]) -> None: """Checks a GraphQL response for errors, namely for expired tokens. Args: response (dict[str, Any]): The response to check. Raises: AuthFailedError: If the ID token is expired. ApiError: If an API error occurs. Returns: None """ if errors := response.get("errors"): error = errors[0] if error["errorType"] == "UnauthorizedException": raise AuthFailedError(error) raise ApiError(error) @retry( wait=wait_random_exponential(multiplier=1, min=1, max=10), retry=_RetryIfReconnect() & retry_if_exception_type( ( OSError, WebSocketError, aiohttp.ClientError, asyncio.TimeoutError, ReconnectWebSocketError, ), ), reraise=True, before_sleep=before_sleep_log(_LOGGER, logging.DEBUG), ) async def connect(self, *, reconnect: bool = True) -> None: """Connect to the WebSocket API. Warning: No events will be dispatched until you subscribe to a receiver. Typically, you should pass the `organization` attribute of a barrier object to the `subscribe` method to start receiving data. Don't ask me why `organization` specifically, I don't know either. Danger: This method will block the event loop until the connection is closed. If you want to run this method in the background, you should run it in a separate thread or process. Args: reconnect (bool): Whether to reconnect if the connection is lost. Raises: NoAuthError: If the ID token is not available. ApiError: If an API error occurs. WebSocketError: If an error occurs while connecting. """ try: if self.id_token is None: raise NoAuthError if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) self._reconnect = reconnect device_url = self._endpoints["GraphQL"]["device"]["wss"] events_url = self._endpoints["GraphQL"]["events"]["wss"] _LOGGER.debug("Connecting to WebSocket API %s", device_url) self._device_ws = WebSocketClient(client_session=self._session) await self._device_ws.connect( self.id_token, yarl.URL(device_url), "device", self._dispatch, yarl.URL(self._endpoints["GraphQL"]["device"]["https"]).host, ) self._events_ws = WebSocketClient(client_session=self._session) await self._events_ws.connect( self.id_token, yarl.URL(events_url), "events", self._dispatch, yarl.URL(self._endpoints["GraphQL"]["events"]["https"]).host, ) _LOGGER.debug("Connected to WebSocket API") device_task = asyncio.create_task(self._poll_device_ws()) events_task = asyncio.create_task(self._poll_events_ws()) with contextlib.suppress(asyncio.CancelledError): done, pending = await asyncio.wait( [device_task, events_task], return_when=asyncio.FIRST_EXCEPTION, ) with contextlib.suppress(UnboundLocalError): if exceptions := [ task.exception() for task in done if task.exception() ]: for p in pending: p.cancel() # Make sure both WS are closed await self._events_ws.close() await self._device_ws.close() raise exceptions[0] # type: ignore[misc] except ( OSError, WebSocketError, aiohttp.ClientError, asyncio.TimeoutError, ReconnectWebSocketError, ) as e: self._dispatch("connection_lost", {"exception": e}) self._device_connected = False self._events_connected = False if not reconnect: _LOGGER.debug("Connection lost, not reconnecting") await self.close() raise if self.closed: return _LOGGER.debug("Connection lost, retrying...") # Raising triggers retry raise async def subscribe(self, receiver: str) -> list[str]: """Subscribe to a receiver. Args: receiver (str): The receiver to subscribe to. Returns: The subscription IDs. You can pass this into the `unsubscribe` method to unsubscribe from the receiver. Raises: WebSocketError: If no WebSocket connection is available. """ if self._device_ws is None: msg = "No WebSocket connection" raise WebSocketError(msg) if self._events_ws is None: msg = "No WebSocket connection" raise WebSocketError(msg) _LOGGER.debug("Subscribing to receiver %s", receiver) return [ await self._device_ws.subscribe(receiver), await self._events_ws.subscribe(receiver), ] async def unsubscribe(self, subscription_id: str) -> None: """Unsubscribe from a receiver. Args: subscription_id (str): The subscription ID to unsubscribe from. Raises: WebSocketError: If no WebSocket connection is available """ if self._device_ws is None: msg = "No WebSocket connection" raise WebSocketError(msg) if self._events_ws is None: msg = "No WebSocket connection" raise WebSocketError(msg) _LOGGER.debug("Unsubscribing from subscription %s", subscription_id) await self._device_ws.unsubscribe(subscription_id) await self._events_ws.unsubscribe(subscription_id) async def close(self) -> None: """Close the connection. Raises: NoAuthError: If the ID token is not available. """ async def _close() -> None: if self._device_ws: await self._device_ws.close() if self._events_ws: await self._events_ws.close() _LOGGER.debug("Closing connection") self._closing_task = asyncio.create_task(_close()) await self._closing_task async def get_all_barriers(self) -> list[Barrier]: """Get all barriers. Returns: A list of all barriers. Raises: NoAuthError: If the ID token is not available. ValueError: If the ClientSession or Endpoints are not available. ApiError: If an API error occurs. """ if self.id_token is None: raise NoAuthError if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) api_url = self._endpoints["GraphQL"]["device"]["https"] _LOGGER.debug("Getting all barriers") _LOGGER.debug("API URL: %s", api_url) headers = {"Authorization": self.id_token, "Content-Type": "application/json"} response = await self._session.post( api_url, headers=headers, json=await get_request_template("get_all_barriers", None), ) data = await response.json() _LOGGER.debug("Got all barriers") _LOGGER.debug("Data: %s", data) await self._check_response_errors(data) barriers = [] for device in data["data"]["devicesListAll"]["devices"]: if device["state"]["connectionState"] is not None: connection_state = ConnectionState( device["state"]["connectionState"]["connected"], device["state"]["connectionState"]["updatedTimestamp"], ) else: connection_state = None barrier_state = BarrierState( device["state"]["deviceId"], json.loads(device["state"]["reported"]), device["state"]["timestamp"], device["state"]["version"], connection_state, ) barrier = Barrier( device["id"], device["type"], device["controlLevel"], device["attr"], barrier_state, self, ) barriers.append(barrier) return barriers async def open_barrier(self, barrier_id: str) -> bool: """Open a barrier. Args: barrier_id (str): The ID of the barrier to open. Returns: Whether the barrier was opened successfully. Raises: NoAuthError: If the ID token is not available. ValueError: If the ClientSession or Endpoints are not available. ApiError: If an API error occurs. """ if self.id_token is None: raise NoAuthError if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) api_url = self._endpoints["GraphQL"]["device"]["https"] _LOGGER.debug("Opening barrier %s", barrier_id) _LOGGER.debug("API URL: %s", api_url) headers = {"Authorization": self.id_token, "Content-Type": "application/json"} response = await self._session.post( api_url, headers=headers, json=await get_request_template("open_barrier", {"barrier_id": barrier_id}), ) data = await response.json() _LOGGER.debug("Opening barrier response: %s", data) await self._check_response_errors(data) result: bool = data["data"]["devicesControl"] return result async def close_barrier(self, barrier_id: str) -> bool: """Close a barrier. Args: barrier_id (str): The ID of the barrier to close. Returns: Whether the barrier was closed successfully.""" if self.id_token is None: raise NoAuthError if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) api_url = self._endpoints["GraphQL"]["device"]["https"] _LOGGER.debug("Closing barrier %s", barrier_id) _LOGGER.debug("API URL: %s", api_url) headers = {"Authorization": self.id_token, "Content-Type": "application/json"} response = await self._session.post( api_url, headers=headers, json=await get_request_template( "close_barrier", {"barrier_id": barrier_id}, ), ) data = await response.json() _LOGGER.debug("Closing barrier response: %s", data) await self._check_response_errors(data) result: bool = data["data"]["devicesControl"] return result async def light_on(self, barrier_id: str) -> bool: """Turn the light on. Args: barrier_id (str): The ID of the barrier to turn the light on. Returns: Whether the light was turned on successfully. Raises: NoAuthError: If the ID token is not available. ValueError: If the ClientSession or Endpoints are not available. ApiError: If an API error occurs. """ if self.id_token is None: raise NoAuthError if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) api_url = self._endpoints["GraphQL"]["device"]["https"] _LOGGER.debug("Turning light on for barrier %s", barrier_id) _LOGGER.debug("API URL: %s", api_url) headers = {"Authorization": self.id_token, "Content-Type": "application/json"} response = await self._session.post( api_url, headers=headers, json=await get_request_template("light_on", {"barrier_id": barrier_id}), ) data = await response.json() _LOGGER.debug("Turning light on response: %s", data) await self._check_response_errors(data) result: bool = data["data"]["devicesControl"] return result async def light_off(self, barrier_id: str) -> bool: """Turn the light off. Args: barrier_id (str): The ID of the barrier to turn the light off. Returns: Whether the light was turned off successfully. Raises: NoAuthError: If the ID token is not available. ValueError: If the ClientSession or Endpoints are not available. ApiError: If an API error occurs. """ if self.id_token is None: raise NoAuthError if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) api_url = self._endpoints["GraphQL"]["device"]["https"] _LOGGER.debug("Turning light off for barrier %s", barrier_id) _LOGGER.debug("API URL: %s", api_url) headers = {"Authorization": self.id_token, "Content-Type": "application/json"} response = await self._session.post( api_url, headers=headers, json=await get_request_template("light_off", {"barrier_id": barrier_id}), ) data = await response.json() _LOGGER.debug("Turning light off response: %s", data) await self._check_response_errors(data) result: bool = data["data"]["devicesControl"] return result async def vacation_mode_on(self, barrier_id: str) -> None: """Turn vacation mode on. Args: barrier_id (str): The ID of the barrier to turn vacation mode on. Raises: NoAuthError: If the ID token is not available. ValueError: If the ClientSession or Endpoints are not available. ApiError: If an API error occurs. """ if self.id_token is None: raise NoAuthError if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) api_url = self._endpoints["GraphQL"]["device"]["https"] _LOGGER.debug("Turning vacation mode on for barrier %s", barrier_id) _LOGGER.debug("API URL: %s", api_url) headers = {"Authorization": self.id_token, "Content-Type": "application/json"} response = await self._session.post( api_url, headers=headers, json=await get_request_template( "vacation_mode_on", {"barrier_id": barrier_id}, ), ) await response.json() async def vacation_mode_off(self, barrier_id: str) -> None: """Turn vacation mode off. Args: barrier_id (str): The ID of the barrier to turn vacation mode off. Raises: NoAuthError: If the ID token is not available. ValueError: If the ClientSession or Endpoints are not available. ApiError: If an API error occurs. """ if self.id_token is None: raise NoAuthError if self._session is None: msg = "ClientSession not provided" raise ValueError(msg) if self._endpoints is None: msg = "Endpoints not available" raise ApiError(msg) api_url = self._endpoints["GraphQL"]["device"]["https"] _LOGGER.debug("Turning vacation mode off for barrier %s", barrier_id) _LOGGER.debug("API URL: %s", api_url) headers = {"Authorization": self.id_token, "Content-Type": "application/json"} response = await self._session.post( api_url, headers=headers, json=await get_request_template( "vacation_mode_off", {"barrier_id": barrier_id}, ), ) await response.json() IceBotYT-nice-go-438c8c9/src/nice_go/py.typed000066400000000000000000000000001474551602700207140ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/tests/000077500000000000000000000000001474551602700161775ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/tests/__init__.py000066400000000000000000000000321474551602700203030ustar00rootroot00000000000000"""Tests for Nice G.O.""" IceBotYT-nice-go-438c8c9/tests/__snapshots__/000077500000000000000000000000001474551602700210155ustar00rootroot00000000000000IceBotYT-nice-go-438c8c9/tests/__snapshots__/test_nice_go_api.ambr000066400000000000000000000013361474551602700251560ustar00rootroot00000000000000# serializer version: 1 # name: test_get_all_barriers list([ Barrier(id='test_id', type='test_type', controlLevel='test_control_level', attr=[{'key': 'test_key', 'value': 'test_value'}], state=BarrierState(deviceId='test_id', reported={'test': 'value'}, timestamp='1234567890', version=1, connectionState=ConnectionState(connected=True, updatedTimestamp='1234567890')), api=None), ]) # --- # name: test_get_all_barriers_no_connection_state list([ Barrier(id='test_id', type='test_type', controlLevel='test_control_level', attr=[{'key': 'test_key', 'value': 'test_value'}], state=BarrierState(deviceId='test_id', reported={'test': 'value'}, timestamp='1234567890', version=1, connectionState=None), api=None), ]) # --- IceBotYT-nice-go-438c8c9/tests/conftest.py000066400000000000000000000026111474551602700203760ustar00rootroot00000000000000"""Fixtures for tests.""" # ruff: noqa: SLF001 from unittest.mock import AsyncMock, MagicMock import pytest from tenacity import wait_none from nice_go._aws_cognito_authenticator import AwsCognitoAuthenticator from nice_go._ws_client import WebSocketClient from nice_go.nice_go_api import NiceGOApi @pytest.fixture def mock_api() -> NiceGOApi: """Mocked NiceGOApi instance.""" api = NiceGOApi() api._session = AsyncMock() api._device_ws = AsyncMock() api._endpoints = { "GraphQL": { "device": { "wss": "wss://test", "https": "https://test", }, "events": { "wss": "wss://test", "https": "https://test", }, }, } api.connect.retry.wait = wait_none() # type: ignore[attr-defined] return api @pytest.fixture def mock_ws_client() -> WebSocketClient: """Mocked WebSocketClient instance.""" ws = WebSocketClient(client_session=MagicMock()) ws.ws = AsyncMock(closed=False) ws._dispatch = MagicMock() ws.id_token = "test_token" ws.host = "test_host" return ws @pytest.fixture def mock_authenticator() -> AwsCognitoAuthenticator: """Mocked AwsCognitoAuthenticator instance.""" return AwsCognitoAuthenticator( "test_region", "test_client_id", "test_pool_id", "test_identity_pool_id", ) IceBotYT-nice-go-438c8c9/tests/test_authentication_tokens.py000066400000000000000000000007361474551602700242200ustar00rootroot00000000000000from nice_go._authentication_tokens import AuthenticationTokens async def test_authentication_tokens() -> None: data = {"IdToken": "test_token", "RefreshToken": "refresh_token"} tokens = AuthenticationTokens(data) assert tokens.id_token == "test_token" assert tokens.refresh_token == "refresh_token" data = {"IdToken": "test_token"} tokens = AuthenticationTokens(data) assert tokens.id_token == "test_token" assert tokens.refresh_token is None IceBotYT-nice-go-438c8c9/tests/test_aws_cognito_authenticator.py000066400000000000000000000026171474551602700250640ustar00rootroot00000000000000from unittest.mock import patch from nice_go._aws_cognito_authenticator import AwsCognitoAuthenticator async def test_refresh_token(mock_authenticator: AwsCognitoAuthenticator) -> None: with patch("nice_go._aws_cognito_authenticator.boto3.client") as mock_boto3_client: mock_boto3_client.return_value.initiate_auth.return_value = { "AuthenticationResult": {"IdToken": "test_token"}, } result = mock_authenticator.refresh_token("refresh_token") assert result.id_token == "test_token" async def test_get_new_token(mock_authenticator: AwsCognitoAuthenticator) -> None: with patch( "nice_go._aws_cognito_authenticator.boto3.client", ) as mock_boto3_client, patch( "nice_go._aws_cognito_authenticator.AWSSRP", ) as mock_awssrp: mock_boto3_client.return_value.initiate_auth.return_value = { "ChallengeParameters": {"key": "value"}, } mock_boto3_client.return_value.respond_to_auth_challenge.return_value = { "AuthenticationResult": {"IdToken": "test_token"}, } mock_awssrp.return_value.get_auth_params.return_value = {"key": "value"} mock_awssrp.return_value.process_challenge.return_value = {"key": "value"} result = mock_authenticator.get_new_token("username", "password") assert result.id_token == "test_token" assert result.refresh_token is None IceBotYT-nice-go-438c8c9/tests/test_barrier.py000066400000000000000000000077731474551602700212540ustar00rootroot00000000000000from unittest.mock import AsyncMock, MagicMock import pytest from nice_go import Barrier from nice_go._barrier import BarrierState async def test_open() -> None: barrier = Barrier( "barrier_id", "barrier_type", "control_level", [], BarrierState( deviceId="device_id", reported={"key": "value"}, timestamp="timestamp", version="version", connectionState=None, ), MagicMock(open_barrier=AsyncMock(return_value=True)), ) assert await barrier.open() is True async def test_close() -> None: barrier = Barrier( "barrier_id", "barrier_type", "control_level", [], BarrierState( deviceId="device_id", reported={"key": "value"}, timestamp="timestamp", version="version", connectionState=None, ), MagicMock(close_barrier=AsyncMock(return_value=True)), ) assert await barrier.close() is True async def test_light_on() -> None: barrier = Barrier( "barrier_id", "barrier_type", "control_level", [], BarrierState( deviceId="device_id", reported={"key": "value"}, timestamp="timestamp", version="version", connectionState=None, ), MagicMock(light_on=AsyncMock(return_value=True)), ) assert await barrier.light_on() is True async def test_light_off() -> None: barrier = Barrier( "barrier_id", "barrier_type", "control_level", [], BarrierState( deviceId="device_id", reported={"key": "value"}, timestamp="timestamp", version="version", connectionState=None, ), MagicMock(light_off=AsyncMock(return_value=True)), ) assert await barrier.light_off() is True async def test_get_attr() -> None: barrier = Barrier( "barrier_id", "barrier_type", "control_level", [{"key": "key", "value": "value"}], BarrierState( deviceId="device_id", reported={"key": "value"}, timestamp="timestamp", version="version", connectionState=None, ), MagicMock(), ) assert await barrier.get_attr("key") == "value" async def test_get_attr_not_found() -> None: barrier = Barrier( "barrier_id", "barrier_type", "control_level", [{"key": "key", "value": "value"}], BarrierState( deviceId="device_id", reported={"key": "value"}, timestamp="timestamp", version="version", connectionState=None, ), MagicMock(), ) with pytest.raises(KeyError) as exc_info: await barrier.get_attr("not_found") assert str(exc_info.value) == "'Attribute with key not_found not found.'" async def test_vacation_mode_on() -> None: mock_api = MagicMock(vacation_mode_on=AsyncMock()) barrier = Barrier( "barrier_id", "barrier_type", "control_level", [], BarrierState( deviceId="device_id", reported={"key": "value"}, timestamp="timestamp", version="version", connectionState=None, ), mock_api, ) await barrier.vacation_mode_on() mock_api.vacation_mode_on.assert_called_once_with("barrier_id") async def test_vacation_mode_off() -> None: mock_api = MagicMock(vacation_mode_off=AsyncMock()) barrier = Barrier( "barrier_id", "barrier_type", "control_level", [], BarrierState( deviceId="device_id", reported={"key": "value"}, timestamp="timestamp", version="version", connectionState=None, ), mock_api, ) await barrier.vacation_mode_off() mock_api.vacation_mode_off.assert_called_once_with("barrier_id") IceBotYT-nice-go-438c8c9/tests/test_nice_go_api.py000066400000000000000000000403511474551602700220470ustar00rootroot00000000000000# ruff: noqa: SLF001 from __future__ import annotations import asyncio import json from contextlib import suppress from typing import TYPE_CHECKING, Any from unittest.mock import AsyncMock, MagicMock, patch import botocore import pytest from nice_go import ( ApiError, AuthFailedError, NiceGOApi, NoAuthError, WebSocketError, ) GET_ALL_BARRIERS_RESPONSE = { "data": { "devicesListAll": { "devices": [ { "state": { "connectionState": { "connected": True, "updatedTimestamp": "1234567890", }, "deviceId": "test_id", "desired": json.dumps({"test": "value"}), "reported": json.dumps({"test": "value"}), "timestamp": "1234567890", "version": 1, }, "id": "test_id", "type": "test_type", "controlLevel": "test_control_level", "attr": [{"key": "test_key", "value": "test_value"}], }, ], }, }, } GET_ALL_BARRIERS_RESPONSE_NO_CONNECTION_STATE = { "data": { "devicesListAll": { "devices": [ { "state": { "connectionState": None, "deviceId": "test_id", "desired": json.dumps({"test": "value"}), "reported": json.dumps({"test": "value"}), "timestamp": "1234567890", "version": 1, }, "id": "test_id", "type": "test_type", "controlLevel": "test_control_level", "attr": [{"key": "test_key", "value": "test_value"}], }, ], }, }, } if TYPE_CHECKING: from syrupy.assertion import SnapshotAssertion async def test_schedule_event(mock_api: NiceGOApi) -> None: with patch("nice_go.nice_go_api.asyncio.create_task") as mock_create_task: coro = AsyncMock() mock_api._schedule_event(coro, "test_event", {"key": "value"}) mock_create_task.assert_called_once() await mock_create_task.call_args[0][0] # Await the coroutine that was scheduled async def test_dispatch_event(mock_api: NiceGOApi) -> None: coro = AsyncMock() mock_api._events["on_test_event"] = [coro] mock_api._dispatch("test_event", {"key": "value"}) await asyncio.sleep(0) # Allow the event loop to run coro.assert_called_once() async def test_authenticate(mock_api: NiceGOApi) -> None: with patch("nice_go.nice_go_api.asyncio.to_thread") as mock_to_thread: mock_to_thread.return_value = MagicMock( id_token="test_token", # noqa: S106 refresh_token="refresh_token", # noqa: S106 ) assert mock_api._session is not None result = await mock_api.authenticate("username", "password", mock_api._session) assert result == "refresh_token" assert mock_api.id_token == "test_token" async def test_connect_not_authenticated(mock_api: NiceGOApi) -> None: mock_api.id_token = None with pytest.raises(NoAuthError): await mock_api.connect() async def test_connect_no_endpoints(mock_api: NiceGOApi) -> None: mock_api.id_token = "test_token" mock_api._endpoints = None with pytest.raises(ApiError): await mock_api.connect() async def test_subscribe_no_ws(mock_api: NiceGOApi) -> None: mock_api._device_ws = None with pytest.raises(WebSocketError): await mock_api.subscribe("receiver") mock_api._device_ws = AsyncMock() mock_api._events_ws = None with pytest.raises(WebSocketError): await mock_api.subscribe("receiver") async def test_unsubscribe_no_ws(mock_api: NiceGOApi) -> None: mock_api._device_ws = None with pytest.raises(WebSocketError): await mock_api.unsubscribe("receiver") mock_api._device_ws = AsyncMock() mock_api._events_ws = None with pytest.raises(WebSocketError): await mock_api.unsubscribe("receiver") async def test_get_all_barriers_not_authenticated(mock_api: NiceGOApi) -> None: mock_api.id_token = None with pytest.raises(NoAuthError): await mock_api.get_all_barriers() @pytest.mark.parametrize( ("method_name", "expected_result"), [ ("open_barrier", True), ("close_barrier", True), ("light_on", True), ("light_off", True), ("vacation_mode_on", None), ("vacation_mode_off", None), ], ) async def test_barrier_operations( mock_api: NiceGOApi, method_name: str, expected_result: Any, ) -> None: with patch("nice_go.nice_go_api.get_request_template") as mock_get_request_template: mock_api.id_token = "test_token" mock_get_request_template.return_value = {"query": method_name} assert mock_api._session is not None assert isinstance(mock_api._session, AsyncMock) mock_api._session.post.return_value.json.return_value = { "data": {"devicesControl": True}, } method = getattr(mock_api, method_name) result = await method("barrier_id") assert result is expected_result async def test_event_decorator(mock_api: NiceGOApi) -> None: @mock_api.event async def on_test_event(data: dict[str, Any]) -> None: pass assert "on_test_event" in mock_api._events assert mock_api._events["on_test_event"][0] == on_test_event mock_api._dispatch("test_event", {}) async def test_sync_event_decorator(mock_api: NiceGOApi) -> None: with pytest.raises(TypeError): @mock_api.event # type: ignore[type-var] def on_test_event(data: dict[str, Any]) -> None: # It's impossible for this to be called because # the error stops it from being added pass # pragma: no cover @pytest.mark.parametrize("error", [asyncio.CancelledError, Exception]) async def test_run_event_errors(mock_api: NiceGOApi, error: Exception) -> None: coro = AsyncMock() coro.side_effect = error mock_api._events["on_test_event"] = [coro] mock_api._dispatch("test_event", {}) await asyncio.sleep(0) # Allow the event loop to run coro.assert_called_once() async def test_dispatch_no_listener(mock_api: NiceGOApi) -> None: mock_api._dispatch("test_event", {}) await asyncio.sleep(0) # Allow the event loop to run async def test_authenticate_refresh(mock_api: NiceGOApi) -> None: with patch("nice_go.nice_go_api.asyncio.to_thread") as mock_to_thread: mock_to_thread.return_value = MagicMock( id_token="test_token", # noqa: S106 ) mock_api.id_token = "test_token" assert mock_api._session is not None await mock_api.authenticate_refresh( "refresh_token", session=mock_api._session, ) async def test_authenticate_botocore_client_error(mock_api: NiceGOApi) -> None: with patch("nice_go.nice_go_api.asyncio.to_thread") as mock_to_thread: mock_to_thread.side_effect = botocore.exceptions.ClientError( error_response={"Error": {"Code": "TestException"}}, operation_name="test", ) assert mock_api._session is not None with pytest.raises(ApiError): await mock_api.authenticate("username", "password", mock_api._session) async def test_authenticate_not_authorized_exception(mock_api: NiceGOApi) -> None: with patch("nice_go.nice_go_api.asyncio.to_thread") as mock_to_thread: mock_to_thread.side_effect = botocore.exceptions.ClientError( error_response={"Error": {"Code": "NotAuthorizedException"}}, operation_name="test", ) assert mock_api._session is not None with pytest.raises(AuthFailedError): await mock_api.authenticate("username", "password", mock_api._session) async def test_connect_error(mock_api: NiceGOApi) -> None: mock_api.id_token = "test_token" with patch("nice_go.nice_go_api.WebSocketClient") as mock_ws_client: mock_ws_client_instance = AsyncMock() mock_ws_client.return_value = mock_ws_client_instance mock_ws_client_instance.poll.side_effect = WebSocketError() with pytest.raises(WebSocketError): await mock_api.connect(reconnect=False) expected_call_count = 2 assert mock_ws_client_instance.connect.call_count == expected_call_count async def test_connect_closed(mock_api: NiceGOApi) -> None: mock_api.id_token = "test_token" with patch("nice_go.nice_go_api.WebSocketClient") as mock_ws_client: mock_ws_client_instance = AsyncMock() mock_ws_client.return_value = mock_ws_client_instance async def side_effect() -> None: mock_api._closing_task = asyncio.create_task(asyncio.sleep(0)) await asyncio.sleep(0) raise WebSocketError mock_ws_client_instance.poll = AsyncMock(side_effect=side_effect) await mock_api.connect(reconnect=True) assert mock_ws_client_instance.connect.call_count == 2 # noqa: PLR2004 await mock_api.close() async def test_connect_reconnect(mock_api: NiceGOApi) -> None: mock_api.id_token = "test_token" with patch("nice_go.nice_go_api.WebSocketClient") as mock_ws_client: mock_ws_client_instance = AsyncMock() mock_ws_client.return_value = mock_ws_client_instance mock_ws_client_instance.connect.side_effect = WebSocketError with suppress(asyncio.TimeoutError): await asyncio.wait_for(mock_api.connect(reconnect=True), timeout=0.1) assert mock_ws_client_instance.connect.call_count > 4 # noqa: PLR2004 async def test_subscribe(mock_api: NiceGOApi) -> None: mock_api.id_token = "test_token" mock_api._device_ws = AsyncMock() mock_api._device_ws.subscribe.return_value = "test_id" mock_api._events_ws = AsyncMock() mock_api._events_ws.subscribe.return_value = "test_id_2" result = await mock_api.subscribe("receiver") assert result == ["test_id", "test_id_2"] async def test_unsubscribe(mock_api: NiceGOApi) -> None: mock_api.id_token = "test_token" mock_api._device_ws = AsyncMock() mock_api._events_ws = AsyncMock() await mock_api.unsubscribe("test_id") mock_api._device_ws.unsubscribe.assert_called_once_with("test_id") mock_api._events_ws.unsubscribe.assert_called_once_with("test_id") async def test_get_all_barriers( mock_api: NiceGOApi, snapshot: SnapshotAssertion, ) -> None: mock_api.id_token = "test_token" assert mock_api._session is not None assert isinstance(mock_api._session, AsyncMock) mock_api._session.post.return_value.json.return_value = GET_ALL_BARRIERS_RESPONSE result = await mock_api.get_all_barriers() # api is an object with an address that varies, so we exclude it from the snapshot # It's not what we're checking anyways # Remove the api property from all the barriers for barrier in result: barrier.api = None # type: ignore[assignment] assert result == snapshot async def test_get_all_barriers_no_connection_state( mock_api: NiceGOApi, snapshot: SnapshotAssertion, ) -> None: mock_api.id_token = "test_token" assert mock_api._session is not None assert isinstance(mock_api._session, AsyncMock) mock_api._session.post.return_value.json.return_value = ( GET_ALL_BARRIERS_RESPONSE_NO_CONNECTION_STATE ) result = await mock_api.get_all_barriers() for barrier in result: barrier.api = None # type: ignore[assignment] assert result == snapshot @pytest.mark.parametrize( ("method_name"), [ ("open_barrier"), ("close_barrier"), ("light_on"), ("light_off"), ("vacation_mode_on"), ("vacation_mode_off"), ], ) async def test_barrier_operations_no_auth( mock_api: NiceGOApi, method_name: str, ) -> None: mock_api.id_token = None method = getattr(mock_api, method_name) with pytest.raises(NoAuthError): await method("barrier_id") @pytest.mark.parametrize( ("method_name", "args"), [ ("authenticate", ("username", "password", None)), ("connect", ()), ("get_all_barriers", ()), ("open_barrier", ("barrier_id",)), ("close_barrier", ("barrier_id",)), ("light_on", ("barrier_id",)), ("light_off", ("barrier_id",)), ("vacation_mode_on", ("barrier_id",)), ("vacation_mode_off", ("barrier_id",)), ], ) async def test_no_client_session( mock_api: NiceGOApi, method_name: str, args: tuple[str | None], ) -> None: mock_api._session = None mock_api.id_token = "test_token" method = getattr(mock_api, method_name) with pytest.raises(ValueError, match="ClientSession not provided"): await method(*args) @pytest.mark.parametrize( ("method_name", "args"), [ ("connect", ()), ("get_all_barriers", ()), ("open_barrier", ("barrier_id",)), ("close_barrier", ("barrier_id",)), ("light_on", ("barrier_id",)), ("light_off", ("barrier_id",)), ("vacation_mode_on", ("barrier_id",)), ("vacation_mode_off", ("barrier_id",)), ], ) async def test_no_endpoints( mock_api: NiceGOApi, method_name: str, args: tuple[str | None], ) -> None: mock_api._endpoints = None mock_api.id_token = "test_token" method = getattr(mock_api, method_name) with pytest.raises(ApiError, match="Endpoints not available"): await method(*args) async def test_auth_no_endpoints( mock_api: NiceGOApi, ) -> None: mock_api._session = AsyncMock( get=AsyncMock( return_value=AsyncMock( json=AsyncMock( return_value={"endpoints": None}, ), ), ), ) with pytest.raises(ApiError, match="Endpoints not available"): await mock_api.authenticate("username", "password", mock_api._session) async def test_on_device_connected(mock_api: NiceGOApi) -> None: mock_api._events_connected = True coro = AsyncMock() mock_api.on_connected = coro # type: ignore[attr-defined] await mock_api.on_device_connected() async def test_on_events_connected(mock_api: NiceGOApi) -> None: mock_api._device_connected = True coro = AsyncMock() mock_api.on_connected = coro # type: ignore[attr-defined] await mock_api.on_events_connected() async def test_poll_ws_no_ws(mock_api: NiceGOApi) -> None: mock_api._device_ws = None mock_api._events_ws = None await mock_api._poll_device_ws() await mock_api._poll_events_ws() async def test_connect_poll_task_exception(mock_api: NiceGOApi) -> None: mock_api.id_token = "test_token" with patch("nice_go.nice_go_api.asyncio.wait") as mock_wait, patch( "nice_go.nice_go_api.WebSocketClient", ) as mock_ws_client, patch("nice_go.nice_go_api.NiceGOApi._poll_device_ws"), patch( "nice_go.nice_go_api.NiceGOApi._poll_events_ws", ): mock_ws_client_instance = AsyncMock() mock_ws_client.return_value = mock_ws_client_instance cancel_mock = MagicMock() mock_wait.return_value = ( ( MagicMock( exception=MagicMock(return_value=ValueError("test")), ), ), (MagicMock(cancel=cancel_mock),), ) with pytest.raises(ValueError, match="test"): await mock_api.connect(reconnect=False) cancel_mock.assert_called_once() async def test_graphql_error_response(mock_api: NiceGOApi) -> None: mock_api.id_token = "test_token" assert mock_api._session is not None assert isinstance(mock_api._session, AsyncMock) mock_api._session.post.return_value.json.return_value = { "errors": [{"errorType": "TestError", "message": "test_error"}], } with pytest.raises(ApiError, match="test_error"): await mock_api.get_all_barriers() mock_api._session.post.return_value.json.return_value = { "errors": [ {"errorType": "UnauthorizedException", "message": "unauthorized_error"}, ], } with pytest.raises(AuthFailedError, match="unauthorized_error"): await mock_api.get_all_barriers() IceBotYT-nice-go-438c8c9/tests/test_ws_client.py000066400000000000000000000352121474551602700216020ustar00rootroot00000000000000# ruff: noqa: SLF001 from __future__ import annotations import asyncio import json from contextlib import nullcontext as does_not_raise from unittest.mock import AsyncMock, MagicMock, patch import aiohttp import pytest import yarl from nice_go import WebSocketError from nice_go._exceptions import ReconnectWebSocketError from nice_go._ws_client import EventListener, WebSocketClient async def test_ws_connect(mock_ws_client: WebSocketClient) -> None: assert mock_ws_client.ws is not None assert isinstance(mock_ws_client.ws, AsyncMock) mock_session = MagicMock() mock_session.ws_connect = AsyncMock() mock_session.ws_connect.return_value = AsyncMock(closed=False) mock_session.ws_connect.return_value.receive = AsyncMock() mock_session.ws_connect.return_value.receive.return_value = MagicMock( data=json.dumps({"type": "connection_ack"}), ) mock_ws_client.client_session = mock_session mock_ws_client._dispatch = MagicMock() await mock_ws_client.connect( "test_token", yarl.URL("wss://test_endpoint"), "events", MagicMock(), "test_host", ) mock_session.ws_connect.assert_called_once() mock_ws_client._dispatch.assert_called_once() mock_ws_client.ws.receive.assert_called_once() mock_ws_client.ws.send_json.assert_called_once() async def test_ws_init_unexpected_type(mock_ws_client: WebSocketClient) -> None: assert mock_ws_client.ws is not None assert isinstance(mock_ws_client.ws, AsyncMock) mock_ws_client.ws.receive = AsyncMock() mock_ws_client.ws.receive.return_value = MagicMock( data=json.dumps({"type": "unexpected_type"}), ) with pytest.raises(WebSocketError): await mock_ws_client.init() async def test_ws_init_timeout(mock_ws_client: WebSocketClient) -> None: assert mock_ws_client.ws is not None assert isinstance(mock_ws_client.ws, AsyncMock) mock_ws_client.ws.receive = AsyncMock() mock_ws_client.ws.receive.side_effect = asyncio.TimeoutError with pytest.raises(WebSocketError): await mock_ws_client.init() async def test_ws_send_json(mock_ws_client: WebSocketClient) -> None: assert mock_ws_client.ws is not None assert isinstance(mock_ws_client.ws, AsyncMock) mock_ws_client.ws.send_json = AsyncMock() await mock_ws_client.send({"type": "test_type"}) mock_ws_client.ws.send_json.assert_called_once() async def test_ws_send_str(mock_ws_client: WebSocketClient) -> None: assert mock_ws_client.ws is not None assert isinstance(mock_ws_client.ws, AsyncMock) mock_ws_client.ws.send_str = AsyncMock() # sourcery skip: name-type-suffix await mock_ws_client.send("test_message") mock_ws_client.ws.send_str.assert_called_once() async def test_ws_subscribe_and_close(mock_ws_client: WebSocketClient) -> None: assert mock_ws_client.ws is not None assert isinstance(mock_ws_client.ws, AsyncMock) # Test both subscribing and closing, as they are closely related mock_ws_client.ws.send_json = AsyncMock() mock_ws_client.ws.close = AsyncMock() mock_ws_client.ws.receive = AsyncMock() subscription_id = "test_id" mock_ws_client.ws.receive.return_value = MagicMock( data=json.dumps({"id": subscription_id, "type": "start_ack"}), type=aiohttp.WSMsgType.TEXT, ) mock_ws_client.api_type = "events" with patch("nice_go._ws_client.uuid.uuid4") as mock_uuid: mock_uuid.return_value = subscription_id subscribe_task = asyncio.create_task(mock_ws_client.subscribe("test_query")) await asyncio.sleep(0.1) mock_ws_client.ws.send_json.assert_called_once() await mock_ws_client.poll() await subscribe_task mock_ws_client._timeout_task = MagicMock(cancel=MagicMock()) await mock_ws_client.close() call_count_should_be = 2 assert mock_ws_client.ws.send_json.call_count == call_count_should_be mock_ws_client.ws.close.assert_called_once() @pytest.mark.parametrize( "msg_type", [ aiohttp.WSMsgType.ERROR, aiohttp.WSMsgType.CLOSE, aiohttp.WSMsgType.CLOSING, aiohttp.WSMsgType.CLOSED, ], ) async def test_ws_poll_errors( mock_ws_client: WebSocketClient, msg_type: aiohttp.WSMsgType, ) -> None: assert mock_ws_client.ws is not None assert isinstance(mock_ws_client.ws, AsyncMock) mock_ws_client.ws.receive = AsyncMock() mock_ws_client.ws.receive.return_value = MagicMock(type=msg_type) mock_ws_client._timeout_task = MagicMock() with pytest.raises(WebSocketError): await mock_ws_client.poll() async def test_ws_received_message(mock_ws_client: WebSocketClient) -> None: mock_ws_client._dispatch = MagicMock() mock_ws_client.api_type = "device" await mock_ws_client.received_message( json.dumps({"type": "data", "payload": "test_payload"}), ) mock_ws_client._dispatch.assert_called_once() with pytest.raises(WebSocketError): await mock_ws_client.received_message(json.dumps({"type": "error"})) with pytest.raises(WebSocketError): await mock_ws_client.received_message("invalid_json") mock_ws_client._timeout_task = MagicMock(done=MagicMock(return_value=False)) mock_ws_client._timeout_task.cancel = MagicMock() mock_ws_client._watch_keepalive = MagicMock() # type: ignore[method-assign] with patch("nice_go._ws_client.asyncio.create_task") as mock_create_task: await mock_ws_client.received_message(json.dumps({"type": "ka"})) mock_create_task.assert_called_once() async def test_ws_received_message_dispatch_listener_skip_type( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client._dispatch_listeners = [ EventListener( predicate=AsyncMock(return_value=True), event="wrong_type", future=MagicMock(), result=MagicMock(), ), ] mock_ws_client.api_type = "device" await mock_ws_client.received_message( json.dumps({"type": "data", "payload": "test_payload"}), ) assert len(mock_ws_client._dispatch_listeners) == 1 async def test_ws_received_message_dispatch_listener_cancelled( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client._dispatch_listeners = [ EventListener( predicate=AsyncMock(return_value=True), event="data", future=MagicMock(cancelled=MagicMock(return_value=True)), result=MagicMock(), ), ] mock_ws_client.api_type = "device" await mock_ws_client.received_message( json.dumps({"type": "data", "payload": "test_payload"}), ) assert not mock_ws_client._dispatch_listeners async def test_ws_received_message_dispatch_listener_predicate_exception( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client._dispatch_listeners = [ EventListener( predicate=MagicMock(side_effect=Exception), event="data", future=MagicMock(cancelled=MagicMock(return_value=False)), result=MagicMock(), ), ] mock_ws_client.api_type = "device" await mock_ws_client.received_message( json.dumps({"type": "data", "payload": "test_payload"}), ) assert not mock_ws_client._dispatch_listeners async def test_subscribe_timeout(mock_ws_client: WebSocketClient) -> None: with patch("nice_go._ws_client.asyncio.wait_for") as mock_wait_for: mock_wait_for.side_effect = asyncio.TimeoutError mock_ws_client.api_type = "events" with pytest.raises(WebSocketError): await mock_ws_client.subscribe("test_query") async def test_unsubscribe(mock_ws_client: WebSocketClient) -> None: mock_ws_client._subscriptions = ["test_id"] assert mock_ws_client.ws is not None assert isinstance(mock_ws_client.ws, AsyncMock) mock_ws_client.ws.send_json = AsyncMock() await mock_ws_client.unsubscribe("test_id") mock_ws_client.ws.send_json.assert_called_once() assert "test_id" not in mock_ws_client._subscriptions assert mock_ws_client.ws.send_json.call_args[0][0] == { "id": "test_id", "type": "stop", } async def test_closed_property(mock_ws_client: WebSocketClient) -> None: assert not mock_ws_client.closed mock_ws_client.ws = MagicMock() mock_ws_client.ws.closed = True assert mock_ws_client.closed async def test_connect_no_host(mock_ws_client: WebSocketClient) -> None: with pytest.raises(ValueError, match="host must be provided"): await mock_ws_client.connect( "test_token", yarl.URL("wss://test_endpoint"), "events", MagicMock(), None, ) @pytest.mark.parametrize( ("method", "args"), [ ("init", ()), ("send", ({"type": "test_type"},)), ("poll", ()), ], ) async def test_closed_error( mock_ws_client: WebSocketClient, method: str, args: tuple[dict[str, str] | None], ) -> None: mock_ws_client.ws = None with pytest.raises(WebSocketError, match="WebSocket connection is closed"): await getattr(mock_ws_client, method)(*args) async def test_close_already_closed( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client.ws = MagicMock() mock_ws_client.ws.closed = True await mock_ws_client.close() assert mock_ws_client.ws.close.call_count == 0 async def test_received_message_no_predicate( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client._dispatch_listeners = [ EventListener( predicate=None, event="data", future=MagicMock(cancelled=MagicMock(return_value=False)), result=MagicMock(), ), ] mock_ws_client.api_type = "device" await mock_ws_client.received_message( json.dumps({"type": "data", "payload": "test_payload"}), ) assert not mock_ws_client._dispatch_listeners async def test_received_message_type_or_payload_missing( mock_ws_client: WebSocketClient, ) -> None: with pytest.raises(WebSocketError): await mock_ws_client.received_message(json.dumps({"payload": "test_payload"})) async def test_barrier_obstructed(mock_ws_client: WebSocketClient) -> None: mock_ws_client.api_type = "events" mock_ws_client._dispatch = MagicMock() mock_ws_client.dispatch_message( { "type": "data", "payload": { "data": { "eventsFeed": { "item": { "eventId": "event-error-barrier-obstructed", }, }, }, }, }, ) assert mock_ws_client._dispatch.call_count == 1 async def test_event_not_barrier_obstructed(mock_ws_client: WebSocketClient) -> None: mock_ws_client.api_type = "events" mock_ws_client._dispatch = MagicMock() mock_ws_client.dispatch_message( { "type": "data", "payload": { "data": { "eventsFeed": { "item": { "eventId": "event-user-barrier-opened", }, }, }, }, }, ) assert mock_ws_client._dispatch.call_count == 0 async def test_unsubscribe_nonexistent_subscription( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client._subscriptions = [] mock_ws_client.client_session = MagicMock(send_json=AsyncMock()) await mock_ws_client.unsubscribe("test_id") assert mock_ws_client.client_session.send_json.call_count == 0 async def test_watch_keepalive( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client.ws = MagicMock(closed=False) mock_ws_client.ws.send_json = AsyncMock() mock_ws_client.ws.receive = AsyncMock() mock_ws_client.ws.receive.return_value = MagicMock( data=json.dumps({"type": "ka"}), type=aiohttp.WSMsgType.TEXT, ) mock_ws_client.ws.close = AsyncMock() mock_ws_client._timeout = 0.1 mock_ws_client._timeout_task = MagicMock(cancel=MagicMock()) with pytest.raises(ReconnectWebSocketError): await mock_ws_client._watch_keepalive() mock_ws_client.ws.close.assert_called_once() async def test_watch_keepalive_no_ws( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client.ws = None with pytest.raises(WebSocketError, match="WebSocket connection is closed"): await mock_ws_client._watch_keepalive() async def test_reconnect_no_ws( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client.ws = None with pytest.raises(WebSocketError, match="WebSocket connection is closed"): await mock_ws_client._reconnect() async def test_close_timeout_task_cancelled( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client._timeout_task = asyncio.create_task(asyncio.sleep(0)) mock_ws_client._timeout_task.cancel() assert mock_ws_client.ws is not None assert not mock_ws_client.ws.closed assert not mock_ws_client._timeout_task.done() await mock_ws_client.close() async def test_poll_timeout_task_cancelled( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client._timeout_task = asyncio.create_task(asyncio.sleep(0)) mock_ws_client._timeout_task.cancel() assert mock_ws_client.ws is not None assert not mock_ws_client.ws.closed assert not mock_ws_client._timeout_task.done() mock_ws_client.ws = MagicMock(closed=False) mock_ws_client.ws.receive = AsyncMock( return_value=MagicMock( type=aiohttp.WSMsgType.CLOSED, ), ) with pytest.raises(WebSocketError): await mock_ws_client.poll() async def test_poll_ws_closed_reconnecting( mock_ws_client: WebSocketClient, ) -> None: mock_ws_client.reconnecting = True mock_ws_client.ws = MagicMock( receive=AsyncMock( return_value=MagicMock( type=aiohttp.WSMsgType.CLOSED, ), ), closed=False, ) with does_not_raise(): await mock_ws_client.poll() async def test_close_timeout_task_exception( mock_ws_client: WebSocketClient, ) -> None: mock_timeout_task = MagicMock() mock_timeout_task.done.return_value = False mock_timeout_task.cancel = MagicMock() mock_timeout_task.__await__ = MagicMock(side_effect=Exception("Test exception")) mock_ws_client._timeout_task = mock_timeout_task with patch("nice_go._ws_client._LOGGER") as mock_logger: await mock_ws_client.close() mock_timeout_task.cancel.assert_called_once() mock_timeout_task.done.assert_called_once() mock_logger.debug.assert_any_call("Cancelling keepalive task") mock_logger.exception.assert_called_once_with( "Exception occurred while cancelling keepalive task", )