pax_global_header00006660000000000000000000000064151407477260014527gustar00rootroot0000000000000052 comment=4fe8f540e5ba32f7ecde98d82349a2015fa12361 morecantile-7.0.3/000077500000000000000000000000001514074772600140405ustar00rootroot00000000000000morecantile-7.0.3/.github/000077500000000000000000000000001514074772600154005ustar00rootroot00000000000000morecantile-7.0.3/.github/codecov.yml000066400000000000000000000002041514074772600175410ustar00rootroot00000000000000comment: off coverage: status: project: default: target: auto threshold: 5 morecantile-7.0.3/.github/workflows/000077500000000000000000000000001514074772600174355ustar00rootroot00000000000000morecantile-7.0.3/.github/workflows/ci.yml000066400000000000000000000066711514074772600205650ustar00rootroot00000000000000name: CI on: push: branches: - main tags: - '*' pull_request: env: LATEST_PY_VERSION: '3.14' jobs: tests: runs-on: ubuntu-latest strategy: matrix: python-version: ['3.11', '3.12', '3.13', '3.14'] steps: - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v7 with: version: "0.9.*" enable-cache: true python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --extra rasterio - name: Run pre-commit if: ${{ matrix.python-version == env.LATEST_PY_VERSION }} run: | uv run pre-commit run --all-files uv run --with mypy mypy -p morecantile --ignore-missing-imports - name: Run tests run: uv run pytest --cov morecantile --cov-report term-missing --cov-report xml - name: Upload Results if: ${{ matrix.python-version == env.LATEST_PY_VERSION }} uses: codecov/codecov-action@v5 with: files: ./coverage.xml flags: unittests fail_ci_if_error: false token: ${{ secrets.CODECOV_TOKEN }} benchmark: needs: [tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v7 with: version: "0.9.*" enable-cache: true python-version: ${{ env.LATEST_PY_VERSION }} - name: Install dependencies run: | uv sync --group benchmark - name: Run Benchmark run: | uv run pytest tests/benchmarks.py --benchmark-only --benchmark-columns 'min, max, mean, median' --benchmark-sort 'min' --benchmark-json output.json - name: Store and Compare benchmark result uses: benchmark-action/github-action-benchmark@v1 with: name: morecantile Benchmarks tool: 'pytest' output-file-path: output.json alert-threshold: '150%' comment-on-alert: true fail-on-alert: false # GitHub API token to make a commit comment github-token: ${{ secrets.GITHUB_TOKEN }} gh-pages-branch: 'gh-benchmarks' # Make a commit on `gh-pages` only if main auto-push: ${{ github.ref == 'refs/heads/main' }} benchmark-data-dir-path: dev/benchmarks publish: needs: [tests] runs-on: ubuntu-latest if: startsWith(github.event.ref, 'refs/tags') || github.event_name == 'release' steps: - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v7 with: version: "0.9.*" enable-cache: true python-version: ${{ env.LATEST_PY_VERSION }} - name: Install dependencies run: | uv sync --group deploy - name: Set tag version id: tag run: | echo "version=${GITHUB_REF#refs/*/}" echo "version=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT - name: Set module version id: module run: | echo "version=$(uv run hatch --quiet version)" >> $GITHUB_OUTPUT - name: Build and publish if: ${{ steps.tag.outputs.version }} == ${{ steps.module.outputs.version}} env: HATCH_INDEX_USER: ${{ secrets.PYPI_USERNAME }} HATCH_INDEX_AUTH: ${{ secrets.PYPI_PASSWORD }} run: | uv run hatch build uv run hatch publishmorecantile-7.0.3/.github/workflows/deploy_mkdocs.yml000066400000000000000000000011261514074772600230140ustar00rootroot00000000000000name: Publish docs via GitHub Pages on: push: branches: - main paths: # Only rebuild website when docs have changed - 'README.md' - 'CHANGES.md' - 'CONTRIBUTING.md' - 'docs/**' jobs: build: name: Deploy docs runs-on: ubuntu-latest steps: - name: Checkout main uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v7 with: version: "0.9.*" enable-cache: true - name: Deploy docs run: uv run --group docs mkdocs gh-deploy --force -f docs/mkdocs.ymlmorecantile-7.0.3/.gitignore000066400000000000000000000035001514074772600160260ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # PyCharm: .idea # VSCode .vscode .vscode/ .notebooks/ morecantile-7.0.3/.pre-commit-config.yaml000066400000000000000000000007501514074772600203230ustar00rootroot00000000000000repos: - repo: https://github.com/abravalheri/validate-pyproject rev: v0.24 hooks: - id: validate-pyproject - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.15.0 hooks: - id: ruff args: ["--fix"] - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.11.2 hooks: - id: mypy language_version: python additional_dependencies: - types-attrs - pydantic~=2.0 morecantile-7.0.3/CHANGES.md000066400000000000000000000515601514074772600154410ustar00rootroot00000000000000 ## Unreleased ## 7.0.3 (2026-02-05) * add top-level export (`__all__`) (author @kylebarron, https://github.com/developmentseed/morecantile/pull/202) ## 7.0.2 (2026-01-05) * fix `_lr` and `_ul` methods for `bottomLeft` TMS ## 7.0.1 (2025-12-19) * fix and improve type hints * remove `bump-my-version` from dev dependencies ## 7.0.0 (2025-11-20) * update the `WebMercatorQuad` definition to avoid rounding errors for bounds **breaking change** ```python import morecantile tms = morecantile.tms.get("WebMercatorQuad") # before print(tms.bounds(0, 0, 0)) >> BoundingBox(left=-180.0, bottom=-85.0511287798066, right=180.00000000000009, top=85.0511287798066) print(tms.xy_bounds(0, 0, 0)) >> BoundingBox(left=-20037508.342789244, bottom=-20037508.34278925, right=20037508.34278925, top=20037508.342789244) # now print(tms.bounds(0, 0, 0)) >> BoundingBox(left=-180.0, bottom=-85.0511287798066, right=180.0, top=85.0511287798066) print(tms.xy_bounds(0, 0, 0)) >> BoundingBox(left=-20037508.342789244, bottom=-20037508.342789244, right=20037508.342789244, top=20037508.342789244) ``` * docs: add example of how to enumerate tiles for a bounding box and zoom level(s) * use `WGS84` as default CRS for `TileMatrixSet.feature` GeoJSON response (as per specification) * add `geographic_crs` option for `TileMatrixSet.feature` method * update non-WGS84 CRS notation in `TileMatrixSet.feature` GeoJSON response ```python # before "properties": { "crs": { "type": "EPSG", "properties": {"code": 3857}, } } # now "properties": { "crs": { "type": "name", "properties": {"name": "http://www.opengis.net/def/crs/EPSG/0/3857"}, } # or "crs": { "type": "wkt", "properties": {"wkt": "..."}}, } } ``` * rename `grid_name -> tms` and `grid_crs -> tms_crs` property names in `TileMatrixSet.feature` GeoJSON response **breaking change** * check tile's zoom against TMS's `maxzoom` in `TileMatrixSet.is_valid` and add `strict=True|False` options **breaking change** ```python import morecantile tms = morecantile.tms.get("WebMercatorQuad") # before assert tms.is_valid(0, 0, 25) >> UserWarning: TileMatrix not found for level: 25 - Creating values from TMS Scale. # now assert tms.is_valid(0, 0, 25), "Tile(0, 0, 25) is not valid" >> AssertionError: Tile(0, 0, 25) is not valid assert tms.is_valid(0, 0, 25, strict=False) >> UserWarning: TileMatrix not found for level: 25 - Creating values from TMS Scale. ``` * remove `truncate_lnglat` from TileMatrixSet class **breaking change** * remove python 3.8, 3.9 and 3.10 support * add `geographic_crs` option in `TileMatrixSet.tiles` and `TileMatrixSet.tile` methods * make every `TileMatrixSet`'s attribute **frozen** * rename `morecantile.defaults.TileMatrixSets.tms` attribute to `tilematrixsets` **breaking change** * make sure that `morecantile.defaults.TileMatrixSets.get(name)` returns a copy of the TMS object * add `MORECANTILE_DEFAULT_GEOGRAPHIC_CRS` environment variable to control the default Geographic CRS * add `TileMatrixSet.set_geographic_crs(crs: pyproj.CRS)` method to overwrite the geographic CRS * add support for `BottomLeft` cornerOfOrigin TileMatrices * add python 3.14 support ## 6.2.0 (2024-12-19) * add python 3.13 support * update pyproj dependency version to `>=3.1,<4.0` ## 6.1.0 (2024-10-17) * add `_tile_matrices_idx: Dict[str, int]` private attribute to improve `matrices` lookup * change `xy_bounds()` and `bounds()` methods to avoid calculation duplication ## 6.0.0 (2024-10-16) * remove `_geographic_crs` private attribute in `TileMatrixSet` model **breaking change** * use `crs.geodetic_crs` property as `geographic_crs` **breaking change** ## 5.4.2 (2024-08-29) * better handle anti-meridian crossing bbox in `tms.tiles()` (author @ljstrnadiii, https://github.com/developmentseed/morecantile/pull/154) ## 5.4.1 (2024-08-27) * ensure `TileMatrixSet._geographic_crs` is a pyproj CRS object (author @AndrewAnnex, https://github.com/developmentseed/morecantile/pull/152) * add `python 3.12` support ## 5.4.0 (2024-08-20) * adds --tms optional argument to the shapes and tiles cli tools (author @AndrewAnnex, https://github.com/developmentseed/morecantile/pull/151) ## 5.3.1 (2024-07-26) * handle 180th meridian case for `tms.tiles()` (author @ljstrnadiii, https://github.com/developmentseed/morecantile/pull/150) ## 5.3.0 (2024-02-09) * enable custom decimation value for in `TileMatrixSet.custom` method (author @mccarthyryanc, https://github.com/developmentseed/morecantile/pull/146) ## 5.2.3 (2024-02-02) * update pydantic `Field` usage to avoid deprecation in 3.0 ## 5.2.2 (2024-01-25) * fix `id` for `WGS1984Quad` TileMatrixSet (from `WorldCRS84Quad` to `WGS1984Quad`) ## 5.2.1 (2024-01-18) * fix `CRS` WKT type from `string` to `Object` (PROJJSON) (ref: https://github.com/opengeospatial/2D-Tile-Matrix-Set/issues/89). ```python # Before wkt = pyproj.CRS.from_epsg(3857).to_wkt() TileMatrixSet( ... crs={"wkt": wkt} ) # Now wkt = pyproj.CRS.from_epsg(3857).to_json_dict() TileMatrixSet( ... crs={"wkt": wkt} ) ``` ## 5.2.0 (2024-01-18) * fix `CRS` parsing to allow `wkt ({"wkt": ...})` and `uri ({"uri": ...})` defined CRS ```python TileMatrixSet( ... crs="http://www.opengis.net/def/crs/EPSG/0/3857" ) TileMatrixSet( ... crs={"uri": "http://www.opengis.net/def/crs/EPSG/0/3857"} ) wkt = pyproj.CRS.from_epsg(3857).to_wkt() TileMatrixSet( ... crs={"wkt": wkt} ) ``` * update `TileMatrixSet` representation to use CRS's URI * remove default for `TileMatrixSet.pointOfOrigin` attribute (**required**) * add `topLeft` default for `TileMatrixSet.cornerOfOrigin` attribute * renamed `morecantile.models.CRSType` -> `morecantile.models.CRS` ## 5.1.0 (2024-01-08) * Simplify bounds calculation by using `TileMatrix.cellSize` instead of `TileMatrix.scaleDenominator` * remove `TileMatrixSet._resolution` private method ## 5.0.2 (2023-12-01) * Remove *alias* tiles in `.parent()`, `.children()`, `.neighbors()` and `.tiles()` methods for Variable Matrix Width TileMatrixSets (https://github.com/developmentseed/morecantile/pull/136) ## 5.0.1 (2023-12-01) [DELETED] * ~~Remove *alias* tiles in `.parent()`, `.children()`, `.neighbors()` and `.tiles()` methods for Variable Matrix Width TileMatrixSets (https://github.com/developmentseed/morecantile/pull/136)~~ ## 5.0.0 (2023-07-24) * update pydantic requirement to `~=2.0` * add support for TileMatrixSets with Variable Matrix Width * add `variableMatrixWidths` to the `TileMatrix` model * add `TileMatrixSet._lr()` (and `lr()`) to retrieve the lower right coordinates of a tile (instead of using upper-left of tile+1) * switch to `functools.cached_property` to cache properties (instead of cachetools.LRUcache) * rename `_is_quadtree` property to `is_quadtree` in `TileMatrixSet` model * fix possible bug in `TileMatrixSet._tile()` (and `.tile()`) method to make sure x or y are not greater than `matrixWidth - 1` or `matrixHeight - 1` ## 4.3.0 (2023-07-11) * add `.srs` property to `CRSType` * forward arguments to `pyproj.CRS` methods for `to_epsg()`, `to_wkt()`, `to_proj4()` and `to_json()` CRSType methods ## 4.2.1 (2023-07-02) * limit pydantic requirement to `~=1.0`` ## 4.2.0 (2023-06-09) * add `to_proj4` and `to_dict` and `to_json` methods to `CRSType` * remove `TileMatrixSet._crs` (replaced with `TileMatrixSet.crs._pyproj_crs`) ## 4.1.1 (2023-06-07) * add `to_epsg()` and `to_wkt()` methods to `CRSType` to allow compatibility with `4.0` ```python import morecantile tms = morecantile.tms.get("WebMercatorQuad") tms.crs >> CRSType(__root__='http://www.opengis.net/def/crs/EPSG/0/3857') tms.crs.to_epsg() >> 3857 tms._crs >> tms._crs.to_epsg() >> 3857 ``` ## 4.1.0 (2023-06-06) * Change CRS attribute in model to align more with the TMS spec and fix some OpenAPI schema issues (It should be a string URI or WKT, not a pyproj.CRS) * add `TileMatrixSet._crs` PrivateAttr to host the `pyproj.CRS` version of the crs * update `grid_crs` properties in `TileMatrixSet.feature()` result to return the `TileMatrixSet.CRS` (uri/wkt) instead of EPSG code ## 4.0.2 (2023-05-31) * Fix TileMatrixSet BoundingBox definition (https://github.com/developmentseed/morecantile/pull/122) ## 4.0.1 (2023-05-31) * Raise a `ValueError` when `nan` bounds are passed to `tiles` (author @samn, https://github.com/developmentseed/morecantile/pull/120) ## 4.0.0 (2023-05-22) * no change since `4.0.0a1` ## 4.0.0a1 (2023-05-17) * Fix possible bug when a TileMatrixSet does not have `id` ## 4.0.0a0 (2023-05-15) * Remove assumption tile rows/cols are ordered in `TileMatrixSet.tiles()` method (author @fsvenson, https://github.com/developmentseed/morecantile/pull/104) * switch to **TMS 2.0** specification (author @dchirst, https://github.com/developmentseed/morecantile/pull/101). See https://developmentseed.org/morecantile/tms-v2/ for more info. * remove `NZTM2000` TileMatrixSet (ref: https://github.com/developmentseed/morecantile/issues/103) * add `rasterio_geographic_crs` to export TMS's geographic CRS to Rasterio's CRS object (author @AndrewAnnex, https://github.com/developmentseed/morecantile/pull/109) * add `geographic_crs` property in the TileMatrixSet model to return the private `_geographic_crs` attribute * add cache LRU layer on top of `TileMatrixSet.bbox` method * changed the input type in `morecantile.defaults.TileMatrixSets.register()` from `Sequence[TileMatrixSet]` to `Dict[str, TileMatrixSets]` ```python my_custom_tms = ... # before defaults = morecantile.tms.register([my_custom_tms]) # now defaults = morecantile.tms.register({"MyCustomGrid": my_custom_tms}) ``` * made `id` and `title` optional in `morecantile.TileMatrixSet.custom()` method ```python crs = CRS.from_epsg(3031) extent = [-948.75, -543592.47, 5817.41, -3333128.95] # From https:///epsg.io/3031 # before tms = morecantile.TileMatrixSet.custom(extent, crs) print(tms.id, tms.title) >>> "Custom", "Custom TileMatrixSet" # now tms = morecantile.TileMatrixSet.custom(extent, crs) print(tms.id, tms.title) >>> None, None ``` * remove `boundingBox` in TileMatrixSet definition when created with `morecantile.TileMatrixSet.custom` ## 3.4.0 (2023-05-15) * [backported from 4.0] Remove assumption tile rows/cols are ordered in `TileMatrixSet.tiles()` method (author @fsvenson, https://github.com/developmentseed/morecantile/pull/104) * [backported from 4.0] add `rasterio_geographic_crs` to export TMS's geographic CRS to Rasterio's CRS object (author @AndrewAnnex, https://github.com/developmentseed/morecantile/pull/109) * [backported from 4.0] add `geographic_crs` property in the TileMatrixSet model to return the private `_geographic_crs` attribute * [backported from 4.0] add cache LRU layer on top of `TileMatrixSet.bbox` method ## 3.3.0 (2023-03-09) * sort default TMS (author @jlaura, https://github.com/developmentseed/morecantile/pull/98) * Switch to ruff for linting and fixing linting issues ## 3.2.5 (2022-12-16) * Do not parse TMS json files automatically but wait for the TMS to be used ## 3.2.4 (2022-12-14) * fix `CanadianNAD83_LCC`, `WorldMercatorWGS84Quad` and `EuropeanETRS89_LAEAQuad` TMS * add `title` option in `morecantile custom` CLI ## 3.2.3 (2022-12-13) * fix `utils.meters_per_unit` for non earth bodies (author @AndrewAnnex, https://github.com/developmentseed/morecantile/pull/92) * fix `CRS_to_uri` function to adds ability to export non-EPSG CRSs URIs (author @AndrewAnnex, https://github.com/developmentseed/morecantile/pull/93) ## 3.2.2 (2022-11-25) * add `morecantile.defaults.TileMatrixSets` in export ## 3.2.1 (2022-10-25) * add python 3.11 support ## 3.2.0 (2022-10-20) * add python 3.10 support * remove python 3.7 support * switch to pyproject.toml ## 3.1.2 (2022-03-21) * add support for `foot` and `US survey foot` CRS (https://github.com/developmentseed/morecantile/pull/86) ## 3.1.1 (2022-02-25) * fix issue with `zoom_for_res` when resolution is smaller than minzoom (author @samn, https://github.com/developmentseed/morecantile/pull/84) ## 3.1.0 (2022-02-18) * add `parent`, `children`, `neighbors`, `minmax`, `is_valid` methods (https://github.com/developmentseed/morecantile/pull/82) **breaking changes** * update `WebMercatorQuad` TMS to match `mercantile` and `GDAL` definition of the half-earth value ## 3.0.5 (2022-02-16) * truncate geographic Lon/Lat inputs to the TMS geographic bbox instead of `-180., -90., 180., 90.` (https://github.com/developmentseed/morecantile/pull/79) * remove `utils.truncate_lnglat` function (https://github.com/developmentseed/morecantile/pull/79) ## 3.0.4 (2022-02-16) * Allow zoom_for_res to work for a TMS with a minzoom > 0 (author @samn, https://github.com/developmentseed/morecantile/pull/78) ## 3.0.3 (2021-12-06) * add `WGS1984Quad` (`WGS84/epgs:4326`) TileMatrixSet (https://github.com/developmentseed/morecantile/pull/74) ## 3.0.2 (2021-11-12) * add `_geographic_crs` definition in `__init__` to make sure it's initialized from user input (author @davenquinn, https://github.com/developmentseed/morecantile/pull/72) ## 3.0.1 (2021-11-10) * rename `_to_wgs84` and `_from_wgs84` private attributes to `_to_geographic` and `_from_geographic` (https://github.com/developmentseed/morecantile/pull/68) * add `_geographic_crs` private attribute to `morecantile.TileMatrixSet` to define the CRS used in `_to_geographic` and `_from_geographic` (https://github.com/developmentseed/morecantile/pull/68) * fix `TileMatrixSet._invert_axis` method to only check axis information (https://github.com/developmentseed/morecantile/pull/71) ## 3.0.0 (2021-09-23) * no change since 3.0.0a1 ## 3.0.0a1 (2021-09-17) * only import rasterio if needed (https://github.com/developmentseed/morecantile/pull/66) ## 3.0.0a0 (2021-09-09) * add `.rasterio_crs` properties to TMS for compatibility with rasterio (https://github.com/developmentseed/morecantile/pull/58) * Use new Class-like notation for namedtuple (https://github.com/developmentseed/morecantile/pull/58) **breaking changes** * switch from rasterio to PyProj for CRS definition and projection transformation (https://github.com/developmentseed/morecantile/pull/58) * remove python 3.6 supports (because of pyproj) ## 2.1.4 (2021-08-20) * add **NZTM2000Quad** tile matrix set from LINZ (author @blacha, https://github.com/developmentseed/morecantile/pull/57) * add **quadkey** supports (@author adrian-knauer, https://github.com/developmentseed/morecantile/pull/56) ```python import morecantile tms = morecantile.tms.get("WebMercatorQuad") # Tile to Quadkey tms.quadkey(486, 332, 10) >>> "0313102310" # Quadkey to Tile tms.quadkey_to_tile("0313102310") >>> Tile(486, 332, 10) ``` * update `NZTM2000*` CRS uri from `https://www.opengis.net/def/crs/EPSG/0/2193` to `urn:ogc:def:crs:EPSG:2193` (https://github.com/developmentseed/morecantile/pull/61) ## 2.1.3 - Doesn't exists ## 2.1.2 (2021-05-18) * fix wrong TMS boundingBox definition when using inverted CRS (https://github.com/developmentseed/morecantile/pull/53) ## 2.1.1 (2021-05-17) * remove `mercantile` dependency. * raise `PointOutsideTMSBounds` warning when user is doing operations outside TMS bounds. * fix wrong `xy_bbox` when `tms.boundingBox` use a specific CRS. ## 2.1.0 (2020-12-17) * add `zoom_level_strategy` option for `TileMatrixSet.zoom_for_res` to match GDAL 3.2. By default, it is set to `auto`, meaning that it will select the closest zoom level. User can set the strategy to `lower` or `upper` to select below or above zoom levels. ```python import morecantile tms = morecantile.tms.get("WebMercatorQuad") # native resolution of zoom 7 is 1222.9924 m # native resolution of zoom 8 is 611.4962 m assert tms.zoom_for_res(612.0) == 8 assert tms.zoom_for_res(612.0, zoom_level_strategy="lower") == 7 assert tms.zoom_for_res(612.0, zoom_level_strategy="upper") == 8 ``` ## 2.0.1 (2020-11-05) * simplify `morecantile.TileMatrixSet` default representation ```python from morecantile import tms tms.get("WorldCRS84Quad") >>> print(tms.get("WorldCRS84Quad").json()) >>> { 'type': 'TileMatrixSetType', 'title': 'CRS84 for the World', 'abstract': None, 'keywords': None, 'identifier': 'WorldCRS84Quad', 'supportedCRS': CRS.from_epsg(4326), 'wellKnownScaleSet': AnyHttpUrl(...), 'boundingBox': { 'type': 'BoundingBoxType', 'crs': CRS.from_epsg(4326), 'lowerCorner': (-180.0, -90.0), 'upperCorner': (180.0, 90.0)}, 'tileMatrix': [...] } ``` ## 2.0.0 (2020-11-04) * switch from `CoordBBox` to `rasterio.coords.BoundingBox` (ref: https://github.com/developmentseed/morecantile/issues/38). * update `morecantile.commons` Tile and Coords to match rasterio's BoundingBox. * rename `morecantile.models.BoundingBox` to `morecantile.models.TMSBoundingBox` to avoind name colision with rasterio's BoundingBox. * improve default TMS immutability by making `morecantile.tms.register` to return a new TileMatrixSets instance (ref: https://github.com/developmentseed/morecantile/issues/37) ```python import morecantile import TileMatrixSet, tms from rasterio.crs import CRS crs = CRS.from_epsg(3031) extent = [-948.75, -543592.47, 5817.41, -3333128.95] # From https:///epsg.io/3031 custom_tms = TileMatrixSet.custom(extent, crs, identifier="MyCustomTmsEPSG3031") print(len(tms.list())) >>> 10 defaults = tms.register(custom_tms) print(len(tms.list())) >>> 10 print(len(defaults.list())) >>> 11 ``` ## 1.3.1 (2020-10-07) * remove `pkg_resources` (https://github.com/pypa/setuptools/issues/510, https://github.com/developmentseed/morecantile/pull/36) * add `TILEMATRIXSET_DIRECTORY` to allow morecantile to load user's TMS ```python # Save custom TMS to a file import morecantile from rasterio.crs import CRS crs = CRS.from_epsg(3031) extent = [-948.75, -543592.47, 5817.41, -3333128.95] # From https:///epsg.io/3031 tms = morecantile.TileMatrixSet.custom(extent, crs, identifier="MyCustomTmsEPSG3031") with open("/tmp/mytms/MyCustomTmsEPSG3031.json", "w") as f: f.write(tms.json(exclude_none=True)) ``` ```python import os os.environ["TILEMATRIXSET_DIRECTORY"] = "/tmp/mytms" from morecantile import tms assert "MyCustomTmsEPSG3031" in tms.list() ``` ## 1.3.0.post1 (2020-09-30) * fix TileMatrixSet's model schema bug where pydantic wasn't able to translate `Union[rasterio.crs.CRS, pydantic.AnyHttpUrl]` to a valid schema (ref: https://github.com/developmentseed/morecantile/issues/34) ## 1.3.0 (2020-09-30) * Allow Custom CRS for custom TMS definition (https://github.com/developmentseed/morecantile/issues/23) * Extend TMS beyond TMS Document max zoom level (https://github.com/developmentseed/morecantile/pull/28) * Require rasterio >= 1.1.7 (sept 2020) to support inverted lat/lon TMS (ref: https://github.com/developmentseed/morecantile/issues/26) * Remove deprecated function * Add `tms.xy_bbox` and `tms.bbox` properties to return TileMatrixSet boundaries. * Add `tms.intersect_tms` to check if a bbox intersect with the TileMatrixSet boundaries. * Avoid out-range tiles (e.g. negative indexes) * Add `tms.zoom_for_res` function to get the TMS zoom level for a specific resolution (https://github.com/developmentseed/morecantile/issues/31). ## 1.2.0 (2020-06-01) * add TileMatrixSet minzoom/maxzoom properties * fix TileMatrixSet.tile calculation * add TileMatrixSet.tiles function (replicat from mercantile) * add buffer and projected options to TileMatrixSet.feature method * removes mercantile as dependencies * add CLI * renamed `morecantile.TileMatrixSet.point_towgs84` to `morecantile.TileMatrixSet.lnglat` (matches mercantile) * renamed `morecantile.TileMatrixSet.point_fromwgs84` to `morecantile.TileMatrixSet.xy` (matches mercantile) * add `truncate` option in `morecantile.TileMatrixSet.tile` (matches mercantile) * re-order buffer and precision options in `morecantile.TileMatrixSet.feature` (matches mercantile) * uses mercantile's tests ## 1.1.1 (2020-05-15) * Fix bad default TMS files (https://github.com/developmentseed/morecantile/issues/13) * Add regex in model for identifier validation ## 1.1.0 (2020-05-13) * better submodule definition * add `morecantile.tms` object to access and register defaults TileMatrixSet * Add depreciation warning for `morecantile.TileMatrixSet.load` method ## 1.0.0 (2020-05-11) Major refactor of Morecantile, which is now based on OGC TileMatrixSet JSON documents. * use pydantic model to validate TMS JSON documents (https://github.com/developmentseed/morecantile/pull/6, author @geospatial-jeff) * morecantile methods are part of the TMS model (https://github.com/developmentseed/morecantile/pull/7) ## 0.1.0 (2020-02-03) * Rename defaults grids (https://github.com/developmentseed/morecantile/issues/1) ## 0.0.1 (2020-01-23) * Initial release morecantile-7.0.3/CONTRIBUTING.md000066400000000000000000000023721514074772600162750ustar00rootroot00000000000000# Contributing Issues and pull requests are more than welcome. We recommand using [`uv`](https://docs.astral.sh/uv) as project manager for development. See https://docs.astral.sh/uv/getting-started/installation/ for installation **dev install** ```bash git clone https://github.com/developmentseed/morecantile.git cd morecantile uv sync --extra rasterio ``` You can then run the tests with the following command: ```sh uv run pytest --cov morecantile --cov-report term-missing -s -vv ``` ### pre-commit This repo is set to use `pre-commit` to run *isort*, *flake8*, *pydocstring*, *black* ("uncompromising Python code formatter") and mypy when committing new code. ```bash uv run pre-commit install ``` ##### Performance tests ```sh uv sync --group benchmark uv run pytest tests/benchmarks.py --benchmark-only --benchmark-columns 'min, max, mean, median' --benchmark-sort 'min' ``` ### Docs ```bash git clone https://github.com/developmentseed/morecantile.git cd morecantile uv sync --group docs ``` Hot-reloading docs: ```bash uv run mkdocs serve -f docs/mkdocs.yml ``` To manually deploy docs (note you should never need to do this because Github Actions deploys automatically for new commits.): ```bash uv run mkdocs gh-deploy -f docs/mkdocs.yml ```morecantile-7.0.3/LICENSE000066400000000000000000000020611514074772600150440ustar00rootroot00000000000000MIT License Copyright (c) 2020 Development Seed Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. morecantile-7.0.3/README.md000066400000000000000000000125441514074772600153250ustar00rootroot00000000000000# Morecantile

Construct and use map tile grids (a.k.a TileMatrixSet / TMS).

Test Coverage Package version Downloads License

--- **Documentation**: https://developmentseed.org/morecantile/ **Source Code**: https://github.com/developmentseed/morecantile --- Morecantile is like [mercantile](https://github.com/mapbox/mercantile) (the best tool to work with Web Mercator tile indexes), but with support for other TileMatrixSet grids. **Morecantile** follows the **OGC Two Dimensional Tile Matrix Set** specification **2.0** found in [https://docs.ogc.org/is/17-083r4/17-083r4.html](https://docs.ogc.org/is/17-083r4/17-083r4.html) | Morecantile Version | OGC Specification Version | Link | ------------------- | ------------------------- |--------- | >=4.0 | 2.0 | https://docs.ogc.org/is/17-083r4/17-083r4.html | =<3.0 | 1.0 | http://docs.opengeospatial.org/is/17-083r2/17-083r2.html ## Install ```bash python -m pip install -U pip python -m pip install morecantile # Or install from source: python -m pip install -U pip python -m pip install git+https://github.com/developmentseed/morecantile.git ``` ## Usage ```python import morecantile tms = morecantile.tms.get("WebMercatorQuad") # Get TMS bounding box print(tms.xy_bbox) >>> BoundingBox( left=-20037508.342789244, bottom=-20037508.34278919, right=20037508.34278919, top=20037508.342789244, ) # Get the bounds for tile Z=4, X=10, Y=10 in the TMS's CRS (e.g epsg:3857) print(tms.xy_bounds(morecantile.Tile(10, 10, 4))) >>> BoundingBox( left=5009377.085697308, bottom=-7514065.628545959, right=7514065.628545959, top=-5009377.085697308, ) # Get the bounds for tile Z=4, X=10, Y=10 in Geographic CRS (e.g epsg:4326) print(tms.bounds(morecantile.Tile(10, 10, 4))) >>> BoundingBox( left=44.999999999999964, bottom=-55.776573018667634, right=67.4999999999999, top=-40.97989806962009, ) ``` More info can be found at https://developmentseed.org/morecantile/usage/ ### Defaults Grids `morecantile` provides a set of default TileMatrixSets: - **CDB1GlobalGrid** \*: CDB 1 Global Grid - EPGS:4326 (WGS84) - **CanadianNAD83_LCC**: Lambert conformal conic NAD83 for Canada - EPSG:3978 - **EuropeanETRS89_LAEAQuad**: ETRS89-extended / LAEA Europe - EPGS:3035 - **GNOSISGlobalGrid** \*: GNOSIS Global Grid - EPGS:4326 (WGS84) - **LINZAntarticaMapTilegrid**: LINZ Antarctic Map Tile Grid (Ross Sea Region) - EPSG:5482 - **NZTM2000Quad**: LINZ NZTM2000 Map Tile Grid - EPSG:2193 - **UPSAntarcticWGS84Quad**: Universal Polar Stereographic WGS 84 Quad for Antarctic - EPSG:5042 - **UPSArcticWGS84Quad**: Universal Polar Stereographic WGS 84 Quad for Arctic - EPSG:5041 - **UTM31WGS84Quad**: Example of UTM grid - EPSG:32631 - **WebMercatorQuad**: Spherical Mercator - EPGS:3857 (default grid for Web Mercator based maps) - **WGS1984Quad**: EPSG:4326 for the World - EPGS:4326 (WGS84) - **WorldCRS84Quad**: CRS84 for the World - **WorldMercatorWGS84Quad**: Elliptical Mercator projection - EPGS:3395 \* TileMatrixSets with variable Matrix Width (see https://docs.ogc.org/is/17-083r4/17-083r4.html#toc15) ref: https://schemas.opengis.net/tms/2.0/json/examples/tilematrixset/ ## Implementations - [rio-tiler](https://github.com/cogeotiff/rio-tiler): Create tile from raster using Morecantile TMS. - [titiler](https://github.com/developmentseed/titiler): A modern dynamic tile server built on top of FastAPI and Rasterio/GDAL. - [tipg](https://github.com/developmentseed/tipg): OGC Features and Tiles API. - [planetcantile](https://github.com/AndrewAnnex/planetcantile): Tile matrix sets for other planets. - [supermorecado](https://github.com/developmentseed/supermorecado): Extend the functionality of morecantile with additional commands. ## Changes See [CHANGES.md](https://github.com/developmentseed/morecantile/blob/main/CHANGES.md). ## Contribution & Development See [CONTRIBUTING.md](https://github.com/developmentseed/morecantile/blob/main/CONTRIBUTING.md) ## License See [LICENSE](https://github.com/developmentseed/morecantile/blob/main/LICENSE) ## Authors Created by [Development Seed]() morecantile-7.0.3/benchmarks/000077500000000000000000000000001514074772600161555ustar00rootroot00000000000000morecantile-7.0.3/benchmarks/README.md000066400000000000000000000155201514074772600174370ustar00rootroot00000000000000 ## Benchmark Compare `mercantile`, `utiles` and `morecantile` ```sh python -m pip install -r requirements.txt python -m pytest benchmarks.py --benchmark-only --benchmark-columns 'min, max, mean, median' --benchmark-sort 'min' ``` ``` ----------------------------------------------------- benchmark 'bounds': 21 tests ---------------------------------------------------- Name (time in ns) Min Max Mean Median --------------------------------------------------------------------------------------------------------------------------------------- test_bounds[utiles-(486, 332, 30)] 83.0000 (1.0) 52,000.0000 (52.97) 195.3371 (1.48) 208.0000 (1.60) test_bounds[utiles-(0, 0, 0)] 83.0000 (1.00) 31,167.0000 (31.75) 193.5957 (1.47) 208.0000 (1.60) test_bounds[utiles-(1, 0, 1)] 125.0000 (1.51) 981.6700 (1.0) 132.0177 (1.0) 130.8300 (1.01) test_bounds[utiles-(1, 40, 7)] 125.0000 (1.51) 8,606.2500 (8.77) 132.5298 (1.00) 130.0000 (1.0) test_bounds[utiles-(486, 332, 10)] 128.3300 (1.55) 1,600.8300 (1.63) 133.4046 (1.01) 131.6700 (1.01) test_bounds[utiles-(1, 1, 1)] 129.5900 (1.56) 16,846.2500 (17.16) 141.9846 (1.08) 134.1700 (1.03) test_bounds[utiles-(486, 332, 20)] 138.3300 (1.67) 1,123.3300 (1.14) 142.5420 (1.08) 141.2500 (1.09) test_bounds[mercantile-(1, 40, 7)] 1,000.0000 (12.05) 92,416.0000 (94.14) 1,193.0112 (9.04) 1,167.0000 (8.98) test_bounds[mercantile-(1, 1, 1)] 1,075.0000 (12.95) 48,066.8000 (48.96) 1,154.8100 (8.75) 1,141.6000 (8.78) test_bounds[mercantile-(0, 0, 0)] 1,083.0000 (13.05) 21,041.0000 (21.43) 1,214.6049 (9.20) 1,208.0000 (9.29) test_bounds[mercantile-(1, 0, 1)] 1,083.0000 (13.05) 75,291.0000 (76.70) 1,213.7837 (9.19) 1,208.0000 (9.29) test_bounds[mercantile-(486, 332, 10)] 1,083.0000 (13.05) 55,750.0000 (56.79) 1,223.7598 (9.27) 1,208.0000 (9.29) test_bounds[mercantile-(486, 332, 20)] 1,083.0000 (13.05) 89,041.0000 (90.70) 1,248.4256 (9.46) 1,209.0000 (9.30) test_bounds[mercantile-(486, 332, 30)] 1,083.0000 (13.05) 194,958.0000 (198.60) 1,239.4339 (9.39) 1,209.0000 (9.30) test_bounds[morecantile-(1, 0, 1)] 20,083.0000 (241.96) 132,625.0000 (135.10) 20,893.1235 (158.26) 20,667.0000 (158.98) test_bounds[morecantile-(0, 0, 0)] 20,166.0000 (242.96) 120,333.0000 (122.58) 20,974.1961 (158.87) 20,708.0000 (159.29) test_bounds[morecantile-(1, 1, 1)] 20,334.0000 (244.99) 60,958.0000 (62.10) 21,236.2953 (160.86) 20,750.0000 (159.62) test_bounds[morecantile-(1, 40, 7)] 21,667.0000 (261.05) 173,458.0000 (176.70) 22,622.6537 (171.36) 22,333.0000 (171.79) test_bounds[morecantile-(486, 332, 10)] 22,166.0000 (267.06) 205,125.0000 (208.96) 23,512.1607 (178.10) 22,875.0000 (175.96) test_bounds[morecantile-(486, 332, 20)] 24,708.0000 (297.69) 129,250.0000 (131.66) 25,775.0796 (195.24) 25,375.0000 (195.19) test_bounds[morecantile-(486, 332, 30)] 71,292.0000 (858.94) 205,625.0000 (209.46) 73,569.4565 (557.27) 72,667.0000 (558.98) --------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------- benchmark 'xy_bounds': 21 tests ----------------------------------------------------- Name (time in ns) Min Max Mean Median ------------------------------------------------------------------------------------------------------------------------------------------ test_xy_bounds[utiles-(0, 0, 0)] 83.0000 (1.0) 57,375.0000 (112.55) 145.9127 (1.57) 125.0000 (1.36) test_xy_bounds[utiles-(1, 1, 1)] 88.3400 (1.06) 1,335.4200 (2.62) 93.1478 (1.00) 92.5000 (1.00) test_xy_bounds[utiles-(1, 40, 7)] 88.7500 (1.07) 1,451.2500 (2.85) 93.1258 (1.0) 92.0900 (1.0) test_xy_bounds[utiles-(1, 0, 1)] 89.5900 (1.08) 861.6600 (1.69) 93.6428 (1.01) 93.3300 (1.01) test_xy_bounds[utiles-(486, 332, 10)] 90.0000 (1.08) 509.7950 (1.0) 93.2818 (1.00) 92.9150 (1.01) test_xy_bounds[utiles-(486, 332, 20)] 90.4100 (1.09) 864.1700 (1.70) 94.2974 (1.01) 94.1600 (1.02) test_xy_bounds[utiles-(486, 332, 30)] 90.4100 (1.09) 1,377.5000 (2.70) 94.7366 (1.02) 94.1600 (1.02) test_xy_bounds[mercantile-(0, 0, 0)] 708.0000 (8.53) 42,250.0000 (82.88) 843.2292 (9.05) 833.0000 (9.05) test_xy_bounds[mercantile-(486, 332, 10)] 731.2500 (8.81) 5,393.7500 (10.58) 770.8331 (8.28) 764.6000 (8.30) test_xy_bounds[mercantile-(486, 332, 30)] 731.2500 (8.81) 7,316.6500 (14.35) 770.2423 (8.27) 764.6000 (8.30) test_xy_bounds[mercantile-(1, 0, 1)] 732.1429 (8.82) 9,404.8571 (18.45) 791.7721 (8.50) 785.7143 (8.53) test_xy_bounds[mercantile-(1, 40, 7)] 733.3000 (8.83) 5,950.0000 (11.67) 772.3273 (8.29) 766.7000 (8.33) test_xy_bounds[mercantile-(486, 332, 20)] 733.3500 (8.84) 7,408.3000 (14.53) 773.4718 (8.31) 768.7500 (8.35) test_xy_bounds[mercantile-(1, 1, 1)] 735.4000 (8.86) 4,762.5000 (9.34) 783.2100 (8.41) 777.1000 (8.44) test_xy_bounds[morecantile-(0, 0, 0)] 3,042.0000 (36.65) 108,208.0000 (212.26) 3,287.1089 (35.30) 3,250.0000 (35.29) test_xy_bounds[morecantile-(1, 0, 1)] 3,291.0000 (39.65) 68,166.0000 (133.71) 3,503.4695 (37.62) 3,459.0000 (37.56) test_xy_bounds[morecantile-(1, 1, 1)] 3,291.0000 (39.65) 72,875.0000 (142.95) 3,506.8544 (37.66) 3,500.0000 (38.01) test_xy_bounds[morecantile-(1, 40, 7)] 4,375.0000 (52.71) 76,375.0000 (149.82) 4,630.2893 (49.72) 4,584.0000 (49.78) test_xy_bounds[morecantile-(486, 332, 10)] 4,875.0000 (58.73) 85,208.0000 (167.14) 5,197.3581 (55.81) 5,125.0000 (55.65) test_xy_bounds[morecantile-(486, 332, 20)] 6,916.0000 (83.33) 78,458.0000 (153.90) 7,221.0669 (77.54) 7,166.0000 (77.82) test_xy_bounds[morecantile-(486, 332, 30)] 52,667.0000 (634.54) 404,208.0000 (792.88) 54,749.1232 (587.90) 54,333.0000 (590.00) ------------------------------------------------------------------------------------------------------------------------------------------ ``` morecantile-7.0.3/benchmarks/benchmarks.py000066400000000000000000000056601514074772600206530ustar00rootroot00000000000000"""Morecantile/Mercantile/Utiles comparison benchmark The benchmark suite is adapted from jessekrubin/utiles https://github.com/jessekrubin/utiles/blob/ea58b9a017a2e3528f03cc20f16ef531737b863f/utiles-pyo3/bench/test_bench.py#L17-L25 """ # This file is a modified version of https://github.com/jessekrubin/utiles/blob/ea58b9a017a2e3528f03cc20f16ef531737b863f/utiles-pyo3/bench/test_bench.py. # # The original license follows. # # MIT License # # Copyright (c) 2023 jessekrubin # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. from typing import Callable, Tuple import mercantile import pytest import utiles import morecantile tms = morecantile.tms.get("WebMercatorQuad") TEST_TILES = ( (0, 0, 0), (1, 0, 1), (1, 1, 1), (1, 40, 7), (486, 332, 10), # HIGH ZOOM (486, 332, 20), # OUTSIDE TMS Range (486, 332, 30), ) @pytest.mark.parametrize( "tile", [pytest.param(t, id=str(t)) for t in TEST_TILES], ) @pytest.mark.parametrize( "func", [ pytest.param(mercantile.bounds, id="mercantile"), pytest.param(tms.bounds, id="morecantile"), pytest.param(utiles.bounds, id="utiles"), ], ) @pytest.mark.benchmark(group="bounds") def test_bounds( tile: Tuple[int, int, int], func: Callable[[Tuple[int, int, int]], Tuple[float, float]], benchmark, ) -> None: """Benchmark bounds() method.""" _ = benchmark(func, *tile) @pytest.mark.parametrize( "tile", [pytest.param(t, id=str(t)) for t in TEST_TILES], ) @pytest.mark.parametrize( "func", [ pytest.param(mercantile.xy_bounds, id="mercantile"), pytest.param(tms.xy_bounds, id="morecantile"), pytest.param(utiles.xy_bounds, id="utiles"), ], ) @pytest.mark.benchmark(group="xy_bounds") def test_xy_bounds( tile: Tuple[int, int, int], func: Callable[[Tuple[int, int, int]], Tuple[float, float]], benchmark, ) -> None: """Benchmark xy_bounds() method.""" _ = benchmark(func, *tile) morecantile-7.0.3/benchmarks/requirements.txt000066400000000000000000000000671514074772600214440ustar00rootroot00000000000000pytest pytest-benchmark morecantile mercantile utiles morecantile-7.0.3/docs/000077500000000000000000000000001514074772600147705ustar00rootroot00000000000000morecantile-7.0.3/docs/mkdocs.yml000066400000000000000000000061441514074772600170000ustar00rootroot00000000000000# Project Information site_name: 'morecantile' site_description: 'Construct and use map tile grids (a.k.a TileMatrixSet / TMS).' docs_dir: 'src' site_dir: 'build' # Repository repo_name: 'developmentseed/morecantile' repo_url: 'https://github.com/developmentseed/morecantile' edit_uri: 'blob/main/src/' site_url: 'https://developmentseed.org/morecantile/' # Social links extra: social: - icon: 'fontawesome/brands/github' link: 'https://github.com/developmentseed' - icon: 'fontawesome/brands/twitter' link: 'https://twitter.com/developmentseed' # Layout nav: - Home: 'index.md' - Usage: 'usage.md' - Advanced: - Geographic Transformations: advanced/geographic.md - TMS v2: 'tms-v2.md' - API: - morecantile.commons: api/morecantile/commons.md - morecantile.defaults: api/morecantile/defaults.md - morecantile.errors: api/morecantile/errors.md - morecantile.models: api/morecantile/models.md - morecantile.utils: api/morecantile/utils.md - CLI: 'cli.md' - Benchmarking: benchmark.html - Development - Contributing: 'contributing.md' - Release: 'release-notes.md' # Theme theme: icon: logo: 'material/home' repo: 'fontawesome/brands/github' name: 'material' language: 'en' palette: primary: 'pink' accent: 'light pink' font: text: 'Nunito Sans' code: 'Fira Code' features: - content.code.annotate - content.code.copy - navigation.indexes - navigation.instant - navigation.tracking - search.suggest - search.share plugins: - search - mkdocstrings: enable_inventory: true handlers: python: paths: [src] options: filters: - "!^__post_init__" docstring_section_style: list docstring_style: google line_length: 100 separate_signature: true show_root_heading: true show_signature_annotations: true show_source: false show_symbol_type_toc: true signature_crossrefs: true extensions: - griffe_inherited_docstrings import: - https://docs.python.org/3/objects.inv - https://rasterio.readthedocs.io/en/stable/objects.inv - https://docs.pydantic.dev/latest/objects.inv - https://pyproj4.github.io/pyproj/stable/objects.inv # These extensions are chosen to be a superset of Pandoc's Markdown. # This way, I can write in Pandoc's Markdown and have it be supported here. # https://pandoc.org/MANUAL.html markdown_extensions: - admonition - attr_list - codehilite: guess_lang: false - def_list - footnotes - pymdownx.arithmatex - pymdownx.betterem - pymdownx.caret: insert: false - pymdownx.details - pymdownx.emoji - pymdownx.escapeall: hardbreak: true nbsp: true - pymdownx.magiclink: hide_protocol: true repo_url_shortener: true - pymdownx.smartsymbols - pymdownx.superfences - pymdownx.tasklist: custom_checkbox: true - pymdownx.tilde - toc: permalink: true morecantile-7.0.3/docs/src/000077500000000000000000000000001514074772600155575ustar00rootroot00000000000000morecantile-7.0.3/docs/src/advanced/000077500000000000000000000000001514074772600173245ustar00rootroot00000000000000morecantile-7.0.3/docs/src/advanced/geographic.md000066400000000000000000000072351514074772600217650ustar00rootroot00000000000000 Several methods/properties of the **morecantile.TileMatrixSet** object use Geographic Coordinates Reference System (CRS) to transform coordinates from/to the TMS's CRS: - `TileMatrixSet.lnglat(x, y)`: Transform point(x,y) to geographic longitude and latitude - `TileMatrixSet.xy(lng, lat)`: Transform geographic longitude and latitude coordinates to TMS CRS - `TileMatrixSet.ul(Tile)`: Return the upper left coordinates of the tile in geographic coordinate reference system - `TileMatrixSet.lr(Tile)`: Return the lower right coordinates of the tile in geographic coordinate reference system - `TileMatrixSet.bounds(Tile)`: Return the bounding box of the tile in geographic coordinate reference system - `TileMatrixSet.bbox`: Return TMS bounding box in geographic coordinate reference system For those methods/properties, the Geographic CRS is defined by the TileMatrixSet CRS's geographic CRS (`CRS.geodetic_crs`). The most common one is the `World Geodetic System 1984` (`WGS84` or `EPSG:4326`) but it's not the one used by default. ```python import morecantile morecantile.tms.get("WebMercatorQuad").geographic_crs >> Name: WGS 84 Axis Info [ellipsoidal]: - Lat[north]: Geodetic latitude (degree) - Lon[east]: Geodetic longitude (degree) Area of Use: - name: World. - bounds: (-180.0, -90.0, 180.0, 90.0) Datum: World Geodetic System 1984 ensemble - Ellipsoid: WGS 84 - Prime Meridian: Greenwich morecantile.tms.get("CanadianNAD83_LCC").geographic_crs >> Name: NAD83 Axis Info [ellipsoidal]: - Lat[north]: Geodetic latitude (degree) - Lon[east]: Geodetic longitude (degree) Area of Use: - name: North America - onshore and offshore: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. Puerto Rico. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Hawaii; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Virgin Islands. British Virgin Islands. - bounds: (167.65, 14.92, -40.73, 86.45) Datum: North American Datum 1983 - Ellipsoid: GRS 1980 - Prime Meridian: Greenwich ``` ### Overwriting the Geographic CRS There are **two** mechanisms to overwrite the TMS's geographic CRS. - `TileMatrixSet.set_geographic_crs(crs)`: Overwrite the TMS's Geographic CRS (`TileMatrixSet._geographic_crs` private attribute) ```python import morecantile import pyproj tms = morecantile.tms.get("CanadianNAD83_LCC") tms.geographic_crs >> ... tms.set_geographic_crs(pyproj.CRS.from_epsg(4326)) tms.geographic_crs >> ... ``` - `MORECANTILE_DEFAULT_GEOGRAPHIC_CRS` environment variable ```python import os os.environ["MORECANTILE_DEFAULT_GEOGRAPHIC_CRS"] = "EPSG:4326" import morecantile tms = morecantile.tms.get("CanadianNAD83_LCC") tms.geographic_crs >> ``` Some methods have `geographic_crs` option to specify the CRS to use to transf the default CRS: - `TileMatrixSet.tile(lng, lat, *, geographic_crs=None)`: Get the tile for a given geographic longitude and latitude pair - `TileMatrixSet.tiles(west, south, east, north, *, geographic_crs=None)`: Get the tiles overlapped by a geographic bounding box morecantile-7.0.3/docs/src/api/000077500000000000000000000000001514074772600163305ustar00rootroot00000000000000morecantile-7.0.3/docs/src/api/morecantile/000077500000000000000000000000001514074772600206325ustar00rootroot00000000000000morecantile-7.0.3/docs/src/api/morecantile/commons.md000066400000000000000000000000301514074772600226200ustar00rootroot00000000000000::: morecantile.commons morecantile-7.0.3/docs/src/api/morecantile/defaults.md000066400000000000000000000000311514074772600227550ustar00rootroot00000000000000::: morecantile.defaults morecantile-7.0.3/docs/src/api/morecantile/errors.md000066400000000000000000000000271514074772600224670ustar00rootroot00000000000000::: morecantile.errors morecantile-7.0.3/docs/src/api/morecantile/models.md000066400000000000000000000000271514074772600224360ustar00rootroot00000000000000::: morecantile.models morecantile-7.0.3/docs/src/api/morecantile/utils.md000066400000000000000000000000261514074772600223120ustar00rootroot00000000000000::: morecantile.utils morecantile-7.0.3/docs/src/benchmark.html000066400000000000000000000220661514074772600204050ustar00rootroot00000000000000 Benchmarks
morecantile-7.0.3/docs/src/cli.md000066400000000000000000000162661514074772600166630ustar00rootroot00000000000000 # Morecantile CLI The CLI is heavily inspired from mercantile's CLI. ``` morecantile --help Usage: morecantile [OPTIONS] COMMAND [ARGS]... Command line interface for the Morecantile Python package. Options: -v, --verbose Increase verbosity. -q, --quiet Decrease verbosity. --version Show the version and exit. --help Show this message and exit. Commands: tiles Print tiles that overlap or contain a lng/lat point, bounding box, or GeoJSON objects. shapes Print the shapes of tiles as GeoJSON. custom Create Custom TileMatrixSet tms Print TileMatrixSet JSON document. tms-to-geojson Print TileMatrixSet MatrixSet as GeoJSON. ``` ## Tiles With the tiles command you can write descriptions of tiles intersecting with a geographic point, bounding box, or GeoJSON object. ``` $ morecantile tiles --help Usage: morecantile tiles [OPTIONS] [ZOOM] [INPUT] Lists TMS tiles at ZOOM level intersecting GeoJSON [west, south, east, north] bounding boxen, features, or collections read from stdin. Output is a JSON [x, y, z] array. Input may be a compact newline-delimited sequences of JSON or a pretty- printed ASCII RS-delimited sequence of JSON (like https://tools.ietf.org/html/rfc8142 and https://tools.ietf.org/html/rfc7159). Example: $ echo "[-105.05, 39.95, -105, 40]" | morecantiles tiles 12 Output: [852, 1550, 12] [852, 1551, 12] [853, 1550, 12] [853, 1551, 12] Options: --identifier TileMatrixSet identifier. One of : - CDB1GlobalGrid - CanadianNAD83_LCC - EuropeanETRS89_LAEAQuad - GNOSISGlobalGrid - LINZAntarticaMapTilegrid - NZTM2000Quad - UPSAntarcticWGS84Quad - UPSArcticWGS84Quad - UTM31WGS84Quad - WebMercatorQuad - WGS1984Quad - WorldCRS84Quad - WorldMercatorWGS84Quad --seq / --lf Write a RS-delimited JSON sequence (default is LF). --help Show this message and exit. ``` ## Shapes The shapes command writes TMS tile shapes to several forms of GeoJSON. ``` $ morecantile shapes --help Usage: morecantile shapes [OPTIONS] [INPUT] Reads one or more Web Mercator tile descriptions from stdin and writes either a GeoJSON feature collection (the default) or a JSON sequence of GeoJSON features/collections to stdout. Input may be a compact newline-delimited sequences of JSON or a pretty- printed ASCII RS-delimited sequence of JSON (like https://tools.ietf.org/html/rfc8142 and https://tools.ietf.org/html/rfc7159). Tile descriptions may be either an [x, y, z] array or a JSON object of the form {"tile": [x, y, z], "properties": {"name": "foo", ...}} In the latter case, the properties object will be used to update the properties object of the output feature. Options: --identifier TileMatrixSet identifier. One of : - CDB1GlobalGrid - CanadianNAD83_LCC - EuropeanETRS89_LAEAQuad - GNOSISGlobalGrid - LINZAntarticaMapTilegrid - NZTM2000Quad - UPSAntarcticWGS84Quad - UPSArcticWGS84Quad - UTM31WGS84Quad - WebMercatorQuad - WGS1984Quad - WorldCRS84Quad - WorldMercatorWGS84Quad --precision INTEGER Decimal precision of coordinates. --indent INTEGER Indentation level for JSON output --compact / --no-compact Use compact separators (',', ':'). --projected / --geographic Output coordinate system --seq Write a RS-delimited JSON sequence (default is LF). --feature Output as sequence of GeoJSON features (the default). --bbox Output as sequence of GeoJSON bbox arrays. --collect Output as a GeoJSON feature collections. --extents / --no-extents Write shape extents as ws-separated strings (default is False). --buffer FLOAT Shift shape x and y values by a constant number --help Show this message and exit. ``` ## Custom With the custom command you can create custom TileMatrixSet documents. ``` $ morecantile custom --help Usage: morecantile custom [OPTIONS] Create Custom TMS. Options: --epsg INTEGER EPSG number. [required] --extent FLOAT... left, bottom, right, top Bounding box of the Tile Matrix Set. [required] --name TEXT Identifier of the custom TMS. --minzoom INTEGER Minimum Zoom level. --maxzoom INTEGER Maximum Zoom level. --tile-width INTEGER Width of each tile. --tile-height INTEGER Height of each tile. --extent-epsg INTEGER EPSG number for the bounding box. --title TEXT Tile Matrix Set title. --help Show this message and exit. ``` ## tms The tms command returns the TileMatrixSet document ``` $ morecantile tms --help Usage: morecantile tms [OPTIONS] Print TMS JSON. Options: --identifier TileMatrixSet identifier. One of : - CDB1GlobalGrid - CanadianNAD83_LCC - EuropeanETRS89_LAEAQuad - GNOSISGlobalGrid - LINZAntarticaMapTilegrid - NZTM2000Quad - UPSAntarcticWGS84Quad - UPSArcticWGS84Quad - UTM31WGS84Quad - WebMercatorQuad - WGS1984Quad - WorldCRS84Quad - WorldMercatorWGS84Quad --help Show this message and exit. ``` ## tms-to-geojson Create a GeoJSON from a TMS document ``` $ morecantile tms-to-geojson --help Usage: morecantile tms-to-geojson [OPTIONS] [INPUT] Print TMS document as GeoJSON. Options: --level INTEGER Zoom/Matrix level. [required] --precision INTEGER Decimal precision of coordinates. --indent INTEGER Indentation level for JSON output --compact / --no-compact Use compact separators (',', ':'). --projected / --geographic Output coordinate system --seq Write a RS-delimited JSON sequence (default is LF). --feature Output as sequence of GeoJSON features (the default). --bbox Output as sequence of GeoJSON bbox arrays. --collect Output as a GeoJSON feature collections. --extents / --no-extents Write shape extents as ws-separated strings (default is False). --buffer FLOAT Shift shape x and y values by a constant number --help Show this message and exit. ``` ## Examples ``` $ rio bounds eu.tif | morecantile tiles --zoom 1 # like mercantiles $ morecantile custom --epsg 3413 --extent -4194300 -4194300 4194300 4194300 --minzoom 0 --maxzoom 8 --tile-width 512 --tile-height 512 | morecantile tms-to-geojson --level 3 --projected --collect > l3.geojson $ rio bounds eu.tif | morecantile tiles 4 --identifier EuropeanETRS89_LAEAQuad | morecantile shapes --identifier EuropeanETRS89_LAEAQuad --collect > z4.geojson ``` morecantile-7.0.3/docs/src/contributing.md000077700000000000000000000000001514074772600234622../../CONTRIBUTING.mdustar00rootroot00000000000000morecantile-7.0.3/docs/src/index.md000077700000000000000000000000001514074772600211102../../README.mdustar00rootroot00000000000000morecantile-7.0.3/docs/src/release-notes.md000077700000000000000000000000001514074772600226622../../CHANGES.mdustar00rootroot00000000000000morecantile-7.0.3/docs/src/tms-v2.md000066400000000000000000000043601514074772600172340ustar00rootroot00000000000000# TMS v2.0 and Morecantile v4 In September 2022, the Open Geospatial Consortium released an updated specification for [Tile Matrix Sets - version 2.0](https://docs.ogc.org/is/17-083r4/17-083r4.html). This updated spec includes some breaking changes that alter the TMS JSON document. Some of these changes include: - [Addition of a `uri` parameter for TileMatrixSets registered on the official OGC NA TileMatrixSets registry](https://docs.ogc.org/is/17-083r4/21-066r1.html#_identifying_with_uri_a_well_known_tilematrixset_in_an_authoritative_registry) - [`identifier` renamed to `id`](https://docs.ogc.org/is/17-083r4/21-066r1.html#_json_encoding_rules_to_derive_a_more_natural_json_encoding_from_uml) in both TileMatrix and TileMatrixSet - [Only `crs` and `tileMatrices` are required in `TileMatrixSet`](https://github.com/opengeospatial/2D-Tile-Matrix-Set/blob/master/schemas/tms/2.0/json/tileMatrixSet.json#L6) - [`supportedCRS` renamed to `crs`](https://docs.ogc.org/is/17-083r4/21-066r1.html#_renaming_supportedcrs_to_crs) - [`tileMatrix` renamed to `tileMatrices`](https://docs.ogc.org/is/17-083r4/21-066r1.html#_json_encoding_rules_to_derive_a_more_natural_json_encoding_from_uml) - [`topLeftCorner` renamed to `pointOfOrigin`](https://docs.ogc.org/is/17-083r4/21-066r1.html#_replacing_topleftcorner_by_pointoforigin) - [Add `cellSize` and `cornerOfOrigin` (Optional) parameters to TileMatrix](https://docs.ogc.org/is/17-083r4/21-066r1.html#_adding_cellsize_and_corneroforigin) - [Remove `type` object properties](https://docs.ogc.org/is/17-083r4/21-066r1.html#_removing_type_object_properties) - [Added optional axis ordering](https://docs.ogc.org/is/17-083r4/21-066r1.html#_adding_optional_orderedaxes_to_highlight_crs_axis_ordering ) Morecantile version 4 has been updated to support the updated TMS 2.0 specification. When using the predefined Tile Matrix Sets or making a custom TMS this should work as normal with some renamed properties (specified above). If you want to create a new Tile Matrix Set from a JSON made to the old TMS v1 specification, there is a new class method called `from_v1` that does this. ```python from morecantile.models import TileMatrixSet import json with open("tms_v1.json") as f: data = json.load(f) TileMatrixSet.from_v1(data) ``` morecantile-7.0.3/docs/src/usage.md000066400000000000000000000147411514074772600172140ustar00rootroot00000000000000 ### Load one TMS grid ```python import morecantile tms = morecantile.tms.get("WebMercatorQuad") tms >>> >> { "type": "TileMatrixType", "id": "0", "scaleDenominator": 38916524.55357144, "pointOfOrigin": [ -948.75, -3333128.95 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1 } ``` ## Use morecantile TMS store morecantile provides a `TileMatrixSets` class to *store* Tile Matrix Set definition. This object can easily be extended to include your own custom TMS. ### List supported grids ```python import morecantile print(morecantile.tms.list()) >>> [ 'LINZAntarticaMapTilegrid', 'EuropeanETRS89_LAEAQuad', 'CanadianNAD83_LCC', 'UPSArcticWGS84Quad', 'NZTM2000Quad', 'UTM31WGS84Quad', 'UPSAntarcticWGS84Quad', 'WorldMercatorWGS84Quad', 'WorldCRS84Quad', 'WGS1984Quad', 'WebMercatorQuad' ] ``` ### Register a custom TMS ```python default_tms = morecantile.tms.register({"MyCustomTmsEPSG3031": customEPGS3031}) assert "MyCustomTmsEPSG3031" in default_tms.list() tms = default_tms.get("MyCustomTmsEPSG3031") tms >>> Define how data should be in pure, canonical python; validate it with pydantic. Pydantic model enforce the TileMatrixSet OGC specification for the whole project by validating each items. Because we use pydantic model to handle the TileMatrixSets you can uses pydantic's [methods](https://docs.pydantic.dev/2.0/usage/models/#model-methods-and-properties) directly. ```python import morecantile my_tms_doc = "~/a_tms_doc.json" tms = morecantile.TileMatrixSet.parse_file(my_tms_doc) # print the TMS as json print(tms.model_dump_json(exclude_none=True)) # print the TMS as dict print(tms.model_dump(exclude_none=True)) ``` morecantile-7.0.3/morecantile/000077500000000000000000000000001514074772600163425ustar00rootroot00000000000000morecantile-7.0.3/morecantile/__init__.py000066400000000000000000000010161514074772600204510ustar00rootroot00000000000000""" morecantile is an adaptation of mapbox/mercantile to work with custom projection. Refs: - mapproxy: https://github.com/mapproxy/mapproxy - mercantile: https://github.com/mapbox/mercantile - tiletanic: https://github.com/DigitalGlobe/tiletanic """ __version__ = "7.0.3" from .commons import BoundingBox, Coords, Tile from .defaults import TileMatrixSets, tms from .models import TileMatrixSet __all__ = [ "BoundingBox", "Coords", "Tile", "TileMatrixSet", "TileMatrixSets", "tms", ] morecantile-7.0.3/morecantile/commons.py000066400000000000000000000020071514074772600203660ustar00rootroot00000000000000"""Morecantile commons.""" from typing import NamedTuple class BoundingBox(NamedTuple): """A xmin,ymin,xmax,ymax coordinates tuple. Args: left (number): min horizontal coordinate. bottom (number):min vertical coordinate. right (number): max horizontal coordinate. top (number): max vertical coordinate. Examples: >>> BoundingBox(-180.0, -90.0, 180.0, 90.0) """ left: float bottom: float right: float top: float class Coords(NamedTuple): """A x,y Coordinates pair. Args: x (number): horizontal coordinate input projection unit. y (number): vertical coordinate input projection unit. Examples: >>> Coords(-90.3, 10.5) """ x: float y: float class Tile(NamedTuple): """TileMatrixSet X,Y,Z tile indices. Args: x (int): horizontal index. y (int): verctical index. z (int): zoom level. Examples: >>> Tile(0, 0, 0) """ x: int y: int z: int morecantile-7.0.3/morecantile/data/000077500000000000000000000000001514074772600172535ustar00rootroot00000000000000morecantile-7.0.3/morecantile/data/CDB1GlobalGrid.json000066400000000000000000001064231514074772600225540ustar00rootroot00000000000000{ "id" : "CDB1GlobalGrid", "title" : "CDB 1 Global Grid", "uri" : "http://www.opengis.net/def/tilematrixset/OGC/1.0/CDB1GlobalGrid", "crs" : "http://www.opengis.net/def/crs/EPSG/0/4326", "orderedAxes" : ["Lat","Lon"], "tileMatrices" : [ { "id" : "-10", "scaleDenominator" : 397569609.9759771227837, "cellSize" : 1, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 1, "tileHeight" : 1, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-9", "scaleDenominator" : 198784804.9879885613918, "cellSize" : 0.5, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 2, "tileHeight" : 2, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-8", "scaleDenominator" : 99392402.4939942806959, "cellSize" : 0.25, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 4, "tileHeight" : 4, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-7", "scaleDenominator" : 49696201.246997140348, "cellSize" : 0.125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 8, "tileHeight" : 8, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-6", "scaleDenominator" : 24848100.623498570174, "cellSize" : 0.0625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 16, "tileHeight" : 16, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-5", "scaleDenominator" : 12424050.311749285087, "cellSize" : 0.03125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 32, "tileHeight" : 32, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-4", "scaleDenominator" : 6212025.1558746425435, "cellSize" : 0.015625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 64, "tileHeight" : 64, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-3", "scaleDenominator" : 3106012.5779373212717, "cellSize" : 0.0078125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 128, "tileHeight" : 128, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-2", "scaleDenominator" : 1553006.2889686606359, "cellSize" : 0.00390625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "-1", "scaleDenominator" : 776503.1444843303179, "cellSize" : 0.001953125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 512, "tileHeight" : 512, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "0", "scaleDenominator" : 388251.572242165159, "cellSize" : 0.0009765625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 360, "matrixHeight" : 180, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 6, "minTileRow" : 1, "maxTileRow" : 9 }, { "coalesce" : 4, "minTileRow" : 10, "maxTileRow" : 14 }, { "coalesce" : 3, "minTileRow" : 15, "maxTileRow" : 19 }, { "coalesce" : 2, "minTileRow" : 20, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 140, "maxTileRow" : 159 }, { "coalesce" : 3, "minTileRow" : 160, "maxTileRow" : 164 }, { "coalesce" : 4, "minTileRow" : 165, "maxTileRow" : 169 }, { "coalesce" : 6, "minTileRow" : 170, "maxTileRow" : 178 }, { "coalesce" : 12, "minTileRow" : 179, "maxTileRow" : 179 } ] }, { "id" : "1", "scaleDenominator" : 194125.7861210825795, "cellSize" : 0.00048828125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 720, "matrixHeight" : 360, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 1 }, { "coalesce" : 6, "minTileRow" : 2, "maxTileRow" : 19 }, { "coalesce" : 4, "minTileRow" : 20, "maxTileRow" : 29 }, { "coalesce" : 3, "minTileRow" : 30, "maxTileRow" : 39 }, { "coalesce" : 2, "minTileRow" : 40, "maxTileRow" : 79 }, { "coalesce" : 2, "minTileRow" : 280, "maxTileRow" : 319 }, { "coalesce" : 3, "minTileRow" : 320, "maxTileRow" : 329 }, { "coalesce" : 4, "minTileRow" : 330, "maxTileRow" : 339 }, { "coalesce" : 6, "minTileRow" : 340, "maxTileRow" : 357 }, { "coalesce" : 12, "minTileRow" : 358, "maxTileRow" : 359 } ] }, { "id" : "2", "scaleDenominator" : 97062.8930605412897, "cellSize" : 0.000244140625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 1440, "matrixHeight" : 720, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 3 }, { "coalesce" : 6, "minTileRow" : 4, "maxTileRow" : 39 }, { "coalesce" : 4, "minTileRow" : 40, "maxTileRow" : 59 }, { "coalesce" : 3, "minTileRow" : 60, "maxTileRow" : 79 }, { "coalesce" : 2, "minTileRow" : 80, "maxTileRow" : 159 }, { "coalesce" : 2, "minTileRow" : 560, "maxTileRow" : 639 }, { "coalesce" : 3, "minTileRow" : 640, "maxTileRow" : 659 }, { "coalesce" : 4, "minTileRow" : 660, "maxTileRow" : 679 }, { "coalesce" : 6, "minTileRow" : 680, "maxTileRow" : 715 }, { "coalesce" : 12, "minTileRow" : 716, "maxTileRow" : 719 } ] }, { "id" : "3", "scaleDenominator" : 48531.4465302706449, "cellSize" : 0.0001220703125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 2880, "matrixHeight" : 1440, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 7 }, { "coalesce" : 6, "minTileRow" : 8, "maxTileRow" : 79 }, { "coalesce" : 4, "minTileRow" : 80, "maxTileRow" : 119 }, { "coalesce" : 3, "minTileRow" : 120, "maxTileRow" : 159 }, { "coalesce" : 2, "minTileRow" : 160, "maxTileRow" : 319 }, { "coalesce" : 2, "minTileRow" : 1120, "maxTileRow" : 1279 }, { "coalesce" : 3, "minTileRow" : 1280, "maxTileRow" : 1319 }, { "coalesce" : 4, "minTileRow" : 1320, "maxTileRow" : 1359 }, { "coalesce" : 6, "minTileRow" : 1360, "maxTileRow" : 1431 }, { "coalesce" : 12, "minTileRow" : 1432, "maxTileRow" : 1439 } ] }, { "id" : "4", "scaleDenominator" : 24265.7232651353224, "cellSize" : 0.0000610351562, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 5760, "matrixHeight" : 2880, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 15 }, { "coalesce" : 6, "minTileRow" : 16, "maxTileRow" : 159 }, { "coalesce" : 4, "minTileRow" : 160, "maxTileRow" : 239 }, { "coalesce" : 3, "minTileRow" : 240, "maxTileRow" : 319 }, { "coalesce" : 2, "minTileRow" : 320, "maxTileRow" : 639 }, { "coalesce" : 2, "minTileRow" : 2240, "maxTileRow" : 2559 }, { "coalesce" : 3, "minTileRow" : 2560, "maxTileRow" : 2639 }, { "coalesce" : 4, "minTileRow" : 2640, "maxTileRow" : 2719 }, { "coalesce" : 6, "minTileRow" : 2720, "maxTileRow" : 2863 }, { "coalesce" : 12, "minTileRow" : 2864, "maxTileRow" : 2879 } ] }, { "id" : "5", "scaleDenominator" : 12132.8616325676612, "cellSize" : 0.0000305175781, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 11520, "matrixHeight" : 5760, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 31 }, { "coalesce" : 6, "minTileRow" : 32, "maxTileRow" : 319 }, { "coalesce" : 4, "minTileRow" : 320, "maxTileRow" : 479 }, { "coalesce" : 3, "minTileRow" : 480, "maxTileRow" : 639 }, { "coalesce" : 2, "minTileRow" : 640, "maxTileRow" : 1279 }, { "coalesce" : 2, "minTileRow" : 4480, "maxTileRow" : 5119 }, { "coalesce" : 3, "minTileRow" : 5120, "maxTileRow" : 5279 }, { "coalesce" : 4, "minTileRow" : 5280, "maxTileRow" : 5439 }, { "coalesce" : 6, "minTileRow" : 5440, "maxTileRow" : 5727 }, { "coalesce" : 12, "minTileRow" : 5728, "maxTileRow" : 5759 } ] }, { "id" : "6", "scaleDenominator" : 6066.4308162838306, "cellSize" : 0.0000152587891, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 23040, "matrixHeight" : 11520, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 63 }, { "coalesce" : 6, "minTileRow" : 64, "maxTileRow" : 639 }, { "coalesce" : 4, "minTileRow" : 640, "maxTileRow" : 959 }, { "coalesce" : 3, "minTileRow" : 960, "maxTileRow" : 1279 }, { "coalesce" : 2, "minTileRow" : 1280, "maxTileRow" : 2559 }, { "coalesce" : 2, "minTileRow" : 8960, "maxTileRow" : 10239 }, { "coalesce" : 3, "minTileRow" : 10240, "maxTileRow" : 10559 }, { "coalesce" : 4, "minTileRow" : 10560, "maxTileRow" : 10879 }, { "coalesce" : 6, "minTileRow" : 10880, "maxTileRow" : 11455 }, { "coalesce" : 12, "minTileRow" : 11456, "maxTileRow" : 11519 } ] }, { "id" : "7", "scaleDenominator" : 3033.2154081419153, "cellSize" : 0.0000076293945, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 46080, "matrixHeight" : 23040, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 127 }, { "coalesce" : 6, "minTileRow" : 128, "maxTileRow" : 1279 }, { "coalesce" : 4, "minTileRow" : 1280, "maxTileRow" : 1919 }, { "coalesce" : 3, "minTileRow" : 1920, "maxTileRow" : 2559 }, { "coalesce" : 2, "minTileRow" : 2560, "maxTileRow" : 5119 }, { "coalesce" : 2, "minTileRow" : 17920, "maxTileRow" : 20479 }, { "coalesce" : 3, "minTileRow" : 20480, "maxTileRow" : 21119 }, { "coalesce" : 4, "minTileRow" : 21120, "maxTileRow" : 21759 }, { "coalesce" : 6, "minTileRow" : 21760, "maxTileRow" : 22911 }, { "coalesce" : 12, "minTileRow" : 22912, "maxTileRow" : 23039 } ] }, { "id" : "8", "scaleDenominator" : 1516.6077040709577, "cellSize" : 0.0000038146973, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 92160, "matrixHeight" : 46080, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 255 }, { "coalesce" : 6, "minTileRow" : 256, "maxTileRow" : 2559 }, { "coalesce" : 4, "minTileRow" : 2560, "maxTileRow" : 3839 }, { "coalesce" : 3, "minTileRow" : 3840, "maxTileRow" : 5119 }, { "coalesce" : 2, "minTileRow" : 5120, "maxTileRow" : 10239 }, { "coalesce" : 2, "minTileRow" : 35840, "maxTileRow" : 40959 }, { "coalesce" : 3, "minTileRow" : 40960, "maxTileRow" : 42239 }, { "coalesce" : 4, "minTileRow" : 42240, "maxTileRow" : 43519 }, { "coalesce" : 6, "minTileRow" : 43520, "maxTileRow" : 45823 }, { "coalesce" : 12, "minTileRow" : 45824, "maxTileRow" : 46079 } ] }, { "id" : "9", "scaleDenominator" : 758.3038520354788, "cellSize" : 0.0000019073486, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 184320, "matrixHeight" : 92160, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 511 }, { "coalesce" : 6, "minTileRow" : 512, "maxTileRow" : 5119 }, { "coalesce" : 4, "minTileRow" : 5120, "maxTileRow" : 7679 }, { "coalesce" : 3, "minTileRow" : 7680, "maxTileRow" : 10239 }, { "coalesce" : 2, "minTileRow" : 10240, "maxTileRow" : 20479 }, { "coalesce" : 2, "minTileRow" : 71680, "maxTileRow" : 81919 }, { "coalesce" : 3, "minTileRow" : 81920, "maxTileRow" : 84479 }, { "coalesce" : 4, "minTileRow" : 84480, "maxTileRow" : 87039 }, { "coalesce" : 6, "minTileRow" : 87040, "maxTileRow" : 91647 }, { "coalesce" : 12, "minTileRow" : 91648, "maxTileRow" : 92159 } ] }, { "id" : "10", "scaleDenominator" : 379.1519260177394, "cellSize" : 0.0000009536743, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 368640, "matrixHeight" : 184320, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 1023 }, { "coalesce" : 6, "minTileRow" : 1024, "maxTileRow" : 10239 }, { "coalesce" : 4, "minTileRow" : 10240, "maxTileRow" : 15359 }, { "coalesce" : 3, "minTileRow" : 15360, "maxTileRow" : 20479 }, { "coalesce" : 2, "minTileRow" : 20480, "maxTileRow" : 40959 }, { "coalesce" : 2, "minTileRow" : 143360, "maxTileRow" : 163839 }, { "coalesce" : 3, "minTileRow" : 163840, "maxTileRow" : 168959 }, { "coalesce" : 4, "minTileRow" : 168960, "maxTileRow" : 174079 }, { "coalesce" : 6, "minTileRow" : 174080, "maxTileRow" : 183295 }, { "coalesce" : 12, "minTileRow" : 183296, "maxTileRow" : 184319 } ] }, { "id" : "11", "scaleDenominator" : 189.5759630088697, "cellSize" : 0.0000004768372, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 737280, "matrixHeight" : 368640, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 2047 }, { "coalesce" : 6, "minTileRow" : 2048, "maxTileRow" : 20479 }, { "coalesce" : 4, "minTileRow" : 20480, "maxTileRow" : 30719 }, { "coalesce" : 3, "minTileRow" : 30720, "maxTileRow" : 40959 }, { "coalesce" : 2, "minTileRow" : 40960, "maxTileRow" : 81919 }, { "coalesce" : 2, "minTileRow" : 286720, "maxTileRow" : 327679 }, { "coalesce" : 3, "minTileRow" : 327680, "maxTileRow" : 337919 }, { "coalesce" : 4, "minTileRow" : 337920, "maxTileRow" : 348159 }, { "coalesce" : 6, "minTileRow" : 348160, "maxTileRow" : 366591 }, { "coalesce" : 12, "minTileRow" : 366592, "maxTileRow" : 368639 } ] }, { "id" : "12", "scaleDenominator" : 94.7879815044349, "cellSize" : 0.0000002384186, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 1474560, "matrixHeight" : 737280, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 4095 }, { "coalesce" : 6, "minTileRow" : 4096, "maxTileRow" : 40959 }, { "coalesce" : 4, "minTileRow" : 40960, "maxTileRow" : 61439 }, { "coalesce" : 3, "minTileRow" : 61440, "maxTileRow" : 81919 }, { "coalesce" : 2, "minTileRow" : 81920, "maxTileRow" : 163839 }, { "coalesce" : 2, "minTileRow" : 573440, "maxTileRow" : 655359 }, { "coalesce" : 3, "minTileRow" : 655360, "maxTileRow" : 675839 }, { "coalesce" : 4, "minTileRow" : 675840, "maxTileRow" : 696319 }, { "coalesce" : 6, "minTileRow" : 696320, "maxTileRow" : 733183 }, { "coalesce" : 12, "minTileRow" : 733184, "maxTileRow" : 737279 } ] }, { "id" : "13", "scaleDenominator" : 47.3939907522174, "cellSize" : 0.0000001192093, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 2949120, "matrixHeight" : 1474560, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 8191 }, { "coalesce" : 6, "minTileRow" : 8192, "maxTileRow" : 81919 }, { "coalesce" : 4, "minTileRow" : 81920, "maxTileRow" : 122879 }, { "coalesce" : 3, "minTileRow" : 122880, "maxTileRow" : 163839 }, { "coalesce" : 2, "minTileRow" : 163840, "maxTileRow" : 327679 }, { "coalesce" : 2, "minTileRow" : 1146880, "maxTileRow" : 1310719 }, { "coalesce" : 3, "minTileRow" : 1310720, "maxTileRow" : 1351679 }, { "coalesce" : 4, "minTileRow" : 1351680, "maxTileRow" : 1392639 }, { "coalesce" : 6, "minTileRow" : 1392640, "maxTileRow" : 1466367 }, { "coalesce" : 12, "minTileRow" : 1466368, "maxTileRow" : 1474559 } ] }, { "id" : "14", "scaleDenominator" : 23.6969953761087, "cellSize" : 0.0000000596046, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 5898240, "matrixHeight" : 2949120, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 16383 }, { "coalesce" : 6, "minTileRow" : 16384, "maxTileRow" : 163839 }, { "coalesce" : 4, "minTileRow" : 163840, "maxTileRow" : 245759 }, { "coalesce" : 3, "minTileRow" : 245760, "maxTileRow" : 327679 }, { "coalesce" : 2, "minTileRow" : 327680, "maxTileRow" : 655359 }, { "coalesce" : 2, "minTileRow" : 2293760, "maxTileRow" : 2621439 }, { "coalesce" : 3, "minTileRow" : 2621440, "maxTileRow" : 2703359 }, { "coalesce" : 4, "minTileRow" : 2703360, "maxTileRow" : 2785279 }, { "coalesce" : 6, "minTileRow" : 2785280, "maxTileRow" : 2932735 }, { "coalesce" : 12, "minTileRow" : 2932736, "maxTileRow" : 2949119 } ] }, { "id" : "15", "scaleDenominator" : 11.8484976880544, "cellSize" : 0.0000000298023, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 11796480, "matrixHeight" : 5898240, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 32767 }, { "coalesce" : 6, "minTileRow" : 32768, "maxTileRow" : 327679 }, { "coalesce" : 4, "minTileRow" : 327680, "maxTileRow" : 491519 }, { "coalesce" : 3, "minTileRow" : 491520, "maxTileRow" : 655359 }, { "coalesce" : 2, "minTileRow" : 655360, "maxTileRow" : 1310719 }, { "coalesce" : 2, "minTileRow" : 4587520, "maxTileRow" : 5242879 }, { "coalesce" : 3, "minTileRow" : 5242880, "maxTileRow" : 5406719 }, { "coalesce" : 4, "minTileRow" : 5406720, "maxTileRow" : 5570559 }, { "coalesce" : 6, "minTileRow" : 5570560, "maxTileRow" : 5865471 }, { "coalesce" : 12, "minTileRow" : 5865472, "maxTileRow" : 5898239 } ] }, { "id" : "16", "scaleDenominator" : 5.9242488440272, "cellSize" : 0.0000000149012, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 23592960, "matrixHeight" : 11796480, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 65535 }, { "coalesce" : 6, "minTileRow" : 65536, "maxTileRow" : 655359 }, { "coalesce" : 4, "minTileRow" : 655360, "maxTileRow" : 983039 }, { "coalesce" : 3, "minTileRow" : 983040, "maxTileRow" : 1310719 }, { "coalesce" : 2, "minTileRow" : 1310720, "maxTileRow" : 2621439 }, { "coalesce" : 2, "minTileRow" : 9175040, "maxTileRow" : 10485759 }, { "coalesce" : 3, "minTileRow" : 10485760, "maxTileRow" : 10813439 }, { "coalesce" : 4, "minTileRow" : 10813440, "maxTileRow" : 11141119 }, { "coalesce" : 6, "minTileRow" : 11141120, "maxTileRow" : 11730943 }, { "coalesce" : 12, "minTileRow" : 11730944, "maxTileRow" : 11796479 } ] }, { "id" : "17", "scaleDenominator" : 2.9621244220136, "cellSize" : 0.0000000074506, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 47185920, "matrixHeight" : 23592960, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 131071 }, { "coalesce" : 6, "minTileRow" : 131072, "maxTileRow" : 1310719 }, { "coalesce" : 4, "minTileRow" : 1310720, "maxTileRow" : 1966079 }, { "coalesce" : 3, "minTileRow" : 1966080, "maxTileRow" : 2621439 }, { "coalesce" : 2, "minTileRow" : 2621440, "maxTileRow" : 5242879 }, { "coalesce" : 2, "minTileRow" : 18350080, "maxTileRow" : 20971519 }, { "coalesce" : 3, "minTileRow" : 20971520, "maxTileRow" : 21626879 }, { "coalesce" : 4, "minTileRow" : 21626880, "maxTileRow" : 22282239 }, { "coalesce" : 6, "minTileRow" : 22282240, "maxTileRow" : 23461887 }, { "coalesce" : 12, "minTileRow" : 23461888, "maxTileRow" : 23592959 } ] }, { "id" : "18", "scaleDenominator" : 1.4810622110068, "cellSize" : 0.0000000037253, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 94371840, "matrixHeight" : 47185920, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 262143 }, { "coalesce" : 6, "minTileRow" : 262144, "maxTileRow" : 2621439 }, { "coalesce" : 4, "minTileRow" : 2621440, "maxTileRow" : 3932159 }, { "coalesce" : 3, "minTileRow" : 3932160, "maxTileRow" : 5242879 }, { "coalesce" : 2, "minTileRow" : 5242880, "maxTileRow" : 10485759 }, { "coalesce" : 2, "minTileRow" : 36700160, "maxTileRow" : 41943039 }, { "coalesce" : 3, "minTileRow" : 41943040, "maxTileRow" : 43253759 }, { "coalesce" : 4, "minTileRow" : 43253760, "maxTileRow" : 44564479 }, { "coalesce" : 6, "minTileRow" : 44564480, "maxTileRow" : 46923775 }, { "coalesce" : 12, "minTileRow" : 46923776, "maxTileRow" : 47185919 } ] }, { "id" : "19", "scaleDenominator" : 0.7405311055034, "cellSize" : 0.0000000018626, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 188743680, "matrixHeight" : 94371840, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 524287 }, { "coalesce" : 6, "minTileRow" : 524288, "maxTileRow" : 5242879 }, { "coalesce" : 4, "minTileRow" : 5242880, "maxTileRow" : 7864319 }, { "coalesce" : 3, "minTileRow" : 7864320, "maxTileRow" : 10485759 }, { "coalesce" : 2, "minTileRow" : 10485760, "maxTileRow" : 20971519 }, { "coalesce" : 2, "minTileRow" : 73400320, "maxTileRow" : 83886079 }, { "coalesce" : 3, "minTileRow" : 83886080, "maxTileRow" : 86507519 }, { "coalesce" : 4, "minTileRow" : 86507520, "maxTileRow" : 89128959 }, { "coalesce" : 6, "minTileRow" : 89128960, "maxTileRow" : 93847551 }, { "coalesce" : 12, "minTileRow" : 93847552, "maxTileRow" : 94371839 } ] }, { "id" : "20", "scaleDenominator" : 0.3702655527517, "cellSize" : 0.0000000009313, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 377487360, "matrixHeight" : 188743680, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 1048575 }, { "coalesce" : 6, "minTileRow" : 1048576, "maxTileRow" : 10485759 }, { "coalesce" : 4, "minTileRow" : 10485760, "maxTileRow" : 15728639 }, { "coalesce" : 3, "minTileRow" : 15728640, "maxTileRow" : 20971519 }, { "coalesce" : 2, "minTileRow" : 20971520, "maxTileRow" : 41943039 }, { "coalesce" : 2, "minTileRow" : 146800640, "maxTileRow" : 167772159 }, { "coalesce" : 3, "minTileRow" : 167772160, "maxTileRow" : 173015039 }, { "coalesce" : 4, "minTileRow" : 173015040, "maxTileRow" : 178257919 }, { "coalesce" : 6, "minTileRow" : 178257920, "maxTileRow" : 187695103 }, { "coalesce" : 12, "minTileRow" : 187695104, "maxTileRow" : 188743679 } ] }, { "id" : "21", "scaleDenominator" : 0.1851327763758, "cellSize" : 0.0000000004657, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 754974720, "matrixHeight" : 377487360, "tileWidth" : 1024, "tileHeight" : 1024, "variableMatrixWidths" : [ { "coalesce" : 12, "minTileRow" : 0, "maxTileRow" : 2097151 }, { "coalesce" : 6, "minTileRow" : 2097152, "maxTileRow" : 20971519 }, { "coalesce" : 4, "minTileRow" : 20971520, "maxTileRow" : 31457279 }, { "coalesce" : 3, "minTileRow" : 31457280, "maxTileRow" : 41943039 }, { "coalesce" : 2, "minTileRow" : 41943040, "maxTileRow" : 83886079 }, { "coalesce" : 2, "minTileRow" : 293601280, "maxTileRow" : 335544319 }, { "coalesce" : 3, "minTileRow" : 335544320, "maxTileRow" : 346030079 }, { "coalesce" : 4, "minTileRow" : 346030080, "maxTileRow" : 356515839 }, { "coalesce" : 6, "minTileRow" : 356515840, "maxTileRow" : 375390207 }, { "coalesce" : 12, "minTileRow" : 375390208, "maxTileRow" : 377487359 } ] } ] } morecantile-7.0.3/morecantile/data/CanadianNAD83_LCC.json000066400000000000000000000161431514074772600230300ustar00rootroot00000000000000{ "id": "CanadianNAD83_LCC", "title": "Lambert conformal conic NAD83 for Canada", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/CanadianNAD83_LCC", "crs": "http://www.opengis.net/def/crs/EPSG/0/3978", "orderedAxes": ["E", "N"], "tileMatrices": [ { "id": "0", "scaleDenominator": 145000000, "cellSize": 38364.6600626534, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 5, "matrixHeight": 5 }, { "id": "1", "scaleDenominator": 85000000, "cellSize": 22489.6283125899, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "id": "2", "scaleDenominator": 50000000, "cellSize": 13229.1931250529, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 13, "matrixHeight": 14 }, { "id": "3", "scaleDenominator": 30000000, "cellSize": 7937.51587503175, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 21, "matrixHeight": 22 }, { "id": "4", "scaleDenominator": 17500000, "cellSize": 4630.21759376852, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 36, "matrixHeight": 38 }, { "id": "5", "scaleDenominator": 10000000, "cellSize": 2645.83862501058, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 62, "matrixHeight": 66 }, { "id": "6", "scaleDenominator": 6000000, "cellSize": 1587.50317500635, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 103, "matrixHeight": 110 }, { "id": "7", "scaleDenominator": 3500000, "cellSize": 926.043518753704, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 177, "matrixHeight": 188 }, { "id": "8", "scaleDenominator": 2000000, "cellSize": 529.167725002116, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 309, "matrixHeight": 329 }, { "id": "9", "scaleDenominator": 1200000, "cellSize": 317.50063500127, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 515, "matrixHeight": 548 }, { "id": "10", "scaleDenominator": 700000, "cellSize": 185.20870375074, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 882, "matrixHeight": 938 }, { "id": "11", "scaleDenominator": 420000, "cellSize": 111.125222250444, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1470, "matrixHeight": 1563 }, { "id": "12", "scaleDenominator": 250000, "cellSize": 66.1459656252646, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2469, "matrixHeight": 2626 }, { "id": "13", "scaleDenominator": 145000, "cellSize": 38.3646600626534, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4257, "matrixHeight": 4528 }, { "id": "14", "scaleDenominator": 85000, "cellSize": 22.4896283125899, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 7262, "matrixHeight": 7723 }, { "id": "15", "scaleDenominator": 50000, "cellSize": 13.2291931250529, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 12344, "matrixHeight": 13130 }, { "id": "16", "scaleDenominator": 30000, "cellSize": 7.93751587503175, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 20574, "matrixHeight": 21882 }, { "id": "17", "scaleDenominator": 17500, "cellSize": 4.63021759376852, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 35269, "matrixHeight": 37512 }, { "id": "18", "scaleDenominator": 10000, "cellSize": 2.64583862501058, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 61720, "matrixHeight": 65646 }, { "id": "19", "scaleDenominator": 6000, "cellSize": 1.58750317500635, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 102866, "matrixHeight": 109409 }, { "id": "20", "scaleDenominator": 3500, "cellSize": 0.926043518753704, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 176341, "matrixHeight": 187558 }, { "id": "21", "scaleDenominator": 2000, "cellSize": 0.529167725002116, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 308596, "matrixHeight": 328227 }, { "id": "22", "scaleDenominator": 1200, "cellSize": 0.31750063500127, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 514327, "matrixHeight": 547044 }, { "id": "23", "scaleDenominator": 700, "cellSize": 0.18520870375074, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 881703, "matrixHeight": 937790 }, { "id": "24", "scaleDenominator": 420, "cellSize": 0.111125222250444, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1469505, "matrixHeight": 1562983 }, { "id": "25", "scaleDenominator": 250, "cellSize": 0.0661459656252645, "pointOfOrigin": [-34655800,39310000], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2468768, "matrixHeight": 2625811 } ] }morecantile-7.0.3/morecantile/data/EuropeanETRS89_LAEAQuad.json000066400000000000000000000111071514074772600242000ustar00rootroot00000000000000{ "id": "EuropeanETRS89_LAEAQuad", "title": "Lambert Azimuthal Equal Area ETRS89 for Europe", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/EuropeanETRS89_LAEAQuad", "crs": "http://www.opengis.net/def/crs/EPSG/0/3035", "orderedAxes": [ "Y", "X" ], "tileMatrices": [ { "id": "0", "scaleDenominator": 62779017.8571428, "cellSize": 17578.125, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1 }, { "id": "1", "scaleDenominator": 31389508.9285714, "cellSize": 8789.0625, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2 }, { "id": "2", "scaleDenominator": 15694754.4642857, "cellSize": 4394.53125, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4 }, { "id": "3", "scaleDenominator": 7847377.23214285, "cellSize": 2197.265625, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "id": "4", "scaleDenominator": 3923688.61607142, "cellSize": 1098.6328125, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 16 }, { "id": "5", "scaleDenominator": 1961844.30803571, "cellSize": 549.31640625, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 32 }, { "id": "6", "scaleDenominator": 980922.154017857, "cellSize": 274.658203125, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 64 }, { "id": "7", "scaleDenominator": 490461.077008928, "cellSize": 137.3291015625, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 128 }, { "id": "8", "scaleDenominator": 245230.538504464, "cellSize": 68.6645507812, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 256 }, { "id": "9", "scaleDenominator": 122615.269252232, "cellSize": 34.3322753906, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 512 }, { "id": "10", "scaleDenominator": 61307.634626116, "cellSize": 17.1661376953, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 1024 }, { "id": "11", "scaleDenominator": 30653.817313058, "cellSize": 8.5830688477, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 2048 }, { "id": "12", "scaleDenominator": 15326.908656529, "cellSize": 4.2915344238, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 4096 }, { "id": "13", "scaleDenominator": 7663.45432826451, "cellSize": 2.1457672119, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 8192 }, { "id": "14", "scaleDenominator": 3831.72716413225, "cellSize": 1.072883606, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 16384 }, { "id": "15", "scaleDenominator": 1915.86358206612, "cellSize": 0.536441803, "pointOfOrigin": [5500000.0, 2000000.0], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 32768 } ] }morecantile-7.0.3/morecantile/data/GNOSISGlobalGrid.json000066400000000000000000002216751514074772600231140ustar00rootroot00000000000000{ "id" : "GNOSISGlobalGrid", "title" : "GNOSIS Global Grid", "uri" : "http://www.opengis.net/def/tilematrixset/OGC/1.0/GNOSISGlobalGrid", "crs" : "http://www.opengis.net/def/crs/EPSG/0/4326", "orderedAxes" : ["Lat","Lon"], "wellKnownScaleSet" : "http://www.opengis.net/def/wkss/OGC/1.0/GoogleCRS84Quad", "tileMatrices" : [ { "id" : "0", "scaleDenominator" : 139770566.0071794390678, "cellSize" : 0.3515625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 4, "matrixHeight" : 2, "tileWidth" : 256, "tileHeight" : 256 }, { "id" : "1", "scaleDenominator" : 69885283.0035897195339, "cellSize" : 0.17578125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 8, "matrixHeight" : 4, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 2, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 2, "minTileRow" : 3, "maxTileRow" : 3 } ] }, { "id" : "2", "scaleDenominator" : 34942641.501794859767, "cellSize" : 0.087890625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 16, "matrixHeight" : 8, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 4, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 2, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 2, "minTileRow" : 6, "maxTileRow" : 6 }, { "coalesce" : 4, "minTileRow" : 7, "maxTileRow" : 7 } ] }, { "id" : "3", "scaleDenominator" : 17471320.7508974298835, "cellSize" : 0.0439453125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 32, "matrixHeight" : 16, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 8, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 4, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 2, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 2, "minTileRow" : 12, "maxTileRow" : 13 }, { "coalesce" : 4, "minTileRow" : 14, "maxTileRow" : 14 }, { "coalesce" : 8, "minTileRow" : 15, "maxTileRow" : 15 } ] }, { "id" : "4", "scaleDenominator" : 8735660.3754487149417, "cellSize" : 0.02197265625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 64, "matrixHeight" : 32, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 16, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 8, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 4, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 2, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 2, "minTileRow" : 24, "maxTileRow" : 27 }, { "coalesce" : 4, "minTileRow" : 28, "maxTileRow" : 29 }, { "coalesce" : 8, "minTileRow" : 30, "maxTileRow" : 30 }, { "coalesce" : 16, "minTileRow" : 31, "maxTileRow" : 31 } ] }, { "id" : "5", "scaleDenominator" : 4367830.1877243574709, "cellSize" : 0.010986328125, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 128, "matrixHeight" : 64, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 32, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 16, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 8, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 4, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 2, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 2, "minTileRow" : 48, "maxTileRow" : 55 }, { "coalesce" : 4, "minTileRow" : 56, "maxTileRow" : 59 }, { "coalesce" : 8, "minTileRow" : 60, "maxTileRow" : 61 }, { "coalesce" : 16, "minTileRow" : 62, "maxTileRow" : 62 }, { "coalesce" : 32, "minTileRow" : 63, "maxTileRow" : 63 } ] }, { "id" : "6", "scaleDenominator" : 2183915.0938621787354, "cellSize" : 0.0054931640625, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 256, "matrixHeight" : 128, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 64, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 32, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 16, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 8, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 4, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 2, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 2, "minTileRow" : 96, "maxTileRow" : 111 }, { "coalesce" : 4, "minTileRow" : 112, "maxTileRow" : 119 }, { "coalesce" : 8, "minTileRow" : 120, "maxTileRow" : 123 }, { "coalesce" : 16, "minTileRow" : 124, "maxTileRow" : 125 }, { "coalesce" : 32, "minTileRow" : 126, "maxTileRow" : 126 }, { "coalesce" : 64, "minTileRow" : 127, "maxTileRow" : 127 } ] }, { "id" : "7", "scaleDenominator" : 1091957.5469310893677, "cellSize" : 0.0027465820312, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 512, "matrixHeight" : 256, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 128, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 64, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 32, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 16, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 8, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 4, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 2, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 2, "minTileRow" : 192, "maxTileRow" : 223 }, { "coalesce" : 4, "minTileRow" : 224, "maxTileRow" : 239 }, { "coalesce" : 8, "minTileRow" : 240, "maxTileRow" : 247 }, { "coalesce" : 16, "minTileRow" : 248, "maxTileRow" : 251 }, { "coalesce" : 32, "minTileRow" : 252, "maxTileRow" : 253 }, { "coalesce" : 64, "minTileRow" : 254, "maxTileRow" : 254 }, { "coalesce" : 128, "minTileRow" : 255, "maxTileRow" : 255 } ] }, { "id" : "8", "scaleDenominator" : 545978.7734655446839, "cellSize" : 0.0013732910156, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 1024, "matrixHeight" : 512, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 256, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 128, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 64, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 32, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 16, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 8, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 4, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 2, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 2, "minTileRow" : 384, "maxTileRow" : 447 }, { "coalesce" : 4, "minTileRow" : 448, "maxTileRow" : 479 }, { "coalesce" : 8, "minTileRow" : 480, "maxTileRow" : 495 }, { "coalesce" : 16, "minTileRow" : 496, "maxTileRow" : 503 }, { "coalesce" : 32, "minTileRow" : 504, "maxTileRow" : 507 }, { "coalesce" : 64, "minTileRow" : 508, "maxTileRow" : 509 }, { "coalesce" : 128, "minTileRow" : 510, "maxTileRow" : 510 }, { "coalesce" : 256, "minTileRow" : 511, "maxTileRow" : 511 } ] }, { "id" : "9", "scaleDenominator" : 272989.3867327723419, "cellSize" : 0.0006866455078, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 2048, "matrixHeight" : 1024, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 512, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 256, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 128, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 64, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 32, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 16, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 8, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 4, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 2, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 2, "minTileRow" : 768, "maxTileRow" : 895 }, { "coalesce" : 4, "minTileRow" : 896, "maxTileRow" : 959 }, { "coalesce" : 8, "minTileRow" : 960, "maxTileRow" : 991 }, { "coalesce" : 16, "minTileRow" : 992, "maxTileRow" : 1007 }, { "coalesce" : 32, "minTileRow" : 1008, "maxTileRow" : 1015 }, { "coalesce" : 64, "minTileRow" : 1016, "maxTileRow" : 1019 }, { "coalesce" : 128, "minTileRow" : 1020, "maxTileRow" : 1021 }, { "coalesce" : 256, "minTileRow" : 1022, "maxTileRow" : 1022 }, { "coalesce" : 512, "minTileRow" : 1023, "maxTileRow" : 1023 } ] }, { "id" : "10", "scaleDenominator" : 136494.693366386171, "cellSize" : 0.0003433227539, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 4096, "matrixHeight" : 2048, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 1024, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 512, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 256, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 128, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 64, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 32, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 16, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 8, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 4, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 2, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 2, "minTileRow" : 1536, "maxTileRow" : 1791 }, { "coalesce" : 4, "minTileRow" : 1792, "maxTileRow" : 1919 }, { "coalesce" : 8, "minTileRow" : 1920, "maxTileRow" : 1983 }, { "coalesce" : 16, "minTileRow" : 1984, "maxTileRow" : 2015 }, { "coalesce" : 32, "minTileRow" : 2016, "maxTileRow" : 2031 }, { "coalesce" : 64, "minTileRow" : 2032, "maxTileRow" : 2039 }, { "coalesce" : 128, "minTileRow" : 2040, "maxTileRow" : 2043 }, { "coalesce" : 256, "minTileRow" : 2044, "maxTileRow" : 2045 }, { "coalesce" : 512, "minTileRow" : 2046, "maxTileRow" : 2046 }, { "coalesce" : 1024, "minTileRow" : 2047, "maxTileRow" : 2047 } ] }, { "id" : "11", "scaleDenominator" : 68247.3466831930855, "cellSize" : 0.000171661377, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 8192, "matrixHeight" : 4096, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 2048, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 1024, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 512, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 256, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 128, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 64, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 32, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 16, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 8, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 4, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 2, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 2, "minTileRow" : 3072, "maxTileRow" : 3583 }, { "coalesce" : 4, "minTileRow" : 3584, "maxTileRow" : 3839 }, { "coalesce" : 8, "minTileRow" : 3840, "maxTileRow" : 3967 }, { "coalesce" : 16, "minTileRow" : 3968, "maxTileRow" : 4031 }, { "coalesce" : 32, "minTileRow" : 4032, "maxTileRow" : 4063 }, { "coalesce" : 64, "minTileRow" : 4064, "maxTileRow" : 4079 }, { "coalesce" : 128, "minTileRow" : 4080, "maxTileRow" : 4087 }, { "coalesce" : 256, "minTileRow" : 4088, "maxTileRow" : 4091 }, { "coalesce" : 512, "minTileRow" : 4092, "maxTileRow" : 4093 }, { "coalesce" : 1024, "minTileRow" : 4094, "maxTileRow" : 4094 }, { "coalesce" : 2048, "minTileRow" : 4095, "maxTileRow" : 4095 } ] }, { "id" : "12", "scaleDenominator" : 34123.6733415965427, "cellSize" : 0.0000858306885, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 16384, "matrixHeight" : 8192, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 4096, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 2048, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 1024, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 512, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 256, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 128, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 64, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 32, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 16, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 8, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 4, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 2, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 2, "minTileRow" : 6144, "maxTileRow" : 7167 }, { "coalesce" : 4, "minTileRow" : 7168, "maxTileRow" : 7679 }, { "coalesce" : 8, "minTileRow" : 7680, "maxTileRow" : 7935 }, { "coalesce" : 16, "minTileRow" : 7936, "maxTileRow" : 8063 }, { "coalesce" : 32, "minTileRow" : 8064, "maxTileRow" : 8127 }, { "coalesce" : 64, "minTileRow" : 8128, "maxTileRow" : 8159 }, { "coalesce" : 128, "minTileRow" : 8160, "maxTileRow" : 8175 }, { "coalesce" : 256, "minTileRow" : 8176, "maxTileRow" : 8183 }, { "coalesce" : 512, "minTileRow" : 8184, "maxTileRow" : 8187 }, { "coalesce" : 1024, "minTileRow" : 8188, "maxTileRow" : 8189 }, { "coalesce" : 2048, "minTileRow" : 8190, "maxTileRow" : 8190 }, { "coalesce" : 4096, "minTileRow" : 8191, "maxTileRow" : 8191 } ] }, { "id" : "13", "scaleDenominator" : 17061.8366707982714, "cellSize" : 0.0000429153442, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 32768, "matrixHeight" : 16384, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 8192, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 4096, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 2048, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 1024, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 512, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 256, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 128, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 64, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 32, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 16, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 8, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 4, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 2, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 2, "minTileRow" : 12288, "maxTileRow" : 14335 }, { "coalesce" : 4, "minTileRow" : 14336, "maxTileRow" : 15359 }, { "coalesce" : 8, "minTileRow" : 15360, "maxTileRow" : 15871 }, { "coalesce" : 16, "minTileRow" : 15872, "maxTileRow" : 16127 }, { "coalesce" : 32, "minTileRow" : 16128, "maxTileRow" : 16255 }, { "coalesce" : 64, "minTileRow" : 16256, "maxTileRow" : 16319 }, { "coalesce" : 128, "minTileRow" : 16320, "maxTileRow" : 16351 }, { "coalesce" : 256, "minTileRow" : 16352, "maxTileRow" : 16367 }, { "coalesce" : 512, "minTileRow" : 16368, "maxTileRow" : 16375 }, { "coalesce" : 1024, "minTileRow" : 16376, "maxTileRow" : 16379 }, { "coalesce" : 2048, "minTileRow" : 16380, "maxTileRow" : 16381 }, { "coalesce" : 4096, "minTileRow" : 16382, "maxTileRow" : 16382 }, { "coalesce" : 8192, "minTileRow" : 16383, "maxTileRow" : 16383 } ] }, { "id" : "14", "scaleDenominator" : 8530.9183353991357, "cellSize" : 0.0000214576721, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 65536, "matrixHeight" : 32768, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 16384, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 8192, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 4096, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 2048, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 1024, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 512, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 256, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 128, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 64, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 32, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 16, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 8, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 4, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 2, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 2, "minTileRow" : 24576, "maxTileRow" : 28671 }, { "coalesce" : 4, "minTileRow" : 28672, "maxTileRow" : 30719 }, { "coalesce" : 8, "minTileRow" : 30720, "maxTileRow" : 31743 }, { "coalesce" : 16, "minTileRow" : 31744, "maxTileRow" : 32255 }, { "coalesce" : 32, "minTileRow" : 32256, "maxTileRow" : 32511 }, { "coalesce" : 64, "minTileRow" : 32512, "maxTileRow" : 32639 }, { "coalesce" : 128, "minTileRow" : 32640, "maxTileRow" : 32703 }, { "coalesce" : 256, "minTileRow" : 32704, "maxTileRow" : 32735 }, { "coalesce" : 512, "minTileRow" : 32736, "maxTileRow" : 32751 }, { "coalesce" : 1024, "minTileRow" : 32752, "maxTileRow" : 32759 }, { "coalesce" : 2048, "minTileRow" : 32760, "maxTileRow" : 32763 }, { "coalesce" : 4096, "minTileRow" : 32764, "maxTileRow" : 32765 }, { "coalesce" : 8192, "minTileRow" : 32766, "maxTileRow" : 32766 }, { "coalesce" : 16384, "minTileRow" : 32767, "maxTileRow" : 32767 } ] }, { "id" : "15", "scaleDenominator" : 4265.4591676995678, "cellSize" : 0.0000107288361, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 131072, "matrixHeight" : 65536, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 32768, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 16384, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 8192, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 4096, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 2048, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 1024, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 512, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 256, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 128, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 64, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 32, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 16, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 8, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 4, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 2, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 2, "minTileRow" : 49152, "maxTileRow" : 57343 }, { "coalesce" : 4, "minTileRow" : 57344, "maxTileRow" : 61439 }, { "coalesce" : 8, "minTileRow" : 61440, "maxTileRow" : 63487 }, { "coalesce" : 16, "minTileRow" : 63488, "maxTileRow" : 64511 }, { "coalesce" : 32, "minTileRow" : 64512, "maxTileRow" : 65023 }, { "coalesce" : 64, "minTileRow" : 65024, "maxTileRow" : 65279 }, { "coalesce" : 128, "minTileRow" : 65280, "maxTileRow" : 65407 }, { "coalesce" : 256, "minTileRow" : 65408, "maxTileRow" : 65471 }, { "coalesce" : 512, "minTileRow" : 65472, "maxTileRow" : 65503 }, { "coalesce" : 1024, "minTileRow" : 65504, "maxTileRow" : 65519 }, { "coalesce" : 2048, "minTileRow" : 65520, "maxTileRow" : 65527 }, { "coalesce" : 4096, "minTileRow" : 65528, "maxTileRow" : 65531 }, { "coalesce" : 8192, "minTileRow" : 65532, "maxTileRow" : 65533 }, { "coalesce" : 16384, "minTileRow" : 65534, "maxTileRow" : 65534 }, { "coalesce" : 32768, "minTileRow" : 65535, "maxTileRow" : 65535 } ] }, { "id" : "16", "scaleDenominator" : 2132.7295838497839, "cellSize" : 0.000005364418, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 262144, "matrixHeight" : 131072, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 65536, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 32768, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 16384, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 8192, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 4096, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 2048, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 1024, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 512, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 256, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 128, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 64, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 32, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 16, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 8, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 4, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 2, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 2, "minTileRow" : 98304, "maxTileRow" : 114687 }, { "coalesce" : 4, "minTileRow" : 114688, "maxTileRow" : 122879 }, { "coalesce" : 8, "minTileRow" : 122880, "maxTileRow" : 126975 }, { "coalesce" : 16, "minTileRow" : 126976, "maxTileRow" : 129023 }, { "coalesce" : 32, "minTileRow" : 129024, "maxTileRow" : 130047 }, { "coalesce" : 64, "minTileRow" : 130048, "maxTileRow" : 130559 }, { "coalesce" : 128, "minTileRow" : 130560, "maxTileRow" : 130815 }, { "coalesce" : 256, "minTileRow" : 130816, "maxTileRow" : 130943 }, { "coalesce" : 512, "minTileRow" : 130944, "maxTileRow" : 131007 }, { "coalesce" : 1024, "minTileRow" : 131008, "maxTileRow" : 131039 }, { "coalesce" : 2048, "minTileRow" : 131040, "maxTileRow" : 131055 }, { "coalesce" : 4096, "minTileRow" : 131056, "maxTileRow" : 131063 }, { "coalesce" : 8192, "minTileRow" : 131064, "maxTileRow" : 131067 }, { "coalesce" : 16384, "minTileRow" : 131068, "maxTileRow" : 131069 }, { "coalesce" : 32768, "minTileRow" : 131070, "maxTileRow" : 131070 }, { "coalesce" : 65536, "minTileRow" : 131071, "maxTileRow" : 131071 } ] }, { "id" : "17", "scaleDenominator" : 1066.364791924892, "cellSize" : 0.000002682209, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 524288, "matrixHeight" : 262144, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 131072, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 65536, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 32768, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 16384, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 8192, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 4096, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 2048, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 1024, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 512, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 256, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 128, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 64, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 32, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 16, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 8, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 4, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 2, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 2, "minTileRow" : 196608, "maxTileRow" : 229375 }, { "coalesce" : 4, "minTileRow" : 229376, "maxTileRow" : 245759 }, { "coalesce" : 8, "minTileRow" : 245760, "maxTileRow" : 253951 }, { "coalesce" : 16, "minTileRow" : 253952, "maxTileRow" : 258047 }, { "coalesce" : 32, "minTileRow" : 258048, "maxTileRow" : 260095 }, { "coalesce" : 64, "minTileRow" : 260096, "maxTileRow" : 261119 }, { "coalesce" : 128, "minTileRow" : 261120, "maxTileRow" : 261631 }, { "coalesce" : 256, "minTileRow" : 261632, "maxTileRow" : 261887 }, { "coalesce" : 512, "minTileRow" : 261888, "maxTileRow" : 262015 }, { "coalesce" : 1024, "minTileRow" : 262016, "maxTileRow" : 262079 }, { "coalesce" : 2048, "minTileRow" : 262080, "maxTileRow" : 262111 }, { "coalesce" : 4096, "minTileRow" : 262112, "maxTileRow" : 262127 }, { "coalesce" : 8192, "minTileRow" : 262128, "maxTileRow" : 262135 }, { "coalesce" : 16384, "minTileRow" : 262136, "maxTileRow" : 262139 }, { "coalesce" : 32768, "minTileRow" : 262140, "maxTileRow" : 262141 }, { "coalesce" : 65536, "minTileRow" : 262142, "maxTileRow" : 262142 }, { "coalesce" : 131072, "minTileRow" : 262143, "maxTileRow" : 262143 } ] }, { "id" : "18", "scaleDenominator" : 533.182395962446, "cellSize" : 0.0000013411045, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 1048576, "matrixHeight" : 524288, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 262144, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 131072, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 65536, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 32768, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 16384, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 8192, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 4096, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 2048, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 1024, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 512, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 256, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 128, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 64, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 32, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 16, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 8, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 4, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 2, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 2, "minTileRow" : 393216, "maxTileRow" : 458751 }, { "coalesce" : 4, "minTileRow" : 458752, "maxTileRow" : 491519 }, { "coalesce" : 8, "minTileRow" : 491520, "maxTileRow" : 507903 }, { "coalesce" : 16, "minTileRow" : 507904, "maxTileRow" : 516095 }, { "coalesce" : 32, "minTileRow" : 516096, "maxTileRow" : 520191 }, { "coalesce" : 64, "minTileRow" : 520192, "maxTileRow" : 522239 }, { "coalesce" : 128, "minTileRow" : 522240, "maxTileRow" : 523263 }, { "coalesce" : 256, "minTileRow" : 523264, "maxTileRow" : 523775 }, { "coalesce" : 512, "minTileRow" : 523776, "maxTileRow" : 524031 }, { "coalesce" : 1024, "minTileRow" : 524032, "maxTileRow" : 524159 }, { "coalesce" : 2048, "minTileRow" : 524160, "maxTileRow" : 524223 }, { "coalesce" : 4096, "minTileRow" : 524224, "maxTileRow" : 524255 }, { "coalesce" : 8192, "minTileRow" : 524256, "maxTileRow" : 524271 }, { "coalesce" : 16384, "minTileRow" : 524272, "maxTileRow" : 524279 }, { "coalesce" : 32768, "minTileRow" : 524280, "maxTileRow" : 524283 }, { "coalesce" : 65536, "minTileRow" : 524284, "maxTileRow" : 524285 }, { "coalesce" : 131072, "minTileRow" : 524286, "maxTileRow" : 524286 }, { "coalesce" : 262144, "minTileRow" : 524287, "maxTileRow" : 524287 } ] }, { "id" : "19", "scaleDenominator" : 266.591197981223, "cellSize" : 0.0000006705523, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 2097152, "matrixHeight" : 1048576, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 524288, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 262144, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 131072, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 65536, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 32768, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 16384, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 8192, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 4096, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 2048, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 1024, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 512, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 256, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 128, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 64, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 32, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 16, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 8, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 4, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 2, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 2, "minTileRow" : 786432, "maxTileRow" : 917503 }, { "coalesce" : 4, "minTileRow" : 917504, "maxTileRow" : 983039 }, { "coalesce" : 8, "minTileRow" : 983040, "maxTileRow" : 1015807 }, { "coalesce" : 16, "minTileRow" : 1015808, "maxTileRow" : 1032191 }, { "coalesce" : 32, "minTileRow" : 1032192, "maxTileRow" : 1040383 }, { "coalesce" : 64, "minTileRow" : 1040384, "maxTileRow" : 1044479 }, { "coalesce" : 128, "minTileRow" : 1044480, "maxTileRow" : 1046527 }, { "coalesce" : 256, "minTileRow" : 1046528, "maxTileRow" : 1047551 }, { "coalesce" : 512, "minTileRow" : 1047552, "maxTileRow" : 1048063 }, { "coalesce" : 1024, "minTileRow" : 1048064, "maxTileRow" : 1048319 }, { "coalesce" : 2048, "minTileRow" : 1048320, "maxTileRow" : 1048447 }, { "coalesce" : 4096, "minTileRow" : 1048448, "maxTileRow" : 1048511 }, { "coalesce" : 8192, "minTileRow" : 1048512, "maxTileRow" : 1048543 }, { "coalesce" : 16384, "minTileRow" : 1048544, "maxTileRow" : 1048559 }, { "coalesce" : 32768, "minTileRow" : 1048560, "maxTileRow" : 1048567 }, { "coalesce" : 65536, "minTileRow" : 1048568, "maxTileRow" : 1048571 }, { "coalesce" : 131072, "minTileRow" : 1048572, "maxTileRow" : 1048573 }, { "coalesce" : 262144, "minTileRow" : 1048574, "maxTileRow" : 1048574 }, { "coalesce" : 524288, "minTileRow" : 1048575, "maxTileRow" : 1048575 } ] }, { "id" : "20", "scaleDenominator" : 133.2955989906115, "cellSize" : 0.0000003352761, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 4194304, "matrixHeight" : 2097152, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 1048576, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 524288, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 262144, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 131072, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 65536, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 32768, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 16384, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 8192, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 4096, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 2048, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 1024, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 512, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 256, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 128, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 64, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 32, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 16, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 8, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 4, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 2, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 2, "minTileRow" : 1572864, "maxTileRow" : 1835007 }, { "coalesce" : 4, "minTileRow" : 1835008, "maxTileRow" : 1966079 }, { "coalesce" : 8, "minTileRow" : 1966080, "maxTileRow" : 2031615 }, { "coalesce" : 16, "minTileRow" : 2031616, "maxTileRow" : 2064383 }, { "coalesce" : 32, "minTileRow" : 2064384, "maxTileRow" : 2080767 }, { "coalesce" : 64, "minTileRow" : 2080768, "maxTileRow" : 2088959 }, { "coalesce" : 128, "minTileRow" : 2088960, "maxTileRow" : 2093055 }, { "coalesce" : 256, "minTileRow" : 2093056, "maxTileRow" : 2095103 }, { "coalesce" : 512, "minTileRow" : 2095104, "maxTileRow" : 2096127 }, { "coalesce" : 1024, "minTileRow" : 2096128, "maxTileRow" : 2096639 }, { "coalesce" : 2048, "minTileRow" : 2096640, "maxTileRow" : 2096895 }, { "coalesce" : 4096, "minTileRow" : 2096896, "maxTileRow" : 2097023 }, { "coalesce" : 8192, "minTileRow" : 2097024, "maxTileRow" : 2097087 }, { "coalesce" : 16384, "minTileRow" : 2097088, "maxTileRow" : 2097119 }, { "coalesce" : 32768, "minTileRow" : 2097120, "maxTileRow" : 2097135 }, { "coalesce" : 65536, "minTileRow" : 2097136, "maxTileRow" : 2097143 }, { "coalesce" : 131072, "minTileRow" : 2097144, "maxTileRow" : 2097147 }, { "coalesce" : 262144, "minTileRow" : 2097148, "maxTileRow" : 2097149 }, { "coalesce" : 524288, "minTileRow" : 2097150, "maxTileRow" : 2097150 }, { "coalesce" : 1048576, "minTileRow" : 2097151, "maxTileRow" : 2097151 } ] }, { "id" : "21", "scaleDenominator" : 66.6477994953057, "cellSize" : 0.0000001676381, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 8388608, "matrixHeight" : 4194304, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 2097152, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 1048576, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 524288, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 262144, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 131072, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 65536, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 32768, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 16384, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 8192, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 4096, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 2048, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 1024, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 512, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 256, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 128, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 64, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 32, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 16, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 8, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 4, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 2, "minTileRow" : 524288, "maxTileRow" : 1048575 }, { "coalesce" : 2, "minTileRow" : 3145728, "maxTileRow" : 3670015 }, { "coalesce" : 4, "minTileRow" : 3670016, "maxTileRow" : 3932159 }, { "coalesce" : 8, "minTileRow" : 3932160, "maxTileRow" : 4063231 }, { "coalesce" : 16, "minTileRow" : 4063232, "maxTileRow" : 4128767 }, { "coalesce" : 32, "minTileRow" : 4128768, "maxTileRow" : 4161535 }, { "coalesce" : 64, "minTileRow" : 4161536, "maxTileRow" : 4177919 }, { "coalesce" : 128, "minTileRow" : 4177920, "maxTileRow" : 4186111 }, { "coalesce" : 256, "minTileRow" : 4186112, "maxTileRow" : 4190207 }, { "coalesce" : 512, "minTileRow" : 4190208, "maxTileRow" : 4192255 }, { "coalesce" : 1024, "minTileRow" : 4192256, "maxTileRow" : 4193279 }, { "coalesce" : 2048, "minTileRow" : 4193280, "maxTileRow" : 4193791 }, { "coalesce" : 4096, "minTileRow" : 4193792, "maxTileRow" : 4194047 }, { "coalesce" : 8192, "minTileRow" : 4194048, "maxTileRow" : 4194175 }, { "coalesce" : 16384, "minTileRow" : 4194176, "maxTileRow" : 4194239 }, { "coalesce" : 32768, "minTileRow" : 4194240, "maxTileRow" : 4194271 }, { "coalesce" : 65536, "minTileRow" : 4194272, "maxTileRow" : 4194287 }, { "coalesce" : 131072, "minTileRow" : 4194288, "maxTileRow" : 4194295 }, { "coalesce" : 262144, "minTileRow" : 4194296, "maxTileRow" : 4194299 }, { "coalesce" : 524288, "minTileRow" : 4194300, "maxTileRow" : 4194301 }, { "coalesce" : 1048576, "minTileRow" : 4194302, "maxTileRow" : 4194302 }, { "coalesce" : 2097152, "minTileRow" : 4194303, "maxTileRow" : 4194303 } ] }, { "id" : "22", "scaleDenominator" : 33.3238997476529, "cellSize" : 0.000000083819, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 16777216, "matrixHeight" : 8388608, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 4194304, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 2097152, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 1048576, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 524288, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 262144, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 131072, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 65536, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 32768, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 16384, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 8192, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 4096, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 2048, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 1024, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 512, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 256, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 128, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 64, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 32, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 16, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 8, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 4, "minTileRow" : 524288, "maxTileRow" : 1048575 }, { "coalesce" : 2, "minTileRow" : 1048576, "maxTileRow" : 2097151 }, { "coalesce" : 2, "minTileRow" : 6291456, "maxTileRow" : 7340031 }, { "coalesce" : 4, "minTileRow" : 7340032, "maxTileRow" : 7864319 }, { "coalesce" : 8, "minTileRow" : 7864320, "maxTileRow" : 8126463 }, { "coalesce" : 16, "minTileRow" : 8126464, "maxTileRow" : 8257535 }, { "coalesce" : 32, "minTileRow" : 8257536, "maxTileRow" : 8323071 }, { "coalesce" : 64, "minTileRow" : 8323072, "maxTileRow" : 8355839 }, { "coalesce" : 128, "minTileRow" : 8355840, "maxTileRow" : 8372223 }, { "coalesce" : 256, "minTileRow" : 8372224, "maxTileRow" : 8380415 }, { "coalesce" : 512, "minTileRow" : 8380416, "maxTileRow" : 8384511 }, { "coalesce" : 1024, "minTileRow" : 8384512, "maxTileRow" : 8386559 }, { "coalesce" : 2048, "minTileRow" : 8386560, "maxTileRow" : 8387583 }, { "coalesce" : 4096, "minTileRow" : 8387584, "maxTileRow" : 8388095 }, { "coalesce" : 8192, "minTileRow" : 8388096, "maxTileRow" : 8388351 }, { "coalesce" : 16384, "minTileRow" : 8388352, "maxTileRow" : 8388479 }, { "coalesce" : 32768, "minTileRow" : 8388480, "maxTileRow" : 8388543 }, { "coalesce" : 65536, "minTileRow" : 8388544, "maxTileRow" : 8388575 }, { "coalesce" : 131072, "minTileRow" : 8388576, "maxTileRow" : 8388591 }, { "coalesce" : 262144, "minTileRow" : 8388592, "maxTileRow" : 8388599 }, { "coalesce" : 524288, "minTileRow" : 8388600, "maxTileRow" : 8388603 }, { "coalesce" : 1048576, "minTileRow" : 8388604, "maxTileRow" : 8388605 }, { "coalesce" : 2097152, "minTileRow" : 8388606, "maxTileRow" : 8388606 }, { "coalesce" : 4194304, "minTileRow" : 8388607, "maxTileRow" : 8388607 } ] }, { "id" : "23", "scaleDenominator" : 16.6619498738264, "cellSize" : 0.0000000419095, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 33554432, "matrixHeight" : 16777216, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 8388608, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 4194304, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 2097152, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 1048576, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 524288, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 262144, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 131072, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 65536, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 32768, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 16384, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 8192, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 4096, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 2048, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 1024, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 512, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 256, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 128, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 64, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 32, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 16, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 8, "minTileRow" : 524288, "maxTileRow" : 1048575 }, { "coalesce" : 4, "minTileRow" : 1048576, "maxTileRow" : 2097151 }, { "coalesce" : 2, "minTileRow" : 2097152, "maxTileRow" : 4194303 }, { "coalesce" : 2, "minTileRow" : 12582912, "maxTileRow" : 14680063 }, { "coalesce" : 4, "minTileRow" : 14680064, "maxTileRow" : 15728639 }, { "coalesce" : 8, "minTileRow" : 15728640, "maxTileRow" : 16252927 }, { "coalesce" : 16, "minTileRow" : 16252928, "maxTileRow" : 16515071 }, { "coalesce" : 32, "minTileRow" : 16515072, "maxTileRow" : 16646143 }, { "coalesce" : 64, "minTileRow" : 16646144, "maxTileRow" : 16711679 }, { "coalesce" : 128, "minTileRow" : 16711680, "maxTileRow" : 16744447 }, { "coalesce" : 256, "minTileRow" : 16744448, "maxTileRow" : 16760831 }, { "coalesce" : 512, "minTileRow" : 16760832, "maxTileRow" : 16769023 }, { "coalesce" : 1024, "minTileRow" : 16769024, "maxTileRow" : 16773119 }, { "coalesce" : 2048, "minTileRow" : 16773120, "maxTileRow" : 16775167 }, { "coalesce" : 4096, "minTileRow" : 16775168, "maxTileRow" : 16776191 }, { "coalesce" : 8192, "minTileRow" : 16776192, "maxTileRow" : 16776703 }, { "coalesce" : 16384, "minTileRow" : 16776704, "maxTileRow" : 16776959 }, { "coalesce" : 32768, "minTileRow" : 16776960, "maxTileRow" : 16777087 }, { "coalesce" : 65536, "minTileRow" : 16777088, "maxTileRow" : 16777151 }, { "coalesce" : 131072, "minTileRow" : 16777152, "maxTileRow" : 16777183 }, { "coalesce" : 262144, "minTileRow" : 16777184, "maxTileRow" : 16777199 }, { "coalesce" : 524288, "minTileRow" : 16777200, "maxTileRow" : 16777207 }, { "coalesce" : 1048576, "minTileRow" : 16777208, "maxTileRow" : 16777211 }, { "coalesce" : 2097152, "minTileRow" : 16777212, "maxTileRow" : 16777213 }, { "coalesce" : 4194304, "minTileRow" : 16777214, "maxTileRow" : 16777214 }, { "coalesce" : 8388608, "minTileRow" : 16777215, "maxTileRow" : 16777215 } ] }, { "id" : "24", "scaleDenominator" : 8.3309749369132, "cellSize" : 0.0000000209548, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 67108864, "matrixHeight" : 33554432, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 16777216, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 8388608, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 4194304, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 2097152, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 1048576, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 524288, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 262144, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 131072, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 65536, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 32768, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 16384, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 8192, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 4096, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 2048, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 1024, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 512, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 256, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 128, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 64, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 32, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 16, "minTileRow" : 524288, "maxTileRow" : 1048575 }, { "coalesce" : 8, "minTileRow" : 1048576, "maxTileRow" : 2097151 }, { "coalesce" : 4, "minTileRow" : 2097152, "maxTileRow" : 4194303 }, { "coalesce" : 2, "minTileRow" : 4194304, "maxTileRow" : 8388607 }, { "coalesce" : 2, "minTileRow" : 25165824, "maxTileRow" : 29360127 }, { "coalesce" : 4, "minTileRow" : 29360128, "maxTileRow" : 31457279 }, { "coalesce" : 8, "minTileRow" : 31457280, "maxTileRow" : 32505855 }, { "coalesce" : 16, "minTileRow" : 32505856, "maxTileRow" : 33030143 }, { "coalesce" : 32, "minTileRow" : 33030144, "maxTileRow" : 33292287 }, { "coalesce" : 64, "minTileRow" : 33292288, "maxTileRow" : 33423359 }, { "coalesce" : 128, "minTileRow" : 33423360, "maxTileRow" : 33488895 }, { "coalesce" : 256, "minTileRow" : 33488896, "maxTileRow" : 33521663 }, { "coalesce" : 512, "minTileRow" : 33521664, "maxTileRow" : 33538047 }, { "coalesce" : 1024, "minTileRow" : 33538048, "maxTileRow" : 33546239 }, { "coalesce" : 2048, "minTileRow" : 33546240, "maxTileRow" : 33550335 }, { "coalesce" : 4096, "minTileRow" : 33550336, "maxTileRow" : 33552383 }, { "coalesce" : 8192, "minTileRow" : 33552384, "maxTileRow" : 33553407 }, { "coalesce" : 16384, "minTileRow" : 33553408, "maxTileRow" : 33553919 }, { "coalesce" : 32768, "minTileRow" : 33553920, "maxTileRow" : 33554175 }, { "coalesce" : 65536, "minTileRow" : 33554176, "maxTileRow" : 33554303 }, { "coalesce" : 131072, "minTileRow" : 33554304, "maxTileRow" : 33554367 }, { "coalesce" : 262144, "minTileRow" : 33554368, "maxTileRow" : 33554399 }, { "coalesce" : 524288, "minTileRow" : 33554400, "maxTileRow" : 33554415 }, { "coalesce" : 1048576, "minTileRow" : 33554416, "maxTileRow" : 33554423 }, { "coalesce" : 2097152, "minTileRow" : 33554424, "maxTileRow" : 33554427 }, { "coalesce" : 4194304, "minTileRow" : 33554428, "maxTileRow" : 33554429 }, { "coalesce" : 8388608, "minTileRow" : 33554430, "maxTileRow" : 33554430 }, { "coalesce" : 16777216, "minTileRow" : 33554431, "maxTileRow" : 33554431 } ] }, { "id" : "25", "scaleDenominator" : 4.1654874684566, "cellSize" : 0.0000000104774, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 134217728, "matrixHeight" : 67108864, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 33554432, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 16777216, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 8388608, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 4194304, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 2097152, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 1048576, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 524288, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 262144, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 131072, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 65536, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 32768, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 16384, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 8192, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 4096, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 2048, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 1024, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 512, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 256, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 128, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 64, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 32, "minTileRow" : 524288, "maxTileRow" : 1048575 }, { "coalesce" : 16, "minTileRow" : 1048576, "maxTileRow" : 2097151 }, { "coalesce" : 8, "minTileRow" : 2097152, "maxTileRow" : 4194303 }, { "coalesce" : 4, "minTileRow" : 4194304, "maxTileRow" : 8388607 }, { "coalesce" : 2, "minTileRow" : 8388608, "maxTileRow" : 16777215 }, { "coalesce" : 2, "minTileRow" : 50331648, "maxTileRow" : 58720255 }, { "coalesce" : 4, "minTileRow" : 58720256, "maxTileRow" : 62914559 }, { "coalesce" : 8, "minTileRow" : 62914560, "maxTileRow" : 65011711 }, { "coalesce" : 16, "minTileRow" : 65011712, "maxTileRow" : 66060287 }, { "coalesce" : 32, "minTileRow" : 66060288, "maxTileRow" : 66584575 }, { "coalesce" : 64, "minTileRow" : 66584576, "maxTileRow" : 66846719 }, { "coalesce" : 128, "minTileRow" : 66846720, "maxTileRow" : 66977791 }, { "coalesce" : 256, "minTileRow" : 66977792, "maxTileRow" : 67043327 }, { "coalesce" : 512, "minTileRow" : 67043328, "maxTileRow" : 67076095 }, { "coalesce" : 1024, "minTileRow" : 67076096, "maxTileRow" : 67092479 }, { "coalesce" : 2048, "minTileRow" : 67092480, "maxTileRow" : 67100671 }, { "coalesce" : 4096, "minTileRow" : 67100672, "maxTileRow" : 67104767 }, { "coalesce" : 8192, "minTileRow" : 67104768, "maxTileRow" : 67106815 }, { "coalesce" : 16384, "minTileRow" : 67106816, "maxTileRow" : 67107839 }, { "coalesce" : 32768, "minTileRow" : 67107840, "maxTileRow" : 67108351 }, { "coalesce" : 65536, "minTileRow" : 67108352, "maxTileRow" : 67108607 }, { "coalesce" : 131072, "minTileRow" : 67108608, "maxTileRow" : 67108735 }, { "coalesce" : 262144, "minTileRow" : 67108736, "maxTileRow" : 67108799 }, { "coalesce" : 524288, "minTileRow" : 67108800, "maxTileRow" : 67108831 }, { "coalesce" : 1048576, "minTileRow" : 67108832, "maxTileRow" : 67108847 }, { "coalesce" : 2097152, "minTileRow" : 67108848, "maxTileRow" : 67108855 }, { "coalesce" : 4194304, "minTileRow" : 67108856, "maxTileRow" : 67108859 }, { "coalesce" : 8388608, "minTileRow" : 67108860, "maxTileRow" : 67108861 }, { "coalesce" : 16777216, "minTileRow" : 67108862, "maxTileRow" : 67108862 }, { "coalesce" : 33554432, "minTileRow" : 67108863, "maxTileRow" : 67108863 } ] }, { "id" : "26", "scaleDenominator" : 2.0827437342283, "cellSize" : 0.0000000052387, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 268435456, "matrixHeight" : 134217728, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 67108864, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 33554432, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 16777216, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 8388608, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 4194304, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 2097152, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 1048576, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 524288, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 262144, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 131072, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 65536, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 32768, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 16384, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 8192, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 4096, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 2048, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 1024, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 512, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 256, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 128, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 64, "minTileRow" : 524288, "maxTileRow" : 1048575 }, { "coalesce" : 32, "minTileRow" : 1048576, "maxTileRow" : 2097151 }, { "coalesce" : 16, "minTileRow" : 2097152, "maxTileRow" : 4194303 }, { "coalesce" : 8, "minTileRow" : 4194304, "maxTileRow" : 8388607 }, { "coalesce" : 4, "minTileRow" : 8388608, "maxTileRow" : 16777215 }, { "coalesce" : 2, "minTileRow" : 16777216, "maxTileRow" : 33554431 }, { "coalesce" : 2, "minTileRow" : 100663296, "maxTileRow" : 117440511 }, { "coalesce" : 4, "minTileRow" : 117440512, "maxTileRow" : 125829119 }, { "coalesce" : 8, "minTileRow" : 125829120, "maxTileRow" : 130023423 }, { "coalesce" : 16, "minTileRow" : 130023424, "maxTileRow" : 132120575 }, { "coalesce" : 32, "minTileRow" : 132120576, "maxTileRow" : 133169151 }, { "coalesce" : 64, "minTileRow" : 133169152, "maxTileRow" : 133693439 }, { "coalesce" : 128, "minTileRow" : 133693440, "maxTileRow" : 133955583 }, { "coalesce" : 256, "minTileRow" : 133955584, "maxTileRow" : 134086655 }, { "coalesce" : 512, "minTileRow" : 134086656, "maxTileRow" : 134152191 }, { "coalesce" : 1024, "minTileRow" : 134152192, "maxTileRow" : 134184959 }, { "coalesce" : 2048, "minTileRow" : 134184960, "maxTileRow" : 134201343 }, { "coalesce" : 4096, "minTileRow" : 134201344, "maxTileRow" : 134209535 }, { "coalesce" : 8192, "minTileRow" : 134209536, "maxTileRow" : 134213631 }, { "coalesce" : 16384, "minTileRow" : 134213632, "maxTileRow" : 134215679 }, { "coalesce" : 32768, "minTileRow" : 134215680, "maxTileRow" : 134216703 }, { "coalesce" : 65536, "minTileRow" : 134216704, "maxTileRow" : 134217215 }, { "coalesce" : 131072, "minTileRow" : 134217216, "maxTileRow" : 134217471 }, { "coalesce" : 262144, "minTileRow" : 134217472, "maxTileRow" : 134217599 }, { "coalesce" : 524288, "minTileRow" : 134217600, "maxTileRow" : 134217663 }, { "coalesce" : 1048576, "minTileRow" : 134217664, "maxTileRow" : 134217695 }, { "coalesce" : 2097152, "minTileRow" : 134217696, "maxTileRow" : 134217711 }, { "coalesce" : 4194304, "minTileRow" : 134217712, "maxTileRow" : 134217719 }, { "coalesce" : 8388608, "minTileRow" : 134217720, "maxTileRow" : 134217723 }, { "coalesce" : 16777216, "minTileRow" : 134217724, "maxTileRow" : 134217725 }, { "coalesce" : 33554432, "minTileRow" : 134217726, "maxTileRow" : 134217726 }, { "coalesce" : 67108864, "minTileRow" : 134217727, "maxTileRow" : 134217727 } ] }, { "id" : "27", "scaleDenominator" : 1.0413718671142, "cellSize" : 0.0000000026193, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 536870912, "matrixHeight" : 268435456, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 134217728, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 67108864, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 33554432, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 16777216, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 8388608, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 4194304, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 2097152, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 1048576, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 524288, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 262144, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 131072, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 65536, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 32768, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 16384, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 8192, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 4096, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 2048, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 1024, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 512, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 256, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 128, "minTileRow" : 524288, "maxTileRow" : 1048575 }, { "coalesce" : 64, "minTileRow" : 1048576, "maxTileRow" : 2097151 }, { "coalesce" : 32, "minTileRow" : 2097152, "maxTileRow" : 4194303 }, { "coalesce" : 16, "minTileRow" : 4194304, "maxTileRow" : 8388607 }, { "coalesce" : 8, "minTileRow" : 8388608, "maxTileRow" : 16777215 }, { "coalesce" : 4, "minTileRow" : 16777216, "maxTileRow" : 33554431 }, { "coalesce" : 2, "minTileRow" : 33554432, "maxTileRow" : 67108863 }, { "coalesce" : 2, "minTileRow" : 201326592, "maxTileRow" : 234881023 }, { "coalesce" : 4, "minTileRow" : 234881024, "maxTileRow" : 251658239 }, { "coalesce" : 8, "minTileRow" : 251658240, "maxTileRow" : 260046847 }, { "coalesce" : 16, "minTileRow" : 260046848, "maxTileRow" : 264241151 }, { "coalesce" : 32, "minTileRow" : 264241152, "maxTileRow" : 266338303 }, { "coalesce" : 64, "minTileRow" : 266338304, "maxTileRow" : 267386879 }, { "coalesce" : 128, "minTileRow" : 267386880, "maxTileRow" : 267911167 }, { "coalesce" : 256, "minTileRow" : 267911168, "maxTileRow" : 268173311 }, { "coalesce" : 512, "minTileRow" : 268173312, "maxTileRow" : 268304383 }, { "coalesce" : 1024, "minTileRow" : 268304384, "maxTileRow" : 268369919 }, { "coalesce" : 2048, "minTileRow" : 268369920, "maxTileRow" : 268402687 }, { "coalesce" : 4096, "minTileRow" : 268402688, "maxTileRow" : 268419071 }, { "coalesce" : 8192, "minTileRow" : 268419072, "maxTileRow" : 268427263 }, { "coalesce" : 16384, "minTileRow" : 268427264, "maxTileRow" : 268431359 }, { "coalesce" : 32768, "minTileRow" : 268431360, "maxTileRow" : 268433407 }, { "coalesce" : 65536, "minTileRow" : 268433408, "maxTileRow" : 268434431 }, { "coalesce" : 131072, "minTileRow" : 268434432, "maxTileRow" : 268434943 }, { "coalesce" : 262144, "minTileRow" : 268434944, "maxTileRow" : 268435199 }, { "coalesce" : 524288, "minTileRow" : 268435200, "maxTileRow" : 268435327 }, { "coalesce" : 1048576, "minTileRow" : 268435328, "maxTileRow" : 268435391 }, { "coalesce" : 2097152, "minTileRow" : 268435392, "maxTileRow" : 268435423 }, { "coalesce" : 4194304, "minTileRow" : 268435424, "maxTileRow" : 268435439 }, { "coalesce" : 8388608, "minTileRow" : 268435440, "maxTileRow" : 268435447 }, { "coalesce" : 16777216, "minTileRow" : 268435448, "maxTileRow" : 268435451 }, { "coalesce" : 33554432, "minTileRow" : 268435452, "maxTileRow" : 268435453 }, { "coalesce" : 67108864, "minTileRow" : 268435454, "maxTileRow" : 268435454 }, { "coalesce" : 134217728, "minTileRow" : 268435455, "maxTileRow" : 268435455 } ] }, { "id" : "28", "scaleDenominator" : 0.5206859335571, "cellSize" : 0.0000000013097, "cornerOfOrigin" : "topLeft", "pointOfOrigin" : [ 90, -180 ], "matrixWidth" : 1073741824, "matrixHeight" : 536870912, "tileWidth" : 256, "tileHeight" : 256, "variableMatrixWidths" : [ { "coalesce" : 268435456, "minTileRow" : 0, "maxTileRow" : 0 }, { "coalesce" : 134217728, "minTileRow" : 1, "maxTileRow" : 1 }, { "coalesce" : 67108864, "minTileRow" : 2, "maxTileRow" : 3 }, { "coalesce" : 33554432, "minTileRow" : 4, "maxTileRow" : 7 }, { "coalesce" : 16777216, "minTileRow" : 8, "maxTileRow" : 15 }, { "coalesce" : 8388608, "minTileRow" : 16, "maxTileRow" : 31 }, { "coalesce" : 4194304, "minTileRow" : 32, "maxTileRow" : 63 }, { "coalesce" : 2097152, "minTileRow" : 64, "maxTileRow" : 127 }, { "coalesce" : 1048576, "minTileRow" : 128, "maxTileRow" : 255 }, { "coalesce" : 524288, "minTileRow" : 256, "maxTileRow" : 511 }, { "coalesce" : 262144, "minTileRow" : 512, "maxTileRow" : 1023 }, { "coalesce" : 131072, "minTileRow" : 1024, "maxTileRow" : 2047 }, { "coalesce" : 65536, "minTileRow" : 2048, "maxTileRow" : 4095 }, { "coalesce" : 32768, "minTileRow" : 4096, "maxTileRow" : 8191 }, { "coalesce" : 16384, "minTileRow" : 8192, "maxTileRow" : 16383 }, { "coalesce" : 8192, "minTileRow" : 16384, "maxTileRow" : 32767 }, { "coalesce" : 4096, "minTileRow" : 32768, "maxTileRow" : 65535 }, { "coalesce" : 2048, "minTileRow" : 65536, "maxTileRow" : 131071 }, { "coalesce" : 1024, "minTileRow" : 131072, "maxTileRow" : 262143 }, { "coalesce" : 512, "minTileRow" : 262144, "maxTileRow" : 524287 }, { "coalesce" : 256, "minTileRow" : 524288, "maxTileRow" : 1048575 }, { "coalesce" : 128, "minTileRow" : 1048576, "maxTileRow" : 2097151 }, { "coalesce" : 64, "minTileRow" : 2097152, "maxTileRow" : 4194303 }, { "coalesce" : 32, "minTileRow" : 4194304, "maxTileRow" : 8388607 }, { "coalesce" : 16, "minTileRow" : 8388608, "maxTileRow" : 16777215 }, { "coalesce" : 8, "minTileRow" : 16777216, "maxTileRow" : 33554431 }, { "coalesce" : 4, "minTileRow" : 33554432, "maxTileRow" : 67108863 }, { "coalesce" : 2, "minTileRow" : 67108864, "maxTileRow" : 134217727 }, { "coalesce" : 2, "minTileRow" : 402653184, "maxTileRow" : 469762047 }, { "coalesce" : 4, "minTileRow" : 469762048, "maxTileRow" : 503316479 }, { "coalesce" : 8, "minTileRow" : 503316480, "maxTileRow" : 520093695 }, { "coalesce" : 16, "minTileRow" : 520093696, "maxTileRow" : 528482303 }, { "coalesce" : 32, "minTileRow" : 528482304, "maxTileRow" : 532676607 }, { "coalesce" : 64, "minTileRow" : 532676608, "maxTileRow" : 534773759 }, { "coalesce" : 128, "minTileRow" : 534773760, "maxTileRow" : 535822335 }, { "coalesce" : 256, "minTileRow" : 535822336, "maxTileRow" : 536346623 }, { "coalesce" : 512, "minTileRow" : 536346624, "maxTileRow" : 536608767 }, { "coalesce" : 1024, "minTileRow" : 536608768, "maxTileRow" : 536739839 }, { "coalesce" : 2048, "minTileRow" : 536739840, "maxTileRow" : 536805375 }, { "coalesce" : 4096, "minTileRow" : 536805376, "maxTileRow" : 536838143 }, { "coalesce" : 8192, "minTileRow" : 536838144, "maxTileRow" : 536854527 }, { "coalesce" : 16384, "minTileRow" : 536854528, "maxTileRow" : 536862719 }, { "coalesce" : 32768, "minTileRow" : 536862720, "maxTileRow" : 536866815 }, { "coalesce" : 65536, "minTileRow" : 536866816, "maxTileRow" : 536868863 }, { "coalesce" : 131072, "minTileRow" : 536868864, "maxTileRow" : 536869887 }, { "coalesce" : 262144, "minTileRow" : 536869888, "maxTileRow" : 536870399 }, { "coalesce" : 524288, "minTileRow" : 536870400, "maxTileRow" : 536870655 }, { "coalesce" : 1048576, "minTileRow" : 536870656, "maxTileRow" : 536870783 }, { "coalesce" : 2097152, "minTileRow" : 536870784, "maxTileRow" : 536870847 }, { "coalesce" : 4194304, "minTileRow" : 536870848, "maxTileRow" : 536870879 }, { "coalesce" : 8388608, "minTileRow" : 536870880, "maxTileRow" : 536870895 }, { "coalesce" : 16777216, "minTileRow" : 536870896, "maxTileRow" : 536870903 }, { "coalesce" : 33554432, "minTileRow" : 536870904, "maxTileRow" : 536870907 }, { "coalesce" : 67108864, "minTileRow" : 536870908, "maxTileRow" : 536870909 }, { "coalesce" : 134217728, "minTileRow" : 536870910, "maxTileRow" : 536870910 }, { "coalesce" : 268435456, "minTileRow" : 536870911, "maxTileRow" : 536870911 } ] } ] } morecantile-7.0.3/morecantile/data/LINZAntarticaMapTilegrid.json000066400000000000000000000120701514074772600246730ustar00rootroot00000000000000{ "title": "LINZ Antarctic Map Tile Grid (Ross Sea Region)", "id": "LINZAntarticaMapTilegrid", "crs": "urn:ogc:def:crs:EPSG::5482", "orderedAxes": [ "Y", "X" ], "tileMatrices": [ { "id": "0", "scaleDenominator": 409600000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1, "cellSize": 114687.99999999999 }, { "id": "1", "scaleDenominator": 204800000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1, "cellSize": 57343.99999999999 }, { "id": "2", "scaleDenominator": 102400000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2, "cellSize": 28671.999999999996 }, { "id": "3", "scaleDenominator": 51200000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4, "cellSize": 14335.999999999998 }, { "id": "4", "scaleDenominator": 25600000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 7, "matrixHeight": 7, "cellSize": 7167.999999999999 }, { "id": "5", "scaleDenominator": 12800000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 13, "matrixHeight": 13, "cellSize": 3583.9999999999995 }, { "id": "6", "scaleDenominator": 6400000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 26, "matrixHeight": 26, "cellSize": 1791.9999999999998 }, { "id": "7", "scaleDenominator": 3200000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 52, "matrixHeight": 52, "cellSize": 895.9999999999999 }, { "id": "8", "scaleDenominator": 1600000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 104, "matrixHeight": 104, "cellSize": 447.99999999999994 }, { "id": "9", "scaleDenominator": 800000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 207, "matrixHeight": 207, "cellSize": 223.99999999999997 }, { "id": "10", "scaleDenominator": 400000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 413, "matrixHeight": 413, "cellSize": 111.99999999999999 }, { "id": "11", "scaleDenominator": 200000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 826, "matrixHeight": 826, "cellSize": 55.99999999999999 }, { "id": "12", "scaleDenominator": 100000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1652, "matrixHeight": 1652, "cellSize": 27.999999999999996 }, { "id": "13", "scaleDenominator": 50000, "pointOfOrigin": [ 6918457.73, -918457.73 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 3303, "matrixHeight": 3303, "cellSize": 13.999999999999998 } ] }morecantile-7.0.3/morecantile/data/NZTM2000Quad.json000066400000000000000000000203041514074772600220520ustar00rootroot00000000000000{ "title": "LINZ NZTM2000Quad Map Tile Grid", "id": "NZTM2000Quad", "crs": "urn:ogc:def:crs:EPSG::2193", "orderedAxes": [ "Y", "X" ], "tileMatrices": [ { "id": "0", "scaleDenominator": 139770566.007179, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1, "cellSize": 39135.75848201011 }, { "id": "1", "scaleDenominator": 69885283.0035895, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2, "cellSize": 19567.879241005056 }, { "id": "2", "scaleDenominator": 34942641.50179475, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4, "cellSize": 9783.939620502528 }, { "id": "3", "scaleDenominator": 17471320.750897374, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8, "cellSize": 4891.969810251264 }, { "id": "4", "scaleDenominator": 8735660.375448687, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 16, "cellSize": 2445.984905125632 }, { "id": "5", "scaleDenominator": 4367830.1877243435, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 32, "cellSize": 1222.992452562816 }, { "id": "6", "scaleDenominator": 2183915.0938621718, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 64, "cellSize": 611.496226281408 }, { "id": "7", "scaleDenominator": 1091957.5469310859, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 128, "cellSize": 305.748113140704 }, { "id": "8", "scaleDenominator": 545978.7734655429, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 256, "cellSize": 152.874056570352 }, { "id": "9", "scaleDenominator": 272989.38673277147, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 512, "cellSize": 76.437028285176 }, { "id": "10", "scaleDenominator": 136494.69336638573, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 1024, "cellSize": 38.218514142588 }, { "id": "11", "scaleDenominator": 68247.34668319287, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 2048, "cellSize": 19.109257071294 }, { "id": "12", "scaleDenominator": 34123.67334159643, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 4096, "cellSize": 9.554628535647 }, { "id": "13", "scaleDenominator": 17061.836670798217, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 8192, "cellSize": 4.7773142678235 }, { "id": "14", "scaleDenominator": 8530.918335399108, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 16384, "cellSize": 2.38865713391175 }, { "id": "15", "scaleDenominator": 4265.459167699554, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 32768, "cellSize": 1.194328566955875 }, { "id": "16", "scaleDenominator": 2132.729583849777, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 65536, "cellSize": 0.5971642834779375 }, { "id": "17", "scaleDenominator": 1066.3647919248886, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 131072, "cellSize": 0.29858214173896874 }, { "id": "18", "scaleDenominator": 533.1823959624443, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 262144, "cellSize": 0.14929107086948437 }, { "id": "19", "scaleDenominator": 266.59119798122214, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 524288, "cellSize": 0.07464553543474219 }, { "id": "20", "scaleDenominator": 133.29559899061107, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 1048576, "cellSize": 0.03732276771737109 }, { "id": "21", "scaleDenominator": 66.64779949530553, "pointOfOrigin": [ 10438190.1652, -3260586.7284 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 2097152, "cellSize": 0.018661383858685546 } ] }morecantile-7.0.3/morecantile/data/README.md000066400000000000000000000004011514074772600205250ustar00rootroot00000000000000# tileMatrixSet json documents TileMatrixSet from https://schemas.opengis.net/tms/2.0/json/examples/tilematrixset/ `NZTM2000` and `LINZAntarticaMapTilegrid` are from GDAL https://github.com/OSGeo/gdal/pull/2505/files#diff-33251b8c7db3e78835102ded8d11d851 morecantile-7.0.3/morecantile/data/UPSAntarcticWGS84Quad.json000066400000000000000000000163161514074772600240250ustar00rootroot00000000000000{ "id": "UPSAntarcticWGS84Quad", "title": "Universal Polar Stereographic WGS 84 Quad for Antarctic", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/UPSAntarcticWGS84Quad", "crs": "http://www.opengis.net/def/crs/EPSG/0/5042", "orderedAxes": ["E", "N"], "tileMatrices": [ { "id": "0", "scaleDenominator": 458726544.4, "cellSize": 128443.4324, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1 }, { "id": "1", "scaleDenominator": 229363272.2, "cellSize": 64221.71621, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2 }, { "id": "2", "scaleDenominator": 114681636.1, "cellSize": 32110.85811, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4 }, { "id": "3", "scaleDenominator": 57340818.05, "cellSize": 16055.42905, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "id": "4", "scaleDenominator": 28670409.02, "cellSize": 8027.714526, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 16 }, { "id": "5", "scaleDenominator": 14335204.51, "cellSize": 4013.857263, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 32 }, { "id": "6", "scaleDenominator": 7167602.256, "cellSize": 2006.928632, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 64 }, { "id": "7", "scaleDenominator": 3583801.128, "cellSize": 1003.464316, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 128 }, { "id": "8", "scaleDenominator": 1791900.564, "cellSize": 501.7321579, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 256 }, { "id": "9", "scaleDenominator": 895950.282, "cellSize": 250.866079, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 512 }, { "id": "10", "scaleDenominator": 447975.141, "cellSize": 125.4330395, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 1024 }, { "id": "11", "scaleDenominator": 223987.5705, "cellSize": 62.71651974, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 2048 }, { "id": "12", "scaleDenominator": 111993.7852, "cellSize": 31.35825987, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 4096 }, { "id": "13", "scaleDenominator": 55996.89262, "cellSize": 15.67912993, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 8192 }, { "id": "14", "scaleDenominator": 27998.44631, "cellSize": 7.839564967, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 16384 }, { "id": "15", "scaleDenominator": 13999.22316, "cellSize": 3.919782484, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 32768 }, { "id": "16", "scaleDenominator": 6999.611578, "cellSize": 1.959891242, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 65536 }, { "id": "17", "scaleDenominator": 3499.805789, "cellSize": 0.979945621, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 131072 }, { "id": "18", "scaleDenominator": 1749.902894, "cellSize": 0.48997281, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 262144 }, { "id": "19", "scaleDenominator": 874.9514472, "cellSize": 0.244986405, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 524288 }, { "id": "20", "scaleDenominator": 437.4757236, "cellSize": 0.122493203, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 1048576 }, { "id": "21", "scaleDenominator": 218.7378618, "cellSize": 0.061246601, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 2097152 }, { "id": "22", "scaleDenominator": 109.3689309, "cellSize": 0.030623301, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 4194304 }, { "id": "23", "scaleDenominator": 54.68446545, "cellSize": 0.01531165, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 8388608 }, { "id": "24", "scaleDenominator": 27.34223273, "cellSize": 0.007655825, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16777216, "matrixHeight": 16777216 } ] }morecantile-7.0.3/morecantile/data/UPSArcticWGS84Quad.json000066400000000000000000000163051514074772600233200ustar00rootroot00000000000000{ "id": "UPSArcticWGS84Quad", "title": "Universal Polar Stereographic WGS 84 Quad for Arctic", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/UPSArcticWGS84Quad", "crs": "http://www.opengis.net/def/crs/EPSG/0/5041", "orderedAxes": ["E", "N"], "tileMatrices": [ { "id": "0", "scaleDenominator": 458726544.4, "cellSize": 128443.4324, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1 }, { "id": "1", "scaleDenominator": 229363272.2, "cellSize": 64221.71621, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2 }, { "id": "2", "scaleDenominator": 114681636.1, "cellSize": 32110.85811, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4 }, { "id": "3", "scaleDenominator": 57340818.05, "cellSize": 16055.42905, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "id": "4", "scaleDenominator": 28670409.02, "cellSize": 8027.714526, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 16 }, { "id": "5", "scaleDenominator": 14335204.51, "cellSize": 4013.857263, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 32 }, { "id": "6", "scaleDenominator": 7167602.256, "cellSize": 2006.928632, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 64 }, { "id": "7", "scaleDenominator": 3583801.128, "cellSize": 1003.464316, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 128 }, { "id": "8", "scaleDenominator": 1791900.564, "cellSize": 501.7321579, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 256 }, { "id": "9", "scaleDenominator": 895950.282, "cellSize": 250.866079, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 512 }, { "id": "10", "scaleDenominator": 447975.141, "cellSize": 125.4330395, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 1024 }, { "id": "11", "scaleDenominator": 223987.5705, "cellSize": 62.71651974, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 2048 }, { "id": "12", "scaleDenominator": 111993.7852, "cellSize": 31.35825987, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 4096 }, { "id": "13", "scaleDenominator": 55996.89262, "cellSize": 15.67912993, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 8192 }, { "id": "14", "scaleDenominator": 27998.44631, "cellSize": 7.839564967, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 16384 }, { "id": "15", "scaleDenominator": 13999.22316, "cellSize": 3.919782484, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 32768 }, { "id": "16", "scaleDenominator": 6999.611578, "cellSize": 1.959891242, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 65536 }, { "id": "17", "scaleDenominator": 3499.805789, "cellSize": 0.979945621, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 131072 }, { "id": "18", "scaleDenominator": 1749.902894, "cellSize": 0.48997281, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 262144 }, { "id": "19", "scaleDenominator": 874.9514472, "cellSize": 0.244986405, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 524288 }, { "id": "20", "scaleDenominator": 437.4757236, "cellSize": 0.122493203, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 1048576 }, { "id": "21", "scaleDenominator": 218.7378618, "cellSize": 0.061246601, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 2097152 }, { "id": "22", "scaleDenominator": 109.3689309, "cellSize": 0.030623301, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 4194304 }, { "id": "23", "scaleDenominator": 54.68446545, "cellSize": 0.01531165, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 8388608 }, { "id": "24", "scaleDenominator": 27.34223273, "cellSize": 0.007655825, "pointOfOrigin": [-14440759.350252,18440759.350252], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16777216, "matrixHeight": 16777216 } ] }morecantile-7.0.3/morecantile/data/UTM31WGS84Quad.json000066400000000000000000000163071514074772600223360ustar00rootroot00000000000000{ "id": "UTM31WGS84Quad", "title": "Universal Transverse Mercator Zone 31 WGS84 Quad", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/UTM31WGS84Quad", "crs": "http://www.opengis.net/def/crs/EPSG/0/32631", "orderedAxes": ["E", "N"], "tileMatrices": [ { "id": "1", "scaleDenominator": 279072704.500914, "cellSize": 78140.3572602559, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 2 }, { "id": "2", "scaleDenominator": 139536352.250457, "cellSize": 39070.178630128, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 4 }, { "id": "3", "scaleDenominator": 69768176.1252285, "cellSize": 19535.089315064, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 8 }, { "id": "4", "scaleDenominator": 34884088.0626143, "cellSize": 9767.5446575319, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 16 }, { "id": "5", "scaleDenominator": 17442044.0313071, "cellSize": 4883.772328766, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 32 }, { "id": "6", "scaleDenominator": 8721022.01565356, "cellSize": 2441.886164383, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 64 }, { "id": "7", "scaleDenominator": 4360511.00782678, "cellSize": 1220.9430821915, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 128 }, { "id": "8", "scaleDenominator": 2180255.50391339, "cellSize": 610.471541095749, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 256 }, { "id": "9", "scaleDenominator": 1090127.7519567, "cellSize": 305.235770547875, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 512 }, { "id": "10", "scaleDenominator": 545063.875978348, "cellSize": 152.617885273937, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 1024 }, { "id": "11", "scaleDenominator": 272531.937989174, "cellSize": 76.3089426369687, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 2048 }, { "id": "12", "scaleDenominator": 136265.968994587, "cellSize": 38.1544713184843, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 4096 }, { "id": "13", "scaleDenominator": 68132.9844972935, "cellSize": 19.0772356592422, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 8192 }, { "id": "14", "scaleDenominator": 34066.4922486467, "cellSize": 9.53861782962109, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 16384 }, { "id": "15", "scaleDenominator": 17033.2461243234, "cellSize": 4.76930891481054, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 32768 }, { "id": "16", "scaleDenominator": 8516.62306216168, "cellSize": 2.38465445740527, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 65536 }, { "id": "17", "scaleDenominator": 4258.31153108084, "cellSize": 1.19232722870264, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 131072 }, { "id": "18", "scaleDenominator": 2129.15576554042, "cellSize": 0.596163614351318, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 262144 }, { "id": "19", "scaleDenominator": 1064.57788277021, "cellSize": 0.298081807175659, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 524288 }, { "id": "20", "scaleDenominator": 532.288941385105, "cellSize": 0.149040903587829, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 1048576 }, { "id": "21", "scaleDenominator": 266.144470692553, "cellSize": 0.0745204517939147, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 2097152 }, { "id": "22", "scaleDenominator": 133.072235346276, "cellSize": 0.0372602258969574, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 4194304 }, { "id": "23", "scaleDenominator": 66.5361176731382, "cellSize": 0.0186301129484787, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 8388608 }, { "id": "24", "scaleDenominator": 33.2680588365691, "cellSize": 0.00931505647423934, "pointOfOrigin": [-9501965.72931276,20003931.4586255], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 16777216 } ] }morecantile-7.0.3/morecantile/data/WGS1984Quad.json000066400000000000000000000154221514074772600217530ustar00rootroot00000000000000{ "id": "WGS1984Quad", "title": "EPSG:4326 for the World", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/WorldCRS84Quad", "crs": "http://www.opengis.net/def/crs/EPSG/0/4326", "orderedAxes": [ "Lat", "Lon" ], "wellKnownScaleSet": "http://www.opengis.net/def/wkss/OGC/1.0/GoogleCRS84Quad", "tileMatrices": [ { "id": "0", "scaleDenominator": 279541132.014358, "cellSize": 0.703125, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 1 }, { "id": "1", "scaleDenominator": 139770566.007179, "cellSize": 0.3515625, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 2 }, { "id": "2", "scaleDenominator": 69885283.0035897, "cellSize": 0.17578125, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 4 }, { "id": "3", "scaleDenominator": 34942641.5017948, "cellSize": 0.087890625, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 8 }, { "id": "4", "scaleDenominator": 17471320.7508974, "cellSize": 0.0439453125, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 16 }, { "id": "5", "scaleDenominator": 8735660.37544871, "cellSize": 0.02197265625, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 32 }, { "id": "6", "scaleDenominator": 4367830.18772435, "cellSize": 0.010986328125, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 64 }, { "id": "7", "scaleDenominator": 2183915.09386217, "cellSize": 0.0054931640625, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 128 }, { "id": "8", "scaleDenominator": 1091957.54693108, "cellSize": 0.00274658203125, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 256 }, { "id": "9", "scaleDenominator": 545978.773465544, "cellSize": 0.001373291015625, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 512 }, { "id": "10", "scaleDenominator": 272989.386732772, "cellSize": 0.0006866455078125, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 1024 }, { "id": "11", "scaleDenominator": 136494.693366386, "cellSize": 0.00034332275390625, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 2048 }, { "id": "12", "scaleDenominator": 68247.346683193, "cellSize": 0.000171661376953125, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 4096 }, { "id": "13", "scaleDenominator": 34123.6733415964, "cellSize": 0.0000858306884765625, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 8192 }, { "id": "14", "scaleDenominator": 17061.8366707982, "cellSize": 0.0000429153442382812, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 16384 }, { "id": "15", "scaleDenominator": 8530.91833539913, "cellSize": 0.0000214576721191406, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 32768 }, { "id": "16", "scaleDenominator": 4265.45916769956, "cellSize": 0.0000107288360595703, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 65536 }, { "id": "17", "scaleDenominator": 2132.72958384978, "cellSize": 0.00000536441802978515, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 131072 }, { "id": "18", "scaleDenominator": 1066.36479192489, "cellSize": 0.00000268220901489258, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 262144 }, { "id": "19", "scaleDenominator": 533.182395962445, "cellSize": 0.00000134110450744629, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 524288 }, { "id": "20", "scaleDenominator": 266.591197981222, "cellSize": 0.00000067055225372314, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 1048576 }, { "id": "21", "scaleDenominator": 133.295598990611, "cellSize": 0.00000033527612686157, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 2097152 }, { "id": "22", "scaleDenominator": 66.6477994953056, "cellSize": 0.00000016763806343079, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 4194304 }, { "id": "23", "scaleDenominator": 33.3238997476528, "cellSize": 0.00000008381903171539, "pointOfOrigin": [ 90, -180 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16777216, "matrixHeight": 8388608 } ] } morecantile-7.0.3/morecantile/data/WebMercatorQuad.json000066400000000000000000000254231514074772600232010ustar00rootroot00000000000000{ "id": "WebMercatorQuad", "title": "Google Maps Compatible for the World", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/WebMercatorQuad", "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", "orderedAxes": [ "X", "Y" ], "wellKnownScaleSet": "http://www.opengis.net/def/wkss/OGC/1.0/GoogleMapsCompatible", "tileMatrices": [ { "id": "0", "scaleDenominator": 559082264.0287178, "cellSize": 156543.03392804097, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1 }, { "id": "1", "scaleDenominator": 279541132.0143589, "cellSize": 78271.51696402048, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2 }, { "id": "2", "scaleDenominator": 139770566.00717944, "cellSize": 39135.75848201024, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4 }, { "id": "3", "scaleDenominator": 69885283.00358972, "cellSize": 19567.87924100512, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "id": "4", "scaleDenominator": 34942641.50179486, "cellSize": 9783.93962050256, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 16 }, { "id": "5", "scaleDenominator": 17471320.75089743, "cellSize": 4891.96981025128, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 32 }, { "id": "6", "scaleDenominator": 8735660.375448715, "cellSize": 2445.98490512564, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 64 }, { "id": "7", "scaleDenominator": 4367830.1877243575, "cellSize": 1222.99245256282, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 128 }, { "id": "8", "scaleDenominator": 2183915.0938621787, "cellSize": 611.49622628141, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 256 }, { "id": "9", "scaleDenominator": 1091957.5469310894, "cellSize": 305.748113140705, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 512 }, { "id": "10", "scaleDenominator": 545978.7734655447, "cellSize": 152.8740565703525, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 1024 }, { "id": "11", "scaleDenominator": 272989.38673277234, "cellSize": 76.43702828517625, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 2048 }, { "id": "12", "scaleDenominator": 136494.69336638617, "cellSize": 38.21851414258813, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 4096 }, { "id": "13", "scaleDenominator": 68247.34668319309, "cellSize": 19.109257071294063, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 8192 }, { "id": "14", "scaleDenominator": 34123.67334159654, "cellSize": 9.554628535647032, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 16384 }, { "id": "15", "scaleDenominator": 17061.83667079827, "cellSize": 4.777314267823516, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 32768 }, { "id": "16", "scaleDenominator": 8530.918335399136, "cellSize": 2.388657133911758, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 65536 }, { "id": "17", "scaleDenominator": 4265.459167699568, "cellSize": 1.194328566955879, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 131072 }, { "id": "18", "scaleDenominator": 2132.729583849784, "cellSize": 0.5971642834779395, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 262144 }, { "id": "19", "scaleDenominator": 1066.364791924892, "cellSize": 0.29858214173896974, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 524288 }, { "id": "20", "scaleDenominator": 533.182395962446, "cellSize": 0.14929107086948487, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 1048576 }, { "id": "21", "scaleDenominator": 266.591197981223, "cellSize": 0.07464553543474244, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 2097152 }, { "id": "22", "scaleDenominator": 133.2955989906115, "cellSize": 0.03732276771737122, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 4194304 }, { "id": "23", "scaleDenominator": 66.64779949530575, "cellSize": 0.01866138385868561, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 8388608 }, { "id": "24", "scaleDenominator": 33.323899747652874, "cellSize": 0.009330691929342804, "cornerOfOrigin": "topLeft", "pointOfOrigin": [ -20037508.342789244, 20037508.342789244 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16777216, "matrixHeight": 16777216 } ] }morecantile-7.0.3/morecantile/data/WorldCRS84Quad.json000066400000000000000000000156401514074772600226020ustar00rootroot00000000000000{ "id": "WorldCRS84Quad", "title": "CRS84 for the World", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/WorldCRS84Quad", "crs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84", "orderedAxes": [ "Lon", "Lat" ], "wellKnownScaleSet": "http://www.opengis.net/def/wkss/OGC/1.0/GoogleCRS84Quad", "tileMatrices": [ { "id": "0", "scaleDenominator": 279541132.014358, "cellSize": 0.703125, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 1 }, { "id": "1", "scaleDenominator": 139770566.007179, "cellSize": 0.3515625, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 2 }, { "id": "2", "scaleDenominator": 69885283.0035897, "cellSize": 0.17578125, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 4 }, { "id": "3", "scaleDenominator": 34942641.5017948, "cellSize": 0.087890625, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 8 }, { "id": "4", "scaleDenominator": 17471320.7508974, "cellSize": 0.0439453125, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 16 }, { "id": "5", "scaleDenominator": 8735660.37544871, "cellSize": 0.02197265625, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 32 }, { "id": "6", "scaleDenominator": 4367830.18772435, "cellSize": 0.010986328125, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 64 }, { "id": "7", "scaleDenominator": 2183915.09386217, "cellSize": 0.0054931640625, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 128 }, { "id": "8", "scaleDenominator": 1091957.54693108, "cellSize": 0.00274658203125, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 256 }, { "id": "9", "scaleDenominator": 545978.773465544, "cellSize": 0.001373291015625, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 512 }, { "id": "10", "scaleDenominator": 272989.386732772, "cellSize": 0.0006866455078125, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 1024 }, { "id": "11", "scaleDenominator": 136494.693366386, "cellSize": 0.00034332275390625, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 2048 }, { "id": "12", "scaleDenominator": 68247.346683193, "cellSize": 0.000171661376953125, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 4096 }, { "id": "13", "scaleDenominator": 34123.6733415964, "cellSize": 0.0000858306884765625, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 8192 }, { "id": "14", "scaleDenominator": 17061.8366707982, "cellSize": 0.0000429153442382812, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 16384 }, { "id": "15", "scaleDenominator": 8530.91833539913, "cellSize": 0.0000214576721191406, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 32768 }, { "id": "16", "scaleDenominator": 4265.45916769956, "cellSize": 0.0000107288360595703, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 65536 }, { "id": "17", "scaleDenominator": 2132.72958384978, "cellSize": 0.00000536441802978515, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 131072 }, { "id": "18", "scaleDenominator": 1066.36479192489, "cellSize": 0.00000268220901489258, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 262144 }, { "id": "19", "scaleDenominator": 533.182395962445, "cellSize": 0.00000134110450744629, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 524288 }, { "id": "20", "scaleDenominator": 266.591197981222, "cellSize": 0.00000067055225372314, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 1048576 }, { "id": "21", "scaleDenominator": 133.295598990611, "cellSize": 0.00000033527612686157, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 2097152 }, { "id": "22", "scaleDenominator": 66.6477994953056, "cellSize": 0.00000016763806343079, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 4194304 }, { "id": "23", "scaleDenominator": 33.3238997476528, "cellSize": 0.00000008381903171539, "pointOfOrigin": [ -180, 90 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16777216, "matrixHeight": 8388608 } ] }morecantile-7.0.3/morecantile/data/WorldMercatorWGS84Quad.json000066400000000000000000000155311514074772600243070ustar00rootroot00000000000000{ "id": "WorldMercatorWGS84Quad", "title": "World Mercator WGS84 (ellipsoid)", "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/WorldMercatorWGS84Quad", "crs": "http://www.opengis.net/def/crs/EPSG/0/3395", "orderedAxes": ["E", "N"], "wellKnownScaleSet": "http://www.opengis.net/def/wkss/OGC/1.0/WorldMercatorWGS84", "tileMatrices": [ { "id": "0", "scaleDenominator": 559082264.028717, "cellSize": 156543.033928041, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1 }, { "id": "1", "scaleDenominator": 279541132.014358, "cellSize": 78271.5169640204, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2 }, { "id": "2", "scaleDenominator": 139770566.007179, "cellSize": 39135.7584820102, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4 }, { "id": "3", "scaleDenominator": 69885283.0035897, "cellSize": 19567.8792410051, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "id": "4", "scaleDenominator": 34942641.5017948, "cellSize": 9783.93962050256, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 16 }, { "id": "5", "scaleDenominator": 17471320.7508974, "cellSize": 4891.96981025128, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 32 }, { "id": "6", "scaleDenominator": 8735660.37544871, "cellSize": 2445.98490512564, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 64 }, { "id": "7", "scaleDenominator": 4367830.18772435, "cellSize": 1222.99245256282, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 128 }, { "id": "8", "scaleDenominator": 2183915.09386217, "cellSize": 611.49622628141, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 256 }, { "id": "9", "scaleDenominator": 1091957.54693108, "cellSize": 305.748113140704, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 512 }, { "id": "10", "scaleDenominator": 545978.773465544, "cellSize": 152.874056570352, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 1024 }, { "id": "11", "scaleDenominator": 272989.386732772, "cellSize": 76.4370282851762, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 2048 }, { "id": "12", "scaleDenominator": 136494.693366386, "cellSize": 38.2185141425881, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 4096 }, { "id": "13", "scaleDenominator": 68247.346683193, "cellSize": 19.109257071294, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 8192 }, { "id": "14", "scaleDenominator": 34123.6733415964, "cellSize": 9.55462853564703, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 16384 }, { "id": "15", "scaleDenominator": 17061.8366707982, "cellSize": 4.77731426782351, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 32768 }, { "id": "16", "scaleDenominator": 8530.91833539913, "cellSize": 2.38865713391175, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 65536 }, { "id": "17", "scaleDenominator": 4265.45916769956, "cellSize": 1.19432856695587, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 131072 }, { "id": "18", "scaleDenominator": 2132.72958384978, "cellSize": 0.597164283477939, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 262144 }, { "id": "19", "scaleDenominator": 1066.36479192489, "cellSize": 0.29858214173897, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 524288 }, { "id": "20", "scaleDenominator": 533.182395962445, "cellSize": 0.149291070869485, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 1048576 }, { "id": "21", "scaleDenominator": 266.591197981222, "cellSize": 0.0746455354347424, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 2097152 }, { "id": "22", "scaleDenominator": 133.295598990611, "cellSize": 0.0373227677173712, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 4194304 }, { "id": "23", "scaleDenominator": 66.6477994953056, "cellSize": 0.0186613838586856, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 8388608 }, { "id": "24", "scaleDenominator": 33.3238997476528, "cellSize": 0.0093306919293428, "pointOfOrigin": [-20037508.3427892,20037508.3427892], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16777216, "matrixHeight": 16777216 } ] }morecantile-7.0.3/morecantile/defaults.py000066400000000000000000000035641514074772600205330ustar00rootroot00000000000000"""Default Morecantile TMS.""" import os import pathlib from copy import copy, deepcopy import attr from morecantile.errors import InvalidIdentifier from morecantile.models import TileMatrixSet morecantile_tms_dir = pathlib.Path(__file__).parent.joinpath("data") tms_paths = list(pathlib.Path(morecantile_tms_dir).glob("*.json")) user_tms_dir = os.environ.get("TILEMATRIXSET_DIRECTORY", None) if user_tms_dir: tms_paths.extend(list(pathlib.Path(user_tms_dir).glob("*.json"))) default_tms: dict[str, TileMatrixSet | pathlib.Path] = { tms.stem: tms for tms in sorted(tms_paths) } @attr.s(frozen=True) class TileMatrixSets: """Default TileMatrixSets holder.""" tilematrixsets: dict = attr.ib() def get(self, identifier: str) -> TileMatrixSet: """Fetch a TMS.""" if identifier not in self.tilematrixsets: raise InvalidIdentifier(f"Invalid identifier: {identifier}") tilematrix = self.tilematrixsets[identifier] # We lazyload the TMS document only when called if isinstance(tilematrix, pathlib.Path): with tilematrix.open() as f: tilematrix = TileMatrixSet.model_validate_json(f.read()) self.tilematrixsets[identifier] = tilematrix return deepcopy(tilematrix) def list(self) -> list[str]: """List registered TMS.""" return list(self.tilematrixsets.keys()) def register( self, custom_tms: dict[str, TileMatrixSet], overwrite: bool = False, ) -> "TileMatrixSets": """Register TileMatrixSet(s).""" for identifier in custom_tms.keys(): if identifier in self.tilematrixsets and not overwrite: raise InvalidIdentifier(f"{identifier} is already a registered TMS.") return TileMatrixSets({**self.tilematrixsets, **custom_tms}) tms = TileMatrixSets(copy(default_tms)) # noqa morecantile-7.0.3/morecantile/errors.py000066400000000000000000000016131514074772600202310ustar00rootroot00000000000000"""Morecantile errors.""" class MorecantileError(Exception): """Base error for Morecantile.""" class InvalidIdentifier(MorecantileError): """Invalid TileMatrixSet indentifier.""" class InvalidLatitudeError(MorecantileError): """Raised when math errors occur beyond ~85 degrees N or S""" class TileArgParsingError(MorecantileError): """Raised when errors occur in parsing a function's tile arg(s)""" class PointOutsideTMSBounds(UserWarning): """Point is outside TMS bounds.""" class NoQuadkeySupport(MorecantileError): """Raised when a custom TileMatrixSet doesn't support quadkeys""" class QuadKeyError(MorecantileError): """Raised when errors occur in computing or parsing quad keys""" class InvalidZoomError(MorecantileError): """Raised when input zoom is invalid.""" class DeprecationError(MorecantileError): """Raised when TMS version is not 2.0""" morecantile-7.0.3/morecantile/models.py000066400000000000000000001561501514074772600202070ustar00rootroot00000000000000"""Pydantic modules for OGC TileMatrixSets (https://www.ogc.org/standards/tms)""" import math import os import warnings from collections.abc import Iterator, Sequence from functools import cached_property, lru_cache from typing import Any, Literal import pyproj from pydantic import ( AnyHttpUrl, AnyUrl, BaseModel, Field, PrivateAttr, RootModel, field_validator, model_validator, ) from pyproj.exceptions import CRSError from typing_extensions import Annotated from morecantile.commons import BoundingBox, Coords, Tile from morecantile.errors import ( DeprecationError, InvalidZoomError, NoQuadkeySupport, PointOutsideTMSBounds, QuadKeyError, ) from morecantile.utils import ( _parse_tile_arg, bbox_to_feature, check_quadkey_support, lons_contain_antimeridian, meters_per_unit, point_in_bbox, to_rasterio_crs, truncate_coordinates, ) NumType = float | int BoundsType = tuple[NumType, NumType] LL_EPSILON = 1e-11 axesInfo = Annotated[list[str], Field(min_length=2, max_length=2)] WGS84_CRS = pyproj.CRS.from_epsg(4326) DEFAULT_GEOGRAPHIC_CRS = os.environ.get("MORECANTILE_DEFAULT_GEOGRAPHIC_CRS") TransformerFromCRS = lru_cache(pyproj.Transformer.from_crs) class CRSUri(BaseModel): """Coordinate Reference System (CRS) from URI.""" uri: Annotated[ AnyUrl, Field( json_schema_extra={ "description": "Reference to one coordinate reference system (CRS) as URI", "exemples": [ "http://www.opengis.net/def/crs/EPSG/0/3978", "urn:ogc:def:crs:EPSG::2193", ], } ), ] class CRSWKT(BaseModel): """Coordinate Reference System (CRS) from WKT encoded as PROJJSON Object.""" wkt: Annotated[ dict, Field( json_schema_extra={ "description": "An object defining the CRS using the JSON encoding for Well-known text representation of coordinate reference systems 2.0", } ), ] class CRSRef(BaseModel): """CRS from referenceSystem.""" referenceSystem: Annotated[ dict[str, Any], Field( json_schema_extra={ "description": "A reference system data structure as defined in the MD_ReferenceSystem of the ISO 19115", } ), ] class CRS(RootModel[str | CRSUri | CRSWKT | CRSRef]): """CRS model. Ref: https://github.com/opengeospatial/ogcapi-tiles/blob/master/openapi/schemas/common-geodata/crs.yaml Code generated using https://github.com/koxudaxi/datamodel-code-generator/ """ _pyproj_crs: pyproj.CRS = PrivateAttr() def model_post_init(self, __context: Any) -> None: """Post Init: Set private attr.""" super().model_post_init(__context) if isinstance(self.root, str): self._pyproj_crs = pyproj.CRS.from_user_input(self.root) elif isinstance(self.root, CRSUri): self._pyproj_crs = pyproj.CRS.from_user_input(str(self.root.uri)) elif isinstance(self.root, CRSWKT): self._pyproj_crs = pyproj.CRS.from_json_dict(self.root.wkt) elif isinstance(self.root, CRSRef): raise NotImplementedError( "Morecantile does not support `MD_ReferenceSystem` defined CRS" ) @property def srs(self) -> str: """return the string form of the user input used to create the CRS.""" return self._pyproj_crs.srs def to_epsg(self, *args: Any, **kwargs: Any) -> int | None: """return EPSG number of the CRS.""" return self._pyproj_crs.to_epsg(*args, **kwargs) def to_wkt(self, *args: Any, **kwargs: Any) -> str: """return WKT version of the CRS.""" return self._pyproj_crs.to_wkt(*args, **kwargs) def to_proj4(self, *args: Any, **kwargs: Any) -> str: """return PROJ4 version of the CRS.""" return self._pyproj_crs.to_proj4(*args, **kwargs) def to_dict(self) -> dict: """return DICT version of the CRS.""" return self._pyproj_crs.to_dict() def to_json(self, *args: Any, **kwargs: Any) -> str: """return JSON version of the CRS.""" return self._pyproj_crs.to_json(*args, **kwargs) # For compatibility CRSType = CRS def CRS_to_uri(crs: pyproj.CRS) -> str: """Convert CRS to URI.""" authority = "EPSG" code = None version = "0" # attempt to grab the authority, version, and code from the CRS authority_code = crs.to_authority(min_confidence=20) if authority_code is not None: authority, code = authority_code # if we have a version number in the authority, split it out if "_" in authority: authority, version = authority.split("_") return f"http://www.opengis.net/def/crs/{authority}/{version}/{code}" def crs_axis_inverted(crs: pyproj.CRS) -> bool: """Check if CRS has inverted AXIS (lat,lon) instead of (lon,lat).""" return crs.axis_info[0].abbrev.upper() in ["Y", "LAT", "N"] def ordered_axis_inverted(ordered_axes: list[str]) -> bool: """Check if ordered axes have inverted AXIS (lat,lon) instead of (lon,lat).""" return ordered_axes[0].upper() in ["Y", "LAT", "N"] class TMSBoundingBox(BaseModel, arbitrary_types_allowed=True): """Bounding box ref: https://github.com/opengeospatial/2D-Tile-Matrix-Set/blob/master/schemas/tms/2.0/json/2DBoundingBox.json """ lowerLeft: Annotated[ BoundsType, Field( json_schema_extra={ "description": "A 2D Point in the CRS indicated elsewhere", } ), ] upperRight: Annotated[ BoundsType, Field( json_schema_extra={ "description": "A 2D Point in the CRS indicated elsewhere", } ), ] crs: Annotated[ CRS | None, Field( json_schema_extra={ "description": "Coordinate Reference System (CRS)", } ), ] = None orderedAxes: Annotated[ axesInfo | None, Field( json_schema_extra={ "description": "Ordered list of names of the dimensions defined in the CRS", } ), ] = None class variableMatrixWidth(BaseModel): """Variable Matrix Width Definition ref: https://github.com/opengeospatial/2D-Tile-Matrix-Set/blob/master/schemas/tms/2.0/json/variableMatrixWidth.json """ coalesce: Annotated[ int, Field( ge=2, multiple_of=1, json_schema_extra={ "description": "Number of tiles in width that coalesce in a single tile for these rows", }, ), ] minTileRow: Annotated[ int, Field( ge=0, multiple_of=1, json_schema_extra={ "description": "First tile row where the coalescence factor applies for this tilematrix", }, ), ] maxTileRow: Annotated[ int, Field( ge=0, multiple_of=1, json_schema_extra={ "description": "Last tile row where the coalescence factor applies for this tilematrix", }, ), ] class TileMatrix(BaseModel, extra="forbid"): """Tile Matrix Definition A tile matrix, usually corresponding to a particular zoom level of a TileMatrixSet. ref: https://github.com/opengeospatial/2D-Tile-Matrix-Set/blob/master/schemas/tms/2.0/json/tileMatrix.json """ title: Annotated[ str | None, Field( json_schema_extra={ "description": "Title of this tile matrix, normally used for display to a human", } ), ] = None description: Annotated[ str | None, Field( json_schema_extra={ "description": "Brief narrative description of this tile matrix set, normally available for display to a human", } ), ] = None keywords: Annotated[ list[str] | None, Field( json_schema_extra={ "description": "Unordered list of one or more commonly used or formalized word(s) or phrase(s) used to describe this dataset", } ), ] = None id: Annotated[ str, Field( pattern=r"^\-?[0-9]+$", json_schema_extra={ "description": "Identifier selecting one of the scales defined in the TileMatrixSet and representing the scaleDenominator the tile. Implementation of 'identifier'", }, ), ] scaleDenominator: Annotated[ float, Field( json_schema_extra={ "description": "Scale denominator of this tile matrix", } ), ] cellSize: Annotated[ float, Field( json_schema_extra={ "description": "Cell size of this tile matrix", } ), ] cornerOfOrigin: Annotated[ Literal["topLeft", "bottomLeft"], Field( json_schema_extra={ "description": "The corner of the tile matrix (_topLeft_ or _bottomLeft_) used as the origin for numbering tile rows and columns. This corner is also a corner of the (0, 0) tile.", } ), ] = "topLeft" pointOfOrigin: Annotated[ BoundsType, Field( json_schema_extra={ "description": "Precise position in CRS coordinates of the corner of origin (e.g. the top-left corner) for this tile matrix. This position is also a corner of the (0, 0) tile. In previous version, this was 'topLeftCorner' and 'cornerOfOrigin' did not exist.", } ), ] tileWidth: Annotated[ int, Field( ge=1, multiple_of=1, json_schema_extra={ "description": "Width of each tile of this tile matrix in pixels", }, ), ] tileHeight: Annotated[ int, Field( ge=1, multiple_of=1, json_schema_extra={ "description": "Height of each tile of this tile matrix in pixels", }, ), ] matrixWidth: Annotated[ int, Field( ge=1, multiple_of=1, json_schema_extra={ "description": "Width of the matrix (number of tiles in width)", }, ), ] matrixHeight: Annotated[ int, Field( ge=1, multiple_of=1, json_schema_extra={ "description": "Height of the matrix (number of tiles in height)", }, ), ] variableMatrixWidths: Annotated[ list[variableMatrixWidth] | None, Field( json_schema_extra={ "description": "Describes the rows that has variable matrix width", } ), ] = None def get_coalesce_factor(self, row: int) -> int: """Get Coalesce value for TileMatrix.""" if not self.variableMatrixWidths: raise ValueError("TileMatrix has not variableMatrixWidths") if row < 0: raise ValueError(f"Cannot find coalesce factor for Negative Row ({row})") if row > self.matrixHeight - 1: raise ValueError( f"Row {row} is greater than the TileMatrix height ({self.matrixHeight})" ) for matrix_width in self.variableMatrixWidths: if matrix_width.maxTileRow >= row >= matrix_width.minTileRow: return matrix_width.coalesce return 1 class TileMatrixSet(BaseModel, arbitrary_types_allowed=True, extra="ignore"): """Tile Matrix Set Definition A definition of a tile matrix set following the Tile Matrix Set standard. For tileset metadata, such a description (in `tileMatrixSet` property) is only required for offline use, as an alternative to a link with a `http://www.opengis.net/def/rel/ogc/1.0/tiling-scheme` relation type. ref: https://github.com/opengeospatial/2D-Tile-Matrix-Set/blob/master/schemas/tms/2.0/json/tileMatrixSet.json """ title: Annotated[ str | None, Field( json_schema_extra={ "description": "Title of this tile matrix set, normally used for display to a human", }, frozen=True, ), ] = None description: Annotated[ str | None, Field( json_schema_extra={ "description": "Brief narrative description of this tile matrix set, normally available for display to a human", }, frozen=True, ), ] = None keywords: Annotated[ list[str] | None, Field( json_schema_extra={ "description": "Unordered list of one or more commonly used or formalized word(s) or phrase(s) used to describe this tile matrix set", }, frozen=True, ), ] = None id: Annotated[ str | None, Field( pattern=r"^[\w\d_\-]+$", json_schema_extra={ "description": "Tile matrix set identifier. Implementation of 'identifier'", }, frozen=True, ), ] = None uri: Annotated[ str | None, Field( json_schema_extra={ "description": "Reference to an official source for this tileMatrixSet", }, frozen=True, ), ] = None orderedAxes: Annotated[ axesInfo | None, Field( json_schema_extra={ "description": "Ordered list of names of the dimensions defined in the CRS", }, frozen=True, ), ] = None crs: Annotated[ CRS, Field( json_schema_extra={ "description": "Coordinate Reference System (CRS)", }, frozen=True, ), ] wellKnownScaleSet: Annotated[ AnyHttpUrl | None, Field( json_schema_extra={ "description": "Reference to a well-known scale set", }, frozen=True, ), ] = None boundingBox: Annotated[ TMSBoundingBox | None, Field( json_schema_extra={ "description": "Minimum bounding rectangle surrounding the tile matrix set, in the supported CRS", }, frozen=True, ), ] = None tileMatrices: Annotated[ list[TileMatrix], Field( json_schema_extra={ "description": "Describes scale levels and its tile matrices", }, frozen=True, ), ] # Private attributes _geographic_crs: pyproj.CRS = PrivateAttr() _tile_matrices_idx: dict[int, int] = PrivateAttr() def __init__(self, **data): """Set private attributes.""" super().__init__(**data) self._tile_matrices_idx = { int(mat.id): idx for idx, mat in enumerate(self.tileMatrices) } # Default Geographic CRS from TMS's CRS self._geographic_crs = ( pyproj.CRS.from_user_input(DEFAULT_GEOGRAPHIC_CRS) if DEFAULT_GEOGRAPHIC_CRS else self.crs._pyproj_crs.geodetic_crs ) @model_validator(mode="before") def check_for_old_specification(cls, data): """Check for TMS V1.0 keywords.""" if {"supportedCRS", "topLeftCorner"}.intersection(data): raise DeprecationError( "Tile Matrix Set must be version 2.0. Use morecantile <4.0 for TMS 1.0 support" ) return data @field_validator("tileMatrices") def sort_tile_matrices(cls, v): """Sort matrices by identifier""" return sorted(v, key=lambda m: int(m.id)) @cached_property def is_quadtree(self) -> bool: """Check for quadtree support.""" return check_quadkey_support(self.tileMatrices) @cached_property def is_variable(self) -> bool: """Check if TMS has variable width matrix.""" return any( True if matrix.variableMatrixWidths is not None else False for matrix in self.tileMatrices ) def __iter__(self): """Iterate over matrices""" for matrix in self.tileMatrices: yield matrix def __repr__(self): """Simplify default pydantic model repr.""" return f" int: """TileMatrixSet minimum TileMatrix identifier""" return int(self.tileMatrices[0].id) @property def maxzoom(self) -> int: """TileMatrixSet maximum TileMatrix identifier""" return int(self.tileMatrices[-1].id) @cached_property def _invert_axis(self) -> bool: """Check if CRS has inverted AXIS (lat,lon) instead of (lon,lat).""" return ( ordered_axis_inverted(self.orderedAxes) if self.orderedAxes else crs_axis_inverted(self.crs._pyproj_crs) ) @classmethod def from_v1(cls, tms: dict) -> "TileMatrixSet": """ Makes a TMS from a v1 TMS definition Attributes ---------- supportedCRS: CRS Tile Matrix Set coordinate reference system title: str Title of TMS abstract: str (optional) Abstract of CRS keywords: str (optional) Keywords identifier: str TMS Identifier wellKnownScaleSet: AnyHttpUrl (optional) WKSS URL boundingBox: TMSBoundingBox (optional) Bounding box of TMS tileMatrix: list[TileMatrix] List of Tile Matrices Returns: -------- TileMatrixSet """ v2_tms = tms.copy() del v2_tms["type"] if tms_bbox := v2_tms.pop("boundingBox", None): del tms_bbox["type"] tms_bbox["lowerLeft"] = tms_bbox.pop("lowerCorner") tms_bbox["upperRight"] = tms_bbox.pop("upperCorner") v2_tms["boundingBox"] = tms_bbox v2_tms["crs"] = v2_tms.pop("supportedCRS") v2_tms["tileMatrices"] = v2_tms.pop("tileMatrix") v2_tms["id"] = v2_tms.pop("identifier") mpu = meters_per_unit(pyproj.CRS.from_user_input(v2_tms["crs"])) for i in range(len(v2_tms["tileMatrices"])): v2_tms["tileMatrices"][i]["cellSize"] = ( v2_tms["tileMatrices"][i]["scaleDenominator"] * 0.28e-3 / mpu ) v2_tms["tileMatrices"][i]["pointOfOrigin"] = v2_tms["tileMatrices"][i].pop( "topLeftCorner" ) v2_tms["tileMatrices"][i]["id"] = v2_tms["tileMatrices"][i].pop( "identifier" ) del v2_tms["tileMatrices"][i]["type"] return TileMatrixSet(**v2_tms) @classmethod def custom( cls, extent: list[float], crs: pyproj.CRS, tile_width: int = 256, tile_height: int = 256, matrix_scale: list | None = None, extent_crs: pyproj.CRS | None = None, minzoom: int = 0, maxzoom: int = 24, title: str | None = None, id: str | None = None, ordered_axes: list[str] | None = None, screen_pixel_size: float = 0.28e-3, decimation_base: int = 2, corner_of_origin: Literal["topLeft", "bottomLeft"] = "topLeft", point_of_origin: list[float] = None, **kwargs: Any, ): """ Construct a custom TileMatrixSet. Attributes ---------- extent: list Bounding box of the Tile Matrix Set, (left, bottom, right, top). crs: pyproj.CRS Tile Matrix Set coordinate reference system tile_width: int Width of each tile of this tile matrix in pixels (default is 256). tile_height: int Height of each tile of this tile matrix in pixels (default is 256). matrix_scale: list Tiling schema coalescence coefficient (default: [1, 1] for EPSG:3857). Should be set to [2, 1] for EPSG:4326. see: http://docs.opengeospatial.org/is/17-083r2/17-083r2.html#14 extent_crs: pyproj.CRS Extent's coordinate reference system, as a pyproj CRS object. (default: same as input crs) minzoom: int Tile Matrix Set minimum zoom level (default is 0). maxzoom: int Tile Matrix Set maximum zoom level (default is 24). title: str, optional Tile Matrix Set title id: str, optional Tile Matrix Set identifier ordered_axes: list of str, optional Override Axis order (e.g `["N", "S"]`) else default to CRS's metadata screen_pixel_size: float, optional Rendering pixel size. 0.28 mm was the actual pixel size of a common display from 2005 and considered as standard by OGC. decimation_base: int, optional How tiles are divided at each zoom level (default is 2). Must be greater than 1. corner_of_origin: str, optional Corner of origin for the TMS, either 'topLeft' or 'bottomLeft' point_of_origin: list, optional Point of origin for the TMS, (x, y) coordinates in the TMS CRS. kwargs: Any Attributes to forward to the TileMatrixSet Returns: -------- TileMatrixSet """ matrix_scale = matrix_scale or [1, 1] if ordered_axes: is_inverted = ordered_axis_inverted(ordered_axes) else: is_inverted = crs_axis_inverted(crs) if extent_crs: transform = pyproj.Transformer.from_crs(extent_crs, crs, always_xy=True) left, bottom, right, top = extent extent = list( transform.transform_bounds(left, bottom, right, top, densify_pts=21) ) if decimation_base <= 1: raise ValueError( "Custom TileMatrixSet requires a decimation base that is greater than 1." ) bbox = BoundingBox(*extent) if not point_of_origin: if corner_of_origin == "topLeft": x_origin = bbox.left if not is_inverted else bbox.top y_origin = bbox.top if not is_inverted else bbox.left point_of_origin = [x_origin, y_origin] elif corner_of_origin == "bottomLeft": x_origin = bbox.left if not is_inverted else bbox.bottom y_origin = bbox.bottom if not is_inverted else bbox.left point_of_origin = [x_origin, y_origin] else: raise ValueError( f"Invalid `corner_of_origin` value: {corner_of_origin}, must be either 'topLeft' or 'bottomLeft'" ) width = abs(bbox.right - bbox.left) height = abs(bbox.top - bbox.bottom) mpu = meters_per_unit(crs) tile_matrices: list[TileMatrix] = [] for zoom in range(minzoom, maxzoom + 1): res = max( width / (tile_width * matrix_scale[0]) / float(decimation_base) ** zoom, height / (tile_height * matrix_scale[1]) / float(decimation_base) ** zoom, ) tile_matrices.append( TileMatrix( **{ "id": str(zoom), "scaleDenominator": res * mpu / screen_pixel_size, "cellSize": res, "cornerOfOrigin": corner_of_origin, "pointOfOrigin": point_of_origin, "tileWidth": tile_width, "tileHeight": tile_height, "matrixWidth": matrix_scale[0] * decimation_base**zoom, "matrixHeight": matrix_scale[1] * decimation_base**zoom, } ) ) if crs.to_authority(min_confidence=20): crs_data: Any = CRS_to_uri(crs) # Some old Proj version might not support URI # so we fall back to wkt try: pyproj.CRS.from_user_input(crs_data) except CRSError: crs_data = {"wkt": crs.to_json_dict()} else: crs_data = {"wkt": crs.to_json_dict()} return cls( crs=crs_data, tileMatrices=tile_matrices, id=id, title=title, **kwargs, ) def matrix(self, zoom: int) -> TileMatrix: """Return the TileMatrix for a specific zoom.""" if (idx := self._tile_matrices_idx.get(zoom, None)) is not None: return self.tileMatrices[idx] ####################################################################### # If user wants a deeper matrix we calculate it ####################################################################### if self.is_variable: raise InvalidZoomError( f"TileMatrix not found for level: {zoom} - Unable to construct tileMatrix for TMS with variable width" ) matrix_scale = list( { round( self.tileMatrices[idx].scaleDenominator / self.tileMatrices[idx - 1].scaleDenominator, 2, ) for idx in range(1, len(self.tileMatrices)) } ) if len(matrix_scale) > 1: raise InvalidZoomError( f"TileMatrix not found for level: {zoom} - Unable to construct tileMatrix for TMS with variable scale" ) warnings.warn( f"TileMatrix not found for level: {zoom} - Creating values from TMS Scale.", UserWarning, stacklevel=1, ) # TODO: what if we want to construct a matrix for a level up ? tile_matrix = self.tileMatrices[-1] factor = 1 / matrix_scale[0] while not str(zoom) == tile_matrix.id: tile_matrix = TileMatrix( id=str(int(tile_matrix.id) + 1), scaleDenominator=tile_matrix.scaleDenominator / factor, cellSize=tile_matrix.cellSize / factor, cornerOfOrigin=tile_matrix.cornerOfOrigin, pointOfOrigin=tile_matrix.pointOfOrigin, tileWidth=tile_matrix.tileWidth, tileHeight=tile_matrix.tileHeight, matrixWidth=int(tile_matrix.matrixWidth * factor), matrixHeight=int(tile_matrix.matrixHeight * factor), ) return tile_matrix def _matrix_origin(self, matrix: TileMatrix) -> Coords: """Return the Origin coordinates of the matrix.""" origin_x = ( matrix.pointOfOrigin[1] if self._invert_axis else matrix.pointOfOrigin[0] ) origin_y = ( matrix.pointOfOrigin[0] if self._invert_axis else matrix.pointOfOrigin[1] ) return Coords(origin_x, origin_y) def zoom_for_res( self, res: float, max_z: int | None = None, zoom_level_strategy: str = "auto", min_z: int | None = None, ) -> int: """Get TMS zoom level corresponding to a specific resolution. Args: res (float): Resolution in TMS unit. max_z (int): Maximum zoom level (default is tms maxzoom). zoom_level_strategy (str): Strategy to determine zoom level (same as in GDAL 3.2). LOWER will select the zoom level immediately below the theoretical computed non-integral zoom level. On the contrary, UPPER will select the immediately above zoom level. Defaults to AUTO which selects the closest zoom level. ref: https://gdal.org/drivers/raster/cog.html#raster-cog min_z (int): Minimum zoom level (default is tms minzoom). Returns: int: TMS zoom for a given resolution. Examples: >>> zoom_for_res(430.021) """ if max_z is None: max_z = self.maxzoom if min_z is None: min_z = self.minzoom # Freely adapted from https://github.com/OSGeo/gdal/blob/dc38aa64d779ecc45e3cd15b1817b83216cf96b8/gdal/frmts/gtiff/cogdriver.cpp#L272-L305 for zoom_level in range(min_z, max_z + 1): matrix_res = self.matrix(zoom_level).cellSize if res > matrix_res or abs(res - matrix_res) / matrix_res <= 1e-8: break if zoom_level > 0 and abs(res - matrix_res) / matrix_res > 1e-8: if zoom_level_strategy.lower() == "lower": zoom_level = max(zoom_level - 1, min_z) elif zoom_level_strategy.lower() == "upper": zoom_level = min(zoom_level, max_z) elif zoom_level_strategy.lower() == "auto": if (self.matrix(max(zoom_level - 1, min_z)).cellSize / res) < ( res / matrix_res ): zoom_level = max(zoom_level - 1, min_z) else: raise ValueError( f"Invalid strategy: {zoom_level_strategy}. Should be one of lower|upper|auto" ) return zoom_level def intersect_tms(self, bbox: BoundingBox) -> bool: """Check if a bounds intersects with the TMS bounds.""" tms_bounds = self.xy_bbox return ( (bbox[0] < tms_bounds[2]) and (bbox[2] > tms_bounds[0]) and (bbox[3] > tms_bounds[1]) and (bbox[1] < tms_bounds[3]) ) def lnglat(self, x: float, y: float, truncate: bool = False) -> Coords: """Transform point(x,y) to geographic longitude and latitude.""" inside = point_in_bbox(Coords(x, y), self.xy_bbox) if not inside: warnings.warn( f"Point ({x}, {y}) is outside TMS bounds {list(self.xy_bbox)}.", PointOutsideTMSBounds, stacklevel=1, ) lng, lat = self._to_geographic.transform(x, y) if truncate: lng, lat = truncate_coordinates(lng, lat, self.bbox) return Coords(lng, lat) def xy(self, lng: float, lat: float, truncate: bool = False) -> Coords: """Transform geographic longitude and latitude coordinates to TMS CRS.""" if truncate: lng, lat = truncate_coordinates(lng, lat, self.bbox) inside = point_in_bbox(Coords(lng, lat), self.bbox) if not inside: warnings.warn( f"Point ({lng}, {lat}) is outside TMS bounds {list(self.bbox)}.", PointOutsideTMSBounds, stacklevel=1, ) x, y = self._from_geographic.transform(lng, lat) return Coords(x, y) def _tile( self, xcoord: float, ycoord: float, zoom: int, ignore_coalescence: bool = True, ) -> Tile: """ Get the tile containing a Point (in TMS CRS). Parameters ---------- xcoord, ycoord : float A `X` and `Y` pair in TMS coordinate reference system. zoom : int The zoom level. Returns ------- Tile """ matrix = self.matrix(zoom) origin_x, origin_y = self._matrix_origin(matrix) xtile = ( math.floor((xcoord - origin_x) / float(matrix.cellSize * matrix.tileWidth)) if not math.isinf(xcoord) else 0 ) coord = ( (origin_y - ycoord) if matrix.cornerOfOrigin == "topLeft" else (ycoord - origin_y) ) ytile = ( math.floor(coord / float(matrix.cellSize * matrix.tileHeight)) if not math.isinf(ycoord) else 0 ) # avoid out-of-range tiles if ytile < 0: ytile = 0 if ytile >= matrix.matrixHeight: ytile = matrix.matrixHeight - 1 if xtile < 0: xtile = 0 if xtile >= matrix.matrixWidth: xtile = matrix.matrixWidth - 1 if not ignore_coalescence: cf = ( matrix.get_coalesce_factor(ytile) if matrix.variableMatrixWidths is not None else 1 ) if cf != 1 and xtile % cf: xtile -= xtile % cf return Tile(x=xtile, y=ytile, z=zoom) def tile( self, lng: float, lat: float, zoom: int, truncate=False, ignore_coalescence: bool = False, geographic_crs: pyproj.CRS | None = None, ) -> Tile: """ Get the tile for a given geographic longitude and latitude pair. Parameters ---------- lng, lat : float A longitude and latitude pair in geographic coordinate reference system. zoom : int The zoom level. truncate : bool Whether or not to truncate inputs to limits of TMS geographic bounds. ignore_coalescence : bool Whether or not to ignore coalescence factor for TMS with variable matrix width. geographic_crs: pyproj.CRS, optional Geographic CRS of the given coordinates. Default to TMS's Geographic CRS. Returns ------- Tile """ geographic_crs = geographic_crs or self.geographic_crs or WGS84_CRS _from_geographic = TransformerFromCRS( geographic_crs, self.crs._pyproj_crs, always_xy=True ) _to_geographic = TransformerFromCRS( self.crs._pyproj_crs, geographic_crs, always_xy=True ) if truncate: left, bottom, right, top = self.xy_bbox bbox = BoundingBox( *_to_geographic.transform_bounds( left, bottom, right, top, densify_pts=21 ), ) lng, lat = truncate_coordinates(lng, lat, bbox) x, y = _from_geographic.transform(lng, lat) if not point_in_bbox(Coords(x, y), self.xy_bbox): warnings.warn( f"Point ({lng}, {lat}) is outside TMS bounds.", PointOutsideTMSBounds, stacklevel=1, ) return self._tile(x, y, zoom, ignore_coalescence=ignore_coalescence) def _ul(self, *tile: Tile) -> Coords: """ Return the upper left coordinate of the tile in TMS coordinate reference system. Attributes ---------- tile: (x, y, z) tile coordinates or a Tile object we want the upper left coordinates of. Returns ------- Coords: The upper left coordinates of the input tile. """ t = _parse_tile_arg(*tile) matrix = self.matrix(t.z) origin_x, origin_y = self._matrix_origin(matrix) cf = ( matrix.get_coalesce_factor(t.y) if matrix.variableMatrixWidths is not None else 1 ) x_coord = ( origin_x + math.floor(t.x / cf) * matrix.cellSize * cf * matrix.tileWidth ) y_coord = ( origin_y - t.y * matrix.cellSize * matrix.tileHeight if matrix.cornerOfOrigin == "topLeft" else origin_y + (t.y + 1) * matrix.cellSize * matrix.tileHeight ) return Coords(x_coord, y_coord) def _lr(self, *tile: Tile) -> Coords: """ Return the lower right coordinate of the tile in TMS coordinate reference system. Attributes ---------- tile: (x, y, z) tile coordinates or a Tile object we want the lower right coordinates of. Returns ------- Coords: The lower right coordinates of the input tile. """ t = _parse_tile_arg(*tile) matrix = self.matrix(t.z) origin_x, origin_y = self._matrix_origin(matrix) cf = ( matrix.get_coalesce_factor(t.y) if matrix.variableMatrixWidths is not None else 1 ) x_coord = ( origin_x + (math.floor(t.x / cf) + 1) * matrix.cellSize * cf * matrix.tileWidth ) y_coord = ( origin_y - (t.y + 1) * matrix.cellSize * matrix.tileHeight if matrix.cornerOfOrigin == "topLeft" else origin_y + t.y * matrix.cellSize * matrix.tileHeight ) return Coords(x_coord, y_coord) def xy_bounds(self, *tile: Tile) -> BoundingBox: """ Return the bounding box of the tile in TMS coordinate reference system. Attributes ---------- tile: A tuple of (x, y, z) tile coordinates or a Tile object we want the bounding box of. Returns ------- BoundingBox: The bounding box of the input tile. """ t = _parse_tile_arg(*tile) matrix = self.matrix(t.z) origin_x, origin_y = self._matrix_origin(matrix) cf = ( matrix.get_coalesce_factor(t.y) if matrix.variableMatrixWidths is not None else 1 ) left = origin_x + math.floor(t.x / cf) * matrix.cellSize * cf * matrix.tileWidth right = ( origin_x + (math.floor(t.x / cf) + 1) * matrix.cellSize * cf * matrix.tileWidth ) if matrix.cornerOfOrigin == "topLeft": top = origin_y - t.y * matrix.cellSize * matrix.tileHeight bottom = origin_y - (t.y + 1) * matrix.cellSize * matrix.tileHeight else: bottom = origin_y + t.y * matrix.cellSize * matrix.tileHeight top = origin_y + (t.y + 1) * matrix.cellSize * matrix.tileHeight return BoundingBox(left, bottom, right, top) def ul(self, *tile: Tile) -> Coords: """ Return the upper left coordinates of the tile in geographic coordinate reference system. Attributes ---------- tile (tuple or Tile): (x, y, z) tile coordinates or a Tile object we want the upper left geographic coordinates of. Returns ------- Coords: The upper left geographic coordinates of the input tile. """ t = _parse_tile_arg(*tile) x, y = self._ul(t) return Coords(*self.lnglat(x, y)) def lr(self, *tile: Tile) -> Coords: """ Return the lower right coordinates of the tile in geographic coordinate reference system. Attributes ---------- tile (tuple or Tile): (x, y, z) tile coordinates or a Tile object we want the lower right geographic coordinates of. Returns ------- Coords: The lower right geographic coordinates of the input tile. """ t = _parse_tile_arg(*tile) x, y = self._lr(t) return Coords(*self.lnglat(x, y)) def bounds(self, *tile: Tile) -> BoundingBox: """ Return the bounding box of the tile in geographic coordinate reference system. Attributes ---------- tile (tuple or Tile): A tuple of (x, y, z) tile coordinates or a Tile object we want the bounding box of. Returns ------- BoundingBox: The bounding box of the input tile. """ _left, _bottom, _right, _top = self.xy_bounds(*tile) left, top = self.lnglat(_left, _top) right, bottom = self.lnglat(_right, _bottom) return BoundingBox(left, bottom, right, top) @cached_property def xy_bbox(self): """Return TMS bounding box in TileMatrixSet's CRS.""" zoom = self.minzoom matrix = self.matrix(zoom) left, top = self._ul(Tile(0, 0, zoom)) right, bottom = self._lr( Tile(matrix.matrixWidth - 1, matrix.matrixHeight - 1, zoom) ) return BoundingBox(left, bottom, right, top) @property def bbox(self): """Return TMS bounding box in geographic coordinate reference system.""" left, bottom, right, top = self.xy_bbox return BoundingBox( *self._to_geographic.transform_bounds( left, bottom, right, top, densify_pts=21, ) ) def tiles( # noqa: C901 self, west: float, south: float, east: float, north: float, zooms: Sequence[int], truncate: bool = False, geographic_crs: pyproj.CRS | None = None, ) -> Iterator[Tile]: """ Get the tiles overlapped by a geographic bounding box Original code from https://github.com/mapbox/mercantile/blob/master/mercantile/__init__.py#L424 Parameters ---------- west, south, east, north : sequence of float Bounding values in decimal degrees (geographic CRS). zooms : int or sequence of int One or more zoom levels. truncate : bool, optional Whether or not to truncate inputs to TMS limits. geographic_crs: pyproj.CRS, optional Geographic CRS of the given coordinates. Default to TMS's Geographic CRS Yields ------ Tile Notes ----- A small epsilon is used on the south and east parameters so that this function yields exactly one tile when given the bounds of that same tile. """ if any(math.isnan(coord) for coord in (west, south, east, north)): raise ValueError("All coordinates must be finite") if isinstance(zooms, int): zooms = (zooms,) geographic_crs = geographic_crs or self.geographic_crs or WGS84_CRS _from_geographic = TransformerFromCRS( geographic_crs, self.crs._pyproj_crs, always_xy=True ) _to_geographic = TransformerFromCRS( self.crs._pyproj_crs, geographic_crs, always_xy=True ) # TMS bbox left, bottom, right, top = self.xy_bbox bbox = BoundingBox( *_to_geographic.transform_bounds(left, bottom, right, top, densify_pts=21), ) if truncate: west, south = truncate_coordinates(west, south, bbox) east, north = truncate_coordinates(east, north, bbox) if west > east: bbox_west = (bbox.left, south, east, north) bbox_east = (west, south, bbox.right, north) bboxes = [bbox_west, bbox_east] else: bboxes = [(west, south, east, north)] for w, s, e, n in bboxes: # Clamp bounding values. es_contain_180th = lons_contain_antimeridian(e, bbox.right) w = max(bbox.left, w) s = max(bbox.bottom, s) e = max(bbox.right, e) if es_contain_180th else min(bbox.right, e) n = min(bbox.top, n) w, n = _from_geographic.transform(w + LL_EPSILON, n - LL_EPSILON) e, s = _from_geographic.transform(e - LL_EPSILON, s + LL_EPSILON) for z in zooms: nw_tile = self._tile(w, n, z, ignore_coalescence=True) se_tile = self._tile(e, s, z, ignore_coalescence=True) minx = min(nw_tile.x, se_tile.x) maxx = max(nw_tile.x, se_tile.x) miny = min(nw_tile.y, se_tile.y) maxy = max(nw_tile.y, se_tile.y) matrix = self.matrix(z) for j in range(miny, maxy + 1): cf = ( matrix.get_coalesce_factor(j) if matrix.variableMatrixWidths is not None else 1 ) for i in range(minx, maxx + 1): if cf != 1 and i % cf: continue yield Tile(i, j, z) def feature( self, tile: Tile, fid: str | None = None, props: dict | None = None, buffer: NumType | None = None, precision: int | None = None, projected: bool = False, geographic_crs: pyproj.CRS | None = None, ) -> dict: """ Get the GeoJSON feature corresponding to a tile. Originally from https://github.com/mapbox/mercantile/blob/master/mercantile/__init__.py Parameters ---------- tile : Tile or sequence of int May be be either an instance of Tile or 3 ints, X, Y, Z. fid : str, optional A feature id. props : dict, optional Optional extra feature properties. buffer : float, optional Optional buffer distance for the GeoJSON polygon. precision: float If >= 0, geometry coordinates will be rounded to this number of decimal, otherwise original coordinate values will be preserved (default). projected : bool, optional Return coordinates in TMS projection. Default is false. geographic_crs: pyproj.CRS, optional Geographic CRS to use when `projected=False`. Default to 'EPSG:4326' as per GeoJSON specification. . Returns ------- dict """ geographic_crs = geographic_crs or WGS84_CRS feature_crs = self.crs._pyproj_crs west, south, east, north = self.xy_bounds(tile) if not projected: feature_crs = geographic_crs tr = pyproj.Transformer.from_crs( self.crs._pyproj_crs, geographic_crs, always_xy=True ) west, south, east, north = tr.transform_bounds( west, south, east, north, densify_pts=21 ) if buffer: west -= buffer south -= buffer east += buffer north += buffer if precision and precision >= 0: west, south, east, north = ( round(v, precision) for v in (west, south, east, north) ) bbox = [min(west, east), min(south, north), max(west, east), max(south, north)] geom = bbox_to_feature(west, south, east, north) xyz = str(tile) feat: dict[str, Any] = { "type": "Feature", "bbox": bbox, "id": xyz, "geometry": geom, "properties": { "title": f"XYZ tile {xyz}", "tms": self.id, "tms_crs": CRS_to_uri(self.crs._pyproj_crs), }, } if feature_crs != WGS84_CRS: warnings.warn( "CRS is no longer part of the GeoJSON specification." "Other projection than EPSG:4326 might not be supported.", UserWarning, stacklevel=1, ) if authority_code := feature_crs.to_authority(min_confidence=20): authority, code = authority_code feat.update( { "crs": { "type": "name", "properties": {"name": CRS_to_uri(feature_crs)}, } } ) else: feat.update( { "crs": { "type": "wkt", "properties": {"wkt": feature_crs.to_wkt()}, } } ) if props: feat["properties"].update(props) if fid is not None: feat["id"] = fid return feat def quadkey(self, *tile: Tile) -> str: """Get the quadkey of a tile Parameters ---------- tile : Tile or sequence of int May be be either an instance of Tile or 3 ints, X, Y, Z. Returns ------- str """ if not self.is_quadtree: raise NoQuadkeySupport( "This Tile Matrix Set doesn't support 2 x 2 quadkeys." ) t = _parse_tile_arg(*tile) qk = [] for z in range(t.z, self.minzoom, -1): digit = 0 mask = 1 << (z - 1) if t.x & mask: digit += 1 if t.y & mask: digit += 2 qk.append(str(digit)) return "".join(qk) def quadkey_to_tile(self, qk: str) -> Tile: """Get the tile corresponding to a quadkey Parameters ---------- qk : str A quadkey string. Returns ------- Tile """ if not self.is_quadtree: raise NoQuadkeySupport( "This Tile Matrix Set doesn't support 2 x 2 quadkeys." ) if len(qk) == 0: return Tile(0, 0, 0) xtile, ytile = 0, 0 for i, digit in enumerate(reversed(qk)): mask = 1 << i if digit == "1": xtile = xtile | mask elif digit == "2": ytile = ytile | mask elif digit == "3": xtile = xtile | mask ytile = ytile | mask elif digit != "0": raise QuadKeyError("Unexpected quadkey digit: %r", digit) return Tile(xtile, ytile, i + 1) def minmax(self, zoom: int) -> dict: """Return TileMatrix Extrema. Parameters ---------- zoom : int The zoom level. Returns ------- dict """ m = self.matrix(zoom) return { "x": {"min": 0, "max": m.matrixWidth - 1}, "y": {"min": 0, "max": m.matrixHeight - 1}, } def is_valid(self, *tile: Tile, strict: bool = True) -> bool: """Check if a tile is valid.""" t = _parse_tile_arg(*tile) disable_overzoom = self.is_variable or strict if t.z < self.minzoom or (disable_overzoom and t.z > self.maxzoom): return False matrix = self.matrix(t.z) validx = 0 <= t.x <= matrix.matrixWidth - 1 validy = 0 <= t.y <= matrix.matrixHeight - 1 return validx and validy def neighbors(self, *tile: Tile) -> list[Tile]: """The neighbors of a tile The neighbors function makes no guarantees regarding neighbor tile ordering. The neighbors function returns up to eight neighboring tiles, where tiles will be omitted when they are not valid. Parameters ---------- tile : Tile or sequence of int May be be either an instance of Tile or 3 ints, X, Y, Z. Returns ------- list """ t = _parse_tile_arg(*tile) matrix = self.matrix(t.z) x = t.x y = t.y tiles = set() miny = max(0, y - 1) maxy = min(y + 1, matrix.matrixHeight - 1) cf = ( matrix.get_coalesce_factor(y) if matrix.variableMatrixWidths is not None else 1 ) if cf != 1: if x % cf: x -= x % cf minx = max(0, x - (x % cf) - 1) maxx = min(x + (x % cf) + cf, matrix.matrixWidth - 1) else: minx = max(0, x - 1) maxx = min(x + 1, matrix.matrixWidth - 1) for ytile in range(miny, maxy + 1): cf = ( matrix.get_coalesce_factor(ytile) if matrix.variableMatrixWidths is not None else 1 ) for xtile in range(minx, maxx + 1): nx = xtile if cf != 1 and nx % cf: nx = nx - nx % cf if nx == x and ytile == y: continue tiles.add(Tile(x=nx, y=ytile, z=t.z)) return sorted(tiles) def parent(self, *tile: Tile, zoom: int = None): """Get the parent of a tile The parent is the tile of one zoom level lower that contains the given "child" tile. Parameters ---------- tile : Tile or sequence of int May be be either an instance of Tile or 3 ints, X, Y, Z. zoom : int, optional Determines the *zoom* level of the returned parent tile. This defaults to one lower than the tile (the immediate parent). Returns ------- list: list of Tile """ t = _parse_tile_arg(*tile) if t.z == self.minzoom: return [] if zoom is not None and t.z <= zoom: raise InvalidZoomError("zoom must be less than that of the input tile") target_zoom = t.z - 1 if zoom is None else zoom # buffer value to apply on bbox res = self.matrix(t.z).cellSize / 10.0 bbox = self.xy_bounds(t) ul_tile = self._tile(bbox.left + res, bbox.top - res, target_zoom) lr_tile = self._tile(bbox.right - res, bbox.bottom + res, target_zoom) tiles = [] matrix = self.matrix(target_zoom) for j in range(ul_tile.y, lr_tile.y + 1): cf = ( matrix.get_coalesce_factor(j) if matrix.variableMatrixWidths is not None else 1 ) for i in range(ul_tile.x, lr_tile.x + 1): if cf != 1 and i % cf: continue tiles.append(Tile(i, j, target_zoom)) return tiles def children(self, *tile: Tile, zoom: int = None): """Get the children of a tile The children are ordered: top-left, top-right, bottom-right, bottom-left. Parameters ---------- tile : Tile or sequence of int May be be either an instance of Tile or 3 ints, X, Y, Z. zoom : int, optional Determines the *zoom* level of the returned child tiles. This defaults to one higher than the tile (the immediate children). Returns ------- list: list of Tile """ t = _parse_tile_arg(*tile) if zoom is not None and t.z > zoom: raise InvalidZoomError("zoom must be greater than that of the input tile") target_zoom = t.z + 1 if zoom is None else zoom # buffer value to apply on bbox res = self.matrix(t.z).cellSize / 10.0 bbox = self.xy_bounds(t) ul_tile = self._tile(bbox.left + res, bbox.top - res, target_zoom) lr_tile = self._tile(bbox.right - res, bbox.bottom + res, target_zoom) tiles = [] matrix = self.matrix(target_zoom) for j in range(ul_tile.y, lr_tile.y + 1): cf = ( matrix.get_coalesce_factor(j) if matrix.variableMatrixWidths is not None else 1 ) for i in range(ul_tile.x, lr_tile.x + 1): if cf != 1 and i % cf: continue tiles.append(Tile(i, j, target_zoom)) return tiles morecantile-7.0.3/morecantile/py.typed000066400000000000000000000000001514074772600200270ustar00rootroot00000000000000morecantile-7.0.3/morecantile/scripts/000077500000000000000000000000001514074772600200315ustar00rootroot00000000000000morecantile-7.0.3/morecantile/scripts/__init__.py000066400000000000000000000000271514074772600221410ustar00rootroot00000000000000"""morecantile CLI.""" morecantile-7.0.3/morecantile/scripts/cli.py000066400000000000000000000425101514074772600211540ustar00rootroot00000000000000"""Morecantile command line interface""" import json import logging import sys import click from pyproj import CRS import morecantile logger = logging.getLogger(__name__) WGS84_CRS = CRS.from_epsg(4326) def configure_logging(verbosity): """Configure log verbosity. Original code from https://github.com/mapbox/mercantile/blob/71bb3dbdaeb4ccf0e14bfabf1f58d36465cd5289/mercantile/scripts/__init__.py#L13-L26 License: BSD-3 Original work Copyright 2021 Mapbox """ log_level = max(10, 30 - 10 * verbosity) logging.basicConfig(stream=sys.stderr, level=log_level) def normalize_input(input): """Normalize file or string input. Original code from https://github.com/mapbox/mercantile/blob/71bb3dbdaeb4ccf0e14bfabf1f58d36465cd5289/mercantile/scripts/__init__.py#L34-L40 License: BSD-3 Original work Copyright 2021 Mapbox """ try: src = click.open_file(input).readlines() except IOError: src = [input] return src def iter_lines(lines): """Iterate over lines of input, stripping and skipping. Original code from https://github.com/mapbox/mercantile/blob/71bb3dbdaeb4ccf0e14bfabf1f58d36465cd5289/mercantile/scripts/__init__.py#L43-L48 License: BSD-3 Original work Copyright 2021 Mapbox """ for line in lines: line = line.strip() if line: yield line def normalize_source(input): """Yield features from GeoJSON source.""" src = iter(normalize_input(input)) first_line = next(src) # If input is RS-delimited JSON sequence. if first_line.startswith("\x1e"): def feature_gen(): buffer = first_line.strip("\x1e") for line in src: if line.startswith("\x1e"): if buffer: yield json.loads(buffer) buffer = line.strip("\x1e") else: buffer += line else: yield json.loads(buffer) else: def feature_gen(): yield json.loads(first_line) for line in src: yield json.loads(line) return feature_gen() def coords(obj): """Yield all coordinate coordinate tuples from a geometry or feature. From python-geojson package. Original code from https://github.com/mapbox/rasterio/blob/3910956d6cfadd55ea085dd60790246c167967cd/rasterio/rio/helpers.py License: Copyright (c) 2013, MapBox """ if isinstance(obj, (tuple, list)): coordinates = obj elif "geometry" in obj: coordinates = obj["geometry"]["coordinates"] else: coordinates = obj.get("coordinates", obj) for e in coordinates: if isinstance(e, (float, int)): yield tuple(coordinates) break else: for f in coords(e): yield f # The CLI command group. @click.group(help="Command line interface for the Morecantile Python package.") @click.option("--verbose", "-v", count=True, help="Increase verbosity.") @click.option("--quiet", "-q", count=True, help="Decrease verbosity.") @click.version_option(version=morecantile.__version__, message="%(version)s") @click.pass_context def cli(ctx, verbose, quiet): """Execute the main morecantile command""" verbosity = verbose - quiet configure_logging(verbosity) ctx.obj = {} ctx.obj["verbosity"] = verbosity ################################################################################ # The shapes command. @cli.command(short_help="Print the shapes of tiles as GeoJSON.") # This input is either a filename, stdin, or a string. @click.argument("input", default="-", required=False) @click.option( "--identifier", type=click.Choice(morecantile.tms.list()), default="WebMercatorQuad", help="TileMatrixSet identifier.", ) # Coordinate precision option. @click.option( "--precision", type=int, default=None, help="Decimal precision of coordinates." ) # JSON formatting options. @click.option( "--indent", default=None, type=int, help="Indentation level for JSON output" ) @click.option( "--compact/--no-compact", default=False, help="Use compact separators (',', ':')." ) @click.option( "--projected/--geographic", "projected", default=False, help="Output coordinate system", ) @click.option( "--seq", is_flag=True, default=False, help="Write a RS-delimited JSON sequence (default is LF).", ) # GeoJSON feature (default) or collection switch. Meaningful only # when --x-json-seq is used. @click.option( "--feature", "output_mode", flag_value="feature", default=True, help="Output as sequence of GeoJSON features (the default).", ) @click.option( "--bbox", "output_mode", flag_value="bbox", help="Output as sequence of GeoJSON bbox arrays.", ) @click.option( "--collect", is_flag=True, default=False, help="Output as a GeoJSON feature collections.", ) # Optionally write out bboxen in a form that goes # straight into GDAL utilities like gdalwarp. @click.option( "--extents/--no-extents", default=False, help="Write shape extents as ws-separated strings (default is False).", ) # Optionally buffer the shapes by shifting the x and y values of each # vertex by a constant number of decimal degrees or meters (depending # on whether --geographic or --mercator is in effect). @click.option( "--buffer", type=float, default=None, help="Shift shape x and y values by a constant number", ) @click.option( "--tms", help="Path to TileMatrixSet JSON file.", type=click.Path(), ) @click.option( "--crs", help="Geographic CRS. Default to WGS84.", type=str, ) @click.pass_context def shapes( # noqa: C901 ctx, input, identifier, precision, indent, compact, projected, seq, output_mode, collect, extents, buffer, tms, crs, ): """ Reads one or more Web Mercator tile descriptions from stdin and writes either a GeoJSON feature collection (the default) or a JSON sequence of GeoJSON features/collections to stdout. Input may be a compact newline-delimited sequences of JSON or a pretty-printed ASCII RS-delimited sequence of JSON (like https://tools.ietf.org/html/rfc8142 and https://tools.ietf.org/html/rfc7159). Tile descriptions may be either an [x, y, z] array or a JSON object of the form {"tile": [x, y, z], "properties": {"name": "foo", ...}} In the latter case, the properties object will be used to update the properties object of the output feature. """ tilematrixset = morecantile.tms.get(identifier) if tms: with open(tms, "r") as f: tilematrixset = morecantile.TileMatrixSet(**json.load(f)) dump_kwds = {"sort_keys": True} if indent: dump_kwds["indent"] = indent if compact: dump_kwds["separators"] = (",", ":") src = normalize_input(input) features = [] col_xs = [] col_ys = [] for _i, line in enumerate(iter_lines(src)): obj = json.loads(line) if isinstance(obj, dict): x, y, z = obj["tile"][:3] props = obj.get("properties") fid = obj.get("id") elif isinstance(obj, list): x, y, z = obj[:3] props = {} fid = None else: raise click.BadParameter("{0}".format(obj), param=input, param_hint="input") feature = tilematrixset.feature( (x, y, z), fid=fid, props=props, projected=projected, buffer=buffer, precision=precision, geographic_crs=CRS.from_user_input(crs) if crs else WGS84_CRS, ) bbox = feature["bbox"] w, s, e, n = bbox col_xs.extend([w, e]) col_ys.extend([s, n]) if collect: features.append(feature) elif extents: click.echo(" ".join(map(str, bbox))) else: if seq: click.echo("\x1e") if output_mode == "bbox": click.echo(json.dumps(bbox, **dump_kwds)) elif output_mode == "feature": click.echo(json.dumps(feature, **dump_kwds)) if collect and features: bbox = [min(col_xs), min(col_ys), max(col_xs), max(col_ys)] click.echo( json.dumps( {"type": "FeatureCollection", "bbox": bbox, "features": features}, **dump_kwds, ) ) ################################################################################ # The tiles command. @cli.command( short_help=( "Print tiles that overlap or contain a lng/lat point, " "bounding box, or GeoJSON objects." ) ) # Mandatory Mercator zoom level argument. @click.argument("zoom", type=int, default=-1) # This input is either a filename, stdin, or a string. # Has to follow the zoom arg. @click.argument("input", default="-", required=False) @click.option( "--identifier", type=click.Choice(morecantile.tms.list()), default="WebMercatorQuad", help="TileMatrixSet identifier.", ) @click.option( "--seq/--lf", default=False, help="Write a RS-delimited JSON sequence (default is LF).", ) @click.option( "--tms", help="Path to TileMatrixSet JSON file.", type=click.Path(), ) @click.pass_context def tiles(ctx, zoom, input, identifier, seq, tms): # noqa: C901 """ Lists TMS tiles at ZOOM level intersecting GeoJSON [west, south, east, north] bounding boxen, features, or collections read from stdin. Output is a JSON [x, y, z] array. Input may be a compact newline-delimited sequences of JSON or a pretty-printed ASCII RS-delimited sequence of JSON (like https://tools.ietf.org/html/rfc8142 and https://tools.ietf.org/html/rfc7159). Example: $ echo "[-105.05, 39.95, -105, 40]" | morecantiles tiles 12 Output: [852, 1550, 12] [852, 1551, 12] [853, 1550, 12] [853, 1551, 12] """ tilematrixset = morecantile.tms.get(identifier) if tms: with open(tms, "r") as f: tilematrixset = morecantile.TileMatrixSet(**json.load(f)) for obj in normalize_source(input): if isinstance(obj, list): bbox = obj if len(bbox) == 2: bbox += bbox if len(bbox) != 4: raise click.BadParameter( "{0}".format(bbox), param=input, param_hint="input" ) elif isinstance(obj, dict): if "bbox" in obj: bbox = obj["bbox"] else: box_xs = [] box_ys = [] for feat in obj.get("features", [obj]): lngs, lats = zip(*list(coords(feat))) box_xs.extend([min(lngs), max(lngs)]) box_ys.extend([min(lats), max(lats)]) bbox = min(box_xs), min(box_ys), max(box_xs), max(box_ys) west, south, east, north = bbox epsilon = 1.0e-10 if east != west and north != south: # 2D bbox # shrink the bounds a small amount so that # shapes/tiles round trip. west += epsilon south += epsilon east -= epsilon north -= epsilon for tile in tilematrixset.tiles( west, south, east, north, [zoom], truncate=False ): vals = (tile.x, tile.y, zoom) output = json.dumps(vals) if seq: click.echo("\x1e") click.echo(output) ################################################################################ # The tms command. @cli.command(short_help="Print TileMatrixSet JSON document.") @click.option( "--identifier", type=click.Choice(morecantile.tms.list()), help="TileMatrixSet identifier.", required=True, ) def tms(identifier): """Print TMS JSON.""" tms = morecantile.tms.get(identifier) click.echo(tms.model_dump_json(exclude_none=True)) ################################################################################ # The custom command. @cli.command(short_help="Create Custom TileMatrixSet") @click.option( "--epsg", type=int, help="EPSG number.", required=True, ) @click.option( "--extent", type=float, nargs=4, help="left, bottom, right, top Bounding box of the Tile Matrix Set.", required=True, ) @click.option( "--name", type=str, help="Identifier of the custom TMS.", default="CustomTileMatrixSet", ) @click.option("--minzoom", type=int, default=0, help="Minimum Zoom level.") @click.option("--maxzoom", type=int, default=24, help="Maximum Zoom level.") @click.option("--tile-width", type=int, default=256, help="Width of each tile.") @click.option("--tile-height", type=int, default=256, help="Height of each tile.") @click.option( "--extent-epsg", type=int, help="EPSG number for the bounding box.", ) @click.option( "--title", type=str, help="Tile Matrix Set title.", ) def custom( epsg, extent, name, minzoom, maxzoom, tile_width, tile_height, extent_epsg, title ): """Create Custom TMS.""" tms = morecantile.TileMatrixSet.custom( extent, CRS.from_epsg(epsg), id=name, minzoom=minzoom, maxzoom=maxzoom, tile_width=tile_width, tile_height=tile_height, extent_crs=CRS.from_epsg(extent_epsg) if extent_epsg else None, title=title or "Custom TileMatrixSet", ) click.echo(tms.model_dump_json(exclude_none=True)) ################################################################################ # The tms_to_geojson command. @cli.command(short_help="Print TileMatrixSet MatrixSet as GeoJSON.") @click.argument("input", type=click.File(mode="r"), default="-", required=False) @click.option("--level", type=int, required=True, help="Zoom/Matrix level.") # Coordinate precision option. @click.option( "--precision", type=int, default=None, help="Decimal precision of coordinates." ) # JSON formatting options. @click.option( "--indent", default=None, type=int, help="Indentation level for JSON output" ) @click.option( "--compact/--no-compact", default=False, help="Use compact separators (',', ':')." ) @click.option( "--projected/--geographic", "projected", default=False, help="Output coordinate system", ) @click.option( "--seq", is_flag=True, default=False, help="Write a RS-delimited JSON sequence (default is LF).", ) # GeoJSON feature (default) or collection switch. Meaningful only # when --x-json-seq is used. @click.option( "--feature", "output_mode", flag_value="feature", default=True, help="Output as sequence of GeoJSON features (the default).", ) @click.option( "--bbox", "output_mode", flag_value="bbox", help="Output as sequence of GeoJSON bbox arrays.", ) @click.option( "--collect", is_flag=True, default=False, help="Output as a GeoJSON feature collections.", ) # Optionally write out bboxen in a form that goes # straight into GDAL utilities like gdalwarp. @click.option( "--extents/--no-extents", default=False, help="Write shape extents as ws-separated strings (default is False).", ) # Optionally buffer the shapes by shifting the x and y values of each # vertex by a constant number of decimal degrees or meters (depending # on whether --geographic or --mercator is in effect). @click.option( "--buffer", type=float, default=None, help="Shift shape x and y values by a constant number", ) @click.option( "--crs", help="Geographic CRS. Default to WGS84.", type=str, ) def tms_to_geojson( # noqa: C901 input, level, precision, indent, compact, projected, seq, output_mode, collect, extents, buffer, crs, ): """Print TMS document as GeoJSON.""" tms = morecantile.TileMatrixSet(**json.load(input)) matrix = tms.matrix(level) dump_kwds = {"sort_keys": True} if indent: dump_kwds["indent"] = indent if compact: dump_kwds["separators"] = (",", ":") features = [] col_xs = [] col_ys = [] for y in range(0, matrix.matrixHeight): cf = ( matrix.get_coalesce_factor(y) if matrix.variableMatrixWidths is not None else 1 ) for x in range(0, matrix.matrixWidth): if cf != 1 and x % cf: continue feature = tms.feature( (x, y, level), projected=projected, buffer=buffer, precision=precision, geographic_crs=CRS.from_user_input(crs) if crs else WGS84_CRS, ) bbox = feature["bbox"] w, s, e, n = bbox col_xs.extend([w, e]) col_ys.extend([s, n]) if collect: features.append(feature) elif extents: click.echo(" ".join(map(str, bbox))) else: if seq: click.echo("\x1e") if output_mode == "bbox": click.echo(json.dumps(bbox, **dump_kwds)) elif output_mode == "feature": click.echo(json.dumps(feature, **dump_kwds)) if collect and features: bbox = [min(col_xs), min(col_ys), max(col_xs), max(col_ys)] feature_collection = { "type": "FeatureCollection", "bbox": bbox, "features": features, } click.echo(json.dumps(feature_collection, **dump_kwds)) morecantile-7.0.3/morecantile/utils.py000066400000000000000000000105111514074772600200520ustar00rootroot00000000000000"""morecantile utils.""" import math from pyproj import CRS from pyproj.enums import WktVersion from morecantile.commons import BoundingBox, Coords, Tile from morecantile.errors import TileArgParsingError def _parse_tile_arg(*args) -> Tile: """ Parse the *tile arg of module functions Copy from https://github.com/mapbox/mercantile/blob/master/mercantile/__init__.py Parameters ---------- tile : Tile or sequence of int May be be either an instance of Tile or 3 ints, X, Y, Z. Returns ------- Tile Raises ------ TileArgParsingError """ if len(args) == 1: args = args[0] if len(args) == 3: return Tile(*args) else: raise TileArgParsingError( "the tile argument may have 1 or 3 values. Note that zoom is a keyword-only argument" ) def lons_contain_antimeridian(lon1: float, lon2: float) -> bool: """ Check if the antimeridian (180th meridian) is between two longitude points Parameters ---------- lon1: float The first longitude. lon2: float The second longitude Returns ------- A bool representing whether two longs contain the 180th meridian. """ lon1_clipped = max(-180.0, min(lon1, 180)) lon2_clipped = max(-180.0, min(lon2, 180)) lon1_converted = (lon1_clipped + 360) % 360 lon2_converted = (lon2_clipped + 360) % 360 ws = [lon1_converted, lon2_converted] sorted(ws) return ws[0] < 180 < ws[1] def meters_per_unit(crs: CRS) -> float: """ Coefficient to convert the coordinate reference system (CRS) units into meters (metersPerUnit). From note g in http://docs.opengeospatial.org/is/17-083r2/17-083r2.html#table_2: If the CRS uses meters as units of measure for the horizontal dimensions, then metersPerUnit=1; if it has degrees, then metersPerUnit=2pa/360 (a is the Earth maximum radius of the ellipsoid). """ unit_factors = { "metre": 1.0, "degree": 2 * math.pi * crs.ellipsoid.semi_major_metre / 360.0, "foot": 0.3048, "US survey foot": 0.30480060960121924, } unit_name = crs.axis_info[0].unit_name try: return unit_factors[unit_name] except KeyError as e: raise Exception( f"CRS {crs} with Unit Name `{unit_name}` is not supported, please fill an issue in developmentseed/morecantile" ) from e def bbox_to_feature(west: float, south: float, east: float, north: float) -> dict: """Create a GeoJSON feature from a bbox.""" return { "type": "Polygon", "coordinates": [ [[west, south], [west, north], [east, north], [east, south], [west, south]] ], } def point_in_bbox(point: Coords, bbox: BoundingBox, precision: int = 5) -> bool: """Check if a point is in a bounding box.""" return ( round(point.x, precision) >= round(bbox.left, precision) and round(point.x, precision) <= round(bbox.right, precision) and round(point.y, precision) >= round(bbox.bottom, precision) and round(point.y, precision) <= round(bbox.top, precision) ) def truncate_coordinates( lng: float, lat: float, bbox: BoundingBox ) -> tuple[float, float]: """ Truncate coordinates to a given bbox. Adapted from https://github.com/mapbox/mercantile/blob/master/mercantile/__init__.py """ if lng > bbox.right: lng = bbox.right elif lng < bbox.left: lng = bbox.left if lat > bbox.top: lat = bbox.top elif lat < bbox.bottom: lat = bbox.bottom return lng, lat def is_power_of_two(number: int) -> bool: """Check if a number is a power of 2""" return (number & (number - 1) == 0) and number != 0 def check_quadkey_support(tms: list) -> bool: """Check if a Tile Matrix Set supports quadkeys""" return all( (t.matrixWidth == t.matrixHeight) and is_power_of_two(t.matrixWidth) and ((t.matrixWidth * 2) == tms[i + 1].matrixWidth) for i, t in enumerate(tms[:-1]) ) def to_rasterio_crs(incrs: CRS): """Convert a pyproj CRS to a rasterio CRS""" from rasterio import crs from rasterio.env import GDALVersion if GDALVersion.runtime().major < 3: return crs.CRS.from_wkt(incrs.to_wkt(WktVersion.WKT1_GDAL)) else: return crs.CRS.from_wkt(incrs.to_wkt()) morecantile-7.0.3/pyproject.toml000066400000000000000000000056441514074772600167650ustar00rootroot00000000000000[project] name = "morecantile" description = "Construct and use map tile grids (a.k.a TileMatrixSet / TMS)." readme = "README.md" requires-python = ">=3.11" license = {file = "LICENSE"} authors = [ {name = "Vincent Sarago", email = "vincent@developmentseed.com"}, ] keywords = ["GIS", "TMS", "TileMatrixSet", "Map Tile"] classifiers = [ "Intended Audience :: Information Technology", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Scientific/Engineering :: GIS", ] dynamic = ["version"] dependencies = [ "attrs", "pyproj>=3.1,<4.0", "pydantic~=2.0", "click", ] [project.optional-dependencies] rasterio = [ "rasterio>=1.2.1", ] [dependency-groups] dev = [ "mercantile", "pytest", "pytest-cov", "pre-commit", ] docs = [ "mkdocs>=1.4.3", "mkdocs-material[imaging]>=9.5", "griffe-inherited-docstrings>=1.0.0", "mkdocstrings[python]>=0.25.1", "pygments", ] benchmark = [ "pytest-benchmark", ] deploy = [ "hatch", ] [project.urls] Source = "https://github.com/developmentseed/morecantile" Documentation = "https://developmentseed.org/morecantile/" [project.scripts] morecantile = "morecantile.scripts.cli:cli" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.version] path = "morecantile/__init__.py" [tool.hatch.build.targets.sdist] only-include = ["morecantile/"] [tool.hatch.build.targets.wheel] only-include = ["morecantile/"] [tool.coverage.run] branch = true parallel = true [tool.coverage.report] exclude_lines = [ "no cov", "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] [tool.isort] profile = "black" known_first_party = ["morecantile"] known_third_party = ["rasterio", "pydantic", "pyproj", "mercantile"] default_section = "THIRDPARTY" [tool.mypy] no_strict_optional = true [tool.ruff.lint] select = [ "D1", # pydocstyle errors "E", # pycodestyle errors "W", # pycodestyle warnings "F", # flake8 "C", # flake8-comprehensions "B", # flake8-bugbear ] ignore = [ "E501", # line too long, handled by black "B008", # do not perform function calls in argument defaults "B905", # ignore zip() without an explicit strict= parameter, only support with python >3.10 ] [tool.ruff.lint.per-file-ignores] "tests/*.py" = ["D1"] [tool.pytest.ini_options] filterwarnings = [ "ignore:You will likely lose important projection*:UserWarning", ] [tool.bumpversion] current_version = "7.0.3" search = "{current_version}" replace = "{new_version}" regex = false tag = true commit = true tag_name = "{new_version}" [[tool.bumpversion.files]] filename = "morecantile/__init__.py" search = '__version__ = "{current_version}"' replace = '__version__ = "{new_version}"' morecantile-7.0.3/tests/000077500000000000000000000000001514074772600152025ustar00rootroot00000000000000morecantile-7.0.3/tests/__init__.py000066400000000000000000000000371514074772600173130ustar00rootroot00000000000000"""morecantile tests suite.""" morecantile-7.0.3/tests/benchmarks.py000066400000000000000000000023021514074772600176660ustar00rootroot00000000000000"""Morecantile benchmark.""" import pytest import morecantile from morecantile.commons import BoundingBox tms = morecantile.tms.get("WebMercatorQuad") # Test tiles from https://github.com/jessekrubin/utiles/blob/ea58b9a017a2e3528f03cc20f16ef531737b863f/utiles-pyo3/bench/test_bench.py TEST_TILES = ( (0, 0, 0), (1, 0, 1), (1, 1, 1), (1, 40, 7), (486, 332, 10), # HIGH ZOOM (486, 332, 20), # OUTSIDE TMS Range (486, 332, 30), ) @pytest.mark.parametrize("tile", TEST_TILES) def test_bounds(tile, benchmark): str_tile = "Tile(x={},y={},z={})".format(*tile) benchmark.name = f"morecantile.bounds-{str_tile}" benchmark.fullname = f"morecantile.bounds-{str_tile}" benchmark.group = "morecantile.bounds" r = benchmark(tms.bounds, *tile) assert isinstance(r, BoundingBox) @pytest.mark.parametrize("tile", TEST_TILES) def test_xy_bounds(tile, benchmark) -> None: str_tile = "Tile(x={},y={},z={})".format(*tile) benchmark.name = f"morecantile.xy_bounds-{str_tile}" benchmark.fullname = f"morecantile.xy_bounds-{str_tile}" benchmark.group = "morecantile.xy_bounds" r = benchmark(tms.xy_bounds, *tile) assert isinstance(r, BoundingBox) morecantile-7.0.3/tests/fixtures/000077500000000000000000000000001514074772600170535ustar00rootroot00000000000000morecantile-7.0.3/tests/fixtures/v1_tms/000077500000000000000000000000001514074772600202645ustar00rootroot00000000000000morecantile-7.0.3/tests/fixtures/v1_tms/CanadianNAD83_LCC.json000066400000000000000000000230711514074772600240370ustar00rootroot00000000000000{ "type": "TileMatrixSetType", "title": "Lambert conformal conic NAD83 for Canada", "identifier": "CanadianNAD83_LCC", "boundingBox": { "type": "BoundingBoxType", "crs": "http://www.opengis.net/def/crs/EPSG/0/3978", "lowerCorner": [ -7786476.885838887, -5153821.09213678 ], "upperCorner": [ 7148753.233541353, 7928343.534071138 ] }, "supportedCRS": "http://www.opengis.net/def/crs/EPSG/0/3978", "tileMatrix": [ { "type": "TileMatrixType", "identifier": "0", "scaleDenominator": 145000000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 5, "matrixHeight": 5 }, { "type": "TileMatrixType", "identifier": "1", "scaleDenominator": 85000000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "type": "TileMatrixType", "identifier": "2", "scaleDenominator": 50000000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 13, "matrixHeight": 14 }, { "type": "TileMatrixType", "identifier": "3", "scaleDenominator": 30000000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 21, "matrixHeight": 22 }, { "type": "TileMatrixType", "identifier": "4", "scaleDenominator": 17500000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 36, "matrixHeight": 38 }, { "type": "TileMatrixType", "identifier": "5", "scaleDenominator": 10000000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 62, "matrixHeight": 66 }, { "type": "TileMatrixType", "identifier": "6", "scaleDenominator": 6000000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 103, "matrixHeight": 110 }, { "type": "TileMatrixType", "identifier": "7", "scaleDenominator": 3500000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 177, "matrixHeight": 188 }, { "type": "TileMatrixType", "identifier": "8", "scaleDenominator": 2000000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 309, "matrixHeight": 329 }, { "type": "TileMatrixType", "identifier": "9", "scaleDenominator": 1200000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 515, "matrixHeight": 548 }, { "type": "TileMatrixType", "identifier": "10", "scaleDenominator": 700000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 882, "matrixHeight": 938 }, { "type": "TileMatrixType", "identifier": "11", "scaleDenominator": 420000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1470, "matrixHeight": 1563 }, { "type": "TileMatrixType", "identifier": "12", "scaleDenominator": 250000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2469, "matrixHeight": 2626 }, { "type": "TileMatrixType", "identifier": "13", "scaleDenominator": 145000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4257, "matrixHeight": 4528 }, { "type": "TileMatrixType", "identifier": "14", "scaleDenominator": 85000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 7262, "matrixHeight": 7723 }, { "type": "TileMatrixType", "identifier": "15", "scaleDenominator": 50000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 12344, "matrixHeight": 13130 }, { "type": "TileMatrixType", "identifier": "16", "scaleDenominator": 30000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 20574, "matrixHeight": 21882 }, { "type": "TileMatrixType", "identifier": "17", "scaleDenominator": 17500, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 35269, "matrixHeight": 37512 }, { "type": "TileMatrixType", "identifier": "18", "scaleDenominator": 10000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 61720, "matrixHeight": 65646 }, { "type": "TileMatrixType", "identifier": "19", "scaleDenominator": 6000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 102866, "matrixHeight": 109409 }, { "type": "TileMatrixType", "identifier": "20", "scaleDenominator": 3500, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 176341, "matrixHeight": 187558 }, { "type": "TileMatrixType", "identifier": "21", "scaleDenominator": 2000, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 308596, "matrixHeight": 328227 }, { "type": "TileMatrixType", "identifier": "22", "scaleDenominator": 1200, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 514327, "matrixHeight": 547044 }, { "type": "TileMatrixType", "identifier": "23", "scaleDenominator": 700, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 881703, "matrixHeight": 937790 }, { "type": "TileMatrixType", "identifier": "24", "scaleDenominator": 420, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1469505, "matrixHeight": 1562983 }, { "type": "TileMatrixType", "identifier": "25", "scaleDenominator": 250, "topLeftCorner": [ -34655800, 39310000 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2468768, "matrixHeight": 2625811 } ] } morecantile-7.0.3/tests/fixtures/v1_tms/UPSAntarcticWGS84Quad.json000066400000000000000000000233051514074772600250320ustar00rootroot00000000000000{ "type": "TileMatrixSetType", "title": "Universal Polar Stereographic WGS 84 Quad for Antarctic", "identifier": "UPSAntarcticWGS84Quad", "boundingBox": { "type": "BoundingBoxType", "crs": "http://www.opengis.net/def/crs/EPSG/0/5042", "lowerCorner": [ -14440759.350252, -14440759.350252 ], "upperCorner": [ 18440759.350252, 18440759.350252 ] }, "supportedCRS": "http://www.opengis.net/def/crs/EPSG/0/5042", "tileMatrix": [ { "type": "TileMatrixType", "identifier": "0", "scaleDenominator": 458726544.4, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1 }, { "type": "TileMatrixType", "identifier": "1", "scaleDenominator": 229363272.2, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2 }, { "type": "TileMatrixType", "identifier": "2", "scaleDenominator": 114681636.1, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4 }, { "type": "TileMatrixType", "identifier": "3", "scaleDenominator": 57340818.05, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "type": "TileMatrixType", "identifier": "4", "scaleDenominator": 28670409.02, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 16 }, { "type": "TileMatrixType", "identifier": "5", "scaleDenominator": 14335204.51, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 32 }, { "type": "TileMatrixType", "identifier": "6", "scaleDenominator": 7167602.256, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 64 }, { "type": "TileMatrixType", "identifier": "7", "scaleDenominator": 3583801.128, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 128 }, { "type": "TileMatrixType", "identifier": "8", "scaleDenominator": 1791900.564, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 256 }, { "type": "TileMatrixType", "identifier": "9", "scaleDenominator": 895950.282, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 512 }, { "type": "TileMatrixType", "identifier": "10", "scaleDenominator": 447975.141, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 1024 }, { "type": "TileMatrixType", "identifier": "11", "scaleDenominator": 223987.5705, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 2048 }, { "type": "TileMatrixType", "identifier": "12", "scaleDenominator": 111993.7852, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 4096 }, { "type": "TileMatrixType", "identifier": "13", "scaleDenominator": 55996.89262, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 8192 }, { "type": "TileMatrixType", "identifier": "14", "scaleDenominator": 27998.44631, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 16384 }, { "type": "TileMatrixType", "identifier": "15", "scaleDenominator": 13999.22316, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 32768 }, { "type": "TileMatrixType", "identifier": "16", "scaleDenominator": 6999.611578, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 65536 }, { "type": "TileMatrixType", "identifier": "17", "scaleDenominator": 3499.805789, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 131072 }, { "type": "TileMatrixType", "identifier": "18", "scaleDenominator": 1749.902894, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 262144 }, { "type": "TileMatrixType", "identifier": "19", "scaleDenominator": 874.9514472, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 524288 }, { "type": "TileMatrixType", "identifier": "20", "scaleDenominator": 437.4757236, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 1048576 }, { "type": "TileMatrixType", "identifier": "21", "scaleDenominator": 218.7378618, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 2097152 }, { "type": "TileMatrixType", "identifier": "22", "scaleDenominator": 109.3689309, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 4194304 }, { "type": "TileMatrixType", "identifier": "23", "scaleDenominator": 54.68446545, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 8388608 }, { "type": "TileMatrixType", "identifier": "24", "scaleDenominator": 27.34223273, "topLeftCorner": [ -14440759.350252, 18440759.350252 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16777216, "matrixHeight": 16777216 } ] } morecantile-7.0.3/tests/fixtures/v1_tms/WebMercatorQuad.json000066400000000000000000000236711514074772600242150ustar00rootroot00000000000000{ "type": "TileMatrixSetType", "title": "Google Maps Compatible for the World", "identifier": "WebMercatorQuad", "boundingBox": { "type": "BoundingBoxType", "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", "lowerCorner": [ -20037508.3427892, -20037508.3427892 ], "upperCorner": [ 20037508.3427892, 20037508.3427892 ] }, "supportedCRS": "http://www.opengis.net/def/crs/EPSG/0/3857", "wellKnownScaleSet": "http://www.opengis.net/def/wkss/OGC/1.0/GoogleMapsCompatible", "tileMatrix": [ { "type": "TileMatrixType", "identifier": "0", "scaleDenominator": 559082264.028717, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1 }, { "type": "TileMatrixType", "identifier": "1", "scaleDenominator": 279541132.014358, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2, "matrixHeight": 2 }, { "type": "TileMatrixType", "identifier": "2", "scaleDenominator": 139770566.007179, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4, "matrixHeight": 4 }, { "type": "TileMatrixType", "identifier": "3", "scaleDenominator": 69885283.0035897, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8, "matrixHeight": 8 }, { "type": "TileMatrixType", "identifier": "4", "scaleDenominator": 34942641.5017948, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16, "matrixHeight": 16 }, { "type": "TileMatrixType", "identifier": "5", "scaleDenominator": 17471320.7508974, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32, "matrixHeight": 32 }, { "type": "TileMatrixType", "identifier": "6", "scaleDenominator": 8735660.37544871, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 64, "matrixHeight": 64 }, { "type": "TileMatrixType", "identifier": "7", "scaleDenominator": 4367830.18772435, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 128, "matrixHeight": 128 }, { "type": "TileMatrixType", "identifier": "8", "scaleDenominator": 2183915.09386217, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 256, "matrixHeight": 256 }, { "type": "TileMatrixType", "identifier": "9", "scaleDenominator": 1091957.54693108, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 512, "matrixHeight": 512 }, { "type": "TileMatrixType", "identifier": "10", "scaleDenominator": 545978.773465544, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1024, "matrixHeight": 1024 }, { "type": "TileMatrixType", "identifier": "11", "scaleDenominator": 272989.386732772, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2048, "matrixHeight": 2048 }, { "type": "TileMatrixType", "identifier": "12", "scaleDenominator": 136494.693366386, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4096, "matrixHeight": 4096 }, { "type": "TileMatrixType", "identifier": "13", "scaleDenominator": 68247.346683193, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8192, "matrixHeight": 8192 }, { "type": "TileMatrixType", "identifier": "14", "scaleDenominator": 34123.6733415964, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16384, "matrixHeight": 16384 }, { "type": "TileMatrixType", "identifier": "15", "scaleDenominator": 17061.8366707982, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 32768, "matrixHeight": 32768 }, { "type": "TileMatrixType", "identifier": "16", "scaleDenominator": 8530.91833539913, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 65536, "matrixHeight": 65536 }, { "type": "TileMatrixType", "identifier": "17", "scaleDenominator": 4265.45916769956, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 131072, "matrixHeight": 131072 }, { "type": "TileMatrixType", "identifier": "18", "scaleDenominator": 2132.72958384978, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 262144, "matrixHeight": 262144 }, { "type": "TileMatrixType", "identifier": "19", "scaleDenominator": 1066.36479192489, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 524288, "matrixHeight": 524288 }, { "type": "TileMatrixType", "identifier": "20", "scaleDenominator": 533.182395962445, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1048576, "matrixHeight": 1048576 }, { "type": "TileMatrixType", "identifier": "21", "scaleDenominator": 266.591197981222, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 2097152, "matrixHeight": 2097152 }, { "type": "TileMatrixType", "identifier": "22", "scaleDenominator": 133.295598990611, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 4194304, "matrixHeight": 4194304 }, { "type": "TileMatrixType", "identifier": "23", "scaleDenominator": 66.6477994953056, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 8388608, "matrixHeight": 8388608 }, { "type": "TileMatrixType", "identifier": "24", "scaleDenominator": 33.3238997476528, "topLeftCorner": [ -20037508.3427892, 20037508.3427892 ], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 16777216, "matrixHeight": 16777216 } ] } morecantile-7.0.3/tests/test_cli.py000066400000000000000000000217611514074772600173710ustar00rootroot00000000000000"""Tests of the morecantile CLI""" import json import pytest from click.testing import CliRunner from morecantile.scripts.cli import cli def test_cli_shapes(): """ Test shapes. From https://github.com/mapbox/mercantile/blob/master/tests/test_cli.py """ runner = CliRunner() result = runner.invoke(cli, ["shapes", "--precision", "6"], "[106, 193, 9]") assert result.exit_code == 0 assert ( result.output == '{"bbox": [-105.46875, 39.909736, -104.765625, 40.446947], "geometry": {"coordinates": [[[-105.46875, 39.909736], [-105.46875, 40.446947], [-104.765625, 40.446947], [-104.765625, 39.909736], [-105.46875, 39.909736]]], "type": "Polygon"}, "id": "(106, 193, 9)", "properties": {"title": "XYZ tile (106, 193, 9)", "tms": "WebMercatorQuad", "tms_crs": "http://www.opengis.net/def/crs/EPSG/0/3857"}, "type": "Feature"}\n' ) result = runner.invoke( cli, ["shapes", "--precision", "6", "--geographic"], "[106, 193, 9]" ) assert result.exit_code == 0 assert ( result.output == '{"bbox": [-105.46875, 39.909736, -104.765625, 40.446947], "geometry": {"coordinates": [[[-105.46875, 39.909736], [-105.46875, 40.446947], [-104.765625, 40.446947], [-104.765625, 39.909736], [-105.46875, 39.909736]]], "type": "Polygon"}, "id": "(106, 193, 9)", "properties": {"title": "XYZ tile (106, 193, 9)", "tms": "WebMercatorQuad", "tms_crs": "http://www.opengis.net/def/crs/EPSG/0/3857"}, "type": "Feature"}\n' ) # With TMS's CRS with pytest.warns(UserWarning): result = runner.invoke( cli, ["shapes", "--precision", "6", "--projected"], "[106, 193, 9]" ) assert result.exit_code == 0 feature = json.loads(result.output) assert feature["crs"] # geographic CRS (non WGS84) with pytest.warns(UserWarning): result = runner.invoke( cli, ["shapes", "--precision", "6", "--crs", "epsg:4150"], "[106, 193, 9]" ) assert result.exit_code == 0 feature = json.loads(result.output) assert feature["crs"] # tile as arg result = runner.invoke(cli, ["shapes", "[106, 193, 9]", "--precision", "6"]) assert result.exit_code == 0 assert ( result.output == '{"bbox": [-105.46875, 39.909736, -104.765625, 40.446947], "geometry": {"coordinates": [[[-105.46875, 39.909736], [-105.46875, 40.446947], [-104.765625, 40.446947], [-104.765625, 39.909736], [-105.46875, 39.909736]]], "type": "Polygon"}, "id": "(106, 193, 9)", "properties": {"title": "XYZ tile (106, 193, 9)", "tms": "WebMercatorQuad", "tms_crs": "http://www.opengis.net/def/crs/EPSG/0/3857"}, "type": "Feature"}\n' ) # buffer result = runner.invoke( cli, ["shapes", "[106, 193, 9]", "--buffer", "1.0", "--precision", "6"] ) assert result.exit_code == 0 assert ( result.output == '{"bbox": [-106.46875, 38.909736, -103.765625, 41.446947], "geometry": {"coordinates": [[[-106.46875, 38.909736], [-106.46875, 41.446947], [-103.765625, 41.446947], [-103.765625, 38.909736], [-106.46875, 38.909736]]], "type": "Polygon"}, "id": "(106, 193, 9)", "properties": {"title": "XYZ tile (106, 193, 9)", "tms": "WebMercatorQuad", "tms_crs": "http://www.opengis.net/def/crs/EPSG/0/3857"}, "type": "Feature"}\n' ) # Output is compact result = runner.invoke(cli, ["shapes", "--compact"], "[106, 193, 9]") assert result.exit_code == 0 assert '"type":"Feature"' in result.output.strip() # Output is indented result = runner.invoke(cli, ["shapes", "--indent", "8"], "[106, 193, 9]") assert result.exit_code == 0 assert ' "type": "Feature"' in result.output.strip() # Shapes are collected into a feature collection result = runner.invoke(cli, ["shapes", "--collect", "--feature"], "[106, 193, 9]") assert result.exit_code == 0 assert "FeatureCollection" in result.output # geojson is in WebMercator Projection with pytest.warns(UserWarning): result = runner.invoke( cli, ["shapes", "[106, 193, 9]", "--extents", "--projected", "--precision", "3"], ) assert result.exit_code == 0 assert result.output == "-11740727.545 4852834.052 -11662456.028 4931105.569\n" with pytest.warns(UserWarning): # JSON text sequences of bboxes are output. result = runner.invoke( cli, [ "shapes", "[106, 193, 9]", "--seq", "--bbox", "--projected", "--precision", "3", ], ) assert result.exit_code == 0 assert ( result.output == "\x1e\n[-11740727.545, 4852834.052, -11662456.028, 4931105.569]\n" ) # shapes_props_fid result = runner.invoke( cli, [ "shapes", '{"tile": [106, 193, 9], "properties": {"title": "foo"}, "id": "42"}', ], ) assert result.exit_code == 0 assert '"title": "foo"' in result.output assert '"id": "42"' in result.output def test_cli_shapesWGS84(): """Test shapes with other projection.""" runner = CliRunner() result = runner.invoke( cli, ["shapes", "--precision", "6", "--identifier", "WorldMercatorWGS84Quad"], "[106, 193, 9]", ) assert result.exit_code == 0 assert ( result.output == '{"bbox": [-105.46875, 40.099155, -104.765625, 40.636956], "geometry": {"coordinates": [[[-105.46875, 40.099155], [-105.46875, 40.636956], [-104.765625, 40.636956], [-104.765625, 40.099155], [-105.46875, 40.099155]]], "type": "Polygon"}, "id": "(106, 193, 9)", "properties": {"title": "XYZ tile (106, 193, 9)", "tms": "WorldMercatorWGS84Quad", "tms_crs": "http://www.opengis.net/def/crs/EPSG/0/3395"}, "type": "Feature"}\n' ) def test_cli_tiles_ok(): """Test tile with correct bounds.""" runner = CliRunner() result = runner.invoke(cli, ["tiles", "14"], "[-105, 39.99, -104.99, 40]") assert result.exit_code == 0 assert result.output == "[3413, 6202, 14]\n[3413, 6203, 14]\n" def test_cli_tiles_bad_bounds(): """Bounds of len 3 are bad.""" runner = CliRunner() result = runner.invoke(cli, ["tiles", "14"], "[-105, 39.99, -104.99]") assert result.exit_code == 2 def test_cli_tiles_multi_bounds(): """A LF-delimited sequence can be used as input.""" runner = CliRunner() result = runner.invoke( cli, ["tiles", "14"], "[-105, 39.99, -104.99, 40]\n[-105, 39.99, -104.99, 40]" ) assert result.exit_code == 0 assert len(result.output.strip().split("\n")) == 4 def test_cli_tiles_multi_bounds_seq(): """A JSON text sequence can be used as input.""" runner = CliRunner() result = runner.invoke( cli, ["tiles", "14"], "\x1e\n[-105, 39.99, -104.99, 40]\n\x1e\n[-105, 39.99, -104.99, 40]", ) assert result.exit_code == 0 assert len(result.output.strip().split("\n")) == 4 def test_cli_tiles_implicit_stdin(): """stdin.""" runner = CliRunner() result = runner.invoke(cli, ["tiles", "14"], "[-105, 39.99, -104.99, 40]") assert result.exit_code == 0 assert result.output == "[3413, 6202, 14]\n[3413, 6203, 14]\n" def test_cli_tiles_arg(): """tiles arg.""" runner = CliRunner() result = runner.invoke(cli, ["tiles", "14", "[-105, 39.99, -104.99, 40]"]) assert result.exit_code == 0 assert result.output == "[3413, 6202, 14]\n[3413, 6203, 14]\n" def test_cli_tiles_geosjon(): """Geojson input.""" collection = '{"features": [{"geometry": {"coordinates": [[[-105.46875, 39.909736], [-105.46875, 40.446947], [-104.765625, 40.446947], [-104.765625, 39.909736], [-105.46875, 39.909736]]], "type": "Polygon"}, "id": "(106, 193, 9)", "properties": {"title": "XYZ tile (106, 193, 9)"}, "type": "Feature"}], "type": "FeatureCollection"}' runner = CliRunner() result = runner.invoke(cli, ["tiles", "9"], collection) assert result.exit_code == 0 assert result.output == "[106, 193, 9]\n[106, 194, 9]\n" def test_cli_strict_overlap_contain(): """Input from shapes.""" runner = CliRunner() result1 = runner.invoke(cli, ["shapes"], "[2331,1185,12]") assert result1.exit_code == 0 result2 = runner.invoke(cli, ["tiles", "12"], result1.output) assert result2.exit_code == 0 assert result2.output == "[2331, 1185, 12]\n" def test_cli_tiles_seq(): """return a sequence of tiles.""" runner = CliRunner() result = runner.invoke(cli, ["tiles", "14", "--seq"], "[14.0859, 5.798]") assert result.exit_code == 0 assert result.output == "\x1e\n[8833, 7927, 14]\n" def test_cli_tiles_points(): """Create tile from a point.""" runner = CliRunner() result = runner.invoke(cli, ["tiles", "14"], "[14.0859, 5.798]") assert result.exit_code == 0 assert result.output == "[8833, 7927, 14]\n" result = runner.invoke( cli, ["tiles", "14"], '{"type":"geometry","coordinates":[14.0859, 5.798]}' ) assert result.exit_code == 0 assert result.output == "[8833, 7927, 14]\n" morecantile-7.0.3/tests/test_mercantile_conform.py000066400000000000000000000016031514074772600224610ustar00rootroot00000000000000"""Test Conformance with Mercantile.""" from random import sample import mercantile import pytest import morecantile tms = morecantile.tms.get("WebMercatorQuad") @pytest.mark.parametrize("zoom", range(0, 20)) def test_get_tile(zoom: int): """Make sure mercantile and morecantile returns the same thing.""" tile = mercantile.tile(-10, 10, zoom=zoom) morecantile_tile = tms.tile(-10, 10, zoom=zoom) assert tile == morecantile_tile @pytest.mark.parametrize("zoom", range(0, 20)) def test_bounds(zoom: int): """Make sure mercantile and morecantile returns the same thing.""" # get random x,y index x = sample(range(0, tms.matrix(zoom).matrixWidth), 1)[0] y = sample(range(0, tms.matrix(zoom).matrixHeight), 1)[0] for a, b in zip( mercantile.xy_bounds(x, y, zoom), tms.xy_bounds(morecantile.Tile(x, y, zoom)) ): assert round(a - b, 6) == 0 morecantile-7.0.3/tests/test_models.py000066400000000000000000001012371514074772600201020ustar00rootroot00000000000000"""Test TileMatrixSet model.""" import json import os import random from collections.abc import Iterable import pyproj import pytest from pydantic import ValidationError import morecantile from morecantile.commons import BoundingBox, Coords, Tile from morecantile.errors import InvalidIdentifier from morecantile.models import CRS, CRSWKT, CRSUri, TileMatrix, TileMatrixSet data_dir = os.path.join(os.path.dirname(morecantile.__file__), "data") tilesets = [ os.path.join(data_dir, f) for f in os.listdir(data_dir) if f.endswith(".json") ] tms_v1_dir = os.path.join(os.path.dirname(__file__), "fixtures", "v1_tms") @pytest.mark.parametrize("tileset", tilesets) def test_tile_matrix_set(tileset): """Load TileMatrixSet in models.""" # Confirm model validation is working with open(tileset, "r") as f: ts = TileMatrixSet.model_validate_json(f.read()) # This would fail if `crs` isn't supported by PROJ assert isinstance(ts.crs._pyproj_crs, pyproj.CRS) assert isinstance(ts.geographic_crs, pyproj.CRS) assert repr(ts) @pytest.mark.parametrize("tileset", tilesets) def test_geographic_crs_bbox(tileset): """check that geographic bounds are correct.""" with open(tileset, "r") as f: ts = TileMatrixSet.model_validate_json(f.read()) if not pyproj.CRS.from_epsg(4326) == ts.geographic_crs: _to_geographic = pyproj.Transformer.from_crs( ts.crs._pyproj_crs, pyproj.CRS.from_epsg(4326), always_xy=True ) bbox = _to_geographic.transform_bounds(*ts.xy_bbox, densify_pts=21) assert bbox == ts.bbox def test_tile_matrix_iter(): """Test iterator""" tms = morecantile.tms.get("WebMercatorQuad") assert isinstance(tms, Iterable) for matrix in tms: assert isinstance(matrix, TileMatrix) def test_tile_matrix_order(): """Test matrix order""" tms = morecantile.tms.get("WebMercatorQuad") matrices = tms.tileMatrices[:] random.shuffle(matrices) tms_ordered = TileMatrixSet( title=tms.title, id=tms.id, crs=tms.crs, tileMatrices=matrices, ) # Confirm sort assert [matrix.id for matrix in tms.tileMatrices] == [ matrix.id for matrix in tms_ordered.tileMatrices ] # Confirm sort direction assert int(tms_ordered.tileMatrices[-1].id) > int(tms_ordered.tileMatrices[0].id) def test_invalid_tms(): """should raise an error when tms name is not found.""" with pytest.raises(InvalidIdentifier): morecantile.tms.get("ANotValidName") @pytest.mark.parametrize( "name,result", [ ("LINZAntarticaMapTilegrid", False), ("EuropeanETRS89_LAEAQuad", True), ("CanadianNAD83_LCC", False), ("UPSArcticWGS84Quad", True), ("NZTM2000Quad", True), ("UTM31WGS84Quad", False), ("UPSAntarcticWGS84Quad", True), ("WorldMercatorWGS84Quad", True), ("WGS1984Quad", False), ("WorldCRS84Quad", False), ("WebMercatorQuad", True), ("CDB1GlobalGrid", False), ("GNOSISGlobalGrid", False), ], ) def test_quadkey_support(name, result): """test for Quadkey support.""" tms = morecantile.tms.get(name) assert tms.is_quadtree == result def test_quadkey(): """Test tile to quadkey.""" tms = morecantile.tms.get("WebMercatorQuad") expected = "0313102310" assert tms.quadkey(486, 332, 10) == expected def test_quadkey_to_tile(): """Test quadkey to tile.""" tms = morecantile.tms.get("WebMercatorQuad") qk = "0313102310" expected = Tile(486, 332, 10) assert tms.quadkey_to_tile(qk) == expected def test_empty_quadkey_to_tile(): """Empty qk should give tile 0,0,0.""" tms = morecantile.tms.get("WebMercatorQuad") qk = "" expected = Tile(0, 0, 0) assert tms.quadkey_to_tile(qk) == expected def test_quadkey_failure(): """makde sure we don't support stupid quadkeys.""" tms = morecantile.tms.get("WebMercatorQuad") with pytest.raises(morecantile.errors.QuadKeyError): tms.quadkey_to_tile("lolwut") def test_findMatrix(): """Should raise an error when TileMatrix is not found.""" tms = morecantile.tms.get("WebMercatorQuad") m = tms.matrix(0) assert m.id == "0" with pytest.warns(UserWarning): tms.matrix(26) def test_Custom(): """Create custom TMS grid.""" tms = morecantile.tms.get("WebMercatorQuad") # Web Mercator Extent extent = (-20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892) custom_tms = TileMatrixSet.custom(extent, pyproj.CRS.from_epsg(3857)) assert tms.tile(20.0, 15.0, 5) == custom_tms.tile(20.0, 15.0, 5) wmMat = tms.matrix(5) cusMat = custom_tms.matrix(5) assert wmMat.matrixWidth == cusMat.matrixWidth assert wmMat.matrixHeight == cusMat.matrixHeight assert round(wmMat.scaleDenominator, 6) == round(cusMat.scaleDenominator, 6) assert round(wmMat.pointOfOrigin[0], 6) == round(cusMat.pointOfOrigin[0], 6) extent = (-180.0, -85.051128779806, 180.0, 85.051128779806) custom_tms = TileMatrixSet.custom( extent, pyproj.CRS.from_epsg(3857), extent_crs=pyproj.CRS.from_epsg(4326) ) assert tms.tile(20.0, 15.0, 5) == custom_tms.tile(20.0, 15.0, 5) wmMat = tms.matrix(5) cusMat = custom_tms.matrix(5) assert wmMat.matrixWidth == cusMat.matrixWidth assert wmMat.matrixHeight == cusMat.matrixHeight assert round(wmMat.scaleDenominator, 6) == round(cusMat.scaleDenominator, 6) assert round(wmMat.pointOfOrigin[0], 6) == round(cusMat.pointOfOrigin[0], 6) extent = (-20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892) custom_tms = TileMatrixSet.custom(extent, pyproj.CRS.from_epsg(3857)) assert isinstance(custom_tms.geographic_crs, pyproj.CRS) assert custom_tms.geographic_crs == pyproj.CRS.from_epsg(4326) extent = (-20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892) custom_tms = TileMatrixSet.custom(extent, pyproj.CRS.from_epsg(3857)) assert isinstance(custom_tms.geographic_crs, pyproj.CRS) def test_custom_tms_bounds_epsg4326(): """Check bounds with epsg4326.""" custom_tms = TileMatrixSet.custom((-120, 30, -110, 40), pyproj.CRS.from_epsg(4326)) assert custom_tms.xy_bbox == (-120, 30, -110, 40) assert custom_tms.bbox == (-120, 30, -110, 40) assert custom_tms.xy_bounds(0, 0, 0) == (-120, 30, -110, 40) assert custom_tms.bounds(0, 0, 0) == (-120, 30, -110, 40) # When using `from_user_input`, `morecantile.models.crs_axis_inverted` should return the valid result. def test_custom_tms_bounds_user_crs(): """Check bounds with epsg4326.""" custom_tms = TileMatrixSet.custom( (-120, 30, -110, 40), pyproj.CRS.from_epsg(4326), ) assert custom_tms.xy_bbox == (-120, 30, -110, 40) assert custom_tms.bbox == (-120, 30, -110, 40) assert custom_tms.xy_bounds(0, 0, 0) == (-120, 30, -110, 40) assert custom_tms.bounds(0, 0, 0) == (-120, 30, -110, 40) def test_custom_tms_decimation(): """Check bounds with epsg6342 and custom decimation base.""" extent = (238170, 4334121, 377264, 4473215) left, bottom, right, top = extent for decimation_base in [2, 3, 4, 5]: custom_tms = TileMatrixSet.custom( extent, pyproj.CRS.from_epsg(6342), decimation_base=decimation_base, ) if decimation_base == 2: assert custom_tms.is_quadtree else: assert not custom_tms.is_quadtree for zoom in [0, 1, 2, 3]: tile_width = (right - left) / decimation_base**zoom tile_height = (top - bottom) / decimation_base**zoom expected = (left, top - tile_height, left + tile_width, top) tile_bounds = custom_tms.xy_bounds(0, 0, zoom) for a, b in zip(expected, tile_bounds): assert round(a - b, 4) == 0 def test_nztm_quad_is_quad(): """Test NZTM2000Quad.""" tms = morecantile.tms.get("NZTM2000Quad") bound = tms.xy_bounds(morecantile.Tile(0, 0, 0)) expected = (-3260586.7284, 419435.9938, 6758167.443, 10438190.1652) for a, b in zip(expected, bound): assert round(a - b, 4) == 0 # NZTM2000Quad should use all the WebMercatorQuad zoom scales def test_nztm_quad_scales(): """Test NZTM2000Quad.""" nztm_tms = morecantile.tms.get("NZTM2000Quad") google_tms = morecantile.tms.get("WebMercatorQuad") for z in range(2, nztm_tms.maxzoom + 2): assert ( round( google_tms.matrix(z).scaleDenominator - nztm_tms.matrix(z - 2).scaleDenominator, 4, ) == 0 ) def test_InvertedLatLonGrids(): """Check Inverted LatLon grids.""" tms = morecantile.tms.get("LINZAntarticaMapTilegrid") assert tms.xy_bbox == ( -918457.73, -22441670.269999996, 28441670.269999996, 6918457.73, ) def test_zoom_for_res(): """Get TMS zoom level corresponding to a specific resolution.""" tms = morecantile.tms.get("WebMercatorQuad") # native resolution of zoom 7 is 1222.9924525628178 # native resolution of zoom 8 is 611.4962262814075 assert tms.zoom_for_res(612.0) == 8 assert tms.zoom_for_res(612.0, zoom_level_strategy="lower") == 7 assert tms.zoom_for_res(612.0, zoom_level_strategy="upper") == 8 assert tms.zoom_for_res(610.0) == 8 # native resolution of zoom 24 is 0.009330691929342784 assert tms.zoom_for_res(0.0001) == 24 # theoritical resolution of zoom 25 is 0.004665345964671392 with pytest.warns(UserWarning): assert tms.zoom_for_res(0.0001, max_z=25) == 25 # minzoom greater than 0 crs = pyproj.CRS.from_epsg(3857) extent = [-20026376.39, -20048966.10, 20026376.39, 20048966.10] tms = morecantile.TileMatrixSet.custom( extent, crs, id="MyCustomTmsEPSG3857", minzoom=6 ) assert tms.zoom_for_res(10) == 14 assert tms.zoom_for_res(5000) == 6 def test_schema(): """Translate Model to Schema.""" tms = morecantile.tms.get("WebMercatorQuad") assert tms.model_json_schema() assert tms.model_dump_json(exclude_none=True) assert tms.model_dump(exclude_none=True) crs = pyproj.CRS.from_proj4( "+proj=stere +lat_0=90 +lon_0=0 +k=2 +x_0=0 +y_0=0 +R=3396190 +units=m +no_defs" ) extent = [-13584760.000, -13585240.000, 13585240.000, 13584760.000] tms = morecantile.TileMatrixSet.custom(extent, crs, id="MarsNPolek2MOLA5k") assert tms.model_json_schema() assert tms.model_dump(exclude_none=True) json_doc = json.loads(tms.model_dump_json(exclude_none=True)) assert json_doc["crs"] == "http://www.opengis.net/def/crs/IAU/2015/49930" crs = pyproj.CRS.from_epsg(3031) extent = [-948.75, -543592.47, 5817.41, -3333128.95] # From https:///epsg.io/3031 tms = morecantile.TileMatrixSet.custom(extent, crs, id="MyCustomTmsEPSG3031") assert tms.model_json_schema() assert tms.model_dump_json(exclude_none=True) json_doc = json.loads(tms.model_dump_json(exclude_none=True)) assert json_doc["crs"] == "http://www.opengis.net/def/crs/EPSG/0/3031" def test_mars_tms(): """The Mars global mercator scheme should broadly align with the Earth Web Mercator CRS, despite the different planetary radius and scale. """ MARS2000_SPHERE = pyproj.CRS.from_proj4("+proj=longlat +R=3396190 +no_defs") MARS_MERCATOR = pyproj.CRS.from_proj4( "+proj=merc +R=3396190 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +no_defs" ) # same boundaries as Earth mercator mars_tms = TileMatrixSet.custom( [ -179.9999999999996, -85.05112877980656, 179.9999999999996, 85.05112877980656, ], MARS_MERCATOR, extent_crs=MARS2000_SPHERE, title="Web Mercator Mars", ) assert mars_tms.geographic_crs == MARS2000_SPHERE pos = (35, 40, 3) mars_tile = mars_tms.tile(*pos) mercator_tms = morecantile.tms.get("WebMercatorQuad") earth_tile = mercator_tms.tile(*pos) assert mars_tile.x == earth_tile.x assert mars_tile.y == earth_tile.y assert mars_tile.z == earth_tile.z == 3 _to_geographic = pyproj.Transformer.from_crs( mars_tms.crs._pyproj_crs, MARS2000_SPHERE, always_xy=True ) bbox = _to_geographic.transform_bounds(*mars_tms.xy_bbox, densify_pts=21) assert bbox == mars_tms.bbox def test_mars_local_tms(): """Local TMS using Mars CRS""" MARS2000_SPHERE = pyproj.CRS.from_proj4("+proj=longlat +R=3396190 +no_defs") # A transverse mercator projection for the landing site of the Perseverance rover. SYRTIS_TM = pyproj.CRS.from_proj4( "+proj=tmerc +lat_0=17 +lon_0=76.5 +k=0.9996 +x_0=0 +y_0=0 +a=3396190 +b=3376200 +units=m +no_defs" ) # 100km grid centered on 17N, 76.5E syrtis_tms = TileMatrixSet.custom( [-5e5, -5e5, 5e5, 5e5], SYRTIS_TM, title="Web Mercator Mars", ) assert SYRTIS_TM == syrtis_tms.crs._pyproj_crs assert syrtis_tms.geographic_crs assert syrtis_tms.model_dump(mode="json") center = syrtis_tms.ul(1, 1, 1) assert round(center.x, 6) == 76.5 assert round(center.y, 6) == 17 _to_geographic = pyproj.Transformer.from_crs( syrtis_tms.crs._pyproj_crs, MARS2000_SPHERE, always_xy=True ) bbox = _to_geographic.transform_bounds(*syrtis_tms.xy_bbox, densify_pts=21) assert bbox == syrtis_tms.bbox def test_mars_tms_construction(): mars_sphere_crs = pyproj.CRS.from_user_input("IAU_2015:49900") extent = [-180.0, -90.0, 180.0, 90.0] mars_tms = morecantile.TileMatrixSet.custom( extent, crs=mars_sphere_crs, id="MarsGeographicCRS", matrix_scale=[2, 1], ) assert "4326" not in mars_tms.geographic_crs.to_wkt() assert mars_tms.xy_bbox.left == pytest.approx(-180.0) assert mars_tms.xy_bbox.bottom == pytest.approx(-90.0) assert mars_tms.xy_bbox.right == pytest.approx(180.0) assert mars_tms.xy_bbox.top == pytest.approx(90.0) def test_mars_web_mercator_long_lat(): wkt_mars_web_mercator = 'PROJCRS["Mars (2015) - Sphere XY / Pseudo-Mercator",BASEGEOGCRS["Mars (2015) - Sphere",DATUM["Mars (2015) - Sphere",ELLIPSOID["Mars (2015) - Sphere",3396190,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]],ANCHOR["Viking 1 lander : 47.95137 W"]],PRIMEM["Reference Meridian",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06 S and 85.06 N."],BBOX[-85.050511287,-180,85.050511287,180]],REMARK["Use semi-major radius as sphere radius for interoperability. Source of IAU Coordinate systems: doi:10.1007/s10569-017-9805-5"]]' crs_mars_web_mercator = pyproj.CRS.from_wkt(wkt_mars_web_mercator) extent_wm = [ -10669445.554195119, -10669445.554195119, 10669445.554195119, 10669445.554195119, ] mars_tms_wm = morecantile.TileMatrixSet.custom( extent_wm, crs=crs_mars_web_mercator, id="MarsWebMercator", ) assert "4326" not in mars_tms_wm.geographic_crs.to_wkt() assert mars_tms_wm.bbox.left == pytest.approx(-180.0) assert mars_tms_wm.bbox.bottom == pytest.approx(-85.0511287) assert mars_tms_wm.bbox.right == pytest.approx(180.0) assert mars_tms_wm.bbox.top == pytest.approx(85.0511287) extent_wm_geog = [ -179.9999999999996, -85.05112877980656, 179.9999999999996, 85.05112877980656, ] mars_sphere_crs = pyproj.CRS.from_user_input("IAU_2015:49900") mars_tms_wm_geog_ext = morecantile.TileMatrixSet.custom( extent_wm_geog, extent_crs=mars_sphere_crs, crs=crs_mars_web_mercator, id="MarsWebMercator", ) assert mars_tms_wm_geog_ext.bbox.left == pytest.approx(-180.0) assert mars_tms_wm_geog_ext.bbox.bottom == pytest.approx(-85.0511287) assert mars_tms_wm_geog_ext.bbox.right == pytest.approx(180.0) assert mars_tms_wm_geog_ext.bbox.top == pytest.approx(85.0511287) @pytest.mark.parametrize( "identifier, file, crs", [ ( "UPSAntarcticWGS84Quad", os.path.join(tms_v1_dir, "UPSAntarcticWGS84Quad.json"), 5042, ), ("CanadianNAD83_LCC", os.path.join(tms_v1_dir, "CanadianNAD83_LCC.json"), 3978), ("WebMercatorQuad", os.path.join(tms_v1_dir, "WebMercatorQuad.json"), 3857), ], ) def test_from_v1(identifier, file, crs): """ Test from_v1 class method """ with open(file) as fp: v1_tms = json.load(fp) tms = TileMatrixSet.from_v1(v1_tms) assert tms.id == identifier assert tms.crs._pyproj_crs == pyproj.CRS.from_epsg(crs) @pytest.mark.parametrize( "id,result", [ ("LINZAntarticaMapTilegrid", True), ("EuropeanETRS89_LAEAQuad", True), ("CanadianNAD83_LCC", False), ("UPSArcticWGS84Quad", False), ("NZTM2000Quad", True), ("UTM31WGS84Quad", False), ("UPSAntarcticWGS84Quad", False), ("WorldMercatorWGS84Quad", False), ("WorldCRS84Quad", False), ("WGS1984Quad", True), ("WebMercatorQuad", False), ("CDB1GlobalGrid", True), ("GNOSISGlobalGrid", True), ], ) def test_inverted_tms(id, result): """Make sure _invert_axis return the correct result.""" assert morecantile.tms.get(id)._invert_axis == result @pytest.mark.parametrize( "id,result", [ ("LINZAntarticaMapTilegrid", False), ("EuropeanETRS89_LAEAQuad", False), ("CanadianNAD83_LCC", False), ("UPSArcticWGS84Quad", False), ("NZTM2000Quad", False), ("UTM31WGS84Quad", False), ("UPSAntarcticWGS84Quad", False), ("WorldMercatorWGS84Quad", False), ("WorldCRS84Quad", False), ("WGS1984Quad", False), ("WebMercatorQuad", False), ("CDB1GlobalGrid", True), ("GNOSISGlobalGrid", True), ], ) def test_variable_tms(id, result): """Make sure is_variable return the correct result.""" assert morecantile.tms.get(id).is_variable == result @pytest.mark.parametrize( "authority,code,result", [ ("EPSG", "4326", "EPSG/0/4326"), ("ESRI", "102001", "ESRI/0/102001"), ("IAU_2015", "49910", "IAU/2015/49910"), ("IGNF", "AMANU49", "IGNF/0/AMANU49"), ("NKG", "ETRF00", "NKG/0/ETRF00"), ("OGC", "CRS84", "OGC/0/CRS84"), ], ) def test_crs_uris(authority, code, result): """Test CRS URIS.""" assert ( morecantile.models.CRS_to_uri(pyproj.CRS((authority, code))) == f"http://www.opengis.net/def/crs/{result}" ) @pytest.mark.parametrize("tilematrixset", morecantile.tms.list()) def test_crs_uris_for_defaults(tilematrixset): """Test CRS URIS.""" t = morecantile.tms.get(tilematrixset) assert t.crs._pyproj_crs == morecantile.models.CRS_to_uri(t.crs._pyproj_crs) def test_rasterio_crs(): """Check rasterio CRS methods.""" _ = pytest.importorskip("rasterio") from rasterio.crs import CRS as rioCRS tms = morecantile.tms.get("WebMercatorQuad") assert isinstance(tms.rasterio_crs, rioCRS) assert isinstance(tms.rasterio_geographic_crs, rioCRS) assert tms.rasterio_crs == rioCRS.from_epsg(3857) assert tms.rasterio_geographic_crs == rioCRS.from_epsg(4326) tms = morecantile.tms.get("WGS1984Quad") assert tms.rasterio_crs == rioCRS.from_epsg(4326) assert tms.rasterio_geographic_crs == rioCRS.from_epsg(4326) def test_boundingbox(): """Test boundingbox support.""" with pytest.raises(ValidationError): TileMatrixSet( **{ "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", "boundingBox": { "lowerLeft": [], "upperRight": [], "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", "orderedAxes": ["X", "Y"], }, "tileMatrices": [ { "id": "0", "scaleDenominator": 559082264.028717, "cellSize": 156543.033928041, "pointOfOrigin": [-20037508.342789244, 20037508.342789244], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1, }, ], } ) assert TileMatrixSet( **{ "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", "boundingBox": { "lowerLeft": [-20037508.342789244, -20037508.34278919], "upperRight": [20037508.34278919, 20037508.342789244], }, "tileMatrices": [ { "id": "0", "scaleDenominator": 559082264.028717, "cellSize": 156543.033928041, "pointOfOrigin": [-20037508.342789244, 20037508.342789244], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1, }, ], } ) assert TileMatrixSet( **{ "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", "boundingBox": { "lowerLeft": [-20037508.342789244, -20037508.34278919], "upperRight": [20037508.34278919, 20037508.342789244], "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", "orderedAxes": ["X", "Y"], }, "tileMatrices": [ { "id": "0", "scaleDenominator": 559082264.028717, "cellSize": 156543.033928041, "pointOfOrigin": [-20037508.342789244, 20037508.342789244], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1, }, ], } ) def test_private_attr(): """Check private attr.""" tms = morecantile.tms.get("WebMercatorQuad") assert "_geographic_crs" in tms.__private_attributes__ assert "_tile_matrices_idx" in tms.__private_attributes__ def test_crs_type(): """Test CRSType Model.""" uri = "http://www.opengis.net/def/crs/EPSG/0/3857" crs = CRS(uri) assert crs.root == uri assert crs.model_dump() == uri # PROJ methods assert crs._pyproj_crs == pyproj.CRS.from_epsg(3857) assert crs.srs == "http://www.opengis.net/def/crs/EPSG/0/3857" assert crs.to_epsg() == 3857 assert crs.to_wkt() == pyproj.CRS.from_epsg(3857).to_wkt() assert crs.to_proj4() == pyproj.CRS.from_epsg(3857).to_proj4() assert crs.to_dict() == pyproj.CRS.from_epsg(3857).to_dict() assert crs.to_json() == pyproj.CRS.from_epsg(3857).to_json() # with Options assert crs.to_epsg(min_confidence=10) == 3857 assert crs.to_wkt(pretty=True) == pyproj.CRS.from_epsg(3857).to_wkt(pretty=True) assert crs.to_proj4(5) == pyproj.CRS.from_epsg(3857).to_proj4(5) assert crs.to_json(pretty=True) == pyproj.CRS.from_epsg(3857).to_json(pretty=True) # Outside OGC Specs but it works wkt = pyproj.CRS.from_epsg(3857).to_wkt() crs = CRS(wkt) assert crs.root == wkt assert crs.model_dump() == wkt # PROJ methods assert crs._pyproj_crs == pyproj.CRS.from_epsg(3857) assert crs.srs == wkt assert crs.to_epsg() == 3857 # CRSUri data = {"uri": "http://www.opengis.net/def/crs/EPSG/0/3857"} crs = CRS(data) assert crs.root == CRSUri(uri="http://www.opengis.net/def/crs/EPSG/0/3857") assert ( crs.model_dump(mode="json") == data ) # we use `mode=json` to dump all sub-model (URL) assert crs._pyproj_crs == pyproj.CRS.from_epsg(3857) # CRSWKT wkt = pyproj.CRS.from_epsg(3857).to_json_dict() crs = CRS({"wkt": wkt}) assert crs.root == CRSWKT(wkt=wkt) assert crs.model_dump()["wkt"] == wkt assert crs._pyproj_crs == pyproj.CRS.from_epsg(3857) # CRSRef with pytest.raises(NotImplementedError): CRS({"referenceSystem": {"yo": 1}}) # something else with pytest.raises(ValidationError): CRS({"Hey": 1}) def test_crs_type_in_tms(): """Check TMS representation when using non-string CRS.""" # CRS URI crs = {"uri": "http://www.opengis.net/def/crs/EPSG/0/3857"} tms = TileMatrixSet( **{ "crs": crs, "boundingBox": { "lowerLeft": [-20037508.342789244, -20037508.34278919], "upperRight": [20037508.34278919, 20037508.342789244], }, "tileMatrices": [ { "id": "0", "scaleDenominator": 559082264.028717, "cellSize": 156543.033928041, "pointOfOrigin": [-20037508.342789244, 20037508.342789244], "tileWidth": 256, "tileHeight": 256, "matrixWidth": 1, "matrixHeight": 1, }, ], } ) assert str(tms.crs.root.uri) == "http://www.opengis.net/def/crs/EPSG/0/3857" assert repr(tms) def test_geographic_issue164(): """ Check bbox in geographic CRS. ref: https://github.com/developmentseed/morecantile/issues/164 """ extent = [2696082.04374708, 1289407.53195196, 2696210.04374708, 1289535.53195196] crs = pyproj.CRS.from_epsg("2056") tms = morecantile.TileMatrixSet.custom(extent, crs) assert tms.geographic_crs != pyproj.CRS.from_epsg(4326) assert round(tms.bbox.bottom, 5) == 47.74957 tms.set_geographic_crs(pyproj.CRS.from_epsg(4326)) assert tms.geographic_crs == pyproj.CRS.from_epsg(4326) assert round(tms.bbox.bottom, 5) == 47.74817 @pytest.mark.parametrize( "name,is_wgs84", [ ("LINZAntarticaMapTilegrid", False), ("GNOSISGlobalGrid", True), ("EuropeanETRS89_LAEAQuad", False), ("CanadianNAD83_LCC", False), ("UPSArcticWGS84Quad", True), ("NZTM2000Quad", False), ("UTM31WGS84Quad", True), ("UPSAntarcticWGS84Quad", True), ("WorldMercatorWGS84Quad", True), ("WGS1984Quad", True), ("WorldCRS84Quad", False), ("WebMercatorQuad", True), ("CDB1GlobalGrid", True), ], ) def test_geographic_crs(name, is_wgs84): """Check Geographic CRS.""" tms = morecantile.tms.get(name) assert (tms.geographic_crs == pyproj.CRS.from_epsg(4326)) == is_wgs84 tms.set_geographic_crs(pyproj.CRS.from_epsg(4326)) assert tms.geographic_crs == pyproj.CRS.from_epsg(4326) # Confirm the original object wasn't updated tms = morecantile.tms.get(name) assert (tms.geographic_crs == pyproj.CRS.from_epsg(4326)) == is_wgs84 def test_bottomleft_origin(): """Create TMS with BottomLeft Origin.""" wmTopLeft = morecantile.tms.get("WebMercatorQuad") crs = pyproj.CRS.from_epsg(3857) extent = ( -20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244, ) corner_of_origin = "bottomLeft" tms = TileMatrixSet.custom( extent, crs, matrix_scale=[1, 1], minzoom=0, maxzoom=24, id="WebMercatorQuadBottomLeft", ordered_axes=["X", "Y"], corner_of_origin=corner_of_origin, ) assert tms.matrix(0).pointOfOrigin == (-20037508.342789244, -20037508.342789244) assert tms._matrix_origin(tms.matrix(0)) == ( -20037508.342789244, -20037508.342789244, ) assert tms.xy_bounds(0, 0, 0) == wmTopLeft.xy_bounds(0, 0, 0) # bottomLeft corner can also be used as # origin making TileRow increase towards the top assert tms.xy_bounds(1, 1, 1) == wmTopLeft.xy_bounds(1, 0, 1) assert tms.xy_bounds(1, 0, 1) == wmTopLeft.xy_bounds(1, 1, 1) assert tms._ul(0, 0, 0) == wmTopLeft._ul(0, 0, 0) assert tms._lr(0, 0, 0) == wmTopLeft._lr(0, 0, 0) # TileRow is inverted assert tms._ul(0, 0, 1).y == wmTopLeft._ul(0, 1, 1).y assert tms._ul(0, 1, 1).y == wmTopLeft._ul(0, 0, 1).y assert tms._lr(0, 0, 1).y == wmTopLeft._lr(0, 1, 1).y assert tms._lr(0, 1, 1).y == wmTopLeft._lr(0, 0, 1).y assert tms.bounds(0, 0, 0) == wmTopLeft.bounds(0, 0, 0) assert tms.xy_bounds(0, 0, 1).left == -20037508.342789244 assert tms.xy_bounds(0, 0, 1).bottom == -20037508.342789244 assert tms.xy_bounds(1, 1, 1).top == 20037508.342789244 assert tms.xy_bounds(1, 1, 1).right == 20037508.342789244 assert tms.tile(-180, -85, 0) == morecantile.Tile(x=0, y=0, z=0) assert tms.tile(-180, -85, 1) == morecantile.Tile(x=0, y=0, z=1) assert tms.tile(-180, 85, 1) == morecantile.Tile(x=0, y=1, z=1) bounds = tms.xy_bounds(486, tms.matrix(10).matrixHeight - 1 - 332, 10) expected = wmTopLeft.xy_bounds(486, 332, 10) for a, b in zip(expected, bounds): assert round(a - b, 6) == pytest.approx(0) @pytest.mark.parametrize( ("topLeft_Tile", "bottomLeft_Tile"), [ (morecantile.Tile(10, 10, 10), morecantile.Tile(10, 1013, 10)), (morecantile.Tile(10, 1013, 10), morecantile.Tile(10, 10, 10)), # Check the Origin points (morecantile.Tile(0, 0, 10), morecantile.Tile(0, 1023, 10)), (morecantile.Tile(0, 1023, 10), morecantile.Tile(0, 0, 10)), # Check the end points (morecantile.Tile(1023, 0, 10), morecantile.Tile(1023, 1023, 10)), (morecantile.Tile(1023, 1023, 10), morecantile.Tile(1023, 0, 10)), # Zoom=0 (morecantile.Tile(0, 0, 0), morecantile.Tile(0, 0, 0)), # zoom=1 on both edges of the zoom level (morecantile.Tile(0, 0, 1), morecantile.Tile(0, 1, 1)), (morecantile.Tile(0, 1, 1), morecantile.Tile(0, 0, 1)), # zoom=14 near the middle ( morecantile.Tile(x=3413, y=6202, z=14), morecantile.Tile(x=3413, y=10181, z=14), ), ], ) def test_topLeft_BottomLeft_bounds_equal_bounds(topLeft_Tile, bottomLeft_Tile): tmsTop = morecantile.tms.get("WebMercatorQuad") tmsBottom = TileMatrixSet.custom( ( -20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244, ), pyproj.CRS.from_epsg(3857), matrix_scale=[1, 1], minzoom=0, maxzoom=24, id="WebMercatorQuadBottomLeft", ordered_axes=["X", "Y"], corner_of_origin="bottomLeft", ) bounds = tmsTop.xy_bounds(topLeft_Tile) bounds2 = tmsBottom.xy_bounds(bottomLeft_Tile) for a, b in zip(bounds, bounds2): assert round(a - b, 6) == 0 def test_webmercator_bounds(): """Test WebMercatorQuad bounds. ref: https://github.com/developmentseed/morecantile/issues/175 """ tms = morecantile.tms.get("WebMercatorQuad") assert tms.bounds(0, 0, 0).left == -180.0 assert tms.bounds(0, 0, 0).right == 180.0 assert tuple(tms.xy_bounds(0, 0, 0)) == ( -20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244, ) assert tms.bounds(0, 0, 1).left == -180.0 assert tms.bounds(1, 0, 1).right == 180.0 def test_bbox_bottom_left(): """Ref: issue #193""" extent = [-100_000, -100_000, 100_000, 100_000] tms = TileMatrixSet.custom( extent, pyproj.CRS.from_epsg(3857), minzoom=0, maxzoom=2, corner_of_origin="bottomLeft", ) assert tms.xy_bbox == BoundingBox( left=-100_000, bottom=-100_000, right=100_000, top=100_000, ) assert tms.xy_bounds(Tile(x=0, y=0, z=0)) == BoundingBox( left=-100_000, bottom=-100_000, right=100_000, top=100_000, ) assert tms._ul(Tile(x=0, y=0, z=0)) == Coords(x=-100000.0, y=100000.0) assert tms._lr(Tile(x=0, y=0, z=0)) == Coords(x=100000.0, y=-100000.0) assert tms._ul(Tile(x=0, y=0, z=1)) == Coords(x=-100000.0, y=0.0) assert tms._lr(Tile(x=0, y=0, z=1)) == Coords(x=0.0, y=-100000.0) assert tms._ul(Tile(x=1, y=0, z=1)) == Coords(x=0.0, y=0.0) assert tms._lr(Tile(x=1, y=0, z=1)) == Coords(x=100000.0, y=-100000.0) assert tms._ul(Tile(x=0, y=1, z=1)) == Coords(x=-100000.0, y=100000.0) assert tms._lr(Tile(x=0, y=1, z=1)) == Coords(x=0.0, y=0.0) assert tms._ul(Tile(x=1, y=1, z=1)) == Coords(x=0.0, y=100000.0) assert tms._lr(Tile(x=1, y=1, z=1)) == Coords(x=100000.0, y=0) morecantile-7.0.3/tests/test_morecantile.py000066400000000000000000000523111514074772600211170ustar00rootroot00000000000000"""Tests for morecantile.""" import math import warnings import mercantile import pytest from pyproj import CRS import morecantile from morecantile.errors import ( InvalidIdentifier, InvalidZoomError, PointOutsideTMSBounds, ) from morecantile.utils import is_power_of_two, meters_per_unit DEFAULT_GRID_COUNT = 13 def test_default_grids(): """Morecantile.default_grids should return the correct list of grids.""" assert len(morecantile.tms.list()) == DEFAULT_GRID_COUNT with pytest.raises(InvalidIdentifier): morecantile.tms.get("ANotValidName") def test_register(): """Test register a new grid.""" assert len(morecantile.tms.list()) == DEFAULT_GRID_COUNT crs = CRS.from_epsg(3031) extent = [-948.75, -543592.47, 5817.41, -3333128.95] # From https:///epsg.io/3031 tms = morecantile.TileMatrixSet.custom(extent, crs, id="MyCustomGrid3031") # Make sure we don't update the default tms (frozen set) _ = morecantile.tms.register({"MyCustomGrid3031": tms}) assert len(morecantile.tms.list()) == DEFAULT_GRID_COUNT defaults = morecantile.tms.register({"MyCustomGrid3031": tms}) assert len(defaults.list()) == DEFAULT_GRID_COUNT + 1 assert "MyCustomGrid3031" in defaults.list() # Check it will raise an exception if TMS is already registered with pytest.raises(InvalidIdentifier): defaults = defaults.register({"MyCustomGrid3031": tms}) # Do not raise is overwrite=True defaults = defaults.register({"MyCustomGrid3031": tms}, overwrite=True) assert len(defaults.list()) == DEFAULT_GRID_COUNT + 1 # add tms in morecantile defaults (not something to do anyway) epsg3031 = morecantile.TileMatrixSet.custom(extent, crs, id="epsg3031") morecantile.defaults.default_tms["epsg3031"] = epsg3031 assert len(morecantile.defaults.default_tms.keys()) == DEFAULT_GRID_COUNT + 1 # make sure updating the default_tms dict has no effect on the default TileMatrixSets assert len(morecantile.tms.list()) == DEFAULT_GRID_COUNT # Update internal TMS dict morecantile.tms.tilematrixsets["MyCustomGrid3031"] = tms assert len(morecantile.tms.list()) == DEFAULT_GRID_COUNT + 1 # make sure it doesn't propagate to the default dict assert "MyCustomGrid3031" not in morecantile.defaults.default_tms def test_TMSproperties(): """Test TileSchema().""" tms = morecantile.tms.get("WebMercatorQuad") assert tms.crs._pyproj_crs == CRS.from_epsg(3857) assert meters_per_unit(tms.crs._pyproj_crs) == 1.0 assert tms.minzoom == 0 assert tms.maxzoom == 24 def test_tile_coordinates(): """Test coordinates to tile index utils.""" tms = morecantile.tms.get("WebMercatorQuad") assert tms.tile(-179, 85, 5) == (0, 0, 5) # Check equivalence between mercantile and morecantile # wlon, wlat = mercantile.xy(20.0, 15.0) assert tms.tile(20.0, 15.0, 5) == mercantile.tile(20.0, 15.0, 5) @pytest.mark.parametrize( "args", [(486, 332, 10), [(486, 332, 10)], [morecantile.Tile(486, 332, 10)]] ) def test_bounds(args): """ TileMatrixSet.bounds should return the correct coordinates. test form https://github.com/mapbox/mercantile/blob/master/tests/test_funcs.py """ expected = (-9.140625, 53.12040528310657, -8.7890625, 53.33087298301705) tms = morecantile.tms.get("WebMercatorQuad") bbox = tms.bounds(*args) for a, b in zip(expected, bbox): assert round(a - b, 6) == 0 assert bbox.left == bbox[0] assert bbox.bottom == bbox[1] assert bbox.right == bbox[2] assert bbox.top == bbox[3] @pytest.mark.parametrize( "args", [(486, 332, 10), [(486, 332, 10)], [morecantile.Tile(486, 332, 10)]] ) def test_xy_bounds(args): """ TileMatrixSet.xy_bounds should return the correct coordinates. test form https://github.com/mapbox/mercantile/blob/master/tests/test_funcs.py """ expected = ( -1017529.7205322663, 7005300.768279833, -978393.962050256, 7044436.526761846, ) tms = morecantile.tms.get("WebMercatorQuad") bounds = tms.xy_bounds(*args) for a, b in zip(expected, bounds): assert round(a - b, 6) == 0 def test_ul_tile(): """ TileMatrixSet.ul should return the correct coordinates. test form https://github.com/mapbox/mercantile/blob/master/tests/test_funcs.py """ tms = morecantile.tms.get("WebMercatorQuad") xy = tms.ul(486, 332, 10) expected = (-9.140625, 53.33087298301705) for a, b in zip(expected, xy): assert round(a - b, 6) == 0 def test_projul_tile(): """ TileMatrixSet._ul should return the correct coordinates in input projection. test form https://github.com/mapbox/mercantile/blob/master/tests/test_funcs.py """ tms = morecantile.tms.get("WebMercatorQuad") xy = tms._ul(486, 332, 10) expected = (-1017529.7205322663, 7044436.526761846) for a, b in zip(expected, xy): assert round(a - b, 6) == 0 def test_projtile(): """TileSchema._tile should return the correct tile.""" tms = morecantile.tms.get("WebMercatorQuad") assert tms._tile(1000, 1000, 1) == morecantile.Tile(1, 0, 1) def test_feature(): """TileSchema.feature should create proper geojson feature.""" tms = morecantile.tms.get("WebMercatorQuad") feat = tms.feature(morecantile.Tile(1, 0, 1)) assert feat["bbox"] assert feat["id"] assert feat["geometry"] assert len(feat["properties"].keys()) == 3 feat = tms.feature( morecantile.Tile(1, 0, 1), buffer=-10, precision=4, fid="1", props={"some": "thing"}, ) assert feat["bbox"] assert feat["id"] == "1" assert feat["geometry"] assert len(feat["properties"].keys()) == 4 with pytest.warns(UserWarning): feat = tms.feature( morecantile.Tile(1, 0, 1), projected=True, fid="1", props={"some": "thing"} ) assert feat["crs"] assert feat["bbox"] assert feat["id"] == "1" assert feat["geometry"] assert len(feat["properties"].keys()) == 4 # These extent coordinates are in EPSG:2056 (CH) custom_tms = morecantile.TileMatrixSet.custom( [2696082.04374708, 1289407.53195196, 2696210.04374708, 1289535.53195196], CRS.from_epsg("2056"), ) assert custom_tms.geographic_crs != CRS.from_epsg(4326) # Warn when geographic CRS is not WGS84 with pytest.warns(UserWarning): feat = custom_tms.feature( morecantile.Tile(1, 0, 1), projected=False, geographic_crs=custom_tms.geographic_crs, ) assert feat["crs"] # By default we use WGS84 CRS (as per GeoJSON spec) with warnings.catch_warnings(): warnings.simplefilter("error") feat = custom_tms.feature( morecantile.Tile(1, 0, 1), projected=False, ) assert not feat.get("crs") ################################################################################ # replicate mercantile tests # https://github.com/mapbox/mercantile/blob/master/tests/test_funcs.py @pytest.mark.parametrize( "args", [(486, 332, 10), [(486, 332, 10)], [morecantile.Tile(486, 332, 10)]] ) def test_ul(args): """test args.""" tms = morecantile.tms.get("WebMercatorQuad") expected = (-9.140625, 53.33087298301705) lnglat = tms.ul(*args) for a, b in zip(expected, lnglat): assert round(a - b, 6) == 0 assert lnglat[0] == lnglat.x assert lnglat[1] == lnglat.y @pytest.mark.parametrize( "args", [(486, 332, 10), [(486, 332, 10)], [mercantile.Tile(486, 332, 10)]] ) def test_bbox(args): """test bbox.""" tms = morecantile.tms.get("WebMercatorQuad") expected = (-9.140625, 53.12040528310657, -8.7890625, 53.33087298301705) bbox = tms.bounds(*args) for a, b in zip(expected, bbox): assert round(a - b, 6) == 0 assert bbox.left == bbox[0] assert bbox.bottom == bbox[1] assert bbox.right == bbox[2] assert bbox.top == bbox[3] def test_xy_tile(): """x, y for the 486-332-10 tile is correctly calculated.""" tms = morecantile.tms.get("WebMercatorQuad") ul = tms.ul(486, 332, 10) xy = tms.xy(*ul) expected = (-1017529.7205322663, 7044436.526761846) for a, b in zip(expected, xy): assert round(a - b, 6) == 0 def test_xy_null_island(): """x, y for (0, 0) is correctly calculated""" tms = morecantile.tms.get("WebMercatorQuad") xy = tms.xy(0.0, 0.0) expected = (0.0, 0.0) for a, b in zip(expected, xy): assert round(a - b, 6) == 0 @pytest.mark.xfail def test_xy_south_pole(): """Return -inf for y at South Pole Note: mercantile returns (0.0, inf) """ tms = morecantile.tms.get("WebMercatorQuad") with pytest.warns(PointOutsideTMSBounds): xy = tms.xy(0.0, -90) assert xy.x == 0.0 assert xy.y == float("inf") @pytest.mark.xfail def test_xy_north_pole(): """Return inf for y at North Pole. Note: mercantile returns (0.0, -inf) """ tms = morecantile.tms.get("WebMercatorQuad") with pytest.warns(PointOutsideTMSBounds): xy = tms.xy(0.0, 90) assert xy.x == 0.0 assert xy.y == float("inf") def test_xy_truncate(): """Input is truncated""" tms = morecantile.tms.get("WebMercatorQuad") assert tms.xy(-181.0, 0.0, truncate=True) == tms.xy(tms.bbox.left, 0.0) @pytest.mark.xfail def test_lnglat(): """test lnglat.""" tms = morecantile.tms.get("WebMercatorQuad") # Make sure not warning is raised with warnings.catch_warnings(): warnings.simplefilter("error") xy = (-8366731.739810849, -1655181.9927159143) lnglat = tms.lnglat(*xy) assert round(lnglat.x, 5) == -75.15963 assert round(lnglat.y, 5) == -14.70462 with pytest.warns(PointOutsideTMSBounds): xy = (-28366731.739810849, -1655181.9927159143) lnglat = tms.lnglat(*xy, truncate=True) assert round(lnglat.x, 5) == -180.0 # in Mercantile (105.17731 in Morecantile) assert round(lnglat.y, 5) == -14.70462 # in Mercantile @pytest.mark.parametrize("tms_name", morecantile.tms.list()) def test_axis_inverted(tms_name): """Test axis inversion check""" tms = morecantile.tms.get(tms_name) if tms.orderedAxes: assert morecantile.models.crs_axis_inverted( tms.crs._pyproj_crs ) == morecantile.models.ordered_axis_inverted(tms.orderedAxes) def test_lnglat_gdal3(): """test lnglat.""" # PROJ>=7 returns (105.17731317609572, -14.704620000000013) tms = morecantile.tms.get("WebMercatorQuad") with pytest.warns(PointOutsideTMSBounds): xy = (-28366731.739810849, -1655181.9927159143) lnglat = tms.lnglat(*xy, truncate=True) assert round(lnglat.x, 5) == 105.17731 assert round(lnglat.y, 5) == -14.70462 def test_lnglat_xy_roundtrip(): """Test roundtrip.""" tms = morecantile.tms.get("WebMercatorQuad") lnglat = (-105.0844, 40.5853) roundtrip = tms.lnglat(*tms.xy(*lnglat)) for a, b in zip(roundtrip, lnglat): assert round(a - b, 6) == 0 @pytest.mark.parametrize( "args", [(486, 332, 10), [(486, 332, 10)], [mercantile.Tile(486, 332, 10)]] ) def test_xy_bounds_mercantile(args): """test xy_bounds.""" tms = morecantile.tms.get("WebMercatorQuad") expected = ( -1017529.7205322663, 7005300.768279833, -978393.962050256, 7044436.526761846, ) bounds = tms.xy_bounds(*args) for a, b in zip(expected, bounds): assert round(a - b, 6) == 0 def test_tile_not_truncated(): """test tile.""" tms = morecantile.tms.get("WebMercatorQuad") tile = tms.tile(20.6852, 40.1222, 9) expected = (285, 193) assert tile[0] == expected[0] assert tile[1] == expected[1] def test_tile_truncate(): """Input is truncated""" tms = morecantile.tms.get("WebMercatorQuad") assert tms.tile(-181.0, 0.0, 9, truncate=True) == tms.tile(-180.0, 0.0, 9) def test_tiles(): """Test tiles from bbox.""" tms = morecantile.tms.get("WebMercatorQuad") # replicate mercantile tests # https://github.com/mapbox/mercantile/blob/master/tests/test_funcs.py#L115-L178 bounds = (-105, 39.99, -104.99, 40) tiles = list(tms.tiles(*bounds, zooms=[14])) expect = [ morecantile.Tile(x=3413, y=6202, z=14), morecantile.Tile(x=3413, y=6203, z=14), ] assert sorted(tiles) == sorted(expect) # Single zoom bounds = (-105, 39.99, -104.99, 40) tiles = list(tms.tiles(*bounds, zooms=14)) expect = [ morecantile.Tile(x=3413, y=6202, z=14), morecantile.Tile(x=3413, y=6203, z=14), ] assert sorted(tiles) == sorted(expect) # Input is truncated assert list(tms.tiles(-181.0, 0.0, -170.0, 10.0, zooms=[2], truncate=True)) == list( tms.tiles(-180.0, 0.0, -170.0, 10.0, zooms=[2]) ) assert list(tms.tiles(-180.0, -90.0, 180.0, 90.0, zooms=[0])) == [ morecantile.Tile(x=0, y=0, z=0) ] assert list(tms.tiles(-180.0, -90.0, 180.0, 90.0, zooms=[0], truncate=True)) == [ morecantile.Tile(x=0, y=0, z=0) ] # Antimeridian-crossing bounding boxes are handled bounds = (175.0, 5.0, -175.0, 10.0) assert len(list(tms.tiles(*bounds, zooms=[2]))) == 2 @pytest.mark.parametrize( ("bounds", "expected", "crs", "tms_bbox"), [ # case where east tms bbox crosses antimeridian ( (119.1, -32.86, 119.2, -32.82), 6, 32750, (100.23646734667152, -79.99407435445299, -158.6052850376368, 0.0), ), # case where west tms bbox crosses antimeridian ( (11.700978, 52.056474, 11.711114, 52.062706), 4, 32632, (-17.582877658817317, 0.0, 95.87417095917766, 83.95429547980198), ), ], ) def test_tiles_when_tms_bounds_and_provided_bounds_cross_antimeridian( bounds: tuple, expected: int, crs: int, tms_bbox: tuple ): utm = CRS.from_epsg(crs) rs_extent = utm.area_of_use.bounds tms = morecantile.TileMatrixSet.custom( crs=utm, extent_crs=CRS.from_epsg(4326), extent=list(rs_extent) ) # tms.tiles needs to be aware if tms bounds and input bounds crosses the # antimeridian e.g. min(119.2, -158.605) clamps to much larger area. Now # that we check to see if lons contain antimeridian, we build tiles that # actually overlap the provided bounds to tiles. assert tms.bbox == tms_bbox for a, b in zip(tms.bbox, tms_bbox): assert round(a - b, 6) == 0 assert len(list(tms.tiles(*bounds, zooms=11))) == expected def test_tiles_for_tms_with_non_standard_row_col_order(): """Test tiles from bbox when TMS has non-standard row/col alignment with lat/lon.""" crs = CRS.from_proj4( "+proj=s2 +lat_0=0.0 +lon_0=-90.0 +ellps=WGS84 +UVtoST=quadratic" ) extent = [0.0, 0.0, 1.0, 1.0] s2f4 = morecantile.TileMatrixSet.custom(extent, crs, id="S2F4") overlapping_tiles = s2f4.tiles(-100, 27, -95, 33, [6]) assert len(list(overlapping_tiles)) == 30 def test_global_tiles_clamped(): """Y is clamped to (0, 2 ** zoom - 1).""" tms = morecantile.tms.get("WebMercatorQuad") tiles = list(tms.tiles(-180, -90, 180, 90, [1])) assert len(tiles) == 4 assert min(t.y for t in tiles) == 0 assert max(t.y for t in tiles) == 1 def test_tiles_roundtrip_children(): """tiles(bounds(tile)) gives the tile's children""" tms = morecantile.tms.get("WebMercatorQuad") t = morecantile.Tile(x=3413, y=6202, z=14) res = list(tms.tiles(*tms.bounds(t), zooms=[15])) assert len(res) == 4 @pytest.mark.parametrize( "t", [ morecantile.Tile(x=3413, y=6202, z=14), morecantile.Tile(486, 332, 10), morecantile.Tile(10, 10, 10), ], ) def test_tiles_roundtrip(t): """Tiles(bounds(tile)) gives the tile.""" tms = morecantile.tms.get("WebMercatorQuad") res = list(tms.tiles(*tms.bounds(t), zooms=[t.z])) assert len(res) == 1 val = res.pop() assert val.x == t.x assert val.y == t.y assert val.z == t.z def test_tiles_nan_bounds(): """ nan bounds should raise an error instead of getting clamped to avoid unintentionally generating tiles for the entire TMS' extent. """ tms = morecantile.tms.get("WebMercatorQuad") bounds = (-105, math.nan, -104.99, 40) with pytest.raises(ValueError): list(tms.tiles(*bounds, zooms=[14])) def test_extend_zoom(): """TileMatrixSet.ul should return the correct coordinates.""" tms = morecantile.tms.get("WebMercatorQuad") merc = mercantile.xy_bounds(1000, 1000, 25) with pytest.warns(UserWarning): more = tms.xy_bounds(1000, 1000, 25) for a, b in zip(more, merc): assert round(a - b, 6) == 0 merc = mercantile.xy_bounds(2000, 2000, 26) with pytest.warns(UserWarning): more = tms.xy_bounds(2000, 2000, 26) for a, b in zip(more, merc): assert round(a - b, 6) == 0 merc = mercantile.xy_bounds(2000, 2000, 27) with pytest.warns(UserWarning): more = tms.xy_bounds(2000, 2000, 27) for a, b in zip(more, merc): assert round(a - b, 6) == 0 merc = mercantile.xy_bounds(2000, 2000, 30) with pytest.warns(UserWarning): more = tms.xy_bounds(2000, 2000, 30) for a, b in zip(more, merc): assert round(a - b, 6) == 0 def test_is_power_of_two(): """is power ot 2?""" assert is_power_of_two(8) assert not is_power_of_two(7) @pytest.mark.parametrize( "t,res", [ # X Y Z (morecantile.Tile(0, 0, 0), True), # zoom 0 has only tile 0,0,0 valid (morecantile.Tile(1, 0, 0), False), # MinZoom is 0 (morecantile.Tile(0, 0, -1), False), # MaxZoom is 24 (morecantile.Tile(0, 0, 24), True), (morecantile.Tile(0, 0, 25), False), # Negative X (morecantile.Tile(-1, 0, 1), False), # Negative Y (morecantile.Tile(0, -1, 1), False), ], ) def test_is_valid_tile(t, res): """test if tile are valid.""" tms = morecantile.tms.get("WebMercatorQuad") assert tms.is_valid(t) == res def test_is_valid_overzoom(): """test if tile are valid.""" tms = morecantile.tms.get("WebMercatorQuad") t = morecantile.Tile(0, 0, 25) assert tms.is_valid(t, strict=False) assert not tms.is_valid(t, strict=True) tms = morecantile.tms.get("GNOSISGlobalGrid") t = morecantile.Tile(0, 0, 28) assert tms.is_valid(t, strict=False) t = morecantile.Tile(0, 0, 29) assert not tms.is_valid(t, strict=False) # We can't overzoom VariableMatrixWidth TMS t = morecantile.Tile(0, 0, 29) assert not tms.is_valid(t) def test_neighbors(): """test neighbors.""" tms = morecantile.tms.get("WebMercatorQuad") x, y, z = 243, 166, 9 tiles = tms.neighbors(x, y, z) assert len(tiles) == 8 assert all(t.z == z for t in tiles) assert all(t.x - x in (-1, 0, 1) for t in tiles) assert all(t.y - y in (-1, 0, 1) for t in tiles) def test_neighbors_invalid(): """test neighbors.""" tms = morecantile.tms.get("WebMercatorQuad") x, y, z = 0, 166, 9 tiles = tms.neighbors(x, y, z) assert len(tiles) == 8 - 3 # no top-left, left, bottom-left assert all(t.z == z for t in tiles) assert all(t.x - x in (-1, 0, 1) for t in tiles) assert all(t.y - y in (-1, 0, 1) for t in tiles) def test_root_neighbors_invalid(): """test neighbors.""" tms = morecantile.tms.get("WebMercatorQuad") x, y, z = 0, 0, 0 tiles = tms.neighbors(x, y, z) assert len(tiles) == 0 # root tile has no neighbors def test_parent(): """test parent""" tms = morecantile.tms.get("WebMercatorQuad") parent = tms.parent(486, 332, 10) assert parent[0] == morecantile.Tile(243, 166, 9) with pytest.raises(InvalidZoomError): tms.parent(486, 332, 10, zoom=11) assert tms.parent(0, 0, 0) == [] def test_parent_multi(): """test parent""" tms = morecantile.tms.get("WebMercatorQuad") parent = tms.parent(486, 332, 10, zoom=8) assert parent[0] == morecantile.Tile(121, 83, 8) def test_children(): """test children.""" tms = morecantile.tms.get("WebMercatorQuad") x, y, z = 243, 166, 9 children = tms.children(x, y, z) assert len(children) == 4 assert morecantile.Tile(2 * x, 2 * y, z + 1) in children assert morecantile.Tile(2 * x + 1, 2 * y, z + 1) in children assert morecantile.Tile(2 * x + 1, 2 * y + 1, z + 1) in children assert morecantile.Tile(2 * x, 2 * y + 1, z + 1) in children def test_children_multi(): """test children multizoom.""" tms = morecantile.tms.get("WebMercatorQuad") children = tms.children(243, 166, 9, zoom=11) assert len(children) == 16 targets = [ (972, 664, 11), (973, 664, 11), (973, 665, 11), (972, 665, 11), (974, 664, 11), (975, 664, 11), (975, 665, 11), (974, 665, 11), (974, 666, 11), (975, 666, 11), (975, 667, 11), (974, 667, 11), (972, 666, 11), (973, 666, 11), (973, 667, 11), (972, 667, 11), ] for target in targets: assert target in children def test_children_invalid_zoom(): """invalid zoom.""" tms = morecantile.tms.get("WebMercatorQuad") with pytest.raises(InvalidZoomError): tms.children(243, 166, 9, zoom=8) with pytest.raises(InvalidZoomError): tms.children((243, 166, 9), zoom=8) morecantile-7.0.3/tests/test_tms_variable_width.py000066400000000000000000000142331514074772600224650ustar00rootroot00000000000000"""Tests for morecantile.""" import pytest import morecantile from morecantile.commons import BoundingBox, Tile from morecantile.errors import InvalidZoomError from morecantile.models import TileMatrix gnosisg_tms = morecantile.tms.get("GNOSISGlobalGrid") cdb1_tms = morecantile.tms.get("CDB1GlobalGrid") def test_coalesce(): """test get coalesce.""" matrix = TileMatrix( **{ "id": "2", "scaleDenominator": 34942641.501794859767, "cellSize": 0.087890625, "cornerOfOrigin": "topLeft", "pointOfOrigin": [90, -180], "matrixWidth": 16, "matrixHeight": 8, "tileWidth": 256, "tileHeight": 256, "variableMatrixWidths": [ {"coalesce": 4, "minTileRow": 0, "maxTileRow": 0}, {"coalesce": 2, "minTileRow": 1, "maxTileRow": 1}, {"coalesce": 2, "minTileRow": 6, "maxTileRow": 6}, {"coalesce": 4, "minTileRow": 7, "maxTileRow": 7}, ], } ) assert matrix.get_coalesce_factor(0) == 4 assert matrix.get_coalesce_factor(1) == 2 assert matrix.get_coalesce_factor(3) == 1 assert matrix.get_coalesce_factor(6) == 2 assert matrix.get_coalesce_factor(7) == 4 with pytest.raises(ValueError): matrix.get_coalesce_factor(8) with pytest.raises(ValueError): matrix.get_coalesce_factor(-1) matrix = TileMatrix( **{ "id": "2", "scaleDenominator": 34942641.501794859767, "cellSize": 0.087890625, "cornerOfOrigin": "topLeft", "pointOfOrigin": [90, -180], "matrixWidth": 16, "matrixHeight": 8, "tileWidth": 256, "tileHeight": 256, } ) with pytest.raises(ValueError): matrix.get_coalesce_factor(0) def test_invalid_matrix(): """Should raise error because we cannot construct a Matrix for variableWidth TMS.""" with pytest.raises(InvalidZoomError): cdb1_tms.matrix(22) with pytest.raises(InvalidZoomError): gnosisg_tms.matrix(29) def test_gnosisg(): """test GNOSISGlobalGrid TMS.""" bounds = gnosisg_tms.xy_bounds(0, 0, 0) assert bounds == BoundingBox(-180, 0, -90, 90) bounds = gnosisg_tms.xy_bounds(1, 1, 0) assert bounds == BoundingBox(-90, -90, 0, 0) bounds = gnosisg_tms.xy_bounds(0, 0, 1) assert bounds == BoundingBox(-180, 45, -90, 90) # tile for index 0,0 and 1,0 should have the same bounds assert gnosisg_tms.xy_bounds(0, 0, 1) == gnosisg_tms.xy_bounds(1, 0, 1) assert gnosisg_tms.xy_bounds(2, 0, 1) == gnosisg_tms.xy_bounds(3, 0, 1) assert gnosisg_tms.xy_bounds(4, 0, 1) == gnosisg_tms.xy_bounds(5, 0, 1) assert gnosisg_tms.xy_bounds(6, 0, 1) == gnosisg_tms.xy_bounds(7, 0, 1) assert gnosisg_tms.xy_bounds(0, 1, 1) != gnosisg_tms.xy_bounds(1, 1, 1) assert gnosisg_tms.xy_bounds(2, 1, 1) != gnosisg_tms.xy_bounds(3, 1, 1) assert gnosisg_tms.xy_bounds(0, 3, 1) == gnosisg_tms.xy_bounds(1, 3, 1) assert gnosisg_tms.xy_bounds(2, 3, 1) == gnosisg_tms.xy_bounds(3, 3, 1) assert gnosisg_tms.xy_bounds(4, 3, 1) == gnosisg_tms.xy_bounds(5, 3, 1) assert gnosisg_tms.xy_bounds(6, 3, 1) == gnosisg_tms.xy_bounds(7, 3, 1) # crs and geographic crs are the same assert gnosisg_tms.xy_bounds(0, 0, 0) == gnosisg_tms.bounds(0, 0, 0) assert gnosisg_tms.xy_bounds(1, 1, 0) == gnosisg_tms.bounds(1, 1, 0) assert gnosisg_tms.xy_bounds(0, 0, 1) == gnosisg_tms.bounds(0, 0, 1) tiles = gnosisg_tms.tiles(-180, -90, 180, 90, [0]) assert len(list(tiles)) == 8 ############################# # CHECK WE DON'T HAVE ALIASES tiles = list(gnosisg_tms.tiles(-180, -90, 180, 90, [1])) assert len(tiles) == 24 assert Tile(1, 0, 1) not in tiles # make sure the aliased tiles are not added assert len(gnosisg_tms.parent(Tile(0, 0, 1))) == 1 assert len(gnosisg_tms.parent(Tile(0, 0, 2))) == 1 assert len(gnosisg_tms.parent(Tile(0, 0, 3))) == 1 assert len(gnosisg_tms.children(Tile(0, 0, 0), zoom=1)) == 3 assert len(gnosisg_tms.children(Tile(0, 0, 0), zoom=2)) == 11 assert len(gnosisg_tms.children(Tile(0, 1, 1), zoom=2)) == 4 # test neighbors tiles = gnosisg_tms.neighbors(Tile(0, 0, 1)) assert tiles == [ Tile(x=0, y=1, z=1), Tile(x=1, y=1, z=1), Tile(x=2, y=0, z=1), Tile(x=2, y=1, z=1), ] tiles = gnosisg_tms.neighbors(Tile(2, 0, 1)) assert tiles == [ Tile(x=0, y=0, z=1), Tile(x=1, y=1, z=1), Tile(x=2, y=1, z=1), Tile(x=3, y=1, z=1), Tile(x=4, y=0, z=1), Tile(x=4, y=1, z=1), ] tiles = gnosisg_tms.neighbors(Tile(6, 0, 1)) assert tiles == [ Tile(x=4, y=0, z=1), Tile(x=5, y=1, z=1), Tile(x=6, y=1, z=1), Tile(x=7, y=1, z=1), ] tiles = gnosisg_tms.neighbors(Tile(0, 1, 1)) assert tiles == [ Tile(x=0, y=0, z=1), Tile(x=0, y=2, z=1), Tile(x=1, y=1, z=1), Tile(x=1, y=2, z=1), ] tiles = gnosisg_tms.neighbors(Tile(3, 1, 1)) assert tiles == [ Tile(x=2, y=0, z=1), Tile(x=2, y=1, z=1), Tile(x=2, y=2, z=1), Tile(x=3, y=2, z=1), Tile(x=4, y=0, z=1), Tile(x=4, y=1, z=1), Tile(x=4, y=2, z=1), ] tiles = gnosisg_tms.neighbors(Tile(0, 3, 1)) assert tiles == [ Tile(x=0, y=2, z=1), Tile(x=1, y=2, z=1), Tile(x=2, y=2, z=1), Tile(x=2, y=3, z=1), ] # assert alias tile have the same neighbors assert gnosisg_tms.neighbors(Tile(0, 0, 1)) == gnosisg_tms.neighbors(Tile(1, 0, 1)) assert gnosisg_tms.tile(-180, 90, 2) == Tile(0, 0, 2) assert gnosisg_tms.tile(-150, 90, 2) == Tile(0, 0, 2) assert gnosisg_tms.tile(-80, 90, 2) == Tile(4, 0, 2) assert gnosisg_tms.tile(-180, -90, 2) == Tile(0, 7, 2) assert gnosisg_tms.tile(-150, -90, 2) == Tile(0, 7, 2) assert gnosisg_tms.tile(-80, -90, 2) == Tile(4, 7, 2) # Ignore coalescence and return alias assert gnosisg_tms.tile(-150, 90, 2, ignore_coalescence=True) == Tile(1, 0, 2) assert gnosisg_tms.tile(150, -90, 2, ignore_coalescence=True) == Tile(14, 7, 2) morecantile-7.0.3/tests/test_utils.py000066400000000000000000000023331514074772600177540ustar00rootroot00000000000000"""test morecantile utils.""" import math import pytest from pyproj import CRS from morecantile import utils @pytest.mark.parametrize( "crs,unit", [ (CRS.from_epsg(4326), 2 * math.pi * 6378137 / 360.0), (CRS.from_epsg(3857), 1.0), (CRS.from_epsg(2276), 0.30480060960121924), (CRS.from_epsg(2222), 0.3048), # Mars in Meter ( CRS.from_proj4( "+proj=tmerc +lat_0=17 +lon_0=76.5 +k=0.9996 +x_0=0 +y_0=0 +a=3396190 +b=3376200 +units=m +no_defs" ), 1.0, ), # Mars in Degrees # proj4 from https://github.com/AndrewAnnex/planetcantile/blob/5ea2577f5dc4a3bc91b0443ef0633a5f89b15e03/planetcantile/data/generate.py#L45-L47 ( CRS.from_proj4("+proj=longlat +R=3396190 +no_defs +type=crs"), 2 * math.pi * 3396190 / 360.0, ), ], ) def test_mpu(crs, unit): """test meters_per_unit.""" assert utils.meters_per_unit(crs) == unit @pytest.mark.parametrize( "lon1, lon2, contains", [(-180, 180, False), (179, -179, True)] ) def test_lons_contain_antimeridian(lon1: float, lon2: float, contains: bool): assert utils.lons_contain_antimeridian(lon1, lon2) == contains morecantile-7.0.3/uv.lock000066400000000000000000012724461514074772600153640ustar00rootroot00000000000000version = 1 revision = 3 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.12'", "python_full_version < '3.12'", ] [[package]] name = "affine" version = "2.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/69/98/d2f0bb06385069e799fc7d2870d9e078cfa0fa396dc8a2b81227d0da08b9/affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea", size = 17132, upload-time = "2023-01-19T23:44:30.696Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0b/f7/85273299ab57117850cc0a936c64151171fac4da49bc6fba0dad984a7c5f/affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92", size = 15662, upload-time = "2023-01-19T23:44:28.833Z" }, ] [[package]] name = "annotated-types" version = "0.7.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] [[package]] name = "anyio" version = "4.12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] [[package]] name = "attrs" version = "25.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] [[package]] name = "babel" version = "2.18.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] [[package]] name = "backports-tarfile" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, ] [[package]] name = "backports-zstd" version = "1.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f4/b1/36a5182ce1d8ef9ef32bff69037bd28b389bbdb66338f8069e61da7028cb/backports_zstd-1.3.0.tar.gz", hash = "sha256:e8b2d68e2812f5c9970cabc5e21da8b409b5ed04e79b4585dbffa33e9b45ebe2", size = 997138, upload-time = "2025-12-29T17:28:06.143Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ac/28/ed31a0e35feb4538a996348362051b52912d50f00d25c2d388eccef9242c/backports_zstd-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:249f90b39d3741c48620021a968b35f268ca70e35f555abeea9ff95a451f35f9", size = 435660, upload-time = "2025-12-29T17:25:55.207Z" }, { url = "https://files.pythonhosted.org/packages/00/0d/3db362169d80442adda9dd563c4f0bb10091c8c1c9a158037f4ecd53988e/backports_zstd-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b0e71e83e46154a9d3ced6d4de9a2fea8207ee1e4832aeecf364dc125eda305c", size = 362056, upload-time = "2025-12-29T17:25:56.729Z" }, { url = "https://files.pythonhosted.org/packages/bd/00/b67ba053a7d6f6dbe2f8a704b7d3a5e01b1d2e2e8edbc9b634f2702ef73c/backports_zstd-1.3.0-cp311-cp311-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:cbc6193acd21f96760c94dd71bf32b161223e8503f5277acb0a5ab54e5598957", size = 505957, upload-time = "2025-12-29T17:25:57.941Z" }, { url = "https://files.pythonhosted.org/packages/6f/3e/2667c0ddb53ddf28667e330bf9fe92e8e17705a481c9b698e283120565f7/backports_zstd-1.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1df583adc0ae84a8d13d7139f42eade6d90182b1dd3e0d28f7df3c564b9fd55d", size = 475569, upload-time = "2025-12-29T17:25:59.075Z" }, { url = "https://files.pythonhosted.org/packages/eb/86/4052473217bd954ccdffda5f7264a0e99e7c4ecf70c0f729845c6a45fc5a/backports_zstd-1.3.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d833fc23aa3cc2e05aeffc7cfadd87b796654ad3a7fb214555cda3f1db2d4dc2", size = 581196, upload-time = "2025-12-29T17:26:00.508Z" }, { url = "https://files.pythonhosted.org/packages/e5/bd/064f6fdb61db3d2c473159ebc844243e650dc032de0f8208443a00127925/backports_zstd-1.3.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:142178fe981061f1d2a57c5348f2cd31a3b6397a35593e7a17dbda817b793a7f", size = 640888, upload-time = "2025-12-29T17:26:02.134Z" }, { url = "https://files.pythonhosted.org/packages/d8/09/0822403f40932a165a4f1df289d41653683019e4fd7a86b63ed20e9b6177/backports_zstd-1.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5eed0a09a163f3a8125a857cb031be87ed052e4a47bc75085ed7fca786e9bb5b", size = 491100, upload-time = "2025-12-29T17:26:03.418Z" }, { url = "https://files.pythonhosted.org/packages/a6/a3/f5ac28d74039b7e182a780809dc66b9dbfc893186f5d5444340bba135389/backports_zstd-1.3.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:60aa483fef5843749e993dde01229e5eedebca8c283023d27d6bf6800d1d4ce3", size = 565071, upload-time = "2025-12-29T17:26:05.022Z" }, { url = "https://files.pythonhosted.org/packages/e1/ac/50209aeb92257a642ee987afa1e61d5b6731ab6bf0bff70905856e5aede6/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ea0886c1b619773544546e243ed73f6d6c2b1ae3c00c904ccc9903a352d731e1", size = 481519, upload-time = "2025-12-29T17:26:06.255Z" }, { url = "https://files.pythonhosted.org/packages/08/1f/b06f64199fb4b2e9437cedbf96d0155ca08aeec35fe81d41065acd44762e/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5e137657c830a5ce99be40a1d713eb1d246bae488ada28ff0666ac4387aebdd5", size = 509465, upload-time = "2025-12-29T17:26:07.602Z" }, { url = "https://files.pythonhosted.org/packages/f4/37/2c365196e61c8fffbbc930ffd69f1ada7aa1c7210857b3e565031c787ac6/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94048c8089755e482e4b34608029cf1142523a625873c272be2b1c9253871a72", size = 585552, upload-time = "2025-12-29T17:26:08.911Z" }, { url = "https://files.pythonhosted.org/packages/93/8d/c2c4f448bb6b6c9df17410eaedce415e8db0eb25b60d09a3d22a98294d09/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:d339c1ec40485e97e600eb9a285fb13169dbf44c5094b945788a62f38b96e533", size = 562893, upload-time = "2025-12-29T17:26:10.566Z" }, { url = "https://files.pythonhosted.org/packages/74/e8/2110d4d39115130f7514cbbcec673a885f4052bb68d15e41bc96a7558856/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aeee9210c54cf8bf83f4d263a6d0d6e7a0298aeb5a14a0a95e90487c5c3157c", size = 631462, upload-time = "2025-12-29T17:26:11.99Z" }, { url = "https://files.pythonhosted.org/packages/b9/a8/d64b59ae0714fdace14e43873f794eff93613e35e3e85eead33a4f44cd80/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba7114a3099e5ea05cbb46568bd0e08bca2ca11e12c6a7b563a24b86b2b4a67f", size = 495125, upload-time = "2025-12-29T17:26:13.218Z" }, { url = "https://files.pythonhosted.org/packages/ef/d8/bcff0a091fcf27172c57ae463e49d8dec6dc31e01d7e7bf1ae3aad9c3566/backports_zstd-1.3.0-cp311-cp311-win32.whl", hash = "sha256:08dfdfb85da5915383bfae680b6ac10ab5769ab22e690f9a854320720011ae8e", size = 288664, upload-time = "2025-12-29T17:26:14.791Z" }, { url = "https://files.pythonhosted.org/packages/28/1a/379061e2abf8c3150ad51c1baab9ac723e01cf7538860a6a74c48f8b73ee/backports_zstd-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8aac2e7cdcc8f310c16f98a0062b48d0a081dbb82862794f4f4f5bdafde30a4", size = 313633, upload-time = "2025-12-29T17:26:16.31Z" }, { url = "https://files.pythonhosted.org/packages/35/e7/eca40858883029fc716660106069b23253e2ec5fd34e86b4101c8cfe864b/backports_zstd-1.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:440ef1be06e82dc0d69dbb57177f2ce98bbd2151013ee7e551e2f2b54caa6120", size = 288814, upload-time = "2025-12-29T17:26:17.571Z" }, { url = "https://files.pythonhosted.org/packages/72/d4/356da49d3053f4bc50e71a8535631b57bc9ca4e8c6d2442e073e0ab41c44/backports_zstd-1.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f4a292e357f3046d18766ce06d990ccbab97411708d3acb934e63529c2ea7786", size = 435972, upload-time = "2025-12-29T17:26:18.752Z" }, { url = "https://files.pythonhosted.org/packages/30/8f/dbe389e60c7e47af488520f31a4aa14028d66da5bf3c60d3044b571eb906/backports_zstd-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb4c386f38323698991b38edcc9c091d46d4713f5df02a3b5c80a28b40e289ea", size = 362124, upload-time = "2025-12-29T17:26:19.995Z" }, { url = "https://files.pythonhosted.org/packages/55/4b/173beafc99e99e7276ce008ef060b704471e75124c826bc5e2092815da37/backports_zstd-1.3.0-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f52523d2bdada29e653261abdc9cfcecd9e5500d305708b7e37caddb24909d4e", size = 506378, upload-time = "2025-12-29T17:26:21.855Z" }, { url = "https://files.pythonhosted.org/packages/df/c8/3f12a411d9a99d262cdb37b521025eecc2aa7e4a93277be3f4f4889adb74/backports_zstd-1.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3321d00beaacbd647252a7f581c1e1cdbdbda2407f2addce4bfb10e8e404b7c7", size = 476201, upload-time = "2025-12-29T17:26:23.047Z" }, { url = "https://files.pythonhosted.org/packages/43/dc/73c090e4a2d5671422512e1b6d276ca6ea0cc0c45ec4634789106adc0d66/backports_zstd-1.3.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:88f94d238ef36c639c0ae17cf41054ce103da9c4d399c6a778ce82690d9f4919", size = 581659, upload-time = "2025-12-29T17:26:24.189Z" }, { url = "https://files.pythonhosted.org/packages/08/4f/11bfcef534aa2bf3f476f52130217b45337f334d8a287edb2e06744a6515/backports_zstd-1.3.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:97d8c78fe20c7442c810adccfd5e3ea6a4e6f4f1fa4c73da2bc083260ebead17", size = 640388, upload-time = "2025-12-29T17:26:25.47Z" }, { url = "https://files.pythonhosted.org/packages/71/17/8faea426d4f49b63238bdfd9f211a9f01c862efe0d756d3abeb84265a4e2/backports_zstd-1.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eefda80c3dbfbd924f1c317e7b0543d39304ee645583cb58bae29e19f42948ed", size = 494173, upload-time = "2025-12-29T17:26:26.736Z" }, { url = "https://files.pythonhosted.org/packages/ba/9d/901f19ac90f3cd999bdcfb6edb4d7b4dc383dfba537f06f533fc9ac4777b/backports_zstd-1.3.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2ab5d3b5a54a674f4f6367bb9e0914063f22cd102323876135e9cc7a8f14f17e", size = 568628, upload-time = "2025-12-29T17:26:28.12Z" }, { url = "https://files.pythonhosted.org/packages/60/39/4d29788590c2465a570c2fae49dbff05741d1f0c8e4a0fb2c1c310f31804/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7558fb0e8c8197c59a5f80c56bf8f56c3690c45fd62f14e9e2081661556e3e64", size = 482233, upload-time = "2025-12-29T17:26:29.399Z" }, { url = "https://files.pythonhosted.org/packages/d9/4b/24c7c9e8ef384b19d515a7b1644a500ceb3da3baeff6d579687da1a0f62b/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:27744870e38f017159b9c0241ea51562f94c7fefcfa4c5190fb3ec4a65a7fc63", size = 509806, upload-time = "2025-12-29T17:26:30.605Z" }, { url = "https://files.pythonhosted.org/packages/3f/7e/7ba1aeecf0b5859f1855c0e661b4559566b64000f0627698ebd9e83f2138/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b099750755bb74c280827c7d68de621da0f245189082ab48ff91bda0ec2db9df", size = 586037, upload-time = "2025-12-29T17:26:32.201Z" }, { url = "https://files.pythonhosted.org/packages/4a/1a/18f0402b36b9cfb0aea010b5df900cfd42c214f37493561dba3abac90c4e/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5434e86f2836d453ae3e19a2711449683b7e21e107686838d12a255ad256ca99", size = 566220, upload-time = "2025-12-29T17:26:33.5Z" }, { url = "https://files.pythonhosted.org/packages/dc/d9/44c098ab31b948bbfd909ec4ae08e1e44c5025a2d846f62991a62ab3ebea/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:407e451f64e2f357c9218f5be4e372bb6102d7ae88582d415262a9d0a4f9b625", size = 630847, upload-time = "2025-12-29T17:26:35.273Z" }, { url = "https://files.pythonhosted.org/packages/30/33/e74cb2cfb162d2e9e00dad8bcdf53118ca7786cfd467925d6864732f79cc/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:58a071f3c198c781b2df801070290b7174e3ff61875454e9df93ab7ea9ea832b", size = 498665, upload-time = "2025-12-29T17:26:37.123Z" }, { url = "https://files.pythonhosted.org/packages/a2/a9/67a24007c333ed22736d5cd79f1aa1d7209f09be772ff82a8fd724c1978e/backports_zstd-1.3.0-cp312-cp312-win32.whl", hash = "sha256:21a9a542ccc7958ddb51ae6e46d8ed25d585b54d0d52aaa1c8da431ea158046a", size = 288809, upload-time = "2025-12-29T17:26:38.373Z" }, { url = "https://files.pythonhosted.org/packages/42/24/34b816118ea913debb2ea23e71ffd0fb2e2ac738064c4ac32e3fb62c18bb/backports_zstd-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:89ea8281821123b071a06b30b80da8e4d8a2b40a4f57315a19850337a21297ac", size = 313815, upload-time = "2025-12-29T17:26:39.665Z" }, { url = "https://files.pythonhosted.org/packages/4e/2f/babd02c9fc4ca35376ada7c291193a208165c7be2455f0f98bc1e1243f31/backports_zstd-1.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:f6843ecb181480e423b02f60fe29e393cbc31a95fb532acdf0d3a2c87bd50ce3", size = 288927, upload-time = "2025-12-29T17:26:40.923Z" }, { url = "https://files.pythonhosted.org/packages/0c/7d/53e8da5950cdfc5e8fe23efd5165ce2f4fed5222f9a3292e0cdb03dd8c0d/backports_zstd-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e86e03e3661900955f01afed6c59cae9baa63574e3b66896d99b7de97eaffce9", size = 435463, upload-time = "2025-12-29T17:26:42.152Z" }, { url = "https://files.pythonhosted.org/packages/da/78/f98e53870f7404071a41e3d04f2ff514302eeeb3279d931d02b220f437aa/backports_zstd-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:41974dcacc9824c1effe1c8d2f9d762bcf47d265ca4581a3c63321c7b06c61f0", size = 361740, upload-time = "2025-12-29T17:26:43.377Z" }, { url = "https://files.pythonhosted.org/packages/6d/ed/2c64706205a944c9c346d95c17f632d4e3468db3ce60efb6f5caa7c0dcae/backports_zstd-1.3.0-cp313-cp313-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:3090a97738d6ce9545d3ca5446df43370928092a962cbc0153e5445a947e98ed", size = 505651, upload-time = "2025-12-29T17:26:44.495Z" }, { url = "https://files.pythonhosted.org/packages/7b/7b/22998f691dc6e0c7e6fa81d611eb4b1f6a72fb27327f322366d4a7ca8fb3/backports_zstd-1.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddc874638abf03ea1ff3b0525b4a26a8d0adf7cb46a448c3449f08e4abc276b3", size = 475859, upload-time = "2025-12-29T17:26:45.722Z" }, { url = "https://files.pythonhosted.org/packages/0b/78/0cde898339a339530e5f932634872d2d64549969535447a48d3b98959e11/backports_zstd-1.3.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:db609e57b8ed88b3472930c87e93c08a4bbd5ffeb94608cd9c7c6f0ac0e166c6", size = 581339, upload-time = "2025-12-29T17:26:46.93Z" }, { url = "https://files.pythonhosted.org/packages/e2/1d/e0973e0eebe678c12c146473af2c54cda8a3e63b179785ca1a20727ad69c/backports_zstd-1.3.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5f13033a3dd95f323c067199f2e61b4589a7880188ef4ef356c7ffbdb78a9f11", size = 642182, upload-time = "2025-12-29T17:26:48.545Z" }, { url = "https://files.pythonhosted.org/packages/82/a2/ac67e79e137eb98aead66c7162bafe3cffcb82ef9cdeb6367ec18d88fbce/backports_zstd-1.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c4c7bcda5619a754726e7f5b391827f5efbe4bed8e62e9ec7490d42bff18aa6", size = 490807, upload-time = "2025-12-29T17:26:49.789Z" }, { url = "https://files.pythonhosted.org/packages/0f/e9/3514b1d065801ae7dce05246e9389003ed8fb1d7c3d71f85aa07a80f41e6/backports_zstd-1.3.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:884a94c40f27affe986f394f219a4fd3cbbd08e1cff2e028d29d467574cd266e", size = 566103, upload-time = "2025-12-29T17:26:51.062Z" }, { url = "https://files.pythonhosted.org/packages/1b/03/10ddb54cbf032e5fe390c0776d3392611b1fc772d6c3cb5a9bcdff4f915f/backports_zstd-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497f5765126f11a5b3fd8fedfdae0166d1dd867e7179b8148370a3313d047197", size = 481614, upload-time = "2025-12-29T17:26:52.255Z" }, { url = "https://files.pythonhosted.org/packages/5c/13/21efa7f94c41447f43aee1563b05fc540a235e61bce4597754f6c11c2e97/backports_zstd-1.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a6ff6769948bb29bba07e1c2e8582d5a9765192a366108e42d6581a458475881", size = 509207, upload-time = "2025-12-29T17:26:53.496Z" }, { url = "https://files.pythonhosted.org/packages/de/e7/12da9256d9e49e71030f0ff75e9f7c258e76091a4eaf5b5f414409be6a57/backports_zstd-1.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1623e5bff1acd9c8ef90d24fc548110f20df2d14432bfe5de59e76fc036824ef", size = 585765, upload-time = "2025-12-29T17:26:54.99Z" }, { url = "https://files.pythonhosted.org/packages/24/bf/59ca9cb4e7be1e59331bb792e8ef1331828efe596b1a2f8cbbc4e3f70d75/backports_zstd-1.3.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:622c28306dcc429c8f2057fc4421d5722b1f22968d299025b35d71b50cfd4e03", size = 563852, upload-time = "2025-12-29T17:26:56.371Z" }, { url = "https://files.pythonhosted.org/packages/7c/ee/5a3eaed9a73bdf2c35dc0c7adc0616a99588e0de28f5ab52f3e0caaaa96f/backports_zstd-1.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09a2785e410ed2e812cb39b684ef5eb55083a5897bfd0e6f5de3bbd2c6345f70", size = 632549, upload-time = "2025-12-29T17:26:57.598Z" }, { url = "https://files.pythonhosted.org/packages/75/b9/c823633afc48a1ac56d6ad34289c8f51b0234685142531bfa8197ca91777/backports_zstd-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ade1f4127fdbe36a02f8067d75aa79c1ea1c8a306bf63c7b818bb7b530e1beaa", size = 495104, upload-time = "2025-12-29T17:26:58.826Z" }, { url = "https://files.pythonhosted.org/packages/a3/8f/6f7030f18fa7307f87b0f57108a50a3a540b6350e2486d1739c0567629a3/backports_zstd-1.3.0-cp313-cp313-win32.whl", hash = "sha256:668e6fb1805b825cb7504c71436f7b28d4d792bb2663ee901ec9a2bb15804437", size = 288447, upload-time = "2025-12-29T17:27:00.036Z" }, { url = "https://files.pythonhosted.org/packages/a2/82/b1df1bbbe4e6d3ffd364d0bcffdeb6c4361115c1eccd91238dbdd0c07fec/backports_zstd-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:385bdadf0ea8fe6ba780a95e4c7d7f018db7bafdd630932f0f9f0fad05d608ff", size = 313664, upload-time = "2025-12-29T17:27:01.267Z" }, { url = "https://files.pythonhosted.org/packages/45/0f/60918fe4d3f2881de8f4088d73be4837df9e4c6567594109d355a2d548b6/backports_zstd-1.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:4321a8a367537224b3559fe7aeb8012b98aea2a60a737e59e51d86e2e856fe0a", size = 288678, upload-time = "2025-12-29T17:27:02.506Z" }, { url = "https://files.pythonhosted.org/packages/a7/b9/35f423c0bcd85020d5e7be6ab8d7517843e3e4441071beb5c3bd8c5216cb/backports_zstd-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:10057d66fa4f0a7d3f6419ffb84b4fe61088da572e3ac4446134a1c8089e4166", size = 436155, upload-time = "2025-12-29T17:27:03.859Z" }, { url = "https://files.pythonhosted.org/packages/f6/14/e504daea24e8916f14ecbc223c354b558d8410cfc846606668ab91d96b38/backports_zstd-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4abf29d706ba05f658ca0247eb55675bcc00e10f12bca15736e45b05f1f2d2dc", size = 362436, upload-time = "2025-12-29T17:27:05.076Z" }, { url = "https://files.pythonhosted.org/packages/c4/f7/06e178dbab7edb88c2872aebd68b54137e07a169eba1aeedf614014f7036/backports_zstd-1.3.0-cp313-cp313t-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:127b0d73c745b0684da3d95c31c0939570810dad8967dfe8231eea8f0e047b2f", size = 507600, upload-time = "2025-12-29T17:27:06.254Z" }, { url = "https://files.pythonhosted.org/packages/3e/f1/2ce499b81c4389d6fa1eeea7e76f6e0bad48effdbb239da7cbcdaaf24b76/backports_zstd-1.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0205ef809fb38bb5ca7f59fa03993596f918768b9378fb7fbd8a68889a6ce028", size = 475496, upload-time = "2025-12-29T17:27:07.939Z" }, { url = "https://files.pythonhosted.org/packages/18/1e/c82a586f2866aabf3a601a521af3c58756d83d98b724fda200016ac5e7e2/backports_zstd-1.3.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1c389b667b0b07915781aa28beabf2481f11a6062a1a081873c4c443b98601a7", size = 580919, upload-time = "2025-12-29T17:27:09.1Z" }, { url = "https://files.pythonhosted.org/packages/1b/a3/eb5d9b7c4cb69d1b8ccd011abe244ba6815693b70bed07ed4b77ddda4535/backports_zstd-1.3.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8e7ac5ef693d49d6fb35cd7bbb98c4762cfea94a8bd2bf2ab112027004f70b11", size = 639913, upload-time = "2025-12-29T17:27:10.433Z" }, { url = "https://files.pythonhosted.org/packages/11/2c/7296b99df79d9f31174a99c81c1964a32de8996ce2b3068f5bc66b413615/backports_zstd-1.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d5543945aae2a76a850b23f283249424f535de6a622d6002957b7d971e6a36d", size = 494800, upload-time = "2025-12-29T17:27:11.59Z" }, { url = "https://files.pythonhosted.org/packages/f9/fc/b8ae6e104ba72d20cd5f9dfd9baee36675e89c81d432434927967114f30f/backports_zstd-1.3.0-cp313-cp313t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e38be15ebce82737deda2c9410c1f942f1df9da74121049243a009810432db75", size = 570396, upload-time = "2025-12-29T17:27:13.063Z" }, { url = "https://files.pythonhosted.org/packages/30/56/60a7a9de7a5bc951ea1106358b413c95183c93480394f3abc541313c8679/backports_zstd-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3e3f58c76f4730607a4e0130d629173aa114ae72a5c8d3d5ad94e1bf51f18d8", size = 481980, upload-time = "2025-12-29T17:27:14.317Z" }, { url = "https://files.pythonhosted.org/packages/4b/bb/93fc1e8e81b8ecba58b0e53a14f7b44375cf837db6354410998f0c4cb6ff/backports_zstd-1.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b808bf889722d889b792f7894e19c1f904bb0e9092d8c0eb0787b939b08bad9a", size = 511358, upload-time = "2025-12-29T17:27:15.669Z" }, { url = "https://files.pythonhosted.org/packages/ae/0f/b165c2a6080d22306975cd86ce97270208493f31a298867e343110570370/backports_zstd-1.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f7be27d56f2f715bcd252d0c65c232146d8e1e039c7e2835b8a3ad3dc88bc508", size = 585492, upload-time = "2025-12-29T17:27:16.986Z" }, { url = "https://files.pythonhosted.org/packages/26/76/85b4bde76e982b24a7eb57a2fb9868807887bef4d2114a3654a6530a67ef/backports_zstd-1.3.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:cbe341c7fcc723893663a37175ba859328b907a4e6d2d40a4c26629cc55efb67", size = 568309, upload-time = "2025-12-29T17:27:18.28Z" }, { url = "https://files.pythonhosted.org/packages/83/64/9490667827a320766fb883f358a7c19171fdc04f19ade156a8c341c36967/backports_zstd-1.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:b4116a9e12dfcd834dd9132cf6a94657bf0d328cba5b295f26de26ea0ae1adc8", size = 630518, upload-time = "2025-12-29T17:27:19.525Z" }, { url = "https://files.pythonhosted.org/packages/ea/43/258587233b728bbff457bdb0c52b3e08504c485a8642b3daeb0bdd5a76bc/backports_zstd-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1049e804cc8754290b24dab383d4d6ed0b7f794ad8338813ddcb3907d15a89d0", size = 499429, upload-time = "2025-12-29T17:27:21.063Z" }, { url = "https://files.pythonhosted.org/packages/32/04/cfab76878f360f124dbb533779e1e4603c801a0f5ada72ae5c742b7c4d7d/backports_zstd-1.3.0-cp313-cp313t-win32.whl", hash = "sha256:7d3f0f2499d2049ec53d2674c605a4b3052c217cc7ee49c05258046411685adc", size = 289389, upload-time = "2025-12-29T17:27:22.287Z" }, { url = "https://files.pythonhosted.org/packages/cb/ff/dbcfb6c9c922ab6d98f3d321e7d0c7b34ecfa26f3ca71d930fe1ef639737/backports_zstd-1.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:eb2f8fab0b1ea05148394cb34a9e543a43477178765f2d6e7c84ed332e34935e", size = 314776, upload-time = "2025-12-29T17:27:23.458Z" }, { url = "https://files.pythonhosted.org/packages/01/4b/82e4baae3117806639fe1c693b1f2f7e6133a7cefd1fa2e38018c8edcd68/backports_zstd-1.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:c66ad9eb5bfbe28c2387b7fc58ddcdecfb336d6e4e60bcba1694a906c1f21a6c", size = 289315, upload-time = "2025-12-29T17:27:24.601Z" }, { url = "https://files.pythonhosted.org/packages/9a/d9/8c9c246e5ea79a4f45d551088b11b61f2dc7efcdc5dbe6df3be84a506e0c/backports_zstd-1.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:968167d29f012cee7b112ad031a8925e484e97e99288e55e4d62962c3a1013e3", size = 409666, upload-time = "2025-12-29T17:27:57.37Z" }, { url = "https://files.pythonhosted.org/packages/a4/4f/a55b33c314ca8c9074e99daab54d04c5d212070ae7dbc435329baf1b139e/backports_zstd-1.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8f6fc7d62b71083b574193dd8fb3a60e6bb34880cc0132aad242943af301f7a", size = 339199, upload-time = "2025-12-29T17:27:58.542Z" }, { url = "https://files.pythonhosted.org/packages/9d/13/ce31bd048b1c88d0f65d7af60b6cf89cfbed826c7c978f0ebca9a8a71cfc/backports_zstd-1.3.0-pp311-pypy311_pp73-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:e0f2eca6aac280fdb77991ad3362487ee91a7fb064ad40043fb5a0bf5a376943", size = 420332, upload-time = "2025-12-29T17:28:00.332Z" }, { url = "https://files.pythonhosted.org/packages/cf/80/c0cdbc533d0037b57248588403a3afb050b2a83b8c38aa608e31b3a4d600/backports_zstd-1.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:676eb5e177d4ef528cf3baaeea4fffe05f664e4dd985d3ac06960ef4619c81a9", size = 393879, upload-time = "2025-12-29T17:28:01.57Z" }, { url = "https://files.pythonhosted.org/packages/0f/38/c97428867cac058ed196ccaeddfdf82ecd43b8a65965f2950a6e7547e77a/backports_zstd-1.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:199eb9bd8aca6a9d489c41a682fad22c587dffe57b613d0fe6d492d0d38ce7c5", size = 413842, upload-time = "2025-12-29T17:28:03.113Z" }, { url = "https://files.pythonhosted.org/packages/8d/ec/6247be6536668fe1c7dfae3eaa9c94b00b956b716957c0fc986ba78c3cc4/backports_zstd-1.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2524bd6777a828d5e7ccd7bd1a57f9e7007ae654fc2bd1bc1a207f6428674e4a", size = 299684, upload-time = "2025-12-29T17:28:04.856Z" }, ] [[package]] name = "backrefs" version = "6.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/86/e3/bb3a439d5cb255c4774724810ad8073830fac9c9dee123555820c1bcc806/backrefs-6.1.tar.gz", hash = "sha256:3bba1749aafe1db9b915f00e0dd166cba613b6f788ffd63060ac3485dc9be231", size = 7011962, upload-time = "2025-11-15T14:52:08.323Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3b/ee/c216d52f58ea75b5e1841022bbae24438b19834a29b163cb32aa3a2a7c6e/backrefs-6.1-py310-none-any.whl", hash = "sha256:2a2ccb96302337ce61ee4717ceacfbf26ba4efb1d55af86564b8bbaeda39cac1", size = 381059, upload-time = "2025-11-15T14:51:59.758Z" }, { url = "https://files.pythonhosted.org/packages/e6/9a/8da246d988ded941da96c7ed945d63e94a445637eaad985a0ed88787cb89/backrefs-6.1-py311-none-any.whl", hash = "sha256:e82bba3875ee4430f4de4b6db19429a27275d95a5f3773c57e9e18abc23fd2b7", size = 392854, upload-time = "2025-11-15T14:52:01.194Z" }, { url = "https://files.pythonhosted.org/packages/37/c9/fd117a6f9300c62bbc33bc337fd2b3c6bfe28b6e9701de336b52d7a797ad/backrefs-6.1-py312-none-any.whl", hash = "sha256:c64698c8d2269343d88947c0735cb4b78745bd3ba590e10313fbf3f78c34da5a", size = 398770, upload-time = "2025-11-15T14:52:02.584Z" }, { url = "https://files.pythonhosted.org/packages/eb/95/7118e935b0b0bd3f94dfec2d852fd4e4f4f9757bdb49850519acd245cd3a/backrefs-6.1-py313-none-any.whl", hash = "sha256:4c9d3dc1e2e558965202c012304f33d4e0e477e1c103663fd2c3cc9bb18b0d05", size = 400726, upload-time = "2025-11-15T14:52:04.093Z" }, { url = "https://files.pythonhosted.org/packages/1d/72/6296bad135bfafd3254ae3648cd152980a424bd6fed64a101af00cc7ba31/backrefs-6.1-py314-none-any.whl", hash = "sha256:13eafbc9ccd5222e9c1f0bec563e6d2a6d21514962f11e7fc79872fd56cbc853", size = 412584, upload-time = "2025-11-15T14:52:05.233Z" }, { url = "https://files.pythonhosted.org/packages/02/e3/a4fa1946722c4c7b063cc25043a12d9ce9b4323777f89643be74cef2993c/backrefs-6.1-py39-none-any.whl", hash = "sha256:a9e99b8a4867852cad177a6430e31b0f6e495d65f8c6c134b68c14c3c95bf4b0", size = 381058, upload-time = "2025-11-15T14:52:06.698Z" }, ] [[package]] name = "cairocffi" version = "1.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload-time = "2024-06-18T10:56:06.741Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload-time = "2024-06-18T10:55:59.489Z" }, ] [[package]] name = "cairosvg" version = "2.8.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cairocffi" }, { name = "cssselect2" }, { name = "defusedxml" }, { name = "pillow" }, { name = "tinycss2" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload-time = "2025-05-15T06:56:32.653Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload-time = "2025-05-15T06:56:28.552Z" }, ] [[package]] name = "certifi" version = "2026.1.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, ] [[package]] name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] [[package]] name = "cfgv" version = "3.5.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] [[package]] name = "click" version = "8.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] [[package]] name = "click-plugins" version = "1.1.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c3/a4/34847b59150da33690a36da3681d6bbc2ec14ee9a846bc30a6746e5984e4/click_plugins-1.1.1.2.tar.gz", hash = "sha256:d7af3984a99d243c131aa1a828331e7630f4a88a9741fd05c927b204bcf92261", size = 8343, upload-time = "2025-06-25T00:47:37.555Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3d/9a/2abecb28ae875e39c8cad711eb1186d8d14eab564705325e77e4e6ab9ae5/click_plugins-1.1.1.2-py2.py3-none-any.whl", hash = "sha256:008d65743833ffc1f5417bf0e78e8d2c23aab04d9745ba817bd3e71b0feb6aa6", size = 11051, upload-time = "2025-06-25T00:47:36.731Z" }, ] [[package]] name = "cligj" version = "0.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ea/0d/837dbd5d8430fd0f01ed72c4cfb2f548180f4c68c635df84ce87956cff32/cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", size = 9803, upload-time = "2021-05-28T21:23:27.935Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/73/86/43fa9f15c5b9fb6e82620428827cd3c284aa933431405d1bcf5231ae3d3e/cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df", size = 7069, upload-time = "2021-05-28T21:23:26.877Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "coverage" version = "7.13.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/11/43/3e4ac666cc35f231fa70c94e9f38459299de1a152813f9d2f60fc5f3ecaf/coverage-7.13.3.tar.gz", hash = "sha256:f7f6182d3dfb8802c1747eacbfe611b669455b69b7c037484bb1efbbb56711ac", size = 826832, upload-time = "2026-02-03T14:02:30.944Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ec/09/1ac74e37cf45f17eb41e11a21854f7f92a4c2d6c6098ef4a1becb0c6d8d3/coverage-7.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5907605ee20e126eeee2abe14aae137043c2c8af2fa9b38d2ab3b7a6b8137f73", size = 219276, upload-time = "2026-02-03T14:00:00.296Z" }, { url = "https://files.pythonhosted.org/packages/2e/cb/71908b08b21beb2c437d0d5870c4ec129c570ca1b386a8427fcdb11cf89c/coverage-7.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a88705500988c8acad8b8fd86c2a933d3aa96bec1ddc4bc5cb256360db7bbd00", size = 219776, upload-time = "2026-02-03T14:00:02.414Z" }, { url = "https://files.pythonhosted.org/packages/09/85/c4f3dd69232887666a2c0394d4be21c60ea934d404db068e6c96aa59cd87/coverage-7.13.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bbb5aa9016c4c29e3432e087aa29ebee3f8fda089cfbfb4e6d64bd292dcd1c2", size = 250196, upload-time = "2026-02-03T14:00:04.197Z" }, { url = "https://files.pythonhosted.org/packages/9c/cc/560ad6f12010344d0778e268df5ba9aa990aacccc310d478bf82bf3d302c/coverage-7.13.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0c2be202a83dde768937a61cdc5d06bf9fb204048ca199d93479488e6247656c", size = 252111, upload-time = "2026-02-03T14:00:05.639Z" }, { url = "https://files.pythonhosted.org/packages/f0/66/3193985fb2c58e91f94cfbe9e21a6fdf941e9301fe2be9e92c072e9c8f8c/coverage-7.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f45e32ef383ce56e0ca099b2e02fcdf7950be4b1b56afaab27b4ad790befe5b", size = 254217, upload-time = "2026-02-03T14:00:07.738Z" }, { url = "https://files.pythonhosted.org/packages/c5/78/f0f91556bf1faa416792e537c523c5ef9db9b1d32a50572c102b3d7c45b3/coverage-7.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ed2e787249b922a93cd95c671cc9f4c9797a106e81b455c83a9ddb9d34590c0", size = 250318, upload-time = "2026-02-03T14:00:09.224Z" }, { url = "https://files.pythonhosted.org/packages/6f/aa/fc654e45e837d137b2c1f3a2cc09b4aea1e8b015acd2f774fa0f3d2ddeba/coverage-7.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:05dd25b21afffe545e808265897c35f32d3e4437663923e0d256d9ab5031fb14", size = 251909, upload-time = "2026-02-03T14:00:10.712Z" }, { url = "https://files.pythonhosted.org/packages/73/4d/ab53063992add8a9ca0463c9d92cce5994a29e17affd1c2daa091b922a93/coverage-7.13.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:46d29926349b5c4f1ea4fca95e8c892835515f3600995a383fa9a923b5739ea4", size = 249971, upload-time = "2026-02-03T14:00:12.402Z" }, { url = "https://files.pythonhosted.org/packages/29/25/83694b81e46fcff9899694a1b6f57573429cdd82b57932f09a698f03eea5/coverage-7.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fae6a21537519c2af00245e834e5bf2884699cc7c1055738fd0f9dc37a3644ad", size = 249692, upload-time = "2026-02-03T14:00:13.868Z" }, { url = "https://files.pythonhosted.org/packages/d4/ef/d68fc304301f4cb4bf6aefa0045310520789ca38dabdfba9dbecd3f37919/coverage-7.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c672d4e2f0575a4ca2bf2aa0c5ced5188220ab806c1bb6d7179f70a11a017222", size = 250597, upload-time = "2026-02-03T14:00:15.461Z" }, { url = "https://files.pythonhosted.org/packages/8d/85/240ad396f914df361d0f71e912ddcedb48130c71b88dc4193fe3c0306f00/coverage-7.13.3-cp311-cp311-win32.whl", hash = "sha256:fcda51c918c7a13ad93b5f89a58d56e3a072c9e0ba5c231b0ed81404bf2648fb", size = 221773, upload-time = "2026-02-03T14:00:17.462Z" }, { url = "https://files.pythonhosted.org/packages/2f/71/165b3a6d3d052704a9ab52d11ea64ef3426745de517dda44d872716213a7/coverage-7.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:d1a049b5c51b3b679928dd35e47c4a2235e0b6128b479a7596d0ef5b42fa6301", size = 222711, upload-time = "2026-02-03T14:00:19.449Z" }, { url = "https://files.pythonhosted.org/packages/51/d0/0ddc9c5934cdd52639c5df1f1eb0fdab51bb52348f3a8d1c7db9c600d93a/coverage-7.13.3-cp311-cp311-win_arm64.whl", hash = "sha256:79f2670c7e772f4917895c3d89aad59e01f3dbe68a4ed2d0373b431fad1dcfba", size = 221377, upload-time = "2026-02-03T14:00:20.968Z" }, { url = "https://files.pythonhosted.org/packages/94/44/330f8e83b143f6668778ed61d17ece9dc48459e9e74669177de02f45fec5/coverage-7.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ed48b4170caa2c4420e0cd27dc977caaffc7eecc317355751df8373dddcef595", size = 219441, upload-time = "2026-02-03T14:00:22.585Z" }, { url = "https://files.pythonhosted.org/packages/08/e7/29db05693562c2e65bdf6910c0af2fd6f9325b8f43caf7a258413f369e30/coverage-7.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8f2adf4bcffbbec41f366f2e6dffb9d24e8172d16e91da5799c9b7ed6b5716e6", size = 219801, upload-time = "2026-02-03T14:00:24.186Z" }, { url = "https://files.pythonhosted.org/packages/90/ae/7f8a78249b02b0818db46220795f8ac8312ea4abd1d37d79ea81db5cae81/coverage-7.13.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01119735c690786b6966a1e9f098da4cd7ca9174c4cfe076d04e653105488395", size = 251306, upload-time = "2026-02-03T14:00:25.798Z" }, { url = "https://files.pythonhosted.org/packages/62/71/a18a53d1808e09b2e9ebd6b47dad5e92daf4c38b0686b4c4d1b2f3e42b7f/coverage-7.13.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8bb09e83c603f152d855f666d70a71765ca8e67332e5829e62cb9466c176af23", size = 254051, upload-time = "2026-02-03T14:00:27.474Z" }, { url = "https://files.pythonhosted.org/packages/4a/0a/eb30f6455d04c5a3396d0696cad2df0269ae7444bb322f86ffe3376f7bf9/coverage-7.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b607a40cba795cfac6d130220d25962931ce101f2f478a29822b19755377fb34", size = 255160, upload-time = "2026-02-03T14:00:29.024Z" }, { url = "https://files.pythonhosted.org/packages/7b/7e/a45baac86274ce3ed842dbb84f14560c673ad30535f397d89164ec56c5df/coverage-7.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:44f14a62f5da2e9aedf9080e01d2cda61df39197d48e323538ec037336d68da8", size = 251709, upload-time = "2026-02-03T14:00:30.641Z" }, { url = "https://files.pythonhosted.org/packages/c0/df/dd0dc12f30da11349993f3e218901fdf82f45ee44773596050c8f5a1fb25/coverage-7.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:debf29e0b157769843dff0981cc76f79e0ed04e36bb773c6cac5f6029054bd8a", size = 253083, upload-time = "2026-02-03T14:00:32.14Z" }, { url = "https://files.pythonhosted.org/packages/ab/32/fc764c8389a8ce95cb90eb97af4c32f392ab0ac23ec57cadeefb887188d3/coverage-7.13.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:824bb95cd71604031ae9a48edb91fd6effde669522f960375668ed21b36e3ec4", size = 251227, upload-time = "2026-02-03T14:00:34.721Z" }, { url = "https://files.pythonhosted.org/packages/dd/ca/d025e9da8f06f24c34d2da9873957cfc5f7e0d67802c3e34d0caa8452130/coverage-7.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8f1010029a5b52dc427c8e2a8dbddb2303ddd180b806687d1acd1bb1d06649e7", size = 250794, upload-time = "2026-02-03T14:00:36.278Z" }, { url = "https://files.pythonhosted.org/packages/45/c7/76bf35d5d488ec8f68682eb8e7671acc50a6d2d1c1182de1d2b6d4ffad3b/coverage-7.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cd5dee4fd7659d8306ffa79eeaaafd91fa30a302dac3af723b9b469e549247e0", size = 252671, upload-time = "2026-02-03T14:00:38.368Z" }, { url = "https://files.pythonhosted.org/packages/bf/10/1921f1a03a7c209e1cb374f81a6b9b68b03cdb3ecc3433c189bc90e2a3d5/coverage-7.13.3-cp312-cp312-win32.whl", hash = "sha256:f7f153d0184d45f3873b3ad3ad22694fd73aadcb8cdbc4337ab4b41ea6b4dff1", size = 221986, upload-time = "2026-02-03T14:00:40.442Z" }, { url = "https://files.pythonhosted.org/packages/3c/7c/f5d93297f8e125a80c15545edc754d93e0ed8ba255b65e609b185296af01/coverage-7.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:03a6e5e1e50819d6d7436f5bc40c92ded7e484e400716886ac921e35c133149d", size = 222793, upload-time = "2026-02-03T14:00:42.106Z" }, { url = "https://files.pythonhosted.org/packages/43/59/c86b84170015b4555ebabca8649bdf9f4a1f737a73168088385ed0f947c4/coverage-7.13.3-cp312-cp312-win_arm64.whl", hash = "sha256:51c4c42c0e7d09a822b08b6cf79b3c4db8333fffde7450da946719ba0d45730f", size = 221410, upload-time = "2026-02-03T14:00:43.726Z" }, { url = "https://files.pythonhosted.org/packages/81/f3/4c333da7b373e8c8bfb62517e8174a01dcc373d7a9083698e3b39d50d59c/coverage-7.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:853c3d3c79ff0db65797aad79dee6be020efd218ac4510f15a205f1e8d13ce25", size = 219468, upload-time = "2026-02-03T14:00:45.829Z" }, { url = "https://files.pythonhosted.org/packages/d6/31/0714337b7d23630c8de2f4d56acf43c65f8728a45ed529b34410683f7217/coverage-7.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f75695e157c83d374f88dcc646a60cb94173304a9258b2e74ba5a66b7614a51a", size = 219839, upload-time = "2026-02-03T14:00:47.407Z" }, { url = "https://files.pythonhosted.org/packages/12/99/bd6f2a2738144c98945666f90cae446ed870cecf0421c767475fcf42cdbe/coverage-7.13.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2d098709621d0819039f3f1e471ee554f55a0b2ac0d816883c765b14129b5627", size = 250828, upload-time = "2026-02-03T14:00:49.029Z" }, { url = "https://files.pythonhosted.org/packages/6f/99/97b600225fbf631e6f5bfd3ad5bcaf87fbb9e34ff87492e5a572ff01bbe2/coverage-7.13.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:16d23d6579cf80a474ad160ca14d8b319abaa6db62759d6eef53b2fc979b58c8", size = 253432, upload-time = "2026-02-03T14:00:50.655Z" }, { url = "https://files.pythonhosted.org/packages/5f/5c/abe2b3490bda26bd4f5e3e799be0bdf00bd81edebedc2c9da8d3ef288fa8/coverage-7.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00d34b29a59d2076e6f318b30a00a69bf63687e30cd882984ed444e753990cc1", size = 254672, upload-time = "2026-02-03T14:00:52.757Z" }, { url = "https://files.pythonhosted.org/packages/31/ba/5d1957c76b40daff53971fe0adb84d9c2162b614280031d1d0653dd010c1/coverage-7.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ab6d72bffac9deb6e6cb0f61042e748de3f9f8e98afb0375a8e64b0b6e11746b", size = 251050, upload-time = "2026-02-03T14:00:54.332Z" }, { url = "https://files.pythonhosted.org/packages/69/dc/dffdf3bfe9d32090f047d3c3085378558cb4eb6778cda7de414ad74581ed/coverage-7.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e129328ad1258e49cae0123a3b5fcb93d6c2fa90d540f0b4c7cdcdc019aaa3dc", size = 252801, upload-time = "2026-02-03T14:00:56.121Z" }, { url = "https://files.pythonhosted.org/packages/87/51/cdf6198b0f2746e04511a30dc9185d7b8cdd895276c07bdb538e37f1cd50/coverage-7.13.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2213a8d88ed35459bda71597599d4eec7c2ebad201c88f0bfc2c26fd9b0dd2ea", size = 250763, upload-time = "2026-02-03T14:00:58.719Z" }, { url = "https://files.pythonhosted.org/packages/d7/1a/596b7d62218c1d69f2475b69cc6b211e33c83c902f38ee6ae9766dd422da/coverage-7.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:00dd3f02de6d5f5c9c3d95e3e036c3c2e2a669f8bf2d3ceb92505c4ce7838f67", size = 250587, upload-time = "2026-02-03T14:01:01.197Z" }, { url = "https://files.pythonhosted.org/packages/f7/46/52330d5841ff660f22c130b75f5e1dd3e352c8e7baef5e5fef6b14e3e991/coverage-7.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f9bada7bc660d20b23d7d312ebe29e927b655cf414dadcdb6335a2075695bd86", size = 252358, upload-time = "2026-02-03T14:01:02.824Z" }, { url = "https://files.pythonhosted.org/packages/36/8a/e69a5be51923097ba7d5cff9724466e74fe486e9232020ba97c809a8b42b/coverage-7.13.3-cp313-cp313-win32.whl", hash = "sha256:75b3c0300f3fa15809bd62d9ca8b170eb21fcf0100eb4b4154d6dc8b3a5bbd43", size = 222007, upload-time = "2026-02-03T14:01:04.876Z" }, { url = "https://files.pythonhosted.org/packages/0a/09/a5a069bcee0d613bdd48ee7637fa73bc09e7ed4342b26890f2df97cc9682/coverage-7.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:a2f7589c6132c44c53f6e705e1a6677e2b7821378c22f7703b2cf5388d0d4587", size = 222812, upload-time = "2026-02-03T14:01:07.296Z" }, { url = "https://files.pythonhosted.org/packages/3d/4f/d62ad7dfe32f9e3d4a10c178bb6f98b10b083d6e0530ca202b399371f6c1/coverage-7.13.3-cp313-cp313-win_arm64.whl", hash = "sha256:123ceaf2b9d8c614f01110f908a341e05b1b305d6b2ada98763b9a5a59756051", size = 221433, upload-time = "2026-02-03T14:01:09.156Z" }, { url = "https://files.pythonhosted.org/packages/04/b2/4876c46d723d80b9c5b695f1a11bf5f7c3dabf540ec00d6edc076ff025e6/coverage-7.13.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:cc7fd0f726795420f3678ac82ff882c7fc33770bd0074463b5aef7293285ace9", size = 220162, upload-time = "2026-02-03T14:01:11.409Z" }, { url = "https://files.pythonhosted.org/packages/fc/04/9942b64a0e0bdda2c109f56bda42b2a59d9d3df4c94b85a323c1cae9fc77/coverage-7.13.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d358dc408edc28730aed5477a69338e444e62fba0b7e9e4a131c505fadad691e", size = 220510, upload-time = "2026-02-03T14:01:13.038Z" }, { url = "https://files.pythonhosted.org/packages/5a/82/5cfe1e81eae525b74669f9795f37eb3edd4679b873d79d1e6c1c14ee6c1c/coverage-7.13.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5d67b9ed6f7b5527b209b24b3df9f2e5bf0198c1bbf99c6971b0e2dcb7e2a107", size = 261801, upload-time = "2026-02-03T14:01:14.674Z" }, { url = "https://files.pythonhosted.org/packages/0b/ec/a553d7f742fd2cd12e36a16a7b4b3582d5934b496ef2b5ea8abeb10903d4/coverage-7.13.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:59224bfb2e9b37c1335ae35d00daa3a5b4e0b1a20f530be208fff1ecfa436f43", size = 263882, upload-time = "2026-02-03T14:01:16.343Z" }, { url = "https://files.pythonhosted.org/packages/e1/58/8f54a2a93e3d675635bc406de1c9ac8d551312142ff52c9d71b5e533ad45/coverage-7.13.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae9306b5299e31e31e0d3b908c66bcb6e7e3ddca143dea0266e9ce6c667346d3", size = 266306, upload-time = "2026-02-03T14:01:18.02Z" }, { url = "https://files.pythonhosted.org/packages/1a/be/e593399fd6ea1f00aee79ebd7cc401021f218d34e96682a92e1bae092ff6/coverage-7.13.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:343aaeb5f8bb7bcd38620fd7bc56e6ee8207847d8c6103a1e7b72322d381ba4a", size = 261051, upload-time = "2026-02-03T14:01:19.757Z" }, { url = "https://files.pythonhosted.org/packages/5c/e5/e9e0f6138b21bcdebccac36fbfde9cf15eb1bbcea9f5b1f35cd1f465fb91/coverage-7.13.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2182129f4c101272ff5f2f18038d7b698db1bf8e7aa9e615cb48440899ad32e", size = 263868, upload-time = "2026-02-03T14:01:21.487Z" }, { url = "https://files.pythonhosted.org/packages/9a/bf/de72cfebb69756f2d4a2dde35efcc33c47d85cd3ebdf844b3914aac2ef28/coverage-7.13.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:94d2ac94bd0cc57c5626f52f8c2fffed1444b5ae8c9fc68320306cc2b255e155", size = 261498, upload-time = "2026-02-03T14:01:23.097Z" }, { url = "https://files.pythonhosted.org/packages/f2/91/4a2d313a70fc2e98ca53afd1c8ce67a89b1944cd996589a5b1fe7fbb3e5c/coverage-7.13.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:65436cde5ecabe26fb2f0bf598962f0a054d3f23ad529361326ac002c61a2a1e", size = 260394, upload-time = "2026-02-03T14:01:24.949Z" }, { url = "https://files.pythonhosted.org/packages/40/83/25113af7cf6941e779eb7ed8de2a677865b859a07ccee9146d4cc06a03e3/coverage-7.13.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:db83b77f97129813dbd463a67e5335adc6a6a91db652cc085d60c2d512746f96", size = 262579, upload-time = "2026-02-03T14:01:26.703Z" }, { url = "https://files.pythonhosted.org/packages/1e/19/a5f2b96262977e82fb9aabbe19b4d83561f5d063f18dde3e72f34ffc3b2f/coverage-7.13.3-cp313-cp313t-win32.whl", hash = "sha256:dfb428e41377e6b9ba1b0a32df6db5409cb089a0ed1d0a672dc4953ec110d84f", size = 222679, upload-time = "2026-02-03T14:01:28.553Z" }, { url = "https://files.pythonhosted.org/packages/81/82/ef1747b88c87a5c7d7edc3704799ebd650189a9158e680a063308b6125ef/coverage-7.13.3-cp313-cp313t-win_amd64.whl", hash = "sha256:5badd7e596e6b0c89aa8ec6d37f4473e4357f982ce57f9a2942b0221cd9cf60c", size = 223740, upload-time = "2026-02-03T14:01:30.776Z" }, { url = "https://files.pythonhosted.org/packages/1c/4c/a67c7bb5b560241c22736a9cb2f14c5034149ffae18630323fde787339e4/coverage-7.13.3-cp313-cp313t-win_arm64.whl", hash = "sha256:989aa158c0eb19d83c76c26f4ba00dbb272485c56e452010a3450bdbc9daafd9", size = 221996, upload-time = "2026-02-03T14:01:32.495Z" }, { url = "https://files.pythonhosted.org/packages/5e/b3/677bb43427fed9298905106f39c6520ac75f746f81b8f01104526a8026e4/coverage-7.13.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c6f6169bbdbdb85aab8ac0392d776948907267fcc91deeacf6f9d55f7a83ae3b", size = 219513, upload-time = "2026-02-03T14:01:34.29Z" }, { url = "https://files.pythonhosted.org/packages/42/53/290046e3bbf8986cdb7366a42dab3440b9983711eaff044a51b11006c67b/coverage-7.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2f5e731627a3d5ef11a2a35aa0c6f7c435867c7ccbc391268eb4f2ca5dbdcc10", size = 219850, upload-time = "2026-02-03T14:01:35.984Z" }, { url = "https://files.pythonhosted.org/packages/ea/2b/ab41f10345ba2e49d5e299be8663be2b7db33e77ac1b85cd0af985ea6406/coverage-7.13.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9db3a3285d91c0b70fab9f39f0a4aa37d375873677efe4e71e58d8321e8c5d39", size = 250886, upload-time = "2026-02-03T14:01:38.287Z" }, { url = "https://files.pythonhosted.org/packages/72/2d/b3f6913ee5a1d5cdd04106f257e5fac5d048992ffc2d9995d07b0f17739f/coverage-7.13.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06e49c5897cb12e3f7ecdc111d44e97c4f6d0557b81a7a0204ed70a8b038f86f", size = 253393, upload-time = "2026-02-03T14:01:40.118Z" }, { url = "https://files.pythonhosted.org/packages/f0/f6/b1f48810ffc6accf49a35b9943636560768f0812330f7456aa87dc39aff5/coverage-7.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb25061a66802df9fc13a9ba1967d25faa4dae0418db469264fd9860a921dde4", size = 254740, upload-time = "2026-02-03T14:01:42.413Z" }, { url = "https://files.pythonhosted.org/packages/57/d0/e59c54f9be0b61808f6bc4c8c4346bd79f02dd6bbc3f476ef26124661f20/coverage-7.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:99fee45adbb1caeb914da16f70e557fb7ff6ddc9e4b14de665bd41af631367ef", size = 250905, upload-time = "2026-02-03T14:01:44.163Z" }, { url = "https://files.pythonhosted.org/packages/d5/f7/5291bcdf498bafbee3796bb32ef6966e9915aebd4d0954123c8eae921c32/coverage-7.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:318002f1fd819bdc1651c619268aa5bc853c35fa5cc6d1e8c96bd9cd6c828b75", size = 252753, upload-time = "2026-02-03T14:01:45.974Z" }, { url = "https://files.pythonhosted.org/packages/a0/a9/1dcafa918c281554dae6e10ece88c1add82db685be123e1b05c2056ff3fb/coverage-7.13.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:71295f2d1d170b9977dc386d46a7a1b7cbb30e5405492529b4c930113a33f895", size = 250716, upload-time = "2026-02-03T14:01:48.844Z" }, { url = "https://files.pythonhosted.org/packages/44/bb/4ea4eabcce8c4f6235df6e059fbc5db49107b24c4bdffc44aee81aeca5a8/coverage-7.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5b1ad2e0dc672625c44bc4fe34514602a9fd8b10d52ddc414dc585f74453516c", size = 250530, upload-time = "2026-02-03T14:01:50.793Z" }, { url = "https://files.pythonhosted.org/packages/6d/31/4a6c9e6a71367e6f923b27b528448c37f4e959b7e4029330523014691007/coverage-7.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b2beb64c145593a50d90db5c7178f55daeae129123b0d265bdb3cbec83e5194a", size = 252186, upload-time = "2026-02-03T14:01:52.607Z" }, { url = "https://files.pythonhosted.org/packages/27/92/e1451ef6390a4f655dc42da35d9971212f7abbbcad0bdb7af4407897eb76/coverage-7.13.3-cp314-cp314-win32.whl", hash = "sha256:3d1aed4f4e837a832df2f3b4f68a690eede0de4560a2dbc214ea0bc55aabcdb4", size = 222253, upload-time = "2026-02-03T14:01:55.071Z" }, { url = "https://files.pythonhosted.org/packages/8a/98/78885a861a88de020c32a2693487c37d15a9873372953f0c3c159d575a43/coverage-7.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f9efbbaf79f935d5fbe3ad814825cbce4f6cdb3054384cb49f0c0f496125fa0", size = 223069, upload-time = "2026-02-03T14:01:56.95Z" }, { url = "https://files.pythonhosted.org/packages/eb/fb/3784753a48da58a5337972abf7ca58b1fb0f1bda21bc7b4fae992fd28e47/coverage-7.13.3-cp314-cp314-win_arm64.whl", hash = "sha256:31b6e889c53d4e6687ca63706148049494aace140cffece1c4dc6acadb70a7b3", size = 221633, upload-time = "2026-02-03T14:01:58.758Z" }, { url = "https://files.pythonhosted.org/packages/40/f9/75b732d9674d32cdbffe801ed5f770786dd1c97eecedef2125b0d25102dc/coverage-7.13.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c5e9787cec750793a19a28df7edd85ac4e49d3fb91721afcdc3b86f6c08d9aa8", size = 220243, upload-time = "2026-02-03T14:02:01.109Z" }, { url = "https://files.pythonhosted.org/packages/cf/7e/2868ec95de5a65703e6f0c87407ea822d1feb3619600fbc3c1c4fa986090/coverage-7.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e5b86db331c682fd0e4be7098e6acee5e8a293f824d41487c667a93705d415ca", size = 220515, upload-time = "2026-02-03T14:02:02.862Z" }, { url = "https://files.pythonhosted.org/packages/7d/eb/9f0d349652fced20bcaea0f67fc5777bd097c92369f267975732f3dc5f45/coverage-7.13.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:edc7754932682d52cf6e7a71806e529ecd5ce660e630e8bd1d37109a2e5f63ba", size = 261874, upload-time = "2026-02-03T14:02:04.727Z" }, { url = "https://files.pythonhosted.org/packages/ee/a5/6619bc4a6c7b139b16818149a3e74ab2e21599ff9a7b6811b6afde99f8ec/coverage-7.13.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d3a16d6398666510a6886f67f43d9537bfd0e13aca299688a19daa84f543122f", size = 264004, upload-time = "2026-02-03T14:02:06.634Z" }, { url = "https://files.pythonhosted.org/packages/29/b7/90aa3fc645a50c6f07881fca4fd0ba21e3bfb6ce3a7078424ea3a35c74c9/coverage-7.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:303d38b19626c1981e1bb067a9928236d88eb0e4479b18a74812f05a82071508", size = 266408, upload-time = "2026-02-03T14:02:09.037Z" }, { url = "https://files.pythonhosted.org/packages/62/55/08bb2a1e4dcbae384e638f0effef486ba5987b06700e481691891427d879/coverage-7.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:284e06eadfe15ddfee2f4ee56631f164ef897a7d7d5a15bca5f0bb88889fc5ba", size = 260977, upload-time = "2026-02-03T14:02:11.755Z" }, { url = "https://files.pythonhosted.org/packages/9b/76/8bd4ae055a42d8fb5dd2230e5cf36ff2e05f85f2427e91b11a27fea52ed7/coverage-7.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d401f0864a1d3198422816878e4e84ca89ec1c1bf166ecc0ae01380a39b888cd", size = 263868, upload-time = "2026-02-03T14:02:13.565Z" }, { url = "https://files.pythonhosted.org/packages/e3/f9/ba000560f11e9e32ec03df5aa8477242c2d95b379c99ac9a7b2e7fbacb1a/coverage-7.13.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3f379b02c18a64de78c4ccdddf1c81c2c5ae1956c72dacb9133d7dd7809794ab", size = 261474, upload-time = "2026-02-03T14:02:16.069Z" }, { url = "https://files.pythonhosted.org/packages/90/4b/4de4de8f9ca7af4733bfcf4baa440121b7dbb3856daf8428ce91481ff63b/coverage-7.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7a482f2da9086971efb12daca1d6547007ede3674ea06e16d7663414445c683e", size = 260317, upload-time = "2026-02-03T14:02:17.996Z" }, { url = "https://files.pythonhosted.org/packages/05/71/5cd8436e2c21410ff70be81f738c0dddea91bcc3189b1517d26e0102ccb3/coverage-7.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:562136b0d401992118d9b49fbee5454e16f95f85b120a4226a04d816e33fe024", size = 262635, upload-time = "2026-02-03T14:02:20.405Z" }, { url = "https://files.pythonhosted.org/packages/e7/f8/2834bb45bdd70b55a33ec354b8b5f6062fc90e5bb787e14385903a979503/coverage-7.13.3-cp314-cp314t-win32.whl", hash = "sha256:ca46e5c3be3b195098dd88711890b8011a9fa4feca942292bb84714ce5eab5d3", size = 223035, upload-time = "2026-02-03T14:02:22.323Z" }, { url = "https://files.pythonhosted.org/packages/26/75/f8290f0073c00d9ae14056d2b84ab92dff21d5370e464cb6cb06f52bf580/coverage-7.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:06d316dbb3d9fd44cca05b2dbcfbef22948493d63a1f28e828d43e6cc505fed8", size = 224142, upload-time = "2026-02-03T14:02:24.143Z" }, { url = "https://files.pythonhosted.org/packages/03/01/43ac78dfea8946c4a9161bbc034b5549115cb2b56781a4b574927f0d141a/coverage-7.13.3-cp314-cp314t-win_arm64.whl", hash = "sha256:299d66e9218193f9dc6e4880629ed7c4cd23486005166247c283fb98531656c3", size = 222166, upload-time = "2026-02-03T14:02:26.005Z" }, { url = "https://files.pythonhosted.org/packages/7d/fb/70af542d2d938c778c9373ce253aa4116dbe7c0a5672f78b2b2ae0e1b94b/coverage-7.13.3-py3-none-any.whl", hash = "sha256:90a8af9dba6429b2573199622d72e0ebf024d6276f16abce394ad4d181bb0910", size = 211237, upload-time = "2026-02-03T14:02:27.986Z" }, ] [package.optional-dependencies] toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] [[package]] name = "cryptography" version = "46.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/78/19/f748958276519adf6a0c1e79e7b8860b4830dda55ccdf29f2719b5fc499c/cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59", size = 749301, upload-time = "2026-01-28T00:24:37.379Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/87/91/874b8910903159043b5c6a123b7e79c4559ddd1896e38967567942635778/cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc", size = 4275871, upload-time = "2026-01-28T00:23:09.439Z" }, { url = "https://files.pythonhosted.org/packages/c0/35/690e809be77896111f5b195ede56e4b4ed0435b428c2f2b6d35046fbb5e8/cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0", size = 4423124, upload-time = "2026-01-28T00:23:11.529Z" }, { url = "https://files.pythonhosted.org/packages/1a/5b/a26407d4f79d61ca4bebaa9213feafdd8806dc69d3d290ce24996d3cfe43/cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa", size = 4277090, upload-time = "2026-01-28T00:23:13.123Z" }, { url = "https://files.pythonhosted.org/packages/0c/d8/4bb7aec442a9049827aa34cee1aa83803e528fa55da9a9d45d01d1bb933e/cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81", size = 4947652, upload-time = "2026-01-28T00:23:14.554Z" }, { url = "https://files.pythonhosted.org/packages/2b/08/f83e2e0814248b844265802d081f2fac2f1cbe6cd258e72ba14ff006823a/cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255", size = 4455157, upload-time = "2026-01-28T00:23:16.443Z" }, { url = "https://files.pythonhosted.org/packages/0a/05/19d849cf4096448779d2dcc9bb27d097457dac36f7273ffa875a93b5884c/cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e", size = 3981078, upload-time = "2026-01-28T00:23:17.838Z" }, { url = "https://files.pythonhosted.org/packages/e6/89/f7bac81d66ba7cde867a743ea5b37537b32b5c633c473002b26a226f703f/cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c", size = 4276213, upload-time = "2026-01-28T00:23:19.257Z" }, { url = "https://files.pythonhosted.org/packages/da/9f/7133e41f24edd827020ad21b068736e792bc68eecf66d93c924ad4719fb3/cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32", size = 4912190, upload-time = "2026-01-28T00:23:21.244Z" }, { url = "https://files.pythonhosted.org/packages/a6/f7/6d43cbaddf6f65b24816e4af187d211f0bc536a29961f69faedc48501d8e/cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616", size = 4454641, upload-time = "2026-01-28T00:23:22.866Z" }, { url = "https://files.pythonhosted.org/packages/9e/4f/ebd0473ad656a0ac912a16bd07db0f5d85184924e14fc88feecae2492834/cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0", size = 4405159, upload-time = "2026-01-28T00:23:25.278Z" }, { url = "https://files.pythonhosted.org/packages/d1/f7/7923886f32dc47e27adeff8246e976d77258fd2aa3efdd1754e4e323bf49/cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0", size = 4666059, upload-time = "2026-01-28T00:23:26.766Z" }, { url = "https://files.pythonhosted.org/packages/f8/f5/559c25b77f40b6bf828eabaf988efb8b0e17b573545edb503368ca0a2a03/cryptography-46.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:078e5f06bd2fa5aea5a324f2a09f914b1484f1d0c2a4d6a8a28c74e72f65f2da", size = 4264508, upload-time = "2026-01-28T00:23:34.264Z" }, { url = "https://files.pythonhosted.org/packages/49/a1/551fa162d33074b660dc35c9bc3616fefa21a0e8c1edd27b92559902e408/cryptography-46.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dce1e4f068f03008da7fa51cc7abc6ddc5e5de3e3d1550334eaf8393982a5829", size = 4409080, upload-time = "2026-01-28T00:23:35.793Z" }, { url = "https://files.pythonhosted.org/packages/b0/6a/4d8d129a755f5d6df1bbee69ea2f35ebfa954fa1847690d1db2e8bca46a5/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2067461c80271f422ee7bdbe79b9b4be54a5162e90345f86a23445a0cf3fd8a2", size = 4270039, upload-time = "2026-01-28T00:23:37.263Z" }, { url = "https://files.pythonhosted.org/packages/4c/f5/ed3fcddd0a5e39321e595e144615399e47e7c153a1fb8c4862aec3151ff9/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:c92010b58a51196a5f41c3795190203ac52edfd5dc3ff99149b4659eba9d2085", size = 4926748, upload-time = "2026-01-28T00:23:38.884Z" }, { url = "https://files.pythonhosted.org/packages/43/ae/9f03d5f0c0c00e85ecb34f06d3b79599f20630e4db91b8a6e56e8f83d410/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:829c2b12bbc5428ab02d6b7f7e9bbfd53e33efd6672d21341f2177470171ad8b", size = 4442307, upload-time = "2026-01-28T00:23:40.56Z" }, { url = "https://files.pythonhosted.org/packages/8b/22/e0f9f2dae8040695103369cf2283ef9ac8abe4d51f68710bec2afd232609/cryptography-46.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:62217ba44bf81b30abaeda1488686a04a702a261e26f87db51ff61d9d3510abd", size = 3959253, upload-time = "2026-01-28T00:23:42.827Z" }, { url = "https://files.pythonhosted.org/packages/01/5b/6a43fcccc51dae4d101ac7d378a8724d1ba3de628a24e11bf2f4f43cba4d/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:9c2da296c8d3415b93e6053f5a728649a87a48ce084a9aaf51d6e46c87c7f2d2", size = 4269372, upload-time = "2026-01-28T00:23:44.655Z" }, { url = "https://files.pythonhosted.org/packages/17/b7/0f6b8c1dd0779df2b526e78978ff00462355e31c0a6f6cff8a3e99889c90/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9b34d8ba84454641a6bf4d6762d15847ecbd85c1316c0a7984e6e4e9f748ec2e", size = 4891908, upload-time = "2026-01-28T00:23:46.48Z" }, { url = "https://files.pythonhosted.org/packages/83/17/259409b8349aa10535358807a472c6a695cf84f106022268d31cea2b6c97/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:df4a817fa7138dd0c96c8c8c20f04b8aaa1fac3bbf610913dcad8ea82e1bfd3f", size = 4441254, upload-time = "2026-01-28T00:23:48.403Z" }, { url = "https://files.pythonhosted.org/packages/9c/fe/e4a1b0c989b00cee5ffa0764401767e2d1cf59f45530963b894129fd5dce/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b1de0ebf7587f28f9190b9cb526e901bf448c9e6a99655d2b07fff60e8212a82", size = 4396520, upload-time = "2026-01-28T00:23:50.26Z" }, { url = "https://files.pythonhosted.org/packages/b3/81/ba8fd9657d27076eb40d6a2f941b23429a3c3d2f56f5a921d6b936a27bc9/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9b4d17bc7bd7cdd98e3af40b441feaea4c68225e2eb2341026c84511ad246c0c", size = 4651479, upload-time = "2026-01-28T00:23:51.674Z" }, { url = "https://files.pythonhosted.org/packages/d8/cc/8f3224cbb2a928de7298d6ed4790f5ebc48114e02bdc9559196bfb12435d/cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef", size = 4275419, upload-time = "2026-01-28T00:23:58.364Z" }, { url = "https://files.pythonhosted.org/packages/17/43/4a18faa7a872d00e4264855134ba82d23546c850a70ff209e04ee200e76f/cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d", size = 4419058, upload-time = "2026-01-28T00:23:59.867Z" }, { url = "https://files.pythonhosted.org/packages/ee/64/6651969409821d791ba12346a124f55e1b76f66a819254ae840a965d4b9c/cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973", size = 4278151, upload-time = "2026-01-28T00:24:01.731Z" }, { url = "https://files.pythonhosted.org/packages/20/0b/a7fce65ee08c3c02f7a8310cc090a732344066b990ac63a9dfd0a655d321/cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4", size = 4939441, upload-time = "2026-01-28T00:24:03.175Z" }, { url = "https://files.pythonhosted.org/packages/db/a7/20c5701e2cd3e1dfd7a19d2290c522a5f435dd30957d431dcb531d0f1413/cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af", size = 4451617, upload-time = "2026-01-28T00:24:05.403Z" }, { url = "https://files.pythonhosted.org/packages/00/dc/3e16030ea9aa47b63af6524c354933b4fb0e352257c792c4deeb0edae367/cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263", size = 3977774, upload-time = "2026-01-28T00:24:06.851Z" }, { url = "https://files.pythonhosted.org/packages/42/c8/ad93f14118252717b465880368721c963975ac4b941b7ef88f3c56bf2897/cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095", size = 4277008, upload-time = "2026-01-28T00:24:08.926Z" }, { url = "https://files.pythonhosted.org/packages/00/cf/89c99698151c00a4631fbfcfcf459d308213ac29e321b0ff44ceeeac82f1/cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b", size = 4903339, upload-time = "2026-01-28T00:24:12.009Z" }, { url = "https://files.pythonhosted.org/packages/03/c3/c90a2cb358de4ac9309b26acf49b2a100957e1ff5cc1e98e6c4996576710/cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019", size = 4451216, upload-time = "2026-01-28T00:24:13.975Z" }, { url = "https://files.pythonhosted.org/packages/96/2c/8d7f4171388a10208671e181ca43cdc0e596d8259ebacbbcfbd16de593da/cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4", size = 4404299, upload-time = "2026-01-28T00:24:16.169Z" }, { url = "https://files.pythonhosted.org/packages/e9/23/cbb2036e450980f65c6e0a173b73a56ff3bccd8998965dea5cc9ddd424a5/cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b", size = 4664837, upload-time = "2026-01-28T00:24:17.629Z" }, { url = "https://files.pythonhosted.org/packages/27/7a/f8d2d13227a9a1a9fe9c7442b057efecffa41f1e3c51d8622f26b9edbe8f/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c236a44acfb610e70f6b3e1c3ca20ff24459659231ef2f8c48e879e2d32b73da", size = 4216693, upload-time = "2026-01-28T00:24:25.758Z" }, { url = "https://files.pythonhosted.org/packages/c5/de/3787054e8f7972658370198753835d9d680f6cd4a39df9f877b57f0dd69c/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8a15fb869670efa8f83cbffbc8753c1abf236883225aed74cd179b720ac9ec80", size = 4382765, upload-time = "2026-01-28T00:24:27.577Z" }, { url = "https://files.pythonhosted.org/packages/8a/5f/60e0afb019973ba6a0b322e86b3d61edf487a4f5597618a430a2a15f2d22/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:fdc3daab53b212472f1524d070735b2f0c214239df131903bae1d598016fa822", size = 4216066, upload-time = "2026-01-28T00:24:29.056Z" }, { url = "https://files.pythonhosted.org/packages/81/8e/bf4a0de294f147fee66f879d9bae6f8e8d61515558e3d12785dd90eca0be/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:44cc0675b27cadb71bdbb96099cca1fa051cd11d2ade09e5cd3a2edb929ed947", size = 4382025, upload-time = "2026-01-28T00:24:30.681Z" }, ] [[package]] name = "cssselect2" version = "0.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tinycss2" }, { name = "webencodings" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" }, ] [[package]] name = "defusedxml" version = "0.7.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] [[package]] name = "distlib" version = "0.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] [[package]] name = "filelock" version = "3.20.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, ] [[package]] name = "ghp-import" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, ] [[package]] name = "griffe" version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0d/0c/3a471b6e31951dce2360477420d0a8d1e00dea6cf33b70f3e8c3ab6e28e1/griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea", size = 424112, upload-time = "2025-11-10T15:03:15.52Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3", size = 150705, upload-time = "2025-11-10T15:03:13.549Z" }, ] [[package]] name = "griffe-inherited-docstrings" version = "1.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/02/36d9929bb8ad929941b27117aba4d850b8a9f2c12f982e2b59ab4bc4d80b/griffe_inherited_docstrings-1.1.2.tar.gz", hash = "sha256:0a489ac4bb6093a7789d014b23083b4cbb1ab139f0b8dd878c8f3a4f8e892624", size = 27541, upload-time = "2025-09-05T15:17:13.081Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ad/12/4c67b644dc5965000874908dfa89d05ba878d5ca22a9b4ebfbfadc41467b/griffe_inherited_docstrings-1.1.2-py3-none-any.whl", hash = "sha256:b1cf61fff6e12a769db75de5718ddbbb5361b2cc4155af1f1ad86c13f56c197b", size = 6709, upload-time = "2025-09-05T15:17:11.853Z" }, ] [[package]] name = "h11" version = "0.16.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] [[package]] name = "hatch" version = "1.16.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-zstd", marker = "python_full_version < '3.14'" }, { name = "click" }, { name = "hatchling" }, { name = "httpx" }, { name = "hyperlink" }, { name = "keyring" }, { name = "packaging" }, { name = "pexpect" }, { name = "platformdirs" }, { name = "pyproject-hooks" }, { name = "rich" }, { name = "shellingham" }, { name = "tomli-w" }, { name = "tomlkit" }, { name = "userpath" }, { name = "uv" }, { name = "virtualenv" }, ] sdist = { url = "https://files.pythonhosted.org/packages/41/c1/976b807478878d31d467dd17b9fe642962f292e16ed13c34b593c0453fde/hatch-1.16.3.tar.gz", hash = "sha256:2a50ecc912adfc8122cd2ccdcc15254cdef829e5d158be9014180cd7f0fb7ea9", size = 5219621, upload-time = "2026-01-21T01:36:19.822Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b8/b4/5c5fa4ca8c59e7ef0a224ff10e6336e73ca61c5e0eff09ee691441c9275f/hatch-1.16.3-py3-none-any.whl", hash = "sha256:f5169025cf1cdfe981366eb96127cab1d1bc59f5f2acb87c4cc308c25d95a4b1", size = 141305, upload-time = "2026-01-21T01:36:18.13Z" }, ] [[package]] name = "hatchling" version = "1.28.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pathspec" }, { name = "pluggy" }, { name = "trove-classifiers" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/8e/e480359492affde4119a131da729dd26da742c2c9b604dff74836e47eef9/hatchling-1.28.0.tar.gz", hash = "sha256:4d50b02aece6892b8cd0b3ce6c82cb218594d3ec5836dbde75bf41a21ab004c8", size = 55365, upload-time = "2025-11-27T00:31:13.766Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0d/a5/48cb7efb8b4718b1a4c0c331e3364a3a33f614ff0d6afd2b93ee883d3c47/hatchling-1.28.0-py3-none-any.whl", hash = "sha256:dc48722b68b3f4bbfa3ff618ca07cdea6750e7d03481289ffa8be1521d18a961", size = 76075, upload-time = "2025-11-27T00:31:12.544Z" }, ] [[package]] name = "httpcore" version = "1.0.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "h11" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] [[package]] name = "httpx" version = "0.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "certifi" }, { name = "httpcore" }, { name = "idna" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] [[package]] name = "hyperlink" version = "21.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3a/51/1947bd81d75af87e3bb9e34593a4cf118115a8feb451ce7a69044ef1412e/hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b", size = 140743, upload-time = "2021-01-08T05:51:20.972Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4", size = 74638, upload-time = "2021-01-08T05:51:22.906Z" }, ] [[package]] name = "identify" version = "2.6.16" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5b/8d/e8b97e6bd3fb6fb271346f7981362f1e04d6a7463abd0de79e1fda17c067/identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980", size = 99360, upload-time = "2026-01-12T18:58:58.201Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b8/58/40fbbcefeda82364720eba5cf2270f98496bdfa19ea75b4cccae79c698e6/identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0", size = 99202, upload-time = "2026-01-12T18:58:56.627Z" }, ] [[package]] name = "idna" version = "3.11" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, ] [[package]] name = "importlib-metadata" version = "8.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, ] [[package]] name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] [[package]] name = "jaraco-classes" version = "3.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, ] [[package]] name = "jaraco-context" version = "6.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/9c/a788f5bb29c61e456b8ee52ce76dbdd32fd72cd73dd67bc95f42c7a8d13c/jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f", size = 15850, upload-time = "2026-01-13T02:53:53.847Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8d/48/aa685dbf1024c7bd82bede569e3a85f82c32fd3d79ba5fea578f0159571a/jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda", size = 7065, upload-time = "2026-01-13T02:53:53.031Z" }, ] [[package]] name = "jaraco-functools" version = "4.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481, upload-time = "2025-12-21T09:29:42.27Z" }, ] [[package]] name = "jeepney" version = "0.9.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] [[package]] name = "jinja2" version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "keyring" version = "25.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, { name = "jaraco-classes" }, { name = "jaraco-context" }, { name = "jaraco-functools" }, { name = "jeepney", marker = "sys_platform == 'linux'" }, { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, { name = "secretstorage", marker = "sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, ] [[package]] name = "markdown" version = "3.10.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b7/b1/af95bcae8549f1f3fd70faacb29075826a0d689a27f232e8cee315efa053/markdown-3.10.1.tar.gz", hash = "sha256:1c19c10bd5c14ac948c53d0d762a04e2fa35a6d58a6b7b1e6bfcbe6fefc0001a", size = 365402, upload-time = "2026-01-21T18:09:28.206Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/59/1b/6ef961f543593969d25b2afe57a3564200280528caa9bd1082eecdd7b3bc/markdown-3.10.1-py3-none-any.whl", hash = "sha256:867d788939fe33e4b736426f5b9f651ad0c0ae0ecf89df0ca5d1176c70812fe3", size = 107684, upload-time = "2026-01-21T18:09:27.203Z" }, ] [[package]] name = "markdown-it-py" version = "4.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] name = "markupsafe" version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "mercantile" version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d2/c6/87409bcb26fb68c393fa8cf58ba09363aa7298cfb438a0109b5cb14bc98b/mercantile-1.2.1.tar.gz", hash = "sha256:fa3c6db15daffd58454ac198b31887519a19caccee3f9d63d17ae7ff61b3b56b", size = 26352, upload-time = "2021-04-21T14:42:41.096Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b2/d6/de0cc74f8d36976aeca0dd2e9cbf711882ff8e177495115fd82459afdc4d/mercantile-1.2.1-py3-none-any.whl", hash = "sha256:30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f", size = 14779, upload-time = "2021-04-21T14:42:39.841Z" }, ] [[package]] name = "mergedeep" version = "1.3.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, ] [[package]] name = "mkdocs" version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "ghp-import" }, { name = "jinja2" }, { name = "markdown" }, { name = "markupsafe" }, { name = "mergedeep" }, { name = "mkdocs-get-deps" }, { name = "packaging" }, { name = "pathspec" }, { name = "pyyaml" }, { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, ] [[package]] name = "mkdocs-autorefs" version = "1.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, ] sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload-time = "2025-08-26T14:23:17.223Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload-time = "2025-08-26T14:23:15.906Z" }, ] [[package]] name = "mkdocs-get-deps" version = "0.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mergedeep" }, { name = "platformdirs" }, { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, ] [[package]] name = "mkdocs-material" version = "9.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, { name = "backrefs" }, { name = "colorama" }, { name = "jinja2" }, { name = "markdown" }, { name = "mkdocs" }, { name = "mkdocs-material-extensions" }, { name = "paginate" }, { name = "pygments" }, { name = "pymdown-extensions" }, { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/27/e2/2ffc356cd72f1473d07c7719d82a8f2cbd261666828614ecb95b12169f41/mkdocs_material-9.7.1.tar.gz", hash = "sha256:89601b8f2c3e6c6ee0a918cc3566cb201d40bf37c3cd3c2067e26fadb8cce2b8", size = 4094392, upload-time = "2025-12-18T09:49:00.308Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3e/32/ed071cb721aca8c227718cffcf7bd539620e9799bbf2619e90c757bfd030/mkdocs_material-9.7.1-py3-none-any.whl", hash = "sha256:3f6100937d7d731f87f1e3e3b021c97f7239666b9ba1151ab476cabb96c60d5c", size = 9297166, upload-time = "2025-12-18T09:48:56.664Z" }, ] [package.optional-dependencies] imaging = [ { name = "cairosvg" }, { name = "pillow" }, ] [[package]] name = "mkdocs-material-extensions" version = "1.3.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, ] [[package]] name = "mkdocstrings" version = "1.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/63/4d/1ca8a9432579184599714aaeb36591414cc3d3bfd9d494f6db540c995ae4/mkdocstrings-1.0.2.tar.gz", hash = "sha256:48edd0ccbcb9e30a3121684e165261a9d6af4d63385fc4f39a54a49ac3b32ea8", size = 101048, upload-time = "2026-01-24T15:57:25.735Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/57/32/407a9a5fdd7d8ecb4af8d830b9bcdf47ea68f916869b3f44bac31f081250/mkdocstrings-1.0.2-py3-none-any.whl", hash = "sha256:41897815a8026c3634fe5d51472c3a569f92ded0ad8c7a640550873eea3b6817", size = 35443, upload-time = "2026-01-24T15:57:23.933Z" }, ] [package.optional-dependencies] python = [ { name = "mkdocstrings-python" }, ] [[package]] name = "mkdocstrings-python" version = "2.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffe" }, { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] sdist = { url = "https://files.pythonhosted.org/packages/24/75/d30af27a2906f00eb90143470272376d728521997800f5dce5b340ba35bc/mkdocstrings_python-2.0.1.tar.gz", hash = "sha256:843a562221e6a471fefdd4b45cc6c22d2607ccbad632879234fa9692e9cf7732", size = 199345, upload-time = "2025-12-03T14:26:11.755Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl", hash = "sha256:66ecff45c5f8b71bf174e11d49afc845c2dfc7fc0ab17a86b6b337e0f24d8d90", size = 105055, upload-time = "2025-12-03T14:26:10.184Z" }, ] [[package]] name = "more-itertools" version = "10.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, ] [[package]] name = "morecantile" source = { editable = "." } dependencies = [ { name = "attrs" }, { name = "click" }, { name = "pydantic" }, { name = "pyproj" }, ] [package.optional-dependencies] rasterio = [ { name = "rasterio", version = "1.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "rasterio", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] [package.dev-dependencies] benchmark = [ { name = "pytest-benchmark" }, ] deploy = [ { name = "hatch" }, ] dev = [ { name = "mercantile" }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, ] docs = [ { name = "griffe-inherited-docstrings" }, { name = "mkdocs" }, { name = "mkdocs-material", extra = ["imaging"] }, { name = "mkdocstrings", extra = ["python"] }, { name = "pygments" }, ] [package.metadata] requires-dist = [ { name = "attrs" }, { name = "click" }, { name = "pydantic", specifier = "~=2.0" }, { name = "pyproj", specifier = ">=3.1,<4.0" }, { name = "rasterio", marker = "extra == 'rasterio'", specifier = ">=1.2.1" }, ] provides-extras = ["rasterio"] [package.metadata.requires-dev] benchmark = [{ name = "pytest-benchmark" }] deploy = [{ name = "hatch" }] dev = [ { name = "mercantile" }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, ] docs = [ { name = "griffe-inherited-docstrings", specifier = ">=1.0.0" }, { name = "mkdocs", specifier = ">=1.4.3" }, { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.5" }, { name = "mkdocstrings", extras = ["python"], specifier = ">=0.25.1" }, { name = "pygments" }, ] [[package]] name = "nodeenv" version = "1.10.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, ] [[package]] name = "numpy" version = "2.4.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" }, { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" }, { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" }, { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" }, { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" }, { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" }, { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" }, { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" }, { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" }, { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" }, { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" }, { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" }, { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" }, { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" }, { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" }, { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" }, { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" }, { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, ] [[package]] name = "packaging" version = "26.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] name = "paginate" version = "0.5.7" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, ] [[package]] name = "pathspec" version = "1.0.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] [[package]] name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, ] [[package]] name = "pillow" version = "11.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, ] [[package]] name = "platformdirs" version = "4.5.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] [[package]] name = "pre-commit" version = "4.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, { name = "identify" }, { name = "nodeenv" }, { name = "pyyaml" }, { name = "virtualenv" }, ] sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, ] [[package]] name = "ptyprocess" version = "0.7.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, ] [[package]] name = "py-cpuinfo" version = "9.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", size = 104716, upload-time = "2022-10-25T20:38:06.303Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", size = 22335, upload-time = "2022-10-25T20:38:27.636Z" }, ] [[package]] name = "pycparser" version = "3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] name = "pydantic" version = "2.12.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, { name = "typing-inspection" }, ] sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, ] [[package]] name = "pydantic-core" version = "2.41.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] [[package]] name = "pymdown-extensions" version = "10.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1e/6c/9e370934bfa30e889d12e61d0dae009991294f40055c238980066a7fbd83/pymdown_extensions-10.20.1.tar.gz", hash = "sha256:e7e39c865727338d434b55f1dd8da51febcffcaebd6e1a0b9c836243f660740a", size = 852860, upload-time = "2026-01-24T05:56:56.758Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/40/6d/b6ee155462a0156b94312bdd82d2b92ea56e909740045a87ccb98bf52405/pymdown_extensions-10.20.1-py3-none-any.whl", hash = "sha256:24af7feacbca56504b313b7b418c4f5e1317bb5fea60f03d57be7fcc40912aa0", size = 268768, upload-time = "2026-01-24T05:56:54.537Z" }, ] [[package]] name = "pyparsing" version = "3.3.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] [[package]] name = "pyproj" version = "3.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/90/67bd7260b4ea9b8b20b4f58afef6c223ecb3abf368eb4ec5bc2cdef81b49/pyproj-3.7.2.tar.gz", hash = "sha256:39a0cf1ecc7e282d1d30f36594ebd55c9fae1fda8a2622cee5d100430628f88c", size = 226279, upload-time = "2025-08-14T12:05:42.18Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a6/bd/f205552cd1713b08f93b09e39a3ec99edef0b3ebbbca67b486fdf1abe2de/pyproj-3.7.2-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:2514d61f24c4e0bb9913e2c51487ecdaeca5f8748d8313c933693416ca41d4d5", size = 6227022, upload-time = "2025-08-14T12:03:51.474Z" }, { url = "https://files.pythonhosted.org/packages/75/4c/9a937e659b8b418ab573c6d340d27e68716928953273e0837e7922fcac34/pyproj-3.7.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:8693ca3892d82e70de077701ee76dd13d7bca4ae1c9d1e739d72004df015923a", size = 4625810, upload-time = "2025-08-14T12:03:53.808Z" }, { url = "https://files.pythonhosted.org/packages/c0/7d/a9f41e814dc4d1dc54e95b2ccaf0b3ebe3eb18b1740df05fe334724c3d89/pyproj-3.7.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5e26484d80fea56273ed1555abaea161e9661d81a6c07815d54b8e883d4ceb25", size = 9638694, upload-time = "2025-08-14T12:03:55.669Z" }, { url = "https://files.pythonhosted.org/packages/ad/ab/9bdb4a6216b712a1f9aab1c0fcbee5d3726f34a366f29c3e8c08a78d6b70/pyproj-3.7.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:281cb92847814e8018010c48b4069ff858a30236638631c1a91dd7bfa68f8a8a", size = 9493977, upload-time = "2025-08-14T12:03:57.937Z" }, { url = "https://files.pythonhosted.org/packages/c9/db/2db75b1b6190f1137b1c4e8ef6a22e1c338e46320f6329bfac819143e063/pyproj-3.7.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9c8577f0b7bb09118ec2e57e3babdc977127dd66326d6c5d755c76b063e6d9dc", size = 10841151, upload-time = "2025-08-14T12:04:00.271Z" }, { url = "https://files.pythonhosted.org/packages/89/f7/989643394ba23a286e9b7b3f09981496172f9e0d4512457ffea7dc47ffc7/pyproj-3.7.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a23f59904fac3a5e7364b3aa44d288234af267ca041adb2c2b14a903cd5d3ac5", size = 10751585, upload-time = "2025-08-14T12:04:02.228Z" }, { url = "https://files.pythonhosted.org/packages/53/6d/ad928fe975a6c14a093c92e6a319ca18f479f3336bb353a740bdba335681/pyproj-3.7.2-cp311-cp311-win32.whl", hash = "sha256:f2af4ed34b2cf3e031a2d85b067a3ecbd38df073c567e04b52fa7a0202afde8a", size = 5908533, upload-time = "2025-08-14T12:04:04.821Z" }, { url = "https://files.pythonhosted.org/packages/79/e0/b95584605cec9ed50b7ebaf7975d1c4ddeec5a86b7a20554ed8b60042bd7/pyproj-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:0b7cb633565129677b2a183c4d807c727d1c736fcb0568a12299383056e67433", size = 6320742, upload-time = "2025-08-14T12:04:06.357Z" }, { url = "https://files.pythonhosted.org/packages/b7/4d/536e8f93bca808175c2d0a5ac9fdf69b960d8ab6b14f25030dccb07464d7/pyproj-3.7.2-cp311-cp311-win_arm64.whl", hash = "sha256:38b08d85e3a38e455625b80e9eb9f78027c8e2649a21dec4df1f9c3525460c71", size = 6245772, upload-time = "2025-08-14T12:04:08.365Z" }, { url = "https://files.pythonhosted.org/packages/8d/ab/9893ea9fb066be70ed9074ae543914a618c131ed8dff2da1e08b3a4df4db/pyproj-3.7.2-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:0a9bb26a6356fb5b033433a6d1b4542158fb71e3c51de49b4c318a1dff3aeaab", size = 6219832, upload-time = "2025-08-14T12:04:10.264Z" }, { url = "https://files.pythonhosted.org/packages/53/78/4c64199146eed7184eb0e85bedec60a4aa8853b6ffe1ab1f3a8b962e70a0/pyproj-3.7.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:567caa03021178861fad27fabde87500ec6d2ee173dd32f3e2d9871e40eebd68", size = 4620650, upload-time = "2025-08-14T12:04:11.978Z" }, { url = "https://files.pythonhosted.org/packages/b6/ac/14a78d17943898a93ef4f8c6a9d4169911c994e3161e54a7cedeba9d8dde/pyproj-3.7.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c203101d1dc3c038a56cff0447acc515dd29d6e14811406ac539c21eed422b2a", size = 9667087, upload-time = "2025-08-14T12:04:13.964Z" }, { url = "https://files.pythonhosted.org/packages/b8/be/212882c450bba74fc8d7d35cbd57e4af84792f0a56194819d98106b075af/pyproj-3.7.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:1edc34266c0c23ced85f95a1ee8b47c9035eae6aca5b6b340327250e8e281630", size = 9552797, upload-time = "2025-08-14T12:04:16.624Z" }, { url = "https://files.pythonhosted.org/packages/ba/c0/c0f25c87b5d2a8686341c53c1792a222a480d6c9caf60311fec12c99ec26/pyproj-3.7.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa9f26c21bc0e2dc3d224cb1eb4020cf23e76af179a7c66fea49b828611e4260", size = 10837036, upload-time = "2025-08-14T12:04:18.733Z" }, { url = "https://files.pythonhosted.org/packages/5d/37/5cbd6772addde2090c91113332623a86e8c7d583eccb2ad02ea634c4a89f/pyproj-3.7.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9428b318530625cb389b9ddc9c51251e172808a4af79b82809376daaeabe5e9", size = 10775952, upload-time = "2025-08-14T12:04:20.709Z" }, { url = "https://files.pythonhosted.org/packages/69/a1/dc250e3cf83eb4b3b9a2cf86fdb5e25288bd40037ae449695550f9e96b2f/pyproj-3.7.2-cp312-cp312-win32.whl", hash = "sha256:b3d99ed57d319da042f175f4554fc7038aa4bcecc4ac89e217e350346b742c9d", size = 5898872, upload-time = "2025-08-14T12:04:22.485Z" }, { url = "https://files.pythonhosted.org/packages/4a/a6/6fe724b72b70f2b00152d77282e14964d60ab092ec225e67c196c9b463e5/pyproj-3.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:11614a054cd86a2ed968a657d00987a86eeb91fdcbd9ad3310478685dc14a128", size = 6312176, upload-time = "2025-08-14T12:04:24.736Z" }, { url = "https://files.pythonhosted.org/packages/5d/68/915cc32c02a91e76d02c8f55d5a138d6ef9e47a0d96d259df98f4842e558/pyproj-3.7.2-cp312-cp312-win_arm64.whl", hash = "sha256:509a146d1398bafe4f53273398c3bb0b4732535065fa995270e52a9d3676bca3", size = 6233452, upload-time = "2025-08-14T12:04:27.287Z" }, { url = "https://files.pythonhosted.org/packages/be/14/faf1b90d267cea68d7e70662e7f88cefdb1bc890bd596c74b959e0517a72/pyproj-3.7.2-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:19466e529b1b15eeefdf8ff26b06fa745856c044f2f77bf0edbae94078c1dfa1", size = 6214580, upload-time = "2025-08-14T12:04:28.804Z" }, { url = "https://files.pythonhosted.org/packages/35/48/da9a45b184d375f62667f62eba0ca68569b0bd980a0bb7ffcc1d50440520/pyproj-3.7.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:c79b9b84c4a626c5dc324c0d666be0bfcebd99f7538d66e8898c2444221b3da7", size = 4615388, upload-time = "2025-08-14T12:04:30.553Z" }, { url = "https://files.pythonhosted.org/packages/5e/e7/d2b459a4a64bca328b712c1b544e109df88e5c800f7c143cfbc404d39bfb/pyproj-3.7.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ceecf374cacca317bc09e165db38ac548ee3cad07c3609442bd70311c59c21aa", size = 9628455, upload-time = "2025-08-14T12:04:32.435Z" }, { url = "https://files.pythonhosted.org/packages/f8/85/c2b1706e51942de19076eff082f8495e57d5151364e78b5bef4af4a1d94a/pyproj-3.7.2-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5141a538ffdbe4bfd157421828bb2e07123a90a7a2d6f30fa1462abcfb5ce681", size = 9514269, upload-time = "2025-08-14T12:04:34.599Z" }, { url = "https://files.pythonhosted.org/packages/34/38/07a9b89ae7467872f9a476883a5bad9e4f4d1219d31060f0f2b282276cbe/pyproj-3.7.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f000841e98ea99acbb7b8ca168d67773b0191de95187228a16110245c5d954d5", size = 10808437, upload-time = "2025-08-14T12:04:36.485Z" }, { url = "https://files.pythonhosted.org/packages/12/56/fda1daeabbd39dec5b07f67233d09f31facb762587b498e6fc4572be9837/pyproj-3.7.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8115faf2597f281a42ab608ceac346b4eb1383d3b45ab474fd37341c4bf82a67", size = 10745540, upload-time = "2025-08-14T12:04:38.568Z" }, { url = "https://files.pythonhosted.org/packages/0d/90/c793182cbba65a39a11db2ac6b479fe76c59e6509ae75e5744c344a0da9d/pyproj-3.7.2-cp313-cp313-win32.whl", hash = "sha256:f18c0579dd6be00b970cb1a6719197fceecc407515bab37da0066f0184aafdf3", size = 5896506, upload-time = "2025-08-14T12:04:41.059Z" }, { url = "https://files.pythonhosted.org/packages/be/0f/747974129cf0d800906f81cd25efd098c96509026e454d4b66868779ab04/pyproj-3.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:bb41c29d5f60854b1075853fe80c58950b398d4ebb404eb532536ac8d2834ed7", size = 6310195, upload-time = "2025-08-14T12:04:42.974Z" }, { url = "https://files.pythonhosted.org/packages/82/64/fc7598a53172c4931ec6edf5228280663063150625d3f6423b4c20f9daff/pyproj-3.7.2-cp313-cp313-win_arm64.whl", hash = "sha256:2b617d573be4118c11cd96b8891a0b7f65778fa7733ed8ecdb297a447d439100", size = 6230748, upload-time = "2025-08-14T12:04:44.491Z" }, { url = "https://files.pythonhosted.org/packages/aa/f0/611dd5cddb0d277f94b7af12981f56e1441bf8d22695065d4f0df5218498/pyproj-3.7.2-cp313-cp313t-macosx_13_0_x86_64.whl", hash = "sha256:d27b48f0e81beeaa2b4d60c516c3a1cfbb0c7ff6ef71256d8e9c07792f735279", size = 6241729, upload-time = "2025-08-14T12:04:46.274Z" }, { url = "https://files.pythonhosted.org/packages/15/93/40bd4a6c523ff9965e480870611aed7eda5aa2c6128c6537345a2b77b542/pyproj-3.7.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:55a3610d75023c7b1c6e583e48ef8f62918e85a2ae81300569d9f104d6684bb6", size = 4652497, upload-time = "2025-08-14T12:04:48.203Z" }, { url = "https://files.pythonhosted.org/packages/1b/ae/7150ead53c117880b35e0d37960d3138fe640a235feb9605cb9386f50bb0/pyproj-3.7.2-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:8d7349182fa622696787cc9e195508d2a41a64765da9b8a6bee846702b9e6220", size = 9942610, upload-time = "2025-08-14T12:04:49.652Z" }, { url = "https://files.pythonhosted.org/packages/d8/17/7a4a7eafecf2b46ab64e5c08176c20ceb5844b503eaa551bf12ccac77322/pyproj-3.7.2-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:d230b186eb876ed4f29a7c5ee310144c3a0e44e89e55f65fb3607e13f6db337c", size = 9692390, upload-time = "2025-08-14T12:04:51.731Z" }, { url = "https://files.pythonhosted.org/packages/c3/55/ae18f040f6410f0ea547a21ada7ef3e26e6c82befa125b303b02759c0e9d/pyproj-3.7.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:237499c7862c578d0369e2b8ac56eec550e391a025ff70e2af8417139dabb41c", size = 11047596, upload-time = "2025-08-14T12:04:53.748Z" }, { url = "https://files.pythonhosted.org/packages/e6/2e/d3fff4d2909473f26ae799f9dda04caa322c417a51ff3b25763f7d03b233/pyproj-3.7.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8c225f5978abd506fd9a78eaaf794435e823c9156091cabaab5374efb29d7f69", size = 10896975, upload-time = "2025-08-14T12:04:55.875Z" }, { url = "https://files.pythonhosted.org/packages/f2/bc/8fc7d3963d87057b7b51ebe68c1e7c51c23129eee5072ba6b86558544a46/pyproj-3.7.2-cp313-cp313t-win32.whl", hash = "sha256:2da731876d27639ff9d2d81c151f6ab90a1546455fabd93368e753047be344a2", size = 5953057, upload-time = "2025-08-14T12:04:58.466Z" }, { url = "https://files.pythonhosted.org/packages/cc/27/ea9809966cc47d2d51e6d5ae631ea895f7c7c7b9b3c29718f900a8f7d197/pyproj-3.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f54d91ae18dd23b6c0ab48126d446820e725419da10617d86a1b69ada6d881d3", size = 6375414, upload-time = "2025-08-14T12:04:59.861Z" }, { url = "https://files.pythonhosted.org/packages/5b/f8/1ef0129fba9a555c658e22af68989f35e7ba7b9136f25758809efec0cd6e/pyproj-3.7.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fc52ba896cfc3214dc9f9ca3c0677a623e8fdd096b257c14a31e719d21ff3fdd", size = 6262501, upload-time = "2025-08-14T12:05:01.39Z" }, { url = "https://files.pythonhosted.org/packages/42/17/c2b050d3f5b71b6edd0d96ae16c990fdc42a5f1366464a5c2772146de33a/pyproj-3.7.2-cp314-cp314-macosx_13_0_x86_64.whl", hash = "sha256:2aaa328605ace41db050d06bac1adc11f01b71fe95c18661497763116c3a0f02", size = 6214541, upload-time = "2025-08-14T12:05:03.166Z" }, { url = "https://files.pythonhosted.org/packages/03/68/68ada9c8aea96ded09a66cfd9bf87aa6db8c2edebe93f5bf9b66b0143fbc/pyproj-3.7.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:35dccbce8201313c596a970fde90e33605248b66272595c061b511c8100ccc08", size = 4617456, upload-time = "2025-08-14T12:05:04.563Z" }, { url = "https://files.pythonhosted.org/packages/81/e4/4c50ceca7d0e937977866b02cb64e6ccf4df979a5871e521f9e255df6073/pyproj-3.7.2-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:25b0b7cb0042444c29a164b993c45c1b8013d6c48baa61dc1160d834a277e83b", size = 9615590, upload-time = "2025-08-14T12:05:06.094Z" }, { url = "https://files.pythonhosted.org/packages/05/1e/ada6fb15a1d75b5bd9b554355a69a798c55a7dcc93b8d41596265c1772e3/pyproj-3.7.2-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:85def3a6388e9ba51f964619aa002a9d2098e77c6454ff47773bb68871024281", size = 9474960, upload-time = "2025-08-14T12:05:07.973Z" }, { url = "https://files.pythonhosted.org/packages/51/07/9d48ad0a8db36e16f842f2c8a694c1d9d7dcf9137264846bef77585a71f3/pyproj-3.7.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b1bccefec3875ab81eabf49059e2b2ea77362c178b66fd3528c3e4df242f1516", size = 10799478, upload-time = "2025-08-14T12:05:14.102Z" }, { url = "https://files.pythonhosted.org/packages/85/cf/2f812b529079f72f51ff2d6456b7fef06c01735e5cfd62d54ffb2b548028/pyproj-3.7.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d5371ca114d6990b675247355a801925814eca53e6c4b2f1b5c0a956336ee36e", size = 10710030, upload-time = "2025-08-14T12:05:16.317Z" }, { url = "https://files.pythonhosted.org/packages/99/9b/4626a19e1f03eba4c0e77b91a6cf0f73aa9cb5d51a22ee385c22812bcc2c/pyproj-3.7.2-cp314-cp314-win32.whl", hash = "sha256:77f066626030f41be543274f5ac79f2a511fe89860ecd0914f22131b40a0ec25", size = 5991181, upload-time = "2025-08-14T12:05:19.492Z" }, { url = "https://files.pythonhosted.org/packages/04/b2/5a6610554306a83a563080c2cf2c57565563eadd280e15388efa00fb5b33/pyproj-3.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:5a964da1696b8522806f4276ab04ccfff8f9eb95133a92a25900697609d40112", size = 6434721, upload-time = "2025-08-14T12:05:21.022Z" }, { url = "https://files.pythonhosted.org/packages/ae/ce/6c910ea2e1c74ef673c5d48c482564b8a7824a44c4e35cca2e765b68cfcc/pyproj-3.7.2-cp314-cp314-win_arm64.whl", hash = "sha256:e258ab4dbd3cf627809067c0ba8f9884ea76c8e5999d039fb37a1619c6c3e1f6", size = 6363821, upload-time = "2025-08-14T12:05:22.627Z" }, { url = "https://files.pythonhosted.org/packages/e4/e4/5532f6f7491812ba782a2177fe9de73fd8e2912b59f46a1d056b84b9b8f2/pyproj-3.7.2-cp314-cp314t-macosx_13_0_x86_64.whl", hash = "sha256:bbbac2f930c6d266f70ec75df35ef851d96fdb3701c674f42fd23a9314573b37", size = 6241773, upload-time = "2025-08-14T12:05:24.577Z" }, { url = "https://files.pythonhosted.org/packages/20/1f/0938c3f2bbbef1789132d1726d9b0e662f10cfc22522743937f421ad664e/pyproj-3.7.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:b7544e0a3d6339dc9151e9c8f3ea62a936ab7cc446a806ec448bbe86aebb979b", size = 4652537, upload-time = "2025-08-14T12:05:26.391Z" }, { url = "https://files.pythonhosted.org/packages/c7/a8/488b1ed47d25972f33874f91f09ca8f2227902f05f63a2b80dc73e7b1c97/pyproj-3.7.2-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:f7f5133dca4c703e8acadf6f30bc567d39a42c6af321e7f81975c2518f3ed357", size = 9940864, upload-time = "2025-08-14T12:05:27.985Z" }, { url = "https://files.pythonhosted.org/packages/c7/cc/7f4c895d0cb98e47b6a85a6d79eaca03eb266129eed2f845125c09cf31ff/pyproj-3.7.2-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:5aff3343038d7426aa5076f07feb88065f50e0502d1b0d7c22ddfdd2c75a3f81", size = 9688868, upload-time = "2025-08-14T12:05:30.425Z" }, { url = "https://files.pythonhosted.org/packages/b2/b7/c7e306b8bb0f071d9825b753ee4920f066c40fbfcce9372c4f3cfb2fc4ed/pyproj-3.7.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b0552178c61f2ac1c820d087e8ba6e62b29442debddbb09d51c4bf8acc84d888", size = 11045910, upload-time = "2025-08-14T12:05:32.507Z" }, { url = "https://files.pythonhosted.org/packages/42/fb/538a4d2df695980e2dde5c04d965fbdd1fe8c20a3194dc4aaa3952a4d1be/pyproj-3.7.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:47d87db2d2c436c5fd0409b34d70bb6cdb875cca2ebe7a9d1c442367b0ab8d59", size = 10895724, upload-time = "2025-08-14T12:05:35.465Z" }, { url = "https://files.pythonhosted.org/packages/e8/8b/a3f0618b03957de9db5489a04558a8826f43906628bb0b766033aa3b5548/pyproj-3.7.2-cp314-cp314t-win32.whl", hash = "sha256:c9b6f1d8ad3e80a0ee0903a778b6ece7dca1d1d40f6d114ae01bc8ddbad971aa", size = 6056848, upload-time = "2025-08-14T12:05:37.553Z" }, { url = "https://files.pythonhosted.org/packages/bc/56/413240dd5149dd3291eda55aa55a659da4431244a2fd1319d0ae89407cfb/pyproj-3.7.2-cp314-cp314t-win_amd64.whl", hash = "sha256:1914e29e27933ba6f9822663ee0600f169014a2859f851c054c88cf5ea8a333c", size = 6517676, upload-time = "2025-08-14T12:05:39.126Z" }, { url = "https://files.pythonhosted.org/packages/15/73/a7141a1a0559bf1a7aa42a11c879ceb19f02f5c6c371c6d57fd86cefd4d1/pyproj-3.7.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d9d25bae416a24397e0d85739f84d323b55f6511e45a522dd7d7eae70d10c7e4", size = 6391844, upload-time = "2025-08-14T12:05:40.745Z" }, ] [[package]] name = "pyproject-hooks" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, ] [[package]] name = "pytest" version = "9.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, ] [[package]] name = "pytest-benchmark" version = "5.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "py-cpuinfo" }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/24/34/9f732b76456d64faffbef6232f1f9dbec7a7c4999ff46282fa418bd1af66/pytest_benchmark-5.2.3.tar.gz", hash = "sha256:deb7317998a23c650fd4ff76e1230066a76cb45dcece0aca5607143c619e7779", size = 341340, upload-time = "2025-11-09T18:48:43.215Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/33/29/e756e715a48959f1c0045342088d7ca9762a2f509b945f362a316e9412b7/pytest_benchmark-5.2.3-py3-none-any.whl", hash = "sha256:bc839726ad20e99aaa0d11a127445457b4219bdb9e80a1afc4b51da7f96b0803", size = 45255, upload-time = "2025-11-09T18:48:39.765Z" }, ] [[package]] name = "pytest-cov" version = "7.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pluggy" }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, ] [[package]] name = "python-dateutil" version = "2.9.0.post0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "pywin32-ctypes" version = "0.2.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, ] [[package]] name = "pyyaml" version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] [[package]] name = "pyyaml-env-tag" version = "1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, ] [[package]] name = "rasterio" version = "1.4.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.12'", ] dependencies = [ { name = "affine", marker = "python_full_version < '3.12'" }, { name = "attrs", marker = "python_full_version < '3.12'" }, { name = "certifi", marker = "python_full_version < '3.12'" }, { name = "click", marker = "python_full_version < '3.12'" }, { name = "click-plugins", marker = "python_full_version < '3.12'" }, { name = "cligj", marker = "python_full_version < '3.12'" }, { name = "numpy", marker = "python_full_version < '3.12'" }, { name = "pyparsing", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ec/fa/fce8dc9f09e5bc6520b6fc1b4ecfa510af9ca06eb42ad7bdff9c9b8989d0/rasterio-1.4.4.tar.gz", hash = "sha256:c95424e2c7f009b8f7df1095d645c52895cd332c0c2e1b4c2e073ea28b930320", size = 445004, upload-time = "2025-12-12T18:01:08.971Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c6/0d/d3859e49ab94464de2623fec82c6798d8d7c8bea2473cd2696fc5e09f717/rasterio-1.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:b8eea428b5f0c78a963f6003a19b60777df83a0aba8c28231d65431e32ac160e", size = 21144125, upload-time = "2025-12-12T17:58:59.511Z" }, { url = "https://files.pythonhosted.org/packages/aa/3c/97ba4b146309cdc0e36f289b02ac69465b026a21afc828e4e4e1dc39466a/rasterio-1.4.4-cp311-cp311-macosx_15_0_x86_64.whl", hash = "sha256:1cc0ea5aa0d22f5f349aa221674481de689b7b3a99607ce6bb58a29e5be54d17", size = 25746406, upload-time = "2025-12-12T17:59:02.902Z" }, { url = "https://files.pythonhosted.org/packages/ce/33/75f81bd837ac2336b24456fdb249597a4b9af2a212b7151f64d09022be36/rasterio-1.4.4-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:7eb25b23666b29dadfc49a59206cead62c99190584b61771bba0e95f7da06801", size = 34587242, upload-time = "2025-12-12T17:59:05.848Z" }, { url = "https://files.pythonhosted.org/packages/f9/77/3869a426f6e752dde13f3868cdf16253ca0214f92107db79c1583c9aa07b/rasterio-1.4.4-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e24b7b8c2df801dde2a1dffb44c58902bd76b5cab740dc11de4ff9963992a71a", size = 35881871, upload-time = "2025-12-12T17:59:09.779Z" }, { url = "https://files.pythonhosted.org/packages/66/d0/3818859ddbd3750d0ef5a6580a3272e81764286d943c689dd41e49b8b786/rasterio-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:0718630f607be2f5742d8e4b34b434746fd788a192d77eefc9bb924399fea802", size = 25716477, upload-time = "2025-12-12T17:59:13.519Z" }, { url = "https://files.pythonhosted.org/packages/4b/02/039eb4970c93aaef4c9eb1ee159abad18e6e7f932c2eed575c95f78d94f6/rasterio-1.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:0308ff4762ae9eb40a991f12d758626b59af4376b13675480391dd7295d17bbf", size = 24075993, upload-time = "2025-12-12T17:59:16.407Z" }, { url = "https://files.pythonhosted.org/packages/4c/fc/63d89ddfcb4643730553683ee322566b9b15fe56d026e4c21c4f4f5d9d26/rasterio-1.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3c4f0cbd188f893011f2a0a6dc2852b3892799b3a0d79eddf92f2b115ec7ed7", size = 21120715, upload-time = "2025-12-12T17:59:19.35Z" }, { url = "https://files.pythonhosted.org/packages/43/70/2c003f76a23dbb078fdee35c8e2ec490d2ad8982f4dc956ba08b56027b87/rasterio-1.4.4-cp312-cp312-macosx_15_0_x86_64.whl", hash = "sha256:6fce26090b9f509eab337228420145947c491a13628965410f25bc3e6e05cf75", size = 25732944, upload-time = "2025-12-12T17:59:22.533Z" }, { url = "https://files.pythonhosted.org/packages/f6/cc/4a8e92362c0ff496dd1007c3dcba66e9ededf1a45eca8ad1db302b071c49/rasterio-1.4.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c1c722da390dc264aeccdc0dc200ca37923875d910ca4cd5bec0fec351bb818e", size = 34295209, upload-time = "2025-12-12T17:59:26.035Z" }, { url = "https://files.pythonhosted.org/packages/e6/6d/717d2dec47fbefad33ca0d27bd5f0d543b1d1bc9fcab5ef82a13adaaf38d/rasterio-1.4.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:98b6dfb8282b2a54b9d75c3dc8d2520a69bbc66916c7d43de8e0bbf6e0240ca1", size = 35661866, upload-time = "2025-12-12T17:59:29.928Z" }, { url = "https://files.pythonhosted.org/packages/ed/60/ae3351fba2726ec0976974ce2eb030c159edd3363b8771e832b8db571c24/rasterio-1.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:9513f4c7a6d93b45098f8dff2421fa9516604e3bfbf35aa144484a88d36a321f", size = 25682853, upload-time = "2025-12-12T17:59:35.869Z" }, { url = "https://files.pythonhosted.org/packages/38/ee/35387296bbacfc5cbbb4273228b1b959793d3ce38b0402a07f11a248420b/rasterio-1.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:60b49a482e0f12f12ce9d2cc3090add02f89f3d422e85f2cffaa9207adb83c04", size = 24043249, upload-time = "2025-12-12T17:59:39.915Z" }, { url = "https://files.pythonhosted.org/packages/c1/fe/e3e37041c49956f4f4cbe473c3fe290aaba96ed20e9c07da304e0cad2015/rasterio-1.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:df26c96aa81ffbd0b33189680859211eadf9950123c21579f84de73bb0f91d81", size = 21107336, upload-time = "2025-12-12T17:59:43.585Z" }, { url = "https://files.pythonhosted.org/packages/f3/02/c217fdcc8e80a4b7d1b1bc4529d78f98452816e9add53ff8742049a77ae7/rasterio-1.4.4-cp313-cp313-macosx_15_0_x86_64.whl", hash = "sha256:b3af0ecc922a80f3755516629f7948e37bade9077b5f5c12a3869a5e7f01619b", size = 25719929, upload-time = "2025-12-12T17:59:47.64Z" }, { url = "https://files.pythonhosted.org/packages/c0/d0/7f177f37bc9595d809dabb0073abd0c42358469f6b10875192b46331c652/rasterio-1.4.4-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:7ce3b0f9a22e95a27790087908753973644d7c3877d495ec9bd6e04a25233ca4", size = 34198845, upload-time = "2025-12-12T17:59:52.405Z" }, { url = "https://files.pythonhosted.org/packages/7b/84/66c0d9cca2a09074ec2ce6fffa87709ca51b0d197ae742d835e841bac660/rasterio-1.4.4-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c072450caa96428b1218b030500bb908fd6f09bc013a88969ff81a124b6a112a", size = 35576074, upload-time = "2025-12-12T17:59:56.392Z" }, { url = "https://files.pythonhosted.org/packages/32/68/f7df5478458ace2fa50be43e9fab1a39957a0e71afaa3e6147ec289e0fc8/rasterio-1.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:16ee92ef10c0ba89f45f9c2b40fca9f971f357385f04ee9b716fb09cbd9ce20c", size = 25680573, upload-time = "2025-12-12T18:00:00.45Z" }, { url = "https://files.pythonhosted.org/packages/34/e5/1bdaccb658430dfd391ad4a63d206546f36639d7e4130bf31f125c6525b4/rasterio-1.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:65c10afe64b5e488185aaff0b659e08eda22c89285b54a3e433b80e6c6621770", size = 24040367, upload-time = "2025-12-12T18:00:04.443Z" }, { url = "https://files.pythonhosted.org/packages/32/76/54643a7d1d650fd7f1acea9093c298603e4c01bba6f90be2254310b48507/rasterio-1.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:18c2c1130e789dc2771d0aa5ec4b56d5b8a0097c648ccb94882d5ff3ab55c928", size = 21247203, upload-time = "2025-12-12T18:00:07.547Z" }, { url = "https://files.pythonhosted.org/packages/76/ef/434b4849ccd6a3e03a0b1ac37c963c1771564945745613d15c5d96ce768d/rasterio-1.4.4-cp313-cp313t-macosx_15_0_x86_64.whl", hash = "sha256:2d1654b7ffa6f3dde42c5fd27159ae45148c11e352de26f12fe7313a3236aeed", size = 25822050, upload-time = "2025-12-12T18:00:11.081Z" }, { url = "https://files.pythonhosted.org/packages/2d/fa/fe9a478aa0cde246da58baeb0df3248c7ca174e4d9c9b27e81b504e40a76/rasterio-1.4.4-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c4022cbddb659856e120603b12233cec8913ae760fff220657ce888c3c6b9f9d", size = 34833783, upload-time = "2025-12-12T18:00:14.525Z" }, { url = "https://files.pythonhosted.org/packages/04/cd/ed4716590dbcd4b8ae633417d758564e510bee4d6aaac5050a0f6d5179c5/rasterio-1.4.4-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:96b88880551a07b7a3b50439483cefbd9af91a09e19ff2b736815994e5671314", size = 35738114, upload-time = "2025-12-12T18:00:17.96Z" }, { url = "https://files.pythonhosted.org/packages/7e/29/da7050d11ba1d041e0333ac14768e6e9ca1aa2b9fa8416f317d2650ed276/rasterio-1.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:def75d486d0ab8f306f918a913c425ed57159495518c54efe8e18d5164d37d90", size = 25896835, upload-time = "2025-12-12T18:00:21.411Z" }, { url = "https://files.pythonhosted.org/packages/88/80/304dbe5434c4aa8dfaf90480c16d770161796a6a61fa88e72e8a402153df/rasterio-1.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:770b7e86f6c565e6f9cf30f6fa4479a5a2bab4e10ff44fe7acfd518ca4a71d1b", size = 24128074, upload-time = "2025-12-12T18:00:24.653Z" }, { url = "https://files.pythonhosted.org/packages/03/01/d5a3dc51cd5fef62b76ecc77d33c1ca20de305fed7e16c71bcdf4858e466/rasterio-1.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:019693f14a83ae9225cb57c16e466901d0e6284962dcf13a9f4bb1175b979011", size = 21120237, upload-time = "2025-12-12T18:00:27.723Z" }, { url = "https://files.pythonhosted.org/packages/50/da/db18362602b17327c0e00c9e9c0847c1c4ac657c1a289169ca06a26faccb/rasterio-1.4.4-cp314-cp314-macosx_15_0_x86_64.whl", hash = "sha256:87d7c3e97e3b40c9041d1602e2dcb4fc2d88abe6c645fccb4939dec297a91cf8", size = 25720506, upload-time = "2025-12-12T18:00:30.592Z" }, { url = "https://files.pythonhosted.org/packages/5a/8f/a15d66c9c05bffb176c9707ef1f2bfcf9c0b835272937c80ac7207a20b5c/rasterio-1.4.4-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:a2401e4c43a31c7382154d4042b60a63b9bca5886802983c5c9362cdc5b09548", size = 34153931, upload-time = "2025-12-12T18:00:33.852Z" }, { url = "https://files.pythonhosted.org/packages/05/2d/cd778286b910db7a3f0bc1743ca362173f1fbb7365137e4982ca857b6d26/rasterio-1.4.4-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:6c4287d8934d953f7870b8e2a1df1096fbf47eba39ad0f777a31ea500f4e5010", size = 35421139, upload-time = "2025-12-12T18:00:37.482Z" }, { url = "https://files.pythonhosted.org/packages/70/97/13a2e33aede8d7a42178c696a6a93868d1f9560f73de05033a1675f0806a/rasterio-1.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:c3ba1871549221140661227dd4fa1f9a472ded4a6d2f2c2e367b0648bb15b99d", size = 26419132, upload-time = "2025-12-12T18:00:40.871Z" }, { url = "https://files.pythonhosted.org/packages/27/d8/2dcfcb362d6a2fd07c14cfb803a345a7926d4d9fb6243e196df105671e97/rasterio-1.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:7c9d7dc824cb8d222808be153643cd4e65ea3e1f66019ada1ccd630221edfe30", size = 24800998, upload-time = "2025-12-12T18:00:45.332Z" }, { url = "https://files.pythonhosted.org/packages/13/f8/16e9b648e7f16cadb41df7c0116dbab26b4a2ba02c85cbe3f744065bdf56/rasterio-1.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:98e17bded830a59992d9f8f8d9f227ce1c4be0694930afcc4360358f5cb1a5db", size = 21247046, upload-time = "2025-12-12T18:00:49.429Z" }, { url = "https://files.pythonhosted.org/packages/a8/ea/f3dc3a25d7591821d488f5c5eb89f6abcd1f5c8e2ef4bd2792f965cbc9c8/rasterio-1.4.4-cp314-cp314t-macosx_15_0_x86_64.whl", hash = "sha256:56134ca203f952855e60774b06672033cf65057eb9810fcc5c1a75f1921053a3", size = 25821677, upload-time = "2025-12-12T18:00:52.458Z" }, { url = "https://files.pythonhosted.org/packages/2e/d3/1e038350218e852f904c8dc4ab751aa023a2e82e68998767b7b42e33832c/rasterio-1.4.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:52edde65515b33fe4314c8a44a9ee2fc00b550deed6d56e1a8d085d42bbca3e6", size = 34829572, upload-time = "2025-12-12T18:00:56.294Z" }, { url = "https://files.pythonhosted.org/packages/0b/ce/28abf7a5f5d9cb014c2e14cc396bebe953b3deefbf604d49f4322e73fa35/rasterio-1.4.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:d61d3f2c171c64050bd75e54a5d964ff7f165b3f5d2b92c9ee09b9716aa1b8bf", size = 35735171, upload-time = "2025-12-12T18:00:59.531Z" }, { url = "https://files.pythonhosted.org/packages/54/91/1ce35cfda2d56dacd6395faf20a5290268bd9009c53393ac42b5f9bb2c4c/rasterio-1.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:40137fe512c0d6e96c0167a0ae4e56d82c488f244163c45494b7392e51c844de", size = 26700712, upload-time = "2025-12-12T18:01:03.023Z" }, { url = "https://files.pythonhosted.org/packages/3b/33/4d13f48a8f01d782ffc1eece20821586518f3f515dca7cf152bca9fd22d4/rasterio-1.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:29ec3a794454b5bb255c9c0374cc380030a8a1e295c81eee7feb036802d2a9e3", size = 24875933, upload-time = "2025-12-12T18:01:06.134Z" }, ] [[package]] name = "rasterio" version = "1.5.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.12'", ] dependencies = [ { name = "affine", marker = "python_full_version >= '3.12'" }, { name = "attrs", marker = "python_full_version >= '3.12'" }, { name = "certifi", marker = "python_full_version >= '3.12'" }, { name = "click", marker = "python_full_version >= '3.12'" }, { name = "cligj", marker = "python_full_version >= '3.12'" }, { name = "numpy", marker = "python_full_version >= '3.12'" }, { name = "pyparsing", marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f6/88/edb4b66b6cb2c13f123af5a3896bf70c0cbe73ab3cd4243cb4eb0212a0f6/rasterio-1.5.0.tar.gz", hash = "sha256:1e0ea56b02eea4989b36edf8e58a5a3ef40e1b7edcb04def2603accd5ab3ee7b", size = 452184, upload-time = "2026-01-05T16:06:47.169Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ac/de/ba1cd11d7d1182bfb26e758bf07016d04e5442f4f5fea35b0d7279b72399/rasterio-1.5.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:420656074897a460f5ef46f657b3061d2e004f9d99e613914b0671643e69d92c", size = 22787192, upload-time = "2026-01-05T16:05:19.779Z" }, { url = "https://files.pythonhosted.org/packages/e6/42/efaeb6dc531dbcd02fec01c791a853bb5a139a5126ecec579ac0f735eeb9/rasterio-1.5.0-cp312-cp312-macosx_15_0_x86_64.whl", hash = "sha256:c5c3597a783857e760550e8f26365d928b0377ac5ffc3e12ba447ac65ca5406d", size = 24412221, upload-time = "2026-01-05T16:05:22.526Z" }, { url = "https://files.pythonhosted.org/packages/a2/14/89645988424c40cbcb8334f94305ffe094dd28d85c643341d9690704c9f0/rasterio-1.5.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e14d07a09833b6df6024ce7a57aee1e1977b3aec682e30b1e58ce773462f2382", size = 36128020, upload-time = "2026-01-05T16:05:25.556Z" }, { url = "https://files.pythonhosted.org/packages/85/23/5a52319a98451ff910f42e5f7f4804bfb39f9327933a89daab685d1ce2dd/rasterio-1.5.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:26dbcffcf0d01fc121cbb92186bc1cb78e16efe62b17be45ad7494446b325cf8", size = 37634010, upload-time = "2026-01-05T16:05:28.673Z" }, { url = "https://files.pythonhosted.org/packages/57/d6/fe8826f813c98b046d8d4c3bc83053c89c71f367f89257d211fe5dd0b0ba/rasterio-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:ac8d04eee66ca8060763ead607800e5611d857dd005905d920365e24a16ba20a", size = 30142328, upload-time = "2026-01-05T16:05:31.357Z" }, { url = "https://files.pythonhosted.org/packages/af/62/6397379271d5628ed65ef781bf2d3a8f56094a86e6d8479c6ca506a1b960/rasterio-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:31f1edc45c781ebd087e60cc00a4fc37028dd3fe25cff4098e4139fc9d0565be", size = 28500710, upload-time = "2026-01-05T16:05:33.906Z" }, { url = "https://files.pythonhosted.org/packages/42/87/42865a77cebf2e524d27b6afc71db48984799ecd1dbe6a213d4713f42f5f/rasterio-1.5.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e7b25b0a19975ccd511e507e6de45b0a2d8fb6802abe49bb726cf48588e34833", size = 22776107, upload-time = "2026-01-05T16:05:36.967Z" }, { url = "https://files.pythonhosted.org/packages/6a/53/e81683fbbfdf04e019e68b042d9cff8524b0571aa80e4f4d81c373c31a49/rasterio-1.5.0-cp313-cp313-macosx_15_0_x86_64.whl", hash = "sha256:1162c18eaece9f6d2aa1c2ff6b373b99651d93f113f24120a991eaebf28aa4f4", size = 24401477, upload-time = "2026-01-05T16:05:39.702Z" }, { url = "https://files.pythonhosted.org/packages/bc/3c/6aa6e0690b18eea02a61739cb362a47c5df66138f0a02cc69e1181b964e5/rasterio-1.5.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:8eb87fd6f843eea109f3df9bef83f741b053b716b0465932276e2c0577dfb929", size = 36018214, upload-time = "2026-01-05T16:05:42.741Z" }, { url = "https://files.pythonhosted.org/packages/48/4a/1af9aa9810fb30668568f2c4dd3eec2412c8e9762b69201d971c509b295e/rasterio-1.5.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:08a7580cbb9b3bd320bdf827e10c9b2424d0df066d8eef6f2feb37e154ce0c17", size = 37544972, upload-time = "2026-01-05T16:05:45.815Z" }, { url = "https://files.pythonhosted.org/packages/01/62/bfe3408743c9837919ff232474a09ece9eaa88d4ee8c040711fa3dff6dad/rasterio-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:d7d6729c0739b5ec48c33686668a30e27f5bdb361093f180ee7818ff19665547", size = 30140141, upload-time = "2026-01-05T16:05:48.751Z" }, { url = "https://files.pythonhosted.org/packages/63/ca/e90e19a6d065a718cc3d468a12b9f015289ad17017656dea8c76f7318d1f/rasterio-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:8af7c368c22f0a99d1259ccc5a5cd96c432c2bde6f132c1ac78508cd7445a745", size = 28498556, upload-time = "2026-01-05T16:05:51.334Z" }, { url = "https://files.pythonhosted.org/packages/a0/ba/e37462d8c33bbbd6c152a0390ec6911a3d9614ded3d2bc6f6a48e147e833/rasterio-1.5.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b4ccfcc8ed9400e4f14efdf2005533fcf72048748b727f85ff89b9291ecdf98a", size = 22920107, upload-time = "2026-01-05T16:05:53.773Z" }, { url = "https://files.pythonhosted.org/packages/66/dc/7bfa9cf96ac39b451b2f94dfc584c223ec584c52c148df2e4bab60c3341b/rasterio-1.5.0-cp313-cp313t-macosx_15_0_x86_64.whl", hash = "sha256:2f57c36ca4d3c896f7024226bd71eeb5cd10c8183c2a94508534d78cc05ff9e7", size = 24508993, upload-time = "2026-01-05T16:05:57.062Z" }, { url = "https://files.pythonhosted.org/packages/e5/55/7293743f3b69de4b726c67b8dc9da01fc194070b6becc51add4ca8a20a27/rasterio-1.5.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cc1395475e4bb7032cd81dda4d5558061c4c7d5a50b1b5e146bdf9716d0b9353", size = 36565784, upload-time = "2026-01-05T16:06:00.019Z" }, { url = "https://files.pythonhosted.org/packages/cf/ef/5354c47de16c6e289728c3a3d6961ffcf7a9ad6313aef7e8db5d6a40c46e/rasterio-1.5.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:592a485e2057b1aaeab4f843c9897628e60e3ff45e2509325c3e1479116599cb", size = 37686456, upload-time = "2026-01-05T16:06:02.772Z" }, { url = "https://files.pythonhosted.org/packages/b7/fc/fe1f034b1acd1900d9fbd616826d001a3d5811f1d0c97c785f88f525853e/rasterio-1.5.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0c739e70a72fb080f039ee1570c5d02b974dde32ded1a3216e1f13fe38ac4844", size = 30355842, upload-time = "2026-01-05T16:06:06.359Z" }, { url = "https://files.pythonhosted.org/packages/e0/cb/4dee9697891c9c6474b240d00e27688e03ecd882d3c83cc97eb25c2266ff/rasterio-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:a3539a2f401a7b4b2e94ff2db334878c0e15a2d1c9fe90bb0879c52f89367ae5", size = 28589538, upload-time = "2026-01-05T16:06:09.662Z" }, { url = "https://files.pythonhosted.org/packages/77/9f/f84dfa54110c1c82f9f4fd929465d12519569b6f5d015273aa0957013b2e/rasterio-1.5.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:597be8df418d5ba7b6a927b6b9febfcb42b192882448a8d5b2e2e75a1296631f", size = 22788832, upload-time = "2026-01-05T16:06:12.247Z" }, { url = "https://files.pythonhosted.org/packages/20/f1/de55255c918b17afd7292f793a3500c4aea7e9530b2b3f5b3a57836c7d49/rasterio-1.5.0-cp314-cp314-macosx_15_0_x86_64.whl", hash = "sha256:dd292030d39d685c0b35eddef233e7f1cb8b43052578a3ec97a2da57799693be", size = 24405917, upload-time = "2026-01-05T16:06:14.603Z" }, { url = "https://files.pythonhosted.org/packages/a9/57/054087a9d5011ad5dfa799277ba8814e41775e1967d37a59ab7b8e2f1876/rasterio-1.5.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:62c3f97a3c72643c74f2d0f310621a09c35c0c412229c327ae6bcc1ee4b9c3bc", size = 35987536, upload-time = "2026-01-05T16:06:17.707Z" }, { url = "https://files.pythonhosted.org/packages/c9/72/5fbe5f67ae75d7e89ffb718c500d5fecbaa84f6ba354db306de689faf961/rasterio-1.5.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:19577f0f0c5f1158af47b57f73356961cbd1782a5f6ae6f3adf6f2650f4eb369", size = 37408048, upload-time = "2026-01-05T16:06:20.82Z" }, { url = "https://files.pythonhosted.org/packages/c4/3e/0c4ef19980204bdcbc8f9e084056adebc97916ff4edcc718750ef34e5bf9/rasterio-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:015c1ab6e5453312c5e29692752e7ad73568fe4d13567cbd448d7893128cbd2d", size = 30949590, upload-time = "2026-01-05T16:06:23.425Z" }, { url = "https://files.pythonhosted.org/packages/c2/d8/2e6b81505408926c00e629d7d3d73fd0454213201bd9907450e0fe82f3dd/rasterio-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:ff677c0a9d3ba667c067227ef2b76872488b37ff29b061bc3e576fad9baa3286", size = 29337287, upload-time = "2026-01-05T16:06:26.599Z" }, { url = "https://files.pythonhosted.org/packages/19/49/7b6e6afb28d4e3f69f2229f990ed87dfdc21a3e15ca63b96b2fd9ba17d89/rasterio-1.5.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:508251b9c746d8d008771a30c2160ff321bfc3b41f6a1aa8e8ef1dd4a00d97ba", size = 22926149, upload-time = "2026-01-05T16:06:29.617Z" }, { url = "https://files.pythonhosted.org/packages/24/30/19345d8bc7d2b96c1172594026b9009702e9ab9f0baf07079d3612aaadae/rasterio-1.5.0-cp314-cp314t-macosx_15_0_x86_64.whl", hash = "sha256:742841ed48bc70f6ef517b8fa3521f231780bf408fde0aa6d73770337a36374e", size = 24516040, upload-time = "2026-01-05T16:06:32.964Z" }, { url = "https://files.pythonhosted.org/packages/9e/43/dc7a4518fa78904bc41952cbf346c3c2a88a20e61b479154058392914c0b/rasterio-1.5.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c9a9eee49ce9410c2f352b34c370bb3a96bb518b6a7f97b3a72ee4c835fd4b5c", size = 36589519, upload-time = "2026-01-05T16:06:35.922Z" }, { url = "https://files.pythonhosted.org/packages/8f/f2/8f706083c6c163054d12c7ed6d5ac4e4ed02252b761288d74e6158871b34/rasterio-1.5.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:b9fd87a0b63ab5c6267dfb0bc96f54fdf49d000651b9ee85ed37798141cff046", size = 37714599, upload-time = "2026-01-05T16:06:38.818Z" }, { url = "https://files.pythonhosted.org/packages/a6/d5/bbca726d5fea5864f7e4bcf3ee893095369e93ad51120495e8c40e2aa1a0/rasterio-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f459db8953ba30ca04fcef2b5e1260eeeff0eae8158bd9c3d6adbe56289765cc", size = 31233931, upload-time = "2026-01-05T16:06:42.208Z" }, { url = "https://files.pythonhosted.org/packages/6e/d1/8b017856e63ccaff3cbd0e82490dbb01363a42f3a462a41b1d8a391e1443/rasterio-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f4b9c2c3b5f10469eb9588f105086e68f0279e62cc9095c4edd245e3f9b88c8a", size = 29418321, upload-time = "2026-01-05T16:06:44.758Z" }, ] [[package]] name = "requests" version = "2.32.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] [[package]] name = "rich" version = "14.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143, upload-time = "2026-02-01T16:20:47.908Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963, upload-time = "2026-02-01T16:20:46.078Z" }, ] [[package]] name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "jeepney" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "tinycss2" version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" }, ] [[package]] name = "tomli" version = "2.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" }, { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" }, { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" }, { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" }, { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" }, { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" }, { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" }, { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" }, { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" }, { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, ] [[package]] name = "tomli-w" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, ] [[package]] name = "tomlkit" version = "0.14.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/c3/af/14b24e41977adb296d6bd1fb59402cf7d60ce364f90c890bd2ec65c43b5a/tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064", size = 187167, upload-time = "2026-01-13T01:14:53.304Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b5/11/87d6d29fb5d237229d67973a6c9e06e048f01cf4994dee194ab0ea841814/tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680", size = 39310, upload-time = "2026-01-13T01:14:51.965Z" }, ] [[package]] name = "trove-classifiers" version = "2026.1.14.14" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/43/7935f8ea93fcb6680bc10a6fdbf534075c198eeead59150dd5ed68449642/trove_classifiers-2026.1.14.14.tar.gz", hash = "sha256:00492545a1402b09d4858605ba190ea33243d361e2b01c9c296ce06b5c3325f3", size = 16997, upload-time = "2026-01-14T14:54:50.526Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl", hash = "sha256:1f9553927f18d0513d8e5ff80ab8980b8202ce37ecae0e3274ed2ef11880e74d", size = 14197, upload-time = "2026-01-14T14:54:49.067Z" }, ] [[package]] name = "typing-extensions" version = "4.15.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] name = "typing-inspection" version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] [[package]] name = "urllib3" version = "2.6.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] [[package]] name = "userpath" version = "1.9.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d5/b7/30753098208505d7ff9be5b3a32112fb8a4cb3ddfccbbb7ba9973f2e29ff/userpath-1.9.2.tar.gz", hash = "sha256:6c52288dab069257cc831846d15d48133522455d4677ee69a9781f11dbefd815", size = 11140, upload-time = "2024-02-29T21:39:08.742Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/43/99/3ec6335ded5b88c2f7ed25c56ffd952546f7ed007ffb1e1539dc3b57015a/userpath-1.9.2-py3-none-any.whl", hash = "sha256:2cbf01a23d655a1ff8fc166dfb78da1b641d1ceabf0fe5f970767d380b14e89d", size = 9065, upload-time = "2024-02-29T21:39:07.551Z" }, ] [[package]] name = "uv" version = "0.9.30" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/4e/a0/63cea38fe839fb89592728b91928ee6d15705f1376a7940fee5bbc77fea0/uv-0.9.30.tar.gz", hash = "sha256:03ebd4b22769e0a8d825fa09d038e31cbab5d3d48edf755971cb0cec7920ab95", size = 3846526, upload-time = "2026-02-04T21:45:37.58Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a3/3c/71be72f125f0035348b415468559cc3b335ec219376d17a3d242d2bd9b23/uv-0.9.30-py3-none-linux_armv6l.whl", hash = "sha256:a5467dddae1cd5f4e093f433c0f0d9a0df679b92696273485ec91bbb5a8620e6", size = 21927585, upload-time = "2026-02-04T21:46:14.935Z" }, { url = "https://files.pythonhosted.org/packages/0f/fd/8070b5423a77d4058d14e48a970aa075762bbff4c812dda3bb3171543e44/uv-0.9.30-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ec38ae29aa83a37c6e50331707eac8ecc90cf2b356d60ea6382a94de14973be", size = 21050392, upload-time = "2026-02-04T21:45:55.649Z" }, { url = "https://files.pythonhosted.org/packages/42/5f/3ccc9415ef62969ed01829572338ea7bdf4c5cf1ffb9edc1f8cb91b571f3/uv-0.9.30-py3-none-macosx_11_0_arm64.whl", hash = "sha256:777ecd117cf1d8d6bb07de8c9b7f6c5f3e802415b926cf059d3423699732eb8c", size = 19817085, upload-time = "2026-02-04T21:45:40.881Z" }, { url = "https://files.pythonhosted.org/packages/8b/3f/76b44e2a224f4c4a8816fc92686ef6d4c2656bc5fc9d4f673816162c994d/uv-0.9.30-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:93049ba3c41fa2cc38b467cb78ef61b2ddedca34b6be924a5481d7750c8111c6", size = 21620537, upload-time = "2026-02-04T21:45:47.846Z" }, { url = "https://files.pythonhosted.org/packages/60/2a/50f7e8c6d532af8dd327f77bdc75ce4652322ac34f5e29f79a8e04ea3cc8/uv-0.9.30-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:f295604fee71224ebe2685a0f1f4ff7a45c77211a60bd57133a4a02056d7c775", size = 21550855, upload-time = "2026-02-04T21:46:26.269Z" }, { url = "https://files.pythonhosted.org/packages/0e/10/f823d4af1125fae559194b356757dc7d4a8ac79d10d11db32c2d4c9e2f63/uv-0.9.30-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2faf84e1f3b6fc347a34c07f1291d11acf000b0dd537a61d541020f22b17ccd9", size = 21516576, upload-time = "2026-02-04T21:46:03.494Z" }, { url = "https://files.pythonhosted.org/packages/91/f3/64b02db11f38226ed34458c7fbdb6f16b6d4fd951de24c3e51acf02b30f8/uv-0.9.30-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b3b3700ecf64a09a07fd04d10ec35f0973ec15595d38bbafaa0318252f7e31f", size = 22718097, upload-time = "2026-02-04T21:45:51.875Z" }, { url = "https://files.pythonhosted.org/packages/28/21/a48d1872260f04a68bb5177b0f62ddef62ab892d544ed1922f2d19fd2b00/uv-0.9.30-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b176fc2937937dd81820445cb7e7e2e3cd1009a003c512f55fa0ae10064c8a38", size = 24107844, upload-time = "2026-02-04T21:46:19.032Z" }, { url = "https://files.pythonhosted.org/packages/1c/c6/d7e5559bfe1ab7a215a7ad49c58c8a5701728f2473f7f436ef00b4664e88/uv-0.9.30-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:180e8070b8c438b9a3fb3fde8a37b365f85c3c06e17090f555dc68fdebd73333", size = 23685378, upload-time = "2026-02-04T21:46:07.166Z" }, { url = "https://files.pythonhosted.org/packages/a8/bf/b937bbd50d14c6286e353fd4c7bdc09b75f6b3a26bd4e2f3357e99891f28/uv-0.9.30-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4125a9aa2a751e1589728f6365cfe204d1be41499148ead44b6180b7df576f27", size = 22848471, upload-time = "2026-02-04T21:45:18.728Z" }, { url = "https://files.pythonhosted.org/packages/6a/57/12a67c569e69b71508ad669adad266221f0b1d374be88eaf60109f551354/uv-0.9.30-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4366dd740ac9ad3ec50a58868a955b032493bb7d7e6ed368289e6ced8bbc70f3", size = 22774258, upload-time = "2026-02-04T21:46:10.798Z" }, { url = "https://files.pythonhosted.org/packages/3d/b8/a26cc64685dddb9fb13f14c3dc1b12009f800083405f854f84eb8c86b494/uv-0.9.30-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:33e50f208e01a0c20b3c5f87d453356a5cbcfd68f19e47a28b274cd45618881c", size = 21699573, upload-time = "2026-02-04T21:45:44.365Z" }, { url = "https://files.pythonhosted.org/packages/c8/59/995af0c5f0740f8acb30468e720269e720352df1d204e82c2d52d9a8c586/uv-0.9.30-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5e7a6fa7a3549ce893cf91fe4b06629e3e594fc1dca0a6050aba2ea08722e964", size = 22460799, upload-time = "2026-02-04T21:45:26.658Z" }, { url = "https://files.pythonhosted.org/packages/bb/0b/6affe815ecbaebf38b35d6230fbed2f44708c67d5dd5720f81f2ec8f96ff/uv-0.9.30-py3-none-musllinux_1_1_i686.whl", hash = "sha256:62d7e408d41e392b55ffa4cf9b07f7bbd8b04e0929258a42e19716c221ac0590", size = 22001777, upload-time = "2026-02-04T21:45:34.656Z" }, { url = "https://files.pythonhosted.org/packages/f3/b6/47a515171c891b0d29f8e90c8a1c0e233e4813c95a011799605cfe04c74c/uv-0.9.30-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:6dc65c24f5b9cdc78300fa6631368d3106e260bbffa66fb1e831a318374da2df", size = 22968416, upload-time = "2026-02-04T21:45:22.863Z" }, { url = "https://files.pythonhosted.org/packages/3d/3a/c1df8615385138bb7c43342586431ca32b77466c5fb086ac0ed14ab6ca28/uv-0.9.30-py3-none-win32.whl", hash = "sha256:74e94c65d578657db94a753d41763d0364e5468ec0d368fb9ac8ddab0fb6e21f", size = 20889232, upload-time = "2026-02-04T21:46:22.617Z" }, { url = "https://files.pythonhosted.org/packages/f2/a8/e8761c8414a880d70223723946576069e042765475f73b4436d78b865dba/uv-0.9.30-py3-none-win_amd64.whl", hash = "sha256:88a2190810684830a1ba4bb1cf8fb06b0308988a1589559404259d295260891c", size = 23432208, upload-time = "2026-02-04T21:45:30.85Z" }, { url = "https://files.pythonhosted.org/packages/49/e8/6f2ebab941ec559f97110bbbae1279cd0333d6bc352b55f6fa3fefb020d9/uv-0.9.30-py3-none-win_arm64.whl", hash = "sha256:7fde83a5b5ea027315223c33c30a1ab2f2186910b933d091a1b7652da879e230", size = 21887273, upload-time = "2026-02-04T21:45:59.787Z" }, ] [[package]] name = "virtualenv" version = "20.36.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] [[package]] name = "webencodings" version = "0.5.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, ] [[package]] name = "zipp" version = "3.23.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, ]