├── Pipfile ├── csfloat ├── __init__.py ├── enums.py ├── iterators.py ├── errors.py ├── http.py ├── client.py ├── listing.py ├── user.py └── item.py ├── LICENSE ├── README.md ├── .github └── workflows │ └── release.yml ├── pyproject.toml ├── .gitignore └── Pipfile.lock /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | aiohttp = "*" 8 | 9 | [dev-packages] 10 | black = "*" 11 | isort = "*" 12 | "csfloat.py" = {editable = true, path = "."} 13 | 14 | [requires] 15 | python_version = "3.12" 16 | -------------------------------------------------------------------------------- /csfloat/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | CSFloat API Wrapper 3 | ~~~~~~~~~~~~~~~~~~~ 4 | A basic wrapper for the CSFloat API. 5 | :copyright: (c) 2023-present PaxxPatriot 6 | :license: MIT, see LICENSE for more details. 7 | """ 8 | 9 | __title__ = "csfloat" 10 | __author__ = "PaxxPatriot" 11 | __license__ = "MIT" 12 | __copyright__ = "Copyright 2023-present PaxxPatriot" 13 | __version__ = "0.3.0" 14 | 15 | __path__ = __import__("pkgutil").extend_path(__path__, __name__) 16 | 17 | import logging 18 | from typing import NamedTuple 19 | 20 | from .client import * 21 | from .enums import * 22 | from .errors import * 23 | from .iterators import * 24 | from .listing import * 25 | from .user import * 26 | 27 | 28 | class VersionInfo(NamedTuple): 29 | major: int 30 | minor: int 31 | micro: int 32 | releaselevel: str 33 | serial: int 34 | 35 | 36 | version_info: VersionInfo = VersionInfo(major=0, minor=3, micro=0, releaselevel="final", serial=0) 37 | 38 | logging.getLogger(__name__).addHandler(logging.NullHandler()) 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 PaxxPatriot 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # csfloat.py 2 | An API wrapper for the CSFloat API written in Python. 3 | 4 | Installing 5 | ---------- 6 | 7 | **Python 3.10 or higher is required** 8 | 9 | To install the library, you can just run the following command: 10 | 11 | ```bash 12 | # Linux/macOS 13 | $ python3 -m pip install -U csfloat.py 14 | 15 | # Windows 16 | > py -3 -m pip install -U csfloat.py 17 | ``` 18 | 19 | To install the development version, do the following: 20 | ```bash 21 | $ git clone https://github.com/PaxxPatriot/csfloat.py.git 22 | $ cd csfloat.py 23 | $ python3 -m pip install -U . 24 | ``` 25 | 26 | Quick Example 27 | -------------- 28 | 29 | ```Python 30 | import asyncio 31 | 32 | import csfloat 33 | 34 | async def main(): 35 | client = csfloat.Client() 36 | # Set your personal API key, which you can get from https://csfloat.com/profile -> Developers -> + New Key 37 | client.set_api_key(api_key="YOUR API KEY HERE") 38 | 39 | # Get all listed CS2 items on csfloat.com and print the name to the console 40 | listings = await client.fetch_all_listings() 41 | async for listing in listings: 42 | print(listing.item.name) 43 | 44 | if __name__ == "__main__": 45 | asyncio.run(main()) 46 | ``` 47 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Build package and release to PyPI 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*" 7 | workflow_dispatch: 8 | inputs: 9 | releaseTag: 10 | description: 'The tag for which to create a release package' 11 | required: true 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | with: 19 | ref: ${{ inputs.releaseTag }} 20 | - uses: actions/setup-python@v5 21 | with: 22 | python-version: '3.12' 23 | - name: Install dependencies 24 | run: python -m pip install --upgrade pip build 25 | - name: Build 26 | run: python -m build 27 | - name: Upload packages 28 | uses: actions/upload-artifact@v4 29 | with: 30 | name: packages 31 | path: dist 32 | 33 | upload: 34 | needs: build 35 | runs-on: ubuntu-latest 36 | steps: 37 | - name: Download packages 38 | uses: actions/download-artifact@v4 39 | with: 40 | name: packages 41 | path: dist 42 | - uses: actions/setup-python@v5 43 | with: 44 | python-version: '3.12' 45 | - name: Install dependencies 46 | run: python -m pip install --upgrade twine 47 | - name: Upload to PyPI 48 | env: 49 | TWINE_REPOSITORY: ${{ vars.TWINE_REPOSITORY }} 50 | TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }} 51 | TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} 52 | run: python -m twine upload --non-interactive --disable-progress-bar dist/* 53 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools >= 61.0"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "csfloat.py" 7 | authors = [ 8 | {name = "PaxxPatriot"}, 9 | ] 10 | description = "A Python wrapper for the csfloat API" 11 | readme = "README.md" 12 | keywords = ["csfloat", "Counter-Strike 2"] 13 | license = "MIT" 14 | classifiers = [ 15 | "Development Status :: 3 - Alpha", 16 | "Environment :: Console", 17 | "Framework :: aiohttp", 18 | "Intended Audience :: Developers", 19 | "Natural Language :: English", 20 | "Operating System :: OS Independent", 21 | "Programming Language :: Python :: 3 :: Only", 22 | "Programming Language :: Python :: 3.10", 23 | "Programming Language :: Python :: 3.11", 24 | "Programming Language :: Python :: 3.12", 25 | "Programming Language :: Python :: 3.13", 26 | "Topic :: Internet", 27 | "Topic :: Software Development :: Libraries", 28 | "Topic :: Software Development :: Libraries :: Python Modules", 29 | "Topic :: Utilities", 30 | "Typing :: Typed", 31 | ] 32 | requires-python = ">= 3.10" 33 | dependencies = [ 34 | "aiohttp", 35 | ] 36 | dynamic = ["version"] 37 | 38 | [project.urls] 39 | Repository = "https://github.com/PaxxPatriot/csfloat.py.git" 40 | Issues = "https://github.com/PaxxPatriot/csfloat.py/issues" 41 | 42 | [tool.setuptools] 43 | packages = ["csfloat"] 44 | 45 | [tool.setuptools.dynamic] 46 | version = {attr = "csfloat.__version__"} 47 | 48 | [tool.black] 49 | line-length = 125 50 | skip-string-normalization = true 51 | 52 | [tool.isort] 53 | profile = "black" 54 | combine_as_imports = true 55 | combine_star = true 56 | line_length = 125 57 | -------------------------------------------------------------------------------- /csfloat/enums.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023-present PaxxPatriot 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | """ 24 | 25 | from enum import Enum, IntEnum 26 | 27 | __all__ = ( 28 | "SortingParameter", 29 | "Category", 30 | "ListingType", 31 | "Rarity", 32 | ) 33 | 34 | 35 | class SortingParameter(Enum): 36 | lowest_price = "lowest_price" 37 | highest_price = "highest_price" 38 | most_recent = "most_recent" 39 | expires_soon = "expires_soon" 40 | lowest_float = "lowest_float" 41 | highest_float = "highest_float" 42 | best_deal = "best_deal" 43 | highest_discount = "highest_discount" 44 | float_rank = "float_rank" 45 | num_bids = "num_bids" 46 | 47 | def __str__(self) -> str: 48 | return self.value 49 | 50 | 51 | class Category(IntEnum): 52 | any = 0 53 | normal = 1 54 | stattrak = 2 55 | souvenir = 3 56 | 57 | 58 | class ListingType(Enum): 59 | buy_now = "buy_now" 60 | auction = "auction" 61 | 62 | 63 | class Rarity(IntEnum): 64 | any = 0 65 | consumer = 1 66 | industrial = 2 67 | mil_spec = 3 68 | restricted = 4 69 | classified = 5 70 | covert = 6 71 | contraband = 7 72 | -------------------------------------------------------------------------------- /csfloat/iterators.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023-present PaxxPatriot 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | """ 24 | 25 | import asyncio 26 | from typing import Any, Callable, Coroutine, Dict, List, Optional, Union 27 | 28 | from .errors import BadRequest 29 | from .listing import Listing 30 | 31 | 32 | class ListingAsyncIterator: 33 | def __init__( 34 | self, 35 | getter: Callable[..., Coroutine[Any, Any, Any]], 36 | limit: Optional[int] = None, 37 | pagination_token: int = 0, 38 | **kwargs: Dict[str, Any], 39 | ) -> None: 40 | self.limit = limit 41 | self.has_more = True 42 | self.getter = getter 43 | self.kwargs = kwargs 44 | 45 | self.listings: asyncio.Queue[Listing] = asyncio.Queue() 46 | self.pagination_token = pagination_token 47 | self.next_token = pagination_token + 1 48 | 49 | async def __anext__(self): 50 | try: 51 | return await self.next() 52 | except StopAsyncIteration as e: 53 | raise 54 | 55 | def __aiter__(self): 56 | return self 57 | 58 | async def flatten(self): 59 | return [element async for element in self] 60 | 61 | async def next(self) -> Listing: 62 | if self.listings.empty(): 63 | await self.fill_listings() 64 | 65 | try: 66 | return self.listings.get_nowait() 67 | except asyncio.QueueEmpty as e: 68 | raise StopAsyncIteration from e 69 | 70 | async def fill_listings(self): 71 | if not self.has_more: 72 | raise StopAsyncIteration 73 | 74 | self.kwargs["page"] = self.pagination_token 75 | try: 76 | data: Dict[str, Any] = await self.getter(params=self.kwargs) 77 | listings = data["data"] 78 | except BadRequest: 79 | self.has_more = False 80 | return 81 | 82 | for l in reversed(listings): 83 | self.listings.put_nowait(Listing(data=l)) 84 | 85 | self.pagination_token = self.next_token 86 | self.next_token = self.pagination_token + 1 87 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ 161 | -------------------------------------------------------------------------------- /csfloat/errors.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023-present PaxxPatriot 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | """ 24 | 25 | __all__ = ( 26 | "CSFloatException", 27 | "ClientException", 28 | "HTTPException", 29 | "BadRequest", 30 | "Unauthorized", 31 | "Forbidden", 32 | "NotFound", 33 | "Gone", 34 | "InternalServerError", 35 | "ServiceUnavailable", 36 | "BadArgument", 37 | ) 38 | 39 | 40 | class CSFloatException(Exception): 41 | """Base exception class for csfloat.py 42 | 43 | Ideally speaking, this could be caught to handle any exceptions raised from this library. 44 | """ 45 | 46 | pass 47 | 48 | 49 | class ClientException(CSFloatException): 50 | """Exception that's raised when an operation in the :class:`Client` fails. 51 | 52 | These are usually for exceptions that happened due to user input. 53 | """ 54 | 55 | pass 56 | 57 | 58 | class HTTPException(CSFloatException): 59 | """Exception that's raised when an HTTP request operation fails. 60 | Attributes 61 | ------------ 62 | response: :class:`aiohttp.ClientResponse` 63 | The response of the failed HTTP request. This is an 64 | instance of :class:`aiohttp.ClientResponse`. In some cases 65 | this could also be a :class:`requests.Response`. 66 | text: :class:`str` 67 | The text of the error. Could be an empty string. 68 | status: :class:`int` 69 | The status code of the HTTP request. 70 | """ 71 | 72 | def __init__(self, response, message): 73 | self.response = response 74 | self.status = response.status 75 | if isinstance(message, dict): 76 | base = message.get("message", "") 77 | errors = message.get("errors") 78 | if errors: 79 | errors = {error["id"]: error["message"] for error in errors} 80 | helpful = "\n".join("In %s: %s" % t for t in errors.items()) 81 | self.text = base + "\n" + helpful 82 | else: 83 | self.text = base 84 | else: 85 | self.text = message or "" 86 | 87 | fmt = "{0.status} {0.reason})" 88 | if len(self.text): 89 | fmt += ": {1}" 90 | 91 | super().__init__(fmt.format(self.response, self.text)) 92 | 93 | 94 | class BadRequest(HTTPException): 95 | """Exception that's raised for when status code 400 occurs. 96 | 97 | Subclass of :exc:`HTTPException`""" 98 | 99 | pass 100 | 101 | 102 | class Unauthorized(HTTPException): 103 | """Exception that's raised for when status code 401 occurs. 104 | 105 | Subclass of :exc:`HTTPException`""" 106 | 107 | pass 108 | 109 | 110 | class Forbidden(HTTPException): 111 | """Exception that's raised for when status code 403 occurs. 112 | 113 | Subclass of :exc:`HTTPException`""" 114 | 115 | pass 116 | 117 | 118 | class NotFound(HTTPException): 119 | """Exception that's raised for when status code 404 occurs. 120 | 121 | Subclass of :exc:`HTTPException`""" 122 | 123 | pass 124 | 125 | 126 | class Gone(HTTPException): 127 | """Exception that's raised for when status code 410 occurs. 128 | 129 | Subclass of :exc:`HTTPException`""" 130 | 131 | pass 132 | 133 | 134 | class InternalServerError(HTTPException): 135 | """Exception that's raised for when a 500 range status code occurs. 136 | 137 | Subclass of :exc:`HTTPException`""" 138 | 139 | pass 140 | 141 | 142 | class ServiceUnavailable(HTTPException): 143 | """Exception that's raised for when a status code 503 occurs. 144 | 145 | Subclass of :exc:`HTTPException`""" 146 | 147 | pass 148 | 149 | 150 | class BadArgument(CSFloatException): 151 | """Exception that's raised when a user enters a bad argument to a client method. 152 | 153 | Subclass of :exc:`CSFloatException`""" 154 | 155 | def __init__(self, message): 156 | super().__init__(message) 157 | -------------------------------------------------------------------------------- /csfloat/http.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023-present PaxxPatriot 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | """ 24 | 25 | import asyncio 26 | import logging 27 | import sys 28 | import time 29 | from typing import Any, Dict, Iterable, List, Optional 30 | 31 | import aiohttp 32 | 33 | from csfloat import __version__ 34 | 35 | from .errors import BadRequest, Forbidden, HTTPException, InternalServerError, NotFound, Unauthorized 36 | 37 | _log = logging.getLogger(__name__) 38 | 39 | 40 | class Route: 41 | BASE = "https://csfloat.com/api/v1" 42 | 43 | def __init__(self, method: str, path: str) -> None: 44 | self.path: str = path 45 | self.method: str = method 46 | self.url: str = self.BASE + self.path 47 | 48 | 49 | class HTTPClient: 50 | def __init__( 51 | self, 52 | *, 53 | proxy: Optional[str] = None, 54 | proxy_auth: Optional[aiohttp.BasicAuth] = None, 55 | ) -> None: 56 | self.__session = aiohttp.ClientSession() 57 | self.api_key = None 58 | self.proxy: Optional[str] = proxy 59 | self.proxy_auth: Optional[aiohttp.BasicAuth] = proxy_auth 60 | 61 | user_agent = "csfloat.py {0}) Python/{1[0]}.{1[1]} aiohttp/{2}" 62 | self.user_agent: str = user_agent.format(__version__, sys.version_info, str(aiohttp.__version__)) 63 | 64 | def set_api_key(self, api_key: str) -> None: 65 | self.api_key = api_key 66 | 67 | async def close(self) -> None: 68 | if self.__session: 69 | await self.__session.close() 70 | 71 | async def request( 72 | self, 73 | route: Route, 74 | params: Optional[Iterable[Dict[str, Any]]] = None, 75 | **kwargs: Any, 76 | ) -> Any: 77 | method = route.method 78 | url = route.url 79 | 80 | # header creation 81 | headers: Dict[str, str] = { 82 | "User-Agent": self.user_agent, 83 | } 84 | 85 | if self.api_key is not None: 86 | headers["Authorization"] = self.api_key 87 | 88 | kwargs["headers"] = headers 89 | 90 | if params: 91 | kwargs["params"] = params 92 | 93 | async with self.__session.request(method, url, **kwargs) as response: 94 | for _ in range(2): 95 | _log.info(f"{method} {url} with {kwargs} has returned {response.status}") 96 | 97 | data = await response.json() 98 | 99 | if 300 > response.status >= 200: 100 | _log.debug(f"{method} {url} has received {data}") 101 | return data 102 | 103 | if response.status in {500, 503}: 104 | raise InternalServerError(response, data) 105 | 106 | if response.status == 400: 107 | raise BadRequest(response, data) 108 | if response.status == 401: 109 | raise Unauthorized(response, data) 110 | if response.status == 403: 111 | raise Forbidden(response, data) 112 | if response.status == 404: 113 | raise NotFound(response, data) 114 | if response.status == 429: 115 | # We are getting rate-limited, read x-ratelimit-reset header and calculate cooldown 116 | wait_time = 600 117 | ratelimit_reset = response.headers.get("X-Ratelimit-Reset") 118 | if ratelimit_reset is not None: 119 | wait_time = int(ratelimit_reset) - int(time.time()) 120 | _log.info(f"{method} {url} is getting rate-limited, retry after {wait_time} seconds") 121 | await asyncio.sleep(wait_time) 122 | continue 123 | raise HTTPException(response, data) 124 | 125 | async def get_all_listings(self, **parameters: Any) -> List[Dict[str, Any]]: 126 | return await self.request(Route("GET", "/listings"), **parameters) 127 | 128 | async def get_listing(self, item_id: int) -> Dict[str, Any]: 129 | return await self.request(Route("GET", f"/listings/{item_id}")) 130 | 131 | async def list_item(self, parameters: Dict) -> List[Dict[str, Any]]: 132 | return await self.request(Route("POST", "/listings"), json=parameters) 133 | 134 | async def get_user(self, user_id: int) -> Dict[str, Any]: 135 | return await self.request(Route("GET", f"/users/{user_id}")) 136 | 137 | async def get_user_stall(self, user_id: int, **parameters: Any) -> List[Dict[str, Any]]: 138 | return await self.request(Route("GET", f"/users/{user_id}/stall"), **parameters) 139 | 140 | # Undocumented endpoints (only usable with an API key) 141 | async def me(self) -> Dict[str, Any]: 142 | return await self.request(Route("GET", "/me")) 143 | 144 | async def get_inventory(self) -> List[Dict[str, Any]]: 145 | return await self.request(Route("GET", "/me/inventory")) 146 | 147 | async def unlist_item(self, listing_id: int) -> Dict[str, str]: 148 | return await self.request(Route("DELETE", f"/listings/{listing_id}")) 149 | -------------------------------------------------------------------------------- /csfloat/client.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023-present PaxxPatriot 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | """ 24 | 25 | import logging 26 | from typing import List, Optional 27 | 28 | from .errors import BadArgument 29 | from .http import HTTPClient 30 | from .item import Item 31 | from .iterators import ListingAsyncIterator 32 | from .listing import Listing 33 | from .user import AuthenticatedUser, User 34 | 35 | __all__ = ("Client",) 36 | 37 | 38 | _log = logging.getLogger(__name__) 39 | 40 | 41 | class Client: 42 | def __init__(self, debug: bool = False): 43 | self.http: HTTPClient = HTTPClient() 44 | 45 | def set_api_key(self, *, api_key: str): 46 | self.http.set_api_key(api_key) 47 | 48 | async def close(self) -> None: 49 | """*coroutine* 50 | Closes the `aiohttp.ClientSession`. 51 | """ 52 | await self.http.close() 53 | 54 | async def fetch_all_listings(self, **kwargs) -> ListingAsyncIterator: 55 | """*coroutine* 56 | Returns an AsyncIterator that iterates over **all** listings of csfloat. The result can be filtered by passing parameters as `kwargs` to the method. 57 | A list of accepted parameters can be found at the `CSFloat documentation `_. 58 | 59 | 60 | Returns 61 | ------- 62 | :class:`ListingAsyncIterator` of :class:`Listing` 63 | """ 64 | 65 | return ListingAsyncIterator(self.http.get_all_listings, **kwargs) 66 | 67 | async def get_listing(self, id: int) -> Listing: 68 | """*coroutine* 69 | Return a specific listing. 70 | 71 | Returns 72 | ------- 73 | :class:`Listing` 74 | """ 75 | data = await self.http.get_listing(item_id=id) 76 | return Listing(data=data) 77 | 78 | async def get_user(self, id: int) -> User: 79 | """*coroutine* 80 | Return a specific user. 81 | 82 | Returns 83 | ------- 84 | :class:`User` 85 | """ 86 | data = await self.http.get_user(user_id=id) 87 | return User(data=data) 88 | 89 | async def get_user_stall(self, id: int, *, limit: int = 40, **kwargs) -> List[Listing]: 90 | """*coroutine* 91 | Return the listings in a stall of a specific user. 92 | 93 | The parameters are the same as for getting global listings. 94 | Find a list of accepted parameters at the `CSFloat documentation `_. 95 | 96 | Returns 97 | ------- 98 | List[:class:`Listing`] 99 | """ 100 | 101 | params = { 102 | "limit": limit, 103 | } 104 | params = params | kwargs 105 | data = await self.http.get_user_stall(user_id=id, params=params) 106 | return [Listing(data=listing_data) for listing_data in data["data"]] 107 | 108 | async def me(self) -> AuthenticatedUser: 109 | """*coroutine* 110 | Returns the authenticated user. 111 | 112 | Returns 113 | ------- 114 | :class:`AuthenticatedUser` 115 | """ 116 | data = await self.http.me() 117 | return AuthenticatedUser(data=data["user"]) 118 | 119 | async def get_inventory(self) -> List[Item]: 120 | """*coroutine* 121 | Return a list of the items in the user's inventory. 122 | 123 | Returns 124 | ------- 125 | :class:`List` of :class:`Item` 126 | """ 127 | data = await self.http.get_inventory() 128 | return [Item(data=item_data) for item_data in data] 129 | 130 | async def list_item_as_buy_now( 131 | self, 132 | asset_id: str | int, 133 | price: int, 134 | *, 135 | max_offer_discount: Optional[int] = None, 136 | description: Optional[str] = "", 137 | private: bool = False, 138 | ) -> Listing: 139 | if isinstance(description, str) and len(description) > 32: 140 | raise BadArgument("description can't be longer than 32 characters") 141 | 142 | params = { 143 | "type": "buy_now", 144 | "asset_id": asset_id, 145 | "price": price, 146 | "private": private, 147 | } 148 | 149 | if max_offer_discount is not None: 150 | params["max_offer_discount"] = max_offer_discount 151 | 152 | if description != "": 153 | params["description"] = description 154 | 155 | data = await self.http.list_item(parameters=params) 156 | return Listing(data=data) 157 | 158 | async def list_item_as_auction( 159 | self, asset_id: str | int, price: int, duration_days: int, *, description: Optional[str] = "", private: bool = False 160 | ) -> Listing: 161 | if duration_days not in [1, 3, 5, 7, 14]: 162 | raise BadArgument("duration_days has to be a value of 1, 3, 5, 7 or 14") 163 | 164 | if isinstance(description, str) and len(description) > 32: 165 | raise BadArgument("description can't be longer than 32 characters") 166 | 167 | params = { 168 | "type": "auction", 169 | "asset_id": asset_id, 170 | "reserve_price": price, 171 | "duration_days": duration_days, 172 | "private": private, 173 | } 174 | 175 | if description != "": 176 | params["description"] = description 177 | 178 | data = await self.http.list_item(parameters=params) 179 | return Listing(data=data) 180 | 181 | async def unlist_item(self, listing_id: int): 182 | data = await self.http.unlist_item(listing_id=listing_id) 183 | return data 184 | -------------------------------------------------------------------------------- /csfloat/listing.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023-present PaxxPatriot 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | """ 24 | 25 | import datetime 26 | from typing import Any, Dict, Optional 27 | 28 | from .enums import ListingType 29 | from .item import Item, Reference 30 | from .user import User 31 | 32 | __all__ = ( 33 | "TopBid", 34 | "AuctionDetails", 35 | "Listing", 36 | ) 37 | 38 | 39 | class TopBid: 40 | """Represents the top bid.""" 41 | 42 | __slots__ = ( 43 | "_bid_id", 44 | "_created_at", 45 | "_price", 46 | "_contract_id", 47 | "_state", 48 | "_obfuscated_buyer_id", 49 | ) 50 | 51 | def __init__(self, *, data: Dict[str, Any]) -> None: 52 | self._bid_id = data.get("id", "") 53 | self._created_at = data.get("created_at", "1970-01-01T00:00:00.000000Z") 54 | self._price = data.get("price", "") 55 | self._contract_id = data.get("contract_id", 0) 56 | self._state = data.get("state", "") 57 | self._obfuscated_buyer_id = data.get("obfuscated_buyer_id", 0) 58 | 59 | def __repr__(self) -> str: 60 | return f"TopBid(data={{'id': {self._bid_id!r}, 'created_at': {self._created_at!r}, 'price': {self._price!r}, 'contract_id': {self._contract_id!r}, 'state': {self._state!r}, 'obfuscated_buyer_id': {self._obfuscated_buyer_id!r}}})" 61 | 62 | @property 63 | def bid_id(self) -> str: 64 | return self._bid_id 65 | 66 | @property 67 | def created_at(self) -> datetime.datetime: 68 | """:class:`datetime.datetime`: Returns the created at of the item.""" 69 | return datetime.datetime.fromisoformat(self._created_at) 70 | 71 | @property 72 | def price(self) -> float: 73 | """:class:`float`: Returns the price of the item in USD.""" 74 | return self._price / 100 75 | 76 | @property 77 | def contract_id(self) -> str: 78 | return self._contract_id 79 | 80 | @property 81 | def state(self) -> str: 82 | return self._state 83 | 84 | @property 85 | def obfuscated_buyer_id(self) -> str: 86 | return self._obfuscated_buyer_id 87 | 88 | 89 | class AuctionDetails: 90 | """Represents the auction details.""" 91 | 92 | __slots__ = ( 93 | "_reserve_price", 94 | "_top_bid", 95 | "_expires_at", 96 | "_min_next_bid", 97 | ) 98 | 99 | def __init__(self, *, data: Dict[str, Any]) -> None: 100 | self._reserve_price = data.get("reserve_price", 0.0) 101 | self._top_bid = data.get("top_bid") 102 | self._expires_at = data.get("expires_at", "1970-01-01T00:00:00.000000Z") 103 | self._min_next_bid = data.get("min_next_bid", 0.0) 104 | 105 | def __repr__(self) -> str: 106 | return f"AuctionDetails(data={{'reserve_price': {self._reserve_price!r}, 'top_bid': {self._top_bid!r}, 'expires_at': {self._expires_at!r}, 'min_next_bid': {self._min_next_bid!r}}})" 107 | 108 | @property 109 | def reserve_price(self) -> float: 110 | return self._reserve_price / 100 111 | 112 | @property 113 | def top_bid(self) -> TopBid: 114 | return TopBid(data=self._top_bid) 115 | 116 | @property 117 | def expires_at(self) -> datetime.datetime: 118 | return datetime.datetime.fromisoformat(self._expires_at) 119 | 120 | @property 121 | def min_next_bid(self) -> float: 122 | return self._min_next_bid / 100 123 | 124 | 125 | class Listing: 126 | """Represents a listing.""" 127 | 128 | __slots__ = ( 129 | "_listing_id", 130 | "_created_at", 131 | "_description", 132 | "_type", 133 | "_price", 134 | "_state", 135 | "_seller", 136 | "_reference", 137 | "_item", 138 | "_is_seller", 139 | "_min_offer_price", 140 | "_max_offer_discount", 141 | "_is_watchlisted", 142 | "_watchers", 143 | "_auction_details", 144 | ) 145 | 146 | def __init__(self, *, data: Dict[str, Any]) -> None: 147 | self._listing_id = data.get("id", "") 148 | self._created_at = data.get("created_at", "1970-01-01T00:00:00.000000Z") 149 | self._description = data.get("description", None) 150 | self._type = data.get("type", "") 151 | self._price = data.get("price", 0) 152 | self._state = data.get("state", "") 153 | self._seller = data.get("seller") 154 | self._reference = data.get("reference") 155 | self._item = data.get("item") 156 | self._is_seller = data.get("is_seller", False) 157 | self._min_offer_price = data.get("min_offer_price", None) 158 | self._max_offer_discount = data.get("max_offer_discount", None) 159 | self._is_watchlisted = data.get("is_watchlisted", False) 160 | self._watchers = data.get("watchers", 0) 161 | self._auction_details = data.get("auction_details", None) 162 | 163 | def __repr__(self) -> str: 164 | return f"Listing(data={{'id': {self._listing_id!r}, 'created_at': {self._created_at!r}, 'description': {self._description!r}, 'type': {self._type!r}, 'price': {self._price!r}, 'state': {self._state!r}, 'seller': {self._seller!r}, 'reference': {self._reference!r}, 'item': {self._item!r}, 'is_seller': {self._is_seller!r}, 'min_offer_price': {self._min_offer_price!r}, 'max_offer_discount': {self._max_offer_discount!r}, 'is_watchlisted': {self._is_watchlisted!r}, 'watchers': {self._watchers!r}, 'auction_details': {self._auction_details!r}}})" 165 | 166 | @property 167 | def listing_id(self) -> str: 168 | """:class:`str`: Returns the ID of the item.""" 169 | return self._listing_id 170 | 171 | @property 172 | def created_at(self) -> datetime.datetime: 173 | """:class:`datetime.datetime`: Returns the created at of the item.""" 174 | return datetime.datetime.fromisoformat(self._created_at) 175 | 176 | @property 177 | def description(self) -> Optional[str]: 178 | """Optional[:class:`str`]: Returns the description of the listing.""" 179 | return self._description 180 | 181 | @property 182 | def type(self) -> ListingType: 183 | """:class:`ListingType`: Returns the type of listing of the item.""" 184 | return ListingType(self._type) 185 | 186 | @property 187 | def price(self) -> float: 188 | """:class:`float`: Returns the price of the item in USD.""" 189 | return self._price / 100 190 | 191 | @property 192 | def state(self) -> str: 193 | """:class:`str`: Returns the state of the item.""" 194 | return self._state 195 | 196 | @property 197 | def seller(self) -> User: 198 | """Returns the seller of the item.""" 199 | return User(data=self._seller) 200 | 201 | @property 202 | def reference(self) -> Reference: 203 | """Returns the reference of the item.""" 204 | return Reference(data=self._reference) 205 | 206 | @property 207 | def item(self) -> Item: 208 | """Returns the item.""" 209 | return Item(data=self._item) 210 | 211 | @property 212 | def is_seller(self) -> bool: 213 | """:class:`bool`: Returns whether the current user is the seller of the item.""" 214 | return self._is_seller 215 | 216 | @property 217 | def min_offer_price(self) -> Optional[float]: 218 | """:class:`float`: Returns the minimum price you have to offer.""" 219 | return self._min_offer_price / 100 if self._min_offer_price else None 220 | 221 | @property 222 | def max_offer_discount(self) -> Optional[float]: 223 | """:class:`float`: Returns the max discount in percent.""" 224 | return self._max_offer_discount / 10_000 if self._max_offer_discount else None 225 | 226 | @property 227 | def is_watchlisted(self) -> bool: 228 | """:class:`bool`: Returns whether the item is watchlisted.""" 229 | return self._is_watchlisted 230 | 231 | @property 232 | def watchers(self) -> int: 233 | """:class:`int`: Returns the number of watchers for the item.""" 234 | return self._watchers 235 | 236 | @property 237 | def auction_details(self) -> Optional[AuctionDetails]: 238 | """:class:`AuctionDetails`: Returns the details of the auction, if the listing is an auction.""" 239 | return AuctionDetails(data=self._auction_details) if self._auction_details else None 240 | -------------------------------------------------------------------------------- /csfloat/user.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023-present PaxxPatriot 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | """ 24 | 25 | __all__ = ( 26 | "FirebaseMessaging", 27 | "PaymentAccounts", 28 | "UserStatistics", 29 | "AuthenticatedUserStatistics", 30 | "UserPreferences", 31 | "User", 32 | "AuthenticatedUser", 33 | ) 34 | 35 | import datetime 36 | from typing import Any, Dict, List, Optional 37 | 38 | 39 | class FirebaseMessaging: 40 | __slots__ = ( 41 | "_platform", 42 | "_last_updated", 43 | ) 44 | 45 | def __init__(self, *, data: Dict[str, Any]) -> None: 46 | self._platform = data.get("platform", None) 47 | self._last_updated = data.get("last_updated", None) 48 | 49 | def __repr__(self) -> str: 50 | return f"FirebaseMessaging(data={{'platform': {self._platform!r}, 'last_updated': {self._last_updated!r}}})" 51 | 52 | @property 53 | def platform(self) -> Optional[str]: 54 | return self._platform 55 | 56 | @property 57 | def last_update(self) -> Optional[datetime.datetime]: 58 | return datetime.datetime.fromisoformat(self._last_updated) if self._last_updated is not None else None 59 | 60 | 61 | class PaymentAccounts: 62 | __slots__ = ( 63 | "_stripe_connect", 64 | "_stripe_customer", 65 | ) 66 | 67 | def __init__(self, *, data: Dict[str, Any]) -> None: 68 | self._stripe_connect = data.get("stripe_connect", "") 69 | self._stripe_customer = data.get("stripe_customer", "") 70 | 71 | def __repr__(self) -> str: 72 | return f"PaymentAccounts(data={{'stripe_connect': {self._stripe_connect!r}, 'stripe_customer': {self._stripe_customer!r}}})" 73 | 74 | @property 75 | def stripe_connect(self) -> str: 76 | """:class:`str`: Returns Stripe account ID.""" 77 | return self._stripe_connect 78 | 79 | @property 80 | def stripe_customer(self) -> str: 81 | """:class:`str`: Returns Stripe customer ID.""" 82 | return self._stripe_customer 83 | 84 | 85 | class UserStatistics: 86 | __slots__ = ( 87 | "_median_trade_time", 88 | "_total_avoided_trades", 89 | "_total_failed_trades", 90 | "_total_trades", 91 | "_total_verified_trades", 92 | ) 93 | 94 | def __init__(self, *, data: Dict[str, Any]) -> None: 95 | self._median_trade_time = data.get("median_trade_time", 0) 96 | self._total_avoided_trades = data.get("total_avoided_trades", 0) 97 | self._total_failed_trades = data.get("total_failed_trades", 0) 98 | self._total_trades = data.get("total_trades", 0) 99 | self._total_verified_trades = data.get("total_verified_trades", 0) 100 | 101 | def __repr__(self) -> str: 102 | return f"UserStatistics(data={{'median_trade_time': {self._median_trade_time!r}, 'total_avoided_trades': {self._total_avoided_trades!r}, 'total_failed_trades': {self._total_failed_trades!r}, 'total_trades': {self._total_trades!r}, 'total_verified_trades': {self._total_verified_trades!r}}})" 103 | 104 | @property 105 | def median_trade_time(self) -> int: 106 | """:class:`int`: Returns the median trade time of the seller in seconds.""" 107 | return self._median_trade_time 108 | 109 | @property 110 | def total_avoided_trades(self) -> int: 111 | """:class:`int`: Returns the number of avoided trades of the seller.""" 112 | return self._total_avoided_trades 113 | 114 | @property 115 | def total_failed_trades(self) -> int: 116 | """:class:`int`: Returns the number of failed trades of the seller.""" 117 | return self._total_failed_trades 118 | 119 | @property 120 | def total_trades(self) -> int: 121 | """:class:`int`: Returns the number of trades of the seller.""" 122 | return self._total_trades 123 | 124 | @property 125 | def total_verified_trades(self) -> int: 126 | """:class:`int`: Returns the number of verified trades of the seller.""" 127 | return self._total_verified_trades 128 | 129 | 130 | class AuthenticatedUserStatistics(UserStatistics): 131 | __slots__ = ( 132 | "_total_sales", 133 | "_total_purchases", 134 | ) 135 | 136 | def __init__(self, data: Dict[str, Any]) -> None: 137 | super().__init__(data=data) 138 | self._total_sales = data.get("total_sales", 0) 139 | self._total_purchases = data.get("total_purchases", 0) 140 | 141 | def __repr__(self) -> str: 142 | return f"AuthenticatedUserStatistics(data={{'median_trade_time': {self._median_trade_time!r}, 'total_avoided_trades': {self._total_avoided_trades!r}, 'total_failed_trades': {self._total_failed_trades!r}, 'total_trades': {self._total_trades!r}, 'total_verified_trades': {self._total_verified_trades!r}, 'total_sales': {self._total_sales!r}, 'total_purchases': {self._total_purchases!r}}})" 143 | 144 | @property 145 | def total_sales(self) -> float: 146 | """:class:`float`: Returns the figure of total sales in USD.""" 147 | return self._total_sales / 100 148 | 149 | @property 150 | def total_purchases(self) -> float: 151 | """:class:`float`: Returns the figure of total purchases in USD.""" 152 | return self._total_purchases / 100 153 | 154 | 155 | class UserPreferences: 156 | __slots__ = ( 157 | "_offers_enabled", 158 | "_max_offer_discount", 159 | ) 160 | 161 | def __init__(self, *, data: Dict[str, Any]) -> None: 162 | self._offers_enabled = data.get("offers_enabled", True) 163 | self._max_offer_discount = data.get("max_offer_discount", 0) 164 | 165 | def __repr__(self) -> str: 166 | return f"UserPreferences(data={{'offers_enabled': {self._offers_enabled!r}, 'max_offer_discount': {self._max_offer_discount!r}}})" 167 | 168 | @property 169 | def offers_enabled(self) -> bool: 170 | """:class:`bool`: Returns if bargaining is enabled.""" 171 | return self._offers_enabled 172 | 173 | @property 174 | def max_offer_discount(self) -> float: 175 | """:class:`float`: Returns the maximum discount in percent which is set when bargaining is enabled.""" 176 | return self._max_offer_discount / 100 177 | 178 | 179 | class User: 180 | __slots__ = ( 181 | "_avatar", 182 | "_away", 183 | "_flags", 184 | "_obfuscated_id", 185 | "_has_valid_steam_api_key", 186 | "_online", 187 | "_stall_public", 188 | "_statistics", 189 | "_steam_id", 190 | "_username", 191 | "_verification_mode", 192 | ) 193 | 194 | def __init__(self, *, data: Dict[str, Any]) -> None: 195 | self._avatar = data.get("avatar", None) 196 | self._away = data.get("away", False) 197 | self._flags = data.get("flags") 198 | self._obfuscated_id = data.get("obfuscated_id", None) 199 | self._has_valid_steam_api_key = data.get("has_valid_steam_api_key", False) 200 | self._online = data.get("online", False) 201 | self._stall_public = data.get("stall_public", False) 202 | self._statistics = data.get("statistics") 203 | self._steam_id = data.get("steam_id", None) 204 | self._username = data.get("username", None) 205 | self._verification_mode = data.get("verification_mode", None) 206 | 207 | def __repr__(self) -> str: 208 | return f"User(data={{'avatar': {self._avatar!r}, 'away': {self._away!r}, 'flags': {self._flags!r}, 'obfuscated_id': {self._obfuscated_id!r}, 'has_valid_steam_api_key': {self._has_valid_steam_api_key!r}, 'online': {self._online!r}, 'stall_public': {self._stall_public!r}, 'statistics': {self._statistics!r}, 'steam_id': {self._steam_id!r}, 'username': {self._username!r}, 'verification_mode': {self._verification_mode!r}}})" 209 | 210 | @property 211 | def avatar(self) -> Optional[str]: 212 | """Optional[:class:`str`]: Returns the URL to the avatar of the seller.""" 213 | return self._avatar 214 | 215 | @property 216 | def away(self) -> bool: 217 | """:class:`bool`: Returns the away status of the seller.""" 218 | return self._away 219 | 220 | @property 221 | def flags(self) -> int: 222 | """:class:`int`: Returns the flags of the seller.""" 223 | return self._flags 224 | 225 | @property 226 | def obfuscated_id(self) -> Optional[str]: 227 | """Optional[:class:`str`]: Returns the obfuscated ID of the seller.""" 228 | return self._obfuscated_id 229 | 230 | @property 231 | def has_valid_steam_api_key(self) -> bool: 232 | """:class:`bool`: Returns the validity of the Steam API key of the seller.""" 233 | return self._has_valid_steam_api_key 234 | 235 | @property 236 | def online(self) -> bool: 237 | """:class:`bool`: Returns the online status of the seller.""" 238 | return self._online 239 | 240 | @property 241 | def stall_public(self) -> bool: 242 | """:class:`bool`: Returns the public stall status of the seller.""" 243 | return self._stall_public 244 | 245 | @property 246 | def statistics(self) -> UserStatistics: 247 | """:class:`Any`: Returns the statistics of the seller.""" 248 | return UserStatistics(data=self._statistics) 249 | 250 | @property 251 | def steam_id(self) -> Optional[str]: 252 | """Optional[:class:`str`]: Returns the Steam ID of the seller.""" 253 | return self._steam_id 254 | 255 | @property 256 | def username(self) -> Optional[str]: 257 | """Optional[:class:`str`]: Returns the username of the seller.""" 258 | return self._username 259 | 260 | @property 261 | def verification_mode(self) -> Optional[str]: 262 | """Optional[:class:`str`]: Returns the verification mode of the seller.""" 263 | return self._verification_mode 264 | 265 | 266 | class AuthenticatedUser(User): 267 | __slots__ = ( 268 | "_background_url", 269 | "_email", 270 | "_balance", 271 | "_pending_balance", 272 | "_trade_token", 273 | "_payment_accounts", 274 | "_api_key", 275 | "_statistics", 276 | "_preferences", 277 | "_know_your_customer", 278 | "_obfuscated_id", 279 | "_fee", 280 | "_withdraw_fee", 281 | "_subscriptions", 282 | "_has_2fa", 283 | "_extension_setup_at", 284 | "_firebase_messaging", 285 | "_stripe_connect", 286 | "_has_api_key", 287 | ) 288 | 289 | def __init__(self, *, data: Dict[str, Any]) -> None: 290 | super().__init__(data=data) 291 | self._background_url = data.get("background_url", "") 292 | self._email = data.get("email", "") 293 | self._balance = data.get("balance", 0) 294 | self._pending_balance = data.get("pending_balance", 0) 295 | self._trade_token = data.get("trade_token", "") 296 | self._payment_accounts = data.get("payment_accounts", None) 297 | self._api_key = data.get("api_key") 298 | self._statistics = data.get("statistics", None) 299 | self._preferences = data.get("preferences", None) 300 | self._know_your_customer = data.get("know_your_customer", "") 301 | self._obfuscated_id = data.get("obfuscated_id", "") 302 | self._fee = data.get("fee", 0.0) 303 | self._withdraw_fee = data.get("withdraw_fee", 0.0) 304 | self._subscriptions = data.get("subscriptions", []) 305 | self._has_2fa = data.get("has_2fa", False) 306 | self._extension_setup_at = data.get("extension_setup_at", "1970-01-01T00:00:00.000000Z") 307 | self._firebase_messaging = data.get("firebase_messaging") 308 | self._stripe_connect = data.get("stripe_connect") 309 | self._has_api_key = data.get("has_api_key", False) 310 | 311 | def __repr__(self) -> str: 312 | return f"AuthenticatedUser(data={{'avatar': {self._avatar!r}, 'away': {self._away!r}, 'flags': {self._flags!r}, 'obfuscated_id': {self._obfuscated_id!r}, 'has_valid_steam_api_key': {self._has_valid_steam_api_key!r}, 'online': {self._online!r}, 'stall_public': {self._stall_public!r}, 'statistics': {self._statistics!r}, 'steam_id': {self._steam_id!r}, 'username': {self._username!r}, 'verification_mode': {self._verification_mode!r}, 'background_url': {self._background_url!r}, 'email': {self._email!r}, 'balance': {self._balance!r}, 'pending_balance': {self._pending_balance!r}, 'trade_token': {self._trade_token!r}, 'payment_accounts': {self._payment_accounts!r}, 'api_key': {self._api_key!r}, 'preferences': {self._preferences!r}, 'know_your_customer': {self._know_your_customer!r}, 'fee': {self._fee!r}, 'withdraw_fee': {self._withdraw_fee!r}, 'subscriptions': {self._subscriptions!r}, 'has_2fa': {self._has_2fa!r}, 'extension_setup_at': {self._extension_setup_at!r}, 'firebase_messaging': {self._firebase_messaging!r}, 'stripe_connect': {self._stripe_connect!r}, 'has_api_key': {self._has_api_key!r}}})" 313 | 314 | @property 315 | def background_url(self) -> str: 316 | """:class:`Any`: Returns the background URL of the user.""" 317 | return self._background_url 318 | 319 | @property 320 | def email(self) -> str: 321 | """:class:`Any`: Returns the email of the user.""" 322 | return self._email 323 | 324 | @property 325 | def balance(self) -> float: 326 | """:class:`Any`: Returns the balance of the user.""" 327 | return self._balance / 100 328 | 329 | @property 330 | def pending_balance(self) -> float: 331 | """:class:`Any`: Returns the pending balance of the user.""" 332 | return self._pending_balance / 100 333 | 334 | @property 335 | def trade_token(self) -> str: 336 | """:class:`Any`: Returns the trade token of the user.""" 337 | return self._trade_token 338 | 339 | @property 340 | def payment_accounts(self) -> PaymentAccounts: 341 | """:class:`Any`: Returns the payment accounts of the user.""" 342 | return PaymentAccounts(data=self._payment_accounts) 343 | 344 | @property 345 | def api_key(self) -> Optional[str]: 346 | """Optional[:class:`str`]: Returns the API key of the user.""" 347 | return self._api_key 348 | 349 | @property 350 | def statistics(self) -> AuthenticatedUserStatistics: 351 | """:class:`AuthenticatedUserStatistics`: Returns the statistics of the user.""" 352 | return AuthenticatedUserStatistics(data=self._statistics) 353 | 354 | @property 355 | def preferences(self) -> UserPreferences: 356 | """:class:`UserPreferences`: Returns the preferences of the user.""" 357 | return UserPreferences(data=self._preferences) 358 | 359 | @property 360 | def know_your_customer(self) -> str: 361 | """:class:`Any`: Returns the know your customer information of the user.""" 362 | return self._know_your_customer 363 | 364 | @property 365 | def obfuscated_id(self) -> str: 366 | """:class:`Any`: Returns the obfuscated ID of the user.""" 367 | return self._obfuscated_id 368 | 369 | @property 370 | def fee(self) -> float: 371 | """:class:`Any`: Returns the fee of the user.""" 372 | return self._fee 373 | 374 | @property 375 | def withdraw_fee(self) -> float: 376 | """:class:`Any`: Returns the withdraw fee of the user.""" 377 | return self._withdraw_fee 378 | 379 | @property 380 | def subscriptions(self) -> List[str]: 381 | """:class:`Any`: Returns the subscriptions of the user.""" 382 | return self._subscriptions 383 | 384 | @property 385 | def has_2fa(self) -> bool: 386 | """:class:`Any`: Returns the 2FA status of the user.""" 387 | return self._has_2fa 388 | 389 | @property 390 | def extension_setup_at(self) -> datetime.datetime: 391 | """:class:`datetime.datetime`: Returns the date and time when the CSFloat extension was set up.""" 392 | return datetime.datetime.fromisoformat(self._extension_setup_at) 393 | 394 | @property 395 | def firebase_messaging(self) -> FirebaseMessaging: 396 | return FirebaseMessaging(data=self._firebase_messaging) 397 | 398 | @property 399 | def stripe_connect(self) -> Dict[str, bool]: 400 | return self._stripe_connect 401 | 402 | @property 403 | def has_api_key(self) -> bool: 404 | return self._has_api_key 405 | -------------------------------------------------------------------------------- /csfloat/item.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023-present PaxxPatriot 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | """ 24 | 25 | import datetime 26 | from typing import Any, Dict, List, Optional 27 | from .enums import Rarity 28 | 29 | __all__ = ( 30 | "FadeInfo", 31 | "AttachmentReference", 32 | "Reference", 33 | "Keychain", 34 | "Sticker", 35 | "Item", 36 | ) 37 | 38 | 39 | class FadeInfo: 40 | __slots__ = ( 41 | "_seed", 42 | "_percentage", 43 | "_rank", 44 | ) 45 | 46 | def __init__(self, *, data: Dict[str, Any]) -> None: 47 | self._seed = data.get("seed") 48 | self._percentage = data.get("percentage") 49 | self._rank = data.get("rank") 50 | 51 | def __repr__(self) -> str: 52 | return f"FadeInfo(data={{'seed': {self._seed!r}, 'percentage': {self._percentage!r}, 'rank': {self._rank!r}}})" 53 | 54 | @property 55 | def seed(self) -> int: 56 | return self._seed 57 | 58 | @property 59 | def percentage(self) -> float: 60 | return self._percentage 61 | 62 | @property 63 | def rank(self) -> int: 64 | return self._rank 65 | 66 | 67 | class AttachmentReference: 68 | __slots__ = ( 69 | "_price", 70 | "_quantity", 71 | "_updated_at", 72 | ) 73 | 74 | def __init__(self, *, data: Dict[str, Any]) -> None: 75 | self._price = data.get("price") 76 | self._quantity = data.get("quantity") 77 | self._updated_at = data.get("updated_at", "1970-01-01T00:00:00.000000Z") 78 | 79 | def __repr__(self) -> str: 80 | return f"AttachmentReference(data={{'price': {self._price!r}, 'quantity': {self._quantity!r}, 'updated_at': {self._updated_at!r}}})" 81 | 82 | @property 83 | def price(self) -> float: 84 | return self._price / 100 85 | 86 | @property 87 | def quantity(self) -> int: 88 | return self._quantity 89 | 90 | @property 91 | def updated_at(self) -> datetime.datetime: 92 | return datetime.datetime.fromisoformat(self._updated_at) 93 | 94 | 95 | class Reference: 96 | __slots__ = ( 97 | "_base_price", 98 | "_float_factor", 99 | "_predicted_price", 100 | "_quantity", 101 | "_last_updated", 102 | ) 103 | 104 | def __init__(self, *, data: Dict[str, Any]) -> None: 105 | self._base_price = data.get("base_price") 106 | self._float_factor = data.get("float_factor", 1.0) 107 | self._predicted_price = data.get("predicted_price") 108 | self._quantity = data.get("quantity") 109 | self._last_updated = data.get("last_updated", "1970-01-01T00:00:00.000000Z") 110 | 111 | def __repr__(self) -> str: 112 | return f"Reference(data={{'base_price': {self._base_price!r}, 'float_factor': {self._float_factor!r}, 'predicted_price': {self._predicted_price!r}, 'quantity': {self._quantity!r}, 'last_updated': {self._last_updated!r}}})" 113 | 114 | @property 115 | def base_price(self) -> float: 116 | """:class:`float`: Returns the base price of the reference.""" 117 | return self._base_price / 100 118 | 119 | @property 120 | def predicted_price(self) -> float: 121 | """:class:`float`: Returns the predicted price of the reference.""" 122 | return self._predicted_price / 100 123 | 124 | @property 125 | def quantity(self) -> int: 126 | """:class:`int`: Returns the quantity of the reference.""" 127 | return self._quantity 128 | 129 | @property 130 | def last_updated(self) -> datetime.datetime: 131 | """:class:`datetime.datetime`: Returns the last updated timestamp of the reference.""" 132 | return datetime.datetime.fromisoformat(self._last_updated) 133 | 134 | 135 | class Keychain: 136 | __slots__ = ( 137 | "_sticker_id", 138 | "_slot", 139 | "_offset_x", 140 | "_offset_y", 141 | "_offset_z", 142 | "_pattern", 143 | "_icon_url", 144 | "_name", 145 | "_reference", 146 | ) 147 | 148 | def __init__(self, *, data: Dict[str, Any]) -> None: 149 | self._sticker_id = data.get("stickerId") 150 | self._slot = data.get("slot") 151 | self._offset_x = data.get("offset_x") 152 | self._offset_y = data.get("offset_y") 153 | self._offset_z = data.get("offset_z") 154 | self._pattern = data.get("pattern") 155 | self._icon_url = data.get("icon_url") 156 | self._name = data.get("name") 157 | self._reference = data.get("reference") 158 | 159 | def __repr__(self) -> str: 160 | return f"Keychain(data={{'stickerId': {self._sticker_id!r}, 'slot': {self._slot!r}, 'offset_x': {self._offset_x!r}, 'offset_y': {self._offset_y!r}, 'offset_z': {self._offset_z!r}, 'pattern': {self._pattern!r}, 'icon_url': {self._icon_url!r}, 'name': {self._name!r}, 'reference': {self._reference!r}}})" 161 | 162 | @property 163 | def sticker_id(self) -> int: 164 | return self._sticker_id 165 | 166 | @property 167 | def slot(self) -> int: 168 | return self._slot 169 | 170 | @property 171 | def offset_x(self) -> float: 172 | return self._offset_x 173 | 174 | @property 175 | def offset_y(self) -> float: 176 | return self._offset_y 177 | 178 | @property 179 | def offset_z(self) -> float: 180 | return self._offset_z 181 | 182 | @property 183 | def pattern(self) -> float: 184 | return self._pattern 185 | 186 | @property 187 | def icon_url(self) -> str: 188 | return self._icon_url 189 | 190 | @property 191 | def name(self) -> str: 192 | return self._name 193 | 194 | @property 195 | def reference(self) -> Optional[AttachmentReference]: 196 | return AttachmentReference(data=self._reference) if self._reference else None 197 | 198 | 199 | class Sticker: 200 | __slots__ = ( 201 | "_sticker_id", 202 | "_slot", 203 | "_wear", 204 | "_icon_url", 205 | "_name", 206 | "_reference", 207 | "_offset_x", 208 | "_offset_y", 209 | "_rotation", 210 | ) 211 | 212 | def __init__(self, *, data: Dict[str, Any]) -> None: 213 | self._sticker_id = data.get("stickerId") 214 | self._slot = data.get("slot") 215 | self._wear = data.get("wear", 1.0) 216 | self._icon_url = data.get("icon_url") 217 | self._name = data.get("name") 218 | self._reference = data.get("reference") 219 | self._offset_x = data.get("offset_x") 220 | self._offset_y = data.get("offset_y") 221 | self._rotation = data.get("rotation") 222 | 223 | def __repr__(self) -> str: 224 | return f"Sticker(data={{'stickerId': {self._sticker_id!r}, 'slot': {self._slot!r}, 'wear': {self._wear!r}, 'icon_url': {self._icon_url!r}, 'name': {self._name!r}, 'reference': {self._reference!r}, 'offset_x': {self._offset_x!r}, 'offset_y': {self._offset_y!r}, 'rotation': {self._rotation!r}}})" 225 | 226 | @property 227 | def sticker_id(self) -> int: 228 | return self._sticker_id 229 | 230 | @property 231 | def slot(self) -> int: 232 | return self._slot 233 | 234 | @property 235 | def wear(self) -> float: 236 | return self._wear 237 | 238 | @property 239 | def icon_url(self) -> str: 240 | return self._icon_url 241 | 242 | @property 243 | def name(self) -> str: 244 | return self._name 245 | 246 | @property 247 | def reference(self) -> Optional[AttachmentReference]: 248 | return AttachmentReference(data=self._reference) if self._reference else None 249 | 250 | @property 251 | def offset_x(self) -> float: 252 | return self._offset_x 253 | 254 | @property 255 | def offset_y(self) -> float: 256 | return self._offset_y 257 | 258 | @property 259 | def rotation(self) -> int: 260 | return self._rotation 261 | 262 | 263 | class Item: 264 | __slots__ = ( 265 | "_asset_id", 266 | "_def_index", 267 | "_paint_index", 268 | "_paint_seed", 269 | "_float_value", 270 | "_icon_url", 271 | "_d_param", 272 | "_is_stattrak", 273 | "_is_souvenir", 274 | "_rarity", 275 | "_quality", 276 | "_market_hash_name", 277 | "_stickers", 278 | "_keychains", 279 | "_low_rank", 280 | "_tradable", 281 | "_inspect_link", 282 | "_has_screenshot", 283 | "_cs2_screenshot_id", 284 | "_cs2_screenshot_at", 285 | "_is_commodity", 286 | "_type", 287 | "_rarity_name", 288 | "_type_name", 289 | "_item_name", 290 | "_wear_name", 291 | "_description", 292 | "_collection", 293 | "_serialized_inspect", 294 | "_gs_sig", 295 | "_high_rank", 296 | "_phase", 297 | "_sticker_index", 298 | "_badges", 299 | "_fade", 300 | ) 301 | 302 | def __init__(self, *, data: Dict[str, Any]) -> None: 303 | self._asset_id = data.get("asset_id") 304 | self._def_index = data.get("def_index") 305 | self._paint_index = data.get("paint_index") 306 | self._paint_seed = data.get("paint_seed") 307 | self._float_value = data.get("float_value") 308 | self._icon_url = data.get("icon_url") 309 | self._d_param = data.get("d_param") 310 | self._is_stattrak = data.get("is_stattrak") 311 | self._is_souvenir = data.get("is_souvenir") 312 | self._rarity = data.get("rarity") 313 | self._quality = data.get("quality") 314 | self._market_hash_name = data.get("market_hash_name") 315 | self._stickers = data.get("stickers") 316 | self._keychains = data.get("keychains") 317 | self._low_rank = data.get("low_rank") 318 | self._tradable = data.get("tradable") 319 | self._inspect_link = data.get("inspect_link") 320 | self._has_screenshot = data.get("has_screenshot") 321 | self._cs2_screenshot_id = data.get("cs2_screenshot_id") 322 | self._cs2_screenshot_at = data.get("cs2_screenshot_at") 323 | self._is_commodity = data.get("is_commodity") 324 | self._type = data.get("type") 325 | self._rarity_name = data.get("rarity_name") 326 | self._type_name = data.get("type_name") 327 | self._item_name = data.get("item_name") 328 | self._wear_name = data.get("wear_name") 329 | self._description = data.get("description") 330 | self._collection = data.get("collection") 331 | self._serialized_inspect = data.get("serialized_inspect") 332 | self._gs_sig = data.get("gs_sig") 333 | self._high_rank = data.get("high_rank") 334 | self._phase = data.get("phase") 335 | self._sticker_index = data.get("sticker_index") 336 | self._badges = data.get("badges") 337 | self._fade = data.get("fade") 338 | 339 | def __repr__(self) -> str: 340 | return f"Item(data={{'asset_id': {self._asset_id!r}, 'def_index': {self._def_index!r}, 'paint_index': {self._paint_index!r}, 'paint_seed': {self._paint_seed!r}, 'float_value': {self._float_value!r}, 'icon_url': {self._icon_url!r}, 'd_param': {self._d_param!r}, 'is_stattrak': {self._is_stattrak!r}, 'is_souvenir': {self._is_souvenir!r}, 'rarity': {self._rarity!r}, 'quality': {self._quality!r}, 'market_hash_name': {self._market_hash_name!r}, 'stickers': {self._stickers!r}, 'keychains': {self._keychains!r}, 'low_rank': {self._low_rank!r}, 'tradable': {self._tradable!r}, 'inspect_link': {self._inspect_link!r}, 'has_screenshot': {self._has_screenshot!r}, 'cs2_screenshot_id': {self._cs2_screenshot_id!r}, 'cs2_screenshot_at': {self._cs2_screenshot_at!r}, 'is_commodity': {self._is_commodity!r}, 'type': {self._type!r}, 'rarity_name': {self._rarity_name!r}, 'type_name': {self._type_name!r}, 'item_name': {self._item_name!r}, 'wear_name': {self._wear_name!r}, 'description': {self._description!r}, 'collection': {self._collection!r}, 'serialized_inspect': {self._serialized_inspect!r}, 'gs_sig': {self._gs_sig!r}, 'high_rank': {self._high_rank!r}, 'phase': {self._phase!r}, 'sticker_index': {self._sticker_index!r}, 'badges': {self._badges!r}, 'fade': {self._fade!r}}})" 341 | 342 | @property 343 | def asset_id(self) -> str: 344 | """:class:`str`: Returns the asset ID of the item.""" 345 | return self._asset_id 346 | 347 | @property 348 | def def_index(self) -> int: 349 | """:class:`int`: Returns the def index of the item.""" 350 | return self._def_index 351 | 352 | @property 353 | def paint_index(self) -> Optional[int]: 354 | """Optional[:class:`int`]: Returns the paint index of the item.""" 355 | return self._paint_index 356 | 357 | @property 358 | def paint_seed(self) -> Optional[int]: 359 | """Optional[:class:`int`]: Returns the paint seed of the item.""" 360 | return self._paint_seed 361 | 362 | @property 363 | def float_value(self) -> Optional[float]: 364 | """Optional[:class:`float`]: Returns the float value of the item.""" 365 | return self._float_value 366 | 367 | @property 368 | def icon_url(self) -> str: 369 | """:class:`str`: Returns the icon URL of the item.""" 370 | return f"https://community.cloudflare.steamstatic.com/economy/image/{self._icon_url}" 371 | 372 | @property 373 | def d_param(self) -> str: 374 | """:class:`str`: Returns the d param of the item.""" 375 | return self._d_param 376 | 377 | @property 378 | def is_stattrak(self) -> bool: 379 | """:class:`bool`: Returns the stattrak status of the item.""" 380 | return self._is_stattrak 381 | 382 | @property 383 | def is_souvenir(self) -> bool: 384 | """:class:`bool`: Returns the souvenir status of the item.""" 385 | return self._is_souvenir 386 | 387 | @property 388 | def rarity(self) -> Rarity: 389 | """:class:`Rarity`: Returns the rarity of the item.""" 390 | return Rarity(self._rarity) 391 | 392 | @property 393 | def quality(self) -> int: 394 | """:class:`int`: Returns the quality of the item.""" 395 | return self._quality 396 | 397 | @property 398 | def market_hash_name(self) -> str: 399 | """:class:`str`: Returns the market hash name of the item.""" 400 | return self._market_hash_name 401 | 402 | @property 403 | def stickers(self) -> Optional[List[Sticker]]: 404 | """Optional[:class:`List` of :class:`Sticker`]: Returns the attached stickers of the item.""" 405 | return [Sticker(data=sticker) for sticker in self._stickers] if self._stickers is not None else None 406 | 407 | @property 408 | def keychains(self) -> Optional[List[Keychain]]: 409 | """Optional[:class:`List` of :class:`Keychain`]: Returns the attached keychains of the item.""" 410 | return [Keychain(data=keychain) for keychain in self._keychains] if self._keychains is not None else None 411 | 412 | @property 413 | def low_rank(self) -> Optional[int]: 414 | """Optional[:class:`int`]: Returns the rank in FloatDB of the item.""" 415 | return self._low_rank 416 | 417 | @property 418 | def tradable(self) -> int: 419 | """:class:`int`: Returns the tradable status of the item.""" 420 | return self._tradable 421 | 422 | @property 423 | def inspect_link(self) -> str: 424 | """:class:`str`: Returns the inspect link of the item.""" 425 | return self._inspect_link 426 | 427 | @property 428 | def has_screenshot(self) -> bool: 429 | """:class:`bool`: Returns the screenshot status of the item.""" 430 | return self._has_screenshot 431 | 432 | @property 433 | def cs2_screenshot_id(self) -> Optional[str]: 434 | """Optional[:class:`str`]: Returns the CS2 screenshot ID.""" 435 | return self._cs2_screenshot_id 436 | 437 | @property 438 | def cs2_screenshot_at(self) -> Optional[datetime.datetime]: 439 | """Optional[:class:`datetime.datetime`]: Returns timestamp of when the CS2 screenshot was taken.""" 440 | return datetime.datetime.fromisoformat(self._cs2_screenshot_at) if self._cs2_screenshot_at is not None else None 441 | 442 | @property 443 | def is_commodity(self) -> bool: 444 | """:class:`bool`: Returns the commodity status of the item.""" 445 | return self._is_commodity 446 | 447 | @property 448 | def type(self) -> str: 449 | """:class:`str`: Returns the type of the item.""" 450 | return self._type 451 | 452 | @property 453 | def rarity_name(self) -> str: 454 | """:class:`str`: Returns the rarity name of the item.""" 455 | return self._rarity_name 456 | 457 | @property 458 | def type_name(self) -> str: 459 | """:class:`str`: Returns the type name of the item.""" 460 | return self._type_name 461 | 462 | @property 463 | def item_name(self) -> str: 464 | """:class:`str`: Returns the item name of the item.""" 465 | return self._item_name 466 | 467 | @property 468 | def wear_name(self) -> Optional[str]: 469 | """Optional[:class:`str`]: Returns the wear name of the item.""" 470 | return self._wear_name 471 | 472 | @property 473 | def description(self) -> Optional[str]: 474 | """Optional[:class:`str`]: Returns the description of the item.""" 475 | return self._description 476 | 477 | @property 478 | def collection(self) -> Optional[str]: 479 | """Optional[:class:`str`]: Returns the collection of the item.""" 480 | return self._collection 481 | 482 | @property 483 | def serialized_inspect(self) -> str: 484 | return self._serialized_inspect 485 | 486 | @property 487 | def gs_sig(self) -> str: 488 | return self._gs_sig 489 | 490 | @property 491 | def high_rank(self) -> Optional[int]: 492 | """Optional[:class:`int`]: Returns the rank in the CSFloat float database.""" 493 | return self._high_rank 494 | 495 | @property 496 | def phase(self) -> Optional[str]: 497 | """Optional[:class:`str`]: Returns the Doppler or Gamma Doppler phase of the item.""" 498 | return self._phase 499 | 500 | @property 501 | def sticker_index(self) -> Optional[str]: 502 | """Optional[:class:`str`]: Returns the index if the item is a sticker.""" 503 | return self._sticker_index 504 | 505 | @property 506 | def badges(self) -> Optional[List[str]]: 507 | """Optional[List[:class:`str`]]: Returns a list of badges.""" 508 | return self._badges 509 | 510 | @property 511 | def fade(self) -> Optional[FadeInfo]: 512 | """Optional[:class:`FadeInfo`]: Returns the info about the fading of the item.""" 513 | return FadeInfo(data=self._fade) if self._fade is not None else None 514 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "4bd659daa1484cbd98dc1c49c2438782785f809d8c30569c84b2ecec0d6574cd" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.12" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "aiohappyeyeballs": { 20 | "hashes": [ 21 | "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", 22 | "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" 23 | ], 24 | "markers": "python_version >= '3.9'", 25 | "version": "==2.6.1" 26 | }, 27 | "aiohttp": { 28 | "hashes": [ 29 | "sha256:010cc9bbd06db80fe234d9003f67e97a10fe003bfbedb40da7d71c1008eda0fe", 30 | "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645", 31 | "sha256:098e92835b8119b54c693f2f88a1dec690e20798ca5f5fe5f0520245253ee0af", 32 | "sha256:0a146708808c9b7a988a4af3821379e379e0f0e5e466ca31a73dbdd0325b0263", 33 | "sha256:0a23918fedc05806966a2438489dcffccbdf83e921a1170773b6178d04ade142", 34 | "sha256:0c643f4d75adea39e92c0f01b3fb83d57abdec8c9279b3078b68a3a52b3933b6", 35 | "sha256:1004e67962efabbaf3f03b11b4c43b834081c9e3f9b32b16a7d97d4708a9abe6", 36 | "sha256:14954a2988feae3987f1eb49c706bff39947605f4b6fa4027c1d75743723eb09", 37 | "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84", 38 | "sha256:2776c7ec89c54a47029940177e75c8c07c29c66f73464784971d6a81904ce9d1", 39 | "sha256:2abbb216a1d3a2fe86dbd2edce20cdc5e9ad0be6378455b05ec7f77361b3ab50", 40 | "sha256:2c7d81a277fa78b2203ab626ced1487420e8c11a8e373707ab72d189fcdad20a", 41 | "sha256:2ce13fcfb0bb2f259fb42106cdc63fa5515fb85b7e87177267d89a771a660b79", 42 | "sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c", 43 | "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd", 44 | "sha256:3b6f0af863cf17e6222b1735a756d664159e58855da99cfe965134a3ff63b0b0", 45 | "sha256:3bdd6e17e16e1dbd3db74d7f989e8af29c4d2e025f9828e6ef45fbdee158ec75", 46 | "sha256:3beb14f053222b391bf9cf92ae82e0171067cc9c8f52453a0f1ec7c37df12a77", 47 | "sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c", 48 | "sha256:3ead1c00f8521a5c9070fcb88f02967b1d8a0544e6d85c253f6968b785e1a2ab", 49 | "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4", 50 | "sha256:3f9d7c55b41ed687b9d7165b17672340187f87a773c98236c987f08c858145a9", 51 | "sha256:40b3fee496a47c3b4a39a731954c06f0bd9bd3e8258c059a4beb76ac23f8e421", 52 | "sha256:421da6fd326460517873274875c6c5a18ff225b40da2616083c5a34a7570b685", 53 | "sha256:4420cf9d179ec8dfe4be10e7d0fe47d6d606485512ea2265b0d8c5113372771b", 54 | "sha256:46749be6e89cd78d6068cdf7da51dbcfa4321147ab8e4116ee6678d9a056a0cf", 55 | "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693", 56 | "sha256:4c39e87afe48aa3e814cac5f535bc6199180a53e38d3f51c5e2530f5aa4ec58c", 57 | "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2", 58 | "sha256:5015082477abeafad7203757ae44299a610e89ee82a1503e3d4184e6bafdd519", 59 | "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d", 60 | "sha256:536ad7234747a37e50e7b6794ea868833d5220b49c92806ae2d7e8a9d6b5de02", 61 | "sha256:56822ff5ddfd1b745534e658faba944012346184fbfe732e0d6134b744516eea", 62 | "sha256:57d16590a351dfc914670bd72530fd78344b885a00b250e992faea565b7fdc05", 63 | "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b", 64 | "sha256:6404dfc8cdde35c69aaa489bb3542fb86ef215fc70277c892be8af540e5e21c0", 65 | "sha256:6443cca89553b7a5485331bc9bedb2342b08d073fa10b8c7d1c60579c4a7b9bd", 66 | "sha256:691d203c2bdf4f4637792efbbcdcd157ae11e55eaeb5e9c360c1206fb03d4d98", 67 | "sha256:6990ef617f14450bc6b34941dba4f12d5613cbf4e33805932f853fbd1cf18bfb", 68 | "sha256:6c5f40ec615e5264f44b4282ee27628cea221fcad52f27405b80abb346d9f3f8", 69 | "sha256:6d86a2fbdd14192e2f234a92d3b494dd4457e683ba07e5905a0b3ee25389ac9f", 70 | "sha256:74bdd8c864b36c3673741023343565d95bfbd778ffe1eb4d412c135a28a8dc89", 71 | "sha256:74dad41b3458dbb0511e760fb355bb0b6689e0630de8a22b1b62a98777136e16", 72 | "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64", 73 | "sha256:79b26fe467219add81d5e47b4a4ba0f2394e8b7c7c3198ed36609f9ba161aecb", 74 | "sha256:7c7dd29c7b5bda137464dc9bfc738d7ceea46ff70309859ffde8c022e9b08ba7", 75 | "sha256:7fbc8a7c410bb3ad5d595bb7118147dfbb6449d862cc1125cf8867cb337e8728", 76 | "sha256:802d3868f5776e28f7bf69d349c26fc0efadb81676d0afa88ed00d98a26340b7", 77 | "sha256:83603f881e11f0f710f8e2327817c82e79431ec976448839f3cd05d7afe8f830", 78 | "sha256:8466151554b593909d30a0a125d638b4e5f3836e5aecde85b66b80ded1cb5b0d", 79 | "sha256:86ceded4e78a992f835209e236617bffae649371c4a50d5e5a3987f237db84b8", 80 | "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d", 81 | "sha256:8e995e1abc4ed2a454c731385bf4082be06f875822adc4c6d9eaadf96e20d406", 82 | "sha256:8faa08fcc2e411f7ab91d1541d9d597d3a90e9004180edb2072238c085eac8c2", 83 | "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9", 84 | "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315", 85 | "sha256:a041e7e2612041a6ddf1c6a33b883be6a421247c7afd47e885969ee4cc58bd8d", 86 | "sha256:aaa2234bb60c4dbf82893e934d8ee8dea30446f0647e024074237a56a08c01bd", 87 | "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d", 88 | "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51", 89 | "sha256:b2acbbfff69019d9014508c4ba0401822e8bae5a5fdc3b6814285b71231b60f3", 90 | "sha256:b390ef5f62bb508a9d67cb3bba9b8356e23b3996da7062f1a57ce1a79d2b3d34", 91 | "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461", 92 | "sha256:b5b7fe4972d48a4da367043b8e023fb70a04d1490aa7d68800e465d1b97e493b", 93 | "sha256:b6fc902bff74d9b1879ad55f5404153e2b33a82e72a95c89cec5eb6cc9e92fbc", 94 | "sha256:b7011a70b56facde58d6d26da4fec3280cc8e2a78c714c96b7a01a87930a9530", 95 | "sha256:b761bac1192ef24e16706d761aefcb581438b34b13a2f069a6d343ec8fb693a5", 96 | "sha256:b784d6ed757f27574dca1c336f968f4e81130b27595e458e69457e6878251f5d", 97 | "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7", 98 | "sha256:bc4fbc61bb3548d3b482f9ac7ddd0f18c67e4225aaa4e8552b9f1ac7e6bda9e5", 99 | "sha256:bc9a0f6569ff990e0bbd75506c8d8fe7214c8f6579cca32f0546e54372a3bb54", 100 | "sha256:bd44d5936ab3193c617bfd6c9a7d8d1085a8dc8c3f44d5f1dcf554d17d04cf7d", 101 | "sha256:ced339d7c9b5030abad5854aa5413a77565e5b6e6248ff927d3e174baf3badf7", 102 | "sha256:d3ce17ce0220383a0f9ea07175eeaa6aa13ae5a41f30bc61d84df17f0e9b1117", 103 | "sha256:d5f1b4ce5bc528a6ee38dbf5f39bbf11dd127048726323b72b8e85769319ffc4", 104 | "sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1", 105 | "sha256:db71ce547012a5420a39c1b744d485cfb823564d01d5d20805977f5ea1345676", 106 | "sha256:e153e8adacfe2af562861b72f8bc47f8a5c08e010ac94eebbe33dc21d677cd5b", 107 | "sha256:edd533a07da85baa4b423ee8839e3e91681c7bfa19b04260a469ee94b778bf6d", 108 | "sha256:f0adb4177fa748072546fb650d9bd7398caaf0e15b370ed3317280b13f4083b0", 109 | "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d", 110 | "sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444", 111 | "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0", 112 | "sha256:fc49c4de44977aa8601a00edbf157e9a421f227aa7eb477d9e3df48343311065", 113 | "sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545", 114 | "sha256:fe086edf38b2222328cdf89af0dde2439ee173b8ad7cb659b4e4c6f385b2be3d" 115 | ], 116 | "index": "pypi", 117 | "markers": "python_version >= '3.9'", 118 | "version": "==3.12.15" 119 | }, 120 | "aiosignal": { 121 | "hashes": [ 122 | "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", 123 | "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7" 124 | ], 125 | "markers": "python_version >= '3.9'", 126 | "version": "==1.4.0" 127 | }, 128 | "attrs": { 129 | "hashes": [ 130 | "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", 131 | "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b" 132 | ], 133 | "markers": "python_version >= '3.8'", 134 | "version": "==25.3.0" 135 | }, 136 | "frozenlist": { 137 | "hashes": [ 138 | "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f", 139 | "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b", 140 | "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949", 141 | "sha256:1073557c941395fdfcfac13eb2456cb8aad89f9de27bae29fabca8e563b12615", 142 | "sha256:1137b78384eebaf70560a36b7b229f752fb64d463d38d1304939984d5cb887b6", 143 | "sha256:15900082e886edb37480335d9d518cec978afc69ccbc30bd18610b7c1b22a718", 144 | "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df", 145 | "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf", 146 | "sha256:1e63344c4e929b1a01e29bc184bbb5fd82954869033765bfe8d65d09e336a677", 147 | "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5", 148 | "sha256:1ed8d2fa095aae4bdc7fdd80351009a48d286635edffee66bf865e37a9125c50", 149 | "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb", 150 | "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56", 151 | "sha256:24c34bea555fe42d9f928ba0a740c553088500377448febecaa82cc3e88aa1fa", 152 | "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7", 153 | "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43", 154 | "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f", 155 | "sha256:2ea2a7369eb76de2217a842f22087913cdf75f63cf1307b9024ab82dfb525938", 156 | "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c", 157 | "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd", 158 | "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c", 159 | "sha256:3789ebc19cb811163e70fe2bd354cea097254ce6e707ae42e56f45e31e96cb8e", 160 | "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d", 161 | "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81", 162 | "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e", 163 | "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657", 164 | "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478", 165 | "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2", 166 | "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca", 167 | "sha256:400ddd24ab4e55014bba442d917203c73b2846391dd42ca5e38ff52bb18c3c5e", 168 | "sha256:41be2964bd4b15bf575e5daee5a5ce7ed3115320fb3c2b71fca05582ffa4dc9e", 169 | "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3", 170 | "sha256:43a82fce6769c70f2f5a06248b614a7d268080a9d20f7457ef10ecee5af82b63", 171 | "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898", 172 | "sha256:46d84d49e00c9429238a7ce02dc0be8f6d7cd0cd405abd1bebdc991bf27c15bd", 173 | "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca", 174 | "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2", 175 | "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104", 176 | "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba", 177 | "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a", 178 | "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1", 179 | "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae", 180 | "sha256:69cac419ac6a6baad202c85aaf467b65ac860ac2e7f2ac1686dc40dbb52f6577", 181 | "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60", 182 | "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee", 183 | "sha256:6eb93efb8101ef39d32d50bce242c84bcbddb4f7e9febfa7b524532a239b4464", 184 | "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61", 185 | "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86", 186 | "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01", 187 | "sha256:74739ba8e4e38221d2c5c03d90a7e542cb8ad681915f4ca8f68d04f810ee0a87", 188 | "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb", 189 | "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f", 190 | "sha256:7d536ee086b23fecc36c2073c371572374ff50ef4db515e4e503925361c24f71", 191 | "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8", 192 | "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d", 193 | "sha256:836b42f472a0e006e02499cef9352ce8097f33df43baaba3e0a28a964c26c7d2", 194 | "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00", 195 | "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b", 196 | "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b", 197 | "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146", 198 | "sha256:960d67d0611f4c87da7e2ae2eacf7ea81a5be967861e0c63cf205215afbfac59", 199 | "sha256:974c5336e61d6e7eb1ea5b929cb645e882aadab0095c5a6974a111e6479f8878", 200 | "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08", 201 | "sha256:9a19e85cc503d958abe5218953df722748d87172f71b73cf3c9257a91b999890", 202 | "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", 203 | "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750", 204 | "sha256:9ccec739a99e4ccf664ea0775149f2749b8a6418eb5b8384b4dc0a7d15d304cb", 205 | "sha256:a0fd1bad056a3600047fb9462cff4c5322cebc59ebf5d0a3725e0ee78955001d", 206 | "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30", 207 | "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3", 208 | "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d", 209 | "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a", 210 | "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8", 211 | "sha256:ac64b6478722eeb7a3313d494f8342ef3478dff539d17002f849101b212ef97c", 212 | "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1", 213 | "sha256:af369aa35ee34f132fcfad5be45fbfcde0e3a5f6a1ec0712857f286b7d20cca9", 214 | "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e", 215 | "sha256:b3950f11058310008a87757f3eee16a8e1ca97979833239439586857bc25482e", 216 | "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384", 217 | "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98", 218 | "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb", 219 | "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4", 220 | "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65", 221 | "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08", 222 | "sha256:c70db4a0ab5ab20878432c40563573229a7ed9241506181bba12f6b7d0dc41cb", 223 | "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43", 224 | "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a", 225 | "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7", 226 | "sha256:cea3dbd15aea1341ea2de490574a4a37ca080b2ae24e4b4f4b51b9057b4c3630", 227 | "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d", 228 | "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31", 229 | "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d", 230 | "sha256:dfcebf56f703cb2e346315431699f00db126d158455e513bd14089d992101e44", 231 | "sha256:e22b9a99741294b2571667c07d9f8cceec07cb92aae5ccda39ea1b6052ed4319", 232 | "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e", 233 | "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025", 234 | "sha256:e793a9f01b3e8b5c0bc646fb59140ce0efcc580d22a3468d70766091beb81b35", 235 | "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee", 236 | "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1", 237 | "sha256:f22dac33bb3ee8fe3e013aa7b91dc12f60d61d05b7fe32191ffa84c3aafe77bd", 238 | "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74", 239 | "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b", 240 | "sha256:f89f65d85774f1797239693cef07ad4c97fdd0639544bad9ac4b869782eb1981", 241 | "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5" 242 | ], 243 | "markers": "python_version >= '3.9'", 244 | "version": "==1.7.0" 245 | }, 246 | "idna": { 247 | "hashes": [ 248 | "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", 249 | "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" 250 | ], 251 | "markers": "python_version >= '3.6'", 252 | "version": "==3.10" 253 | }, 254 | "multidict": { 255 | "hashes": [ 256 | "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134", 257 | "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17", 258 | "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6", 259 | "sha256:05db2f66c9addb10cfa226e1acb363450fab2ff8a6df73c622fefe2f5af6d4e7", 260 | "sha256:0b9e59946b49dafaf990fd9c17ceafa62976e8471a14952163d10a7a630413a9", 261 | "sha256:0db58da8eafb514db832a1b44f8fa7906fdd102f7d982025f816a93ba45e3dcb", 262 | "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b", 263 | "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55", 264 | "sha256:12f4581d2930840295c461764b9a65732ec01250b46c6b2c510d7ee68872b140", 265 | "sha256:1328201ee930f069961ae707d59c6627ac92e351ed5b92397cf534d1336ce557", 266 | "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e", 267 | "sha256:14117a41c8fdb3ee19c743b1c027da0736fdb79584d61a766da53d399b71176c", 268 | "sha256:15332783596f227db50fb261c2c251a58ac3873c457f3a550a95d5c0aa3c770d", 269 | "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65", 270 | "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c", 271 | "sha256:1bf99b4daf908c73856bd87ee0a2499c3c9a3d19bb04b9c6025e66af3fd07462", 272 | "sha256:1c8082e5814b662de8589d6a06c17e77940d5539080cbab9fe6794b5241b76d9", 273 | "sha256:208b9b9757060b9faa6f11ab4bc52846e4f3c2fb8b14d5680c8aac80af3dc751", 274 | "sha256:20c5a0c3c13a15fd5ea86c42311859f970070e4e24de5a550e99d7c271d76318", 275 | "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b", 276 | "sha256:233ad16999afc2bbd3e534ad8dbe685ef8ee49a37dbc2cdc9514e57b6d589ced", 277 | "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f", 278 | "sha256:295adc9c0551e5d5214b45cf29ca23dbc28c2d197a9c30d51aed9e037cb7c578", 279 | "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc", 280 | "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75", 281 | "sha256:35712f1748d409e0707b165bf49f9f17f9e28ae85470c41615778f8d4f7d9609", 282 | "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c", 283 | "sha256:37b09ca60998e87734699e88c2363abfd457ed18cfbf88e4009a4e83788e63ed", 284 | "sha256:3893a0d7d28a7fe6ca7a1f760593bc13038d1d35daf52199d431b61d2660602b", 285 | "sha256:41bb9d1d4c303886e2d85bade86e59885112a7f4277af5ad47ab919a2251f306", 286 | "sha256:42ca5aa9329a63be8dc49040f63817d1ac980e02eeddba763a9ae5b4027b9c9c", 287 | "sha256:43571f785b86afd02b3855c5ac8e86ec921b760298d6f82ff2a61daf5a35330b", 288 | "sha256:448e4a9afccbf297577f2eaa586f07067441e7b63c8362a3540ba5a38dc0f14a", 289 | "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7", 290 | "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3", 291 | "sha256:531e331a2ee53543ab32b16334e2deb26f4e6b9b28e41f8e0c87e99a6c8e2d69", 292 | "sha256:53becb01dd8ebd19d1724bebe369cfa87e4e7f29abbbe5c14c98ce4c383e16cd", 293 | "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55", 294 | "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10", 295 | "sha256:5633a82fba8e841bc5c5c06b16e21529573cd654f67fd833650a215520a6210e", 296 | "sha256:5bd8d6f793a787153956cd35e24f60485bf0651c238e207b9a54f7458b16d539", 297 | "sha256:61af8a4b771f1d4d000b3168c12c3120ccf7284502a94aa58c68a81f5afac090", 298 | "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e", 299 | "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063", 300 | "sha256:68e9e12ed00e2089725669bdc88602b0b6f8d23c0c95e52b95f0bc69f7fe9b55", 301 | "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b", 302 | "sha256:70b72e749a4f6e7ed8fb334fa8d8496384840319512746a5f42fa0aec79f4d61", 303 | "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d", 304 | "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680", 305 | "sha256:72d8815f2cd3cf3df0f83cac3f3ef801d908b2d90409ae28102e0553af85545a", 306 | "sha256:7394888236621f61dcdd25189b2768ae5cc280f041029a5bcf1122ac63df79f9", 307 | "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5", 308 | "sha256:766a4a5996f54361d8d5a9050140aa5362fe48ce51c755a50c0bc3706460c430", 309 | "sha256:769841d70ca8bdd140a715746199fc6473414bd02efd678d75681d2d6a8986c5", 310 | "sha256:775b464d31dac90f23192af9c291dc9f423101857e33e9ebf0020a10bfcf4144", 311 | "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", 312 | "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65", 313 | "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884", 314 | "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2", 315 | "sha256:877443eaaabcd0b74ff32ebeed6f6176c71850feb7d6a1d2db65945256ea535c", 316 | "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a", 317 | "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961", 318 | "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca", 319 | "sha256:934796c81ea996e61914ba58064920d6cad5d99140ac3167901eb932150e2e56", 320 | "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6", 321 | "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b", 322 | "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f", 323 | "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6", 324 | "sha256:9ed948328aec2072bc00f05d961ceadfd3e9bfc2966c1319aeaf7b7c21219183", 325 | "sha256:9f5b28c074c76afc3e4c610c488e3493976fe0e596dd3db6c8ddfbb0134dcac5", 326 | "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d", 327 | "sha256:a2be5b7b35271f7fff1397204ba6708365e3d773579fe2a30625e16c4b4ce817", 328 | "sha256:ab0a34a007704c625e25a9116c6770b4d3617a071c8a7c30cd338dfbadfe6485", 329 | "sha256:acf6b97bd0884891af6a8b43d0f586ab2fcf8e717cbd47ab4bdddc09e20652d8", 330 | "sha256:b1db4d2093d6b235de76932febf9d50766cf49a5692277b2c28a501c9637f616", 331 | "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373", 332 | "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888", 333 | "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648", 334 | "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1", 335 | "sha256:bb933c891cd4da6bdcc9733d048e994e22e1883287ff7540c2a0f3b117605092", 336 | "sha256:bc7f6fbc61b1c16050a389c630da0b32fc6d4a3d191394ab78972bf5edc568c2", 337 | "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3", 338 | "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d", 339 | "sha256:c60b401f192e79caec61f166da9c924e9f8bc65548d4246842df91651e83d600", 340 | "sha256:c8161b5a7778d3137ea2ee7ae8a08cce0010de3b00ac671c5ebddeaa17cefd22", 341 | "sha256:cdf22e4db76d323bcdc733514bf732e9fb349707c98d341d40ebcc6e9318ef3d", 342 | "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb", 343 | "sha256:d04d01f0a913202205a598246cf77826fe3baa5a63e9f6ccf1ab0601cf56eca0", 344 | "sha256:d25594d3b38a2e6cabfdcafef339f754ca6e81fbbdb6650ad773ea9775af35ab", 345 | "sha256:d4e47d8faffaae822fb5cba20937c048d4f734f43572e7079298a6c39fb172cb", 346 | "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8", 347 | "sha256:dd7793bab517e706c9ed9d7310b06c8672fd0aeee5781bfad612f56b8e0f7d14", 348 | "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643", 349 | "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471", 350 | "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0", 351 | "sha256:e2db616467070d0533832d204c54eea6836a5e628f2cb1e6dfd8cd6ba7277cb7", 352 | "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a", 353 | "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d", 354 | "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c", 355 | "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f", 356 | "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8", 357 | "sha256:e93089c1570a4ad54c3714a12c2cef549dc9d58e97bcded193d928649cab78e9", 358 | "sha256:e995a34c3d44ab511bfc11aa26869b9d66c2d8c799fa0e74b28a473a692532d6", 359 | "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df", 360 | "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b", 361 | "sha256:f114d8478733ca7388e7c7e0ab34b72547476b97009d643644ac33d4d3fe1821", 362 | "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37", 363 | "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c", 364 | "sha256:f54cb79d26d0cd420637d184af38f0668558f3c4bbe22ab7ad830e67249f2e0b", 365 | "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1" 366 | ], 367 | "markers": "python_version >= '3.9'", 368 | "version": "==6.6.3" 369 | }, 370 | "propcache": { 371 | "hashes": [ 372 | "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c", 373 | "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81", 374 | "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f", 375 | "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6", 376 | "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535", 377 | "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be", 378 | "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba", 379 | "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3", 380 | "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0", 381 | "sha256:1f43837d4ca000243fd7fd6301947d7cb93360d03cd08369969450cc6b2ce3b4", 382 | "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", 383 | "sha256:2183111651d710d3097338dd1893fcf09c9f54e27ff1a8795495a16a469cc90b", 384 | "sha256:21d8759141a9e00a681d35a1f160892a36fb6caa715ba0b832f7747da48fb6ea", 385 | "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770", 386 | "sha256:261df2e9474a5949c46e962065d88eb9b96ce0f2bd30e9d3136bcde84befd8f2", 387 | "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892", 388 | "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154", 389 | "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf", 390 | "sha256:2ca6d378f09adb13837614ad2754fa8afaee330254f404299611bce41a8438cb", 391 | "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1", 392 | "sha256:31248e44b81d59d6addbb182c4720f90b44e1efdc19f58112a3c3a1615fb47ef", 393 | "sha256:34a624af06c048946709f4278b4176470073deda88d91342665d95f7c6270fbe", 394 | "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897", 395 | "sha256:3def3da3ac3ce41562d85db655d18ebac740cb3fa4367f11a52b3da9d03a5cc3", 396 | "sha256:404d70768080d3d3bdb41d0771037da19d8340d50b08e104ca0e7f9ce55fce70", 397 | "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", 398 | "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44", 399 | "sha256:4927842833830942a5d0a56e6f4839bc484785b8e1ce8d287359794818633ba0", 400 | "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88", 401 | "sha256:4ba3fef1c30f306b1c274ce0b8baaa2c3cdd91f645c48f06394068f37d3837a1", 402 | "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3", 403 | "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43", 404 | "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4", 405 | "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1", 406 | "sha256:55ffda449a507e9fbd4aca1a7d9aa6753b07d6166140e5a18d2ac9bc49eac220", 407 | "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7", 408 | "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9", 409 | "sha256:5f559e127134b07425134b4065be45b166183fdcb433cb6c24c8e4149056ad50", 410 | "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e", 411 | "sha256:6107ddd08b02654a30fb8ad7a132021759d750a82578b94cd55ee2772b6ebea2", 412 | "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66", 413 | "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1", 414 | "sha256:64a67fb39229a8a8491dd42f864e5e263155e729c2e7ff723d6e25f596b1e8cb", 415 | "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe", 416 | "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c", 417 | "sha256:70bd8b9cd6b519e12859c99f3fc9a93f375ebd22a50296c3a295028bea73b9e7", 418 | "sha256:7435d766f978b4ede777002e6b3b6641dd229cd1da8d3d3106a45770365f9ad9", 419 | "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e", 420 | "sha256:76cace5d6b2a54e55b137669b30f31aa15977eeed390c7cbfb1dafa8dfe9a701", 421 | "sha256:7a2368eed65fc69a7a7a40b27f22e85e7627b74216f0846b04ba5c116e191ec9", 422 | "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8", 423 | "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b", 424 | "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f", 425 | "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e", 426 | "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02", 427 | "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e", 428 | "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1", 429 | "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10", 430 | "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387", 431 | "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", 432 | "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", 433 | "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b", 434 | "sha256:9bec58347a5a6cebf239daba9bda37dffec5b8d2ce004d9fe4edef3d2815137e", 435 | "sha256:9da1cf97b92b51253d5b68cf5a2b9e0dafca095e36b7f2da335e27dc6172a614", 436 | "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252", 437 | "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9", 438 | "sha256:a7fad897f14d92086d6b03fdd2eb844777b0c4d7ec5e3bac0fbae2ab0602bbe5", 439 | "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c", 440 | "sha256:abb7fa19dbf88d3857363e0493b999b8011eea856b846305d8c0512dfdf8fbb1", 441 | "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770", 442 | "sha256:aff2e4e06435d61f11a428360a932138d0ec288b0a31dd9bd78d200bd4a2b339", 443 | "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251", 444 | "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db", 445 | "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf", 446 | "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95", 447 | "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df", 448 | "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2", 449 | "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945", 450 | "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474", 451 | "sha256:cc2782eb0f7a16462285b6f8394bbbd0e1ee5f928034e941ffc444012224171b", 452 | "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615", 453 | "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06", 454 | "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33", 455 | "sha256:d4a996adb6904f85894570301939afeee65f072b4fd265ed7e569e8d9058e4ec", 456 | "sha256:d81ac3ae39d38588ad0549e321e6f773a4e7cc68e7751524a22885d5bbadf886", 457 | "sha256:db429c19a6c7e8a1c320e6a13c99799450f411b02251fb1b75e6217cf4a14fcb", 458 | "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1", 459 | "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05", 460 | "sha256:e514326b79e51f0a177daab1052bc164d9d9e54133797a3a58d24c9c87a3fe6d", 461 | "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39", 462 | "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67", 463 | "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e", 464 | "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28", 465 | "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a", 466 | "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", 467 | "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725", 468 | "sha256:fb075ad271405dcad8e2a7ffc9a750a3bf70e533bd86e89f0603e607b93aa64c", 469 | "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206" 470 | ], 471 | "markers": "python_version >= '3.9'", 472 | "version": "==0.3.2" 473 | }, 474 | "typing-extensions": { 475 | "hashes": [ 476 | "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", 477 | "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76" 478 | ], 479 | "markers": "python_version < '3.13'", 480 | "version": "==4.14.1" 481 | }, 482 | "yarl": { 483 | "hashes": [ 484 | "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845", 485 | "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53", 486 | "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a", 487 | "sha256:0c869f2651cc77465f6cd01d938d91a11d9ea5d798738c1dc077f3de0b5e5fed", 488 | "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2", 489 | "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02", 490 | "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf", 491 | "sha256:14a85f3bd2d7bb255be7183e5d7d6e70add151a98edf56a770d6140f5d5f4010", 492 | "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3", 493 | "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef", 494 | "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04", 495 | "sha256:1f8a891e4a22a89f5dde7862994485e19db246b70bb288d3ce73a34422e55b23", 496 | "sha256:21242b4288a6d56f04ea193adde174b7e347ac46ce6bc84989ff7c1b1ecea84e", 497 | "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6", 498 | "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e", 499 | "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a", 500 | "sha256:2c7b34d804b8cf9b214f05015c4fee2ebe7ed05cf581e7192c06555c71f4446a", 501 | "sha256:2c89b5c792685dd9cd3fa9761c1b9f46fc240c2a3265483acc1565769996a3f8", 502 | "sha256:30c41ad5d717b3961b2dd785593b67d386b73feca30522048d37298fee981805", 503 | "sha256:33f29ecfe0330c570d997bcf1afd304377f2e48f61447f37e846a6058a4d33b2", 504 | "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458", 505 | "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc", 506 | "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d", 507 | "sha256:41493b9b7c312ac448b7f0a42a089dffe1d6e6e981a2d76205801a023ed26a2b", 508 | "sha256:41ebd28167bc6af8abb97fec1a399f412eec5fd61a3ccbe2305a18b84fb4ca73", 509 | "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7", 510 | "sha256:46b5e0ccf1943a9a6e766b2c2b8c732c55b34e28be57d8daa2b3c1d1d4009309", 511 | "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e", 512 | "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698", 513 | "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c", 514 | "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691", 515 | "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16", 516 | "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f", 517 | "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", 518 | "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004", 519 | "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3", 520 | "sha256:57edc88517d7fc62b174fcfb2e939fbc486a68315d648d7e74d07fac42cec240", 521 | "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28", 522 | "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513", 523 | "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773", 524 | "sha256:59febc3969b0781682b469d4aca1a5cab7505a4f7b85acf6db01fa500fa3f6ba", 525 | "sha256:6032e6da6abd41e4acda34d75a816012717000fa6839f37124a47fcefc49bec4", 526 | "sha256:62915e6688eb4d180d93840cda4110995ad50c459bf931b8b3775b37c264af1e", 527 | "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1", 528 | "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31", 529 | "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16", 530 | "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819", 531 | "sha256:69e9b141de5511021942a6866990aea6d111c9042235de90e08f94cf972ca03d", 532 | "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3", 533 | "sha256:6c4fbf6b02d70e512d7ade4b1f998f237137f1417ab07ec06358ea04f69134f8", 534 | "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf", 535 | "sha256:749d73611db8d26a6281086f859ea7ec08f9c4c56cec864e52028c8b328db723", 536 | "sha256:76d12524d05841276b0e22573f28d5fbcb67589836772ae9244d90dd7d66aa13", 537 | "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1", 538 | "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b", 539 | "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f", 540 | "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d", 541 | "sha256:835ab2cfc74d5eb4a6a528c57f05688099da41cf4957cf08cad38647e4a83b30", 542 | "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", 543 | "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a", 544 | "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389", 545 | "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e", 546 | "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e", 547 | "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c", 548 | "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1", 549 | "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833", 550 | "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b", 551 | "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee", 552 | "sha256:9427925776096e664c39e131447aa20ec738bdd77c049c48ea5200db2237e000", 553 | "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38", 554 | "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8", 555 | "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd", 556 | "sha256:aef6c4d69554d44b7f9d923245f8ad9a707d971e6209d51279196d8e8fe1ae16", 557 | "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d", 558 | "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a", 559 | "sha256:b5f307337819cdfdbb40193cad84978a029f847b0a357fbe49f712063cfc4f06", 560 | "sha256:b982fa7f74c80d5c0c7b5b38f908971e513380a10fecea528091405f519b9ebb", 561 | "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4", 562 | "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9", 563 | "sha256:bea21cdae6c7eb02ba02a475f37463abfe0a01f5d7200121b03e605d6a0439f8", 564 | "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390", 565 | "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8", 566 | "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be", 567 | "sha256:c7ddf7a09f38667aea38801da8b8d6bfe81df767d9dfc8c88eb45827b195cd1c", 568 | "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", 569 | "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b", 570 | "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5", 571 | "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4", 572 | "sha256:d2b6fb3622b7e5bf7a6e5b679a69326b4279e805ed1699d749739a61d242449e", 573 | "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f", 574 | "sha256:dab096ce479d5894d62c26ff4f699ec9072269d514b4edd630a393223f45a0ee", 575 | "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5", 576 | "sha256:dd803820d44c8853a109a34e3660e5a61beae12970da479cf44aa2954019bf70", 577 | "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1", 578 | "sha256:df47c55f7d74127d1b11251fe6397d84afdde0d53b90bedb46a23c0e534f9d24", 579 | "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653", 580 | "sha256:e42ba79e2efb6845ebab49c7bf20306c4edf74a0b20fc6b2ccdd1a219d12fad3", 581 | "sha256:eae7bfe2069f9c1c5b05fc7fe5d612e5bbc089a39309904ee8b829e322dcad00", 582 | "sha256:f5a5928ff5eb13408c62a968ac90d43f8322fd56d87008b8f9dabf3c0f6ee983", 583 | "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d", 584 | "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7", 585 | "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce", 586 | "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e", 587 | "sha256:ff70f32aa316393eaf8222d518ce9118148eddb8a53073c2403863b41033eed5" 588 | ], 589 | "markers": "python_version >= '3.9'", 590 | "version": "==1.20.1" 591 | } 592 | }, 593 | "develop": { 594 | "aiohappyeyeballs": { 595 | "hashes": [ 596 | "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", 597 | "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" 598 | ], 599 | "markers": "python_version >= '3.9'", 600 | "version": "==2.6.1" 601 | }, 602 | "aiohttp": { 603 | "hashes": [ 604 | "sha256:010cc9bbd06db80fe234d9003f67e97a10fe003bfbedb40da7d71c1008eda0fe", 605 | "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645", 606 | "sha256:098e92835b8119b54c693f2f88a1dec690e20798ca5f5fe5f0520245253ee0af", 607 | "sha256:0a146708808c9b7a988a4af3821379e379e0f0e5e466ca31a73dbdd0325b0263", 608 | "sha256:0a23918fedc05806966a2438489dcffccbdf83e921a1170773b6178d04ade142", 609 | "sha256:0c643f4d75adea39e92c0f01b3fb83d57abdec8c9279b3078b68a3a52b3933b6", 610 | "sha256:1004e67962efabbaf3f03b11b4c43b834081c9e3f9b32b16a7d97d4708a9abe6", 611 | "sha256:14954a2988feae3987f1eb49c706bff39947605f4b6fa4027c1d75743723eb09", 612 | "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84", 613 | "sha256:2776c7ec89c54a47029940177e75c8c07c29c66f73464784971d6a81904ce9d1", 614 | "sha256:2abbb216a1d3a2fe86dbd2edce20cdc5e9ad0be6378455b05ec7f77361b3ab50", 615 | "sha256:2c7d81a277fa78b2203ab626ced1487420e8c11a8e373707ab72d189fcdad20a", 616 | "sha256:2ce13fcfb0bb2f259fb42106cdc63fa5515fb85b7e87177267d89a771a660b79", 617 | "sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c", 618 | "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd", 619 | "sha256:3b6f0af863cf17e6222b1735a756d664159e58855da99cfe965134a3ff63b0b0", 620 | "sha256:3bdd6e17e16e1dbd3db74d7f989e8af29c4d2e025f9828e6ef45fbdee158ec75", 621 | "sha256:3beb14f053222b391bf9cf92ae82e0171067cc9c8f52453a0f1ec7c37df12a77", 622 | "sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c", 623 | "sha256:3ead1c00f8521a5c9070fcb88f02967b1d8a0544e6d85c253f6968b785e1a2ab", 624 | "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4", 625 | "sha256:3f9d7c55b41ed687b9d7165b17672340187f87a773c98236c987f08c858145a9", 626 | "sha256:40b3fee496a47c3b4a39a731954c06f0bd9bd3e8258c059a4beb76ac23f8e421", 627 | "sha256:421da6fd326460517873274875c6c5a18ff225b40da2616083c5a34a7570b685", 628 | "sha256:4420cf9d179ec8dfe4be10e7d0fe47d6d606485512ea2265b0d8c5113372771b", 629 | "sha256:46749be6e89cd78d6068cdf7da51dbcfa4321147ab8e4116ee6678d9a056a0cf", 630 | "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693", 631 | "sha256:4c39e87afe48aa3e814cac5f535bc6199180a53e38d3f51c5e2530f5aa4ec58c", 632 | "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2", 633 | "sha256:5015082477abeafad7203757ae44299a610e89ee82a1503e3d4184e6bafdd519", 634 | "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d", 635 | "sha256:536ad7234747a37e50e7b6794ea868833d5220b49c92806ae2d7e8a9d6b5de02", 636 | "sha256:56822ff5ddfd1b745534e658faba944012346184fbfe732e0d6134b744516eea", 637 | "sha256:57d16590a351dfc914670bd72530fd78344b885a00b250e992faea565b7fdc05", 638 | "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b", 639 | "sha256:6404dfc8cdde35c69aaa489bb3542fb86ef215fc70277c892be8af540e5e21c0", 640 | "sha256:6443cca89553b7a5485331bc9bedb2342b08d073fa10b8c7d1c60579c4a7b9bd", 641 | "sha256:691d203c2bdf4f4637792efbbcdcd157ae11e55eaeb5e9c360c1206fb03d4d98", 642 | "sha256:6990ef617f14450bc6b34941dba4f12d5613cbf4e33805932f853fbd1cf18bfb", 643 | "sha256:6c5f40ec615e5264f44b4282ee27628cea221fcad52f27405b80abb346d9f3f8", 644 | "sha256:6d86a2fbdd14192e2f234a92d3b494dd4457e683ba07e5905a0b3ee25389ac9f", 645 | "sha256:74bdd8c864b36c3673741023343565d95bfbd778ffe1eb4d412c135a28a8dc89", 646 | "sha256:74dad41b3458dbb0511e760fb355bb0b6689e0630de8a22b1b62a98777136e16", 647 | "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64", 648 | "sha256:79b26fe467219add81d5e47b4a4ba0f2394e8b7c7c3198ed36609f9ba161aecb", 649 | "sha256:7c7dd29c7b5bda137464dc9bfc738d7ceea46ff70309859ffde8c022e9b08ba7", 650 | "sha256:7fbc8a7c410bb3ad5d595bb7118147dfbb6449d862cc1125cf8867cb337e8728", 651 | "sha256:802d3868f5776e28f7bf69d349c26fc0efadb81676d0afa88ed00d98a26340b7", 652 | "sha256:83603f881e11f0f710f8e2327817c82e79431ec976448839f3cd05d7afe8f830", 653 | "sha256:8466151554b593909d30a0a125d638b4e5f3836e5aecde85b66b80ded1cb5b0d", 654 | "sha256:86ceded4e78a992f835209e236617bffae649371c4a50d5e5a3987f237db84b8", 655 | "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d", 656 | "sha256:8e995e1abc4ed2a454c731385bf4082be06f875822adc4c6d9eaadf96e20d406", 657 | "sha256:8faa08fcc2e411f7ab91d1541d9d597d3a90e9004180edb2072238c085eac8c2", 658 | "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9", 659 | "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315", 660 | "sha256:a041e7e2612041a6ddf1c6a33b883be6a421247c7afd47e885969ee4cc58bd8d", 661 | "sha256:aaa2234bb60c4dbf82893e934d8ee8dea30446f0647e024074237a56a08c01bd", 662 | "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d", 663 | "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51", 664 | "sha256:b2acbbfff69019d9014508c4ba0401822e8bae5a5fdc3b6814285b71231b60f3", 665 | "sha256:b390ef5f62bb508a9d67cb3bba9b8356e23b3996da7062f1a57ce1a79d2b3d34", 666 | "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461", 667 | "sha256:b5b7fe4972d48a4da367043b8e023fb70a04d1490aa7d68800e465d1b97e493b", 668 | "sha256:b6fc902bff74d9b1879ad55f5404153e2b33a82e72a95c89cec5eb6cc9e92fbc", 669 | "sha256:b7011a70b56facde58d6d26da4fec3280cc8e2a78c714c96b7a01a87930a9530", 670 | "sha256:b761bac1192ef24e16706d761aefcb581438b34b13a2f069a6d343ec8fb693a5", 671 | "sha256:b784d6ed757f27574dca1c336f968f4e81130b27595e458e69457e6878251f5d", 672 | "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7", 673 | "sha256:bc4fbc61bb3548d3b482f9ac7ddd0f18c67e4225aaa4e8552b9f1ac7e6bda9e5", 674 | "sha256:bc9a0f6569ff990e0bbd75506c8d8fe7214c8f6579cca32f0546e54372a3bb54", 675 | "sha256:bd44d5936ab3193c617bfd6c9a7d8d1085a8dc8c3f44d5f1dcf554d17d04cf7d", 676 | "sha256:ced339d7c9b5030abad5854aa5413a77565e5b6e6248ff927d3e174baf3badf7", 677 | "sha256:d3ce17ce0220383a0f9ea07175eeaa6aa13ae5a41f30bc61d84df17f0e9b1117", 678 | "sha256:d5f1b4ce5bc528a6ee38dbf5f39bbf11dd127048726323b72b8e85769319ffc4", 679 | "sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1", 680 | "sha256:db71ce547012a5420a39c1b744d485cfb823564d01d5d20805977f5ea1345676", 681 | "sha256:e153e8adacfe2af562861b72f8bc47f8a5c08e010ac94eebbe33dc21d677cd5b", 682 | "sha256:edd533a07da85baa4b423ee8839e3e91681c7bfa19b04260a469ee94b778bf6d", 683 | "sha256:f0adb4177fa748072546fb650d9bd7398caaf0e15b370ed3317280b13f4083b0", 684 | "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d", 685 | "sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444", 686 | "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0", 687 | "sha256:fc49c4de44977aa8601a00edbf157e9a421f227aa7eb477d9e3df48343311065", 688 | "sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545", 689 | "sha256:fe086edf38b2222328cdf89af0dde2439ee173b8ad7cb659b4e4c6f385b2be3d" 690 | ], 691 | "index": "pypi", 692 | "markers": "python_version >= '3.9'", 693 | "version": "==3.12.15" 694 | }, 695 | "aiosignal": { 696 | "hashes": [ 697 | "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", 698 | "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7" 699 | ], 700 | "markers": "python_version >= '3.9'", 701 | "version": "==1.4.0" 702 | }, 703 | "attrs": { 704 | "hashes": [ 705 | "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", 706 | "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b" 707 | ], 708 | "markers": "python_version >= '3.8'", 709 | "version": "==25.3.0" 710 | }, 711 | "black": { 712 | "hashes": [ 713 | "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", 714 | "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", 715 | "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", 716 | "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", 717 | "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", 718 | "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", 719 | "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", 720 | "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", 721 | "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", 722 | "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", 723 | "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", 724 | "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", 725 | "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", 726 | "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", 727 | "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", 728 | "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", 729 | "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", 730 | "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", 731 | "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", 732 | "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", 733 | "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", 734 | "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f" 735 | ], 736 | "index": "pypi", 737 | "markers": "python_version >= '3.9'", 738 | "version": "==25.1.0" 739 | }, 740 | "click": { 741 | "hashes": [ 742 | "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", 743 | "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" 744 | ], 745 | "markers": "python_version >= '3.10'", 746 | "version": "==8.2.1" 747 | }, 748 | "colorama": { 749 | "hashes": [ 750 | "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", 751 | "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" 752 | ], 753 | "markers": "platform_system == 'Windows'", 754 | "version": "==0.4.6" 755 | }, 756 | "csfloat.py": { 757 | "editable": true, 758 | "markers": "python_version >= '3.10'", 759 | "path": "." 760 | }, 761 | "frozenlist": { 762 | "hashes": [ 763 | "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f", 764 | "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b", 765 | "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949", 766 | "sha256:1073557c941395fdfcfac13eb2456cb8aad89f9de27bae29fabca8e563b12615", 767 | "sha256:1137b78384eebaf70560a36b7b229f752fb64d463d38d1304939984d5cb887b6", 768 | "sha256:15900082e886edb37480335d9d518cec978afc69ccbc30bd18610b7c1b22a718", 769 | "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df", 770 | "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf", 771 | "sha256:1e63344c4e929b1a01e29bc184bbb5fd82954869033765bfe8d65d09e336a677", 772 | "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5", 773 | "sha256:1ed8d2fa095aae4bdc7fdd80351009a48d286635edffee66bf865e37a9125c50", 774 | "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb", 775 | "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56", 776 | "sha256:24c34bea555fe42d9f928ba0a740c553088500377448febecaa82cc3e88aa1fa", 777 | "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7", 778 | "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43", 779 | "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f", 780 | "sha256:2ea2a7369eb76de2217a842f22087913cdf75f63cf1307b9024ab82dfb525938", 781 | "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c", 782 | "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd", 783 | "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c", 784 | "sha256:3789ebc19cb811163e70fe2bd354cea097254ce6e707ae42e56f45e31e96cb8e", 785 | "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d", 786 | "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81", 787 | "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e", 788 | "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657", 789 | "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478", 790 | "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2", 791 | "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca", 792 | "sha256:400ddd24ab4e55014bba442d917203c73b2846391dd42ca5e38ff52bb18c3c5e", 793 | "sha256:41be2964bd4b15bf575e5daee5a5ce7ed3115320fb3c2b71fca05582ffa4dc9e", 794 | "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3", 795 | "sha256:43a82fce6769c70f2f5a06248b614a7d268080a9d20f7457ef10ecee5af82b63", 796 | "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898", 797 | "sha256:46d84d49e00c9429238a7ce02dc0be8f6d7cd0cd405abd1bebdc991bf27c15bd", 798 | "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca", 799 | "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2", 800 | "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104", 801 | "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba", 802 | "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a", 803 | "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1", 804 | "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae", 805 | "sha256:69cac419ac6a6baad202c85aaf467b65ac860ac2e7f2ac1686dc40dbb52f6577", 806 | "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60", 807 | "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee", 808 | "sha256:6eb93efb8101ef39d32d50bce242c84bcbddb4f7e9febfa7b524532a239b4464", 809 | "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61", 810 | "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86", 811 | "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01", 812 | "sha256:74739ba8e4e38221d2c5c03d90a7e542cb8ad681915f4ca8f68d04f810ee0a87", 813 | "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb", 814 | "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f", 815 | "sha256:7d536ee086b23fecc36c2073c371572374ff50ef4db515e4e503925361c24f71", 816 | "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8", 817 | "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d", 818 | "sha256:836b42f472a0e006e02499cef9352ce8097f33df43baaba3e0a28a964c26c7d2", 819 | "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00", 820 | "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b", 821 | "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b", 822 | "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146", 823 | "sha256:960d67d0611f4c87da7e2ae2eacf7ea81a5be967861e0c63cf205215afbfac59", 824 | "sha256:974c5336e61d6e7eb1ea5b929cb645e882aadab0095c5a6974a111e6479f8878", 825 | "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08", 826 | "sha256:9a19e85cc503d958abe5218953df722748d87172f71b73cf3c9257a91b999890", 827 | "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", 828 | "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750", 829 | "sha256:9ccec739a99e4ccf664ea0775149f2749b8a6418eb5b8384b4dc0a7d15d304cb", 830 | "sha256:a0fd1bad056a3600047fb9462cff4c5322cebc59ebf5d0a3725e0ee78955001d", 831 | "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30", 832 | "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3", 833 | "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d", 834 | "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a", 835 | "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8", 836 | "sha256:ac64b6478722eeb7a3313d494f8342ef3478dff539d17002f849101b212ef97c", 837 | "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1", 838 | "sha256:af369aa35ee34f132fcfad5be45fbfcde0e3a5f6a1ec0712857f286b7d20cca9", 839 | "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e", 840 | "sha256:b3950f11058310008a87757f3eee16a8e1ca97979833239439586857bc25482e", 841 | "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384", 842 | "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98", 843 | "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb", 844 | "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4", 845 | "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65", 846 | "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08", 847 | "sha256:c70db4a0ab5ab20878432c40563573229a7ed9241506181bba12f6b7d0dc41cb", 848 | "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43", 849 | "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a", 850 | "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7", 851 | "sha256:cea3dbd15aea1341ea2de490574a4a37ca080b2ae24e4b4f4b51b9057b4c3630", 852 | "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d", 853 | "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31", 854 | "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d", 855 | "sha256:dfcebf56f703cb2e346315431699f00db126d158455e513bd14089d992101e44", 856 | "sha256:e22b9a99741294b2571667c07d9f8cceec07cb92aae5ccda39ea1b6052ed4319", 857 | "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e", 858 | "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025", 859 | "sha256:e793a9f01b3e8b5c0bc646fb59140ce0efcc580d22a3468d70766091beb81b35", 860 | "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee", 861 | "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1", 862 | "sha256:f22dac33bb3ee8fe3e013aa7b91dc12f60d61d05b7fe32191ffa84c3aafe77bd", 863 | "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74", 864 | "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b", 865 | "sha256:f89f65d85774f1797239693cef07ad4c97fdd0639544bad9ac4b869782eb1981", 866 | "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5" 867 | ], 868 | "markers": "python_version >= '3.9'", 869 | "version": "==1.7.0" 870 | }, 871 | "idna": { 872 | "hashes": [ 873 | "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", 874 | "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" 875 | ], 876 | "markers": "python_version >= '3.6'", 877 | "version": "==3.10" 878 | }, 879 | "isort": { 880 | "hashes": [ 881 | "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", 882 | "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615" 883 | ], 884 | "index": "pypi", 885 | "markers": "python_full_version >= '3.9.0'", 886 | "version": "==6.0.1" 887 | }, 888 | "multidict": { 889 | "hashes": [ 890 | "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134", 891 | "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17", 892 | "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6", 893 | "sha256:05db2f66c9addb10cfa226e1acb363450fab2ff8a6df73c622fefe2f5af6d4e7", 894 | "sha256:0b9e59946b49dafaf990fd9c17ceafa62976e8471a14952163d10a7a630413a9", 895 | "sha256:0db58da8eafb514db832a1b44f8fa7906fdd102f7d982025f816a93ba45e3dcb", 896 | "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b", 897 | "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55", 898 | "sha256:12f4581d2930840295c461764b9a65732ec01250b46c6b2c510d7ee68872b140", 899 | "sha256:1328201ee930f069961ae707d59c6627ac92e351ed5b92397cf534d1336ce557", 900 | "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e", 901 | "sha256:14117a41c8fdb3ee19c743b1c027da0736fdb79584d61a766da53d399b71176c", 902 | "sha256:15332783596f227db50fb261c2c251a58ac3873c457f3a550a95d5c0aa3c770d", 903 | "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65", 904 | "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c", 905 | "sha256:1bf99b4daf908c73856bd87ee0a2499c3c9a3d19bb04b9c6025e66af3fd07462", 906 | "sha256:1c8082e5814b662de8589d6a06c17e77940d5539080cbab9fe6794b5241b76d9", 907 | "sha256:208b9b9757060b9faa6f11ab4bc52846e4f3c2fb8b14d5680c8aac80af3dc751", 908 | "sha256:20c5a0c3c13a15fd5ea86c42311859f970070e4e24de5a550e99d7c271d76318", 909 | "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b", 910 | "sha256:233ad16999afc2bbd3e534ad8dbe685ef8ee49a37dbc2cdc9514e57b6d589ced", 911 | "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f", 912 | "sha256:295adc9c0551e5d5214b45cf29ca23dbc28c2d197a9c30d51aed9e037cb7c578", 913 | "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc", 914 | "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75", 915 | "sha256:35712f1748d409e0707b165bf49f9f17f9e28ae85470c41615778f8d4f7d9609", 916 | "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c", 917 | "sha256:37b09ca60998e87734699e88c2363abfd457ed18cfbf88e4009a4e83788e63ed", 918 | "sha256:3893a0d7d28a7fe6ca7a1f760593bc13038d1d35daf52199d431b61d2660602b", 919 | "sha256:41bb9d1d4c303886e2d85bade86e59885112a7f4277af5ad47ab919a2251f306", 920 | "sha256:42ca5aa9329a63be8dc49040f63817d1ac980e02eeddba763a9ae5b4027b9c9c", 921 | "sha256:43571f785b86afd02b3855c5ac8e86ec921b760298d6f82ff2a61daf5a35330b", 922 | "sha256:448e4a9afccbf297577f2eaa586f07067441e7b63c8362a3540ba5a38dc0f14a", 923 | "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7", 924 | "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3", 925 | "sha256:531e331a2ee53543ab32b16334e2deb26f4e6b9b28e41f8e0c87e99a6c8e2d69", 926 | "sha256:53becb01dd8ebd19d1724bebe369cfa87e4e7f29abbbe5c14c98ce4c383e16cd", 927 | "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55", 928 | "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10", 929 | "sha256:5633a82fba8e841bc5c5c06b16e21529573cd654f67fd833650a215520a6210e", 930 | "sha256:5bd8d6f793a787153956cd35e24f60485bf0651c238e207b9a54f7458b16d539", 931 | "sha256:61af8a4b771f1d4d000b3168c12c3120ccf7284502a94aa58c68a81f5afac090", 932 | "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e", 933 | "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063", 934 | "sha256:68e9e12ed00e2089725669bdc88602b0b6f8d23c0c95e52b95f0bc69f7fe9b55", 935 | "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b", 936 | "sha256:70b72e749a4f6e7ed8fb334fa8d8496384840319512746a5f42fa0aec79f4d61", 937 | "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d", 938 | "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680", 939 | "sha256:72d8815f2cd3cf3df0f83cac3f3ef801d908b2d90409ae28102e0553af85545a", 940 | "sha256:7394888236621f61dcdd25189b2768ae5cc280f041029a5bcf1122ac63df79f9", 941 | "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5", 942 | "sha256:766a4a5996f54361d8d5a9050140aa5362fe48ce51c755a50c0bc3706460c430", 943 | "sha256:769841d70ca8bdd140a715746199fc6473414bd02efd678d75681d2d6a8986c5", 944 | "sha256:775b464d31dac90f23192af9c291dc9f423101857e33e9ebf0020a10bfcf4144", 945 | "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", 946 | "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65", 947 | "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884", 948 | "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2", 949 | "sha256:877443eaaabcd0b74ff32ebeed6f6176c71850feb7d6a1d2db65945256ea535c", 950 | "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a", 951 | "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961", 952 | "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca", 953 | "sha256:934796c81ea996e61914ba58064920d6cad5d99140ac3167901eb932150e2e56", 954 | "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6", 955 | "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b", 956 | "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f", 957 | "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6", 958 | "sha256:9ed948328aec2072bc00f05d961ceadfd3e9bfc2966c1319aeaf7b7c21219183", 959 | "sha256:9f5b28c074c76afc3e4c610c488e3493976fe0e596dd3db6c8ddfbb0134dcac5", 960 | "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d", 961 | "sha256:a2be5b7b35271f7fff1397204ba6708365e3d773579fe2a30625e16c4b4ce817", 962 | "sha256:ab0a34a007704c625e25a9116c6770b4d3617a071c8a7c30cd338dfbadfe6485", 963 | "sha256:acf6b97bd0884891af6a8b43d0f586ab2fcf8e717cbd47ab4bdddc09e20652d8", 964 | "sha256:b1db4d2093d6b235de76932febf9d50766cf49a5692277b2c28a501c9637f616", 965 | "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373", 966 | "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888", 967 | "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648", 968 | "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1", 969 | "sha256:bb933c891cd4da6bdcc9733d048e994e22e1883287ff7540c2a0f3b117605092", 970 | "sha256:bc7f6fbc61b1c16050a389c630da0b32fc6d4a3d191394ab78972bf5edc568c2", 971 | "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3", 972 | "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d", 973 | "sha256:c60b401f192e79caec61f166da9c924e9f8bc65548d4246842df91651e83d600", 974 | "sha256:c8161b5a7778d3137ea2ee7ae8a08cce0010de3b00ac671c5ebddeaa17cefd22", 975 | "sha256:cdf22e4db76d323bcdc733514bf732e9fb349707c98d341d40ebcc6e9318ef3d", 976 | "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb", 977 | "sha256:d04d01f0a913202205a598246cf77826fe3baa5a63e9f6ccf1ab0601cf56eca0", 978 | "sha256:d25594d3b38a2e6cabfdcafef339f754ca6e81fbbdb6650ad773ea9775af35ab", 979 | "sha256:d4e47d8faffaae822fb5cba20937c048d4f734f43572e7079298a6c39fb172cb", 980 | "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8", 981 | "sha256:dd7793bab517e706c9ed9d7310b06c8672fd0aeee5781bfad612f56b8e0f7d14", 982 | "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643", 983 | "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471", 984 | "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0", 985 | "sha256:e2db616467070d0533832d204c54eea6836a5e628f2cb1e6dfd8cd6ba7277cb7", 986 | "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a", 987 | "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d", 988 | "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c", 989 | "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f", 990 | "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8", 991 | "sha256:e93089c1570a4ad54c3714a12c2cef549dc9d58e97bcded193d928649cab78e9", 992 | "sha256:e995a34c3d44ab511bfc11aa26869b9d66c2d8c799fa0e74b28a473a692532d6", 993 | "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df", 994 | "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b", 995 | "sha256:f114d8478733ca7388e7c7e0ab34b72547476b97009d643644ac33d4d3fe1821", 996 | "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37", 997 | "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c", 998 | "sha256:f54cb79d26d0cd420637d184af38f0668558f3c4bbe22ab7ad830e67249f2e0b", 999 | "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1" 1000 | ], 1001 | "markers": "python_version >= '3.9'", 1002 | "version": "==6.6.3" 1003 | }, 1004 | "mypy-extensions": { 1005 | "hashes": [ 1006 | "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", 1007 | "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" 1008 | ], 1009 | "markers": "python_version >= '3.8'", 1010 | "version": "==1.1.0" 1011 | }, 1012 | "packaging": { 1013 | "hashes": [ 1014 | "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", 1015 | "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" 1016 | ], 1017 | "markers": "python_version >= '3.8'", 1018 | "version": "==25.0" 1019 | }, 1020 | "pathspec": { 1021 | "hashes": [ 1022 | "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", 1023 | "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" 1024 | ], 1025 | "markers": "python_version >= '3.8'", 1026 | "version": "==0.12.1" 1027 | }, 1028 | "platformdirs": { 1029 | "hashes": [ 1030 | "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", 1031 | "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" 1032 | ], 1033 | "markers": "python_version >= '3.9'", 1034 | "version": "==4.3.8" 1035 | }, 1036 | "propcache": { 1037 | "hashes": [ 1038 | "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c", 1039 | "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81", 1040 | "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f", 1041 | "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6", 1042 | "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535", 1043 | "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be", 1044 | "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba", 1045 | "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3", 1046 | "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0", 1047 | "sha256:1f43837d4ca000243fd7fd6301947d7cb93360d03cd08369969450cc6b2ce3b4", 1048 | "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", 1049 | "sha256:2183111651d710d3097338dd1893fcf09c9f54e27ff1a8795495a16a469cc90b", 1050 | "sha256:21d8759141a9e00a681d35a1f160892a36fb6caa715ba0b832f7747da48fb6ea", 1051 | "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770", 1052 | "sha256:261df2e9474a5949c46e962065d88eb9b96ce0f2bd30e9d3136bcde84befd8f2", 1053 | "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892", 1054 | "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154", 1055 | "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf", 1056 | "sha256:2ca6d378f09adb13837614ad2754fa8afaee330254f404299611bce41a8438cb", 1057 | "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1", 1058 | "sha256:31248e44b81d59d6addbb182c4720f90b44e1efdc19f58112a3c3a1615fb47ef", 1059 | "sha256:34a624af06c048946709f4278b4176470073deda88d91342665d95f7c6270fbe", 1060 | "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897", 1061 | "sha256:3def3da3ac3ce41562d85db655d18ebac740cb3fa4367f11a52b3da9d03a5cc3", 1062 | "sha256:404d70768080d3d3bdb41d0771037da19d8340d50b08e104ca0e7f9ce55fce70", 1063 | "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", 1064 | "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44", 1065 | "sha256:4927842833830942a5d0a56e6f4839bc484785b8e1ce8d287359794818633ba0", 1066 | "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88", 1067 | "sha256:4ba3fef1c30f306b1c274ce0b8baaa2c3cdd91f645c48f06394068f37d3837a1", 1068 | "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3", 1069 | "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43", 1070 | "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4", 1071 | "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1", 1072 | "sha256:55ffda449a507e9fbd4aca1a7d9aa6753b07d6166140e5a18d2ac9bc49eac220", 1073 | "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7", 1074 | "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9", 1075 | "sha256:5f559e127134b07425134b4065be45b166183fdcb433cb6c24c8e4149056ad50", 1076 | "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e", 1077 | "sha256:6107ddd08b02654a30fb8ad7a132021759d750a82578b94cd55ee2772b6ebea2", 1078 | "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66", 1079 | "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1", 1080 | "sha256:64a67fb39229a8a8491dd42f864e5e263155e729c2e7ff723d6e25f596b1e8cb", 1081 | "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe", 1082 | "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c", 1083 | "sha256:70bd8b9cd6b519e12859c99f3fc9a93f375ebd22a50296c3a295028bea73b9e7", 1084 | "sha256:7435d766f978b4ede777002e6b3b6641dd229cd1da8d3d3106a45770365f9ad9", 1085 | "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e", 1086 | "sha256:76cace5d6b2a54e55b137669b30f31aa15977eeed390c7cbfb1dafa8dfe9a701", 1087 | "sha256:7a2368eed65fc69a7a7a40b27f22e85e7627b74216f0846b04ba5c116e191ec9", 1088 | "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8", 1089 | "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b", 1090 | "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f", 1091 | "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e", 1092 | "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02", 1093 | "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e", 1094 | "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1", 1095 | "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10", 1096 | "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387", 1097 | "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", 1098 | "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", 1099 | "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b", 1100 | "sha256:9bec58347a5a6cebf239daba9bda37dffec5b8d2ce004d9fe4edef3d2815137e", 1101 | "sha256:9da1cf97b92b51253d5b68cf5a2b9e0dafca095e36b7f2da335e27dc6172a614", 1102 | "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252", 1103 | "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9", 1104 | "sha256:a7fad897f14d92086d6b03fdd2eb844777b0c4d7ec5e3bac0fbae2ab0602bbe5", 1105 | "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c", 1106 | "sha256:abb7fa19dbf88d3857363e0493b999b8011eea856b846305d8c0512dfdf8fbb1", 1107 | "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770", 1108 | "sha256:aff2e4e06435d61f11a428360a932138d0ec288b0a31dd9bd78d200bd4a2b339", 1109 | "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251", 1110 | "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db", 1111 | "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf", 1112 | "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95", 1113 | "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df", 1114 | "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2", 1115 | "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945", 1116 | "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474", 1117 | "sha256:cc2782eb0f7a16462285b6f8394bbbd0e1ee5f928034e941ffc444012224171b", 1118 | "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615", 1119 | "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06", 1120 | "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33", 1121 | "sha256:d4a996adb6904f85894570301939afeee65f072b4fd265ed7e569e8d9058e4ec", 1122 | "sha256:d81ac3ae39d38588ad0549e321e6f773a4e7cc68e7751524a22885d5bbadf886", 1123 | "sha256:db429c19a6c7e8a1c320e6a13c99799450f411b02251fb1b75e6217cf4a14fcb", 1124 | "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1", 1125 | "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05", 1126 | "sha256:e514326b79e51f0a177daab1052bc164d9d9e54133797a3a58d24c9c87a3fe6d", 1127 | "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39", 1128 | "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67", 1129 | "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e", 1130 | "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28", 1131 | "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a", 1132 | "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", 1133 | "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725", 1134 | "sha256:fb075ad271405dcad8e2a7ffc9a750a3bf70e533bd86e89f0603e607b93aa64c", 1135 | "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206" 1136 | ], 1137 | "markers": "python_version >= '3.9'", 1138 | "version": "==0.3.2" 1139 | }, 1140 | "typing-extensions": { 1141 | "hashes": [ 1142 | "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", 1143 | "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76" 1144 | ], 1145 | "markers": "python_version < '3.13'", 1146 | "version": "==4.14.1" 1147 | }, 1148 | "yarl": { 1149 | "hashes": [ 1150 | "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845", 1151 | "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53", 1152 | "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a", 1153 | "sha256:0c869f2651cc77465f6cd01d938d91a11d9ea5d798738c1dc077f3de0b5e5fed", 1154 | "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2", 1155 | "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02", 1156 | "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf", 1157 | "sha256:14a85f3bd2d7bb255be7183e5d7d6e70add151a98edf56a770d6140f5d5f4010", 1158 | "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3", 1159 | "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef", 1160 | "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04", 1161 | "sha256:1f8a891e4a22a89f5dde7862994485e19db246b70bb288d3ce73a34422e55b23", 1162 | "sha256:21242b4288a6d56f04ea193adde174b7e347ac46ce6bc84989ff7c1b1ecea84e", 1163 | "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6", 1164 | "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e", 1165 | "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a", 1166 | "sha256:2c7b34d804b8cf9b214f05015c4fee2ebe7ed05cf581e7192c06555c71f4446a", 1167 | "sha256:2c89b5c792685dd9cd3fa9761c1b9f46fc240c2a3265483acc1565769996a3f8", 1168 | "sha256:30c41ad5d717b3961b2dd785593b67d386b73feca30522048d37298fee981805", 1169 | "sha256:33f29ecfe0330c570d997bcf1afd304377f2e48f61447f37e846a6058a4d33b2", 1170 | "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458", 1171 | "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc", 1172 | "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d", 1173 | "sha256:41493b9b7c312ac448b7f0a42a089dffe1d6e6e981a2d76205801a023ed26a2b", 1174 | "sha256:41ebd28167bc6af8abb97fec1a399f412eec5fd61a3ccbe2305a18b84fb4ca73", 1175 | "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7", 1176 | "sha256:46b5e0ccf1943a9a6e766b2c2b8c732c55b34e28be57d8daa2b3c1d1d4009309", 1177 | "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e", 1178 | "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698", 1179 | "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c", 1180 | "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691", 1181 | "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16", 1182 | "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f", 1183 | "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", 1184 | "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004", 1185 | "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3", 1186 | "sha256:57edc88517d7fc62b174fcfb2e939fbc486a68315d648d7e74d07fac42cec240", 1187 | "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28", 1188 | "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513", 1189 | "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773", 1190 | "sha256:59febc3969b0781682b469d4aca1a5cab7505a4f7b85acf6db01fa500fa3f6ba", 1191 | "sha256:6032e6da6abd41e4acda34d75a816012717000fa6839f37124a47fcefc49bec4", 1192 | "sha256:62915e6688eb4d180d93840cda4110995ad50c459bf931b8b3775b37c264af1e", 1193 | "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1", 1194 | "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31", 1195 | "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16", 1196 | "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819", 1197 | "sha256:69e9b141de5511021942a6866990aea6d111c9042235de90e08f94cf972ca03d", 1198 | "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3", 1199 | "sha256:6c4fbf6b02d70e512d7ade4b1f998f237137f1417ab07ec06358ea04f69134f8", 1200 | "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf", 1201 | "sha256:749d73611db8d26a6281086f859ea7ec08f9c4c56cec864e52028c8b328db723", 1202 | "sha256:76d12524d05841276b0e22573f28d5fbcb67589836772ae9244d90dd7d66aa13", 1203 | "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1", 1204 | "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b", 1205 | "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f", 1206 | "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d", 1207 | "sha256:835ab2cfc74d5eb4a6a528c57f05688099da41cf4957cf08cad38647e4a83b30", 1208 | "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", 1209 | "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a", 1210 | "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389", 1211 | "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e", 1212 | "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e", 1213 | "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c", 1214 | "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1", 1215 | "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833", 1216 | "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b", 1217 | "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee", 1218 | "sha256:9427925776096e664c39e131447aa20ec738bdd77c049c48ea5200db2237e000", 1219 | "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38", 1220 | "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8", 1221 | "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd", 1222 | "sha256:aef6c4d69554d44b7f9d923245f8ad9a707d971e6209d51279196d8e8fe1ae16", 1223 | "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d", 1224 | "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a", 1225 | "sha256:b5f307337819cdfdbb40193cad84978a029f847b0a357fbe49f712063cfc4f06", 1226 | "sha256:b982fa7f74c80d5c0c7b5b38f908971e513380a10fecea528091405f519b9ebb", 1227 | "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4", 1228 | "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9", 1229 | "sha256:bea21cdae6c7eb02ba02a475f37463abfe0a01f5d7200121b03e605d6a0439f8", 1230 | "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390", 1231 | "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8", 1232 | "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be", 1233 | "sha256:c7ddf7a09f38667aea38801da8b8d6bfe81df767d9dfc8c88eb45827b195cd1c", 1234 | "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", 1235 | "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b", 1236 | "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5", 1237 | "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4", 1238 | "sha256:d2b6fb3622b7e5bf7a6e5b679a69326b4279e805ed1699d749739a61d242449e", 1239 | "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f", 1240 | "sha256:dab096ce479d5894d62c26ff4f699ec9072269d514b4edd630a393223f45a0ee", 1241 | "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5", 1242 | "sha256:dd803820d44c8853a109a34e3660e5a61beae12970da479cf44aa2954019bf70", 1243 | "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1", 1244 | "sha256:df47c55f7d74127d1b11251fe6397d84afdde0d53b90bedb46a23c0e534f9d24", 1245 | "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653", 1246 | "sha256:e42ba79e2efb6845ebab49c7bf20306c4edf74a0b20fc6b2ccdd1a219d12fad3", 1247 | "sha256:eae7bfe2069f9c1c5b05fc7fe5d612e5bbc089a39309904ee8b829e322dcad00", 1248 | "sha256:f5a5928ff5eb13408c62a968ac90d43f8322fd56d87008b8f9dabf3c0f6ee983", 1249 | "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d", 1250 | "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7", 1251 | "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce", 1252 | "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e", 1253 | "sha256:ff70f32aa316393eaf8222d518ce9118148eddb8a53073c2403863b41033eed5" 1254 | ], 1255 | "markers": "python_version >= '3.9'", 1256 | "version": "==1.20.1" 1257 | } 1258 | } 1259 | } 1260 | --------------------------------------------------------------------------------