From 1a0431366f1320b3c77f76d98c0b050398bed3ed Mon Sep 17 00:00:00 2001 From: AdrianoDev Date: Sat, 25 Apr 2026 12:26:47 +0200 Subject: [PATCH] chore(v2): restructure monorepo to src/ layout with uv Aligns the repo with the python-project-spec-design.md template chosen for V2.0.0. Big move, no logic changes. The 3 pre-existing test failures (test_recipes::test_update_recipe, test_recipes:: test_recipe_versioning, test_tasks::test_reorder_tasks, plus the client test_save_measurement_proxy) survive unchanged. Layout changes - server/ -> src/backend/ - server/middleware/ -> src/backend/api/middleware/ - server/routers/ -> src/backend/api/routers/ - server/models/ -> src/backend/models/orm/ - server/schemas/ -> src/backend/models/api/ - server/uploads/ -> uploads/ (project root, mounted volume) - server/tests/ -> src/backend/tests/ - client/ -> src/frontend/flask_app/ (Flask kept; React deroga is documented in CLAUDE.md, justified by tablet UX, USB caliper/barcode workflow and Fabric.js integration) Tooling - pyproject.toml: monorepo with [project] core deps and optional-dependencies server / client / dev. Replaces both server/requirements.txt and client/requirements.txt. - uv.lock + .python-version (3.11) committed for reproducible builds. - Dockerfile (root, backend) and Dockerfile.frontend rewritten to use uv sync --frozen --no-dev --extra server|client; legacy Dockerfiles preserved as Dockerfile.legacy for reference but excluded from build context via .dockerignore. - docker-compose.dev.yml + docker-compose.yml: build context now ".", dockerfile pointing to the root files. Code adjustments forced by the move - Every "from config|database|models|schemas|services|routers|middleware import ..." rewritten to its src.backend.* equivalent (50+ files including indented inline imports inside test bodies). - src/backend/migrations/env.py: insert project root into sys.path so alembic can resolve src.backend.* imports regardless of cwd. - src/backend/config.py: env_file ../../.env (was ../.env), upload_path resolves project root via parents[2]. - src/backend/tests/conftest.py + tests: import ... from src.backend.* instead of bare names; old per-directory pytest.ini files removed in favor of root pyproject.toml [tool.pytest.ini_options]. - .gitignore: uploads/ at root, src/frontend/flask_app/static/css/ tailwind.css path; .dockerignore tightened. - CLAUDE.md: rewrote sections "Layout del repository", "Comandi di Sviluppo", "Database & Migrations", "Test", "i18n", and all path references throughout the architecture sections. Verified - uv lock resolves 77 packages; uv sync --extra server --extra client --extra dev installs cleanly. - uv run pytest: 171 passed, 4 pre-existing failures. - uv run alembic -c src/backend/migrations/alembic.ini check loads config and metadata (errors only on the absent local MySQL). Co-Authored-By: Claude Opus 4.7 (1M context) --- .dockerignore | 52 +- .gitignore | 22 +- .python-version | 1 + CLAUDE.md | 137 +- Dockerfile | 40 + Dockerfile.frontend | 42 + Schema sviluppo SW TieFlow_rev04-2026.docx | Bin 0 -> 104213 bytes client/pytest.ini | 4 - client/requirements.txt | 15 - docker-compose.dev.yml | 6 +- docker-compose.yml | 6 +- pyproject.toml | 73 + server/models/__init__.py | 19 - server/pytest.ini | 5 - {client/blueprints => src}/__init__.py | 0 .../backend/Dockerfile.legacy | 0 {client/services => src/backend}/__init__.py | 0 {client/tests => src/backend/api}/__init__.py | 0 .../backend/api}/middleware/__init__.py | 8 +- .../backend/api}/middleware/api_key.py | 4 +- .../backend/api}/middleware/logging.py | 4 +- .../backend/api}/middleware/rate_limit.py | 2 +- .../api}/middleware/security_headers.py | 2 +- .../backend/api}/routers/__init__.py | 0 {server => src/backend/api}/routers/auth.py | 10 +- {server => src/backend/api}/routers/files.py | 6 +- .../backend/api}/routers/measurements.py | 16 +- .../backend/api}/routers/recipes.py | 10 +- .../backend/api}/routers/reports.py | 8 +- .../backend/api}/routers/settings.py | 10 +- {server => src/backend/api}/routers/setup.py | 12 +- .../backend/api}/routers/stations.py | 10 +- .../backend/api}/routers/statistics.py | 16 +- {server => src/backend/api}/routers/tasks.py | 16 +- {server => src/backend/api}/routers/users.py | 10 +- {server => src/backend}/config.py | 12 +- {server => src/backend}/database.py | 2 +- {server => src/backend}/main.py | 32 +- .../backend}/migrations/alembic.ini | 0 {server => src/backend}/migrations/env.py | 23 +- .../backend}/migrations/script.py.mako | 0 .../backend/migrations/versions}/.gitkeep | 0 ...01_add_image_path_to_recipe_and_subtask.py | 0 .../migrations/versions/002_add_stations.py | 0 .../backend/models}/__init__.py | 0 .../backend/models/api}/__init__.py | 10 +- .../backend/models/api}/measurement.py | 0 .../backend/models/api}/recipe.py | 4 +- .../backend/models/api}/station.py | 0 .../backend/models/api}/statistics.py | 0 .../backend/models/api}/task.py | 0 .../backend/models/api}/user.py | 0 src/backend/models/orm/__init__.py | 19 + .../backend/models/orm}/access_log.py | 2 +- .../backend/models/orm}/measurement.py | 2 +- .../backend/models/orm}/recipe.py | 4 +- .../backend/models/orm}/setting.py | 2 +- .../backend/models/orm}/station.py | 4 +- .../models => src/backend/models/orm}/task.py | 4 +- .../models => src/backend/models/orm}/user.py | 2 +- .../backend/services}/__init__.py | 0 .../backend}/services/auth_service.py | 2 +- .../backend}/services/measurement_service.py | 4 +- .../backend}/services/recipe_service.py | 12 +- .../backend}/services/report_service.py | 14 +- .../backend}/services/spc_service.py | 2 +- .../backend}/services/station_service.py | 8 +- .../backend/templates/reports}/.gitkeep | 0 .../templates/reports/base_report.html | 0 .../templates/reports/measurement_report.html | 0 .../templates/reports/spc_report.html | 0 .../backend}/templates/setup/setup.html | 0 .../vendor => src/backend/tests}/.gitkeep | 0 .../.gitkeep => src/backend/tests/__init__.py | 0 {server => src/backend}/tests/conftest.py | 22 +- {server => src/backend}/tests/test_auth.py | 2 +- {server => src/backend}/tests/test_files.py | 16 +- .../backend}/tests/test_measurements.py | 8 +- .../backend}/tests/test_rate_limit_proxy.py | 2 +- {server => src/backend}/tests/test_recipes.py | 4 +- {server => src/backend}/tests/test_reports.py | 8 +- .../backend}/tests/test_security.py | 6 +- .../backend}/tests/test_settings.py | 6 +- {server => src/backend}/tests/test_setup.py | 12 +- .../backend}/tests/test_station_model.py | 4 +- .../backend}/tests/test_station_schemas.py | 2 +- .../backend}/tests/test_station_seed.py | 10 +- .../backend}/tests/test_station_service.py | 10 +- .../backend}/tests/test_stations_api.py | 2 +- .../backend}/tests/test_statistics.py | 6 +- {server => src/backend}/tests/test_tasks.py | 4 +- {server => src/backend}/tests/test_users.py | 4 +- {server => src/backend_temp}/requirements.txt | 0 .../frontend/flask_app/Dockerfile.legacy | 0 .../frontend/flask_app}/I18N_SETUP.md | 0 {client => src/frontend/flask_app}/app.py | 0 .../frontend/flask_app/blueprints/__init__.py | 0 .../frontend/flask_app}/blueprints/admin.py | 0 .../frontend/flask_app}/blueprints/auth.py | 0 .../frontend/flask_app}/blueprints/maker.py | 0 .../frontend/flask_app}/blueprints/measure.py | 0 .../flask_app}/blueprints/statistics.py | 0 .../flask_app}/compile_translations.py | 0 {client => src/frontend/flask_app}/config.py | 0 .../frontend/flask_app/services/__init__.py | 0 .../flask_app}/services/api_client.py | 0 .../frontend/flask_app}/static/css/input.css | 0 .../frontend/flask_app}/static/css/numpad.css | 0 .../frontend/flask_app}/static/css/themes.css | 0 .../frontend/flask_app/static/img}/.gitkeep | 0 .../flask_app}/static/img/tmflow-icon.svg | 0 .../flask_app}/static/img/tmflow-logo.svg | 0 .../frontend/flask_app/static/js}/.gitkeep | 0 .../flask_app}/static/js/alpine-init.js | 0 .../flask_app}/static/js/annotation-editor.js | 0 .../flask_app}/static/js/annotation-viewer.js | 0 .../frontend/flask_app}/static/js/barcode.js | 0 .../frontend/flask_app}/static/js/caliper.js | 0 .../flask_app}/static/js/csv-export.js | 0 .../flask_app}/static/js/locales/en.json | 0 .../flask_app}/static/js/locales/it.json | 0 .../frontend/flask_app}/static/js/numpad.js | 0 .../flask_app}/static/js/spc-charts.js | 0 .../flask_app/static/vendor}/.gitkeep | 0 .../frontend/flask_app}/tailwind.config.js | 0 .../flask_app}/templates/admin/stations.html | 0 .../flask_app}/templates/admin/users.html | 0 .../flask_app/templates/auth}/.gitkeep | 0 .../flask_app}/templates/auth/login.html | 0 .../flask_app}/templates/auth/profile.html | 0 .../frontend/flask_app}/templates/base.html | 0 .../flask_app/templates/components}/.gitkeep | 0 .../templates/components/barcode_scanner.html | 0 .../templates/components/caliper_status.html | 0 .../components/measurement_feedback.html | 0 .../templates/components/navbar.html | 0 .../components/next_measurement.html | 0 .../templates/components/numpad.html | 0 .../errors/station_not_configured.html | 0 .../flask_app/templates/maker}/.gitkeep | 0 .../templates/maker/recipe_editor.html | 0 .../templates/maker/recipe_list.html | 0 .../templates/maker/recipe_preview.html | 0 .../templates/maker/task_drawing.html | 0 .../templates/maker/task_editor.html | 0 .../templates/maker/version_history.html | 0 .../flask_app/templates/measure}/.gitkeep | 0 .../templates/measure/select_recipe.html | 0 .../templates/measure/task_complete.html | 0 .../templates/measure/task_execute.html | 0 .../templates/measure/task_list.html | 0 .../templates/statistics/dashboard.html | 0 .../frontend/flask_app/tests}/.gitkeep | 0 .../frontend/flask_app/tests/__init__.py | 0 .../frontend/flask_app}/tests/conftest.py | 0 .../flask_app}/tests/test_admin_stations.py | 0 .../flask_app}/tests/test_api_client_proxy.py | 0 .../tests/test_api_client_stations.py | 0 .../frontend/flask_app}/tests/test_auth.py | 0 .../flask_app}/tests/test_config_station.py | 0 .../frontend/flask_app}/tests/test_maker.py | 0 .../frontend/flask_app}/tests/test_measure.py | 0 .../tests/test_measure_station_filter.py | 0 .../flask_app}/tests/test_statistics.py | 0 .../flask_app}/translations/babel.cfg | 0 .../translations/en/LC_MESSAGES/messages.po | 0 .../translations/it/LC_MESSAGES/messages.po | 0 .../flask_app}/translations/messages.pot | 0 .../frontend/flask_app}/verify_i18n.py | 0 uploads/images/.gitkeep | 0 uploads/logos/.gitkeep | 0 uploads/pdfs/.gitkeep | 0 uploads/reports/.gitkeep | 0 uv.lock | 2018 +++++++++++++++++ 174 files changed, 2568 insertions(+), 308 deletions(-) create mode 100644 .python-version create mode 100644 Dockerfile create mode 100644 Dockerfile.frontend create mode 100644 Schema sviluppo SW TieFlow_rev04-2026.docx delete mode 100644 client/pytest.ini delete mode 100644 client/requirements.txt create mode 100644 pyproject.toml delete mode 100644 server/models/__init__.py delete mode 100644 server/pytest.ini rename {client/blueprints => src}/__init__.py (100%) rename server/Dockerfile => src/backend/Dockerfile.legacy (100%) rename {client/services => src/backend}/__init__.py (100%) rename {client/tests => src/backend/api}/__init__.py (100%) rename {server => src/backend/api}/middleware/__init__.py (63%) rename {server => src/backend/api}/middleware/api_key.py (96%) rename {server => src/backend/api}/middleware/logging.py (94%) rename {server => src/backend/api}/middleware/rate_limit.py (99%) rename {server => src/backend/api}/middleware/security_headers.py (97%) rename {server => src/backend/api}/routers/__init__.py (100%) rename {server => src/backend/api}/routers/auth.py (86%) rename {server => src/backend/api}/routers/files.py (97%) rename {server => src/backend/api}/routers/measurements.py (95%) rename {server => src/backend/api}/routers/recipes.py (95%) rename {server => src/backend/api}/routers/reports.py (91%) rename {server => src/backend/api}/routers/settings.py (94%) rename {server => src/backend/api}/routers/setup.py (98%) rename {server => src/backend/api}/routers/stations.py (94%) rename {server => src/backend/api}/routers/statistics.py (95%) rename {server => src/backend/api}/routers/tasks.py (96%) rename {server => src/backend/api}/routers/users.py (93%) rename {server => src/backend}/config.py (74%) rename {server => src/backend}/database.py (96%) rename {server => src/backend}/main.py (63%) rename {server => src/backend}/migrations/alembic.ini (100%) rename {server => src/backend}/migrations/env.py (69%) rename {server => src/backend}/migrations/script.py.mako (100%) rename {client/static/img => src/backend/migrations/versions}/.gitkeep (100%) rename {server => src/backend}/migrations/versions/001_add_image_path_to_recipe_and_subtask.py (100%) rename {server => src/backend}/migrations/versions/002_add_stations.py (100%) rename {server/services => src/backend/models}/__init__.py (100%) rename {server/schemas => src/backend/models/api}/__init__.py (86%) rename {server/schemas => src/backend/models/api}/measurement.py (100%) rename {server/schemas => src/backend/models/api}/recipe.py (94%) rename {server/schemas => src/backend/models/api}/station.py (100%) rename {server/schemas => src/backend/models/api}/statistics.py (100%) rename {server/schemas => src/backend/models/api}/task.py (100%) rename {server/schemas => src/backend/models/api}/user.py (100%) create mode 100644 src/backend/models/orm/__init__.py rename {server/models => src/backend/models/orm}/access_log.py (96%) rename {server/models => src/backend/models/orm}/measurement.py (98%) rename {server/models => src/backend/models/orm}/recipe.py (96%) rename {server/models => src/backend/models/orm}/setting.py (98%) rename {server/models => src/backend/models/orm}/station.py (96%) rename {server/models => src/backend/models/orm}/task.py (97%) rename {server/models => src/backend/models/orm}/user.py (98%) rename {server/tests => src/backend/services}/__init__.py (100%) rename {server => src/backend}/services/auth_service.py (98%) rename {server => src/backend}/services/measurement_service.py (95%) rename {server => src/backend}/services/recipe_service.py (98%) rename {server => src/backend}/services/report_service.py (97%) rename {server => src/backend}/services/spc_service.py (99%) rename {server => src/backend}/services/station_service.py (95%) rename {client/static/js => src/backend/templates/reports}/.gitkeep (100%) rename {server => src/backend}/templates/reports/base_report.html (100%) rename {server => src/backend}/templates/reports/measurement_report.html (100%) rename {server => src/backend}/templates/reports/spc_report.html (100%) rename {server => src/backend}/templates/setup/setup.html (100%) rename {client/static/vendor => src/backend/tests}/.gitkeep (100%) rename client/templates/auth/.gitkeep => src/backend/tests/__init__.py (100%) rename {server => src/backend}/tests/conftest.py (91%) rename {server => src/backend}/tests/test_auth.py (98%) rename {server => src/backend}/tests/test_files.py (91%) rename {server => src/backend}/tests/test_measurements.py (97%) rename {server => src/backend}/tests/test_rate_limit_proxy.py (96%) rename {server => src/backend}/tests/test_recipes.py (98%) rename {server => src/backend}/tests/test_reports.py (92%) rename {server => src/backend}/tests/test_security.py (96%) rename {server => src/backend}/tests/test_settings.py (95%) rename {server => src/backend}/tests/test_setup.py (96%) rename {server => src/backend}/tests/test_station_model.py (94%) rename {server => src/backend}/tests/test_station_schemas.py (95%) rename {server => src/backend}/tests/test_station_seed.py (92%) rename {server => src/backend}/tests/test_station_service.py (94%) rename {server => src/backend}/tests/test_stations_api.py (98%) rename {server => src/backend}/tests/test_statistics.py (97%) rename {server => src/backend}/tests/test_tasks.py (98%) rename {server => src/backend}/tests/test_users.py (97%) rename {server => src/backend_temp}/requirements.txt (100%) rename client/Dockerfile => src/frontend/flask_app/Dockerfile.legacy (100%) rename {client => src/frontend/flask_app}/I18N_SETUP.md (100%) rename {client => src/frontend/flask_app}/app.py (100%) rename client/templates/components/.gitkeep => src/frontend/flask_app/blueprints/__init__.py (100%) rename {client => src/frontend/flask_app}/blueprints/admin.py (100%) rename {client => src/frontend/flask_app}/blueprints/auth.py (100%) rename {client => src/frontend/flask_app}/blueprints/maker.py (100%) rename {client => src/frontend/flask_app}/blueprints/measure.py (100%) rename {client => src/frontend/flask_app}/blueprints/statistics.py (100%) rename {client => src/frontend/flask_app}/compile_translations.py (100%) rename {client => src/frontend/flask_app}/config.py (100%) rename client/templates/maker/.gitkeep => src/frontend/flask_app/services/__init__.py (100%) rename {client => src/frontend/flask_app}/services/api_client.py (100%) rename {client => src/frontend/flask_app}/static/css/input.css (100%) rename {client => src/frontend/flask_app}/static/css/numpad.css (100%) rename {client => src/frontend/flask_app}/static/css/themes.css (100%) rename {client/templates/measure => src/frontend/flask_app/static/img}/.gitkeep (100%) rename {client => src/frontend/flask_app}/static/img/tmflow-icon.svg (100%) rename {client => src/frontend/flask_app}/static/img/tmflow-logo.svg (100%) rename {client/tests => src/frontend/flask_app/static/js}/.gitkeep (100%) rename {client => src/frontend/flask_app}/static/js/alpine-init.js (100%) rename {client => src/frontend/flask_app}/static/js/annotation-editor.js (100%) rename {client => src/frontend/flask_app}/static/js/annotation-viewer.js (100%) rename {client => src/frontend/flask_app}/static/js/barcode.js (100%) rename {client => src/frontend/flask_app}/static/js/caliper.js (100%) rename {client => src/frontend/flask_app}/static/js/csv-export.js (100%) rename {client => src/frontend/flask_app}/static/js/locales/en.json (100%) rename {client => src/frontend/flask_app}/static/js/locales/it.json (100%) rename {client => src/frontend/flask_app}/static/js/numpad.js (100%) rename {client => src/frontend/flask_app}/static/js/spc-charts.js (100%) rename {server/migrations/versions => src/frontend/flask_app/static/vendor}/.gitkeep (100%) rename {client => src/frontend/flask_app}/tailwind.config.js (100%) rename {client => src/frontend/flask_app}/templates/admin/stations.html (100%) rename {client => src/frontend/flask_app}/templates/admin/users.html (100%) rename {server/templates/reports => src/frontend/flask_app/templates/auth}/.gitkeep (100%) rename {client => src/frontend/flask_app}/templates/auth/login.html (100%) rename {client => src/frontend/flask_app}/templates/auth/profile.html (100%) rename {client => src/frontend/flask_app}/templates/base.html (100%) rename {server/tests => src/frontend/flask_app/templates/components}/.gitkeep (100%) rename {client => src/frontend/flask_app}/templates/components/barcode_scanner.html (100%) rename {client => src/frontend/flask_app}/templates/components/caliper_status.html (100%) rename {client => src/frontend/flask_app}/templates/components/measurement_feedback.html (100%) rename {client => src/frontend/flask_app}/templates/components/navbar.html (100%) rename {client => src/frontend/flask_app}/templates/components/next_measurement.html (100%) rename {client => src/frontend/flask_app}/templates/components/numpad.html (100%) rename {client => src/frontend/flask_app}/templates/errors/station_not_configured.html (100%) rename {server/uploads/images => src/frontend/flask_app/templates/maker}/.gitkeep (100%) rename {client => src/frontend/flask_app}/templates/maker/recipe_editor.html (100%) rename {client => src/frontend/flask_app}/templates/maker/recipe_list.html (100%) rename {client => src/frontend/flask_app}/templates/maker/recipe_preview.html (100%) rename {client => src/frontend/flask_app}/templates/maker/task_drawing.html (100%) rename {client => src/frontend/flask_app}/templates/maker/task_editor.html (100%) rename {client => src/frontend/flask_app}/templates/maker/version_history.html (100%) rename {server/uploads/logos => src/frontend/flask_app/templates/measure}/.gitkeep (100%) rename {client => src/frontend/flask_app}/templates/measure/select_recipe.html (100%) rename {client => src/frontend/flask_app}/templates/measure/task_complete.html (100%) rename {client => src/frontend/flask_app}/templates/measure/task_execute.html (100%) rename {client => src/frontend/flask_app}/templates/measure/task_list.html (100%) rename {client => src/frontend/flask_app}/templates/statistics/dashboard.html (100%) rename {server/uploads/pdfs => src/frontend/flask_app/tests}/.gitkeep (100%) rename server/uploads/reports/.gitkeep => src/frontend/flask_app/tests/__init__.py (100%) rename {client => src/frontend/flask_app}/tests/conftest.py (100%) rename {client => src/frontend/flask_app}/tests/test_admin_stations.py (100%) rename {client => src/frontend/flask_app}/tests/test_api_client_proxy.py (100%) rename {client => src/frontend/flask_app}/tests/test_api_client_stations.py (100%) rename {client => src/frontend/flask_app}/tests/test_auth.py (100%) rename {client => src/frontend/flask_app}/tests/test_config_station.py (100%) rename {client => src/frontend/flask_app}/tests/test_maker.py (100%) rename {client => src/frontend/flask_app}/tests/test_measure.py (100%) rename {client => src/frontend/flask_app}/tests/test_measure_station_filter.py (100%) rename {client => src/frontend/flask_app}/tests/test_statistics.py (100%) rename {client => src/frontend/flask_app}/translations/babel.cfg (100%) rename {client => src/frontend/flask_app}/translations/en/LC_MESSAGES/messages.po (100%) rename {client => src/frontend/flask_app}/translations/it/LC_MESSAGES/messages.po (100%) rename {client => src/frontend/flask_app}/translations/messages.pot (100%) rename {client => src/frontend/flask_app}/verify_i18n.py (100%) create mode 100644 uploads/images/.gitkeep create mode 100644 uploads/logos/.gitkeep create mode 100644 uploads/pdfs/.gitkeep create mode 100644 uploads/reports/.gitkeep create mode 100644 uv.lock diff --git a/.dockerignore b/.dockerignore index 9ea1680..775bf7c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,15 +1,47 @@ -__pycache__ -*.pyc -*.pyo -.pytest_cache +# Build context exclusions: keep image small and rebuilds fast. + +# VCS .git .gitignore -.env -*.md -node_modules +.gitattributes + +# Local envs and caches .venv venv -*.egg-info +.env +__pycache__/ +*.pyc +*.pyo +*.pyd +.pytest_cache/ .coverage -htmlcov -.mypy_cache +htmlcov/ +.mypy_cache/ +*.egg-info + +# IDE / editor +.vscode/ +.idea/ +*.swp +*~ + +# Node +node_modules/ + +# Local-only notes (Markdown docs are still copied if a Dockerfile asks) +PIANO_IMPLEMENTAZIONE.md +*.docx + +# Legacy Dockerfiles preserved in tree but not needed in builds +src/backend/Dockerfile.legacy +src/frontend/flask_app/Dockerfile.legacy + +# Uploads are a runtime volume, never baked in. +uploads/ + +# Claude Code +.claude/ +.omc/ + +# Competitor analysis (local only) +Concorrente/ diff --git a/.gitignore b/.gitignore index b9461f3..3896acd 100644 --- a/.gitignore +++ b/.gitignore @@ -33,18 +33,18 @@ env/ Thumbs.db desktop.ini -# Uploads (server-side files) -server/uploads/images/* -server/uploads/pdfs/* -server/uploads/logos/* -server/uploads/reports/* -!server/uploads/images/.gitkeep -!server/uploads/pdfs/.gitkeep -!server/uploads/logos/.gitkeep -!server/uploads/reports/.gitkeep +# Uploads (server-side files, now at project root) +uploads/images/* +uploads/pdfs/* +uploads/logos/* +uploads/reports/* +!uploads/images/.gitkeep +!uploads/pdfs/.gitkeep +!uploads/logos/.gitkeep +!uploads/reports/.gitkeep # TailwindCSS output -client/static/css/tailwind.css +src/frontend/flask_app/static/css/tailwind.css # Node node_modules/ @@ -63,7 +63,7 @@ node_modules/ htmlcov/ # Debug files -client/static/js/fabric-debug.js +src/frontend/flask_app/static/js/fabric-debug.js # Misc nul diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..2c07333 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/CLAUDE.md b/CLAUDE.md index 65964f8..1160707 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,10 +5,65 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Panoramica TieMeasureFlow by Tielogic - Sistema di gestione task per misurazioni con calibro manuale. -Monorepo con **server FastAPI** (backend API, porta 8000) e **client Flask** (frontend tablet, porta 5000), orchestrati con Docker Compose + Nginx reverse proxy + MySQL 8.0. +Monorepo con **backend FastAPI** (porta 8000) e **frontend Flask** (porta 5000), orchestrati con Docker Compose + Nginx reverse proxy + MySQL 8.0. + +## Layout del repository (V2.0.0) + +A partire dalla migrazione V2.0.0 (struttura conforme alla spec `python-project-spec-design.md`): + +``` +TieMeasureFlow/ +├── pyproject.toml # Dipendenze monorepo (uv) +├── uv.lock # Lock file riproducibile +├── .python-version # 3.11 +├── Dockerfile # Backend (uv + uvicorn) +├── Dockerfile.frontend # Frontend (uv + gunicorn + Tailwind + Babel) +├── docker-compose.dev.yml # Dev (Nginx) +├── docker-compose.yml # Prod (Traefik + SSL) +├── nginx/ +├── uploads/ # Volume montato in /app/uploads +├── docs/ +└── src/ + ├── backend/ + │ ├── main.py # Entry FastAPI + │ ├── config.py + │ ├── database.py + │ ├── api/ + │ │ ├── routers/ # 11 router REST + │ │ └── middleware/ # api_key, rate_limit, security_headers, logging + │ ├── models/ + │ │ ├── orm/ # SQLAlchemy + │ │ └── api/ # Pydantic schemas + │ ├── services/ # Logica business + │ ├── migrations/ # Alembic + │ ├── templates/ # Setup page + │ └── tests/ # pytest + └── frontend/ + └── flask_app/ # Flask + Jinja2 + Alpine.js (deroga vs spec React, + ├── app.py # giustificata: tablet UX server-side, USB calipers, + ├── config.py # workflow operatore con Fabric.js) + ├── blueprints/ + ├── services/ + ├── templates/ + ├── static/ + ├── translations/ + └── tests/ +``` + +Dipendenze gestite con **uv** (no `requirements.txt`): +- `[project] dependencies` = core condivisi (pydantic, dotenv) +- `[project.optional-dependencies] server` = backend FastAPI +- `[project.optional-dependencies] client` = frontend Flask +- `[project.optional-dependencies] dev` = pytest, httpx, aiosqlite ## Comandi di Sviluppo +### Setup iniziale +```bash +cp .env.example .env +uv sync --extra server --extra client --extra dev # installa tutto +``` + ### Avvio servizi (Docker) ```bash docker compose -f docker-compose.dev.yml up -d # Sviluppo (Nginx, porta 80) @@ -20,51 +75,63 @@ docker compose ps # Stato servizi ### Avvio manuale (senza Docker) ```bash -# Server (terminale 1) -cd server && uvicorn main:app --reload --host 0.0.0.0 --port 8000 +# Backend (terminale 1) +uv run uvicorn src.backend.main:app --reload --host 0.0.0.0 --port 8000 -# Client (terminale 2) -cd client && flask run --host 0.0.0.0 --port 5000 +# Frontend (terminale 2) — gunicorn richiede cwd interna per app:create_app() +cd src/frontend/flask_app && uv run --project ../../.. gunicorn --bind 0.0.0.0:5000 app:create_app() # TailwindCSS watch (terminale 3) -cd client && npx tailwindcss -i static/css/input.css -o static/css/tailwind.css --watch +cd src/frontend/flask_app && npx tailwindcss -i static/css/input.css -o static/css/tailwind.css --watch ``` ### Database & Migrations ```bash -# alembic.ini è in server/migrations/, serve il flag -c -cd server && alembic -c migrations/alembic.ini upgrade head # Applica migrazioni -cd server && alembic -c migrations/alembic.ini revision --autogenerate -m "descrizione" # Genera migrazione -cd server && alembic -c migrations/alembic.ini downgrade -1 # Rollback ultima -docker compose exec server alembic -c migrations/alembic.ini upgrade head # Via Docker +# alembic.ini in src/backend/migrations/, serve il flag -c +uv run alembic -c src/backend/migrations/alembic.ini upgrade head # Applica migrazioni +uv run alembic -c src/backend/migrations/alembic.ini revision --autogenerate -m "descrizione" # Genera +uv run alembic -c src/backend/migrations/alembic.ini downgrade -1 # Rollback +docker compose exec server uv run alembic -c src/backend/migrations/alembic.ini upgrade head # Via Docker ``` -Nota: `env.py` sovrascrive la URL di alembic.ini con quella da `.env` (`settings.database_url`). `script_location = %(here)s` usa path relativo. +Nota: `env.py` aggiunge la project root a `sys.path`, sovrascrive la URL di alembic.ini con quella da `.env` (`settings.database_url`). `script_location = %(here)s` usa path relativo. ### Test ```bash -# Server (usa SQLite in-memory via aiosqlite, no MySQL richiesto) -cd server && pytest # Tutti i test -cd server && pytest tests/test_auth.py # Singolo modulo -cd server && pytest tests/test_auth.py::test_login_success # Singolo test -cd server && pytest --cov # Con copertura +# Tutti i test (backend + frontend) +uv run pytest -# Client -cd client && pytest -cd client && pytest tests/test_auth.py +# Solo backend (SQLite in-memory via aiosqlite, no MySQL richiesto) +uv run pytest src/backend/tests/ +uv run pytest src/backend/tests/test_auth.py +uv run pytest src/backend/tests/test_auth.py::test_login_success +uv run pytest --cov src/backend + +# Solo frontend +uv run pytest src/frontend/flask_app/tests/ +``` + +### Gestione dipendenze (uv) +```bash +uv add # core (entrambi) +uv add --optional server # solo backend +uv add --optional client # solo frontend +uv add --optional dev # solo dev/test +uv sync --extra server --extra client --extra dev # reinstalla +uv lock # rigenera uv.lock ``` ### i18n (Traduzioni) ```bash # Estrai stringhe -cd client && pybabel extract -F babel.cfg -k _ -o translations/messages.pot . +cd src/frontend/flask_app && uv run pybabel extract -F babel.cfg -k _ -o translations/messages.pot . # Aggiorna catalogo -cd client && pybabel update -i translations/messages.pot -d translations +cd src/frontend/flask_app && uv run pybabel update -i translations/messages.pot -d translations # Compila .po → .mo -cd client && pybabel compile -d translations +cd src/frontend/flask_app && uv run pybabel compile -d translations # oppure -cd client && python compile_translations.py +cd src/frontend/flask_app && uv run python compile_translations.py ``` ### Setup iniziale @@ -78,7 +145,7 @@ Browser/Tablet → Nginx (:80/443) → Flask Client (:5000) → APIClient → Fa ``` Il client Flask è un frontend server-side che comunica col backend via REST API. Ogni richiesta dal client al server include l'header `X-API-Key` per autenticazione. -### Server (FastAPI) — `server/` +### Server (FastAPI) — `src/backend/` - **main.py**: entry point, lifespan async (`@asynccontextmanager`), registra middleware e 10 router. Health: `GET /api/health` - **config.py**: `Settings` (pydantic_settings.BaseSettings), legge da `../.env`. Rate limits: login 5/min, general 100/min - **database.py**: SQLAlchemy 2.0 async engine con `AsyncSession`, pool 10+20 overflow, `pool_recycle=3600`, `expire_on_commit=False` @@ -87,10 +154,10 @@ Il client Flask è un frontend server-side che comunica col backend via REST API - **middleware/**: Stack order (outermost→innermost): AccessLogMiddleware → CORSMiddleware → SecurityHeadersMiddleware → RateLimitMiddleware. Nota: `add_middleware()` in Starlette wrappa l'app, quindi l'ultimo aggiunto (AccessLog) è il più esterno. Il commento in `main.py` dice "outermost" per RateLimit ma è fuorviante. api_key.py (auth dependency `get_current_user()`), rate_limit.py (sliding window 60s per-IP, in-memory dicts), security_headers.py (CSP con `unsafe-eval` per Plotly.js, HSTS solo con SSL), logging.py (audit trail async su DB, esclude /api/health, /docs, /openapi.json, /redoc) - **models/**: User (include `email`, `language_pref`, `theme_pref`), Recipe (`image_path` per preview), RecipeVersion, RecipeTask, RecipeSubtask (`image_path` per immagine specifica), Measurement (`synced_to_csv`, `input_method`), AccessLog, SystemSetting, RecipeVersionAudit - **schemas/**: Pydantic v2 per validazione I/O API -- **migrations/**: Alembic con `alembic.ini` e `env.py` nella directory `server/migrations/` +- **migrations/**: Alembic con `alembic.ini` e `env.py` nella directory `src/backend/migrations/` - **tests/**: pytest + pytest-asyncio, SQLite in-memory (`sqlite+aiosqlite://`, StaticPool), WeasyPrint mockato via `sys.modules`, rate limit reset tra test -### Client (Flask) — `client/` +### Client (Flask) — `src/frontend/flask_app/` - **app.py**: factory pattern `create_app()`, CSRF (`WTF_CSRF_TIME_LIMIT=3600`), Babel i18n (`default_locale="it"`) - **blueprints/**: auth (login/logout/session), maker (editor ricette con Fabric.js), measure (esecuzione misurazioni), statistics (dashboard SPC con Plotly.js), admin (gestione utenti CRUD, cambio password, toggle attivo — solo `is_admin`) - **services/api_client.py**: singleton `APIClient` — wrapper HTTP (get/post/put/delete) con gestione errori normalizzata, timeout 30s, header X-API-Key da session @@ -99,7 +166,7 @@ Il client Flask è un frontend server-side che comunica col backend via REST API - **translations/**: Flask-Babel, cataloghi .po/.mo per IT/EN. Locale selector: `session["language"]` → Accept-Language → `"it"` - **config.py**: `PERMANENT_SESSION_LIFETIME=28800` (8h), cookie secure in produzione, `BABEL_DEFAULT_TIMEZONE="Europe/Rome"` -## Template Structure (`client/templates/base.html`) +## Template Structure (`src/frontend/flask_app/templates/base.html`) Ordine blocchi in `base.html`: ``` @@ -127,7 +194,7 @@ In alternativa, usare il filtro custom `|tojson_attr` (registrato in `app.py`) c Per selettori CSS in `x-data`: usare `meta[name=csrf-token]` senza virgolette interne. -## Fabric.js Annotation Editor (`client/static/js/annotation-editor.js`) +## Fabric.js Annotation Editor (`src/frontend/flask_app/static/js/annotation-editor.js`) Editor annotazioni su disegni tecnici (Fabric.js 5.3.1, ~1200 righe). Pattern critici: @@ -152,16 +219,16 @@ Le ricette usano un versioning condizionale. L'endpoint `PUT /api/recipes/{id}` La stessa logica si applica nel task router: aggiungere un task a una ricetta con measurements crea una nuova versione. -La versione corrente ha `is_current=True`, le precedenti `False`. Audit trail in `recipe_version_audit` (CREATE, UPDATE, ACTIVATE, RETIRE). Logica in `server/services/recipe_service.py`. +La versione corrente ha `is_current=True`, le precedenti `False`. Audit trail in `recipe_version_audit` (CREATE, UPDATE, ACTIVATE, RETIRE). Logica in `src/backend/services/recipe_service.py`. ### Calcolo Pass/Fail -Ogni subtask ha 4 limiti di tolleranza: UTL (upper tolerance), UWL (upper warning), LWL (lower warning), LTL (lower tolerance) più un valore nominale. Il calcolo in `server/services/measurement_service.py`: +Ogni subtask ha 4 limiti di tolleranza: UTL (upper tolerance), UWL (upper warning), LWL (lower warning), LTL (lower tolerance) più un valore nominale. Il calcolo in `src/backend/services/measurement_service.py`: - Fuori UTL/LTL → **fail** - Fuori UWL/LWL ma dentro UTL/LTL → **warning** - Dentro UWL/LWL → **pass** ### SPC (Statistical Process Control) -Calcoli in `server/services/spc_service.py` usando solo `math` e `statistics` stdlib (no numpy/scipy): summary (conteggi pass/warning/fail), capability (Cp, Cpk, Pp, Ppk), control chart (UCL/LCL = mean ± 3σ), histogram (20 bin + curva normale). +Calcoli in `src/backend/services/spc_service.py` usando solo `math` e `statistics` stdlib (no numpy/scipy): summary (conteggi pass/warning/fail), capability (Cp, Cpk, Pp, Ppk), control chart (UCL/LCL = mean ± 3σ), histogram (20 bin + curva normale). ### Autenticazione 1. Login con username/password → server ritorna `api_key` (64 char random) @@ -187,7 +254,7 @@ Upload in `uploads/{recipe_id}/{version_id}/`. Tipi ammessi: JPEG, PNG, GIF, Web ## Test Infrastructure -### Server (`server/tests/conftest.py`) +### Server (`src/backend/tests/conftest.py`) - SQLite in-memory `sqlite+aiosqlite://` con `StaticPool` (singola connessione condivisa tra fixture, app e test) - WeasyPrint mockato prima di qualsiasi import server: `sys.modules["weasyprint"] = MagicMock()` - Rate limit buckets resettati tra test (walk middleware stack → clear dicts) @@ -196,7 +263,7 @@ Upload in `uploads/{recipe_id}/{version_id}/`. Tipi ammessi: JPEG, PNG, GIF, Web - Helper: `auth_headers(user)` → `{"X-API-Key": user.api_key}` - Client httpx: `AsyncClient` con `ASGITransport(app=app)`, override di `get_db` dependency -### Client (`client/tests/conftest.py`) +### Client (`src/frontend/flask_app/tests/conftest.py`) - `api_client` patchato in 4 blueprint (auth, maker, measure, statistics). **admin NON è patchato** — i test admin devono gestire il mock manualmente - `logged_in_client` fixture pre-popola session con `api_key`, `user_id`, `language`, `theme` + user dict - CSRF disabilitato nei test: `WTF_CSRF_ENABLED=False` @@ -232,7 +299,7 @@ Variabili d'ambiente in `.env` (copiare da `.env.example`): - DB: `DB_HOST`, `DB_PORT`, `DB_NAME`, `DB_USER`, `DB_PASSWORD`, `DB_ROOT_PASSWORD` (Docker) - Server: `SERVER_HOST`, `SERVER_PORT`, `SERVER_SECRET_KEY`, `SERVER_CORS_ORIGINS` - Client: `CLIENT_HOST`, `CLIENT_PORT`, `CLIENT_SECRET_KEY`, `API_SERVER_URL` -- Upload: `UPLOAD_DIR` (default `"uploads"`, relativo a `server/`), `MAX_UPLOAD_SIZE_MB` +- Upload: `UPLOAD_DIR` (default `"uploads"`, relativo a `src/backend/`), `MAX_UPLOAD_SIZE_MB` - Docker: `NGINX_PORT`, `NGINX_SSL_PORT` - Setup: `SETUP_PASSWORD` (vuota = endpoint disabilitato) - SSL: `SSL_CERTFILE`, `SSL_KEYFILE` diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..08d810a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.11-slim AS base + +# Install uv (fast Python package manager) from official slim image. +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/ + +# System libs required by WeasyPrint at runtime. +RUN apt-get update && apt-get install -y --no-install-recommends \ + libpango-1.0-0 \ + libpangocairo-1.0-0 \ + libcairo2 \ + libgdk-pixbuf-2.0-0 \ + libffi-dev \ + shared-mime-info \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Copy lockfile + project metadata first to maximize Docker layer cache. +COPY pyproject.toml uv.lock ./ +COPY .python-version ./ + +# Install ONLY backend deps from the locked dependencies. --frozen ensures +# we never resolve at build time; --no-dev keeps the image lean. +RUN uv sync --frozen --no-dev --extra server + +# Now copy the actual sources. +COPY src/ ./src/ + +# Uploads directory (mounted as a volume in production). +RUN mkdir -p /app/uploads/images /app/uploads/pdfs /app/uploads/logos /app/uploads/reports + +EXPOSE 8000 + +# Entry point: run Alembic migrations then start Uvicorn through uv so +# it uses the pinned interpreter and venv from `uv sync`. +CMD ["sh", "-c", \ + "uv run alembic -c src/backend/migrations/alembic.ini upgrade head && \ + uv run uvicorn src.backend.main:app \ + --host 0.0.0.0 --port 8000 --workers 4 \ + --proxy-headers --forwarded-allow-ips='*'"] diff --git a/Dockerfile.frontend b/Dockerfile.frontend new file mode 100644 index 0000000..f9e769d --- /dev/null +++ b/Dockerfile.frontend @@ -0,0 +1,42 @@ +FROM python:3.11-slim AS base + +# uv from the official slim image (fast Python package manager). +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/ + +# Node.js 20 is needed at build time to compile TailwindCSS. +RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates \ + && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \ + && apt-get install -y --no-install-recommends nodejs \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Resolve Python deps from the project lockfile (only the `client` extra). +COPY pyproject.toml uv.lock ./ +COPY .python-version ./ +RUN uv sync --frozen --no-dev --extra client + +# Copy the Flask app sources. +COPY src/frontend/flask_app/ ./flask_app/ + +# Build TailwindCSS (one-shot; no watcher in production image). +WORKDIR /app/flask_app +RUN npm install tailwindcss@3 && \ + npx tailwindcss -i static/css/input.css -o static/css/tailwind.css --minify + +# Compile Flask-Babel translation catalogs. +RUN uv run --project /app pybabel compile -d translations + +EXPOSE 5000 + +# Gunicorn behind Nginx/Traefik. Worker count and proxy trust kept in sync +# with the per-tablet rate-limiting fix (see V2.0.0 perf commit). +CMD ["uv", "run", "--project", "/app", "gunicorn", \ + "--workers", "5", \ + "--threads", "4", \ + "--worker-class", "gthread", \ + "--timeout", "60", \ + "--bind", "0.0.0.0:5000", \ + "--access-logfile", "-", \ + "--forwarded-allow-ips", "*", \ + "app:create_app()"] diff --git a/Schema sviluppo SW TieFlow_rev04-2026.docx b/Schema sviluppo SW TieFlow_rev04-2026.docx new file mode 100644 index 0000000000000000000000000000000000000000..6da8511be75b334123e526386effad5041d109c2 GIT binary patch literal 104213 zcmeFY1#=`jvn|?YW@a8UGc(iJV;D0tGuvZkW*+mHnb~7zW@c_P!}H$XJvYvacYeT& zxHr42TBVTGQr5~+YNhJCEEqUC01^NV002k;$nS2JF(3ed9uxq827m_D61B5+HnDZq zQ}M7janfOMx3MP92M4A44FLTr|9|EGU=1`Rk6Hd@LKc4v{s^3DT9#>}D(WA}k2S$F ze*uYLZxXMBn%%#DBp3>(CJC2Cvx8q8?|hU3n>DXnRBZq!N@AzR`v!*TKT@GmEVZ(9 zPVZ~1BxF$dr@}wUhPYA{q3jSCv3R9;FW{5XdTNdrbRsGo;PWu$Tm^kfNZJ^Wk? zy$1*t2$iD|sLwRG8W=6f7#ArXJad+jf`@7bi^4ki}`(H<}F7cvbju~%xVPY==rmvV_I-dAmzcmu;!UU*so03zIzzltxI z?~y_f#<-wY!IQ}*OoCSApdrzmc_lAN&u|X*!(=uz1vHGWyHCL26Oz+!KIZD*vE1hs zyd-f9_U2uwx&4cW+T<<@oi6@_;GeNJKp;?)U@nBfUFC>!<6FZ0z-!=(MI3Rg@$JPe z*Tm@po<8Tf@wg)b|G`!ZuaM-yu&MuvaR|JQu~54PF=HuQ>w-Y@fo z7Xk*p2hMaVt@dIUC@>mLuVJr1L2F6Np{*@jE`7Z7EiZ%WoES)s&CVrGdpc!FxNIls zT;ZmuB1Ck;EI#Z0)q3r42P6k~6fwIm+V8?=9zK}9kCI7Kj|N6+U_?yeLdHLZrA_pp z9ngq99F)LWkWx?08AL_wxqtN!?k8&q{xaltboP6>X4gCRfVlwxC|^o(vvV|NG`2HxvH6n`!Wz!K&JO1x|Rmi1)Efa#GF zC0Q`82QJIlt{LJh!^$&N?cIhy^UQY_IKwJ$M&`fA?V4OTk5mUgSl{7(VS+`$_4${{ zynfy*WD@#2?lTM#=vNx1(^rp;?2i#5EtsR{X-l~8t3=qpUiD^(5k2v-tulKJwgz-k`uX~oVRes7h zA+ZcqlUDMVCYYl)>GX_YacBw-7DS77Z+`X=?> zO2A!~_i!d~z^LYM;g;=b7de6<%Jm^^r5m9~nV zldbcDkAyRA#UEI46(xIUaJm?R>TbU|bzh;z?aTV{`9xTp@=Gw0>Fa^wOD!XA>k%8j z>8JKWxe}d}bfihTGi#xshhw2JffAjZllgwT62hg_J(c$lKPtQvzMqv1f zxD$J4qrv@YxQkB{=XG2_RUV?!JjJK3Zh{{M7(LomFafY&uU~86*ucWs_ZYW6a!7F( zI2TWV)QGDJj2yYxn9w@f>3y0yneYl-R|FDexk2{&ddy^!5EnUL7IJmJ8G*jnlZWNM z;>)F=!sNOfCWbPZPnfe3BT|}YZI>}}uDAD$shw<+2u|T{gb5&tw4+UpcEMQ9Z$m0M zdTiEdt`o~v9Ya^mZ9|S>uxq^VtzV@dfBwwcggB$^yN{2lkgfWi%NpWLmyXZdV>N9d zV-$B;sV>Cnl+VD{tV{oSh88p+m)Wjc5^8$uRAl6})viuO_^>=JWl< z=9D6G+U-Xgt!*%;Z`npGq!V-b`W9M8NuODGY2(#yNe>|J0u1swp!#)4&}|-<3NKDt z?W9V>16u|4h5K0W7o_^0F)Muw51wX67lMyAt1pO(w;Q_31fIG-Z(IGJAu73brU-k+ ztBk@u{b%eRQh!xd@SSK@Z1P7ecka+)Hz5+}@`qo&8v%WGIB2PxPk;Gzb}6xU_Q8xs zV<~=k4)1ls3#_^-&eHkeO;hy3rQwhJ&%`!&O^&Xp$d8_&qv@w!#Wwyy(R%k1J_(jH zLbW41ePP4?NnO^TZr(tY@Ek$=herlTkf$wh68B6D51~+}G_cU)gjr2hT#s=D9aK-z zyIPhc@~7E$anM@809N_CSZd-KEKBQ@poDM{xt)RXuL^DiQuqL@+i3N%d>ib_f-(~l z+v^qQ#TL#omu1T>$qYuwvrU2l)vA3Vw+3-r+iczfn^*Yb(3rub^-b=jIk&mT!HuN1 zy5oJOppbu`lZoHonn#a-6p(|RE!YPzVxOgyoTtm7L;#hn68 z3z1Y#Gtco-=Vjt)DuX(|heXw2t=umGq0vVww33>O+y8y`mk*moE|E;u5W7cXM)2b; z6)MIo#j^!$4J6xFQkQK6>x$puRVPwari)+s>Ab z6B5`mmM?uAEs_SJpGZEetB{bCN(0y8jCOdNvs`?B*UP+A5 zN!3BVbA$4bru%T8%%*@buvvSnpZ;68Nv1aj&ik`Wo$V@%oVwF{#JV|Qt5=ttY3Nr) zCmZ-l($NmjxZg7nBxp#w82+Pift*i?Q}u_^_2ndKJ9^CDNK&4LErK2SR2X@u1PHmP z-*~uu0}Xa&aylr%AKBE;zJLc0)n@A-mZ9zx*`WmHA?}%6AIbWHkT#l9_BXc?0jMBq zdLcMh&|&lH$LE0-(FzFHf$00UR6j$7E^|eu8!e{yfAeE6BB-O{H*i~GV}h?Zs1)IF ztj8LNs?eRa4_(bhs_O=cA>Mu5!cGsfS@;8G;|Nf;(L4T9aHUMczbVEI64&i2%D=Zs z2BtR|fYEcJRF<_J4#%v_>m$(C#2hEIcKr|r9Tf6E;nRlPelHlPlh~*gzeNtOu=rMe zLS=r2x)Kl1gqjiJY9ZuGTqlR`9U8WN-NA#Y-4J!tpdM^VN|_SiiJI?0h?++5$3>9b zJj;Z;Ms#lfY!hYWJAoFHChzP?68rUss+;jpqJX1hn*+&60R8CrPWg^VovP}0?Wk!a z1E-nqbS|Q!TZwpF(NdVE`ePpCusJzGX%F%GaA3T)iUQZeT1J+4c*O}cmdUXkD^L6; z#z=exx2DsMYQDrpiFmfz>o_&A$KY%%aE#cjJLu83GTRe1Ke9^DgEz|Y=XRfCe8vXP zIMRDaFYk%)sIGd4?@>O%FSY>DIvrv}E<-5iIEnpuP=Vs=!n%Pv{x8gck`($KzHway zWcm*3F+RpTUp{h8xgR?k%so|$)_l*a`QjL(3_}r^GjZg?HJZh^zlYfH>rKku2?zMl zS<}1x>@T(d)(LgggdP5!$QHfyBY&KGw6m+S8xAzk95u=eV?mttuG715wh?H(G z)|bup7_9DQW)x}dAjaviZSH#wD3;1Uv90Y@8^6u3r#QrA$oTmJ+M-_?{8 z*^QF-8|qb}XJq6j5SSz$c&xyzU}rH736Z-0@S*4VhT-dV!w+J#UR3+%mKYyBeA+ki7bd0oi^e z1e&C;S-~lDw2E)0n$f`tu4dV239)o{!me{*ZT*|QMs7Ijn||~38*Em&dvd6J@EWMu zRh>qP@&zk&)tM~h?c~@FE^3ini03(ezY4LJ;oa|Lc z?;pThs=P+X;@=(*jEM&<5&)nlowMKaJH%!ULLP;k*is#rq&3Wb=Z!?XyN1nTm$%i; zx0|{*hA^{V4J(z8=xG+)@BILx6tP|srTvVw1OnoSha#;EiJRJ4lM;}O``5x)lE|1^ zd03)WfIV(ZG7BTu(^;SH)Y?e00=V;3Povn{xqK4Au%mQ9rE1>07xCt-6%4kMkq8pD zPbcEcLU>atg}vLMZc`$9nW&oh=HXb+r|~?2J1}z`qg6N*HUy@poYZ|2;terY+S2Y~ zAoshBQAD^gZSDebHUBq7-)CAhA$K-NFc%AL@;p-mfG#$j8G$MG1^{ORkKAHhP$(~! z77`uYw+DRy*?}CciI(=~_Dy+sY}jac@$XTq1X8A&>b1}G5X1J#B(u!m)>UZYnv*R{u@s} z%n$hmbh%ocy#l9vle7uk-1i`pumEyzhHtcF5oTzMe%4~@B*l^F_CzcgqVxNG<;%@v z_Tg!KKk2vA>b_}q{(f@(>>50Z9-up$+-br&%_D25xUi)`qtIZJE5L|NK? z??P8?;-t>iLr6v-j=l|RP$&q5F(YOAJj2eQqs7%tvIkef(gB$|B5VK|?U#evNh~SpO zFcB!D#^wwgFXhigcY*VZZ*tmsCPniUKd8F$rz4t2!pMnQ3EY<`lT#V8YwI@K*HthXYMgF z5h1_P4NcSt*&t&_7zVfR;rE|D5@wK1xW9En#UT_on<8VvejxN<5|`7J5E`mF@G!1| zhLUzo-X?%rs#{T{bj7^AYST1T^pl$yY$NOR;E2m0={ zcn&S6ysZzl)J7DifRXN!qF=?ZB8DL438i&_lMTF~Cc? z5_JFOkzTdYg-W~4Qlxe?GGjhF__7Q1r5cOteKW#!c5I&<$d9TczKXW^kzMDR zYj}<}ack`-yn!8=o1gAxQAp&Yiicf&w@|MhO@@fb^@t>#_r&Oo< z%C>$RC|=!^KoY;Z^!M^EEYYm(AVg{*Ez2phVj2-Q%XHNfcL)2fVa zP3hUSVkJ3qYEDv`bv@fU^v5!Yo6ml6%OCbATgo+?uyKF_2&}M;r5Bfo(PJpOb^|-R zF}r~pb0JGsb|2JuoSScdNp+zHviBTS~OVF@Wu-FmVVL$ z4X!>D!nqz4epFP@>z&1ie2~JkIQx`0+f?L9Dxscu!Az)I$gOCchxKj3=P8cZlTU1G z;u!W~a%+_@xG>YGpv#^XPYot+@%daTIS$wwCV|22Un4iG&qu2{7O~t*hb)Y0_zC-; zhNWo!Y%Q6xV0|hz7JNRaZuvdId?(y^oo{2Gv5Cm(7+}2Iv?-Ig+L7T#yvntv zR%p)msCDISNjT{UV%V}a@K!?KvzxA@I$_VL;!k&%$Lq`CP^gG`9k^SYu^lVI^2}L` z^$SJL?(=~iU0-rA`E3HZSd9N9@uVw~Hpb8&12(}hv!v=5aadhpMm7d;sIbI6PKwelz$;m`vF#6eVk1fc}fAM zq~B{pB|s97XGW1Ed^P%S(oJ2%NAU*{{NJvB<3}mXQSy<5Ze1btSRZN#f2>)6t!;b9 z%W{MQSsorTZukh0&B8*vLastAEy{|^(?TmVp{lBALCY&wZy*`34lmmaA0go&Qr)5% zpKbrz<#1Zo&Zc5b$?}vd)b4IF1mZ`~LrksKPq( z*ubDO=rh(<&qHeIM%Otc-tl1M%kuZjI=jcG&7#_T&=(wKbq)DyG+%;WJhr`X_776) z8S!V`9y)MS;!l59N^u|1!1z31|FwzV^RD8z5hi$*HkM zv@hu?I(>T)BJ3lCnN>Sq)gUQw4%(*Fv-?2!pWqkX5Dwe-6-2v&0{~F}D^Or+XXk8d z=WOEiPo$tBWi2L?2{{BvdryG;r~yVonPglfKWhmrvwa2V8i8th$JvP7JT!8OK<8=6RB+R$zlb}hsHN9>xV-|-6!|(&ox4OF~7MmzA3Q6Q}26$gXir!m3 zUraKgP>dp2f{Ti9R3Nz}d3n_$pa4?nMxX~^(sB9;;-?_Ypg++mpaZkQk=%km7WIH_+m@Ar=IK9;W8B#%#kVF1+r{@3(9?={%#g-oXbuBzR6|(knsHeq8>X4R`R!a zVa^87Ri;w5stzBnbK+}EMV3}ZYALj>G8C_bL)lS^XiOuIG|0YxqXb|euiP4IIl^&(A8y$6y`_=}wl-zkf7Eaq8B~vN@YDHIuWJke#_U z2d$QTwLwZQNO?#RqOI;25OBn50@_uq8LyxxYxZ09{FlYOFh^{DWOeXHR&E(uQ8Ain z3U&BHmlIsWjnGERH<|IgUlA}`nQ{UX>$~Dr{O>(c{8oG3jlMTXP(B-MYVXmigKcHL zgQ|Mce{*@)91!t(JrM3DiiEAQ%aX$t5C+(WN^ z@7PAIo#9#{dbKCOBqla#f}zQAt;tg$32TE`Bm)&TNB{<;FBUsNR0dgj85pdjzmRGu z8=hoaUCT3<@-)Rp44Hg;;Q*KN5m)Uc2v&k4wp@_ma*tl4D13RdhysAFc0{+HkCjs2 z^AjT%WV7SnRi@ z;s;e9LpRqgXl15Rc^vjab3_Mp?UHosGB7;Zz}|+Cb3xdioP&EWsFO#zM!)2y2@gC? zeWK@u&Dyt$FT?}ym*peP`Ck5m_&~IE1wI-!tloRCFT^7|1Dr&>{y}`cA@Qtf^MNt{ z7vi(r1{~`+YJ8_~pLE9|h#4SB0xT;33RJv8$PRr|2;Dj57g@x@%QD;`pGZ%;qXTDW z?jX)V`pF>mV~Q>j5pJ~tBxiYmaCGAc^}Zc7*xF*{$b8CXL|}Pr4)6u}RBl&k z3Kd6*{38M^*zUvM(6dYa@Xn(IHT3w#uT<@KKUXiFOL?Sic^!6^6OOCaWPdw_jZ1@m z{}GPCA=0W}cfxi(_DIeZ5>Ma-S%CGVWrx>iGN-wNW>sRYCVa0t0`VdB=Ys5p;T$InE!oGKw~pKT2~pQrv-+xZrnlD&BF*>+SAdRG;DWw zhb8=YbgY7X)wi(GtN#2S@$PP&p-}R*`ALTc06_k)C%n0dfw74r^S_Z`4I8Jm7LT0y743Shd)!3`8^LZx(P_IdiJc=4jrBeb3#dRk=YGV*rO3j(Ls)bWR z(QC$MJvYnjaS0n!Mb@M;4ZxPgyp7uF77~agoX;T_#lqMn(NJ8MDkw&J0y*Jw3p3~s zcn|^=5wi#f`1R4xv&P8)|?9`SyG^iqn+M%DZMfocRuYgKnN(#5=(nI;i z`M{OSl^OfuYuk{)d02=aHE0vzMsrzVLtBdZ!71_nq}g@h6P0t#n&q+T8L}P=8F)WK zJk_Gc9Dt1OM!YaYt5Z+oB=9#ud~-#n(W4x{$ihS(sc-Rf$c2+Gp_T$4O6`Fm9|e8F z!p9MeFh(jPdLKfrM-Mj^W+HFe6#7t?|8d)z64Fvh_@n2Pk(z5nYXtZMQGm_FLPjek z{gyUL6g)r-Eh82}N(3u;`tN6y)gg8tN1|0R$vISl$^xo5KXqsly1^(TWHp`nI6Oh5 z%COB<(nQ%DS4n=Em@6(Lm4WYW9Ur4d-)3jX^Bnc~V$NvENfC0c72O&URTECCi3?dz z8Y0IJOU=w)slrJ3EsT5jjlAOh-3?@2%(F$x4Mz@^3IaH9YT+Bgu3y4QaNK!I3z-`y z528yx#cLN350I^p735KUXOyiV%;%HK*P%vngV(PR$#9lAKvnKal}H! z*EjMmacgmO3Ku?x*t4hb%gYnEupXN$D_^^~OW{Fl4uWJbPVbn7pd9sJo;oGRZ zXP}~g-M|RY1rncgG4c9>uLiCa7I;G(j+@d|4SIg_^oabes|ikb=ITvcygZ+X1`c97GA%>Zj*RP`2&R7zaQ7>lDkX_LnESW>?4IX^lRZiov+a z(qY?Tz4WisvLkcE2vGCAb6U4KilUzrIP#;KN9|N)tz-ji2LnMR)K$OO;(b!&aikz} z&Z)8k3UpJF^BUAX4?@7!E?fWB|1pv@>mrDng5($Ef;)HEUh_Q`Q@FF+hkVpaI#y*P z!06y`n4|MK>omt(nw`5i(JWTzW<5TF!7~%~X`BV= ztN)phjzx4e*c#ILFd=+QH)7QSJ?2A}lH2@M3{#?B2ic`N#L7V4-J~{*Bk4_95KKc9 zcQ=?~aHT2!&4L@)u!;Q)H|kVOze(d#l?5mQ4`>Z8Lhd zQb@f@fUPY5#@zeB^Vk34)8Ga;x$j12li2OaZ}@5(3!VoB>K{#cXHc?qjSu?S^R#pk z$x%zNiIHhi6k0W@|kOp{_FZvGJ7g6tUvX z%Efo#N|FBKy`6@HmcwSZG!6QVDW^@da&^eP3^9$%_fOkzn!SB#7Z79Y!Z(5H;FU^U zK`l4?bz8UT=#X~*mJ$9pJ;Z*kl#iwX3o~q29{*55zjO2wsF`6xh50FS-T{jtqzhta z7w+=83r}H1n`3*IHZ(2*)oit(oNnsxMk9{RLX~>&e&~O?fuQV`7VY^_GQ3rV@GuVW zNBPSBiAQah&w`o;0*z(s4Ke3E?07*sPB);O@cd*8(!u+78We-Em#p1AKna5-qV^3X zdy!ycL0C@2Ru_96I3C6Q%>UV``8A1M^Y-P;JbyXzc>m?p{D(F9Z?4V1q)A7@gbWxn z@-JWj5ZUo7I3!-^+)Su)+#5L$g`KdnF>Q?ct#qxc6Qs1^yYP3ftZqAjGz~hp&2YDU zV=#6{ChyhJK=nP_~+7^k8H z!fDYm5iy!%hMG`qkxNzZPJhCMhAJRB5v#FRA3E)vlx})D`k7CEZjI=YMs%#O9lx?b zy$C{Z|Kx13kiXZs-m(KeEyG*|NT~k}Q+>wnb_@OqR-#e95QvX>S|;VbsS? zYH?yWTVvPy?J#O|@YH@o#Jt~;y%$dCO0RG>pY`h(Mf6`QAJ{MT{39d)OdM+w@E8E# zpW|z9;D0s++L#zy7%*Dc7?_zbGuYdjg@0F&M1aNprxt>=l$i3@9>O930AvCBOVfam zkJ0C^9}p*HNfAKRB>u_Q1-O~8yf6Sz8w>Yl@Wo*PVCjFj_g$Mw-o2Tw` zye8W|KJC=JmOQucyc#!h68D`Gy0V?lNy0Y;2)v*#;+JjMz)8i?YxAj%MjM1=?aje) zz%khLkr5Dy5vdHIMFCJ^=rDm%d1b%`t2 zUvA1vT!WRqI{GC+3%@U@n1*vk9ptj({dHavJ&gxPo zZt3)KwN@F%WUI=i-@ZB$MVZIR%eKy1xIA=?7l$E;W6`#<)&0e@5cf4i7{$46pHo8- zSbO`7gCn0cvaOfZG`d?G)hub0E3x1JfB<3gE(4iN2jD4IrAnTw>d;if&lqT>$y8+G zYGwbMRiWuo>lCP|=|#Ty?{i_ti|@~*(;4AlB0l+X^3chzsI4K&R4}~0;&Zd{Y)*<7X);- zAxDX^0NY5SEcYr)=WSz~8_wxj)CmRfZYt z3prta?|ALzOuV_M2gYREu<_toX&J-$`MT~*O&wyodE7mWOj~$4yLt$bc)Oji#Hw`p z_Cr>^-yE4?*#hmo97H^iv+LpfbhQpPFY;z8?0F$PHYsi{>=gH?Q2>5B|Ep7h${4R2 zzBFI@1cNN1aZOb0Iys5mXtR<(A38^<7xwBtaLot^qDoZ$+-)88<-gMV)# z9GjHyTt2g8Zo)D-DptEwPI|eS}Ye(Z(C;W`j zZuUD%VDus3tzkJ0+~K20jl!#d@e(6M64SLti~qaIrB3Z_S-^(eap^GqnGq)_viZ~P zrG}GYs*-!ZyVLUG-fY(B$;c)_UNapp=fdR)CPh(;FAsaS=`WAQ+_zlU#?W`tLUWf|^!Q=^}q9(=V@k1wv`PkLOR zLtgvhmE~Q$6)%;0p_^m~NZPLlywP6bW`55&te;IGJ|^93>YuXTfR!^KfdQgk6NH8vT-O#ek>t$mTyq(YX6)JdA7K(IS(-ymHw=%az6`DO% zb!_tk7xC>sHfb#RJlhl!@2+*GAc=+GQzfd=>0*b=+}@ls%V+zR2Iv*7NCXRfF8H(b z76H8oNdoM~ws>BwicZBcPKQ~$_vX)%OExmu*X5W6Q5$oSon@R&rI)jMddq@Mc`D81Z*Qj(JM`)@+ZUcSDI zAY|;{Np-uFk+o<@@J2o@H15wsk>94;9fME5wi123Xll8Blp0aWtYn(WRrfD4n;(4B zTnXc$(d=T=&6yuu5nE$6KTCFxCY@N*^F1-!x#gU%pHIODe>D);l8G1gAV( zm)5bCz&P3={TYyKHZT}Q+GLWvUeLZl7d32W;;IiMYo(Fl(NRmn&vsT7QCjs%MQsiz z-A!aYd%nfNvi*HWJ<>iI=V|b{j7NzuDsaDQ%pP9DvzPvNui7r9JLfkatA4@jvS(S6 zoe$M#`cH?aHff9L%P2fA4$pJS%;W)+2rR=v-xlGnrt#sELH?>Si&^!K#d~8qAo0{< zW%`W67}+kVA?!#Y?V7AI8mXaJZD}fxbJG6q=G8&~Mm*_^I1K-Yv1jQ_$T-1n7`B7A zZ(#r7%8-YJ_07xM{xP=FT}+?niyuRR8|_-`1+rv+2?q00d_H+}@b&dwa_8UN1due6 zt{aA1ms)Z86$OXa={h$_b7>7~23%Jk#T#4Y40jjDbZ^(2%aa?%=FbCwxRN*p)*KQ> zE$0-rqn%Dyb18z3GGF@-7d|iR6BGisayjl9R*}n@u}y-&MvJk&tEl1x47gnd?oGj> z7Z#rZ+A&>E*3O5ZFYEKIvzFaiKp0D**G$>uo6WeM#EZ<)dUxQ@HnDo3dnpV*xxG#= zF67+$c_*Vi=n^YGKfDmT^{0v?`E+<@=|ZI0qX?L8n*(^Uya@?PK(prn)X0i94AFYe3YIc9wx$3mY_*?(rru z;!oeZWl2fyl^9N-XONVqPQ~p}=45+dlkPR1$*xt?%p8U>J>y7eqpHf$U~caF%;=3@ zo59sN&0R zm_j`<;5D?_Zj7t4%C*rlZ*xX3=+`oI4xp_RKQIkim%oV zm-g!w9a+DN@1=vI0zW(RM2zqmKj#8key~K($UJ(O-VfNUx0ixHZp=+I;RS zG)*k_Si)nxuuLwKo0l4ifY>2QRAQ%~_wp4dY3;v5c~n`)`{B`QlBJ!u`jHxSi}8Tk zsGaxXo_e+hb;ERXS&T0~fbfbW(>?yMD!J#kTEO8b7~1Exd7uX|wyzU$DxlrPbaI&Y zGr^O9yU}THijlzabu6~fKxysI3jOdZo7*Jk$K^!5;Of@v?~b!t+G;rxAWJzGdSC2d z&;#^?eMi#8f-RLOn}sDrpREua}T7Pe-e)-OZMCsyjxWpe{P#trykfMZyZN_kBYK~N zXE=14(q^(gqDpl>s^L}y0iBt7G~&oz^-qp##4s&vRRRyPb2+UF&cn|#c<+{KJ{iQd z@y|^p@rdA+p?jptjLhn%)2_nKFz=2`fO;AIo2sX2{zj2fwYYB73y;*gd%}olS!(JW zkIjwLdkyIo)k7->M^hP3f%c*CKQ^4Q=;w5_cuL}(ybouJ7@2c}sa?F^UNYwVb^El| zCW*ReIp{u)HjIO-?uJjF?GhTB-nn;fmy%dNrKRAu986dKz>R}t(c=PcW?yASOy&?3(N^Q~ zQCIMODR~#edQ(?dEjUgEeCf{V9RVf|dxl6WEK*z@>O2N_B#{6cv{aYl-A1sga~i8H zYmVlxrwpe)ZiKp5Yx_;E>Sd?Cxn)vmJ({JiZ%vz)RcK+Vdok9$IX8{=7IZNU`essn=ANq`7#*DQ%h1w}BFa-)lipz;EhlQd>^m6I@t z@S44i96~2#H(kg%ZtNvDDO?>E8L$8GwJ1CuJ7tS=P<&1~B$*l|e_n*R9i(>>zB8V? zL9DQ8!|)2BH+A1mPwh>I9ouf0f(2BAQvvIiSeZV_Hb#(Q zk?C?BHu>G}=63?-#+Nj+ce0~%&jsw~*}POYzZQc%RP9}B4yJD!dAr*f_ocL_ow+fc zad|t38~#doem+Z@c#Znk-l^qC(Q#oX+Vxg^Xh)-Uasv0+ZWlNyo#AzstD`Z#9pAir z1B(23SO+KDWB$hf>D!mT>n#T*c2yi;z1QX*OE-_&TA zP`z|nozLrRrz2taZga4?<~jO}zahSZ>_V@3-p)HS*^RsXCM30E?ADk4NP32HnC|MJ z+5qed*}m&xDTRoT8op#pU|_WU&@1(v)1KHxm?u|fN{8@=R6unVi30&IFkub4ACu*i z5=kXF#lzzj9q!9XDqZsoIUCItqm3BK@>p`FvpA1Na|XRs>%0#yTM)X}#{S%~y(ccc zB((m8HSn9NL;zuROuC-MTqhBxtTEdMj9WYnirkCm0kk{x#K9w(2O$ap>&9&=X3 zQ{FU;-T9RhJU`63`(y}dixW)=j3ks94cy-mp@0qS9^e=o1eC|}1IrkJ=weuNpOT2H z>Us9J46W&+jtD+TUZPeW7M(#r5A>_CwAjo zDza|&bXcxq?O)SIweg~g_E!CHyc^ai}pV6;L<_YGRXnd+;Ol;Gt(ru*@ zY1iOL2Ou=Pqj|RIMW=?Wr(lTQ-c@cT9UV(`8sVjZc~rCdY$ahIo}uvr98 zAPz&T21k~^rzUp9vU2JFuNSaYZOX98|4?7xsXpQ=)JbA{9?bO&$9&Uh;(WD$6ZuK= zX;ATIhBxR-Rg5Kg?9972=!;#>#UV1Zeq5V-aPpsLa2vMf?EtMBtXf6579k0`P9a%o zB|ocXjiLOiNl~7FXp3Pq6RAX2MpJ4lEP1j-e zPjz&d&(tB{87^zM@_3}4j(eE(_N8L+Ki&jTFhlGI-`56wdi#F#nGkV$?CYow#E5^@ zIBqpz^r>;7s1GgXkHqBb-p)p)F0$C{%phF2z13U!A*+Y>d3$*$vF0s;Y!!&3jf5AN$zo2*gHtH}O$j`-ehA&&? zqtDE>1Omo%#uwp{n*WD(L9hBJ!K3OPg4*l*$4(g4Ot!*@OQvuBto*#&PYJFAtu0^L zW_IVFJ{x|iSc%~s>DHLF87h0an`(zK3;RF!#zKLW^%HluRkyc61+yyDCC*X2a7id@ zKr!oXvT=NA?xMd(FkpbUP&}$YZNM)J(x)x9N-G7R2wf|;aj~b&C&X+pF%v%@Jo=uNFW*T{pkI zs;Ct0Kxzn@0BzfbRXw98V^vF#uu20|Z0sI2+--+sX_e&GFYCXEDHK<;zPnon0AQQ} z7mfD^WPQeOuT5}b_xRC9n4yJry0h4GA9=XwNp$N09ZH@(W3TR_%a~`+*hZu2MaFvR zWVCk{t)br+Um2G%t({u|Ch)A_{|+&&;#>}AJflVp4$xh@`t6H>Q%e3uD$c#o*zwh3 z@Q8F>lyKGT7sXj_6Vc4>-txy8trKhTNL&IH^unt@_9Lg`=RTAQhofVoks7sK;v9{Cu zF(ZvNhW$mn#)Exz@E-~Kr_w({oFx2(^nWA|{^m;;Ujl9N&!2vY5LIBu*H)k}5yAQ2 zY;TZ*U=+9rG)WM0UmUYs(TwmvNfGR_5F9zof0NLn3rvXvkpJXD8~lmrfcrNks0)nr=#$tXDS3k7Oz|MAH-&{I$X0wyTz=x;%Q=ssGegu}n1Ev+q3|x3rx)S@luI zcX3Qx6VNF-@ahkkh_ZODl$l*_@Y>1WxIfSNkKQc)9Oyizo$=prP}m79UHm`ny=Pcc z+t)9;_f|ngz=jA2s0c`x-oZ*QB0{7DMCny(2vtErK|q>xP^u7m3y=T;(jk!=T7uM2 zLV^Sc5XxP_{Xge@&xiBjKKH}9_qqAN17T&ZIp-R4jNkZ;k{#orWVTH6g0H>sQ;3Vk zC9IvCg&cPV%@SRpFT@?>aeQz*w&?R5B6~Cvo<+DW;)N4wcE9Nwe_PA^vGR-Qg6fp& z;)^y{re8$VbVNs7^Vddvu0Chv++X?)rSr^tKCJr%$2Xzt{$t*y`(2@A*SY@E(jWnN z2Kw+oo3(ilA2DPnq{n?h%%t4Qv$5a$( z$xl59e~Flie}G--R!+%s_w$dHH~txq0POcYbGkh-4dIWbI9pgrHvg zN_&_j<+9fh6ta~$dm~44Is+~*dT=Ekaw-Hpk*k)rX?!o?*GZGfS3+(hpW~RK`lTj5 zH<=`0TqGI6W2pgFcikkTM%O;}IXurMue=S>%jsBJ(s$F1zM^!8w#kiJav8r5L?&%Mog>F{+Vk3_#3GLG)6=i#pYNIr=0s@Rm0GSDB-TbmTykI4;HH3U<~!DktC;fNq03x&<8Rw6y27JZs4vub^GKHThX|XRdIvZE&(vM)bL{+%UhWdG*3(;PP{7;rhE? zpW0O$T?es4sgj^)g---kW6Y6zZ=dGR`^<42pXEEx&SfAK*GrtE?)C+^NSQJ6F_5>| z-}wGAOR=*%g{}7S00&FG|*>&Ob&h|7IbH7tkxPJ5IM-<%gKme3wB2V zp#>b&x??5T@<>S3MXOH~PQ?&fiaHVq z{_zfp^STb{na&4bppmH5D* z@Y*%wqI2on>Ut#}ubv4Gc})D#ZX@UW5p)N?wpIxG?IHayS{ADb5sIN&dRgJNAY8M^ zGo|2`+1)ZcmZ_;r(YJAS(!q>AWi-CCHnF^z=3p+%9@Z}p=f9It2;a_K!Xtn{GSFH@=siBNg`wJP}N3H7U`(od4QA}~iePUg?6 z7Fe0X1N&Vdve~k{3;Y6`>;T@a8{%*VBxbG0Z-`|$(`4J}xBJH6er)x6)}TPtZ%P53 zJaal{;{w>!=&p9JXQqlMd@uPiN!HEB``xe|V!(eBje=EJy zF%j;R{0$W7^3y5PFlx&ZR$lh1#2HjHC99bis_PJqq;{bA;2_*G#djPdUrs4Z!ZsVC za{E$6i9%aN;%L_2HBW5+TEOI4Odl*x*UNb?V8t&YdqAi37o-JUuwl3(H(N@Os|sfa-M7Dz5k;$OlO7*N$k$5q4c-04J z$+S_R7slcPvaWrgGH=Qyt1=(?$}b}{%{un?7c*neumM))&0a?z|6*;6N|ht7RjC6- zR()W@;}^m_I|%%vdXV#bWMh-6iLNPfwm@=vw!%36?CvD_KHwwa#+SdXHzu#R^%#JsD!*q& z;m)V8Jz;Y$swmyBiGH?S<^WG|wRHA+_|1D9>?Qt0NO?`itztxQdX=pX3NqnbzMX*z zHVJ3|E67b*LZ3HE!VmV66WG3XrgdB3DvutvFIRP*a_x-;NeVIUtFV^hHcAP_p5f65 z@%05T{8PgwhMpY}mKVCl5|YG8^+J7BZ6nvZwwNLCI-=vx+|4x0lH{5O#Nz?TP=yAt z!OWcS0iEVOCFE&YcZ@emjfC&1Pm=tNB(+Kg8T^F$Bj-E%l3tuaHTF_~f? z!Z;=g1LIAD7?$PF1fLPZ#KB35vMThA7}G_0C}e$1LA|#FjU8nJxq1tyy!!DFbQN5; zP+e6pIdM+CjzTf7Yhe0awz@RQa;Xi=>Lxt(1a%UUdC98;`fRpI%X)nWws|k>AW3BN z%$}-}8%cZ44bnef7L90TtT;sXCU2jbbgf$he4Uv&QU1J^@dU-0doQ~1U=Tu^sy&0k ztR|JBHg>Atxd;)Ik3=GIz%i&Als~c@eH7%k@1=|Rb=A&5SpQn?!aNxC!&;=VE_3l2 zZg26BnyEYud!>4%;Pxt|{#C%wgD%{d`P{RxUgdkB-pUM&vJY${nfoZbGs~&5CdsW@ zR`g?^=k(gLs^S&TW}@jL&7tz(VNZWle~If>m=4Z+;RZS`(<~5E|Mqn^g2Kt|zX(>Z z-l*L6nn{bTm$gQ{bf3GqpHHlRyc650-zR$>$WHrf>bvh3etF{Xyfsu{Onu zR^vKhii$^xEXnC&l~tCJloG9p;5BEQBi^j?inDyb@XA8RJvASkcjH;~;W`5d?Y-OP zrLRgRdZFLBfwr&xOOkqDX{9OZLYt@VlqQ=85$!GDB4e! zt`EsWtg_wV9nNB|8>B{8^^daQF4C-*U8ha;IcL1mPDvLuI4ie(9E~8SS|Sy<3B0iG z7yU0O0arcvl{5e>yqamhoc7lyA|$nT+FR)LDL0!*r_Xz6jKUM_s2UtBAY|CC81pp2 zl2kC4dg!z8J0lIgzgN(Ev-wrzfb@rG&I!y!Lwk#?ig)u7D?h2>ktb!pzzh4N|2I)6 z^G?q+5nsRFHO?}y#_8?KGrtIqoJ>Ee=&Pxo^P9Nnug_OURaJtUuexV39{ON(M0JY2 z5N;L4eERFlzlQ*GTi06*$dXEj2Ty9&p?U6?+bj5+>TkDPfT*%TLU-yxED(t)iE{2Bjkh0sE2O4Rh!UGXR0c)g)W8;G1-l{%Hw}`Yn#+iQ;(i-~X zd=KJE+Hxjd!GP*C#g%nw#+~DhA4dJX$ha@E609(WOKu$49XPXX9Y8gtrX8gCJH)ac zOu`_g^SG7XEnM9@p&=F3*d$B+a1lM+*84>?@`l`fl~#z|TglkwYtVtrLEpC9!H8gd zYoZ;f_<};@PbDaZ&(ns|j#kSJ)KmE`Kd@DQ6?L9KSvQ|EsSd(_s66O&y%P*yhjX|( z`{3AjZQOl;Q~Ci1LpwsL>1^dTNCeibL{HK0*u zwO`Fl2X|k8Rg-X#&@JL!M4otwzLKV{TU*&YNZsx7#Yh<#Ds4xaqg6^@#v&&T-Hx^s z-rjsO;(fUtrMCJlXfQXcZt@#1k9)1Xi!?~8*%#xBxgTroTFF&bo62|F@x|buykX%$^V6dVxhvJ!- zYm86mL1wtJIT|ZdiDP0bE|-_fMB{a$aYGC-_Py4ZrR`rSem27$yf59t4a&uAL<$)X zy)BuoR`Z=uk`jkfE@EF)B(jW~xn>%vfh&u)Mv*)#(|mCJ$u2{QUHh~hw*Wc}m{9(T%Uf39wmAWMpK$BmJ2DNQq>of79rR>Nk%=FAqt!O#Hv zsX^z9*LKOG2ewUBAC4B02d94T+F=$)w8uL)+p8N#!79`zwxqQH$=$xn5qj6I z^FF}o@#~4Q4^qfL0y|Lv;TI@bFyw|(-a`{AjmBX0`8OOlRfP7+8CDYwpRFCwsi!rilwfG3M&s9Jfx{=HtawZu0PpT$D7~ z|7qV)m>tDw1gHSn;LALq z)#dZcr-1rHb#V(^(_$B5J9X8C;Y=kGiW!f$Cs;Kcj7U8k7u;A5*1S9#SdynBIElgN zu(ZWbAr-xJd6cr73k%4w$vAWB1|9rOMqJ&7t4YrC4y$11jYh@V{88J~N~ zh$2i~uzDxU*X8j(W~ohpuSrE0{xRjmp|45(*6h9g|Dh%$#NE*V>1_X^#$^i4fLEPDYw(hKQXh zOEiwiCK^kG=Wt8kyCSlw!G~PH+D#jQJ`RvRd46_Q9W?G*qSt$zFD}U$z$tR2b2dCi z<5xbPGmCoi4;_P-i_HO6R$0dy+%)z3B?C3ib&K!YG{yVy57DY3O4I6ea-^{LG|T;mMct|E0;F{>e#bo`JLsY+ z3VSkxW~Uw=v#v99Hv!#8Lf76TsNAIiv_CTlFrQbGl8gLbu4^%&!J(UfSXyq@W^R$- zZLk>k#lP)x|AX)T^YH+0j!__8l!o_dHZc$BbnTmRg`sftMZ3ijCZ{p8(9Y=4wC$uA zkI8xuKOfM%w2&MYS$KO|L}d)+lI4OB+O{ApvXwAT>OWj7jq{iU1h)0AU%5GDiu#R& zYC<=PsXi;6)ARiV_z-Zab!(AomJ{0(jc|pC_;+sHq{ZzNZ7TXvo{YF9vzL!{R60{Y zrN4}=TE?|SA96kt@$xR(b@PSc#-b;76NBY%?~a;c!nyRB>t(U~SF1?%C@35-6KOiJ z_`^lF>*p3{T~9Ay2O{dWPPw4UZJZVB4jH2;N#^Hza^ zzk=5y*hXD^Ss+^RiR`Zn;^F99iy4Kz7mE3ro#kF|XXYbXRgxoI^EcMye*t5)vRrV7 zjj~ErUoJM~d3HhIrlf5J<1ot)my0C;+Y5J6=4+{^H_+Q+<0E;fO+G2#vIhSa{avI> zMSC%W?Bf1*Q=QhAVKj19_6SvptyQW>PVf3HQ}2&xmw6SW@5ey>D1~M5*F1Wgk;j>< zN^_4N0lsN-gUgh`!lROZ{Z*QK{2z}s5xII>yb{=Rt_;H)(y1S7KbwF3@;+DD0lX*( z@P#jisxJfgdf-^?(4ha&MPByT_FY#yobHTJ`>6w&`0AUY3RQjyCr6PYt(#^t@p+2+ z<@mmD{ni9AT%w^e(PElYbS&M(rNW_TyE$VrzhZ1YO5Ut_N!G;L?nmpqX-db7Yjt%; zYnvSG>iU$SuVhhdm7Z1QRmF&l#tXIe85;ltFW1uT$_O4U(eq}E(FqCK=@T{ZsET#_ z9{W$D$%hmt(`F3$=lH$a|W}7sY|Kx=;P^?;f6A$>)W2O0Y zMwdsGw+}uKSPvN65e1gEzlA7<%>=2n*sb5}%9};~qH*A8|HHwOPMB#! z&359Cbfos+d|3MIV)Wm(_}qtq*=;ZPmCnS?gLOx?yADqE%@mzI$rY2$J^O7(0t)gA zVpYC{3EH9Si-#zxTsi|(WjzL!o7Ei@!F~uSH}{HH$QWicHuXxH`g3DYYZs=(IYjDP z;X`6lUR_ds$-Csz)sH$?assNG^J-VV$hm51E7HONJ7esEP&oNVQH*GvkyQ<6zl-&9 zkyFcR)ckueeac&PQ?atq-CJK zG&|H{@Jmw7NT&95;(5`oLgS4EaHQ_gv~hrvq~7(*>C3W=8JFble|^w&66%q>X`W?5 zV7CaL{NS(j_Ds?VyNk~TKDm8Yg2Hcr&nJY-om;-OJzyr@G&d z6t;RTZl9uPXDe-p>f6C}TQh3r?^?5*tjhdK{V|CsN?yp_*lt*%n#Kp!WmkWIKHXCJ zyW8aepS?XI{=nv+^v%)w4W`Zk&1(eIC4!*s=((w~G5^Xos$Uop$w=)@;cf1Tj%Wyi zrx~ozgC&$Yxlds6o@Xbblup!2@wy4RFJd#i=NT$zTMe!fT?-vOEzv(M&J)M%CNB(l zkxR1|bXclZ8W8VMWw&}HSIcV_5KBw0nVHyZqt$maX~_?qU_*~)IDFbayq(GR#H!`X2$zZ1%eSK#~2-l4G zMFYRDe{+2L6||}|b?!=fm?>^#r9aNSjzv02nWaddBSaqm@2`K(RMocF*Lqws{dDyv6qF~fHP61i2{b^WeU2yA z=_xyp?AKEtzJ7v4*}|N!wI5emy{^A!cc-@_6#j$bEEMy+@?1>OE7{{ptk?1_ju}_E zjDYC7s~!X0gBzrksQJb>gb%>CxBxHa$QvnIZs!L5PM~Rx< z3)SVlljyE{OPiv+8?MhYp5SU|=?*34d9o=b@$rNb+VII-@$m`W&WW(iC-tL_{_DE; ze}BAIt+Vw+0=Vs{zyj7`zwvlhM^;+31Y;&&HKw3_WWqV%-Xljy*g(p>pfZA1l=oLv zgn1q%!{+zL{cr2vwU@zcy277Qqr^<;;R<))c04OR|t~h*#R2y zKtkI1G%cgyjjczV628(5`(1J)r}czb-lci$_myDWRu!#M@-N%>B)s{w*}caz`1boa z#^U1?iM!=9RCx@=`25oyXvHVU38CXGiSy1oL8z@pmXj<&7Q(jyVSM)o}MMP#(}70X7?MJ>sjWnz1ZD7c1zR$vKoPfON+PWXmP(bClyvU(@VLZ4c? z^_8VW@c;{W)kg6wC6$PJu@^e)_$eRcfdQo0sGDS@rNgt6X(nz*ZKmO0x7{T&*wiZAh=xIS% z1BytWUM*{5v66RNOI1$7(bg@U*ALAigSC~_qb~~`)}X4t(!T~gc$)xK{2s1n@o*q1 z$fr7M*RR}ufnT>T=|KIZO6iRw(E!`uA-ugRr4D<(-M!>2D0IN=(Sa-WwQTe?WpN-p zgb&^bzBOo&|L7)X;35B!-C;<3=h^00K4kKX8-VDH_aF*-id0phIhe&AoXo2QuU@-_ zsLRq{>%8a4aXoEzX)FHctPMM(;w`;LGs{%QmGs8FAWn{Ced9%dT7~7RdZP0YW+2dA zQ`f1_(15ekvX-MGa7d=&YOPSjAZ6-?2yYFmn?N^ZFgiYw6J9pVby$hs(s1bP7DF`M zpf3_F z!W*dNST;2Rtxk6-BH5Z=JE1b^fvAY>Mob5oU>-KxTd$I?r|FGmI>ky{>Q+&dC1hwj ziq%Fd+F_$@zh$PIuI-uu+4%srJUr9Al^+tHyTI-lo$mCzKgrujc0x<5Yn>2EsB_=3 z&THeCz5}X)P94mgN+NDbBvsCJbeH)rYnCdLt~SR=0_Ww|k7IFho+6i4g=iZbn9LZk z%rj)}m72-^Vk~ra?vAmvyD3(f)7z0;-W#w=So~K|KSQ)jC6@bhe$QftWktgE;fyH) zTI1fthb}``!5F21VL|v4nN`_D(AgC=o!T?rl&Fv)mx~b+-qitzHdzyD<9lWddeaq0 z?GHVvgA1VxoH@2VGK20L4`0GEvpW=2R0q7w zCn&;oKLhs|FC};^%`UG@xG9@y3BvZ2>CFANB_v&oRVb#MQDPpe|e6D)WnT z^u1I@$9JYBkF`@*nJia$gXODbS%#yY6o+Ry@@ik3NR!a7`Lt9_5ELkKd9n@`0}gD! zu@*^W+;IKAsCZIo#>Sj@LbUK?0d2klbAj4AuBXy*3I%o zw%|-!j}U%BU?{4gZNa4vW!7A*Y_5Did#zm*PCrm5t+i5wt}#r=o+HQ05}NmiyAtE0 z;L94I_Tq;%c5;5och6`BDcQBmq-pse{3Dmuz(Lq=4fUh$#LM2j7SlG_xeX~?%^XU0 z`0qKMq^LGxLGjW~I+tY2X!|e(+M%Cq2OimabAz#p{SDrw;^kr5EF#|Y+AF02*pWTmw7D8zMYx!e zh5OS_RG1L3=A5XJa50=a5m^J$%@!%>BjD`Oh(X0usK**n#)+R+a)ba06-Ar8sxxy> zA&i^#mUM(Bo&Y`-t&A8YNpx5u};vcby>fFQT95q?% zOA2_|>y?-gx)5#z8(eI_(UP_}XwC9EX|Es7Gsvw(iR4uc%HZ%hXnsbs*tHv?kD@Xa zP2A_r$%TLX0YcJmvF06HnIVm7z-)TIQsr`9Ug5O&;Re)@(0p%rB1K{kI6TCWBr2=z5eu$ z+Ji0T7~3lrO@2hdA>W+nd}}kdSubkaX&o+ z0z-pj7vfQ%v+OC#SN)tEyHWZU^3U!^FF|m5I*lc#_>&)CBu2Ejff5vfGH~&x9K)o> zP@*21!@bZfBT%D#IEVM>?9hvy#a>6h?<07z5g>QDXZR>_&K!mN3SxMLLcN2LXFPT6 zSocsIyPJgzmJSNteK#QcsW>u!*?bmEtDjH#{O`b3duLpI7g zwB}0ro|H+`bg_K8@u>R>cLjjCz5aum{)4+#c@iMu}V=$}42OJ#$p7QgLM_oS+ zRHU;;VteQTZ2IUp%Qb`%_!Iy`tvfhwaQ&@g3wv5>1K)V_2PW<~(b_!vo>nTq{f&k? ziJj7KzC0)$bn;SibH)FQCI55Lj^X8mo|+&!fjc03uY7t7b^bqiHL{rxSl;XK*Q$^1 z9k(jzG4hKaj{sSQMs#a#utu8aCH2%8r@<$~D(?Xh^AHc-mj+rQ{B<%_faO#Q3Mi-l z^7K^b4*+blL(c#JS5JU6Tc!zIaQ(ba+3nN!>1bdx583;=nUCh{jeGk&x_ABiw}m)+E-oXJlDaM0r2hJT?RkyfxtN#C(K#(Z#<@8wzQ8 z+=Wo9GJ?rQfBgF6*xOhyA7Ja_dC6XavzIcfmlwHu?j5pM*x@S30q~e|#(SD*-$n^6 z_s-S+(Hkj_=6Q@0?dJd&3-E?e&*OwN<{u>UJ!UOxY)B zQG&Y-a#ZUWz6cOzbuW+6_xIwLHF`_uY(J#G6|IjewmvE4On%CaO}@{= zX2={>6lPs?PXO?hPv1!A47V=&YLIBHqn!Wqo0I}@gLy02VW42S{GOYX)0SF|aoJNR z7D2{8S3gR0EHQ;)R-*iJH| z2zG*+*m3r;ZZJ0R3E^dy&oTR6!BK!0CZ0X^#(}JbL?54XS6xO5i;;=}eBvY>aP;%Q zdna}qzPwqU3IH;Y?ML##(EhXe_`Bf09WKyF>1FjZpoc$7Of7%@d{XWh_54w;{pzk& zyurXLkLKr%#~I7BK?xkoK>0O@0mN&3&iC3t{&MM|8LsIA83Kr&)CFc4{xQ)V$!pV(beiI)t_P>gll6GjQ%irL2m^?gUF z<#06NqHEb;s)9Z;!@QsZGHE1SlM*KCtlM-e zlVF~V(<7|}X+k>&LzFCtq`Dv!WNl7g_uQep|`3TF`XI$M4da1T~ZTD&C6hv|_bS|B{5k z(+{56*64n# zR_jh4?L1vSbuHC7>G2cBJSn9OE$OF-x9JzCw`dbSe~m^EvMqvv>z-GZo5`muxeE#j z3GwseulH{(^aAA%o_JJoaq$QYgy%#BA00%!=|Y^Ni+?1MZv*%H3esy8m6cN&tkv#< zR_Gryi1+@YOuX^}9h8sx2 z3jQ8rg_BM#ejt%(o`+wYpce!!15kV5@l0TQu^Y;2n52^)YQk1ADgL&=1C-!{Gb;R#I)nyi?EG!(a2}V zT&*`5)$f$v74I~iyXmF3}?%ZX9( zSOkZ0D*D_Zf&3FTh+RvW!%ezB-h^T{bzbTpoX57xZAd#jUCi6&9bHMFTR|=Stv>fq zf8^K7j$3AAGbungD*!t`M{nq#RJwW={TXK<@8`H>^DZ#$NqCQ1oubvM2uZ8cJIL4v z0aKk0{N=$>kWsh+yh8vh?yO9fUU5*BO{5#Pb(jWrxFVePq)&1KZo$@#d2DyLW_}Yj z=4dBI2dAs6>#c@U7bE#FiyY|2>=bR1_i^~3qyAB+OScBD_ym$dTf|DW96J3q&;whm zO;F;&S4BGSi4M0+>PyR%H&1XJ``vC0qe&Xgw;P&wWR>Z|T;al306mz)pWf#k-FC&0%A=U?2zdxn%AQDngm*z}B7^Zf|5cyDW+ zw*E5nGR_O76BT%DA{$6P?W%f*6cWa+=G7DN27yZw*XV^w9C>}MOu-U2!`7?TTA5s_ zCx9Yrq|z&T7&~pfsE7xbfx;f}WYHue%$1k}S$;!Fb8? z7DQC!=_Hv*G(czOtOgGu_Tq6!f1a7F%~D&gCqSNW+-rfndo}7m>zh7Td76&5<4A!w zZ+sa2qUWErER$JBO#7keMUU5OQ2)WJ#m0u-B$t{y{1PEDrH^kdwis`0HKH-6RosTs zNVwH&L$Z8Ops7-#MX6Ld^IZds^#QyitPVO%^j(NZXU^)TJ|63@_F5A@zdw^tWi2v; zxJ?bd;#vwX$q5CnCHzfONB8Jxq9zAT+C`qpPfg3rJY+svXYPZCGjaM6>+xLUNbSTm zp#Gb*J%N!-5L`Z9RT3nh62dwL%M+hT@20ik8m-t6ReGcgnvhKu)5=vg zLS@KxN**8;m5LUdIoclYc5Hd|DgXYRidNuUYuYG%@{*lv0jmDI{TJ5lvIU5^Elu)o zSlVydsIwD=$38lpIGKgIqLk67+%$FAj#A;tb3U^B3hv^;0$7A4(id7k1` z`wO8y#2j4?=^ZQl^z5+Ry>-Q{X*sd$>Tn7o7JW~<;dm7Z z`&zmbC4TFf|k z6h?jz%2m>DXMQ-5`WsN3<0ojRDCFF+=@m#ygx$Ft(i_%qw z?%garK~c`b0g7r0ohyo^CLKQBnK|;@Y&*igryya+l)?Jx*MJ2D7T4d0+9{|u3y$|D zk(j5bt{sgeTijXdhz|fp%Wt5pH&)5${HUxG+dL%PQNY7#Ps@hGn2ec)`NK1Zi&&=< zM{Yk3#O4#8h??l)Ry)S!Uj|N7Mj3~{-Oe*_PzhPi*PI-yZ+KcJr8Bi(yz0*#{nPEk z+_kO(An|V1kIq)JO{=9Sfchc~7R(}S=|I6=3MHUaFp^%k)#|Jgg!@Xg{r2n^3q%rk zMH0C)K2nLhe3{9sd-wg;BkLCU4Kq~?AM`ZXomBmHYYQue^6y7LI@QZF0kOWj9!guE zDXzb}dzadWYF545N(`3&DXzMPqRuv3bKVm2o12xnvjv9rm+A9o$^Bl%xrD6j!;axYU3PeYS_%upm-vYQ(|NLH4@5Vh&Myjb9=8qkd0 zeYYCrWL@FrV?OM%;f?R#4DK7>*THQkF{o^QhM48f|NO5TN>&AJ0$qyA+C`uuMD;S)7aOiRI>jSBhMeh-_OGqa zeTHyP;LlL&gvN`hQU7G|pQ9Cb|4o}vA5y!kyQ@p#`z>(Cqh11(5?im@#sh;Rdy5^f z#ues+7Jx|X0|^$A799l8>wl~^PSxJUho;B*R#h>R5sAQXe{r!KYlS|9e0_>ZibH8R zLYNrdD{Et8bIJ?{fWidFF{|GOprRZ2b`>MpzW)hKEJ$O&@}InngKYvd&vG3~-3G(? zPV;C44hGSYYNMIF1#jWpdK5Y7Ya;aC<$60W_58w?HLcyZIX37gX<9ZJ(6WEc?8Lwi z$uRe${oW;@k!Fe-AE~3$MXwjtr<@E>I-erua$B^$%0nf`ZqrSRV4U%13$TpdK1IwKYQ1IT+%qG`Co9_plrxp zljE5j>-#Qf5-XKDa?;%@t*vzy8gNsEpvWD7U!D%*RC)TmhK-L;H^Jov`#1*ux8Y@P z&-V{;KfeJm_7(wmEp@|-W;cG#&@{-2R0uyGpKt=sIxX1>x3FhTK#p?2`S`kTjHz#- zPS6wdfO&s)t8Adg!oRu=X7wD`;xC>BgoC{fspyciN80L(^p|k<90L#|6PMD?-fCG@ zjwoY11mkvDsbZm$JmgSp92&6 z>$N;hQs{1y^qwRnR=#bQ4=KD;T(>kI#>g>Rd@v*_ChXNQ1>ovXdgjIX`8!b1bzfEa z`sZj|yaN?&Yh&5fUmq~9VPs`RrgEt4mc<5hUpWGtaD{_{b&{#`D1GUxb(w!}M2pb_ zH#*!E%X%BQo+}hHxP|@p?VBQmm@e)4eTJEtw7Pof?7O}L2o@t*hsVyjLMeSIiUoRLh{)&l>Uv^W%tbNMe;*!V zk<2UX94Cjqyj?9qXtq2vxsd^_INB;GYh>pjYdZJwi-&NUn3&AZ@q2jSO!x!*`>8_4 z`?X6ucn%r9fIWw=s!+-%E4)pnB3^VZ#O8=HpNm1O{NlVrTf`s#??f^r16B3zoyift zRmm9F-`@|0`;bSOw_PWFo_B5+=jP^Q1)0`CrdfmLv1U`by~*p{u7B8MB~zLY79I<6 zXr`z#|6at3v?@>5a_-E}IUgeZi{B(d&`DE)jzdFJx!SHh2zg=B66-TG?bff=835T; zz(Xma{fI!IWNgp%cfBI{1^%6j2Z9`004!^Fx8P5wiFJD#1&@~@HC5>?DU!HUN6(8* z9n7N-w+na5%XP_hY)QWhWt+*ao7-c_`WxiPKOXI$kA(`6_<~VA2>qjs0Nka|<6{JKDMq3B$I zeXWnnvIJUYgq+dEf5;B;VMG9S;;&>NmHZ70G%04{8&I>TXkKnTuI)zb+VSY>B5vRL zHumdkcig57g;7_N;Tq4!qF2-F$yS3vHpZa)B}7Ix(6KXv)%`F8&#D3^Ov_%Dj;TWE zz7d1`L`>|-p=E)6zDrXtv5?*ME`%PdOVJkjch!3#lBh3KJ08{urS_uUD33znFN9Lw zW^u0BxjkP1hey^L>re$(6eMsajV~ZW)ezbPTc=S4z%wW{Lpby<2BxV_RqcZ=Ff>z+ zrgz{+*LR4j?MLw7ox|3n-6Zh4tiaKA*`r52KotSde5v`tra^>vYb#g$3Ebc0mU-;@ zN9rboPuFfdIyir5Frrl)?#h?w{P8lYk!$-SA*@CcN7P)S3%ui_u{yOef5M;LCpK9? zzo+A=!YG}h4h~%YDR=VJq}f`@Xub#oE84Q$dElZRZbV#hcr0c$%sri}q;K`=l>U!z z8`oH>%<@B5uPuwE$9QB$`d1_dT_0yoc@tfGp;IO!zpANlC`YJ8MI**fL=wGOjty@K z@E45E9RtFECY|1kSjL(@xS9#{a!PgkQKsZPp$#I3)+G+Lr`I*M|E@`t6y(R1(E?7t zm}owGJTeVnIfk+hrAW)=rTq9URdKiL!o{k>#W9B%2g_$;cb|<-qgNM*J!ZJ5sNIKk z+o5mx+xGCv(wh&HpW`k~dx?J-VIsZWUGGCk4f4P=efQk`_{o8gZY>3;3GHULL@$XH zTEdJ*y*PfDC`&L);#|8{hW$m@k5}%GK0j`9wF>BJ6L6TP?|U{}2N&qjW?VV>PP3-Z zU}d@eoEx9ZZi+u{WH@M6ZYiW4$f=o|^Xt?yG#ctGQzA`NuV>`0ZtD(8nqfPBDO{ks zR}lt&@+eNA#g$(UJ+aHd*9(J9##Rr%Ck^(-2fdiyBbhW7MR1}}NBf#E<;RtDyFFa$ z@)`Bl%owJ)Ycl#+U?IIlo>d#AuxF@hU*&6dLvhI=t_>OT?o>ZIDsy+I3Cf_}@*W98 z1M$C(fwTwi;9!N)ysP)j$7lN}Xn{Y_iad2fv@DqV;|>I*LMDzqzv+e@<1$f_rx1>zh+8}MrhPi@`@+U z0YWSi5dIMMNL;g^^fRZ;*}*=6k1R+{<~h|N{Y0>G^#_zydL_g>>4g!c-AD{@J)GS?bSeFOtfrKIO^G~L?LTYSTCMKsW%Kbp}g z`E;GvOt!3XP&vJrevA>*HvqdK>+$$V z?FCB8+&tKcUO7CHb!}xGDo4%VRUJ=tFH%|-*?Sckms)~^CRvYvE6)DNxa~zPken}W zw4}w_UenVwFak>XF?1v%+}DN52Tqpn{ND6Frm4J~2(<#J7}Z^PFexx3!?hkDfg}zI zovI(A_8!7U$V_7l0YKNcE&XV#d6qu&)+Twcy@sF)n$ml5g#%NLXrwB+2Ji?8S}Bn6gRkuFZlf zPVy{b&S;Bx&F}3DTPSKEjO0>a87b?K&Tw_V3o+xLQdBT!Zk$=3bZ3oRl|Qu4be-l1bUuUys9j-^BOOsFXl|HEYAvS zO|*&pEH}N-k&b;#2Oi>8A#Y^cxNGt&JPj(fdxg#a9wh3#e6B~ZQUc+fUNgCq@?mz# z#}WAAba`)Ppvjw`tt#uU=qAdqP!$gEdY&m});rYrs ztJNfRG4^Ut@#xl&z#^72cxRVmQ!9)gBpi$nY{^RTY1!jsXVjFR`rH2vKdDIX$EU9Q z)0g|Wa)YW0iU~z&x*3FvU$~)^kh#BrdtWAd>??8y-!FU5D>8*d2(P@Sek%QpW%qnH z0h*N|hzi0~SA?HlDo(Af%;D}tk_T^6BSzkBB4+brA(r~X~m6dU2H6(Klq3@Fk-9VhMnr8F8snbzhndf<@%&-rUb?(q|x}Ngmh=pft23L33 z$SiWjV~CFUy7BwjXM7HUd(A`LAG?EH6P4IkpLv=X@>f0oK8F*t!8a?^SH~g>^^GXpD66O9RNv-Rb?5)OYb*2?}IboI&zwV~x!tP4%_1DvI5} z%P;6&6=X7OGr=L5g~4K@ba_~jYbKf9K?Fv!arOJO+n*Fwy%5AIa$(L7E9{sUM-)VUb84F12<`3i@ zNlm!ELt~?RKbAjp@Ca*Y*OV98bVC2_mNJWs6c%V%VcVHyTxN+dzV*zF88Oe$(uu`x zKgvg**#75eb%5b$$o&#sr(zb6ezMCXxQNvY!h?&bx8uLE9@wsiB}0-aJ7r33L9ET{ z8Q!@|-nMs+3~upGBkMy{h?Vs-W6=r$32?P5ar{%)%luk| z`gZA#q)6AZv<}yWB#eYsl$)*yI2#6=;+1dvav81*ub7DM+i@GL(vJV};>Gerki^o( z3tv#Q$fq-DGPts>%*bZG+0;0Wk8D3rtz(29LSu9qeSD+-ekFMPdtt*Wmo!xsZFRie zbpaQ}ReEK>*j4l34>Y|Dj}Y~{>y#Hgy|%0LV+0s%_>{YbtLN6Y(})F~H&4qjp2PlD z@`&)ID&w0c)|4?%-F5I$Ap6bGxgX}j&p5boId?f3xD67}yq=#jHm-RCRt^*wBAczv zZ%3=Y;u6AusJfI>f9ATz-_a0}nj!{dREw@eSBV}Y5G6HNY`b1RHm{6z$CuNL+C@ed z)89R}yo77!l02N@YyMhhdRZ)jbL=;=mUrqp5o~l#Xv@f>u2D~VIDeO8ExMcJx+O-| z5u>Wvu;~IWr~v3h4GP;+>#p&Z@vtXjs0W~JW^1r1!E>`YW$~v9ZUfc!5HQ2i<9M#| z?w7YzJ~X1gj}gW@)C_7p8V8f=@9HN{pY``I>e(~v5&e)DtHUww-hDZXQtc|^XwQa( z>#9=uI#G4@#=$9mpnZf^iXlOQd@K8meLkD{73g22SBRBy+I(vDH51^a_|YP8sRpI} z_1@>z5o&y2b~2LD{&okn;^_kakqNie^D#iBG@tUTU)R7^qLjAG29N)Y!^kP$X2<(p z`Mj6auuQrxqyerH!B8c_B|5hymj&t7p8IB0$52X(+%^(ko}3f)-=bQ*6!hm6-YN;j zk0qM{bV2QfyY+5n$Egd_+EdK=UJEkwm$Dgc9np_5*37wodueFVlPT=kOG@_$(cf3M z8E5KXr+;iaKv=bCuKF2Ciyqog$#wMsbQAo&=-Wr_FKz(PJEK_&yM6ASO~;d!YT{uq zd8?OV%FGQz`S9tP*VRC9Fw`v`PtwhYzvU;RIPc@C=$ha^#okWeMoBaJESN}o3}sKx zr2NtN@-$#kFtl$cr}T(q@?R(m{(i`bSLIwg;LXZMKfRx+j)$P!hAKEL)1@l4pMjoo zEC(AcZUVr{x#LgMp%0;43lY$3rxI}N%=nFPTYgMBOa17@%~!n z70~!ma0KNQKSRk8>%UD8i5BmHLh`a)*hJpU^^6lM3|O2Chj-?Gf0l3Z9h;fNI42=j zbnTp7E^+kgR%bT;%`Z0J;XOdJGKPXFsvAtwSynESDXMSh)V;6zfPh4z0Y~yZz%}6; z&_K{%`?t0UO%YgWieaFQXLx@FLE<~6s)_k$fwHsq{n7tsN%QOfvdob4HFP@tnq^Jd zyxe1*iWE{@d(bWIbaXAJvrf(HIFVCS@Y^wTI;W3%c-{c5?O2$uIeu1E&&9(I!o7$2 zfOaH(DQ+2D!U?j6c!mz>Km|cyN-oFLDdl5a=@17xA^-)%_dpN?2e|$>IoI(i{@F1BF@|=69_nftxx8G2M8Y)f zqJd4o|1aZ5ilC4fpa9AE>u_%^SCwhi&-nBqi}6bK6Pw&*ZCk|@`&3IZUeq>heK-2k z$Qd5ToG)F2Y%oF?q^P8n5>%z;#3`Bv+wSb)dAwX%g^}wTO6r2}9Ee61QsK0gd4=)M zZAQpqYB9D#f|`PodN8<<5iIj0)+j=jBi~P#BFbMD;q3&&*xL)!QVF0WS;~ZlrWo|? zpd5zdn$FCr4h=HEhWgr&EWkz9TxZ2iAcy8l@BD6st7&6m3qoI zk0ZP3D`3-;RuiFGh+dB_3g9d$QLn}5%qL=FD=gaAd?AX#1NF==&0_Q=C&!D8QeBep z0-+FhKSMSPmKnE*9e*=eXvo`EB@TN$@)idXlq;ev1jg+^!$kA^C7 zLuCB=O{C&zb=tZ50yKz#~mu9upI5 zmLR`Ph$MBaDn)26jT%KcOXKBf+B4*%TwFCFDQD9t4?7&-n<7o|rz+9PV=WP#Sj{53 ziRH&^UUE(LP#1|1|2Ip$mTqCnQ&iyr^jMYfCIsiq#ze`lA;mIi0XDfAQD-}W1+&_VXc+rRTURXyt34i{%BAoM}*v3MbYjJ~CrIuOr(Jw+;B&B{?VVzcNqj zE2!i_E0o6u!o>w8v&+CSj&IWtT-W1V)%f?sx8jH@(lN}`U`R^` zGP$RJ?L@+agN6}WYMeP$-l%({ngT6PNTCePB^tYs=t`m{=k*#}%b&G^-8njsD?x@a ziq}LF$ydU3ov6A~Jzi%dZSx`FXwdFqGvlR00oj~-pIwR0+`6(4%qfPYwOfQK?BkLt za@42i)Roff;$8Qw$E!P-C$vB&Q-!{w%&ZO}G?3F?7N+ydS$YX5@l=^s$ZGB?d*ITA zJGE+$p3J+kkLT1JiK)wzNRmxNfPG(rX9PLz(Ta@G2_ctRIZ5IYAAt`=xQQB@o`(fz%)&1HBl%sz%o#z!__oKz~lB*4QUz6dmFR91>Sh^dtfZUK3x6N{ZXFj3$}R zIOX9RG$aB#k%({s0gPoM;u*unR7vno&&HLWgIBA*3;#An2W3k!iy>uqO~6qh;-)2) z+&#r8^JKbecBd{HiqzKwX>2|nlR9LAu1#}8{re)GgXiuVm%oKUtb&AjaruH_Ki4Il zMMliD>cSUx34S$!-%$AJC536O2~3LBpxPd{n zcxq(vnWF6F2$%oVP#@_HT$#x<4yendVKeUgFk^vi7y%WFYU^rB@)YRM3&!UQ&OBr$ z=Z?$|S3?f^nD=z(6EgXC8#xd-gB-@U-%ZW}15AKnUNGqN9r!(T_US){c%&tQNA|`n zTOfjOO@Tt(Y>!7Iqlnq3O;5!AGNk zM`k@ThqIquGgAO3y<64CbB*T)Efk?Bj%QRZrE%mEfzzlq)1^MKIf|2Ny$3K`IQfZ& zh4jM}*(y@(w=|V1w%=KP&*f6|c{XzG+^kx;i=_?C$5az1(cK|yx-Q7YU%eVuSksmr z>OzO~Ir{Ai*8)L17wa);Q8r^(W#h);sooTAiLqjn%>F_R!aAqT&tn5%Ss=WG7xxx+PX~-6E|d zTaHylH0Ib%^VQ{vV3Jl8U{OO4KiCRO^P3Z{={Kg1KBsN7+NVcLnt^yE%-L}OH8L^A zZeAR_4hxP=GSXEpR?#_~$LmR*4plB*jGoVU54=$?U>r63ClHA|C)U4Io<6%p_Hlx9 zyCkb&^)jhQ-+PU5e6=rarLN3qFT0a1O>n3cEgsf5?uaSc`QtzyzRySr0rA}W3mSxg z;-9?B|SQ8{s@v>q3{Q(+l9 zL9narFTo1qmoeMHNs8Uw2Gev;G}dr&WPT!Ky=RCFq!jIz;_=@q5XlAx$VtfT{*UcZCGK9q9*<}1lFME*#wQmLZ@Cq+xN~pyyEo3z z7$h|s`wx>J^g)_;3FtmXL&j!?PGTp+C;PLtM z#jW4IzMc2Kr(_#AB?C{Oqf93|LMfth`oESrz#S&cjLV6#V-MvSHZ(c59$5BY2dgg2 z*>_cynIDwCOVi)sz};YGpN9`!tl+flN@MLa))_*^$L=lz(-7L} zzUHf^+nEi6=?OKWNB4=bBG(50erGgD82G@W5X5TW1f7>;kXnIp}P+zT(w zuK_!7=~?#Vw#`p$7Tn(PjSF_g?&ou{{VI>@S`);a}5UQsGW(uQvA) zvhX|haE_N2^mP$@-6One@4qJj89n6RwG1|bMsa0?53kc$AOw|?FAJ+}^8g+=1wgj) z&YDkWQ7>2=<*!qqVYg@2drU6+6Nt+@a{A9*#sBAu82{VG<^SO($`RVzy`E-XT&wU; zLtbnb3ZAZjf291=xvSg%_n5S7NKQu3Nb}QL6#G2fPvw76Fz}e^(6s8%xW*ea6uN=&rj$3N5P90R_F}7#&SB zWrK}ueZo%cxDs+`Ti<+gbDN`&P3-M@-sth_XpAzH13_qR2u@+;PQk%IN_MYf+xo$J;R3c$u$gvAtMjFhn7hz!MD9Ibn0XnofHaI)^p}$K zwZVSPlzRQ6L-@R0UXj}R!h~#CTFmanZYMFFaCXit!^Fcpx|L|n{9N$&pkeMtauQe% ztsshi#)D2RS(HHWNY_^(U7}C6E&aOObHbexAYqU*Lw6^p4ue9(s6G~#MMX+i->5)n zCKir{dz3?=;co26Z+xXI<2k=P*bP5n_l^f6nf`ux5)yV^M8xTpm~=AQWWV43Y#Y{a zDk5`zLy9biS9gdB1=osr z3(1Bpdl<4X5JI{zGx9|hs>|&q3GxH%)rNq%J5CNjK4FWA8Wjd^WP-gxMEc0^YYd`v zr&>rz7fa+z;CVBn@J1etV_6 zMR2I3XN6~qQD+d5edKYXi6W$vJ;pYFC{g=#a*rD86jgLTZqmL9mQ7#Pe z_8>H*d^h)(FPkeIlY|50_d!5_0YG<6NLWO0=IG#c&!S>FBRM0(xE&O&+arlmClk6s zB_&~v$uzSbhnBI(3WNJyRsbP77>f#}<+`AmfQa3!XCTJDR}nJ_R< zmIm!$(LPLTLpl9kRm>pEbf`Q6JAsYwx28F*ik^XrMDHWpC$q*7&aInt|4U@N*9-t( zyWe=`8Y^5I5oitd&h~5^3=8@G0|j};`}xO+!l<_~*~ZDlS8xe2pNF3%dMx!X%X5Y$ z271eyXcZ+wh)tVWSxkh0JimG6x$R;FS>K-sIaA9uVQ&0~pO&6Dv6jcLxc>eO<6E0@ zaTs!jggE0v(7NgGYHk`bc3@B&U@@i*>8E<}+Mg|YOL2}DXJZIOEe(^`{`C6hRZXeg zTrYr<>Ngu7%hCR=2>_aEh1Pd>flJ#c!8~M% z`B#&Y#?ySZop-JaPruPx*<@&VEdQ-<&t0>lqC&hbw&2_bq+SnG4~~1rbIwaA>5JeJ z^}&J|hscascdDiLpC86;IXI*>Ei&(7oswv{zbNKGCNbQhGKP9mS~;99-#;r?C;!an zu%J!bYf2IQEn`KXw37b24oGSw7sJ;i=%+KAV)4@jF@mj5iU7ZmUf_$;Y4E<>2<*PU zSBE;*#?#!i>v{!Q2WrO)vI1OQPd0m9xOPVhi8?ktdP~JdIGTtJ{k3X`1vbqRVTjCF z$VQ@Ocj?AWymNS25jINil3KQvB<{jwOd4W_Tb;mw`5m8pawRuWg!USBh-foa7KN3D zo@4Hpe`5I1#&F3sCvy7N`^+D zm4(ZQ(wwl={QV+tUi`zc{H3Ty-z6^ohmqoMMb7`eqW=GFF#1oM02nujJgUFFNC$Cg z@y~y`N0NW^JA9Jfi}wDzvi|>rJMll-#JKo-J-vLBlW0C(TrvMTVUjx4g1IBvEzS9b z>6j#BhPqF0SXJt@A5c@q78i(s(0Z$WhTt_>V=6be_~eTZ+j^UPd9HW6B#rdWWcIXL z)Jci%syB(-FlqpOoEic#Lt?{*^*|$KktXm|B^#FustK8&3@x8-zv?{)A<)JOH`3YJ zX;HD}z2&bhtquFZ9fP*{ts4fkqRkldvu;My#ykIyxwkgZ6yFnfv{(j@cbEjVr2vDN z$bjBX4hC}G$Z)=Fv6}eV4Zigj>uK}_9GL6?z7#l$Ch-Yt&(x@r>sAgjFysH&tV;?a z(03egdA{{T-`Xh^n6>|cp`Cc!{kJ_cww3yqg_JRM%Z**PVf`g~6~C@A|NZPoFyk=) z2B;4p+}2SnEvcrTV{XSYdqe+WR{>j>N$s$EJ~Hwll1dE${r~a?zeVg>j}>6BDknC+ z{=?Ru*5ZE_KbQV!vrP;-kE91 z6Q7piR<$svZ%IEqE>&i0aUr~+)SU9y=9tt~NNFXt#i>r$RowSMThGN%58~;=OyK*L zJQdXCt}e>MB4e4vsm&KxxDSg4rN*4@97AK)0wrXGtkv*arr26dx>neaU}w?ujde~c zt5!^)77+T6ySX@8!+8tKJL+i(X^GUYmE%k`_|?C^us9(&GnWZ1<&_Dm2n_VCj=BZA z1C~~!VW`II1`Td{&^2sx4iF%IB&&k=d}wNFqXxjQ)v|Q2%=UGIQ+suWcGIc*UwB%} z+37vbkk38K6@o!y2SExcpcpQY%>_Y!{y zU#ZS)&923}E`f+Ia=@UH=U)-3kv`x3XHdWaeMV|!VO^j)GuN<$Pt%4l<=rAUIO)ab zu!jq(HGG{wjE#fX{7QOnrEm-i|LpRY8=4lJ(hZ!_Kup4b;jdXX#kmIf#y(t|cZcER zrSSGG9+-7ue9cDnhTVyx4h@vI7M2T**HpJHb6lXH{v_$Bcd8o#)&|IA+A^8b&*DtNHoht|7k|10JDYoRdnqA|p}tz3VJkIK=Yt*RnlD5h zSu9@x5*|lqwwS=1QEWKo7OzDW2fw31vin*0OAC)@6A3M+Fikm59P?g(e^7R81^gFp zeaioA4vYtS4Su$B&Uz`YoaPs#&3aZ?>=sXEZrMY&1bU-UKTu3C&Uc)p&$ z0VkLcmJR7K>O~h~H631To%C?NY%1M3)|{q?#UK>@26Zj%xNyp;i2TNUdkV~GX3}q+ zdCJSfFxn*JmT~T;3aV{+I!=U@_Hk{osfD%9OrFP>GvP}oZ@J2nz#RfGdq3J@{$0jM-Nn$W zB>WUV+O|+CJBm415GK)Da*)Y_6QK{L_m{crS3CdlBhzx)O2gNvB^S^$EA^`TX*~(D9O# z-ejjW`lC^bAYdp%nitj@sBZ=VSG2q4p^%VSU;p-UE}^=;ULn-mX%+6W5K67sP-@9i z91;w+7&;TIxdeqlmN~4$*zi%J0vWoz166z;4y5c+<6!>jbV^jg1W^icc@k8?$B&iL#haE42+BoIyomi6li@3Qq=!ysC!HCu$hLlF05Tonw!S$ko2(pqO!M> zG_ry`&E4Fb(~8x>*yJZ&aAWq7@q1jWrHG~_1Ez;Xd*VY)7OzyLzJ{J>hPs6uz?lnT z+?apAEI#&|6=vb#_?@kHrxSu@m;2=keyHWTb?%yiRLP8gFJbC!xcO}#9t2XaF?cc% zg-U5dg1)KYy6t+}PrUEsaI&U7rDpAyb8JVttT(MrZDB!fAS2x2>tomA1L3eSqs|h& z6jjY4#g*6uZ#{#-x1Y@WM^GV*xLUKZ4i5ZlIZ}^&$qo)bv1V*`@sf4^jY6J4DRt2? zXZI z`*`j#C9{!+c<}>KXUj=1M3wcrvw5U@3iHg~cJGjCQ_?ir8#tk%*Rt#jMj)`YwxW^R zduiETJ{JJpCpN^{S}E+G>BwPzkL;Eg<)EAsy73ne*AOWi&&?F1E}EX{{33$fQ1fU4 zB)#kS06y=DzK^fU#Z{QPW{B6uw;*W)7bw^5jN2sR$5(%Rg3$KXijLlL+`L(!eR=tN zp{K>M&!1^8O=LJfjU0SD!7wfsk@`C6o}pv@bn`|IM|5H=OdR>5I+; zoDMBIhE{R2m-_W2z>_;DOkV*%138+SW1O2ocs;l2rm=kOO{DGR!%ycAx z2m7AG*e7|dTaD|_yRNKx1@|hOD6P{*aw=d@nsZ+Mb$ZSGaZFOzRVQ$%s*?TQ+`eXi zRi0~Tq1k)8nmrs)ZMhH`Z{tE9*bt3zC%fX2;|T=tD>!$pB_3!80H{WLYye)U8j`QD zxeFhcuIQ>_wc_fE-2YP2%7T!6b@uy*EpPJdURkSqV<*lKfK-$3g~Rw zpV@DjRm;z?s#Y^K6-FMfYOhYuaX+`F#H7DDl_o;9AS7af1N|JhO%Lm&Pi3^0aKY3l z;v^A8jj{N6(Xu-f4v&9>oa;qZde;MJ=Z|OCn)*RGXXkeLGt#q=5>Y1=#Z#?lO#%98 zmfHA)c?lXrdz`PZH@9<;3S)q^F7*uE%l#}tqYogQH(4r;g*r)C%G1I{6$-!oca ziKK%aa_7cJMdkK*+}2KYrR0PF_P*0yeK1}K3z+Fey{Il@=t;E zEUYNQ4GyuNXd#x9dt6qxmI?eZ+;T~FV`#x@7F@))Zp6l8&s*D?qT?8`_J?bZ`hktlc=E%aaGxc?YNlSZqX_$_@hP9im`Z>jOAmbYVyRiW+`KD^UhStb*3DE&ju&;gq6=<9va^V+YoRkTTn(|x+mUBA zp_LgH4<@A@$#FQ`Z_zjnWjeD$3X zu7PtJv~ilJT`^2(A9r3#y*jLVH^5h#b}4rR8>1(0nh4fv zY5(lKi5Jb)IpDuXTPcwLH`)?g|5t!05-m2?5P7kTkb#NN!~DZXrvC1gzaZGn`yAAo z0#?Z#`1>CiO>F(wa2;9AueC>ZJw}Z@d)gKjlK%oX`vHi1V{fk~y4+$q1>CRtUsw>R z+=(gSK25uBBvd&B8u{p@nWV$BK5Q=qjfv<}zEG};2x4k?xcU1Vf6Hw>Og+h5xF1rs&!@ zol}he#r&ONRp$=;0PTw%|KrDx1??69kP|jlW+jv#10XxusPmOUcIIzg5>P<&r7rca zz9_V7prQHO$oI(kzk4A%`gw#>3KAf_1zhjHsEuH&+vpsi|FEG54@A@vNu53|% z!i|eG0pZvshrbjS$j8WWzV6SL)*vj2G}}~Zg5`P>Jb&K;$&K7(teMA@NVA%X4jaG^ z^xT)Jx7iuOl4`#{?-Lk4u8W5`V|pVD2qul0b?H*&w z%)$>TZc|xJ(iuahy$jKP2anbKMnqrS`u7zGAJTrT5=)d%{(;TUq&*FgUN=&{FuxIQ zl4oMfkDs*B>B0Rgj0$3m`>!f4iQ~{OLsEgs@>L_i+-5{jJFP2s`k)^bYbeppRFQ>5 z0Z#l~Zy0jxm>swuUQA-}hrwSsZ|V>>p8%mHE8aQDAI>dDt%R+(&Mi;9MAq!D_2(8% zv7*JCdYiJ%EcRGeYgpI2iz#qy=3msVg_-_QS^5q~HbNZjh$+DIk9{ovV9@`kez33J zMcYZvW1s3v-iJy|NLsL*U-zf11SlBvKcfpm2y)9k`I8eUwSK?7>q|J>*c;MY85x@C z(VJQ6nHVwB*;<TGd zlFx0t9w?iP*T@)`lzTav$=hR1jd_9sB`SgE#Uh!I{A|R@G-k787wI8!b}sclDmmZ)xVUrEw*BZ8B`Tq*z`_ZAW`$p(o2M*%Uv- zNy9=JAW4-GWOQl>X?fCqjkLDD?8y8kfWR54 znuHb^i6~2vq?#eD(jj5mxW;<%-1^&1$)35{*^HEHFgTtxHtX|RhfPp{_%QW2jYt$u zl5x<8s80E|44>yq(_T{0cxv&SKEx*R;?-AF-yd|$Sd!e@(A@Bs1>NFE zxxNHAG()i>>o#!<8>MAIAgI`xJTk1<(tiAMd|Cs9xg1NgsxiFhNw3 zZ+XMZ{S3w8g>>BE!LnoxATf;sQ{^+r3iFC4c@0dMt{Ah}Xu!TihchiG$Xoi{Z9cht ztzIH$(~!vC@@aG2&8jMzQLSLn`HlB^_J@-1d}5p`i0|ocD0FT zSP8Osy4fd(F!C_XAnCpl^;ck{qM6iI_cT@=GzKkYlvwZ|7H(*am@j^)DrJ^Q7r@?v=8#}&+WA~91IYu5w?MNy(cC#llJ z2BV56@s|@ox^;HW(}`1T;s8R1pFX$3`d$;|7RL-$`F-{IvPomSB4X0tVlc#6He^=o z**OH|+8HO?ijdOJP;~*?@kB|o6T<(k;7@vD7_0m0>rr&&>b~&s51+O{ye@THTDbyz z7HzdFe@+p5SukGRol>^oQpv?M-f|tN_+ZYvu?%b z&^I*Y+Xm6N0Xau57G{{+&nQHatFBBC+Uv5MA1aQrh8v$2DklfY?Skiu6X=l$=KfeZ zML2#bohnXaErE07aNML4B3Oe8YeIlPvB8D&`4p%AOg+x3Tud+heBQN~@9G@*LbBXA&f=cvE6;)brLDO*y^I@J?dIs{bsIPN!y1 z2kEdxHV86CdWQ7v*&#F-rKVt;<`ZTGKlDbk+9qT)D=wvEJ=T3%9}WxA=>AN})CLITr^SX+KiqOfm$f+QGPe?_T_cdeYgi^{(nef#y zf_`AFrKn@_lfERl@X~ZOUV;LrlOWC<9P$NDUjuNURYpAhD7er}eZdc6aXw{mpbvhO zzXGFx0%ZZug;*7}i(-eul?|8<3Z^fDDtSx-6Qrl&;XpD_&mn5mzkM;_DPYN zls{oW6a}F_H+H&B*NQppv3=ost+YRKN1#Y4ulr4-hib^@d^Ht-AS&e<62L~8?fWOJ z+40v@Au03E{8%o%bE4DO;?Rwj2AloyF-Cmtn%|8g(SE9NJ<9ikajOZ?G%hBt5M^`u zS2M7!c4;^A5@vCbkz@4QvLFNGA0Q5?l^sEGd<^*#F0^=_SZ)0mSG`TUjvsUqk;n0g zhWz|o>UP{?)$-y-5bg9ZN7za+q2%kD%@nZV@m7CCGV6k3ewT9>Ku!P!w@BSJ?YsEw_q(W_d5a|)a@4@597S+jIjr9qD!w;UIh z=pksi--VK;DHy&c|0CX|h44#dPqpl#brW%-v-J3Lo&`g_pm`xb}JKHxWFSaXzs z?|Hm)$d3eT6D<3EwRl5SLRBKC@hoZ(I1^qh|#%SkY60nb4f@EMHW6-1cLvrQfy0@~vJzy?n_?sx6n+xdl#ihn9 zepqfRD5mh2G(ue&g2oNP@g0MeCsay^O0OCfD6{WSFB96WMyFHYL*SaGj}py~c|P3^%!XWv@6g2=-#4XG!91|!x#DgZhnXCIYh zaSTzUMy)B6Q|JQ(;;HvZk#5vwIo~y6L=NS&X&!P+@V(-d@1SAQ^nOi$9%hTdLb(FD zv?i4Tj1h>T+J5a=RYsg|D#puRS(>}o9FC3B&WSAqW?AwWhd1jt zA~byrNaRah&P1uwzAS`uG_RS0Zz=Gu;}VukTXmcaDpuZ`pDUT+ zeX3RNa`5EBiAc!$Fq>$h(ldR7Q%FZYoY+|%!=Q%K_QX7hhLTxp3`0AM`*d_<(Ljd7 z^C(O8;`Q7c+SC5#*qQmL)na)%|9v9zt5&Pi2V@$A`C_Fm(r?g;ZMA#^E}tNDny(WT z2|UG`!4M%iF~hz%J>&d3ZM7bm%%@SC{=K>+w%regLCp#@m=4JQz);-d^@x+LDevGX zkf$QWvsW5yPjT59#WIUSP>ouqMpZ^y(xAK}2V;fab>D5Z1vekHIs`w$y1P*%nYFVX zElbHF?$~hpzAGwWe&> zXx8@i8JFwB?i1n~7)~q2=b@z&OWBv03K-(fuAx|r5~VYTKOU_0`m-xn~JQvwmDw*9zlR?i~*L*GJsi_qyaKSlU} zMw>5C{p`ASBU6ecLriQz#%3d3tCXc-Mefznb(lpc?yXL-Ue!9^O`z55HCLhz!&zHG z^Kp=X@>+w7#((TE)q~6wf%gk0<%6LAL?`%}z25D_XZ2KhyhAjT|CGa0RVVshI3-?e z!)qayM5vYF630gyVeH{UyY={%(5#PjWSE3k9xMd3E|dtLoX&Hr=CLwfb*g4owR)p~ zi1T*Gz2PuI;VvXQSn|=r8H(SZUzXqkp%-^|uN7Z<>^Lo_uY~U{YS~Rij-uIo+cmgUCs+S)|O=H1$*i&B0qt}^|qTMUbhX+NZf9K1Qu6Ey_|$` zn}lk$d?IS#YKn(-gUEP3#M|9UXJ-!`Tekcf^gZWI*VgM&#=GSYgf?pz4w~|gGA{2< zq*94>aaG20^L~4ol7#$OZF#FtW1*mB*l=W>MOouvT$Rqwn8)@goBNPL*8ai ztDzF-bV3QX?64XVwiZ~{eo$= zacy=yJDJ)fb54@Dd!-n0i(JZdZ9O}g_0{>U8p(0$F!;)(=cjxkzkdj*TP}mmGTRt0(3XYElNSuNT&NIsc??qc zU09bA&;j!3p$(Iq5Q}9zw))CWBqbT!QGsiJG{1egefQ$JL;uq!hh}o-<8#OoZfPKR z$Q>o2l#tLe99gu_Zvt6RTd^rp6GIxgoG$|N0j)J%?sVS|q4%{r*)tdN-^PqsZVKWO*dm(K{oOfHdAX!ATuQ+QkL3zp|j`LVJj^T#EZWTl%J z?#sS>ADYpyL-+lkGiNW4UUHC)8Tp#Cn^5@ifF(@hBSQvtgMUqq7L z0q`^F0?|R1tz*-ZJ@^yqm9kA76HAL)>D2mkb~}hk+udPMAL}yCzH+T#VHj6)W}-%tf;`KO8-)9>nmHGL5G|c{ z$Ok&Cc8Bj_hTMs=L@5Zl+qgF$WQoIme3StV5U%Mg{BR{(3PGT2hK~;igUMBjc*(hC z_YpcV_o!=pfSB^Ek_)Q=?)-+#5w(&s7~92U{y+~25NpM1I=!W{Q7VbrYHQ$7(fMEK>_UjE{Kf$mcDN5Jb< zEK{a}pvEd-s+wi0jY*C9Ky1-Exy7S84GQVg!@VG@gwvh9WPY?*wH!PX8HpQy??qvE zOutDu4Ua34!F6}8CItVXKs2j+H#BA3LK?iT478W6jPSpd=ja_x>wjA zl#=PAJPv+B@x^o^4t#8U!YB2V^x3?(NeNv7S4Atfnd^ZFEj{`@FwUJ(ly6NMN_K$=Mk zYvx<))P~O24=FT$yjI#iCrRXYg;sCfRwTtDor+9LNJ1p9~}&%px4GVWWtfQ;P38Ql3(y?$rMnm6JPICY8y(1MO!$yoCpm$}h$=&Y6PB zipVwb2h@Bx^>}24O6TzNWPnMuMq5dE z6=pSLJZP^J$~jI!eU~eg&NEDs>AcV>aE%sZ@YQxOouK-|rd;;2b$l_nE3aFmy z&Tz%!Wj#zumdy!IjrVLJJsFz66><<05Jnr7f73lWZSg(E;iDCT7olLiLg zCB8eOJ_0dPTJT$TUy;UkoZ)I92_8=vhx=`N0>T()A#$Dv#&}z!*_BWgh&?ia60|r3 zdri+&i^(rI4ei|ZR?~*8BR1>xT*^(-Qc)r*JVaAwtRGqTE)SbS-+ay3Ss)VP|k9}nS_>@BnX(u za37^-ED&~evqLDS^SCC+Qh3^6ax_et|Ah#jehSOj6BqY-?@h0bpUQt|x}5!ctYs)P z;h1H4C{z8lkxAY%-Cm*{e3S#4ewr~D^Hoq>QBZJnY$fvXW}`TM*pf9c>4O)ozat6` zsNiPQG$Rz8$;wVQwQssgn|fVoNz_nUL4Fh2tw&`irCYQYc+36f6s6hY91g~45o$e3kw8Qj>cq^l%xZSyiwAX-=3eju|1R-#9E>VuV+kf z)7eZqU`$*RTDwj7`J?LOa`-X}mJ}vJMa6RZjWkPkZM==PM<|10NFmBpJw(ZrnNoAz ztR}2hI@B7PEEM_p+^gC`4pMjryXaJN|awy`S_O zUUMLF{`si;lrxc(aZi&56H_9Fr-kp+D4^T&gB6<>m(TWiQT6`b8|CgGwc^yygrhSP zS1MT%f>BQt9qTc zd3o`DAFSe0F!~tTpu7~eD^puNB=1m^8eDiTBAy-k-$8q0CH3Z-=>(`!U;PzGkqSWU z<;0+&hPs$JzFa|+);pM-eS@I*<)cAp3ctS;%BP#%Q%Mt!t@52?uQJuK;^wf2K>o8bNRa`u+g?6(aNY|By@3+t&VZ0UVlf*ryosJQ@ zKFrEho6mhgek6R@s?|YL7g0#iYW|6nF2q_c z)w%lxbzQ1h1#4prYxq~)xJC@O5(bbxE&gA_%o+ojOw~GHkhdS=8d6ZgY0S|fO z2_gNf(-+I3%UAM<4YPR<^ihv-`jY_}+jJjA#?7Z%#UwsIG;hW&+G3AvfaW{gY`aAqm3XOdBb(Iab5@rI> zQDN|}J`>D*prHi*@!94JH$1N3N)_!jxBR~{t&TVcWHf)c9UeK)Zm%ouTyp3&^+8VKW0sm@k}d(;x*% z?qLCuE8Tt>s$O267TPXcm$m3fd;$z^W6Oi=E6%qML4B?~18bcU#8KL!K3P?^CeQS% zkbZ**_rC)!^~7Axj%v+DSgkQZU-S)Pi12)2zzi^gsRq$^w!ze}A&Pd-!r<>Ab{oCc z^9hpcOVQDR9!420Y70LRfoUm=8x2C#)*# zuHWiUQHeu%HP9QvzvX5wGwB=fRrQ;2Z@D03%cdJ^enk}$5!7GX!L3i7?8LYDhWG-` ztX6+-Gx#e93KT*=W^?m-){5&amCHTl%=Y537uJ9XhKxF2e=!#iI+D&x`QmEe*(dT- z`*wg{DE`;)!~Ml`AW#D^;P#(o_&f2Wq~*hbVChe4$NaBJA4 zU;F31-`Ws|i;+N{Y;gWV3`5^fOmgk&B4k_?Ge(U}N~7hxm4Tx~hr9QxBs``5k-!^1 zFyEMxi>I(B*`U+H#PN%)qo2xQl|Gw#kJ=TV%}L@w_P~e#Crr-`(4kxz2eZG)?t@(D zz>d${M@Ol6ZuR;!KH;!fbv(n{d?Pan20Hxi_Vc!7Jm*@i_Af&%&v{pup`_H+_U|8F z`=?SYZnPN42^6hH9CQ(IeO+Or?TC4KzJJ1E^^&NlfL^XSQ_01A>?6S zAuI2HYqK^jB`c`U-6J8FHg^gmf?jJ5sl5*0vsasnae2Y9+>h5enNyZpw(OQ$KO5DM ze>1=BbTi=VrXD-SHo64;Ts}DMjsgRF-<}NwKf+?F0d7T0;`T%gcxu8Y#A6Ub^$gRof+8lEa2n1Dl!tbs=3JCW#qPuU$tD?h>PJH`H2( zcr+0v#;k0!X?lL6hQ)0(PK(A}7Ap5*XY~Z=pDv#|w#;k!%U{K{<&UD)wZ0vGtPu$M z`TkCyLWuSnzdHlsoNt6KV%uZsurS2NZHgx!O`)5?;4eG4jW~g3H_jox(UqV@w#`K_ zamU(tH*|fil0zLUH9Dmv)UA7Vd@(j6vK*V8O;BVPpjvW<(Ea|t z@*J^2!V_Mw8kF_5K~A#v=nM`=z-6tsgsaBYm*Xu8Rf0cvA;>cPOIqGi%F0z`e>Q2sFX@ zrgJC-A3bJr$Xn8|$kNnNg6USi4tgK4#0>?yGCv8Y-^B7)Wp;`8dG!o9(zf+*^IeHT z;7B`Y@Vess#+&2kwj3V#E3r?f>sj4rXIftvl*pcGpGt1UjX?!5jj`jF0sM1T4Vn9S zni_S@6v5ecV3MqiQY21=%KJ9t$ASsvyyc%`7Q53!ErI!sD~B!E8uiC7n1aEfm@vJk zADCk?MG=79iaIA2?jK$X868Y_^v{k@_USWaLC6WHMszKMhCFf8E>GnSfGzqAv^d4a zH#qMnINw^)JyE~`(Zt=!vImnNi6f^fmdND~+%}-zF^;v!_@_$x0%6Do znXE6{-CPbS^lJN$8<3*!i6!_;#1IR)3UiyRw2CBRQRqb{jSH2clN+M%`K3XY7>3Zq zcuTFn5RDWjEt}hQpC+E1;Su@yRaIxlQs0>rTHdBQEqMLw2>u*%+T#lq&X6xMXnPH- zL5hkQHLN_O&Jz!@=d|Z59r~m(tO(e6Ny~;xQz^?)Dd4@x{LeV$1`Y;Bf1;|qt;N=SpO-}$@aWOv2^eD05{UsyyiNJu8I8R?0U z5>C)I4f)}j<(imZLla~375Y`G#RVaeWj-D6=h5V3WIClyVVg0X-qb|1N%rfp!=74) z<_h$ Kg#F|T)HWTMvl39U*5s0>xcplk$XnHP5*V_!@aG=hwST9Fir9rW&5-!BXlxm_Md>| zI0$MhM~H#N>MEe!n5tTddxciF?BV*B#<#xJ`&chqfm9wpErufBO z2Q_*AGj7PdpvvmirNs%a$Pr>xDezdF`4*O4ZzCimA|fXIwRjdCQBG?#0TLh!m8xDr zfJuj4uG1v0Fzu2T18TeGu|a2wF8p;OZYwUCxA7`DD) zr!)1)%%FQWoIXxa!qrjd%#ocne?7kJekl&IKx9%I5UR*-_2XujlD=ae-D1dMON+)Y zG@2g6ysn{Y#I&gaONjZe(${PEB;?4=s?UmbgNtRu_H%?c!ww)(mc%^cAVGUO&W*eI zOnSD=9fSE7jCU}@wCh=H9Bv(FKZrz^qUt2(^ya%lO$?MEQit0EAcg+PunD1J$zMfJ0nPL2a*vh<)=Cuo81&u=&C5al<@ zB5k%Ls0YLrhpif&2W*EFW+iVP74$p+h#~K6Q!{T91$IrrlAg6I6tZh+diu9E;4QBI zOXUF=qEZl#Z&$9J^S_o0kiv15fupr#45bvf`YF#=lZvSuWkDn)21TcD8DFr7Xd;pX zZ)L|4N?Aq_K2%GnNSkd&YRh);K1WVEQG@zPmuJVT#p<9)Y$Ct{Y;Zu1E#e-264bdX zuSVXzL|V^=cl;fayfWy*ISDG-TxEcF0~hm#}cGrS^ZncgO}qvMf%EAFhjiZRH1UjPIsgz#_7V@__m zpl0?C5xf-dKprwwxE9+Eq{8kG})fFLeY#@J8OoFSP)P2VbzQz6tK(HXxqsYTb zL6GA4*!&X$ojKdGFyS=sc)x{h$^ZK6*VG~>OQOCZzc6{}O0mL!>mG2#z5S?d#5mM$|)`7^p(ZZCn3fjJ#X#+`Qk zUZY90eLPn2>HfT!SVS}%T}ynx<;3!Q^n@K{Ly#9M^T>bGQkIuKU;T~9V2v$b51_we z&FcY^(FdCerrbGwiF)$s?1q8G zU2D*?!A80zhPsaagvV2c0Zo7yZnQLzs)PsrG(WD=Zl@$0?B>G0T3uPNj$O3AptB2B6_?lV(v{ z?#vj|!e5Hy? zQ_c3EU~K0cD}kQ|Kp&pxMf(;^W>(X;<|G35zj`aejZ68_04e3eEOGdP@`xiAi#L5VUQMz#HzNdM><^tky}TYo?%zI}7({^GHfPNN)yG9BwpRW|&|a~((nk&I&tQl?mB z8SA9E5AYO)#0@sV;g;$NG@zNtx1M2lXmVM~Bgf+c<}4tiq36t&Z@izm1MN3h4=Z!+ zST?62^iZSt*Y+-jo+k=O&zy52Y8|Z}PU8V$ni^#&+*VF;mjcQ}PdNgJIS)5Ss|Vb&k2vE}L3aRtZcsLH8^qV>26xiN7Qi2f_! zZm>l>L|XjvLH4Kg+6x|4fIu^N;+z1FwrQG3F!H_m$|uqCR_3Bk4x893F+KZC>T1Om zC}!iR!Vc6idk*X`)!(}=E;|0wi_6yH>f*5WICbeibWEivE-PE!@)xT2y<7RWe4M#p zSNi zMf@0|FXSW2FoflIQZPpSCm~G^;nO|5GX?b)4AH@i^y(@9YcSHUTPwH5{0kNF1&ok* z=K8-+uoq)A;&M{M{GBh*GQyfc60AP-Z~p85hipqzv>`&`^{pBC{r-QEZQ1_cWLr?W z?=w36Z?dh;ExhLUm;Zxo3t=ImAOZqX7YG0T>p!{6{~_O!E`WfLE`UO0H|BtVcsBhH z`L+|%2!Hrdz;?t9XSHN}ye57*F^64Yu4J9v%unY0hg$!)>lFebn+_`*TLfj4c0EI5 zH=B-x%J=VA8-2g7j`r{+R&xlKbJ(6X0f-egBJeub%zzL-M$6vrP^{Oce8?|6on!a3 z9jCS`H{GaKYa0RgeFtc?+oBM0JGZprA*+he)^*i0@_E#-mEGD^eMM|n)ay92Cc*!X zQt7G5?y$K?-Z=YY9xEcOq_hq>ie1+Tpqb?Tf$#sw3w?Z8&s(LT`z(DkK%Ge~G$-_uu`{CNs^mxKf9pJxly_tJT5(*MkTP@kTp1@j zSz68mmo#%4TRC~)7)4#zP5dSJ;mEvT-aceo>bFY3lsjwO%=6WRby7nbrpD{jUx12_ z{biU+dWIFA%sNH*GFJ8gDh>9^bD9lRDUepV;v#!{CqD_lmFj*zh#adt*N4Df5{d;V zU~6(IiJhFE%Yb?+6$}QQfn;NMDWT#Pm9hBu2dCaBw8O4w_e7~JFNQv&TPZ%ibP1=b zNwJc;F6(-K&!MMVsoOS?*4TbXNf%B*liCl@n!vDX(%0Y0jc!R8^4TAr@jhr>;Wgp) z%4KmiC)isttx~hBV#QhG^W}MVSZKc~G9C(5azqR#bK24OhZ;740XRSc$1))^-`!LM zbv0jFO}Qu*3job%h5C$Cjugp0n?Z%wFC8@vDN*rs`}yX-RRG=QeJ{4q zvcOB&gd`PHNY&YQ{q`D(EyxUep($aK8I&%GhkiOK95p>lws0@4A>ArSA&*W_QV_Cc znIQX)U~Z`^5w6qSj~t;65$Go$X{&>$5=uuV?}!GcCT3#2QD+6fAwFh&_LMw$Q4c9! zRoAj9Z$P(sy6Wkc5lUa1Pg`ca@Fm~7BE)qUR0_${-J=izH#SJm1T$9!{UjEJ{~+mOliZw3H_VXp)YB$Jk(($)6JP`qCYZ^(yj7_MyD+%Wje9LNP6fo=sk7 z%Kx|@4o^)6z6F8}q1SN}$IC02A>ER0dI}`YexM@q`?-2ZelemY$Kc{;Q;aks^N^1h z;k*J>K(nlw*Zzm-b6_tjoKCCP?yGF!!pNl7MHf?gyN0-l^a(02Z@)M)*KA*}fTy&F zD~wpowFv4dQbNa7sZ$c13iLN4MrHdlz3>a~<94v5IcVi6HazQH$}DBFB9UI;L*BOE>fOx;gT4=V{m}`Zhohfqb zwJTqPO9Q1}mYoPaQc>;<2o-X?;leJ7$cXk>M9QwmW13QSRfbU4m#Asm(QV;%l>0|H zlsCQHVJRs|vn16@A^Z!80K#h8L?s|CmY{l}3b&E0Wx;>p>)fM13Z|1GpwzhtYUP;|Pp zG@kWlR5TA8`!soM2>pTNIoyKbR~Wy{-i#)hR~;cHMp2P4DpTv8p2v;i5lX1o@mnKe z1C)MwYOL~RS9cM;Sj}Ix{4W_a$pFv^Q8Ec=CTRwww;PX}zk9R8n`tUT)Qoyth5l9v z%H2DS_r1sv>?Kq*vlDLFe@t+H+0H4`co1n=SnNLMz1>F2{ZIvXXftC>I=CUaD9;W`Zm=P8FM>vbj(b_x-8Pxz>G;86p znWVHfcmoDw0TCkSA<$n%qDc|%;C-X0fP0snWc-;uEqoWcaT+1Pv>W=Ft45);6nb9! zP=*%eetTL>G37AEnSaO-tK08@C8LdpnM>V=bGQS29Y=)rPQc8XMju|PyWzI_*v=lu zfqXz1eJCSSP2Jkk2kFT*67gqIn4dhjfGE1GG!WiceQPVL`!?XG1JnlrPzU?Iu@uE0 z?hE2Wm=vY_m*9qbCs1AU<0Z4hfeV8q{b=A~T9eN_@6e41>uGOMbYPEX6=Ry=gPyST zzbzH_<2qTHPtPrU##pz>@Y(2Um!xEMj#Ngbr~*-~-lb;Vc+Ot1*Zb}ap>6Yrx38xo z7iD!jg8J_}sjf%MlnE>R#%wY7CkxS1*OQ4gX9Yh&{fC*KL^0(hVHy3eX3+ zSXwy;U!WK6)zWtlp?@&7f|sH=uFn|UL`f4C|K5Z?+XCSh&5Qf`92#{Y#d(ved2>am zzFTKA8hlP6R9zLJyl2=8oJXNJEVeo!GmlEMwIP1-dRsk!TPusHjb#P^Xh_x3FMJs?+ZA$U?fv zv{*Q*`=c*#4*)xV7WJF%uQN$XZo8f+J43O)*u(s{q%@|10~6piIH#9FShP)=ZmA_| zMZw=|Q2|w;Cb_hJd|l=9{+nLE5j|bjC{4+zDrOPxjZ8aQ&E6-~xq^FVaji6sJn!Xb z3MLS_;rDYLK1oebH>u^k0A%2dpS}6P=rO1e{gaK6vQ700mJr0!Ot^2Ebz{1da^ujP z{|E19e+rMRiLfq4bdcHGb=fnQc}ZU}14>rM9)UmocdD}D{GiF2J8;rA#T#R08xtcR z5ZP!Nurt94B1^W**!6ycvD#Q59k62y{!w9mURJxr+mc7S>`^vt-GUv-ksw9~qw&|~ zcpFVk)`D)G{N$CSgf1MA?>aZ#J`&WI{}kM4ze+OOVwE3e^QRv}T?&anbh^gQ{j&Ma zDQt|_!GyFkD|4|E&Z7OENr7(GGI~J{2@ZKZ-j@fMjYS)hi$Dc8CvRejD}-f^dA5$U zomZvfp66Ff+5j;$GE4`UDn4_BawB%Bv2x%&HFjQ#8|A#1~zu5jjW z;$0OCx6XYlK14lC4JpxpqI501xX#ug2^Z^Pk-Iw!T_4Z>%`fBJHyqc(w;{-#^GE(K zEKDCp&WnAAjWQY~U4`&seUz8IT$V(bF#w-ivCWdX_m8EN3vvikIJsb0q-8n7)bIl@ z;Pms(b#hawxRCs=tCtdyvA`oGm?22W(VTW7eF5~iA$ZA zVDgWX+0X9tnqds34LSrQG0uO=(C@;#&aB1EK1sfX!e>r8gs!ndBE9W0LYAd^3BRW= z6T^lmzUf4d)MEnFr>BY*^!-QXjras|(l`^L{G6n)p=Ikvd>O^>zfC@GqrjA=O9HNQ zqz0OB2Z&lL(<^O_2}JE{yE(~Yili;4PJggJ&MmYZIcad%gFjyhfA8}OvvJ4pIOI&r z*$WyvXH!X0zdmO&sQLt`Cg3&E&;gj66=OClmTxaKM(L5X4ep75Q$KnDK`3*Am(%lV8nF#OIVR}no}58k|+@8HPn#9 zR1fSz2fQ$tDKa0(M0IbDa+`%V|hbQ#aw^#_R43?QO>C6g=@XD>fU+~i#T#O0uv_ZLqjVi zfhe&1hY$YAO=jvH&vu@rmt^kPmAOO!c(by9(?V*vyY{G}eXd_GfTCmvikl=ed3Pg& z4aiqq>+Ca!@VvZ4(I_YMtC9|W0nE_}^kb^&{qkrxoWMflR0W~In}^}x%*=9X?m0!L zdPoI?%bi1w6KjMCHgb{kIL!mq$5X}#;|)GmzxAESp*M$5i2v?0tPg8DEZvD{g$|UG z9)Wsj(n%Zv(Ya>oua=V#*+L1M3fxYL7Ux#W0iDSw=U|bId^=OqPnVyrY3?E2ibwhr z%BSOATq$S$Nr^%pqU*txi&o9}&UEZ^Tq%Ng+OX>qcynlYK!i7d%O32`W70Yc{vau; zY9bd^y@e$v>6;nRQ(KprDVAbzBoUy9#U(GA4yBv{s6#lPPn}`D%{+sAA;UWrFiIE+ zr(ffTY}`ULE|_wW!Lf)^s}4Z^y~f{tb~?^^xr+3l62KKgG~s2Xb2{T9!G>w&JS{3Dy>~AbGhEt#uh(8@V>B% z6!MxD#j|LJz{+M0mQo~xE%d!4OK_8T(4s!N16TyUgP6HCwqTw!a8=kpM^@N=OuPu_6aqeMK zZ#E|a>A0LJRbwTnn*)j(E*|jN4ok_b)*2zz_lQn2XWPw73L*7xwX(vRHpWS1M<)d%mZdAqTl-UiKcIB-0S%$v{`-yF(w5wx^) z^)xG*+k4{D2J-~NpRh@({JW3ZW$_e4r+?h8Pf?(?_m{a2GHqrAwa_8Mib^@VWr+3M zRKpnYaY9;rgi__faA{r*ci;8N}q=qk~SHM49ev_p(T+{b_5dk1G zxHfv6Mj~egXf#J`&W*-3a>gCo_Je2a-#GtzUgjcy`TI+>N+Ho0A=S@s_>jkmt;alz z5w4&Gw{T`3Zjrrfz`ST1m84Er@i7^#f@4=R)v*G3s#UOp93!`$MDyS(_4VI<4l6FC z+OFTEndN(mW&cAvKq?gXPdYD-_u3@vlV0`vZ$$}5E=a~`f+Cg)QUpduJ#-A(v*kjk zLpQ)87^KGD;Xi$yNN{OMs^X&2E}<1i%0PLCKn}S>Gp>{=zLKqCum|U)B>c+ZF0=_hYgN_Gk!&Lq z(YDJw4$o@nVKNZ*sUCgGY4hAU(~tJw7aS@Pjd*a%YetC{PQ`vZJf9YoPHFlW9&%yK z$_?KYkH59?ZT<$O7CeV?Xs)xpaJ2%@WMG4qP*{sx7@&^6rsv@K4ruhf{69~m5cqqD zvTFQ}!P9djWgj5JqMotee zVE6G62mTM@5mD~a{t>3>u2)~C4nZCFiL)*2oba00i>LMDjP-T6>V;ppjkT;a2)ugO z5N{cvueiD_rj5<;rn|ws|A2wt2{c!AGjPbL&QGu+UD7Q)pj+xN zx#?Hr)Q}DK<$lX)35@wEulRK=<-feIs_>!Y8S+Ntdmuj+xjQ%D>C-3cnHuCUUzB$w zKV6_@cHq4&-c}J6==oNfm~7m+Sv7~}`t4ADbwW!a$HM<1Y5xl^_p`Msz(m+&CxZS* zrkv3HR}gJIllwp?&0>%V+F|xis%$04LW@g+xQ(xk+p8TR=}Z+<|DKVgmuM>}Z^+b$ zhp$eBu${KIz6-m80R;ap6HR zvXI|ZRrtq=0()(+ctelyU7qoOmmKj#Ds&lEJ`6azCi(9K;i<=Y21>mLMkpwRXGdGQ05)&9lniV>MkfttdE{f^b9!b8U4=8Q^SAL zZs$)~aBMF_%dEy0pS9&Z>duv%hK%Z4T#*A%p)LeiZ?Dmf32$S&W3F8*1MWWo+Y}xg zXBba2DmOp)4D(X!ulc)`jU|J*BAasax$4dnw>MFLlm4SJpnSS~9@)3tKzhx#4iOwP-WY+d52#U>a zZ$`bPhQ!F52+`WfyGGaGdeZeAW1lW}t2`|{&sD33Y-=n$7sYHd9s^NtzDvtA_=PD& z**|CBWWICqz%JP%+~#48hb@iw$LwfD^4*>D2mPd@hXbbl@+;zvb;+UyqsRKOKE8_x zD**98-lLdA)rzO$Y)N}OmP+?%DC+<*0;9gCcF8Wr*{y3lHj`Q=L^go`Wi z3^}zZI12$siP?jk+3oAhd}+iC3P*2R8qz|l1ScIX{jU`>tgty18;5~#>r6jN)jRr4 zt0V@?888_ag9=e6li7A9fo%ES=3qK{M$CIGCRsDz14O(>?29&9|tg<>j=Kb<~ z1XMq7+l3W^;w=lXOce!01UF?~UCVV`X2|}|xvJjcbhL|aV_d6=lV-vJsKA|a&Q13D ze!>}K(lEQ9;ZrPGX)!DHw)cl-{aj3V&3-ERIF22FdH6ldY`njIJJ&H$s261la$y{p zn>ES_(d&(-=cxxMKBT`nF=Yf^QSZhM)HRmG5g5pm27Lr5$#i^X`xr=33$~?k8P^f^ zs-NOn6Nc2isoA7I1-EYsk>+^`Io!_19}YPg_S@WeM6z{*op2dVQQSIsyNQ#G?x{w}Jq*R!E0Gd~83_7OG-&$(CSUjtpY z*D}?hYs{&zVYx*^)Qghu4m3jEN9i+0Y?O%c+Fc?0o()*t&Tbbyr|L8DpQ5dzTCihbF6e9H9e5StRl$p`Lay0y)7bc*{`FroUv8=(L zRak;V_d^(d6Xzpe%sh9Oy)qNYI83~bim)2vtjYu_rG@a^A`~0qUC%Lh38p5VEFARd zyq6^+%VeOL4;Mr^>wHQWFIg1D3aOGRFWqlxgH1IUAbm(K9grGG~ej&7UJ$#3e_1X!2zay}E--*&=zHrC83rm?&${Q}!=0ulwwz51Kde5Of(g ztu5v8oFhVkwjHP?`Q<=@vmSNf5I>NPQSt|Y5x z^O;OZDtB%kpcq~pZHo74*g1dlHo-7`_xQc5;$T#~THtx`@k-L`Lga=PN6yo~5FgtD z$KyAZ)6RS%&o^^_0A#33r(D|BAo)#k3|}ge$>%<0UUQ~2T&*RQ1d1k%IK$}{=ih6K zYc~hZyk_lxo`0HZlYq%SEJ_Vgt6HorI|+xmAU#-s)DLfyVa7 zWV5HowxTq>%fqcX_d%Bx!^fTHs}3A}&xYVUFcoyhI5^LUZ!!HwWiq_-b|2{ zn5+~RmNKLHfZ5hRH+ApD2uvy48Ix>$?h9GVLUiA-+m^W2sZ5(oo7a%d$S79^06e(Q zr6Q4g>}%uwSlDwJWO#+Ihld@X!M|+rnO2-iMg?*vy2)Urh3uLN*VdyC({q&L&|@{F zT^Fx7G1*ywgcFzS4Bs}G6$o*4O;fx1Qp1#3(76qo$gr4yxy*aZoh?W*KdzSts_PQH z^wX#+*_?h+O+q0Xf7MsRAiUdotL$AsQX)qyhBGgD8e3t+Oe6DJujW1+7>nG|V=ZGQ zr3rf7sSd!BPdm>;hg#2lJLr}_-xTZ3uA3#fh3%=U%6C?gg{?8=1)JYNSVQG2x*PJT zO({MC4DE8}>}#qGT#MiiDFMXV&EO45XcZ-WI?i9w(~S`*wmd2aWMgjE`{zy9izBR> zw=XDm?RbC%Ahp!cp#l z3SwKoM%L)UojM1i6xg_?g=ia4RVC)i60C%v=Dsy&=KLF;yj_vBhkDHgJ;Ga zFN(bN!hJZJF}W78M3{GXla=z22L>L81+hIkVEn7(-^oNQEcV(2R2OnGGGg8dg!zE@ z+wM~p3`p7;WNNFd`xy5(wx_1-W@$J&Ts=7FCsB(x{Hmy{;`i*~q9fizzjw~GUGSAu zhX^@4)wLuF{5a&4!sQ*B!gPwMi)9F;HYZwvhQeI>_%B8SP4_SVcaTushXU%Ncua3W zX7(Q<_b~M<9Vb3I+YZps%hx}*^ZrX!b4i&j4Gfu>btFkO_2UBlHX2v+7qjLt-t&R1 z@+Kt=D(gB?(Al^hj{U+!0N`I;xtx z>()5ULuGTi)(NJWK3(UyPt;i7MzW=L0n)Ax_76>F`?Fr#Mpj6)Ie0a-Oa=xrelKTV zM{*eP?ua$5l!%uJ%3%fJH~mp*h$bpq-STPAL*!?&JS`TN57G3Jc3`%BtcV<-8OT{o z;V_P6yr}wzzed2h?C+rx&~INoV#rQ^CuU;l2|O)Qq9jbP$~K>%1I+h0*B6UQ*YoFT zMYRZIY3h(F-LbzMKW;-Y)(Mf1;kE%8fiS4#aS-m%cW-MG-gv6o5=7`;OrO}lsDNh! z4LMpyx@tOSRJEBH&w~>IVRGjt>*p@jle_T3I2sNvJZnC+$Wmv7>J}AwNFjC9V&TtT zaBYWid9}>*{H@))cg;(mPy}Nof!{VaOqR{B6)4U0$4|Yt1a}h$a-yyiVkYQ54bUdf zqPeH)&GmcXB^~RQn)`p`HPpJw3|~b=C^3%;X1&2Ukhh8Wn1dpJJq9vT!OvVjI5P6N z9=}48pmnc!VQS!eCEllPj#IPpJ8w~Cq;?qXO@RjU40HvD21HKF3Gs_epKNP*(x~Zl zyS>7!$V34AZ{aULfA$tFK%#4=#Tlv{YEe}&Wi^hHKPY}A{UKmlR(U@Ohx5W&?|vNw z1W(Qf`q603|8cSjSc-WC5F@mO4O1@G_#i@1XgehsGS&E5WqOyG1%ZecL@c@d(6|)( z?T=zp-EGhOYHVlFIe4D0JkZBL2SDoIo!tlm#maI%?ozFAX#TivZD?y50#7i?{dd1H z^k+d!B3JC1QLfQ0?AdfGr+>-3CT#>756Q!2zH0m`JExjEk& z>ov36hw;Pl`r531Yoj}YJi!6+xi;^h8Rc~xHG)mvVT5|N8M}94wuQQT*`w4^`s$Z8cGKcF@G>3jX42 zb*B$A#n@j@5Duk(hRVVf+}SN`PbFB3aif^Fu@RXp9(Ggv{c0^_($sL&WjwBvRY0l0K^`4|{iZ+xYDT zN*slUF-&f05A)r3LiXz!qtWPRDX>pwKAlstYD{>UeyGp~x8h^C6fa>d5uYQy{wIFc zTQ|lG56+e5j=*h&9PL_p5LgAu7uAU>*SJ{gStJID*vpj#*JCghu?9-l)j*LooABR>ED7kqBB7{Lc#bc{w2hU=^#tTU)>o`wTABUvHV%xbHovk1*vS zVydl}Ou(>2C`H;WOAxzM5I;^S<_KMAZ@zSQ!D4rz6pcNe?WV%{1||rEVjLGuGAO=< z>9_yu=Y8Z>-UArdd&E@MZ~~%)UcIUVyDv*uGEoVoGiD-lS;NQ-xE+aq6%nciDr0`Yu&MCN{wUGO8d&b)w^N%H!J;wx$-aH!3 z7EfH>JPnKtpS=b(=_lCdhQrK%H8BHB3s8EF7!$AN&H!b#JM$ztGN}3zq8i&GnVVwb zE(Y$7&ehXWAu$KeKi(wNn6p}r8l8J(6Dujjx%9pyOIB3&hB4Q*)ZaOhM14eZqY(-m z7O3z47(Q`X`pc~~+ke3DE_INeWH}Q3E#E_6$49xRCcp1_y5`cWq+pLvwO)pAg?Lr# zU!)*eg0)UdrXV@@t2Mr!#A!un4>=_tV?Qa?VzRzgHGM*qo@qB}+T4lbM)u13d)L-s zK;*<3s)vZ44#l|>(>h~*nA|_kq6A)5lnU;awB$*YiOrFxteUmsBgchUer2q16@$Q~ zC#g`drndfR;iim_^ZjHhuAO&u?s&4o!vr^6R709J4vO%CI@u=VSQ(InztPcgv@@Ix zw&nBh_gA13V@Ulb==3f&HLzBj7Xcr#?D&g;E%Z&KJ}1yvb$6`%)IQr4t{3gUfw`OC z+RJoGc8?O};mCHO>a3$t{9!)%9JofFi&3SyB$a-hg7b_Xxyf`kG~Y0N^x)YFsYnMi zWtVZU0ciikBU9-pm~*~YfOuMhcv{g$`+Rw`d;FE4V5oLNmJ_+(rp=IQG8}uc+GH~v zOGrygTU4-TSUqOkM0un^7*~!#dq1az?f-+Do-!{_w}jUbs8_^ea2mU1M#-+Zn}O-bCr>RoaU*3WUzU_CZnCymwx90it{5!*j7E1)AXoUoNxu~QjK#z?bEFee6 z*0@*Xx)2d9{Y!oBx_|RM!s{-CBq%SF>D;IPAr4>^z|g`{OtLfI7k{;rx4_2#Rg^}p#WhkzK$gQUA^^2uKB za3`UK1l~#aW0-h+$TkIEgbOa`32?cix9a(UBFABEC;oHZ0F^)Lv3{T0o5N#HSnCAI zPkonF0;xdhon!Er^D)F`-7EvHcw&Ml@FyUhcKO8)RsG4bhfYLq`W zzKa!i_9S7N5~L~vB4phJUuzSNR?L1_@S~}jxU6jtc~!llro4pB zg=mGl*KIJL$mVhGNgYdL-pe05D2um#VLf;;-L%qdQ>;mzR?h3+Dbd>y@Gr9$Z;3voO`v(jw+|1lf5yUomM} zyP*N43j-Oc#CI#xch~lj)4H+%fAn(1|8N`7;^0|da+5wk@ZpG_65c!S4O&)abzffb zv=Clj;KX)uWy`Ex3(#Zy+tb~IaO!3yknT$*6_SNAyFG7*Hu!4i{X73;+u#*ZyPKq$ zWbV6q(y%@VCRA7s?gGQJ<#(TVu0y`wZZY6hv}!JIU+SN~&$a|nmj%k#-;JK2;-}4@ z-O1C_-$UGjvUA=ybEO+*_!`NHD?4y{ zVbq0s@Z0$7TK0tTffCUw`*PNpT!u@_pMgfC#Yiy6`($qn#4GLBHfeC+&7Bj7bR{na z%iRI`z5(`NUJl1I_}uOF^avJUIE#p5wKO$zd0pWkz!kH(RrK`aRR*n_a(SGg*d-CZ zuZYm@&`y6CJiJ4@2@HYr#p})o^eN^kCy&eV{mESTv~vuyec@J7A!ds~Fq&{~PBMe? z5<*xMj*;W;&hH3B!{nFlAiacy)^No7Z?XW#tC45yw0KGN0-tMp2M@Kr*2UJx-7IpG za#^xh>?;YA5PVmXgND7{HW^V&=V{wA^t5eM?0L~F7_5oY96vP}h=QZ&FC-r}W^e%7 z4A!?30!VMB`lR29Mblc^XWg3C8^AA*+sS1lyG`zB+>qTN*HD|=VRPN{&JzsSu1|SA z>+o2Wp~b8ZbX}R?SS;6tD|Mh{{V9)hy9z~PP{5qC{~)a>RsA4eWw~87&L0aEIh*F! zvpX2orYCNY=NHVw!V-nWSfGB;;dyt>1e+I7 z0bRL94`qrCA2dFu(SzJp*VM#vAuRqt2^cgE^vI`gJg~!cY-`ks5mlko8pTT12} zc{mJo6|BsENuJHsNKJlG-CpOdoH$I#Ts4qU8`{3wNwGMKEJBYtj~*;MzsxNbT(zLQ z*sJZ-%YkK0rRL@nOm?-izipVU2&9?!|Ero(l1&V?c|-sSpmIsqLo@^ zu#J2pYKtrHt8mAXPnzRtdvVA)yy0w$$ew#j(t&egxdj!}Cq^k&I7iETyn_8u1Mgjy zQxMY2Lwb_eG?%|ocj(Br-~+*YFWZjCSF)ruO@@JKN-)nL{s5*4D@Bvb%xpxf&{?)M z^26IbkP{x8X?${Wv-LOmZtoPm7O<$O$m0ZBztL`u^Hg0@5=wOdHAXV%n!DclNbz{6 zql2IB{c@w7_O6LY`jiP<>6bhuq_FME3A)wsI><4q|=24FHwAy zhSSI&ITn`K`C(KPc$aEDPrUgHKi$RT4dw;on|A9_q_(?b1XO3N#Q9g;r+u@rBp?h| z5o68Lton~EcIQ6|cgKnrN*huD+x)OHU|$yInL`#(RF&du<}@qZ$^SqWw|$Ghr(Oh8 z$`FXx4kqq6<4jeoas0}g+#lOp229sA*8KOn-HvC2d*8U=NBYEG%SLAAIzdLQZ_3XD ziwbw97KF$dE()Bci&6($5>}n_~4ViwH$!?UL+t?ycCh=z8J`ZXOCAkce;aI*~1~ zH(Gq>R_c6oGWzSTzB0KaYfTsYhae$mJE24Xx~2QiMIr|Lb_OjV*VRTR_NqhgAIMrB z9s;CjCGn7{AZX-2I?qU73N#pf=L7CW52p*#_MP~xa8f8gt2K`f5C8bJLfHQzc?E{<4{c;6COl@LY;HpAR35B=$}ca!ps z_Ap{WaY+<}gBn^WB3&7Jz9)Kqj>|{`diMmkpmfJ&6LP+lPD!laEst&!a4x60&?-Y^ z<{vn%=g*r?5hxt}=##`fF?G7B`qEJjIMMV;(U01&BD*d%W!EVHd@L+@?p$~uWwL$M zIl<2R%H}pf0@D1j%Akx>l9E^kY@xJ&^9xN}TZ`K!K8oFL8PSf%h(qtP0BHc_ z2BZCQb~9Rr{nLt5-Q>9o&p7AU!?{z_it+Dsx2wRJV*s&bQha>C)eqWV)_sW(k&%(I zva*g4GTZ3Ql;i3}$B-U0DYCS$q(0>L&fNMzSnxsZCswH6?7TXWnf1PDw@XsS?Pn`2 zhZ*F>js8OLdzp0%FN_m>{wDhw&73)Z!Ja*P&sz8T;kxk!^fKcqme*AEP6&;j~ z@(P`P(mE9`nB_p3*)GyM>t>c_onmrJ0WFS zIZzAh@ow0plfO%^-FIj#s8G8eZ^l$5oDqzW?thLSv491Wv&Bn=3G0m;4yb$hQ9Yg{ z*P%68a#0m^i_<6s8_5%7g)tSKcR}Ajp54D@=Rupsam3wIkSl>{@?LkVlT}f4+$wv$zqa3uL!a&kZRL+@Gy=Y{|sDwr3o;dA!a}S%gTySX(JQ3e(XN{cLgEkw? z9?ms@NhfpCG)O7z9~J0p_bOr}f^@-eIhZF~W*i4}5x(Gn>l3$qf8+kc7m%B-y&5VV z<97WcQSnCrq6oT5^jr;)%9U5T3$pR}rRT%?^PLkumNt<^v?txn{ST7*cibkfrYr6Y zo+IYvOY!XH)$1YY-I&nn$(gi^E1JBdzJF9*jU_p z?`|A5^P7xHh=F$*e^&^dMS`yvZV{pKz-%imaN@|HGH;5&O(F|79j$8c@fP;ioj#yf z-w#Yqh|tQOhjrg;J8_}FH1wu~wuF*yI7RpEIQ9`2*6$bPE-JiU zIOloUQnrd!*)Jz*#7pC6OR!6r30fS3E~%@LGPHT`f<6Sga#@^~7Nyi?mar-&8(57i zSG7uKGKwU>X`rc{0TrB2;I7L+!SX0iTE!rgC0fvWL3v+1wuzyA>akaJr)m8O_q zs?u_Z%O`9kO!$l3XWw!eMphc6+KK zsGyGY(M`$Ur%1(|Wb4PeQ;4j)iTSzL=?ub(UAfgaT6cRiRs`@1q<%{B)UjqXfBEav zntCAPYmF&H^*Kbc&^AP2CX0n}*YizR&^m z-x1*ncaoefw!9gOp=b9Jkjlf?*E#RJ1uJ>xQyPYMys1@UDTwV%FVB)!6H(*^T!Uz0 zV?Xl+WpWD0_Q81Y$N-(pEkf6(oR1{hq>C|4f

4Xvw-evBZa%?Vm1Ljgx^-XO{IHQdbA~vMT}hH2r)ROQy7Lz+wg^;{jB( z&4#n5hbK;wCGI|5B#XD72hocT^#Zu##j0>aJ;aa&B}eqDZ=<>D9|DS+hqc|BGl)g= z=Lnx@^D0j;@)QM-nXz{9^+dI`;`Z-r;}!~C58(QZq13i3Rik4)>l9k^R@|qDKN}icmU~Lu{>Wouo)$4xy6Pw@ zxoNp;i@@IlkIVXJGst(LkSX6hi$1f#^Ezf%uY_EUM!AC?O-?Iys!WlNPy1o=iL6`u z%>JMD{>JQ#Z->1F&kJ$j+nYBM^sM4t&`=Oguz>{pJ2BlCJ=IEehm$#S%W62oKZjfL zU$4^B(vG8%K4Cl#U%i~nrInzRa0tlVk9oe*DSkDZzBt}o*A6Q4Wr$STyHX;wn~k*| z_{mbF%TvMd%?KlF4_zg_H}|DvT`<=4LK3R=9On+VwE}Cs)la%_Dwqa`J_3lk$%Mt9 zKs#^=XJnL6QUv(=s2%l2eA+q@SNi}V!u17Y(3AvL)@x!BkQdU2-#uz2O(xc*h zxQ*uo*0G7;r_Y^c?sz1zVAEX%8K4|uyDyTfaMAD!WAb-FKRD|f3|e^YsY$=?7nWN% z4KR3&4ZOwk65uRY{0VTB&lf%x^Rf6H3P=Pm8hu)7Zj97JY^+HK#)i^DJSVVmu7G*G zX*wvy$ISk{TDghDN-+=hE-zjMzx|f0lhpUVV=V8M9h2!`OL`YFOl`K0r9c%{zdM05 z+6pfwD=W*G&7C{JW5LXoObhNCjO!LB~hM2!mpJ-RPOj$e}OnR)moCZ%$LPA1Hs-m=X#+-R7GjW_>0bEv6 zvfW`%)Y{tG!Qt1spqsJrc z*oKDCV={!Naw{93jf0Z8_HKx`3gzPm!egxL2*!(FI@kJ$*ieE9+?Mr77zorr!$uW( zoar_IG-?B5@fb#hK5NPpHG+_L4o6 zPXfQ!@#!S4x#$k@knV=_c53W@A0`9OSP=qVMMxA`Q(N2?$+}!lTcUO{_b_mSB4TcD z-HAVl@?-p!e;zS^q?}S<9Jo`~_|rtifVeYJxC~y)LuX}I>sBut?Lu_9F1J~GGBe8H zUp&6Iyfhn>kW2WseG@2iXBc;qi(F` zysh^^@oZ(L>TEySmW-|&;(C}tLeqkR)v2~rlWCjyn|vy>xWt)SAX)I@=)4*hq%;82 zh5GBM#>Wj4;k(Cmkja>-fqW|p#{Ij`Km@s_Sk)+~5vPiUG1*~smIfy=D?e;JN}t?$ zam3dkdAfQk6pTo}vqT9QC8#eMu)a@h`w?)WTW^DX7B(58*|2xvv7en&GbtUEe@JCT z;FLL56*dIXv4#52$3eAe@}!6`1G?u<3G2dcO1dlAKrh1ZUMrPSd6}CFTlEX|h7YI? z{#b}T7}qxZrE&t^MXQZLS_-}~u_o2Gv|HrE^GG2C<|%ovrAind!ih*|y`z;ds>iat z4v03cbj2w0hMNHGyzDE36PYI|+H;RyG*Hxz? z#4&QPxN<>~o40O!k|OW-bW*^o7O)mtV(|a&&clVy@tD<(|6)1cw|0aAi0#dSw!YPN z91Z~_&X4!>nI3VEv#tMNt-BXZ$IF@Ta1;d1{+clIEQRGxvp`6K5v@CY)6;QbRm*-o zAb$elt<5X3gQ|F4x(1D_S?nK(GqGf6jH;QNxI@r}r3T91nGWK=!AuoN#^_0Hxl|V_ zTR#~XSRe_7DA{<0%MOVfym?gL_tL$59cS=(Ff?aje^77tUZMtlGeQ9oCfn19J%2dH z8hYD1gRNJYq=E-@7CiLtRSn9w^{7@_NQusA^w`oSU|Y+*$tu&EL&}7g^6L0hK>Opi5r>{rinzjr z#E{(4UcXXJAC#{`9J}R-)v4*A*Gn?vmo^XK+vK8iaG{i|>Y&PS4Qlv`h+~}hVd`X` zz4FTIxu1lU`^CBZiX;AVbfK&`@zM~soXz9S{@_@od=5{oI$D>&kH)23_fFxkEN6>!Is)-|^F9+93^&aTCm-kGuOpFG)R#UiI`jP7Cd<9O8>za3}ANE373 zh1Z+Ik}&ct@hR3kC5;(1z`+9K|Mr_DZhL)T+CO`D`%~`2w(b-0ez-zC8)_u8w+LR_ z6B1}*pj{*rwrXgBrBlbyU}P}A9zkX&%~KOfP!i4`#;AVS_H6~N(L_Z1E+TNe~bv;`>gZ) zwr%F5B&Z^zr5sVIeCXfHNzb}Dtz=H?h>ekg%guD4k&=LfEEruv0ds*bg67l7G^^{s zsn&9wZMcWszlN4D0bLKBiDZZ#n>j56j)w26hWhO1AYW4_hkBTeUO{r8$UHPWdkTFl zXTq@6k+pK{z>bJRPff9pLJ!a~yb}R-fEqT=S{CNIKYyl&?^dvOiH5KD<+cm#Ta4~M zJXiLV?ae#jb-{-PmnhW4FRtl<>B07ntJqJB-)Y+w^WB24RjfK= zYx(BbF370xmMN|5n5WTjX=#@S(+L)0RWhRN6OSO9Ixp;`Cu2lnnoj+vA1DFh7L(;0 ztlj%1#*Ntf+ghD*?;QRbEB%HV_L#qxl{F>>XD(F}hYgbXb^^^U?p9K;E4dM3?}l^y z`?F&~e~n^yv@eOwWFqQF)POk%e$yzji3h_h&$OnK#@kX61>4d|ZH!_0NJz{@PdI$P zs)K#g!X59te_NnVXNb%g_N|pi-pXzQ=xR|tJdaY#JF^=$bv%$ukYX6S;$dK(`Vv!+ zu}7ja`eSAJ71FMXG|ZB~ZD_%eUTqpUTtL?Ot!hGH?5qaEynpN8TSbVm!JP~(vv5NF zFzjxhCt{6(TR#|nlsdv0S@YOv>q>T#%-85jF%=pP?P!VaMW))M4LMazf0i%zK2Sk! zr2QAJH1n^d;hSvbZ4sfh_&;A;ualTOHr&+Qf0&7xpy!Kk*`w?x%k98(^Z7v6DQ=pM z@MLr+e>`2nk3OvXOBg1>!;hZUXy2K9mxp=i`X%XZFFOyLVYjEuX{Z`g@noFDNz+-a za>T*XRo7JTUv!9Flo6vy82blk=xAsdf*)ZDahdU2Z&Ut~j5*kO9=oKvrXkIe6-Gx6 zW;RnV`tG|<@9cL!ndlTT)>YViJwot(4HNGgIJLLdy#=g~xBnrg9{JNT$jaupWZ>#m zd)b7V3H82;k|#-47?gNmP6@z<0CSp-8>5s2r*b|}AiHWHK`@r0TGpYRBVxUb1n2gA zie&F*lW2d+*Z<(ytRD}=cSz8Vmnd)0pp2u2u7*|C>h^|ds~=z7_a;{bTy`x~)Z-p-}JvSPnq zysePgF9Mc%SNfaJQO4mV@+uSzL~;S^@|JnrpQYa9Ov2A#Imlj;#wrrB@73cAkWSJm zo=dF233RhXsJ7G|#z>_ogP1tI`oop;g8ni8zGsu_4W2(`U5Be_igpwz{XcZ6J}W91jzgx%)~=j>y#af(|OIATNo9qS(PM z-P{5jflAro+wWJg!5&_^rpKEseYX;X1;!%Z_k4o)E1&Dx?C8ut@LxfL=*BYZb&~lv z4Hbk<4J?M6etVr;#P_1x&K$8rx@|tQbl59a#!a?N0o;VfdWB;kEAMto9o3Hain30k zxj{oHnB`8c`rV-31N@HLz<%(?YR8u~OU<;5-_k$f7<^Rv$`}{gKT=PQDyy0_@MCfT z+r58*c;`ioud+3+_{G`T;B`dOQ_bnjUSU8kkdhZYEa8OVg_4ghk!n``m0{fG?%SC0 zVysfoc_|*(H4Zgr)QIsx`O@>%vCZt)gw}GNt1%}2 z+1g$`d5?C}o0KFt&9Ub3-rEiOh4~IDJjDFd``q~Cxf0|bKr45C+i|zV;B0EtKj=%J zI{rF^p?6^xR9xC*+e2ls_zk9(GrSBoTE25Z4(B6kd+%3du4&Y8O{%megZsXZfqg4S zQeIk}lC@J$d=wb^=qFTMrY2+8mMgiI#}=3N4T)Ch;WETQ!BUDhW2yJ6$g_~o*ia=V z--n5bxmx`t5uNnw+Bsu~S5-M>XMMgI5+G$nsKKyI12R$h^I%4&TdHXf z4`tBrfl#phGRwbpUZMlNZ?A?f1bDSSx*e>n7yon>*-cLVfj9Q4B@r`v*t&g? z6Ev-T&`g0Zf-h-2TmP-H9DJhv{x9fYt7dv@AO&2k?vsfN{$YQcCxayhx$-jt^=>!q6NE$)3}t9l5uo*Sw8VQ5j&&RXYu*i9KV;2(qB@=6BlDOs7KtN zsf1f+YHb0Io6qD>&7cW`JVBgN+7Z~}7M|rP5>vZsZ;0!Oe=WZXI!8cu-vt={>_&oT zL4>t*P*!d@(#v-xMBR2KiufF>SyA3qP*;@uHtRv~1UjQMN5oZftGZCgqNFnDH8I@Y z!P`dnKg~-+@MwR7c$zpm5aBkWOYZ^W+3WFo-U>{_G6yonn|6lKJQHXWfJ!>rl~u0Y z70cx3HW;3qoV`iS)tACpASKuje+SBV*bt#qr(qP{l79JGsYsX3Dp9OjM~Pp7b>XW+ zao%{(COl(mjH>H~?_+N*nDV!kL1NVv>OYeP2+3B6WXP!=h+a?wl_~k(^8WhUK*R2O z9`(NGYx?G@ozPdT`~AZGL=BjyNH3J4Eo&O_BW&BGQZI&STfU_8O!ory`5aA1f#&)t z9s8WHC9*O_#0$4Bb)h>C=JXrRSLT*p{=YU?QhZS7Ja~FOr(eojSO2td*jB9$Va`-a zRsS1$=JqaGXP8YYxC zuRSW6(`+WR*I@HU3Ym^QS3QYz*}~FVH4fgR0>V#Q*8TU$XtNZhs4baHfAB>GI~$iT z5_sE9!B0o$l{T^*Z7XT|Ilc!I=x7Ce zv^+%UMEDFfi@L>D?Pg9t+JR3xc?gF^O}DK0mZ<%(IP9EAf}m&bqS?d7jLPC{$`C%8 zX$?Qce;oA*Lya?O#kHR);!PBe3b!X}Hg5MCC)kP|X3Bj`iHSWM%3t;_#LM4WY()Hw zM@F5^+*m}KRB}ZSOf1hxZd;n905n^(KRMSlQCEaLf-Q&N){cWlxHr(6fNnfeM zjgWQyS4SOQjbdh^!>A^Y8B@gQa4lB}dv2isSMVu1A0n&mYQu=7)6FlLXaMa)uni#~ z=w*1FjfSB4uV{+dQtuvU1uUoZ8xhhwRi5Wj$+>3B%YN^-Uzk%xLpsuO>;v76y91lh zYpMuNb`%%zaJ+x2V^TQR`Z-HnGg&yMKL$c7G0hW3lIrQ7R3=Q}`~ zK%hN(e@sn$Bsyx_m7b&7YON?SOg$Ai={Fs(pR&GbiQ4L(lK#@$cb{Ze?dBEJVhxaVq|%FQiRRkp>6duH6r@A-dGT+$>T#gTtpmz$Keu* zj2WiV3D25%w-l`SG$PV)SX7OSX7Hvi{KZ1Nvxx5r#fO{uy5oN*!u4cgNC)@5sP}DS z-_SEH1)~fRI(2G`&bif6+qhe*;pDsah?-05XdR;3!BCR9*f~Scsk?`vB8u3Sl>-I~ zBL-)9*J&gY1=UKCA^(KkS`@=UMaPr`R~pS(7dK^{;OBgEerj=vpv9eL20Ykjq8o~Z z0LP=caD61V@Fo2T3@)P{%PsR`fI%H)ebRpR{Wqh&BaGXf9JW;L7Fq*OwP=qhm(XH-pLZhjd$3p z(neIEs3Z_4!^yLrfPHJ|R8rTCiv#hNbPA_C+>Bpxu=x5$SRu=b@3Rg+tQsU!avt2t zNU{he$|A$3qKHvA;YELDZT-Gr&Ti?)r`CZmA|q5j?euS%bm;}3 z7E-fASl45;eMq}9b-CGD-t0P?_F+Xm-!MAP^y`103v@h4I6rh=F ze~cvY{rYtx(MXZ}0(9&iY!4tacsN-ddObc!jZj~0M&zm&>L z6Ma8Fk<9lLKx~&wT$^#ewzNx*tg?%Blq_Ih5#?)dYNc~H-`PKBT6A}OYp>Wzz+PK zz6Vvk&-{y3-8a69W{@GLy++!8E*k|fH|8E&;qJ7mHD zep@3?u0n>dmp=mDmkJS{=lLff4Ckk{qE-FwO{%Z8ygE&+*(-00tuU?9#s|p#&TtK*h53h zRD`M@ZKAdjAu&c*r@E$jk)sMhetWA{5ZYyAjadgH)#XyeVK@ixaUK6aNiQi|CSgQ* zaTRBLtRPG5B?-c9-d(q8MdvI0=iSl4v-dZbHcEOwC~-dR|3+F(L4^MEuqqJ-X_)}x z$EV;zp|biynD=zNgZBlitOE7l&)DQDi(!h!>^C=e3$-5D?=6@m4)9MgUuut+bWwW) z-_1>I&6!~>jX~J9MS-2XTZ#WRzU0WIS9%UffQ&#bmaaGiEo>5=ymCI=Qgt7p?s^G# zy$aWq^=QEJt@qGdU%GGBnZr?hNj(p0_ME-|r5e+!eOl(z(x^9tdoc+$OEpLWv-I`H zS%FI1>fcM3tN&m`Kp&F^Z3TVVmsH71P7WXr9r>chnQjYyB>z~^(mSZ;m{{aG_Zd$5 za3eUHM^@Bq#c67@al5{wLszZn*ZnSrq)JuU>Q~PM$>HknMW1?WTzTFbD=CDf=~#iXqEC10(X7ox9PR0;+*aEBLb=*8))*N)lad|-MnAWRU4>(yy!9@Ij;8 z{dPT!Dl1&-cM}S~fyjjA9y(|QCB8Mb$A2v8E0(x*ib#0GViD$W7r0w0SNlV&J>q;{ zL=TPjcsdaKvepRnSRU*-{w)GnoL$&AspnJMTSfw$z0F&u$oq$L=LLP&vIjnj(5rwyDuVzMq=|MF z?s&@I?jm3Li5Uc0o0Fb^()=^=u1Q+z;vnbO?T0&jFn}_9n?tlm zol%)!>bmiO;1Lu((?tg+Aedzz=HfoXhVuKx@ds$aSAOteYG&!xJlym!86(YA5qrvN z8pSg@mnj^vsi|c~*o9EG}Gjy(#6_XEdIOr~`< z*6Fk!CQ4~*D#aQ5TP#hUJ&bf$Aoj8ajlO+^53C{1Y`g4-V~~tZ^I7@D(|}uR(u||n z+&)xL+>D*RxINlynZzh^6eAa0l$MtcczFvh+Uw>`mVlQOFigR%sYybT!7dV3P6WWe zErtd%dfb1YrMHZ_8)%;P!M;7Fm<*#?ZDu7yHg&RTKn`_tCQ^xdGHb9PUYxe!PySa* zj|Lnr7`qK`#o6|-@TrBqELf1`DO)v3m*8iAV-{=tcFs+aZ=eQOd5m_2C#Yfo~pqNT%W&ysxpweuwl;yFm zpNL?5_JO&z>3WM2NCFdl>#xlarOU;AG)?q;UNk0()d4-TDBS4332ku1(r=qDB>e zBlPd-rpLc*6bEKQtH{YndU|`4pd3_;a;=XR2AbC!41`rUis4b|dB-F6C|6dcJB8w& zs=DQYBL2*5=2lLrZ0&@b{Pz>gOdo6#ESopIxw&#=|JKetfg@FSvt!VG6_;4P^q`Fm zM;yAEuBWv;Pq7=7R;V{j#>j&=9n*a!J~HmiAF_2^#5wb3W$%$9$`bMki#>H*ZJ>45 zlc|I|m%-?0TUFevHA_8fgzTSIDiSa-mc#T6PQkGCzI}~U zbTEnvJGX z-E#&VE?BV$(YT9)5`V0AZ>CjN$f##iK5mq4DA{sLBSC}?8GJZJdpCDX5g^WVx(Ry^ z8`O2BnwVWj>%~J5278Iu0nc_%yGT2P|4-rYFU8CUzfU&Y!{t-`+Y4)o71Up`77{gN zx34>;YR5ye;!&KHO;TMs$9L^O9$iMx6NyYyuS>nYP^9)ez>@EnzNDgdfjwp4kNTP$ zNC|VST)M=WxoN%SA^G-(3BUzK&C&w<;q!KO17KUZ=&5pETh9d(+S5uh>$}gBrxRDw zRdoFJW=1fIAvJ?Rn{H1>dk6Hnsc|e3rn87MYFxf+x@fzmMCBCDs~FAuy}zIVZJ5xn zF@L%K953(s-Gt+I>N;;=9Y6F(R<>Kpu+n1IlW!D!Wlp3*J6j6og*^BaL*q9C;dmc@Lv?759Gmwf zEXup#??uKRgx^Q|=Fv(C@2$aA%0dG90>X#G-Ettpfoa zlJ*zfWG7PdiUOvs@c^PU^qfARL5wnSbvJ?I!lpZn3S%Me+fuvzE)4$as2>*B&`6^1{(b( zITfPcHF+S#(qLF|LRj3shUm(+D7pZk0E(W7@t5Ir%s1b9tAr7FbIuD#Dfh#`!z^8r*@-e6ZR>C-^W4xVy?p41q7LDjvrJNb1Qf( z!X*ioawq-87mDDHC`@VUeX^-4`86EgI!kuK*Im-T=zjmEpCL`kLr%D)7;*F{K6oA9 z`k=8IRgfJ9nJ^cF+Af2o5G7t>j+%{BXGxuVrIo~6osV}7L)wOPwVcFI4?zCD{=K_c z-8GeqM6rZW0q8AU0_`u6S6zb|Dx7DX^XqJ;h4h@$vD!(CRu-%)D&&y>Llq%6w~ky@ zF|Ra+dZ{nQXXnwlz9J+uSIekE|Hh`37^k`Au4qe%@o9)*>BtQFH-oH99%6XvBD^V%vlbb+a%OT%N8ssfE~omWKFkZ+1x4e~i6C zYXK;*1YiHm0M?2E(^*&B4g&Hk-+Z&k&@Ak&hbTcpsUR_CY24-DzU$ySlrJ#5B|+2 zubB|{ar9Qq6gUT<3IyWu0m?JM0EVyshC96|%_kvo?AKp^GEc^gML)ICVys`kM_Wuw z09kt#LyhHzU&HFgFyfzDNwM(dj}KCzuTk+j=)-1l zMRjp@u0fu3)4UnPgkFV#t4_S`NF7@*-pnL9`5)B(k?QbXdXGt+G_(<%qFoM$=4Qkd z%&}Gqvk6Q+pLiq&{3Dm(2r89|n%mWsZ-!9^9`8%FeJW2I;zJ5lZ(n7o&eoN1@QMpv zmS;#@{>Ws4`pjM(dU6!I?Q5Q-1B>I#&_?Mjvp0)&PGwH9Mgb0mIhkyo`8m)jBVGj-3W^;9%-$fWIx zm%_U-A9No$(|vDz{mf6HpF)o({}{Xbwkw;2a@(brv_W6pq=6BuG9*I$;n``~XyN9l zxNsol^f32;hm&S!@ubXdYSjP5(?wG9^I}jRt%(}-T!rda+|}legZ%H?>FY$=`=1C7 z#NsUaW)iW_*mkl~U3S9U+!IqmMz2+qxOFwm-m;?h%5Vw(+kMlj`)_8NmL)q5a&qF4 zS*gG5&3@hKdbd?8YfjS7%kuR`sK-HXB_J_G-fsh{O05j@8GocVP+C6L!fH217N0KB za+%N9*es(1vOKc9x@EST3n`-i0ppyGzqj6lqs8|FEC~mW79JsSvy2S}art=L*y?f@ zN?~fi+SruZbX2JQ%xAw@?hNz7Bulky^xO-eP55YFf9#|z35y4&O@M0b0J}&GC(!{~ z4|@sMeNmiv)42Pnt)CuN^Zk`GZ)U8q?;p9`L+@KI=P)d;OSOP0ge{DrJ`&_9egfwt zj+Maba!$;SL90_=v3($y_?W zZX|AK(TzCB>l_fBrg{52+?>G%g`Qk4Acy-VUrn@-l@At4;3q`P2c-kPLY~$+bC76w z3;ewNVK=4m(dlGd5d{D!3d(M92Un#7kON@J52Kz>lhuN^Y-rp~9T^w&XZ~V&GM|0S zLg!YFy?c1gHYVcb6+_DW#kBpby_jLo3e1#zz$rr8mO+zL|$S3(ApDaVvlbuHifg#oOw!MsfT27}>U>S^oxlsE_V8_YH#vNd>6B~@h{e<5I zA4cNH{yMaq)GniT-^C+hLqhHx%1YIDw~HA_Q>2i$=tM>lG)SMM#fzma9hDR+TDp}> zE&EuW&oz`=NC;6h%X$D_LaG5N`(h-x&XZp= zC0!Ax=GRkn6+a7I3whM4XR%-^e_rQ2hkWyvlq9#jKgm1ZvGq6wbW?)%^=V>x6amQ1V}86D2HX_bsE!ug z;(rk4+1LebGaH%gal;0ir=YDOw>B?!UCh49d?x4VM>^fk*hFpPC!c~=BjM*Vc8jKd z&jS8Bdj0wQj;kA^@XVR>!E%{Ay85dj;q|83Gb z#uSe$wY_9t&&7bsv>0S0B+3`EM-)4M(O%%JgihRDwGL2HP!P%{Ke{qp__%A&eX|vW z?7&RkgF3Nod#=~=hK3yei_NCCL%YdE^Kr73*zsHD&DO~vwrE91RG{kQfn196U0`Ay zF~x+To6KL#lU?Ou4M>)@pkF7YR5|Py(KA2FVh2CZR$`VEorl-dgZrYs{|~gyO|(Z# zwR9ZhoFk>${UGFEo<>5p4wjfO#2n(PvWcp(((Lsd%S78qF~4Yh&_Gxsv+~2YnBj6o zPQ(M9rlP<8T;JlU#sXc%Ge8iPC6meGo7CV9Sdp?hvi%Be#}?Qg5yw?T7_!=~ zX_k#2YW{V4#?4#d^=E*Wku`R98Jwwdm?)KRrcQ?DA6{fi@7s?2<(>-b$p!CU%}?MJ z;?*oU(F|LJO4jx1uum_PUg%YvWUOnIsLM%rnQ6byzJxtXl`Cr)xuliY9X{eD)V(L{ zPF_Y4e%9{(&?=~Iemm0oO1F+Qp&a^Cnb=^6zKiVD)_iJc>@h3xofcghGgLm zs#IyPVk<>QI!V(;)~gD>d^+)-FRDX`@5_B!P5D=$oU}A>h=Vij-s?3i(hmzS1kP3DzxB4Th!fnksmh zJ*m{&>coGMlBO_7QQvijrfxIiw^%J0CU?=ESNl&FV34^vIu;uOS&kM?t!jo18SA)) zKaPkcGq)P^pgD(#$*djlfR+=-+_Y;r?S&jZJ4B=qk`Qxp>66Z$H8)a>EHElO z<|S-1ZQr6x22ya=ZhW$!&uDZn)ZFD_Bds{t`2LY6CKsCVn<<-evCh(=c*#@0^=sWk>ffQbQ zTn2pr>BcX`7knU1NK5yumJ?qhB%_8hxhcvYOnDaIDUoV;AXQ(^WZwmLzR-PY20YwK ztb|pMV%TC-^2l2@Y4~MK+2K=cxT)AS{yV%VO>1g7O=l1ROv4tvop*K~rNZXpa+M>c zYEG*(BJrSv+%b?*?U0y@Ho-)Ra$)l9J zuJ)f8w&~|%!SDpt{pH0rFio4o?vE+Hh-0Blp8g~OR2hqnRO288U?h9-P$Cw8I=vj7 z2?p{J-c9n^46M8y00jGZMf)J)$3Y6#FR131jN{F`I;)xpNt456)1m;KjiX{d9-5sp z=!mV#X}%2NT%Qy-GMSHq&_I9(=|({Cy*U2yQZQfLUUCOqmP0q4l==Oemd<~FLAB!} z$ns`jaR7{od1W(Ud$sWcW^<(cOrOmDL2|s~W4oghZYXFpcI@(1d?udSZ?EHxIi^~& z%I_>J-}O>CM+%J=p2eWYnCBlCL#Lm|_hR=~kLL=#@O%s?xRldIL77+auXmO;$7AP` z7atYn!+hu{V~eQ8tZ8|^Af~ClF0i`QZD);Bc|TD3`SBxG`TAK?Og*Eesrvmf{0Oz&t)J=g;o$D70>*!kx>=DnjZ}qZ@siA+oC@WgMBcX$g`7nl3tRW&TlClws9&=G<61)X_bEeVmI8>{rn$ zYRH*ZiRRG0K0Lp3U8rr%^cBt@sr~A~<;>i%H}a%rR?N%!>*W1lWg8J|4S0Q#qM~^H zn96WUc|40D@&0P0mzHt^kUD@&Rtq7Dlq!dZx{P*5T(5Q3i-px}j<7{h->y&M03Wa^ zNZ^C45`fh#Yy0Z*PBymKBLTXSqKeBR$8W%JuXhRIQAq$xZGkV z(pB2vAH(1{g7_F2WQSJ`G!1MH_lC+F>fJ3Exj!$k0l;-g4SqunqweR~EVKlE*l>KE zmwY&s0Wz{=gaBlFSxD|TLvDl8T-yK`8#ZQ8z%S^}^lXH&s#X%|@|gu)u)EVpS*P2oc`sJZYg4uJ(mLs7razotj>g8wftP`B(YHK|y-VV+A7dgf z896_IA@x6%+QgH_c^gp+7KrBrdwG=c>yWTiOuE%73~ojK_md#Jw4IKKGBh>SnrTmI za%HF|&!(i+=(vbqEs|}*<|c2=>qx?;LWY!$=&l-UC&w)5;Pxp){Q9wtr5;Ht5YHI* zGdvF-CULG^V(kHm`{mbT(9ZfvW@~DKF-r2FXbQthna$3|9?U0Sksi;VWPym$HQFrt z8I&O!H52MoHB7bisPYMuddrwO!LC<~2eOrq+;zg~rcb3W@A9ACk3}DRR6@&JCNIx@ zGH`kei|m#noKBKuH!~(H^*V2**yMz8N58(`=)LB=3ijMkzN+$WroOHp9n|LA8HfV#sM{=XZsmIE=~tjzQDfOT0l|7Ts+_LhK*jEt=<2*UCn+Vwv+&rAE#GBwQM+4Gt*6E)vb&{$H&Dl)rPA z8$sFI^)R7$mr{u=9Atr5ECC|-)tByAd@j|BMMVRguZq3z0$)qyazEZ5w|brrGnF+q zy)Jnc=m*w+;?k!|Q6%bgdwWcz{nGP&HreX-x&FO>GqgD?7chR1Z~p%J_<34U6Nf=C zAAw4FIw*H=G?OP(`b_Biv_o6d8932-zof?uN-S+U;Z@q6lQBG5>($r~pj*!HsqNnfv{CF)>3jbc`QQZlh)L32)LmbasDjp(S zCYQr4k(>$!x{Sf+YInVeR8q#;2WNvf@z@E$EUhQ9SeK|Bahj9?pbvp?3o2-FsLU|; zXv9FST*dS|Ne5nps|j9=`?I3)=qVJb1)vyvyWQ! zvpzr(kJmd51{JCm5%}W$_(J;o&pTm+LrS2%p^nS$*9oTS?UG9w*38LLCUY=(oh}uK z*2hh+JR0r*us?tP_>UTsptl3H{M|APel}9+I=|7J#o_y+C5!D>5Dp9lO2kwaN06n%#VQMp943QqAxuPL{OsweWpL&9 za?LNT#z5~=nO=b_7LP*^g8$7t-Su+w;$UcAj!$OeM;sCiyk{twWXRBOnE5uRqk#e8 zX=pYiM0yK~cixv{(h$L&wi^n0(Q@slEKV01bQBiojG0%s8NnR{`DCm|m=|z(;-sKK zLjjGe2v^MJ{(%TofmzSHevM)xunlm-TRJYrSbY#4#Eu84 z$TW1&*WS|LI6o|8Dwe)&==?wck)&EM`={$m*LB2~naBdsXv>Xu7Ibt?_%tl#$mqXP zd@~)5uybB_iw-5j+D@NhFLWsWbc1)guPK)hEwNA&M7IX#l5^%W?~i-z>-@XOp} zT?sIqJf4)~2Eyf_!u$VzE+QlelPx%9`;r_;5z$`A!H*hr8U;(}v5)-kDkLPNR;#pB zKUpD?4JlaAAeCOH^so6VE-(H*5_-%ox-Fxoq8`&Gru!0but4&a#mxk;?{Z*%(S6yO z{fprrEyE+WF2^l)>GUYY_k}~iipy{SDy`c+@aNjY#afu_m=ouhKRR75_{FVuHqhYf z?MD}q{!E}*STxL9XuAf}8KqT*fuScYN5fhC_dTBwVqGW+=SuZh6gZQJm2CuoHIMLFA9_Ou}@;AWQK-*ZAgUSnJ zuhb=#ouK|m*qRoAiU|GNV~RI0-T&6r)#dzYnMcgMQb+p2&r@vZ&lawVow~i`Ro#Zq z?%Q&FggHW>5*??~b0<`FU(UPF$HB3J?=a7A1?B`5iwY68a&o{?DWGns9887mZE@-@ z#4N!V!0(?a0pSmekBNE2v4bcgA~N$=c{^3_|F!oP+;t;MwD5^zW@cvQnAtHqW@e_C znVFe6=9rmdhS-kTj+vR6+5S#u=6*Aid*3g3uh%NABOUFnmQ+$ztE;=b(|R{tWk7uy zUKA7+?LeIkjf_ZdST8_bPM5ohZ6`K{-8*A|v)D4L-e>t43@hA4%VkO)L+B6$0?{L> zJ}h)}@S-t?(Gy_(s#onYp?!I_CS7Ij1FCKVnEkLeIgtQx2M{@^I+_6Q1HbnW=O5P* zH}|xQ2pm!OK}oQj0BCq|io3+;vzj&!qdvgYE<8AFmIAr4-%YczH10VbIbIjt1xZE1Ufk$QvM4)Cn6UWZx z0Z$dNcgYJHm)Ct-3U+x^0RKU|fWWg;6dE(s`v(Bm+UCpsdH@0|Hk^|L31Fbj2@LSw z%MS-Q>U$i=Wwi=wk@Q8*b{mUH?&A7rjv>||Vyk+&IQB;uaN4XF3k2PJpgw64u_!4O zZvw4_zeDI5FhykZOtJhbw;}_Zt_APoe*VNW@RpcmdQWKEbUctdp`QY@01W3-8T6;X z%%8X4fd0}>L9{UMtiwcX$efNx6xUM2=eghj2?2q}cfja-QHkQC-01T_+kAaIdDDwP zL_-6EP2fyx^OkJNcwPq(QZLc_drLR|Fe$X^LJLli=Q}C7j}@~nDc*h-6o{eT084is z*hAEz=wKACSPQ%ofY}dw2L~WAd_yqo7WnI3=i66FIJzd&aeTGZJulyE3YpCFMlU%M zpx;xNcPWx^{k~bt`r}7XH1MQCpSRZ^VKz90$Nch|?N&6i1*1P=9TZi+0_*i+-BP zC-6=8Gw_%SqFRc@Z#LFByJh%!mLSUqOfb{2<=t`pzALb}n9??^)ZzzS$JT33b+c-9 zhplWZE4B?Pv@8e{A*RJM(1$L0nni3*pp4`0&Pma6hmvrWSq@})$#Hu5i2%Twuy(%+ zF35J<#j3{uddY0S=~?B+VHP}qe$j+zPR+U20ws1XL5@n38cY;1mGH#)G zvsqu{i9}TDcAhGS*&_J>-QPQ$AR8AD$`F!JbosAEMIO-^o(5)h{#QzAQ~)>t61a^BFtt>LzX;6w+>Y~)l+uo7##Y7* ze=M2kU9BvS)un83L~uJvF7QM>Y+hs%ie=EaonfpNDeWTManGXL6~|A@P5LFgginy5 zpyUxTNMmDT!vm?ilVnjS{V$2`$B*544P}d$K+(cD;$84N-=1n%#%^$8P=cewViSu_ za-18m3FCu#@(!BumITDrg;Tb$V^79{ay#7e zg6o#VyAv60inCCFMFmBXe|U*ySuh5{Gn|DNQ1~tjzFh;2*sIVj%3Yi;E4T1XhbkYt;!M932pEsN$^sTl)S&$i( zRq_+GX`O!4n4yM%E%Xedqi8jUDtyWtF^t+Y}iLJb^KGF`iP z(YV)JSw^ZM=7=im@FDj>_|``cNW_No)uhpG05$_*@0WY0u6+w?5K2YVC%Rejo{S?( zqPV}`&r`Itq7JUI23QvIC9kA%Xy7wK(&Hy2QWgLs6d39R(Lc!4NJ>Ewc5vftv;($-y{yoLm{|?-(4Q$DKllkR0iq-^KqOAo`aWV8G+KShqsGK*0cO7Lrpwh7wQ zGEky4F6k@&mx=3IeO{exu%HaptMR20?V!#e z>W+6R*w;_;E*oZ_E1}HFZ`~3Z*pIo*2Kz_)ceA)LrYB%$(Po>S`Scrbn+xmH<*k%8 z%xhKC-B4Epdj!?q`sJ32_wtD38A;-9J;wC#lVK3zBJDngW16?B!j)ikR&20&Wozj! zCYyM`n;(G=qR;UNFY~zXh5gLzCYEfmP8o{(dJ6l+SEa(8Mu2E+u^STJkWrd>ox-WA z$1<}qKn|_2tuZwP?zYId!o9FNI#gP`A;dUSF|EQs^efEEQAOcxZy)CRf#{L>PR_Th9<1IP`sugB zK?>Onc3ym1(4Ffe=(_Zd8|rzkY-pSN(oyc&@MibVC#qK9cc=xOId+OjwS5oHT?j;v zp`)^ikjNL3-sb`>s8^GSj$;@O=IP4x8*5ymbV71N+V+jwxETA#m(BIt$3EzHw`268 z(N!lrm(4A;8hL0(#D*p`Z|j@AVuT(Dr(%kQ1vN1|!J6hSuT@a%2~w;D+&=FCfVa2z z06D4mpnn?!SxWVxGH?Lk9322a0-6UG8+#)L2V+M^b8AzFUxuJwP19zJ4c%K;?=4`% zB}PPHx^GFENdD&-YQjn0Sf0R|Sy*(Cc%Hzd-Os$YcCn^;37POg+TFgwv4N|L^JUV@ z5CVcj3%e?5)x%v22|kYDAPal##L<(POCRW99v5DcF2uPmc1eKmvG zVoMi6@2I27i4?|lK;~NH+9_fRpC1zs(ZFpG`8eUU#d~4K5`$U}Sd2as&?Nb>H0_*G zTZCsvf1&fU3;q74-@S$funSJ|3C`?rvs5lD;1!zhm@*JHF;ZU8N$EGc`bI^V(z#@? z<6Q+yD<@>7CESuCnhnnHqfqO67JgQLTBF$6V`N5k3_i3?KRbK)IQ6Zt!)t{zW&8j} zS4@N*!P`&LE&b3n?dUNT?12$> zETScfRi%vQstGt9*g;g9o~s-O;XwdMyw9Yw^$b3p4!QwL&$m8)WU^?WS+?{x<`?52 zN{b-L8b)E|<00)4qg&6-kay%4Km$%_%|m7#S?fl>!Do>%Ky^21=79vmF^0~9l#h07 zJUwu=enP*ih;64d5JE3%i??gScPO82N73!%xi&aaekm-3wTSSX2$h{D4!)wQCyv-< zB7X)-B*9Zp1HnWFg*`>6zix#p!JCrX&R)PuR_r3QCQC96p}z~^O7}5vz_ltI)9C;w zlmc`Sg=Fj}WR&x^8%R|)WD9)OoIL0Y+~}(KySpTNt^Q>1I;ZCSKaI23IXZ+P6?w#_~KI>yqQUDWq&=lYi3J(w1`Y*!^OHsRUg# zm7Uf6I918~#`ZWLy+8QFnTKOUF_b&mr=1Gt>1(;Eo6EA5X$3g^F2+O+m3IewK=#-v zrxmSdC;~(^gZ+ID!EUni&4Y=fvrd}TTTNx9@ly2KbE~F(L;28B0NIOaOHh$edh3S1 zixfp9JSJYvhT!hYnBFZb$M8OFYwCar7WeS7`fir7XYxheNQSWvLqJ_Sv+}}n_k|(; z?PYrK0J>DNpQ+@Y?~F({FZlHbF9RqUq?-#{3fnNt|0iG zIt--No`qdUgb9ttEEb<44)Hs}Yi77(N9pT52GDN(w`JQz8Dl5wHuVNfnaH@&2J z_js!K=-b_cDVZOltO6LxeS zzg;<9j-A}q;`Z@DCt&K{&T$<1JfA<=oT=u!B7I`Y#q&TV851p=Zap5q;=wc5*d4VC ztc{>N7mp{ad+w1Urb`UfQ^ujh-K9eath4Ki)cGZxDH9H3lZv^mZ zG=n65YXA;B7QCiDcX!q=2L!QQ81hgqm^HD2N#z5fB2;K?DUrH`IE3|>im<;EsTkZ~ zG08Uz@rE7L84TC>&D5++GEyN5EW^$3I zOeGKlbq`oDLYxUDM|G}JXAawkUe!{QNT;(C?A=xb>B9Cs*$B=M3EM!&Om7Oa4n|>x zEkhO?f$oK3>+uifw9Ott_w9`J_Z1xsz?(m(D<2tu`G%{-DTa*`Vb3b2j>ZaNH_M2W z7`ls|r>3XBsr(SBZ@@WO4sDBPHLCCa)+X>0KpNo~fX;((GDU7&rFKK=rwsb+j69Sj zwrd@&kUmIabA7-k1DPJ2hy=HWAJv7Q{q8oK-pF~K;ey1*^r*;{31$JtXVQ?W=FLyV z&n$fh)a_wUWO~W%E-VXn7(SZn z2+SR?aHW$I5x9$dT``9=fIi;B%G*TK!xh>3e%l9vQ{#xTe?7iV=g9vx;}W?J|8nz$ zs&29@m%fX2CJ>7P23hatQ>3cq;c3J$S(zt=@@(F6 zZs`aS%xVZAs-mJEV%^Cqw9HJn>`F8}5y;Y~o@K3+twYb27$0!glRycXnAawiu)OAM2>8>6zZSVeK-Zbf{&)GP5aO zg-t}KRkPsOz0IjfdT+>~*m!O$s#Rpj$Yij;4tx7aO7f;3;Zx@K~QXcB!8yKdfT5cPbX*8Zw=Qdw;J2jQE zfzwgk(l*UtNy#dlMt&VrJN&hHTL(|vRVP3<^mb&Bw2)TDu!+}4*kXnsZJg&9J~Cn?4rQ6 zkp(y1K$joV0{7j{j09X_f0Qv+Aw9?jA*JpoS>M`3c?c)CsodH_vD9RkjDYa`;$*&O zg#TrCEC**k)dQPS_>}+vaEHHIRE}g?xWIlamxh0FDLZXQlZZm zdqpC+o`vT9uJ$b-9`#*lawL9`B=clid$n~g@-0HwW|AU>xe3WOWtlhLT*>;pEycu8 zsK4S)(INsQoNFOvn|9qgcor50dpNaYk0Ck=!ZARTE!3w{6IgsN8l@z=rvlW#rH}B3VDcXBNW~l}v?To*X8~ zunA%#sHV^zdHZg{KZt7lp7u=;R`gC>5b9#G^07X24gkU7%L`zHIzWNn5;r`C1U@Sw z9GMb9y~OVaDpV*W4qlUeI@GC5L4dwBqZ>>v4I~ULn4rUr%ac$D}6P@CO2Kn{z zJR2D(Wd4Mw?%E65wnfU);wR-Hn^Gf$DuWHw2ZL67)jcP9D~`FAz)P{1BrvIYCak|r zuw4lavDuF--{eWqomx`znOU38rpek?KX(tnryW_}z+2d+NGIQXHYH~5RK*RKxRk>;c(}dsYS&J;^l3{7DWpY?igSEA zm4=GGl{L5(xKyT2k6S|(LK^(JF9aLKw?l(G9N}`E8qpa{o;=gESqj$>7D}=?u8joV zr_SX;0a-MuO)ryaeKO=77C=yCqu8&AbSTpl9dpyo-J)lsjyn0hnK7*{^p&Y-a3E6j zXsc73>hn(sp$^IKdlwrY<*`gBcNE1_nD4{tpwvSP*QET^blMG$`jhTErK;mpY!jX{ zkvZRk=5HW+C=j!VE=7J@#B6PWo|(9Bz+UvJ2!_`w%N_ju!SP-L4zFEBcqm)9mMHln zacbF-J`11$W?(bQ3^$@K*N(O$u)n4m8hc<93b-LR-;UNfvcD#k3WQ=WcN7}Vkf1EM zx_QL`IAiKv;(G8B@B8KrX9!RB<i#Wssfu-tX7zZ4+ghwW zw;l)VA3FzntnrYvN$5}A2?_Y0xRcD%E*8bCdPPFGcv%ocVZt6yxfXNwp0kE6>DTM@ z`tglwnVZ*GAEXUC3f_eg`|TkyekJ}=OZmO8Uy&=H>XXpn)WnNlKW(mHt%fvj>TW!b zYj2*!wz?NtUJ9W+7OVP>!vV=ifINeE>g9&^)^|-;*MZuNmUzPM2kPh⁢;eX=#19 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 ajH;Xz81QZJ>)nL{m;kn58RCCAga04BNS3Pr literal 0 HcmV?d00001 diff --git a/client/pytest.ini b/client/pytest.ini deleted file mode 100644 index 6605410..0000000 --- a/client/pytest.ini +++ /dev/null @@ -1,4 +0,0 @@ -[pytest] -testpaths = tests -python_files = test_*.py -python_functions = test_* diff --git a/client/requirements.txt b/client/requirements.txt deleted file mode 100644 index 8340b35..0000000 --- a/client/requirements.txt +++ /dev/null @@ -1,15 +0,0 @@ -# Flask -flask>=3.0.0 -flask-babel>=4.0.0 -flask-wtf>=1.2.0 - -# HTTP Client (to call FastAPI server) -requests>=2.31.0 -urllib3>=2.0.0 - -# Utilities -python-dotenv>=1.0.0 - -# Testing -pytest>=8.0.0 -coverage>=7.0.0 diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index c1123a6..94018b7 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -24,7 +24,7 @@ services: server: build: - context: ./server + context: . dockerfile: Dockerfile container_name: tmflow-server restart: unless-stopped @@ -43,8 +43,8 @@ services: client: build: - context: ./client - dockerfile: Dockerfile + context: . + dockerfile: Dockerfile.frontend container_name: tmflow-client restart: unless-stopped env_file: diff --git a/docker-compose.yml b/docker-compose.yml index 506cb6f..52cfd24 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,7 +24,7 @@ services: server: build: - context: ./server + context: . dockerfile: Dockerfile container_name: tmflow-server restart: unless-stopped @@ -52,8 +52,8 @@ services: client: build: - context: ./client - dockerfile: Dockerfile + context: . + dockerfile: Dockerfile.frontend container_name: tmflow-client restart: unless-stopped env_file: diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..98409dc --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,73 @@ +[project] +name = "tiemeasureflow" +version = "2.0.0" +description = "TieMeasureFlow by Tielogic — manual caliper measurement task management for industrial QA stations." +requires-python = ">=3.11" +authors = [ + { name = "Adriano Dal Pastro", email = "adrianodalpastro@tielogic.com" }, +] + +# Shared core deps used by both backend and the Flask frontend. +dependencies = [ + "pydantic>=2.0.0", + "pydantic-settings>=2.0.0", + "python-dotenv>=1.0.0", +] + +[project.optional-dependencies] + +# Backend (FastAPI + DB + reports). +server = [ + "fastapi>=0.110.0", + "uvicorn[standard]>=0.30.0", + "sqlalchemy[asyncio]>=2.0.0", + "asyncmy>=0.2.0", + "alembic>=1.13.0", + "bcrypt>=4.0.0", + "pillow>=10.0.0", + "python-multipart>=0.0.6", + "jinja2>=3.1.0", + "plotly>=5.0.0", + "kaleido>=0.2.0", + "weasyprint>=62.0", +] + +# Frontend (Flask tablet UI). +client = [ + "flask>=3.0.0", + "flask-babel>=4.0.0", + "flask-wtf>=1.2.0", + "requests>=2.31.0", + "urllib3>=2.0.0", + "gunicorn>=21.0.0", +] + +# Dev / test (covers both server and client tests). +dev = [ + "pytest>=8.0.0", + "pytest-asyncio>=0.23.0", + "httpx>=0.27.0", + "aiosqlite>=0.20.0", + "coverage>=7.0.0", +] + +[project.scripts] +# Backend +server = "uvicorn:run" # placeholder, real CMD lives in Dockerfile + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +# Source layout will be src/backend/ and src/frontend/flask_app/ after the +# folder restructure (Phase 2 of the V2.0.0 plan). +packages = ["src/backend", "src/frontend"] + +[tool.uv] +# Pin the resolver to the deps we declared; reproducible builds. +package = false + +[tool.pytest.ini_options] +asyncio_mode = "auto" +testpaths = ["src/backend/tests", "src/frontend/flask_app/tests"] diff --git a/server/models/__init__.py b/server/models/__init__.py deleted file mode 100644 index 65a1133..0000000 --- a/server/models/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -"""SQLAlchemy models for TieMeasureFlow.""" -from models.user import User -from models.recipe import Recipe, RecipeVersion -from models.task import RecipeTask, RecipeSubtask -from models.measurement import Measurement -from models.access_log import AccessLog -from models.setting import SystemSetting, RecipeVersionAudit - -__all__ = [ - "User", - "Recipe", - "RecipeVersion", - "RecipeTask", - "RecipeSubtask", - "Measurement", - "AccessLog", - "SystemSetting", - "RecipeVersionAudit", -] diff --git a/server/pytest.ini b/server/pytest.ini deleted file mode 100644 index 98f49cf..0000000 --- a/server/pytest.ini +++ /dev/null @@ -1,5 +0,0 @@ -[pytest] -asyncio_mode = auto -testpaths = tests -python_files = test_*.py -python_functions = test_* diff --git a/client/blueprints/__init__.py b/src/__init__.py similarity index 100% rename from client/blueprints/__init__.py rename to src/__init__.py diff --git a/server/Dockerfile b/src/backend/Dockerfile.legacy similarity index 100% rename from server/Dockerfile rename to src/backend/Dockerfile.legacy diff --git a/client/services/__init__.py b/src/backend/__init__.py similarity index 100% rename from client/services/__init__.py rename to src/backend/__init__.py diff --git a/client/tests/__init__.py b/src/backend/api/__init__.py similarity index 100% rename from client/tests/__init__.py rename to src/backend/api/__init__.py diff --git a/server/middleware/__init__.py b/src/backend/api/middleware/__init__.py similarity index 63% rename from server/middleware/__init__.py rename to src/backend/api/middleware/__init__.py index 5f8fec1..2c0e2e7 100644 --- a/server/middleware/__init__.py +++ b/src/backend/api/middleware/__init__.py @@ -1,5 +1,5 @@ """FastAPI middleware for TieMeasureFlow.""" -from middleware.api_key import ( +from src.backend.api.middleware.api_key import ( get_current_user, require_role, require_admin, @@ -8,9 +8,9 @@ from middleware.api_key import ( require_metrologist, require_admin_user, ) -from middleware.logging import AccessLogMiddleware -from middleware.rate_limit import RateLimitMiddleware -from middleware.security_headers import SecurityHeadersMiddleware +from src.backend.api.middleware.logging import AccessLogMiddleware +from src.backend.api.middleware.rate_limit import RateLimitMiddleware +from src.backend.api.middleware.security_headers import SecurityHeadersMiddleware __all__ = [ "get_current_user", diff --git a/server/middleware/api_key.py b/src/backend/api/middleware/api_key.py similarity index 96% rename from server/middleware/api_key.py rename to src/backend/api/middleware/api_key.py index 0d52045..d248626 100644 --- a/server/middleware/api_key.py +++ b/src/backend/api/middleware/api_key.py @@ -3,8 +3,8 @@ from fastapi import Depends, HTTPException, Request, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from database import get_db -from models.user import User +from src.backend.database import get_db +from src.backend.models.orm.user import User async def get_current_user( diff --git a/server/middleware/logging.py b/src/backend/api/middleware/logging.py similarity index 94% rename from server/middleware/logging.py rename to src/backend/api/middleware/logging.py index 89a369f..8f349cf 100644 --- a/server/middleware/logging.py +++ b/src/backend/api/middleware/logging.py @@ -6,8 +6,8 @@ from fastapi import Request, Response from starlette.middleware.base import BaseHTTPMiddleware from sqlalchemy import insert -from database import async_session_factory -from models.access_log import AccessLog +from src.backend.database import async_session_factory +from src.backend.models.orm.access_log import AccessLog class AccessLogMiddleware(BaseHTTPMiddleware): diff --git a/server/middleware/rate_limit.py b/src/backend/api/middleware/rate_limit.py similarity index 99% rename from server/middleware/rate_limit.py rename to src/backend/api/middleware/rate_limit.py index 0890d35..48f8a4c 100644 --- a/server/middleware/rate_limit.py +++ b/src/backend/api/middleware/rate_limit.py @@ -11,7 +11,7 @@ from fastapi import Request, Response from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import JSONResponse -from config import settings +from src.backend.config import settings class RateLimitMiddleware(BaseHTTPMiddleware): diff --git a/server/middleware/security_headers.py b/src/backend/api/middleware/security_headers.py similarity index 97% rename from server/middleware/security_headers.py rename to src/backend/api/middleware/security_headers.py index e6401ab..f67720d 100644 --- a/server/middleware/security_headers.py +++ b/src/backend/api/middleware/security_headers.py @@ -8,7 +8,7 @@ from typing import Callable from fastapi import Request, Response from starlette.middleware.base import BaseHTTPMiddleware -from config import settings +from src.backend.config import settings # Content Security Policy - allows CDN resources used by the client # Note: 'unsafe-eval' required for Plotly.js runtime evaluation in SPC charts diff --git a/server/routers/__init__.py b/src/backend/api/routers/__init__.py similarity index 100% rename from server/routers/__init__.py rename to src/backend/api/routers/__init__.py diff --git a/server/routers/auth.py b/src/backend/api/routers/auth.py similarity index 86% rename from server/routers/auth.py rename to src/backend/api/routers/auth.py index 4ed0bd4..9489162 100644 --- a/server/routers/auth.py +++ b/src/backend/api/routers/auth.py @@ -2,16 +2,16 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession -from database import get_db -from middleware.api_key import get_current_user -from models.user import User -from schemas.user import ( +from src.backend.database import get_db +from src.backend.api.middleware.api_key import get_current_user +from src.backend.models.orm.user import User +from src.backend.models.api.user import ( LoginRequest, LoginResponse, UserProfileUpdate, UserResponse, ) -from services.auth_service import authenticate_user, login_user, logout_user +from src.backend.services.auth_service import authenticate_user, login_user, logout_user router = APIRouter(prefix="/api/auth", tags=["auth"]) diff --git a/server/routers/files.py b/src/backend/api/routers/files.py similarity index 97% rename from server/routers/files.py rename to src/backend/api/routers/files.py index e5ca394..06e4fc2 100644 --- a/server/routers/files.py +++ b/src/backend/api/routers/files.py @@ -7,9 +7,9 @@ from fastapi import APIRouter, Depends, File, HTTPException, UploadFile, status from fastapi.responses import FileResponse from PIL import Image -from config import settings -from middleware.api_key import get_current_user, require_maker -from models.user import User +from src.backend.config import settings +from src.backend.api.middleware.api_key import get_current_user, require_maker +from src.backend.models.orm.user import User router = APIRouter(prefix="/api/files", tags=["files"]) diff --git a/server/routers/measurements.py b/src/backend/api/routers/measurements.py similarity index 95% rename from server/routers/measurements.py rename to src/backend/api/routers/measurements.py index 09eb36f..d23c393 100644 --- a/server/routers/measurements.py +++ b/src/backend/api/routers/measurements.py @@ -8,23 +8,23 @@ from fastapi.responses import StreamingResponse from sqlalchemy import and_, func, select from sqlalchemy.ext.asyncio import AsyncSession -from database import get_db -from middleware.api_key import ( +from src.backend.database import get_db +from src.backend.api.middleware.api_key import ( get_current_user, require_measurement_tec, require_metrologist, ) -from models.measurement import Measurement -from models.recipe import RecipeVersion -from models.setting import SystemSetting -from models.user import User -from schemas.measurement import ( +from src.backend.models.orm.measurement import Measurement +from src.backend.models.orm.recipe import RecipeVersion +from src.backend.models.orm.setting import SystemSetting +from src.backend.models.orm.user import User +from src.backend.models.api.measurement import ( MeasurementBatchCreate, MeasurementCreate, MeasurementListResponse, MeasurementResponse, ) -from services.measurement_service import save_measurement +from src.backend.services.measurement_service import save_measurement router = APIRouter(prefix="/api/measurements", tags=["measurements"]) diff --git a/server/routers/recipes.py b/src/backend/api/routers/recipes.py similarity index 95% rename from server/routers/recipes.py rename to src/backend/api/routers/recipes.py index d3211f8..3447770 100644 --- a/server/routers/recipes.py +++ b/src/backend/api/routers/recipes.py @@ -2,17 +2,17 @@ from fastapi import APIRouter, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession -from database import get_db -from middleware.api_key import get_current_user, require_maker, require_measurement_tec -from models.user import User -from schemas.recipe import ( +from src.backend.database import get_db +from src.backend.api.middleware.api_key import get_current_user, require_maker, require_measurement_tec +from src.backend.models.orm.user import User +from src.backend.models.api.recipe import ( RecipeCreate, RecipeListResponse, RecipeResponse, RecipeUpdate, RecipeVersionResponse, ) -from services import recipe_service +from src.backend.services import recipe_service router = APIRouter(prefix="/api/recipes", tags=["recipes"]) diff --git a/server/routers/reports.py b/src/backend/api/routers/reports.py similarity index 91% rename from server/routers/reports.py rename to src/backend/api/routers/reports.py index ea72506..fb7ccd0 100644 --- a/server/routers/reports.py +++ b/src/backend/api/routers/reports.py @@ -5,10 +5,10 @@ from fastapi import APIRouter, Depends, HTTPException, Query, status from fastapi.responses import Response from sqlalchemy.ext.asyncio import AsyncSession -from database import get_db -from middleware.api_key import require_metrologist -from models.user import User -from services.report_service import generate_measurement_report, generate_spc_report +from src.backend.database import get_db +from src.backend.api.middleware.api_key import require_metrologist +from src.backend.models.orm.user import User +from src.backend.services.report_service import generate_measurement_report, generate_spc_report router = APIRouter(prefix="/api/reports", tags=["reports"]) diff --git a/server/routers/settings.py b/src/backend/api/routers/settings.py similarity index 94% rename from server/routers/settings.py rename to src/backend/api/routers/settings.py index e0066fd..e63ede9 100644 --- a/server/routers/settings.py +++ b/src/backend/api/routers/settings.py @@ -5,11 +5,11 @@ from fastapi import APIRouter, Depends, File, HTTPException, UploadFile, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from config import settings -from database import get_db -from middleware.api_key import get_current_user, require_admin_user -from models.setting import SystemSetting -from models.user import User +from src.backend.config import settings +from src.backend.database import get_db +from src.backend.api.middleware.api_key import get_current_user, require_admin_user +from src.backend.models.orm.setting import SystemSetting +from src.backend.models.orm.user import User router = APIRouter(prefix="/api/settings", tags=["settings"]) diff --git a/server/routers/setup.py b/src/backend/api/routers/setup.py similarity index 98% rename from server/routers/setup.py rename to src/backend/api/routers/setup.py index 5ade483..e4d71ff 100644 --- a/server/routers/setup.py +++ b/src/backend/api/routers/setup.py @@ -15,14 +15,14 @@ from pydantic import BaseModel from sqlalchemy import inspect as sa_inspect, select from sqlalchemy.ext.asyncio import AsyncSession -from config import settings -from database import Base, engine, async_session_factory -from models import ( +from src.backend.config import settings +from src.backend.database import Base, engine, async_session_factory +from src.backend.models.orm import ( User, Recipe, RecipeVersion, RecipeTask, RecipeSubtask, Measurement, ) -from models.station import Station, StationRecipeAssignment -from services.auth_service import hash_password -from services.measurement_service import calculate_pass_fail +from src.backend.models.orm.station import Station, StationRecipeAssignment +from src.backend.services.auth_service import hash_password +from src.backend.services.measurement_service import calculate_pass_fail router = APIRouter(prefix="/api/setup", tags=["setup"]) diff --git a/server/routers/stations.py b/src/backend/api/routers/stations.py similarity index 94% rename from server/routers/stations.py rename to src/backend/api/routers/stations.py index f44da27..1dabf91 100644 --- a/server/routers/stations.py +++ b/src/backend/api/routers/stations.py @@ -2,10 +2,10 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession -from database import get_db -from middleware.api_key import get_current_user, require_admin_user -from models.user import User -from schemas.station import ( +from src.backend.database import get_db +from src.backend.api.middleware.api_key import get_current_user, require_admin_user +from src.backend.models.orm.user import User +from src.backend.models.api.station import ( StationCreate, StationUpdate, StationResponse, @@ -13,7 +13,7 @@ from schemas.station import ( StationRecipeAssignmentResponse, RecipeSummary, ) -from services import station_service +from src.backend.services import station_service router = APIRouter(prefix="/api/stations", tags=["stations"]) diff --git a/server/routers/statistics.py b/src/backend/api/routers/statistics.py similarity index 95% rename from server/routers/statistics.py rename to src/backend/api/routers/statistics.py index 7c8df77..651c4ef 100644 --- a/server/routers/statistics.py +++ b/src/backend/api/routers/statistics.py @@ -5,19 +5,19 @@ from fastapi import APIRouter, Depends, HTTPException, Query, status from sqlalchemy import and_, select from sqlalchemy.ext.asyncio import AsyncSession -from database import get_db -from middleware.api_key import require_metrologist -from models.measurement import Measurement -from models.recipe import RecipeVersion -from models.task import RecipeSubtask, RecipeTask -from models.user import User -from schemas.statistics import ( +from src.backend.database import get_db +from src.backend.api.middleware.api_key import require_metrologist +from src.backend.models.orm.measurement import Measurement +from src.backend.models.orm.recipe import RecipeVersion +from src.backend.models.orm.task import RecipeSubtask, RecipeTask +from src.backend.models.orm.user import User +from src.backend.models.api.statistics import ( CapabilityData, ControlChartData, HistogramData, SummaryData, ) -from services.spc_service import ( +from src.backend.services.spc_service import ( compute_capability, compute_control_chart, compute_histogram, diff --git a/server/routers/tasks.py b/src/backend/api/routers/tasks.py similarity index 96% rename from server/routers/tasks.py rename to src/backend/api/routers/tasks.py index 6bd5cca..b682fb7 100644 --- a/server/routers/tasks.py +++ b/src/backend/api/routers/tasks.py @@ -4,12 +4,12 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload -from database import get_db -from middleware.api_key import require_maker, get_current_user -from models.recipe import Recipe, RecipeVersion -from models.task import RecipeSubtask, RecipeTask -from models.user import User -from schemas.task import ( +from src.backend.database import get_db +from src.backend.api.middleware.api_key import require_maker, get_current_user +from src.backend.models.orm.recipe import Recipe, RecipeVersion +from src.backend.models.orm.task import RecipeSubtask, RecipeTask +from src.backend.models.orm.user import User +from src.backend.models.api.task import ( SubtaskCreate, SubtaskResponse, SubtaskUpdate, @@ -18,7 +18,7 @@ from schemas.task import ( TaskResponse, TaskUpdate, ) -from services import recipe_service +from src.backend.services import recipe_service router = APIRouter(tags=["tasks"]) @@ -159,7 +159,7 @@ async def create_task( if has_measurements: # Copy-on-write: create new version preserving measurement data - from schemas.recipe import RecipeUpdate + from src.backend.models.api.recipe import RecipeUpdate new_version = await recipe_service.create_new_version( db, recipe_id, RecipeUpdate(change_notes=f"Added task: {data.title}"), user ) diff --git a/server/routers/users.py b/src/backend/api/routers/users.py similarity index 93% rename from server/routers/users.py rename to src/backend/api/routers/users.py index ed57a51..1302dc2 100644 --- a/server/routers/users.py +++ b/src/backend/api/routers/users.py @@ -3,11 +3,11 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from database import get_db -from middleware.api_key import require_admin_user -from models.user import User -from schemas.user import UserCreate, UserPasswordChange, UserResponse, UserUpdate -from services.auth_service import create_user, hash_password, regenerate_api_key +from src.backend.database import get_db +from src.backend.api.middleware.api_key import require_admin_user +from src.backend.models.orm.user import User +from src.backend.models.api.user import UserCreate, UserPasswordChange, UserResponse, UserUpdate +from src.backend.services.auth_service import create_user, hash_password, regenerate_api_key router = APIRouter(prefix="/api/users", tags=["users"]) diff --git a/server/config.py b/src/backend/config.py similarity index 74% rename from server/config.py rename to src/backend/config.py index 2e05322..ea23376 100644 --- a/server/config.py +++ b/src/backend/config.py @@ -49,10 +49,16 @@ class Settings(BaseSettings): @property def upload_path(self) -> Path: - """Absolute path to upload directory.""" - return Path(__file__).parent / self.upload_dir + """Absolute path to upload directory. - model_config = {"env_file": "../.env", "env_file_encoding": "utf-8", "extra": "ignore"} + After the V2.0.0 restructure, uploads live at the project root + (mounted as a Docker volume), not inside the backend tree. + """ + # Path(__file__) = src/backend/config.py → parents[2] = project root + return Path(__file__).resolve().parents[2] / self.upload_dir + + # ../../.env reaches the project root from src/backend/. + model_config = {"env_file": "../../.env", "env_file_encoding": "utf-8", "extra": "ignore"} settings = Settings() diff --git a/server/database.py b/src/backend/database.py similarity index 96% rename from server/database.py rename to src/backend/database.py index a36c6e5..7b57fb0 100644 --- a/server/database.py +++ b/src/backend/database.py @@ -8,7 +8,7 @@ from sqlalchemy.ext.asyncio import ( ) from sqlalchemy.orm import DeclarativeBase -from config import settings +from src.backend.config import settings # Create async engine engine = create_async_engine( diff --git a/server/main.py b/src/backend/main.py similarity index 63% rename from server/main.py rename to src/backend/main.py index 2028b51..8ddda45 100644 --- a/server/main.py +++ b/src/backend/main.py @@ -5,22 +5,22 @@ from collections.abc import AsyncGenerator from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from config import settings -from database import init_db -from middleware.logging import AccessLogMiddleware -from middleware.rate_limit import RateLimitMiddleware -from middleware.security_headers import SecurityHeadersMiddleware -from routers.auth import router as auth_router -from routers.users import router as users_router -from routers.recipes import router as recipes_router -from routers.tasks import router as tasks_router -from routers.measurements import router as measurements_router -from routers.files import router as files_router -from routers.settings import router as settings_router -from routers.reports import router as reports_router -from routers.statistics import router as statistics_router -from routers.setup import router as setup_router -from routers.stations import router as stations_router +from src.backend.config import settings +from src.backend.database import init_db +from src.backend.api.middleware.logging import AccessLogMiddleware +from src.backend.api.middleware.rate_limit import RateLimitMiddleware +from src.backend.api.middleware.security_headers import SecurityHeadersMiddleware +from src.backend.api.routers.auth import router as auth_router +from src.backend.api.routers.users import router as users_router +from src.backend.api.routers.recipes import router as recipes_router +from src.backend.api.routers.tasks import router as tasks_router +from src.backend.api.routers.measurements import router as measurements_router +from src.backend.api.routers.files import router as files_router +from src.backend.api.routers.settings import router as settings_router +from src.backend.api.routers.reports import router as reports_router +from src.backend.api.routers.statistics import router as statistics_router +from src.backend.api.routers.setup import router as setup_router +from src.backend.api.routers.stations import router as stations_router @asynccontextmanager diff --git a/server/migrations/alembic.ini b/src/backend/migrations/alembic.ini similarity index 100% rename from server/migrations/alembic.ini rename to src/backend/migrations/alembic.ini diff --git a/server/migrations/env.py b/src/backend/migrations/env.py similarity index 69% rename from server/migrations/env.py rename to src/backend/migrations/env.py index df5c76e..a1c32de 100644 --- a/server/migrations/env.py +++ b/src/backend/migrations/env.py @@ -17,20 +17,25 @@ if config.config_file_name is not None: import sys from pathlib import Path -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) -from config import settings -from database import Base +# Add the project root (4 levels up from this file) to sys.path so that +# `src.backend.*` imports resolve when alembic is invoked from anywhere. +_PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(_PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(_PROJECT_ROOT)) + +from src.backend.config import settings +from src.backend.database import Base # Override alembic.ini URL with .env settings (keep in sync) config.set_main_option("sqlalchemy.url", settings.database_url) # Import all models so they register with Base.metadata -from models.user import User # noqa: F401 -from models.recipe import Recipe, RecipeVersion # noqa: F401 -from models.task import RecipeTask, RecipeSubtask # noqa: F401 -from models.measurement import Measurement # noqa: F401 -from models.access_log import AccessLog # noqa: F401 -from models.setting import SystemSetting, RecipeVersionAudit # noqa: F401 +from src.backend.models.orm.user import User # noqa: F401 +from src.backend.models.orm.recipe import Recipe, RecipeVersion # noqa: F401 +from src.backend.models.orm.task import RecipeTask, RecipeSubtask # noqa: F401 +from src.backend.models.orm.measurement import Measurement # noqa: F401 +from src.backend.models.orm.access_log import AccessLog # noqa: F401 +from src.backend.models.orm.setting import SystemSetting, RecipeVersionAudit # noqa: F401 target_metadata = Base.metadata diff --git a/server/migrations/script.py.mako b/src/backend/migrations/script.py.mako similarity index 100% rename from server/migrations/script.py.mako rename to src/backend/migrations/script.py.mako diff --git a/client/static/img/.gitkeep b/src/backend/migrations/versions/.gitkeep similarity index 100% rename from client/static/img/.gitkeep rename to src/backend/migrations/versions/.gitkeep diff --git a/server/migrations/versions/001_add_image_path_to_recipe_and_subtask.py b/src/backend/migrations/versions/001_add_image_path_to_recipe_and_subtask.py similarity index 100% rename from server/migrations/versions/001_add_image_path_to_recipe_and_subtask.py rename to src/backend/migrations/versions/001_add_image_path_to_recipe_and_subtask.py diff --git a/server/migrations/versions/002_add_stations.py b/src/backend/migrations/versions/002_add_stations.py similarity index 100% rename from server/migrations/versions/002_add_stations.py rename to src/backend/migrations/versions/002_add_stations.py diff --git a/server/services/__init__.py b/src/backend/models/__init__.py similarity index 100% rename from server/services/__init__.py rename to src/backend/models/__init__.py diff --git a/server/schemas/__init__.py b/src/backend/models/api/__init__.py similarity index 86% rename from server/schemas/__init__.py rename to src/backend/models/api/__init__.py index 4d4430c..c5f1fe5 100644 --- a/server/schemas/__init__.py +++ b/src/backend/models/api/__init__.py @@ -1,19 +1,19 @@ """Pydantic schemas for TieMeasureFlow API.""" -from schemas.measurement import ( +from src.backend.models.api.measurement import ( MeasurementBatchCreate, MeasurementCreate, MeasurementListResponse, MeasurementQuery, MeasurementResponse, ) -from schemas.recipe import ( +from src.backend.models.api.recipe import ( RecipeCreate, RecipeListResponse, RecipeResponse, RecipeUpdate, RecipeVersionResponse, ) -from schemas.statistics import ( +from src.backend.models.api.statistics import ( AlertData, CapabilityData, ControlChartData, @@ -23,7 +23,7 @@ from schemas.statistics import ( SummaryData, TrendData, ) -from schemas.task import ( +from src.backend.models.api.task import ( SubtaskCreate, SubtaskResponse, SubtaskUpdate, @@ -32,7 +32,7 @@ from schemas.task import ( TaskResponse, TaskUpdate, ) -from schemas.user import ( +from src.backend.models.api.user import ( LoginRequest, LoginResponse, UserCreate, diff --git a/server/schemas/measurement.py b/src/backend/models/api/measurement.py similarity index 100% rename from server/schemas/measurement.py rename to src/backend/models/api/measurement.py diff --git a/server/schemas/recipe.py b/src/backend/models/api/recipe.py similarity index 94% rename from server/schemas/recipe.py rename to src/backend/models/api/recipe.py index d6275be..2e235eb 100644 --- a/server/schemas/recipe.py +++ b/src/backend/models/api/recipe.py @@ -5,7 +5,7 @@ from typing import Optional, TYPE_CHECKING from pydantic import BaseModel, ConfigDict, Field if TYPE_CHECKING: - from schemas.task import TaskResponse + from src.backend.models.api.task import TaskResponse class RecipeCreate(BaseModel): @@ -71,6 +71,6 @@ class RecipeListResponse(BaseModel): # Forward reference imports for model_rebuild -from schemas.task import TaskResponse # noqa: E402 +from src.backend.models.api.task import TaskResponse # noqa: E402 RecipeVersionResponse.model_rebuild() RecipeResponse.model_rebuild() diff --git a/server/schemas/station.py b/src/backend/models/api/station.py similarity index 100% rename from server/schemas/station.py rename to src/backend/models/api/station.py diff --git a/server/schemas/statistics.py b/src/backend/models/api/statistics.py similarity index 100% rename from server/schemas/statistics.py rename to src/backend/models/api/statistics.py diff --git a/server/schemas/task.py b/src/backend/models/api/task.py similarity index 100% rename from server/schemas/task.py rename to src/backend/models/api/task.py diff --git a/server/schemas/user.py b/src/backend/models/api/user.py similarity index 100% rename from server/schemas/user.py rename to src/backend/models/api/user.py diff --git a/src/backend/models/orm/__init__.py b/src/backend/models/orm/__init__.py new file mode 100644 index 0000000..90c0a87 --- /dev/null +++ b/src/backend/models/orm/__init__.py @@ -0,0 +1,19 @@ +"""SQLAlchemy models for TieMeasureFlow.""" +from src.backend.models.orm.user import User +from src.backend.models.orm.recipe import Recipe, RecipeVersion +from src.backend.models.orm.task import RecipeTask, RecipeSubtask +from src.backend.models.orm.measurement import Measurement +from src.backend.models.orm.access_log import AccessLog +from src.backend.models.orm.setting import SystemSetting, RecipeVersionAudit + +__all__ = [ + "User", + "Recipe", + "RecipeVersion", + "RecipeTask", + "RecipeSubtask", + "Measurement", + "AccessLog", + "SystemSetting", + "RecipeVersionAudit", +] diff --git a/server/models/access_log.py b/src/backend/models/orm/access_log.py similarity index 96% rename from server/models/access_log.py rename to src/backend/models/orm/access_log.py index f61e9e5..404928f 100644 --- a/server/models/access_log.py +++ b/src/backend/models/orm/access_log.py @@ -5,7 +5,7 @@ from typing import Optional from sqlalchemy import BigInteger, DateTime, ForeignKey, Index, Integer, JSON, String, func from sqlalchemy.orm import Mapped, mapped_column -from database import Base +from src.backend.database import Base class AccessLog(Base): diff --git a/server/models/measurement.py b/src/backend/models/orm/measurement.py similarity index 98% rename from server/models/measurement.py rename to src/backend/models/orm/measurement.py index 4673541..28b0354 100644 --- a/server/models/measurement.py +++ b/src/backend/models/orm/measurement.py @@ -8,7 +8,7 @@ from sqlalchemy import ( ) from sqlalchemy.orm import Mapped, mapped_column -from database import Base +from src.backend.database import Base class Measurement(Base): diff --git a/server/models/recipe.py b/src/backend/models/orm/recipe.py similarity index 96% rename from server/models/recipe.py rename to src/backend/models/orm/recipe.py index 4b8945a..360f072 100644 --- a/server/models/recipe.py +++ b/src/backend/models/orm/recipe.py @@ -5,10 +5,10 @@ from typing import TYPE_CHECKING, Optional from sqlalchemy import Boolean, DateTime, ForeignKey, Index, Integer, String, Text, UniqueConstraint, func from sqlalchemy.orm import Mapped, mapped_column, relationship -from database import Base +from src.backend.database import Base if TYPE_CHECKING: - from models.task import RecipeTask + from src.backend.models.orm.task import RecipeTask class Recipe(Base): diff --git a/server/models/setting.py b/src/backend/models/orm/setting.py similarity index 98% rename from server/models/setting.py rename to src/backend/models/orm/setting.py index f81119e..2680f8b 100644 --- a/server/models/setting.py +++ b/src/backend/models/orm/setting.py @@ -5,7 +5,7 @@ from typing import Optional from sqlalchemy import DateTime, Enum, ForeignKey, Index, Integer, String, Text, func from sqlalchemy.orm import Mapped, mapped_column -from database import Base +from src.backend.database import Base class SystemSetting(Base): diff --git a/server/models/station.py b/src/backend/models/orm/station.py similarity index 96% rename from server/models/station.py rename to src/backend/models/orm/station.py index b8b6a33..ca72e0c 100644 --- a/server/models/station.py +++ b/src/backend/models/orm/station.py @@ -10,10 +10,10 @@ from typing import TYPE_CHECKING, Optional from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint, func from sqlalchemy.orm import Mapped, mapped_column, relationship -from database import Base +from src.backend.database import Base if TYPE_CHECKING: - from models.recipe import Recipe + from src.backend.models.orm.recipe import Recipe class Station(Base): diff --git a/server/models/task.py b/src/backend/models/orm/task.py similarity index 97% rename from server/models/task.py rename to src/backend/models/orm/task.py index 48e413b..7973943 100644 --- a/server/models/task.py +++ b/src/backend/models/orm/task.py @@ -6,10 +6,10 @@ from sqlalchemy import ( ) from sqlalchemy.orm import Mapped, mapped_column, relationship -from database import Base +from src.backend.database import Base if TYPE_CHECKING: - from models.recipe import RecipeVersion + from src.backend.models.orm.recipe import RecipeVersion class RecipeTask(Base): diff --git a/server/models/user.py b/src/backend/models/orm/user.py similarity index 98% rename from server/models/user.py rename to src/backend/models/orm/user.py index e086991..41c28e0 100644 --- a/server/models/user.py +++ b/src/backend/models/orm/user.py @@ -5,7 +5,7 @@ from typing import Optional from sqlalchemy import Boolean, DateTime, Enum, Integer, JSON, String, func from sqlalchemy.orm import Mapped, mapped_column -from database import Base +from src.backend.database import Base class User(Base): diff --git a/server/tests/__init__.py b/src/backend/services/__init__.py similarity index 100% rename from server/tests/__init__.py rename to src/backend/services/__init__.py diff --git a/server/services/auth_service.py b/src/backend/services/auth_service.py similarity index 98% rename from server/services/auth_service.py rename to src/backend/services/auth_service.py index 7e4745a..9e86fb7 100644 --- a/server/services/auth_service.py +++ b/src/backend/services/auth_service.py @@ -6,7 +6,7 @@ import bcrypt from sqlalchemy import select, update from sqlalchemy.ext.asyncio import AsyncSession -from models.user import User +from src.backend.models.orm.user import User def hash_password(password: str) -> str: diff --git a/server/services/measurement_service.py b/src/backend/services/measurement_service.py similarity index 95% rename from server/services/measurement_service.py rename to src/backend/services/measurement_service.py index a854f7f..38055a1 100644 --- a/server/services/measurement_service.py +++ b/src/backend/services/measurement_service.py @@ -4,8 +4,8 @@ from decimal import Decimal from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from models.measurement import Measurement -from models.task import RecipeSubtask +from src.backend.models.orm.measurement import Measurement +from src.backend.models.orm.task import RecipeSubtask def calculate_pass_fail( diff --git a/server/services/recipe_service.py b/src/backend/services/recipe_service.py similarity index 98% rename from server/services/recipe_service.py rename to src/backend/services/recipe_service.py index 2af85a5..03577de 100644 --- a/server/services/recipe_service.py +++ b/src/backend/services/recipe_service.py @@ -7,12 +7,12 @@ from sqlalchemy import func, select, update from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload -from models.measurement import Measurement -from models.recipe import Recipe, RecipeVersion -from models.setting import RecipeVersionAudit -from models.task import RecipeSubtask, RecipeTask -from models.user import User -from schemas.recipe import RecipeCreate, RecipeUpdate +from src.backend.models.orm.measurement import Measurement +from src.backend.models.orm.recipe import Recipe, RecipeVersion +from src.backend.models.orm.setting import RecipeVersionAudit +from src.backend.models.orm.task import RecipeSubtask, RecipeTask +from src.backend.models.orm.user import User +from src.backend.models.api.recipe import RecipeCreate, RecipeUpdate # --------------------------------------------------------------------------- diff --git a/server/services/report_service.py b/src/backend/services/report_service.py similarity index 97% rename from server/services/report_service.py rename to src/backend/services/report_service.py index 19cfc73..2d25904 100644 --- a/server/services/report_service.py +++ b/src/backend/services/report_service.py @@ -10,13 +10,13 @@ from sqlalchemy import and_, select from sqlalchemy.ext.asyncio import AsyncSession from weasyprint import HTML -from config import settings -from models.measurement import Measurement -from models.recipe import Recipe, RecipeVersion -from models.setting import SystemSetting -from models.task import RecipeSubtask, RecipeTask -from models.user import User -from services.spc_service import ( +from src.backend.config import settings +from src.backend.models.orm.measurement import Measurement +from src.backend.models.orm.recipe import Recipe, RecipeVersion +from src.backend.models.orm.setting import SystemSetting +from src.backend.models.orm.task import RecipeSubtask, RecipeTask +from src.backend.models.orm.user import User +from src.backend.services.spc_service import ( compute_capability, compute_control_chart, compute_histogram, diff --git a/server/services/spc_service.py b/src/backend/services/spc_service.py similarity index 99% rename from server/services/spc_service.py rename to src/backend/services/spc_service.py index 92084a4..b946a70 100644 --- a/server/services/spc_service.py +++ b/src/backend/services/spc_service.py @@ -9,7 +9,7 @@ import math import statistics as stats from datetime import datetime -from schemas.statistics import ( +from src.backend.models.api.statistics import ( CapabilityData, ControlChartData, HistogramData, diff --git a/server/services/station_service.py b/src/backend/services/station_service.py similarity index 95% rename from server/services/station_service.py rename to src/backend/services/station_service.py index e203247..fc41832 100644 --- a/server/services/station_service.py +++ b/src/backend/services/station_service.py @@ -10,10 +10,10 @@ from fastapi import HTTPException, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from models.recipe import Recipe -from models.station import Station, StationRecipeAssignment -from models.user import User -from schemas.station import StationCreate, StationUpdate +from src.backend.models.orm.recipe import Recipe +from src.backend.models.orm.station import Station, StationRecipeAssignment +from src.backend.models.orm.user import User +from src.backend.models.api.station import StationCreate, StationUpdate async def create_station( diff --git a/client/static/js/.gitkeep b/src/backend/templates/reports/.gitkeep similarity index 100% rename from client/static/js/.gitkeep rename to src/backend/templates/reports/.gitkeep diff --git a/server/templates/reports/base_report.html b/src/backend/templates/reports/base_report.html similarity index 100% rename from server/templates/reports/base_report.html rename to src/backend/templates/reports/base_report.html diff --git a/server/templates/reports/measurement_report.html b/src/backend/templates/reports/measurement_report.html similarity index 100% rename from server/templates/reports/measurement_report.html rename to src/backend/templates/reports/measurement_report.html diff --git a/server/templates/reports/spc_report.html b/src/backend/templates/reports/spc_report.html similarity index 100% rename from server/templates/reports/spc_report.html rename to src/backend/templates/reports/spc_report.html diff --git a/server/templates/setup/setup.html b/src/backend/templates/setup/setup.html similarity index 100% rename from server/templates/setup/setup.html rename to src/backend/templates/setup/setup.html diff --git a/client/static/vendor/.gitkeep b/src/backend/tests/.gitkeep similarity index 100% rename from client/static/vendor/.gitkeep rename to src/backend/tests/.gitkeep diff --git a/client/templates/auth/.gitkeep b/src/backend/tests/__init__.py similarity index 100% rename from client/templates/auth/.gitkeep rename to src/backend/tests/__init__.py diff --git a/server/tests/conftest.py b/src/backend/tests/conftest.py similarity index 91% rename from server/tests/conftest.py rename to src/backend/tests/conftest.py index abe4d79..9e10414 100644 --- a/server/tests/conftest.py +++ b/src/backend/tests/conftest.py @@ -30,17 +30,17 @@ if "weasyprint" not in sys.modules: # Ensure the server package is importable sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) -from database import Base, get_db -from main import app -from middleware.rate_limit import RateLimitMiddleware -from models.user import User -from models.recipe import Recipe, RecipeVersion -from models.task import RecipeTask, RecipeSubtask -from models.measurement import Measurement -from models.access_log import AccessLog -from models.setting import SystemSetting, RecipeVersionAudit -from models.station import Station, StationRecipeAssignment -from services.auth_service import hash_password, generate_api_key +from src.backend.database import Base, get_db +from src.backend.main import app +from src.backend.api.middleware.rate_limit import RateLimitMiddleware +from src.backend.models.orm.user import User +from src.backend.models.orm.recipe import Recipe, RecipeVersion +from src.backend.models.orm.task import RecipeTask, RecipeSubtask +from src.backend.models.orm.measurement import Measurement +from src.backend.models.orm.access_log import AccessLog +from src.backend.models.orm.setting import SystemSetting, RecipeVersionAudit +from src.backend.models.orm.station import Station, StationRecipeAssignment +from src.backend.services.auth_service import hash_password, generate_api_key # --------------------------------------------------------------------------- # In-memory SQLite engine for tests diff --git a/server/tests/test_auth.py b/src/backend/tests/test_auth.py similarity index 98% rename from server/tests/test_auth.py rename to src/backend/tests/test_auth.py index 8e424e0..b6d50e7 100644 --- a/server/tests/test_auth.py +++ b/src/backend/tests/test_auth.py @@ -2,7 +2,7 @@ import pytest from httpx import AsyncClient -from tests.conftest import _create_user, auth_headers +from src.backend.tests.conftest import _create_user, auth_headers class TestLogin: diff --git a/server/tests/test_files.py b/src/backend/tests/test_files.py similarity index 91% rename from server/tests/test_files.py rename to src/backend/tests/test_files.py index b98d56e..6f35539 100644 --- a/server/tests/test_files.py +++ b/src/backend/tests/test_files.py @@ -8,8 +8,8 @@ from unittest.mock import patch import pytest from httpx import AsyncClient -from models.user import User -from tests.conftest import auth_headers +from src.backend.models.orm.user import User +from src.backend.tests.conftest import auth_headers class TestUploadFile: @@ -45,7 +45,7 @@ class TestUploadFile: ) # Patch settings.upload_path to use tmp_path - with patch("routers.files.settings") as mock_settings: + with patch("src.backend.api.routers.files.settings") as mock_settings: mock_settings.upload_path = tmp_path mock_settings.max_upload_size_mb = 50 @@ -82,7 +82,7 @@ class TestUploadFile: # Create a large file content large_content = b"\x00" * (51 * 1024 * 1024) # 51MB - with patch("routers.files.settings") as mock_settings: + with patch("src.backend.api.routers.files.settings") as mock_settings: mock_settings.max_upload_size_mb = 50 mock_settings.upload_path = Path(tempfile.mkdtemp()) @@ -109,7 +109,7 @@ class TestGetFile: test_file = tmp_path / "testfile.txt" test_file.write_text("hello test") - with patch("routers.files.settings") as mock_settings: + with patch("src.backend.api.routers.files.settings") as mock_settings: mock_settings.upload_path = tmp_path resp = await client.get( @@ -123,7 +123,7 @@ class TestGetFile: self, client: AsyncClient, maker_user: User, tmp_path: Path ): """Requesting a non-existent file returns 404.""" - with patch("routers.files.settings") as mock_settings: + with patch("src.backend.api.routers.files.settings") as mock_settings: mock_settings.upload_path = tmp_path resp = await client.get( @@ -144,7 +144,7 @@ class TestDeleteFile: test_file = tmp_path / "deleteme.txt" test_file.write_text("delete me") - with patch("routers.files.settings") as mock_settings: + with patch("src.backend.api.routers.files.settings") as mock_settings: mock_settings.upload_path = tmp_path resp = await client.delete( @@ -163,7 +163,7 @@ class TestFilenameSanitization: self, client: AsyncClient, maker_user: User, tmp_path: Path ): """Path traversal attempt returns 403 or 404.""" - with patch("routers.files.settings") as mock_settings: + with patch("src.backend.api.routers.files.settings") as mock_settings: mock_settings.upload_path = tmp_path resp = await client.get( diff --git a/server/tests/test_measurements.py b/src/backend/tests/test_measurements.py similarity index 97% rename from server/tests/test_measurements.py rename to src/backend/tests/test_measurements.py index ab0c18f..a5b6d4e 100644 --- a/server/tests/test_measurements.py +++ b/src/backend/tests/test_measurements.py @@ -3,10 +3,10 @@ import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession -from models.user import User -from models.recipe import RecipeVersion -from models.task import RecipeTask, RecipeSubtask -from tests.conftest import auth_headers, create_test_recipe +from src.backend.models.orm.user import User +from src.backend.models.orm.recipe import RecipeVersion +from src.backend.models.orm.task import RecipeTask, RecipeSubtask +from src.backend.tests.conftest import auth_headers, create_test_recipe async def _get_subtask_and_version( diff --git a/server/tests/test_rate_limit_proxy.py b/src/backend/tests/test_rate_limit_proxy.py similarity index 96% rename from server/tests/test_rate_limit_proxy.py rename to src/backend/tests/test_rate_limit_proxy.py index 18ad5e7..b8f1bb2 100644 --- a/server/tests/test_rate_limit_proxy.py +++ b/src/backend/tests/test_rate_limit_proxy.py @@ -1,5 +1,5 @@ """Tests for RateLimitMiddleware honoring proxy headers (X-Forwarded-For).""" -from middleware.rate_limit import RateLimitMiddleware +from src.backend.api.middleware.rate_limit import RateLimitMiddleware class _FakeRequest: diff --git a/server/tests/test_recipes.py b/src/backend/tests/test_recipes.py similarity index 98% rename from server/tests/test_recipes.py rename to src/backend/tests/test_recipes.py index 2b5541f..67173ae 100644 --- a/server/tests/test_recipes.py +++ b/src/backend/tests/test_recipes.py @@ -3,8 +3,8 @@ import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession -from models.user import User -from tests.conftest import auth_headers, create_test_recipe +from src.backend.models.orm.user import User +from src.backend.tests.conftest import auth_headers, create_test_recipe class TestListRecipes: diff --git a/server/tests/test_reports.py b/src/backend/tests/test_reports.py similarity index 92% rename from server/tests/test_reports.py rename to src/backend/tests/test_reports.py index d941c3f..8c07626 100644 --- a/server/tests/test_reports.py +++ b/src/backend/tests/test_reports.py @@ -9,8 +9,8 @@ import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession -from models.user import User -from tests.conftest import auth_headers, create_test_recipe +from src.backend.models.orm.user import User +from src.backend.tests.conftest import auth_headers, create_test_recipe class TestMeasurementReport: @@ -29,7 +29,7 @@ class TestMeasurementReport: fake_pdf = b"%PDF-1.4 fake content" with patch( - "routers.reports.generate_measurement_report", + "src.backend.api.routers.reports.generate_measurement_report", new_callable=AsyncMock, return_value=fake_pdf, ): @@ -75,7 +75,7 @@ class TestSPCReport: fake_pdf = b"%PDF-1.4 spc report content" with patch( - "routers.reports.generate_spc_report", + "src.backend.api.routers.reports.generate_spc_report", new_callable=AsyncMock, return_value=fake_pdf, ): diff --git a/server/tests/test_security.py b/src/backend/tests/test_security.py similarity index 96% rename from server/tests/test_security.py rename to src/backend/tests/test_security.py index b6a853f..b669706 100644 --- a/server/tests/test_security.py +++ b/src/backend/tests/test_security.py @@ -9,7 +9,7 @@ from unittest.mock import patch import pytest from httpx import AsyncClient -from tests.conftest import _create_user, auth_headers +from src.backend.tests.conftest import _create_user, auth_headers class TestCORSHeaders: @@ -126,7 +126,7 @@ class TestFilenameSanitization: async def test_dotfile_rejected(self, client: AsyncClient, db_session): """Filenames starting with '.' are rejected.""" - from routers.files import sanitize_filename + from src.backend.api.routers.files import sanitize_filename from fastapi import HTTPException with pytest.raises(HTTPException) as exc_info: @@ -136,7 +136,7 @@ class TestFilenameSanitization: async def test_empty_filename_rejected(self, client: AsyncClient, db_session): """Empty filenames are rejected.""" - from routers.files import sanitize_filename + from src.backend.api.routers.files import sanitize_filename from fastapi import HTTPException with pytest.raises(HTTPException) as exc_info: diff --git a/server/tests/test_settings.py b/src/backend/tests/test_settings.py similarity index 95% rename from server/tests/test_settings.py rename to src/backend/tests/test_settings.py index f54f81e..bffd934 100644 --- a/server/tests/test_settings.py +++ b/src/backend/tests/test_settings.py @@ -3,9 +3,9 @@ import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession -from models.setting import SystemSetting -from models.user import User -from tests.conftest import auth_headers +from src.backend.models.orm.setting import SystemSetting +from src.backend.models.orm.user import User +from src.backend.tests.conftest import auth_headers class TestGetSettings: diff --git a/server/tests/test_setup.py b/src/backend/tests/test_setup.py similarity index 96% rename from server/tests/test_setup.py rename to src/backend/tests/test_setup.py index 41452b9..aa4ec6e 100644 --- a/server/tests/test_setup.py +++ b/src/backend/tests/test_setup.py @@ -2,8 +2,8 @@ import pytest from httpx import AsyncClient -from config import settings -from tests.conftest import test_engine, TestSessionFactory +from src.backend.config import settings +from src.backend.tests.conftest import test_engine, TestSessionFactory # --------------------------------------------------------------------------- @@ -20,7 +20,7 @@ def enable_setup(monkeypatch): # setup.py imports engine and async_session_factory directly from database # and uses them instead of get_db dependency injection. Patch them to use # the test in-memory SQLite engine/session instead of real MySQL. - import routers.setup as setup_mod + import src.backend.api.routers.setup as setup_mod monkeypatch.setattr(setup_mod, "engine", test_engine) monkeypatch.setattr(setup_mod, "async_session_factory", TestSessionFactory) @@ -52,7 +52,7 @@ async def test_seed_measurements_have_correct_distribution(client: AsyncClient, await _seed(client) from sqlalchemy import select, func - from models.measurement import Measurement + from src.backend.models.orm.measurement import Measurement result = await db_session.execute( select(Measurement.pass_fail, func.count()).group_by(Measurement.pass_fail) @@ -74,7 +74,7 @@ async def test_seed_measurements_have_lot_and_serial(client: AsyncClient, db_ses await _seed(client) from sqlalchemy import select, func - from models.measurement import Measurement + from src.backend.models.orm.measurement import Measurement result = await db_session.execute( select(func.count()).where(Measurement.lot_number.is_(None)) @@ -89,7 +89,7 @@ async def test_seed_measurements_input_methods(client: AsyncClient, db_session): await _seed(client) from sqlalchemy import select, func - from models.measurement import Measurement + from src.backend.models.orm.measurement import Measurement result = await db_session.execute( select(Measurement.input_method, func.count()).group_by(Measurement.input_method) diff --git a/server/tests/test_station_model.py b/src/backend/tests/test_station_model.py similarity index 94% rename from server/tests/test_station_model.py rename to src/backend/tests/test_station_model.py index 5935bac..b816743 100644 --- a/server/tests/test_station_model.py +++ b/src/backend/tests/test_station_model.py @@ -4,8 +4,8 @@ from sqlalchemy import select from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import AsyncSession -from models.station import Station, StationRecipeAssignment -from tests.conftest import _create_user, create_test_recipe +from src.backend.models.orm.station import Station, StationRecipeAssignment +from src.backend.tests.conftest import _create_user, create_test_recipe async def test_create_station(db_session: AsyncSession): diff --git a/server/tests/test_station_schemas.py b/src/backend/tests/test_station_schemas.py similarity index 95% rename from server/tests/test_station_schemas.py rename to src/backend/tests/test_station_schemas.py index 5b75763..49154ea 100644 --- a/server/tests/test_station_schemas.py +++ b/src/backend/tests/test_station_schemas.py @@ -2,7 +2,7 @@ import pytest from pydantic import ValidationError -from schemas.station import ( +from src.backend.models.api.station import ( StationCreate, StationUpdate, StationResponse, StationRecipeAssignmentCreate, StationRecipeAssignmentResponse, StationWithRecipesResponse, diff --git a/server/tests/test_station_seed.py b/src/backend/tests/test_station_seed.py similarity index 92% rename from server/tests/test_station_seed.py rename to src/backend/tests/test_station_seed.py index 7d8b1ac..900f001 100644 --- a/server/tests/test_station_seed.py +++ b/src/backend/tests/test_station_seed.py @@ -18,10 +18,10 @@ from httpx import AsyncClient from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from config import settings -from models.station import Station, StationRecipeAssignment -from models.recipe import Recipe -from tests.conftest import test_engine, TestSessionFactory +from src.backend.config import settings +from src.backend.models.orm.station import Station, StationRecipeAssignment +from src.backend.models.orm.recipe import Recipe +from src.backend.tests.conftest import test_engine, TestSessionFactory SETUP_PWD = "test-setup-pwd" @@ -31,7 +31,7 @@ SETUP_PWD = "test-setup-pwd" def enable_setup(monkeypatch): """Enable setup endpoints and redirect engine/session to test SQLite DB.""" monkeypatch.setattr(settings, "setup_password", SETUP_PWD) - import routers.setup as setup_mod + import src.backend.api.routers.setup as setup_mod monkeypatch.setattr(setup_mod, "engine", test_engine) monkeypatch.setattr(setup_mod, "async_session_factory", TestSessionFactory) diff --git a/server/tests/test_station_service.py b/src/backend/tests/test_station_service.py similarity index 94% rename from server/tests/test_station_service.py rename to src/backend/tests/test_station_service.py index e232fe0..b9e5510 100644 --- a/server/tests/test_station_service.py +++ b/src/backend/tests/test_station_service.py @@ -3,14 +3,14 @@ import pytest from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession -from models.station import Station -from schemas.station import StationCreate, StationUpdate -from services.station_service import ( +from src.backend.models.orm.station import Station +from src.backend.models.api.station import StationCreate, StationUpdate +from src.backend.services.station_service import ( create_station, update_station, delete_station, assign_recipe, unassign_recipe, list_station_recipes, get_station_by_code, ) -from tests.conftest import _create_user, create_test_recipe +from src.backend.tests.conftest import _create_user, create_test_recipe async def test_create_station_ok(db_session: AsyncSession): @@ -102,7 +102,7 @@ async def test_list_recipes_only_returns_active(db_session: AsyncSession): async def test_delete_station_cascades_assignments(db_session: AsyncSession): from sqlalchemy import select - from models.station import StationRecipeAssignment + from src.backend.models.orm.station import StationRecipeAssignment admin = await _create_user(db_session, username="a9", is_admin=True) station = await create_station(db_session, StationCreate(code="ST-DEL", name="D"), admin) r = await create_test_recipe(db_session, user_id=admin.id, code="REC-DEL") diff --git a/server/tests/test_stations_api.py b/src/backend/tests/test_stations_api.py similarity index 98% rename from server/tests/test_stations_api.py rename to src/backend/tests/test_stations_api.py index c936ee8..9b4cb2b 100644 --- a/server/tests/test_stations_api.py +++ b/src/backend/tests/test_stations_api.py @@ -2,7 +2,7 @@ import pytest from httpx import AsyncClient -from tests.conftest import auth_headers, create_test_recipe +from src.backend.tests.conftest import auth_headers, create_test_recipe async def test_list_stations_requires_auth(client: AsyncClient): diff --git a/server/tests/test_statistics.py b/src/backend/tests/test_statistics.py similarity index 97% rename from server/tests/test_statistics.py rename to src/backend/tests/test_statistics.py index 163b55f..3529e3c 100644 --- a/server/tests/test_statistics.py +++ b/src/backend/tests/test_statistics.py @@ -3,9 +3,9 @@ import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession -from models.user import User -from models.measurement import Measurement -from tests.conftest import auth_headers, create_test_recipe +from src.backend.models.orm.user import User +from src.backend.models.orm.measurement import Measurement +from src.backend.tests.conftest import auth_headers, create_test_recipe async def _seed_measurements( diff --git a/server/tests/test_tasks.py b/src/backend/tests/test_tasks.py similarity index 98% rename from server/tests/test_tasks.py rename to src/backend/tests/test_tasks.py index 7bd4dc5..fb27c4b 100644 --- a/server/tests/test_tasks.py +++ b/src/backend/tests/test_tasks.py @@ -3,8 +3,8 @@ import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession -from models.user import User -from tests.conftest import auth_headers, create_test_recipe +from src.backend.models.orm.user import User +from src.backend.tests.conftest import auth_headers, create_test_recipe class TestListTasks: diff --git a/server/tests/test_users.py b/src/backend/tests/test_users.py similarity index 97% rename from server/tests/test_users.py rename to src/backend/tests/test_users.py index a762d5b..36c3860 100644 --- a/server/tests/test_users.py +++ b/src/backend/tests/test_users.py @@ -3,8 +3,8 @@ import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession -from models.user import User -from tests.conftest import _create_user, auth_headers +from src.backend.models.orm.user import User +from src.backend.tests.conftest import _create_user, auth_headers class TestListUsers: diff --git a/server/requirements.txt b/src/backend_temp/requirements.txt similarity index 100% rename from server/requirements.txt rename to src/backend_temp/requirements.txt diff --git a/client/Dockerfile b/src/frontend/flask_app/Dockerfile.legacy similarity index 100% rename from client/Dockerfile rename to src/frontend/flask_app/Dockerfile.legacy diff --git a/client/I18N_SETUP.md b/src/frontend/flask_app/I18N_SETUP.md similarity index 100% rename from client/I18N_SETUP.md rename to src/frontend/flask_app/I18N_SETUP.md diff --git a/client/app.py b/src/frontend/flask_app/app.py similarity index 100% rename from client/app.py rename to src/frontend/flask_app/app.py diff --git a/client/templates/components/.gitkeep b/src/frontend/flask_app/blueprints/__init__.py similarity index 100% rename from client/templates/components/.gitkeep rename to src/frontend/flask_app/blueprints/__init__.py diff --git a/client/blueprints/admin.py b/src/frontend/flask_app/blueprints/admin.py similarity index 100% rename from client/blueprints/admin.py rename to src/frontend/flask_app/blueprints/admin.py diff --git a/client/blueprints/auth.py b/src/frontend/flask_app/blueprints/auth.py similarity index 100% rename from client/blueprints/auth.py rename to src/frontend/flask_app/blueprints/auth.py diff --git a/client/blueprints/maker.py b/src/frontend/flask_app/blueprints/maker.py similarity index 100% rename from client/blueprints/maker.py rename to src/frontend/flask_app/blueprints/maker.py diff --git a/client/blueprints/measure.py b/src/frontend/flask_app/blueprints/measure.py similarity index 100% rename from client/blueprints/measure.py rename to src/frontend/flask_app/blueprints/measure.py diff --git a/client/blueprints/statistics.py b/src/frontend/flask_app/blueprints/statistics.py similarity index 100% rename from client/blueprints/statistics.py rename to src/frontend/flask_app/blueprints/statistics.py diff --git a/client/compile_translations.py b/src/frontend/flask_app/compile_translations.py similarity index 100% rename from client/compile_translations.py rename to src/frontend/flask_app/compile_translations.py diff --git a/client/config.py b/src/frontend/flask_app/config.py similarity index 100% rename from client/config.py rename to src/frontend/flask_app/config.py diff --git a/client/templates/maker/.gitkeep b/src/frontend/flask_app/services/__init__.py similarity index 100% rename from client/templates/maker/.gitkeep rename to src/frontend/flask_app/services/__init__.py diff --git a/client/services/api_client.py b/src/frontend/flask_app/services/api_client.py similarity index 100% rename from client/services/api_client.py rename to src/frontend/flask_app/services/api_client.py diff --git a/client/static/css/input.css b/src/frontend/flask_app/static/css/input.css similarity index 100% rename from client/static/css/input.css rename to src/frontend/flask_app/static/css/input.css diff --git a/client/static/css/numpad.css b/src/frontend/flask_app/static/css/numpad.css similarity index 100% rename from client/static/css/numpad.css rename to src/frontend/flask_app/static/css/numpad.css diff --git a/client/static/css/themes.css b/src/frontend/flask_app/static/css/themes.css similarity index 100% rename from client/static/css/themes.css rename to src/frontend/flask_app/static/css/themes.css diff --git a/client/templates/measure/.gitkeep b/src/frontend/flask_app/static/img/.gitkeep similarity index 100% rename from client/templates/measure/.gitkeep rename to src/frontend/flask_app/static/img/.gitkeep diff --git a/client/static/img/tmflow-icon.svg b/src/frontend/flask_app/static/img/tmflow-icon.svg similarity index 100% rename from client/static/img/tmflow-icon.svg rename to src/frontend/flask_app/static/img/tmflow-icon.svg diff --git a/client/static/img/tmflow-logo.svg b/src/frontend/flask_app/static/img/tmflow-logo.svg similarity index 100% rename from client/static/img/tmflow-logo.svg rename to src/frontend/flask_app/static/img/tmflow-logo.svg diff --git a/client/tests/.gitkeep b/src/frontend/flask_app/static/js/.gitkeep similarity index 100% rename from client/tests/.gitkeep rename to src/frontend/flask_app/static/js/.gitkeep diff --git a/client/static/js/alpine-init.js b/src/frontend/flask_app/static/js/alpine-init.js similarity index 100% rename from client/static/js/alpine-init.js rename to src/frontend/flask_app/static/js/alpine-init.js diff --git a/client/static/js/annotation-editor.js b/src/frontend/flask_app/static/js/annotation-editor.js similarity index 100% rename from client/static/js/annotation-editor.js rename to src/frontend/flask_app/static/js/annotation-editor.js diff --git a/client/static/js/annotation-viewer.js b/src/frontend/flask_app/static/js/annotation-viewer.js similarity index 100% rename from client/static/js/annotation-viewer.js rename to src/frontend/flask_app/static/js/annotation-viewer.js diff --git a/client/static/js/barcode.js b/src/frontend/flask_app/static/js/barcode.js similarity index 100% rename from client/static/js/barcode.js rename to src/frontend/flask_app/static/js/barcode.js diff --git a/client/static/js/caliper.js b/src/frontend/flask_app/static/js/caliper.js similarity index 100% rename from client/static/js/caliper.js rename to src/frontend/flask_app/static/js/caliper.js diff --git a/client/static/js/csv-export.js b/src/frontend/flask_app/static/js/csv-export.js similarity index 100% rename from client/static/js/csv-export.js rename to src/frontend/flask_app/static/js/csv-export.js diff --git a/client/static/js/locales/en.json b/src/frontend/flask_app/static/js/locales/en.json similarity index 100% rename from client/static/js/locales/en.json rename to src/frontend/flask_app/static/js/locales/en.json diff --git a/client/static/js/locales/it.json b/src/frontend/flask_app/static/js/locales/it.json similarity index 100% rename from client/static/js/locales/it.json rename to src/frontend/flask_app/static/js/locales/it.json diff --git a/client/static/js/numpad.js b/src/frontend/flask_app/static/js/numpad.js similarity index 100% rename from client/static/js/numpad.js rename to src/frontend/flask_app/static/js/numpad.js diff --git a/client/static/js/spc-charts.js b/src/frontend/flask_app/static/js/spc-charts.js similarity index 100% rename from client/static/js/spc-charts.js rename to src/frontend/flask_app/static/js/spc-charts.js diff --git a/server/migrations/versions/.gitkeep b/src/frontend/flask_app/static/vendor/.gitkeep similarity index 100% rename from server/migrations/versions/.gitkeep rename to src/frontend/flask_app/static/vendor/.gitkeep diff --git a/client/tailwind.config.js b/src/frontend/flask_app/tailwind.config.js similarity index 100% rename from client/tailwind.config.js rename to src/frontend/flask_app/tailwind.config.js diff --git a/client/templates/admin/stations.html b/src/frontend/flask_app/templates/admin/stations.html similarity index 100% rename from client/templates/admin/stations.html rename to src/frontend/flask_app/templates/admin/stations.html diff --git a/client/templates/admin/users.html b/src/frontend/flask_app/templates/admin/users.html similarity index 100% rename from client/templates/admin/users.html rename to src/frontend/flask_app/templates/admin/users.html diff --git a/server/templates/reports/.gitkeep b/src/frontend/flask_app/templates/auth/.gitkeep similarity index 100% rename from server/templates/reports/.gitkeep rename to src/frontend/flask_app/templates/auth/.gitkeep diff --git a/client/templates/auth/login.html b/src/frontend/flask_app/templates/auth/login.html similarity index 100% rename from client/templates/auth/login.html rename to src/frontend/flask_app/templates/auth/login.html diff --git a/client/templates/auth/profile.html b/src/frontend/flask_app/templates/auth/profile.html similarity index 100% rename from client/templates/auth/profile.html rename to src/frontend/flask_app/templates/auth/profile.html diff --git a/client/templates/base.html b/src/frontend/flask_app/templates/base.html similarity index 100% rename from client/templates/base.html rename to src/frontend/flask_app/templates/base.html diff --git a/server/tests/.gitkeep b/src/frontend/flask_app/templates/components/.gitkeep similarity index 100% rename from server/tests/.gitkeep rename to src/frontend/flask_app/templates/components/.gitkeep diff --git a/client/templates/components/barcode_scanner.html b/src/frontend/flask_app/templates/components/barcode_scanner.html similarity index 100% rename from client/templates/components/barcode_scanner.html rename to src/frontend/flask_app/templates/components/barcode_scanner.html diff --git a/client/templates/components/caliper_status.html b/src/frontend/flask_app/templates/components/caliper_status.html similarity index 100% rename from client/templates/components/caliper_status.html rename to src/frontend/flask_app/templates/components/caliper_status.html diff --git a/client/templates/components/measurement_feedback.html b/src/frontend/flask_app/templates/components/measurement_feedback.html similarity index 100% rename from client/templates/components/measurement_feedback.html rename to src/frontend/flask_app/templates/components/measurement_feedback.html diff --git a/client/templates/components/navbar.html b/src/frontend/flask_app/templates/components/navbar.html similarity index 100% rename from client/templates/components/navbar.html rename to src/frontend/flask_app/templates/components/navbar.html diff --git a/client/templates/components/next_measurement.html b/src/frontend/flask_app/templates/components/next_measurement.html similarity index 100% rename from client/templates/components/next_measurement.html rename to src/frontend/flask_app/templates/components/next_measurement.html diff --git a/client/templates/components/numpad.html b/src/frontend/flask_app/templates/components/numpad.html similarity index 100% rename from client/templates/components/numpad.html rename to src/frontend/flask_app/templates/components/numpad.html diff --git a/client/templates/errors/station_not_configured.html b/src/frontend/flask_app/templates/errors/station_not_configured.html similarity index 100% rename from client/templates/errors/station_not_configured.html rename to src/frontend/flask_app/templates/errors/station_not_configured.html diff --git a/server/uploads/images/.gitkeep b/src/frontend/flask_app/templates/maker/.gitkeep similarity index 100% rename from server/uploads/images/.gitkeep rename to src/frontend/flask_app/templates/maker/.gitkeep diff --git a/client/templates/maker/recipe_editor.html b/src/frontend/flask_app/templates/maker/recipe_editor.html similarity index 100% rename from client/templates/maker/recipe_editor.html rename to src/frontend/flask_app/templates/maker/recipe_editor.html diff --git a/client/templates/maker/recipe_list.html b/src/frontend/flask_app/templates/maker/recipe_list.html similarity index 100% rename from client/templates/maker/recipe_list.html rename to src/frontend/flask_app/templates/maker/recipe_list.html diff --git a/client/templates/maker/recipe_preview.html b/src/frontend/flask_app/templates/maker/recipe_preview.html similarity index 100% rename from client/templates/maker/recipe_preview.html rename to src/frontend/flask_app/templates/maker/recipe_preview.html diff --git a/client/templates/maker/task_drawing.html b/src/frontend/flask_app/templates/maker/task_drawing.html similarity index 100% rename from client/templates/maker/task_drawing.html rename to src/frontend/flask_app/templates/maker/task_drawing.html diff --git a/client/templates/maker/task_editor.html b/src/frontend/flask_app/templates/maker/task_editor.html similarity index 100% rename from client/templates/maker/task_editor.html rename to src/frontend/flask_app/templates/maker/task_editor.html diff --git a/client/templates/maker/version_history.html b/src/frontend/flask_app/templates/maker/version_history.html similarity index 100% rename from client/templates/maker/version_history.html rename to src/frontend/flask_app/templates/maker/version_history.html diff --git a/server/uploads/logos/.gitkeep b/src/frontend/flask_app/templates/measure/.gitkeep similarity index 100% rename from server/uploads/logos/.gitkeep rename to src/frontend/flask_app/templates/measure/.gitkeep diff --git a/client/templates/measure/select_recipe.html b/src/frontend/flask_app/templates/measure/select_recipe.html similarity index 100% rename from client/templates/measure/select_recipe.html rename to src/frontend/flask_app/templates/measure/select_recipe.html diff --git a/client/templates/measure/task_complete.html b/src/frontend/flask_app/templates/measure/task_complete.html similarity index 100% rename from client/templates/measure/task_complete.html rename to src/frontend/flask_app/templates/measure/task_complete.html diff --git a/client/templates/measure/task_execute.html b/src/frontend/flask_app/templates/measure/task_execute.html similarity index 100% rename from client/templates/measure/task_execute.html rename to src/frontend/flask_app/templates/measure/task_execute.html diff --git a/client/templates/measure/task_list.html b/src/frontend/flask_app/templates/measure/task_list.html similarity index 100% rename from client/templates/measure/task_list.html rename to src/frontend/flask_app/templates/measure/task_list.html diff --git a/client/templates/statistics/dashboard.html b/src/frontend/flask_app/templates/statistics/dashboard.html similarity index 100% rename from client/templates/statistics/dashboard.html rename to src/frontend/flask_app/templates/statistics/dashboard.html diff --git a/server/uploads/pdfs/.gitkeep b/src/frontend/flask_app/tests/.gitkeep similarity index 100% rename from server/uploads/pdfs/.gitkeep rename to src/frontend/flask_app/tests/.gitkeep diff --git a/server/uploads/reports/.gitkeep b/src/frontend/flask_app/tests/__init__.py similarity index 100% rename from server/uploads/reports/.gitkeep rename to src/frontend/flask_app/tests/__init__.py diff --git a/client/tests/conftest.py b/src/frontend/flask_app/tests/conftest.py similarity index 100% rename from client/tests/conftest.py rename to src/frontend/flask_app/tests/conftest.py diff --git a/client/tests/test_admin_stations.py b/src/frontend/flask_app/tests/test_admin_stations.py similarity index 100% rename from client/tests/test_admin_stations.py rename to src/frontend/flask_app/tests/test_admin_stations.py diff --git a/client/tests/test_api_client_proxy.py b/src/frontend/flask_app/tests/test_api_client_proxy.py similarity index 100% rename from client/tests/test_api_client_proxy.py rename to src/frontend/flask_app/tests/test_api_client_proxy.py diff --git a/client/tests/test_api_client_stations.py b/src/frontend/flask_app/tests/test_api_client_stations.py similarity index 100% rename from client/tests/test_api_client_stations.py rename to src/frontend/flask_app/tests/test_api_client_stations.py diff --git a/client/tests/test_auth.py b/src/frontend/flask_app/tests/test_auth.py similarity index 100% rename from client/tests/test_auth.py rename to src/frontend/flask_app/tests/test_auth.py diff --git a/client/tests/test_config_station.py b/src/frontend/flask_app/tests/test_config_station.py similarity index 100% rename from client/tests/test_config_station.py rename to src/frontend/flask_app/tests/test_config_station.py diff --git a/client/tests/test_maker.py b/src/frontend/flask_app/tests/test_maker.py similarity index 100% rename from client/tests/test_maker.py rename to src/frontend/flask_app/tests/test_maker.py diff --git a/client/tests/test_measure.py b/src/frontend/flask_app/tests/test_measure.py similarity index 100% rename from client/tests/test_measure.py rename to src/frontend/flask_app/tests/test_measure.py diff --git a/client/tests/test_measure_station_filter.py b/src/frontend/flask_app/tests/test_measure_station_filter.py similarity index 100% rename from client/tests/test_measure_station_filter.py rename to src/frontend/flask_app/tests/test_measure_station_filter.py diff --git a/client/tests/test_statistics.py b/src/frontend/flask_app/tests/test_statistics.py similarity index 100% rename from client/tests/test_statistics.py rename to src/frontend/flask_app/tests/test_statistics.py diff --git a/client/translations/babel.cfg b/src/frontend/flask_app/translations/babel.cfg similarity index 100% rename from client/translations/babel.cfg rename to src/frontend/flask_app/translations/babel.cfg diff --git a/client/translations/en/LC_MESSAGES/messages.po b/src/frontend/flask_app/translations/en/LC_MESSAGES/messages.po similarity index 100% rename from client/translations/en/LC_MESSAGES/messages.po rename to src/frontend/flask_app/translations/en/LC_MESSAGES/messages.po diff --git a/client/translations/it/LC_MESSAGES/messages.po b/src/frontend/flask_app/translations/it/LC_MESSAGES/messages.po similarity index 100% rename from client/translations/it/LC_MESSAGES/messages.po rename to src/frontend/flask_app/translations/it/LC_MESSAGES/messages.po diff --git a/client/translations/messages.pot b/src/frontend/flask_app/translations/messages.pot similarity index 100% rename from client/translations/messages.pot rename to src/frontend/flask_app/translations/messages.pot diff --git a/client/verify_i18n.py b/src/frontend/flask_app/verify_i18n.py similarity index 100% rename from client/verify_i18n.py rename to src/frontend/flask_app/verify_i18n.py diff --git a/uploads/images/.gitkeep b/uploads/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/uploads/logos/.gitkeep b/uploads/logos/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/uploads/pdfs/.gitkeep b/uploads/pdfs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/uploads/reports/.gitkeep b/uploads/reports/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..1c5a90b --- /dev/null +++ b/uv.lock @@ -0,0 +1,2018 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version < '3.13'", +] + +[[package]] +name = "aiosqlite" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821, upload-time = "2025-12-23T19:25:43.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405, upload-time = "2025-12-23T19:25:42.139Z" }, +] + +[[package]] +name = "alembic" +version = "1.18.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/13/8b084e0f2efb0275a1d534838844926f798bd766566b1375174e2448cd31/alembic-1.18.4.tar.gz", hash = "sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc", size = 2056725, upload-time = "2026-02-10T16:00:47.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/29/6533c317b74f707ea28f8d633734dbda2119bbadfc61b2f3640ba835d0f7/alembic-1.18.4-py3-none-any.whl", hash = "sha256:a5ed4adcf6d8a4cb575f3d759f071b03cd6e5c7618eb796cb52497be25bfe19a", size = 263893, upload-time = "2026-02-10T16:00:49.997Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[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.13.0" +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/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "asyncmy" +version = "0.2.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/3c/d8297584c40f3d1af55365026bcdca7844ecfea1d917ad19df48f8331a26/asyncmy-0.2.11.tar.gz", hash = "sha256:c3d65d959dde62c911e39ecd1ad0f1339a5e6929fc411d48cfc2f82846190bf4", size = 62865, upload-time = "2026-01-15T11:32:30.368Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/58/ec29057913334cacaa2be98eacb21ad468bc58214ff25aab28b78487d697/asyncmy-0.2.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b324b70438120cabdb1b0d8789082b8a2770257e7beaa7d036322ba5f603f25", size = 1757174, upload-time = "2026-01-15T11:31:43.006Z" }, + { url = "https://files.pythonhosted.org/packages/7e/46/7939167e05143c8feba1812dbdd478579d215d4b6d7f84856981ab71db7c/asyncmy-0.2.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:919811ec4157506632a354047b943b995c71f31182d430ab87c60ccee844c1d9", size = 1724357, upload-time = "2026-01-15T11:31:44.826Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a0/5cfc1bdeb6166ea26eac97d3cefb574d490aabc052478a3f65730b7379d9/asyncmy-0.2.11-cp311-cp311-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:8f416fba944dad20d47eb9a4db1a1853a0f7856b12b0a3b52c1a2fba2f447851", size = 5100925, upload-time = "2026-01-15T11:31:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/0e/37/d9bda68844e6741a7e7e1e449da6cc7926b7ccbf11af26a806b19fd7e7ae/asyncmy-0.2.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:905a6693e3dbaf4280dfced96131bada108554754df40d75a7ff91961ba7331a", size = 5303964, upload-time = "2026-01-15T11:31:48.719Z" }, + { url = "https://files.pythonhosted.org/packages/57/da/358b6e50148a808e05963acd2ae47c1fbef4cdead0157ce2fc90fd4ecf7d/asyncmy-0.2.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ff3ac9feb09e4e80c227280f6350c8015cfed018efe9090f41e2fb4ab8cbf163", size = 5116361, upload-time = "2026-01-15T11:31:50.26Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e8/6b11d62b0e164adbff5ed882d650c8b60fa710001965c54c70c77cffc941/asyncmy-0.2.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:be18725eeccb616b5769ed8cbcabb2758a47e162c4232d7bef98b978950228ad", size = 5241238, upload-time = "2026-01-15T11:31:51.708Z" }, + { url = "https://files.pythonhosted.org/packages/34/6b/d28fe93160900aba9573cbbf9be5291ac2f1a37eab4fd85e366d5ecbfd84/asyncmy-0.2.11-cp311-cp311-win32.whl", hash = "sha256:d32e03278b72f7ef80c0692797e0ce1c03a63ac0192f858d804a6ecd471754e3", size = 1583714, upload-time = "2026-01-15T11:31:52.968Z" }, + { url = "https://files.pythonhosted.org/packages/09/29/39effc0c56fea76b695490b95df0da4dd0b6f040ed160ad40740e1358265/asyncmy-0.2.11-cp311-cp311-win_amd64.whl", hash = "sha256:adfe7d271f9ef52c5f96ffd716ed7726839ec7c39fccf98748803f871b399dbd", size = 1655038, upload-time = "2026-01-15T11:31:54.161Z" }, + { url = "https://files.pythonhosted.org/packages/ca/93/3b4c7f9b35a27e80bd2f305c4c8d7ae56b6dd40d616d34dd4dbb818c90c9/asyncmy-0.2.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:914dddd2ba884822a304297f6ca96026548a100339a4e0ca5c427f6cfa3e4b62", size = 1731817, upload-time = "2026-01-15T11:31:55.486Z" }, + { url = "https://files.pythonhosted.org/packages/7b/65/c70b2b8d014b21504de7e2027e2456f7774cec855766ec1808da47d70b24/asyncmy-0.2.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ea7ca4bcf7747b1fd4e80f16aa461972e0931cecd3bc43a3ba8e14a5d368a98", size = 1712017, upload-time = "2026-01-15T11:31:56.795Z" }, + { url = "https://files.pythonhosted.org/packages/65/a9/f326999a1ffacc7738376fa68c7ede164db9e5520bb4dbd35f1fdd5704dd/asyncmy-0.2.11-cp312-cp312-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:b2fd6e04efca56d9176e7b620ee47dd1dd334e2eb03c1ae1580954c2625b99d1", size = 4986605, upload-time = "2026-01-15T11:31:58.462Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f2/634326efc5fca15620eb106194d2287997a31625dc95f1940a3cef2f80a7/asyncmy-0.2.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4df583dd9d09e817c4cc68b706133d5da453faf56da431a24fcdd64b9552e26b", size = 5226256, upload-time = "2026-01-15T11:32:00.095Z" }, + { url = "https://files.pythonhosted.org/packages/35/7f/4ecd2dcee1d13d49a301ab8ee11a33c75ded4b3089bdb7bf5fb385ed162d/asyncmy-0.2.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2d473b683db7fa1acb167a4bc25ea38e398c991427bd8aa708a9b75059a1d33", size = 5045263, upload-time = "2026-01-15T11:32:01.653Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3e/d94fc4a0ca1e2e492982db607c26b48a95ba668e24755f3bf00da68ae9be/asyncmy-0.2.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d03803975e5dfe74ef4af18411da3716681fde78a65a8758237e7e3e4a342ba1", size = 5194397, upload-time = "2026-01-15T11:32:03.068Z" }, + { url = "https://files.pythonhosted.org/packages/1e/06/d1bb47ce9ed32ba02f2ff44118d5eb36702d38f97cd824bd6a51d3decfdf/asyncmy-0.2.11-cp312-cp312-win32.whl", hash = "sha256:564fc38b3a0665663b8b2ec35fc34fd2768688ba5c869a0d8bd1eb57b85351b2", size = 1560945, upload-time = "2026-01-15T11:32:04.543Z" }, + { url = "https://files.pythonhosted.org/packages/74/d8/973c576c84f4b706a45372c959778feca6842033ccbbd26b2bfe344ebc4b/asyncmy-0.2.11-cp312-cp312-win_amd64.whl", hash = "sha256:84e23466602407da7e126fb5f2da2948c69a6f0d40d4ea7771331771e05c1c2e", size = 1637442, upload-time = "2026-01-15T11:32:05.802Z" }, + { url = "https://files.pythonhosted.org/packages/83/9a/b5b77690f7287acb0a284319e85378c6f4063cd3617dd5311e00f332d628/asyncmy-0.2.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a48be02bdae5e5324ac2d142d7afc6dd9c6af546fd892804c9d8e58d8107980", size = 1727740, upload-time = "2026-01-15T11:32:07.443Z" }, + { url = "https://files.pythonhosted.org/packages/10/28/7b168dc84704edb0b60f7906bfba3a451fd90c0cb2443edbb377b1a11d20/asyncmy-0.2.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:babed99ea1cf7edb476dba23c27560b2a042de46e61678c0cfa3bc017e5f49e4", size = 1706138, upload-time = "2026-01-15T11:32:08.898Z" }, + { url = "https://files.pythonhosted.org/packages/ec/27/ac7363e8ab95f2048852851bbbef12d4eee62363d202d7e566291023ece4/asyncmy-0.2.11-cp313-cp313-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:709cc8147edad072b5176d87878a985323c87cc017c460073414f2b7d5ae9d01", size = 4942591, upload-time = "2026-01-15T11:32:10.127Z" }, + { url = "https://files.pythonhosted.org/packages/08/81/092314cc97e3732535804f2d3e1b966daeaa3a33a8e9a686328cf09498ad/asyncmy-0.2.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:373aecf8cd17662c13bab69dc36db7242be8e956242164469b8733886fb2ec0a", size = 5178039, upload-time = "2026-01-15T11:32:12.088Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9b/b884404bac62d9b6efbc9006c4b80ad55e8b0bb6f585b44eee1eceb07b1c/asyncmy-0.2.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e23ea478e6638e479dfab2674d2c39a21160c7d750d5c8cf2a0e205d947a63b7", size = 4987628, upload-time = "2026-01-15T11:32:13.979Z" }, + { url = "https://files.pythonhosted.org/packages/00/65/68e576aecd2a43d383123e3a66339e6a3535495b0e81443e374a3d3c356d/asyncmy-0.2.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:577272e238aff9b985eb880b49b1ba009e1fd1133b754fc71c833ab5bd9561ee", size = 5143375, upload-time = "2026-01-15T11:32:15.38Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e4/cd30ea75ab96e5c6fe0daf6bd1871753fe5a1677515530fa0bc1a807dd6c/asyncmy-0.2.11-cp313-cp313-win32.whl", hash = "sha256:29536a08bf8c96437188ae4080fdd09c5a82cbe93794d0996cd0dd238f632664", size = 1559106, upload-time = "2026-01-15T11:32:16.895Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3e/497e3ac839d7d18e79770b977f90e6f17a87181f95b8aed59359ff4aba0c/asyncmy-0.2.11-cp313-cp313-win_amd64.whl", hash = "sha256:f095af7b980505158609ca0bcdd0d14d1e48893e43fc1856c7cecfd9439f498c", size = 1635619, upload-time = "2026-01-15T11:32:18.241Z" }, +] + +[[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 = "bcrypt" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/36/3329e2518d70ad8e2e5817d5a4cac6bba05a47767ec416c7d020a965f408/bcrypt-5.0.0.tar.gz", hash = "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", size = 25386, upload-time = "2025-09-25T19:50:47.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/85/3e65e01985fddf25b64ca67275bb5bdb4040bd1a53b66d355c6c37c8a680/bcrypt-5.0.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f3c08197f3039bec79cee59a606d62b96b16669cff3949f21e74796b6e3cd2be", size = 481806, upload-time = "2025-09-25T19:49:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/44/dc/01eb79f12b177017a726cbf78330eb0eb442fae0e7b3dfd84ea2849552f3/bcrypt-5.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:200af71bc25f22006f4069060c88ed36f8aa4ff7f53e67ff04d2ab3f1e79a5b2", size = 268626, upload-time = "2025-09-25T19:49:06.723Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/e82388ad5959c40d6afd94fb4743cc077129d45b952d46bdc3180310e2df/bcrypt-5.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:baade0a5657654c2984468efb7d6c110db87ea63ef5a4b54732e7e337253e44f", size = 271853, upload-time = "2025-09-25T19:49:08.028Z" }, + { url = "https://files.pythonhosted.org/packages/ec/86/7134b9dae7cf0efa85671651341f6afa695857fae172615e960fb6a466fa/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c58b56cdfb03202b3bcc9fd8daee8e8e9b6d7e3163aa97c631dfcfcc24d36c86", size = 269793, upload-time = "2025-09-25T19:49:09.727Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/6296688ac1b9e503d034e7d0614d56e80c5d1a08402ff856a4549cb59207/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bfd2a34de661f34d0bda43c3e4e79df586e4716ef401fe31ea39d69d581ef23", size = 289930, upload-time = "2025-09-25T19:49:11.204Z" }, + { url = "https://files.pythonhosted.org/packages/d1/18/884a44aa47f2a3b88dd09bc05a1e40b57878ecd111d17e5bba6f09f8bb77/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ed2e1365e31fc73f1825fa830f1c8f8917ca1b3ca6185773b349c20fd606cec2", size = 272194, upload-time = "2025-09-25T19:49:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/0e/8f/371a3ab33c6982070b674f1788e05b656cfbf5685894acbfef0c65483a59/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:83e787d7a84dbbfba6f250dd7a5efd689e935f03dd83b0f919d39349e1f23f83", size = 269381, upload-time = "2025-09-25T19:49:14.308Z" }, + { url = "https://files.pythonhosted.org/packages/b1/34/7e4e6abb7a8778db6422e88b1f06eb07c47682313997ee8a8f9352e5a6f1/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:137c5156524328a24b9fac1cb5db0ba618bc97d11970b39184c1d87dc4bf1746", size = 271750, upload-time = "2025-09-25T19:49:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/54f416be2499bd72123c70d98d36c6cd61a4e33d9b89562c22481c81bb30/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:38cac74101777a6a7d3b3e3cfefa57089b5ada650dce2baf0cbdd9d65db22a9e", size = 303757, upload-time = "2025-09-25T19:49:17.244Z" }, + { url = "https://files.pythonhosted.org/packages/13/62/062c24c7bcf9d2826a1a843d0d605c65a755bc98002923d01fd61270705a/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d8d65b564ec849643d9f7ea05c6d9f0cd7ca23bdd4ac0c2dbef1104ab504543d", size = 306740, upload-time = "2025-09-25T19:49:18.693Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/1fdbfc8c0f20875b6b4020f3c7dc447b8de60aa0be5faaf009d24242aec9/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:741449132f64b3524e95cd30e5cd3343006ce146088f074f31ab26b94e6c75ba", size = 334197, upload-time = "2025-09-25T19:49:20.523Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c1/8b84545382d75bef226fbc6588af0f7b7d095f7cd6a670b42a86243183cd/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:212139484ab3207b1f0c00633d3be92fef3c5f0af17cad155679d03ff2ee1e41", size = 352974, upload-time = "2025-09-25T19:49:22.254Z" }, + { url = "https://files.pythonhosted.org/packages/10/a6/ffb49d4254ed085e62e3e5dd05982b4393e32fe1e49bb1130186617c29cd/bcrypt-5.0.0-cp313-cp313t-win32.whl", hash = "sha256:9d52ed507c2488eddd6a95bccee4e808d3234fa78dd370e24bac65a21212b861", size = 148498, upload-time = "2025-09-25T19:49:24.134Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/259559edc85258b6d5fc5471a62a3299a6aa37a6611a169756bf4689323c/bcrypt-5.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f6984a24db30548fd39a44360532898c33528b74aedf81c26cf29c51ee47057e", size = 145853, upload-time = "2025-09-25T19:49:25.702Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/9714173403c7e8b245acf8e4be8876aac64a209d1b392af457c79e60492e/bcrypt-5.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9fffdb387abe6aa775af36ef16f55e318dcda4194ddbf82007a6f21da29de8f5", size = 139626, upload-time = "2025-09-25T19:49:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/f8/14/c18006f91816606a4abe294ccc5d1e6f0e42304df5a33710e9e8e95416e1/bcrypt-5.0.0-cp314-cp314t-macosx_10_12_universal2.whl", hash = "sha256:4870a52610537037adb382444fefd3706d96d663ac44cbb2f37e3919dca3d7ef", size = 481862, upload-time = "2025-09-25T19:49:28.365Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/dd074d831f00e589537e07a0725cf0e220d1f0d5d8e85ad5bbff251c45aa/bcrypt-5.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48f753100931605686f74e27a7b49238122aa761a9aefe9373265b8b7aa43ea4", size = 268544, upload-time = "2025-09-25T19:49:30.39Z" }, + { url = "https://files.pythonhosted.org/packages/f5/91/50ccba088b8c474545b034a1424d05195d9fcbaaf802ab8bfe2be5a4e0d7/bcrypt-5.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70aadb7a809305226daedf75d90379c397b094755a710d7014b8b117df1ebbf", size = 271787, upload-time = "2025-09-25T19:49:32.144Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e7/d7dba133e02abcda3b52087a7eea8c0d4f64d3e593b4fffc10c31b7061f3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:744d3c6b164caa658adcb72cb8cc9ad9b4b75c7db507ab4bc2480474a51989da", size = 269753, upload-time = "2025-09-25T19:49:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/33/fc/5b145673c4b8d01018307b5c2c1fc87a6f5a436f0ad56607aee389de8ee3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a28bc05039bdf3289d757f49d616ab3efe8cf40d8e8001ccdd621cd4f98f4fc9", size = 289587, upload-time = "2025-09-25T19:49:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/27/d7/1ff22703ec6d4f90e62f1a5654b8867ef96bafb8e8102c2288333e1a6ca6/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7f277a4b3390ab4bebe597800a90da0edae882c6196d3038a73adf446c4f969f", size = 272178, upload-time = "2025-09-25T19:49:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/c8/88/815b6d558a1e4d40ece04a2f84865b0fef233513bd85fd0e40c294272d62/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:79cfa161eda8d2ddf29acad370356b47f02387153b11d46042e93a0a95127493", size = 269295, upload-time = "2025-09-25T19:49:38.164Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/e0db387c79ab4931fc89827d37608c31cc57b6edc08ccd2386139028dc0d/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a5393eae5722bcef046a990b84dff02b954904c36a194f6cfc817d7dca6c6f0b", size = 271700, upload-time = "2025-09-25T19:49:39.917Z" }, + { url = "https://files.pythonhosted.org/packages/06/83/1570edddd150f572dbe9fc00f6203a89fc7d4226821f67328a85c330f239/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f4c94dec1b5ab5d522750cb059bb9409ea8872d4494fd152b53cca99f1ddd8c", size = 334034, upload-time = "2025-09-25T19:49:41.227Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/ea64e51a65e56ae7a8a4ec236c2bfbdd4b23008abd50ac33fbb2d1d15424/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0cae4cb350934dfd74c020525eeae0a5f79257e8a201c0c176f4b84fdbf2a4b4", size = 352766, upload-time = "2025-09-25T19:49:43.08Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/1a388d21ee66876f27d1a1f41287897d0c0f1712ef97d395d708ba93004c/bcrypt-5.0.0-cp314-cp314t-win32.whl", hash = "sha256:b17366316c654e1ad0306a6858e189fc835eca39f7eb2cafd6aaca8ce0c40a2e", size = 152449, upload-time = "2025-09-25T19:49:44.971Z" }, + { url = "https://files.pythonhosted.org/packages/3f/61/3291c2243ae0229e5bca5d19f4032cecad5dfb05a2557169d3a69dc0ba91/bcrypt-5.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:92864f54fb48b4c718fc92a32825d0e42265a627f956bc0361fe869f1adc3e7d", size = 149310, upload-time = "2025-09-25T19:49:46.162Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/4b01c52ae0c1a681d4021e5dd3e45b111a8fb47254a274fa9a378d8d834b/bcrypt-5.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dd19cf5184a90c873009244586396a6a884d591a5323f0e8a5922560718d4993", size = 143761, upload-time = "2025-09-25T19:49:47.345Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/6237f151fbfe295fe3e074ecc6d44228faa1e842a81f6d34a02937ee1736/bcrypt-5.0.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b", size = 494553, upload-time = "2025-09-25T19:49:49.006Z" }, + { url = "https://files.pythonhosted.org/packages/45/b6/4c1205dde5e464ea3bd88e8742e19f899c16fa8916fb8510a851fae985b5/bcrypt-5.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", size = 275009, upload-time = "2025-09-25T19:49:50.581Z" }, + { url = "https://files.pythonhosted.org/packages/3b/71/427945e6ead72ccffe77894b2655b695ccf14ae1866cd977e185d606dd2f/bcrypt-5.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", size = 278029, upload-time = "2025-09-25T19:49:52.533Z" }, + { url = "https://files.pythonhosted.org/packages/17/72/c344825e3b83c5389a369c8a8e58ffe1480b8a699f46c127c34580c4666b/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", size = 275907, upload-time = "2025-09-25T19:49:54.709Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7e/d4e47d2df1641a36d1212e5c0514f5291e1a956a7749f1e595c07a972038/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", size = 296500, upload-time = "2025-09-25T19:49:56.013Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c3/0ae57a68be2039287ec28bc463b82e4b8dc23f9d12c0be331f4782e19108/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", size = 278412, upload-time = "2025-09-25T19:49:57.356Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/77424511adb11e6a99e3a00dcc7745034bee89036ad7d7e255a7e47be7d8/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", size = 275486, upload-time = "2025-09-25T19:49:59.116Z" }, + { url = "https://files.pythonhosted.org/packages/43/0a/405c753f6158e0f3f14b00b462d8bca31296f7ecfc8fc8bc7919c0c7d73a/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", size = 277940, upload-time = "2025-09-25T19:50:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/b3efc285d4aadc1fa83db385ec64dcfa1707e890eb42f03b127d66ac1b7b/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", size = 310776, upload-time = "2025-09-25T19:50:02.393Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/47ee337dacecde6d234890fe929936cb03ebc4c3a7460854bbd9c97780b8/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", size = 312922, upload-time = "2025-09-25T19:50:04.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3a/43d494dfb728f55f4e1cf8fd435d50c16a2d75493225b54c8d06122523c6/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", size = 341367, upload-time = "2025-09-25T19:50:05.559Z" }, + { url = "https://files.pythonhosted.org/packages/55/ab/a0727a4547e383e2e22a630e0f908113db37904f58719dc48d4622139b5c/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", size = 359187, upload-time = "2025-09-25T19:50:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/461f352fdca663524b4643d8b09e8435b4990f17fbf4fea6bc2a90aa0cc7/bcrypt-5.0.0-cp38-abi3-win32.whl", hash = "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", size = 153752, upload-time = "2025-09-25T19:50:08.515Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/4190e60921927b7056820291f56fc57d00d04757c8b316b2d3c0d1d6da2c/bcrypt-5.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", size = 150881, upload-time = "2025-09-25T19:50:09.742Z" }, + { url = "https://files.pythonhosted.org/packages/54/12/cd77221719d0b39ac0b55dbd39358db1cd1246e0282e104366ebbfb8266a/bcrypt-5.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", size = 144931, upload-time = "2025-09-25T19:50:11.016Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/2af136406e1c3839aea9ecadc2f6be2bcd1eff255bd451dd39bcf302c47a/bcrypt-5.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", size = 495313, upload-time = "2025-09-25T19:50:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ee/2f4985dbad090ace5ad1f7dd8ff94477fe089b5fab2040bd784a3d5f187b/bcrypt-5.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", size = 275290, upload-time = "2025-09-25T19:50:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/b77ade812672d15cf50842e167eead80ac3514f3beacac8902915417f8b7/bcrypt-5.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", size = 278253, upload-time = "2025-09-25T19:50:15.089Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/ed00ed32f1040f7990dac7115f82273e3c03da1e1a1587a778d8cea496d8/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", size = 276084, upload-time = "2025-09-25T19:50:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fa6e16145e145e87f1fa351bbd54b429354fd72145cd3d4e0c5157cf4c70/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", size = 297185, upload-time = "2025-09-25T19:50:18.525Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/11f8a31d8b67cca3371e046db49baa7c0594d71eb40ac8121e2fc0888db0/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", size = 278656, upload-time = "2025-09-25T19:50:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/ac/31/79f11865f8078e192847d2cb526e3fa27c200933c982c5b2869720fa5fce/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", size = 275662, upload-time = "2025-09-25T19:50:21.567Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8d/5e43d9584b3b3591a6f9b68f755a4da879a59712981ef5ad2a0ac1379f7a/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", size = 278240, upload-time = "2025-09-25T19:50:23.305Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/44590e3fc158620f680a978aafe8f87a4c4320da81ed11552f0323aa9a57/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", size = 311152, upload-time = "2025-09-25T19:50:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/e4fbfc46f14f47b0d20493669a625da5827d07e8a88ee460af6cd9768b44/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", size = 313284, upload-time = "2025-09-25T19:50:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/25/ae/479f81d3f4594456a01ea2f05b132a519eff9ab5768a70430fa1132384b1/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", size = 341643, upload-time = "2025-09-25T19:50:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/df/d2/36a086dee1473b14276cd6ea7f61aef3b2648710b5d7f1c9e032c29b859f/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", size = 359698, upload-time = "2025-09-25T19:50:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f6/688d2cd64bfd0b14d805ddb8a565e11ca1fb0fd6817175d58b10052b6d88/bcrypt-5.0.0-cp39-abi3-win32.whl", hash = "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", size = 153725, upload-time = "2025-09-25T19:50:34.384Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/9d9a641194a730bda138b3dfe53f584d61c58cd5230e37566e83ec2ffa0d/bcrypt-5.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", size = 150912, upload-time = "2025-09-25T19:50:35.69Z" }, + { url = "https://files.pythonhosted.org/packages/27/44/d2ef5e87509158ad2187f4dd0852df80695bb1ee0cfe0a684727b01a69e0/bcrypt-5.0.0-cp39-abi3-win_arm64.whl", hash = "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", size = 144953, upload-time = "2025-09-25T19:50:37.32Z" }, + { url = "https://files.pythonhosted.org/packages/8a/75/4aa9f5a4d40d762892066ba1046000b329c7cd58e888a6db878019b282dc/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7edda91d5ab52b15636d9c30da87d2cc84f426c72b9dba7a9b4fe142ba11f534", size = 271180, upload-time = "2025-09-25T19:50:38.575Z" }, + { url = "https://files.pythonhosted.org/packages/54/79/875f9558179573d40a9cc743038ac2bf67dfb79cecb1e8b5d70e88c94c3d/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:046ad6db88edb3c5ece4369af997938fb1c19d6a699b9c1b27b0db432faae4c4", size = 273791, upload-time = "2025-09-25T19:50:39.913Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fe/975adb8c216174bf70fc17535f75e85ac06ed5252ea077be10d9cff5ce24/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:dcd58e2b3a908b5ecc9b9df2f0085592506ac2d5110786018ee5e160f28e0911", size = 270746, upload-time = "2025-09-25T19:50:43.306Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f8/972c96f5a2b6c4b3deca57009d93e946bbdbe2241dca9806d502f29dd3ee/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:6b8f520b61e8781efee73cba14e3e8c9556ccfb375623f4f97429544734545b4", size = 273375, upload-time = "2025-09-25T19:50:45.43Z" }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + +[[package]] +name = "brotli" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/ef/f285668811a9e1ddb47a18cb0b437d5fc2760d537a2fe8a57875ad6f8448/brotli-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:15b33fe93cedc4caaff8a0bd1eb7e3dab1c61bb22a0bf5bdfdfd97cd7da79744", size = 863110, upload-time = "2025-11-05T18:38:12.978Z" }, + { url = "https://files.pythonhosted.org/packages/50/62/a3b77593587010c789a9d6eaa527c79e0848b7b860402cc64bc0bc28a86c/brotli-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:898be2be399c221d2671d29eed26b6b2713a02c2119168ed914e7d00ceadb56f", size = 445438, upload-time = "2025-11-05T18:38:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e1/7fadd47f40ce5549dc44493877db40292277db373da5053aff181656e16e/brotli-1.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350c8348f0e76fff0a0fd6c26755d2653863279d086d3aa2c290a6a7251135dd", size = 1534420, upload-time = "2025-11-05T18:38:15.111Z" }, + { url = "https://files.pythonhosted.org/packages/12/8b/1ed2f64054a5a008a4ccd2f271dbba7a5fb1a3067a99f5ceadedd4c1d5a7/brotli-1.2.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1ad3fda65ae0d93fec742a128d72e145c9c7a99ee2fcd667785d99eb25a7fe", size = 1632619, upload-time = "2025-11-05T18:38:16.094Z" }, + { url = "https://files.pythonhosted.org/packages/89/5a/7071a621eb2d052d64efd5da2ef55ecdac7c3b0c6e4f9d519e9c66d987ef/brotli-1.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40d918bce2b427a0c4ba189df7a006ac0c7277c180aee4617d99e9ccaaf59e6a", size = 1426014, upload-time = "2025-11-05T18:38:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/0971a8ea435af5156acaaccec1a505f981c9c80227633851f2810abd252a/brotli-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2a7f1d03727130fc875448b65b127a9ec5d06d19d0148e7554384229706f9d1b", size = 1489661, upload-time = "2025-11-05T18:38:18.41Z" }, + { url = "https://files.pythonhosted.org/packages/f3/75/c1baca8b4ec6c96a03ef8230fab2a785e35297632f402ebb1e78a1e39116/brotli-1.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9c79f57faa25d97900bfb119480806d783fba83cd09ee0b33c17623935b05fa3", size = 1599150, upload-time = "2025-11-05T18:38:19.792Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1a/23fcfee1c324fd48a63d7ebf4bac3a4115bdb1b00e600f80f727d850b1ae/brotli-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:844a8ceb8483fefafc412f85c14f2aae2fb69567bf2a0de53cdb88b73e7c43ae", size = 1493505, upload-time = "2025-11-05T18:38:20.913Z" }, + { url = "https://files.pythonhosted.org/packages/36/e5/12904bbd36afeef53d45a84881a4810ae8810ad7e328a971ebbfd760a0b3/brotli-1.2.0-cp311-cp311-win32.whl", hash = "sha256:aa47441fa3026543513139cb8926a92a8e305ee9c71a6209ef7a97d91640ea03", size = 334451, upload-time = "2025-11-05T18:38:21.94Z" }, + { url = "https://files.pythonhosted.org/packages/02/8b/ecb5761b989629a4758c394b9301607a5880de61ee2ee5fe104b87149ebc/brotli-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:022426c9e99fd65d9475dce5c195526f04bb8be8907607e27e747893f6ee3e24", size = 369035, upload-time = "2025-11-05T18:38:22.941Z" }, + { url = "https://files.pythonhosted.org/packages/11/ee/b0a11ab2315c69bb9b45a2aaed022499c9c24a205c3a49c3513b541a7967/brotli-1.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:35d382625778834a7f3061b15423919aa03e4f5da34ac8e02c074e4b75ab4f84", size = 861543, upload-time = "2025-11-05T18:38:24.183Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2f/29c1459513cd35828e25531ebfcbf3e92a5e49f560b1777a9af7203eb46e/brotli-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a61c06b334bd99bc5ae84f1eeb36bfe01400264b3c352f968c6e30a10f9d08b", size = 444288, upload-time = "2025-11-05T18:38:25.139Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/feba03130d5fceadfa3a1bb102cb14650798c848b1df2a808356f939bb16/brotli-1.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acec55bb7c90f1dfc476126f9711a8e81c9af7fb617409a9ee2953115343f08d", size = 1528071, upload-time = "2025-11-05T18:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/2b/38/f3abb554eee089bd15471057ba85f47e53a44a462cfce265d9bf7088eb09/brotli-1.2.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:260d3692396e1895c5034f204f0db022c056f9e2ac841593a4cf9426e2a3faca", size = 1626913, upload-time = "2025-11-05T18:38:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/03/a7/03aa61fbc3c5cbf99b44d158665f9b0dd3d8059be16c460208d9e385c837/brotli-1.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:072e7624b1fc4d601036ab3f4f27942ef772887e876beff0301d261210bca97f", size = 1419762, upload-time = "2025-11-05T18:38:28.295Z" }, + { url = "https://files.pythonhosted.org/packages/21/1b/0374a89ee27d152a5069c356c96b93afd1b94eae83f1e004b57eb6ce2f10/brotli-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adedc4a67e15327dfdd04884873c6d5a01d3e3b6f61406f99b1ed4865a2f6d28", size = 1484494, upload-time = "2025-11-05T18:38:29.29Z" }, + { url = "https://files.pythonhosted.org/packages/cf/57/69d4fe84a67aef4f524dcd075c6eee868d7850e85bf01d778a857d8dbe0a/brotli-1.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7a47ce5c2288702e09dc22a44d0ee6152f2c7eda97b3c8482d826a1f3cfc7da7", size = 1593302, upload-time = "2025-11-05T18:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/d5/3b/39e13ce78a8e9a621c5df3aeb5fd181fcc8caba8c48a194cd629771f6828/brotli-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:af43b8711a8264bb4e7d6d9a6d004c3a2019c04c01127a868709ec29962b6036", size = 1487913, upload-time = "2025-11-05T18:38:31.618Z" }, + { url = "https://files.pythonhosted.org/packages/62/28/4d00cb9bd76a6357a66fcd54b4b6d70288385584063f4b07884c1e7286ac/brotli-1.2.0-cp312-cp312-win32.whl", hash = "sha256:e99befa0b48f3cd293dafeacdd0d191804d105d279e0b387a32054c1180f3161", size = 334362, upload-time = "2025-11-05T18:38:32.939Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4e/bc1dcac9498859d5e353c9b153627a3752868a9d5f05ce8dedd81a2354ab/brotli-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b35c13ce241abdd44cb8ca70683f20c0c079728a36a996297adb5334adfc1c44", size = 369115, upload-time = "2025-11-05T18:38:33.765Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523, upload-time = "2025-11-05T18:38:34.67Z" }, + { url = "https://files.pythonhosted.org/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289, upload-time = "2025-11-05T18:38:35.6Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076, upload-time = "2025-11-05T18:38:36.639Z" }, + { url = "https://files.pythonhosted.org/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880, upload-time = "2025-11-05T18:38:37.623Z" }, + { url = "https://files.pythonhosted.org/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737, upload-time = "2025-11-05T18:38:38.729Z" }, + { url = "https://files.pythonhosted.org/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440, upload-time = "2025-11-05T18:38:39.916Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313, upload-time = "2025-11-05T18:38:41.24Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945, upload-time = "2025-11-05T18:38:42.277Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e8/3fe1ffed70cbef83c5236166acaed7bb9c766509b157854c80e2f766b38c/brotli-1.2.0-cp313-cp313-win32.whl", hash = "sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a", size = 334368, upload-time = "2025-11-05T18:38:43.345Z" }, + { url = "https://files.pythonhosted.org/packages/ff/91/e739587be970a113b37b821eae8097aac5a48e5f0eca438c22e4c7dd8648/brotli-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8", size = 369116, upload-time = "2025-11-05T18:38:44.609Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/298c2ddf786bb7347a1cd71d63a347a79e5712a7c0cba9e3c3458ebd976f/brotli-1.2.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6c12dad5cd04530323e723787ff762bac749a7b256a5bece32b2243dd5c27b21", size = 863080, upload-time = "2025-11-05T18:38:45.503Z" }, + { url = "https://files.pythonhosted.org/packages/84/0c/aac98e286ba66868b2b3b50338ffbd85a35c7122e9531a73a37a29763d38/brotli-1.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3219bd9e69868e57183316ee19c84e03e8f8b5a1d1f2667e1aa8c2f91cb061ac", size = 445453, upload-time = "2025-11-05T18:38:46.433Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f1/0ca1f3f99ae300372635ab3fe2f7a79fa335fee3d874fa7f9e68575e0e62/brotli-1.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:963a08f3bebd8b75ac57661045402da15991468a621f014be54e50f53a58d19e", size = 1528168, upload-time = "2025-11-05T18:38:47.371Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a6/2ebfc8f766d46df8d3e65b880a2e220732395e6d7dc312c1e1244b0f074a/brotli-1.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9322b9f8656782414b37e6af884146869d46ab85158201d82bab9abbcb971dc7", size = 1627098, upload-time = "2025-11-05T18:38:48.385Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2f/0976d5b097ff8a22163b10617f76b2557f15f0f39d6a0fe1f02b1a53e92b/brotli-1.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf9cba6f5b78a2071ec6fb1e7bd39acf35071d90a81231d67e92d637776a6a63", size = 1419861, upload-time = "2025-11-05T18:38:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/d76df7176a2ce7616ff94c1fb72d307c9a30d2189fe877f3dd99af00ea5a/brotli-1.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7547369c4392b47d30a3467fe8c3330b4f2e0f7730e45e3103d7d636678a808b", size = 1484594, upload-time = "2025-11-05T18:38:50.655Z" }, + { url = "https://files.pythonhosted.org/packages/d3/93/14cf0b1216f43df5609f5b272050b0abd219e0b54ea80b47cef9867b45e7/brotli-1.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1530af5c3c275b8524f2e24841cbe2599d74462455e9bae5109e9ff42e9361", size = 1593455, upload-time = "2025-11-05T18:38:51.624Z" }, + { url = "https://files.pythonhosted.org/packages/b3/73/3183c9e41ca755713bdf2cc1d0810df742c09484e2e1ddd693bee53877c1/brotli-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888", size = 1488164, upload-time = "2025-11-05T18:38:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/64/6a/0c78d8f3a582859236482fd9fa86a65a60328a00983006bcf6d83b7b2253/brotli-1.2.0-cp314-cp314-win32.whl", hash = "sha256:832c115a020e463c2f67664560449a7bea26b0c1fdd690352addad6d0a08714d", size = 339280, upload-time = "2025-11-05T18:38:54.02Z" }, + { url = "https://files.pythonhosted.org/packages/f5/10/56978295c14794b2c12007b07f3e41ba26acda9257457d7085b0bb3bb90c/brotli-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3", size = 375639, upload-time = "2025-11-05T18:38:55.67Z" }, +] + +[[package]] +name = "brotlicffi" +version = "1.2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/b6/017dc5f852ed9b8735af77774509271acbf1de02d238377667145fcee01d/brotlicffi-1.2.0.1.tar.gz", hash = "sha256:c20d5c596278307ad06414a6d95a892377ea274a5c6b790c2548c009385d621c", size = 478156, upload-time = "2026-03-05T19:54:11.547Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/f9/dfa56316837fa798eac19358351e974de8e1e2ca9475af4cb90293cd6576/brotlicffi-1.2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c85e65913cf2b79c57a3fdd05b98d9731d9255dc0cb696b09376cc091b9cddd", size = 433046, upload-time = "2026-03-05T19:53:46.209Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f5/f8f492158c76b0d940388801f04f747028971ad5774287bded5f1e53f08d/brotlicffi-1.2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:535f2d05d0273408abc13fc0eebb467afac17b0ad85090c8913690d40207dac5", size = 1541126, upload-time = "2026-03-05T19:53:48.248Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e1/ff87af10ac419600c63e9287a0649c673673ae6b4f2bcf48e96cb2f89f60/brotlicffi-1.2.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce17eb798ca59ecec67a9bb3fd7a4304e120d1cd02953ce522d959b9a84d58ac", size = 1541983, upload-time = "2026-03-05T19:53:50.317Z" }, + { url = "https://files.pythonhosted.org/packages/47/c0/80ecd9bd45776109fab14040e478bf63e456967c9ddee2353d8330ed8de1/brotlicffi-1.2.0.1-cp314-cp314t-win32.whl", hash = "sha256:3c9544f83cb715d95d7eab3af4adbbef8b2093ad6382288a83b3a25feb1a57ec", size = 349047, upload-time = "2026-03-05T19:53:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/ab/98/13e5b250236a281b6cd9e92a01ee1ae231029fa78faee932ef3766e1cb24/brotlicffi-1.2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:625f8115d32ae9c0740d01ea51518437c3fbaa3e78d41cb18459f6f7ac326000", size = 385652, upload-time = "2026-03-05T19:53:53.892Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9f/b98dcd4af47994cee97aebac866996a006a2e5fc1fd1e2b82a8ad95cf09c/brotlicffi-1.2.0.1-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:91ba5f0ccc040f6ff8f7efaf839f797723d03ed46acb8ae9408f99ffd2572cf4", size = 432608, upload-time = "2026-03-05T19:53:56.736Z" }, + { url = "https://files.pythonhosted.org/packages/b1/7a/ac4ee56595a061e3718a6d1ea7e921f4df156894acffb28ed88a1fd52022/brotlicffi-1.2.0.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be9a670c6811af30a4bd42d7116dc5895d3b41beaa8ed8a89050447a0181f5ce", size = 1534257, upload-time = "2026-03-05T19:53:58.667Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/e7410db7f6f56de57744ea52a115084ceb2735f4d44973f349bb92136586/brotlicffi-1.2.0.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3314a3476f59e5443f9f72a6dff16edc0c3463c9b318feaef04ae3e4683f5a", size = 1536838, upload-time = "2026-03-05T19:54:00.705Z" }, + { url = "https://files.pythonhosted.org/packages/a6/75/6e7977d1935fc3fbb201cbd619be8f2c7aea25d40a096967132854b34708/brotlicffi-1.2.0.1-cp38-abi3-win32.whl", hash = "sha256:82ea52e2b5d3145b6c406ebd3efb0d55db718b7ad996bd70c62cec0439de1187", size = 343337, upload-time = "2026-03-05T19:54:02.446Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ef/e7e485ce5e4ba3843a0a92feb767c7b6098fd6e65ce752918074d175ae71/brotlicffi-1.2.0.1-cp38-abi3-win_amd64.whl", hash = "sha256:da2e82a08e7778b8bc539d27ca03cdd684113e81394bfaaad8d0dfc6a17ddede", size = 379026, upload-time = "2026-03-05T19:54:04.322Z" }, + { url = "https://files.pythonhosted.org/packages/7f/53/6262c2256513e6f530d81642477cb19367270922063eaa2d7b781d8c723d/brotlicffi-1.2.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e015af99584c6db1490a69a210c765953e473e63adc2d891ac3062a737c9e851", size = 402265, upload-time = "2026-03-05T19:54:05.858Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d9/d5340b43cf5fbe7fe5a083d237e5338cc1caa73bea523be1c5e452c26290/brotlicffi-1.2.0.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37cb587d32bf7168e2218c455e22e409ad1f3157c6c71945879a311f3e6b6abf", size = 406710, upload-time = "2026-03-05T19:54:07.272Z" }, + { url = "https://files.pythonhosted.org/packages/a3/82/dbced4c1e0792efdf23fd90ff6d2a320c64ff4dfef7aacc85c04fde9ddd2/brotlicffi-1.2.0.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d6ba65dd528892b4d9960beba2ae011a753620bcfc66cf6fa3cee18d7b0baa4", size = 402787, upload-time = "2026-03-05T19:54:08.73Z" }, + { url = "https://files.pythonhosted.org/packages/ef/6f/534205ba7590c9a8716a614f270c5c2ec419b5b7079b3f9cd31b7b5580de/brotlicffi-1.2.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2a5575653b0672638ba039b82fda56854934d7a6a24d4b8b5033f73ab43cbc1", size = 375108, upload-time = "2026-03-05T19:54:10.079Z" }, +] + +[[package]] +name = "certifi" +version = "2026.4.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, +] + +[[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 = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, + { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, + { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, + { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, + { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, + { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, + { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, + { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, + { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, + { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "choreographer" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "logistro" }, + { name = "simplejson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/47/64a035c6f764450ea9f902cbeba14c8c70316c2641125510066d8f912bfa/choreographer-1.2.1.tar.gz", hash = "sha256:022afd72b1e9b0bcb950420b134e70055a294c791b6f36cfb47d89745b701b5f", size = 43399, upload-time = "2025-11-09T23:04:44.749Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/9f/d73dfb85d7a5b1a56a99adc50f2074029468168c970ff5daeade4ad819e4/choreographer-1.2.1-py3-none-any.whl", hash = "sha256:9af5385effa3c204dbc337abf7ac74fd8908ced326a15645dc31dde75718c77e", size = 49338, upload-time = "2025-11-09T23:04:43.154Z" }, +] + +[[package]] +name = "click" +version = "8.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/63/f9e1ea081ce35720d8b92acde70daaedace594dc93b693c869e0d5910718/click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2", size = 328061, upload-time = "2026-04-22T15:11:27.506Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613", size = 110502, upload-time = "2026-04-22T15:11:25.044Z" }, +] + +[[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.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, + { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, + { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, + { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, + { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, + { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, + { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, + { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, + { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, + { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, + { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, + { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, + { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, + { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, + { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, + { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, + { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, + { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, + { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, + { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, + { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, + { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, + { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, + { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, + { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, + { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, + { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, + { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, + { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, + { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, + { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, +] + +[[package]] +name = "cssselect2" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tinycss2" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/20/92eaa6b0aec7189fa4b75c890640e076e9e793095721db69c5c81142c2e1/cssselect2-0.9.0.tar.gz", hash = "sha256:759aa22c216326356f65e62e791d66160a0f9c91d1424e8d8adc5e74dddfc6fb", size = 35595, upload-time = "2026-02-12T17:16:39.614Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/0e/8459ca4413e1a21a06c97d134bfaf18adfd27cea068813dc0faae06cbf00/cssselect2-0.9.0-py3-none-any.whl", hash = "sha256:6a99e5f91f9a016a304dd929b0966ca464bcfda15177b6fb4a118fc0fb5d9563", size = 15453, upload-time = "2026-02-12T17:16:38.317Z" }, +] + +[[package]] +name = "fastapi" +version = "0.136.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/45/c130091c2dfa061bbfe3150f2a5091ef1adf149f2a8d2ae769ecaf6e99a2/fastapi-0.136.1.tar.gz", hash = "sha256:7af665ad7acfa0a3baf8983d393b6b471b9da10ede59c60045f49fbc89a0fa7f", size = 397448, upload-time = "2026-04-23T16:49:44.046Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/ff/2e4eca3ade2c22fe1dea7043b8ee9dabe47753349eb1b56a202de8af6349/fastapi-0.136.1-py3-none-any.whl", hash = "sha256:a6e9d7eeada96c93a4d69cb03836b44fa34e2854accb7244a1ece36cd4781c3f", size = 117683, upload-time = "2026-04-23T16:49:42.437Z" }, +] + +[[package]] +name = "flask" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker" }, + { name = "click" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, +] + +[[package]] +name = "flask-babel" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "flask" }, + { name = "jinja2" }, + { name = "pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/1a/4c65e3b90bda699a637bfb7fb96818b0a9bbff7636ea91aade67f6020a31/flask_babel-4.0.0.tar.gz", hash = "sha256:dbeab4027a3f4a87678a11686496e98e1492eb793cbdd77ab50f4e9a2602a593", size = 10178, upload-time = "2023-10-02T01:10:49.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/c2/e0ab5abe37882e118482884f2ec660cd06da644ddfbceccf5f88f546b574/flask_babel-4.0.0-py3-none-any.whl", hash = "sha256:638194cf91f8b301380f36d70e2034c77ee25b98cb5d80a1626820df9a6d4625", size = 9602, upload-time = "2023-10-02T01:10:48.58Z" }, +] + +[[package]] +name = "flask-wtf" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flask" }, + { name = "itsdangerous" }, + { name = "wtforms" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/f1/605a56d4ea217b307f3e6f4d663e0351253d85d841edc93ba559f0648e19/flask_wtf-1.3.0.tar.gz", hash = "sha256:61d5dabc50c3df885c297dcbd80810443a5d632106c8a69cab8ce740f0cdd7cc", size = 50414, upload-time = "2026-04-23T07:41:55.096Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/d2/97adf2ec7af95522573e6dd5493ee84792d0fbfb2def010c4a581b8d6e5e/flask_wtf-1.3.0-py3-none-any.whl", hash = "sha256:dc5e3a4ce97f75c47bf6c1c72ad2c3b7bdf579a2ed13aebcc5d3d81fe2571160", size = 13959, upload-time = "2026-04-23T07:41:53.828Z" }, +] + +[[package]] +name = "fonttools" +version = "4.62.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7", size = 2871039, upload-time = "2026-03-13T13:52:33.127Z" }, + { url = "https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14", size = 2416346, upload-time = "2026-03-13T13:52:35.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/53/5276ceba7bff95da7793a07c5284e1da901cf00341ce5e2f3273056c0cca/fonttools-4.62.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7", size = 5100897, upload-time = "2026-03-13T13:52:38.102Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b", size = 5071078, upload-time = "2026-03-13T13:52:41.305Z" }, + { url = "https://files.pythonhosted.org/packages/e3/be/d378fca4c65ea1956fee6d90ace6e861776809cbbc5af22388a090c3c092/fonttools-4.62.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1", size = 5076908, upload-time = "2026-03-13T13:52:44.122Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d9/ae6a1d0693a4185a84605679c8a1f719a55df87b9c6e8e817bfdd9ef5936/fonttools-4.62.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416", size = 5202275, upload-time = "2026-03-13T13:52:46.591Z" }, + { url = "https://files.pythonhosted.org/packages/54/6c/af95d9c4efb15cabff22642b608342f2bd67137eea6107202d91b5b03184/fonttools-4.62.1-cp311-cp311-win32.whl", hash = "sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53", size = 2293075, upload-time = "2026-03-13T13:52:48.711Z" }, + { url = "https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2", size = 2344593, upload-time = "2026-03-13T13:52:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, + { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, + { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, + { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, + { url = "https://files.pythonhosted.org/packages/3b/56/6f389de21c49555553d6a5aeed5ac9767631497ac836c4f076273d15bd72/fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79", size = 2865155, upload-time = "2026-03-13T13:53:16.132Z" }, + { url = "https://files.pythonhosted.org/packages/03/c5/0e3966edd5ec668d41dfe418787726752bc07e2f5fd8c8f208615e61fa89/fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe", size = 2412802, upload-time = "2026-03-13T13:53:18.878Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/e6ac4b44026de7786fe46e3bfa0c87e51d5d70a841054065d49cd62bb909/fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68", size = 5013926, upload-time = "2026-03-13T13:53:21.379Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/8b1e801939839d405f1f122e7d175cebe9aeb4e114f95bfc45e3152af9a7/fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1", size = 4964575, upload-time = "2026-03-13T13:53:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/46/76/7d051671e938b1881670528fec69cc4044315edd71a229c7fd712eaa5119/fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069", size = 4953693, upload-time = "2026-03-13T13:53:26.569Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ae/b41f8628ec0be3c1b934fc12b84f4576a5c646119db4d3bdd76a217c90b5/fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9", size = 5094920, upload-time = "2026-03-13T13:53:29.329Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/53a1e9469331a23dcc400970a27a4caa3d9f6edbf5baab0260285238b884/fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24", size = 2279928, upload-time = "2026-03-13T13:53:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/38/60/35186529de1db3c01f5ad625bde07c1f576305eab6d86bbda4c58445f721/fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056", size = 2330514, upload-time = "2026-03-13T13:53:34.991Z" }, + { url = "https://files.pythonhosted.org/packages/36/f0/2888cdac391807d68d90dcb16ef858ddc1b5309bfc6966195a459dd326e2/fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca", size = 2864442, upload-time = "2026-03-13T13:53:37.509Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b2/e521803081f8dc35990816b82da6360fa668a21b44da4b53fc9e77efcd62/fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca", size = 2410901, upload-time = "2026-03-13T13:53:40.55Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/8c3511ff06e53110039358dbbdc1a65d72157a054638387aa2ada300a8b8/fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782", size = 4999608, upload-time = "2026-03-13T13:53:42.798Z" }, + { url = "https://files.pythonhosted.org/packages/28/63/cd0c3b26afe60995a5295f37c246a93d454023726c3261cfbb3559969bb9/fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae", size = 4912726, upload-time = "2026-03-13T13:53:45.405Z" }, + { url = "https://files.pythonhosted.org/packages/70/b9/ac677cb07c24c685cf34f64e140617d58789d67a3dd524164b63648c6114/fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7", size = 4951422, upload-time = "2026-03-13T13:53:48.326Z" }, + { url = "https://files.pythonhosted.org/packages/e6/10/11c08419a14b85b7ca9a9faca321accccc8842dd9e0b1c8a72908de05945/fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a", size = 5060979, upload-time = "2026-03-13T13:53:51.366Z" }, + { url = "https://files.pythonhosted.org/packages/4e/3c/12eea4a4cf054e7ab058ed5ceada43b46809fce2bf319017c4d63ae55bb4/fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800", size = 2283733, upload-time = "2026-03-13T13:53:53.606Z" }, + { url = "https://files.pythonhosted.org/packages/6b/67/74b070029043186b5dd13462c958cb7c7f811be0d2e634309d9a1ffb1505/fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e", size = 2335663, upload-time = "2026-03-13T13:53:56.23Z" }, + { url = "https://files.pythonhosted.org/packages/42/c5/4d2ed3ca6e33617fc5624467da353337f06e7f637707478903c785bd8e20/fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82", size = 2947288, upload-time = "2026-03-13T13:53:59.397Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e9/7ab11ddfda48ed0f89b13380e5595ba572619c27077be0b2c447a63ff351/fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260", size = 2449023, upload-time = "2026-03-13T13:54:01.642Z" }, + { url = "https://files.pythonhosted.org/packages/b2/10/a800fa090b5e8819942e54e19b55fc7c21fe14a08757c3aa3ca8db358939/fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4", size = 5137599, upload-time = "2026-03-13T13:54:04.495Z" }, + { url = "https://files.pythonhosted.org/packages/37/dc/8ccd45033fffd74deb6912fa1ca524643f584b94c87a16036855b498a1ed/fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b", size = 4920933, upload-time = "2026-03-13T13:54:07.557Z" }, + { url = "https://files.pythonhosted.org/packages/99/eb/e618adefb839598d25ac8136cd577925d6c513dc0d931d93b8af956210f0/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87", size = 5016232, upload-time = "2026-03-13T13:54:10.611Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5f/9b5c9bfaa8ec82def8d8168c4f13615990d6ce5996fe52bd49bfb5e05134/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c", size = 5042987, upload-time = "2026-03-13T13:54:13.569Z" }, + { url = "https://files.pythonhosted.org/packages/90/aa/dfbbe24c6a6afc5c203d90cc0343e24bcbb09e76d67c4d6eef8c2558d7ba/fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a", size = 2348021, upload-time = "2026-03-13T13:54:16.98Z" }, + { url = "https://files.pythonhosted.org/packages/13/6f/ae9c4e4dd417948407b680855c2c7790efb52add6009aaecff1e3bc50e8e/fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e", size = 2414147, upload-time = "2026-03-13T13:54:19.416Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, +] + +[package.optional-dependencies] +woff = [ + { name = "brotli", marker = "platform_python_implementation == 'CPython'" }, + { name = "brotlicffi", marker = "platform_python_implementation != 'CPython'" }, + { name = "zopfli" }, +] + +[[package]] +name = "greenlet" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/94/a5935717b307d7c71fe877b52b884c6af707d2d2090db118a03fbd799369/greenlet-3.4.0.tar.gz", hash = "sha256:f50a96b64dafd6169e595a5c56c9146ef80333e67d4476a65a9c55f400fc22ff", size = 195913, upload-time = "2026-04-08T17:08:00.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/c6/dba32cab7e3a625b011aa5647486e2d28423a48845a2998c126dd69c85e1/greenlet-3.4.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:805bebb4945094acbab757d34d6e1098be6de8966009ab9ca54f06ff492def58", size = 285504, upload-time = "2026-04-08T15:52:14.071Z" }, + { url = "https://files.pythonhosted.org/packages/54/f4/7cb5c2b1feb9a1f50e038be79980dfa969aa91979e5e3a18fdbcfad2c517/greenlet-3.4.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:439fc2f12b9b512d9dfa681c5afe5f6b3232c708d13e6f02c845e0d9f4c2d8c6", size = 605476, upload-time = "2026-04-08T16:24:37.064Z" }, + { url = "https://files.pythonhosted.org/packages/d6/af/b66ab0b2f9a4c5a867c136bf66d9599f34f21a1bcca26a2884a29c450bd9/greenlet-3.4.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a70ed1cb0295bee1df57b63bf7f46b4e56a5c93709eea769c1fec1bb23a95875", size = 618336, upload-time = "2026-04-08T16:30:56.59Z" }, + { url = "https://files.pythonhosted.org/packages/6d/31/56c43d2b5de476f77d36ceeec436328533bff960a4cba9a07616e93063ab/greenlet-3.4.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c5696c42e6bb5cfb7c6ff4453789081c66b9b91f061e5e9367fa15792644e76", size = 625045, upload-time = "2026-04-08T16:40:37.111Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5c/8c5633ece6ba611d64bf2770219a98dd439921d6424e4e8cf16b0ac74ea5/greenlet-3.4.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c660bce1940a1acae5f51f0a064f1bc785d07ea16efcb4bc708090afc4d69e83", size = 613515, upload-time = "2026-04-08T15:56:32.478Z" }, + { url = "https://files.pythonhosted.org/packages/80/ca/704d4e2c90acb8bdf7ae593f5cbc95f58e82de95cc540fb75631c1054533/greenlet-3.4.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:89995ce5ddcd2896d89615116dd39b9703bfa0c07b583b85b89bf1b5d6eddf81", size = 419745, upload-time = "2026-04-08T16:43:04.022Z" }, + { url = "https://files.pythonhosted.org/packages/a9/df/950d15bca0d90a0e7395eb777903060504cdb509b7b705631e8fb69ff415/greenlet-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee407d4d1ca9dc632265aee1c8732c4a2d60adff848057cdebfe5fe94eb2c8a2", size = 1574623, upload-time = "2026-04-08T16:26:18.596Z" }, + { url = "https://files.pythonhosted.org/packages/1a/e7/0839afab829fcb7333c9ff6d80c040949510055d2d4d63251f0d1c7c804e/greenlet-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:956215d5e355fffa7c021d168728321fd4d31fd730ac609b1653b450f6a4bc71", size = 1639579, upload-time = "2026-04-08T15:57:29.231Z" }, + { url = "https://files.pythonhosted.org/packages/d9/2b/b4482401e9bcaf9f5c97f67ead38db89c19520ff6d0d6699979c6efcc200/greenlet-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:5cb614ace7c27571270354e9c9f696554d073f8aa9319079dcba466bbdead711", size = 238233, upload-time = "2026-04-08T17:02:54.286Z" }, + { url = "https://files.pythonhosted.org/packages/0c/4d/d8123a4e0bcd583d5cfc8ddae0bbe29c67aab96711be331a7cc935a35966/greenlet-3.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:04403ac74fe295a361f650818de93be11b5038a78f49ccfb64d3b1be8fbf1267", size = 235045, upload-time = "2026-04-08T17:04:05.072Z" }, + { url = "https://files.pythonhosted.org/packages/65/8b/3669ad3b3f247a791b2b4aceb3aa5a31f5f6817bf547e4e1ff712338145a/greenlet-3.4.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:1a54a921561dd9518d31d2d3db4d7f80e589083063ab4d3e2e950756ef809e1a", size = 286902, upload-time = "2026-04-08T15:52:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/38/3e/3c0e19b82900873e2d8469b590a6c4b3dfd2b316d0591f1c26b38a4879a5/greenlet-3.4.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16dec271460a9a2b154e3b1c2fa1050ce6280878430320e85e08c166772e3f97", size = 606099, upload-time = "2026-04-08T16:24:38.408Z" }, + { url = "https://files.pythonhosted.org/packages/b5/33/99fef65e7754fc76a4ed14794074c38c9ed3394a5bd129d7f61b705f3168/greenlet-3.4.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90036ce224ed6fe75508c1907a77e4540176dcf0744473627785dd519c6f9996", size = 618837, upload-time = "2026-04-08T16:30:58.298Z" }, + { url = "https://files.pythonhosted.org/packages/44/57/eae2cac10421feae6c0987e3dc106c6d86262b1cb379e171b017aba893a6/greenlet-3.4.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6f0def07ec9a71d72315cf26c061aceee53b306c36ed38c35caba952ea1b319d", size = 624901, upload-time = "2026-04-08T16:40:38.981Z" }, + { url = "https://files.pythonhosted.org/packages/36/f7/229f3aed6948faa20e0616a0b8568da22e365ede6a54d7d369058b128afd/greenlet-3.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1c4f6b453006efb8310affb2d132832e9bbb4fc01ce6df6b70d810d38f1f6dc", size = 615062, upload-time = "2026-04-08T15:56:33.766Z" }, + { url = "https://files.pythonhosted.org/packages/6a/8a/0e73c9b94f31d1cc257fe79a0eff621674141cdae7d6d00f40de378a1e42/greenlet-3.4.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:0e1254cf0cbaa17b04320c3a78575f29f3c161ef38f59c977108f19ffddaf077", size = 423927, upload-time = "2026-04-08T16:43:05.293Z" }, + { url = "https://files.pythonhosted.org/packages/08/97/d988180011aa40135c46cd0d0cf01dd97f7162bae14139b4a3ef54889ba5/greenlet-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b2d9a138ffa0e306d0e2b72976d2fb10b97e690d40ab36a472acaab0838e2de", size = 1573511, upload-time = "2026-04-08T16:26:20.058Z" }, + { url = "https://files.pythonhosted.org/packages/d4/0f/a5a26fe152fb3d12e6a474181f6e9848283504d0afd095f353d85726374b/greenlet-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8424683caf46eb0eb6f626cb95e008e8cc30d0cb675bdfa48200925c79b38a08", size = 1640396, upload-time = "2026-04-08T15:57:30.88Z" }, + { url = "https://files.pythonhosted.org/packages/42/cf/bb2c32d9a100e36ee9f6e38fad6b1e082b8184010cb06259b49e1266ca01/greenlet-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0a53fb071531d003b075c444014ff8f8b1a9898d36bb88abd9ac7b3524648a2", size = 238892, upload-time = "2026-04-08T17:03:10.094Z" }, + { url = "https://files.pythonhosted.org/packages/b7/47/6c41314bac56e71436ce551c7fbe3cc830ed857e6aa9708dbb9c65142eb6/greenlet-3.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:f38b81880ba28f232f1f675893a39cf7b6db25b31cc0a09bb50787ecf957e85e", size = 235599, upload-time = "2026-04-08T15:52:54.3Z" }, + { url = "https://files.pythonhosted.org/packages/7a/75/7e9cd1126a1e1f0cd67b0eda02e5221b28488d352684704a78ed505bd719/greenlet-3.4.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:43748988b097f9c6f09364f260741aa73c80747f63389824435c7a50bfdfd5c1", size = 285856, upload-time = "2026-04-08T15:52:45.82Z" }, + { url = "https://files.pythonhosted.org/packages/9d/c4/3e2df392e5cb199527c4d9dbcaa75c14edcc394b45040f0189f649631e3c/greenlet-3.4.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5566e4e2cd7a880e8c27618e3eab20f3494452d12fd5129edef7b2f7aa9a36d1", size = 610208, upload-time = "2026-04-08T16:24:39.674Z" }, + { url = "https://files.pythonhosted.org/packages/da/af/750cdfda1d1bd30a6c28080245be8d0346e669a98fdbae7f4102aa95fff3/greenlet-3.4.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1054c5a3c78e2ab599d452f23f7adafef55062a783a8e241d24f3b633ba6ff82", size = 621269, upload-time = "2026-04-08T16:30:59.767Z" }, + { url = "https://files.pythonhosted.org/packages/e0/93/c8c508d68ba93232784bbc1b5474d92371f2897dfc6bc281b419f2e0d492/greenlet-3.4.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:98eedd1803353daf1cd9ef23eef23eda5a4d22f99b1f998d273a8b78b70dd47f", size = 628455, upload-time = "2026-04-08T16:40:40.698Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/0cbc693622cd54ebe25207efbb3a0eb07c2639cb8594f6e3aaaa0bb077a8/greenlet-3.4.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f82cb6cddc27dd81c96b1506f4aa7def15070c3b2a67d4e46fd19016aacce6cf", size = 617549, upload-time = "2026-04-08T15:56:34.893Z" }, + { url = "https://files.pythonhosted.org/packages/7f/46/cfaaa0ade435a60550fd83d07dfd5c41f873a01da17ede5c4cade0b9bab8/greenlet-3.4.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:b7857e2202aae67bc5725e0c1f6403c20a8ff46094ece015e7d474f5f7020b55", size = 426238, upload-time = "2026-04-08T16:43:06.865Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c0/8966767de01343c1ff47e8b855dc78e7d1a8ed2b7b9c83576a57e289f81d/greenlet-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:227a46251ecba4ff46ae742bc5ce95c91d5aceb4b02f885487aff269c127a729", size = 1575310, upload-time = "2026-04-08T16:26:21.671Z" }, + { url = "https://files.pythonhosted.org/packages/b8/38/bcdc71ba05e9a5fda87f63ffc2abcd1f15693b659346df994a48c968003d/greenlet-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5b99e87be7eba788dd5b75ba1cde5639edffdec5f91fe0d734a249535ec3408c", size = 1640435, upload-time = "2026-04-08T15:57:32.572Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c2/19b664b7173b9e4ef5f77e8cef9f14c20ec7fce7920dc1ccd7afd955d093/greenlet-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:849f8bc17acd6295fcb5de8e46d55cc0e52381c56eaf50a2afd258e97bc65940", size = 238760, upload-time = "2026-04-08T17:04:03.878Z" }, + { url = "https://files.pythonhosted.org/packages/9b/96/795619651d39c7fbd809a522f881aa6f0ead504cc8201c3a5b789dfaef99/greenlet-3.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9390ad88b652b1903814eaabd629ca184db15e0eeb6fe8a390bbf8b9106ae15a", size = 235498, upload-time = "2026-04-08T17:05:00.584Z" }, + { url = "https://files.pythonhosted.org/packages/78/02/bde66806e8f169cf90b14d02c500c44cdbe02c8e224c9c67bafd1b8cadd1/greenlet-3.4.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:10a07aca6babdd18c16a3f4f8880acfffc2b88dfe431ad6aa5f5740759d7d75e", size = 286291, upload-time = "2026-04-08T17:09:34.307Z" }, + { url = "https://files.pythonhosted.org/packages/05/1f/39da1c336a87d47c58352fb8a78541ce63d63ae57c5b9dae1fe02801bbc2/greenlet-3.4.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:076e21040b3a917d3ce4ad68fb5c3c6b32f1405616c4a57aa83120979649bd3d", size = 656749, upload-time = "2026-04-08T16:24:41.721Z" }, + { url = "https://files.pythonhosted.org/packages/d3/6c/90ee29a4ee27af7aa2e2ec408799eeb69ee3fcc5abcecac6ddd07a5cd0f2/greenlet-3.4.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e82689eea4a237e530bb5cb41b180ef81fa2160e1f89422a67be7d90da67f615", size = 669084, upload-time = "2026-04-08T16:31:01.372Z" }, + { url = "https://files.pythonhosted.org/packages/d2/4a/74078d3936712cff6d3c91a930016f476ce4198d84e224fe6d81d3e02880/greenlet-3.4.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:06c2d3b89e0c62ba50bd7adf491b14f39da9e7e701647cb7b9ff4c99bee04b19", size = 673405, upload-time = "2026-04-08T16:40:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/07/49/d4cad6e5381a50947bb973d2f6cf6592621451b09368b8c20d9b8af49c5b/greenlet-3.4.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4df3b0b2289ec686d3c821a5fee44259c05cfe824dd5e6e12c8e5f5df23085cf", size = 665621, upload-time = "2026-04-08T15:56:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/79/3e/df8a83ab894751bc31e1106fdfaa80ca9753222f106b04de93faaa55feb7/greenlet-3.4.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:070b8bac2ff3b4d9e0ff36a0d19e42103331d9737e8504747cd1e659f76297bd", size = 471670, upload-time = "2026-04-08T16:43:08.512Z" }, + { url = "https://files.pythonhosted.org/packages/37/31/d1edd54f424761b5d47718822f506b435b6aab2f3f93b465441143ea5119/greenlet-3.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8bff29d586ea415688f4cec96a591fcc3bf762d046a796cdadc1fdb6e7f2d5bf", size = 1622259, upload-time = "2026-04-08T16:26:23.201Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c6/6d3f9cdcb21c4e12a79cb332579f1c6aa1af78eb68059c5a957c7812d95e/greenlet-3.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8a569c2fb840c53c13a2b8967c63621fafbd1a0e015b9c82f408c33d626a2fda", size = 1686916, upload-time = "2026-04-08T15:57:34.282Z" }, + { url = "https://files.pythonhosted.org/packages/63/45/c1ca4a1ad975de4727e52d3ffe641ae23e1d7a8ffaa8ff7a0477e1827b92/greenlet-3.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:207ba5b97ea8b0b60eb43ffcacf26969dd83726095161d676aac03ff913ee50d", size = 239821, upload-time = "2026-04-08T17:03:48.423Z" }, + { url = "https://files.pythonhosted.org/packages/71/c4/6f621023364d7e85a4769c014c8982f98053246d142420e0328980933ceb/greenlet-3.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:f8296d4e2b92af34ebde81085a01690f26a51eb9ac09a0fcadb331eb36dbc802", size = 236932, upload-time = "2026-04-08T17:04:33.551Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8f/18d72b629783f5e8d045a76f5325c1e938e659a9e4da79c7dcd10169a48d/greenlet-3.4.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d70012e51df2dbbccfaf63a40aaf9b40c8bed37c3e3a38751c926301ce538ece", size = 294681, upload-time = "2026-04-08T15:52:35.778Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ad/5fa86ec46769c4153820d58a04062285b3b9e10ba3d461ee257b68dcbf53/greenlet-3.4.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a58bec0751f43068cd40cff31bb3ca02ad6000b3a51ca81367af4eb5abc480c8", size = 658899, upload-time = "2026-04-08T16:24:43.32Z" }, + { url = "https://files.pythonhosted.org/packages/43/f0/4e8174ca0e87ae748c409f055a1ba161038c43cc0a5a6f1433a26ac2e5bf/greenlet-3.4.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05fa0803561028f4b2e3b490ee41216a842eaee11aed004cc343a996d9523aa2", size = 665284, upload-time = "2026-04-08T16:31:02.833Z" }, + { url = "https://files.pythonhosted.org/packages/ef/92/466b0d9afd44b8af623139a3599d651c7564fa4152f25f117e1ee5949ffb/greenlet-3.4.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c4cd56a9eb7a6444edbc19062f7b6fbc8f287c663b946e3171d899693b1c19fa", size = 665872, upload-time = "2026-04-08T16:40:43.912Z" }, + { url = "https://files.pythonhosted.org/packages/19/da/991cf7cd33662e2df92a1274b7eb4d61769294d38a1bba8a45f31364845e/greenlet-3.4.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e60d38719cb80b3ab5e85f9f1aed4960acfde09868af6762ccb27b260d68f4ed", size = 661861, upload-time = "2026-04-08T15:56:37.269Z" }, + { url = "https://files.pythonhosted.org/packages/0d/14/3395a7ef3e260de0325152ddfe19dffb3e49fe10873b94654352b53ad48e/greenlet-3.4.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:1f85f204c4d54134ae850d401fa435c89cd667d5ce9dc567571776b45941af72", size = 489237, upload-time = "2026-04-08T16:43:09.993Z" }, + { url = "https://files.pythonhosted.org/packages/36/c5/6c2c708e14db3d9caea4b459d8464f58c32047451142fe2cfd90e7458f41/greenlet-3.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f50c804733b43eded05ae694691c9aa68bca7d0a867d67d4a3f514742a2d53f", size = 1622182, upload-time = "2026-04-08T16:26:24.777Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4c/50c5fed19378e11a29fabab1f6be39ea95358f4a0a07e115a51ca93385d8/greenlet-3.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2d4f0635dc4aa638cda4b2f5a07ae9a2cff9280327b581a3fcb6f317b4fbc38a", size = 1685050, upload-time = "2026-04-08T15:57:36.453Z" }, + { url = "https://files.pythonhosted.org/packages/db/72/85ae954d734703ab48e622c59d4ce35d77ce840c265814af9c078cacc7aa/greenlet-3.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1a4a48f24681300c640f143ba7c404270e1ebbbcf34331d7104a4ff40f8ea705", size = 245554, upload-time = "2026-04-08T17:03:50.044Z" }, +] + +[[package]] +name = "gunicorn" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/f4/e78fa054248fab913e2eab0332c6c2cb07421fca1ce56d8fe43b6aef57a4/gunicorn-25.3.0.tar.gz", hash = "sha256:f74e1b2f9f76f6cd1ca01198968bd2dd65830edc24b6e8e4d78de8320e2fe889", size = 634883, upload-time = "2026-03-27T00:00:26.092Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/c8/8aaf447698c4d59aa853fd318eed300b5c9e44459f242ab8ead6c9c09792/gunicorn-25.3.0-py3-none-any.whl", hash = "sha256:cacea387dab08cd6776501621c295a904fe8e3b7aae9a1a3cbb26f4e7ed54660", size = 208403, upload-time = "2026-03-27T00:00:27.386Z" }, +] + +[[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 = "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 = "httptools" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, + { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, + { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, + { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, + { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, +] + +[[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 = "idna" +version = "3.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, +] + +[[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 = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, +] + +[[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 = "kaleido" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "choreographer" }, + { name = "logistro" }, + { name = "orjson" }, + { name = "packaging" }, + { name = "pytest-timeout" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/76eec859b71eda803a88ea50ed3f270281254656bb23d19eb0a39aa706a0/kaleido-1.2.0.tar.gz", hash = "sha256:fa621a14423e8effa2895a2526be00af0cf21655be1b74b7e382c171d12e71ef", size = 64160, upload-time = "2025-11-04T21:24:23.833Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/97/f6de8d4af54d6401d6581a686cce3e3e2371a79ba459a449104e026c08bc/kaleido-1.2.0-py3-none-any.whl", hash = "sha256:c27ed82b51df6b923d0e656feac221343a0dbcd2fb9bc7e6b1db97f61e9a1513", size = 68997, upload-time = "2025-11-04T21:24:21.704Z" }, +] + +[[package]] +name = "logistro" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/90/bfd7a6fab22bdfafe48ed3c4831713cb77b4779d18ade5e248d5dbc0ca22/logistro-2.0.1.tar.gz", hash = "sha256:8446affc82bab2577eb02bfcbcae196ae03129287557287b6a070f70c1985047", size = 8398, upload-time = "2025-11-01T02:41:18.81Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/6aa79ba3570bddd1bf7e951c6123f806751e58e8cce736bad77b2cf348d7/logistro-2.0.1-py3-none-any.whl", hash = "sha256:06ffa127b9fb4ac8b1972ae6b2a9d7fde57598bf5939cd708f43ec5bba2d31eb", size = 8555, upload-time = "2025-11-01T02:41:17.587Z" }, +] + +[[package]] +name = "mako" +version = "1.3.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/8a/805404d0c0b9f3d7a326475ca008db57aea9c5c9f2e1e39ed0faa335571c/mako-1.3.11.tar.gz", hash = "sha256:071eb4ab4c5010443152255d77db7faa6ce5916f35226eb02dc34479b6858069", size = 399811, upload-time = "2026-04-14T20:19:51.493Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/a5/19d7aaa7e433713ffe881df33705925a196afb9532efc8475d26593921a6/mako-1.3.11-py3-none-any.whl", hash = "sha256:e372c6e333cf004aa736a15f425087ec977e1fcbd2966aae7f17c8dc1da27a77", size = 78503, upload-time = "2026-04-14T20:19:53.233Z" }, +] + +[[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 = "narwhals" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/f3/257adc69a71011b4c8cda321b00f02c5bf1980ae38ffd05a58d9632d4de8/narwhals-2.20.0.tar.gz", hash = "sha256:c10994975fa7dc5a68c2cffcddbd5908fc8ebb2d463c5bab085309c0ee1f551e", size = 627848, upload-time = "2026-04-20T12:11:45.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/69/f24d3d1c38ad69e256138b4ec2452a8c7cf66be49dc214771ae99dd4f0a0/narwhals-2.20.0-py3-none-any.whl", hash = "sha256:16e750ea5507d4ba6e8d03455b5f93a535e0405976561baea235bca5dc9f475d", size = 449373, upload-time = "2026-04-20T12:11:43.596Z" }, +] + +[[package]] +name = "orjson" +version = "3.11.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/1b/2024d06792d0779f9dbc51531b61c24f76c75b9f4ce05e6f3377a1814cea/orjson-3.11.8.tar.gz", hash = "sha256:96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e", size = 5603832, upload-time = "2026-03-31T16:16:27.878Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/41/5aa7fa3b0f4dc6b47dcafc3cea909299c37e40e9972feabc8b6a74e2730d/orjson-3.11.8-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:003646067cc48b7fcab2ae0c562491c9b5d2cbd43f1e5f16d98fd118c5522d34", size = 229229, upload-time = "2026-03-31T16:14:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d7/57e7f2458e0a2c41694f39fc830030a13053a84f837a5b73423dca1f0938/orjson-3.11.8-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ed193ce51d77a3830cad399a529cd4ef029968761f43ddc549e1bc62b40d88f8", size = 128871, upload-time = "2026-03-31T16:14:51.888Z" }, + { url = "https://files.pythonhosted.org/packages/53/4a/e0fdb9430983e6c46e0299559275025075568aad5d21dd606faee3703924/orjson-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30491bc4f862aa15744b9738517454f1e46e56c972a2be87d70d727d5b2a8f8", size = 132104, upload-time = "2026-03-31T16:14:53.142Z" }, + { url = "https://files.pythonhosted.org/packages/08/4a/2025a60ff3f5c8522060cda46612d9b1efa653de66ed2908591d8d82f22d/orjson-3.11.8-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eda5b8b6be91d3f26efb7dc6e5e68ee805bc5617f65a328587b35255f138bf4", size = 130483, upload-time = "2026-03-31T16:14:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3c/b9cde05bdc7b2385c66014e0620627da638d3d04e4954416ab48c31196c5/orjson-3.11.8-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee8db7bfb6fe03581bbab54d7c4124a6dd6a7f4273a38f7267197890f094675f", size = 135481, upload-time = "2026-03-31T16:14:55.901Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f2/a8238e7734de7cb589fed319857a8025d509c89dc52fdcc88f39c6d03d5a/orjson-3.11.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8b5231de76c528a46b57010bbd83fb51e056aa0220a372fd5065e978406f1c", size = 146819, upload-time = "2026-03-31T16:14:57.548Z" }, + { url = "https://files.pythonhosted.org/packages/db/10/dbf1e2a3cafea673b1b4350e371877b759060d6018a998643b7040e5de48/orjson-3.11.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58a4a208a6fbfdb7a7327b8f201c6014f189f721fd55d047cafc4157af1bc62a", size = 132846, upload-time = "2026-03-31T16:14:58.91Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fc/55e667ec9c85694038fcff00573d221b085d50777368ee3d77f38668bf3c/orjson-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8952d6d2505c003e8f0224ff7858d341fa4e33fef82b91c4ff0ef070f2393c", size = 133580, upload-time = "2026-03-31T16:15:00.519Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a6/c08c589a9aad0cb46c4831d17de212a2b6901f9d976814321ff8e69e8785/orjson-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0022bb50f90da04b009ce32c512dc1885910daa7cb10b7b0cba4505b16db82a8", size = 142042, upload-time = "2026-03-31T16:15:01.906Z" }, + { url = "https://files.pythonhosted.org/packages/5c/cc/2f78ea241d52b717d2efc38878615fe80425bf2beb6e68c984dde257a766/orjson-3.11.8-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ff51f9d657d1afb6f410cb435792ce4e1fe427aab23d2fcd727a2876e21d4cb6", size = 423845, upload-time = "2026-03-31T16:15:03.703Z" }, + { url = "https://files.pythonhosted.org/packages/70/07/c17dcf05dd8045457538428a983bf1f1127928df5bf328cb24d2b7cddacb/orjson-3.11.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6dbe9a97bdb4d8d9d5367b52a7c32549bba70b2739c58ef74a6964a6d05ae054", size = 147729, upload-time = "2026-03-31T16:15:05.203Z" }, + { url = "https://files.pythonhosted.org/packages/90/6c/0fb6e8a24e682e0958d71711ae6f39110e4b9cd8cab1357e2a89cb8e1951/orjson-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5c370674ebabe16c6ccac33ff80c62bf8a6e59439f5e9d40c1f5ab8fd2215b7", size = 136425, upload-time = "2026-03-31T16:15:07.052Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/4d3cc3a3d616035beb51b24a09bb872942dc452cf2df0c1d11ab35046d9f/orjson-3.11.8-cp311-cp311-win32.whl", hash = "sha256:0e32f7154299f42ae66f13488963269e5eccb8d588a65bc839ed986919fc9fac", size = 131870, upload-time = "2026-03-31T16:15:08.678Z" }, + { url = "https://files.pythonhosted.org/packages/13/26/9fe70f81d16b702f8c3a775e8731b50ad91d22dacd14c7599b60a0941cd1/orjson-3.11.8-cp311-cp311-win_amd64.whl", hash = "sha256:25e0c672a2e32348d2eb33057b41e754091f2835f87222e4675b796b92264f06", size = 127440, upload-time = "2026-03-31T16:15:09.994Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c6/b038339f4145efd2859c1ca53097a52c0bb9cbdd24f947ebe146da1ad067/orjson-3.11.8-cp311-cp311-win_arm64.whl", hash = "sha256:9185589c1f2a944c17e26c9925dcdbc2df061cc4a145395c57f0c51f9b5dbfcd", size = 127399, upload-time = "2026-03-31T16:15:11.412Z" }, + { url = "https://files.pythonhosted.org/packages/01/f6/8d58b32ab32d9215973a1688aebd098252ee8af1766c0e4e36e7831f0295/orjson-3.11.8-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1cd0b77e77c95758f8e1100139844e99f3ccc87e71e6fc8e1c027e55807c549f", size = 229233, upload-time = "2026-03-31T16:15:12.762Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8b/2ffe35e71f6b92622e8ea4607bf33ecf7dfb51b3619dcfabfd36cbe2d0a5/orjson-3.11.8-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:6a3d159d5ffa0e3961f353c4b036540996bf8b9697ccc38261c0eac1fd3347a6", size = 128772, upload-time = "2026-03-31T16:15:14.237Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/1f8682ae50d5c6897a563cb96bc106da8c9cb5b7b6e81a52e4cc086679b9/orjson-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76070a76e9c5ae661e2d9848f216980d8d533e0f8143e6ed462807b242e3c5e8", size = 131946, upload-time = "2026-03-31T16:15:15.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/4b/5500f76f0eece84226e0689cb48dcde081104c2fa6e2483d17ca13685ffb/orjson-3.11.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54153d21520a71a4c82a0dbb4523e468941d549d221dc173de0f019678cf3813", size = 130368, upload-time = "2026-03-31T16:15:17.066Z" }, + { url = "https://files.pythonhosted.org/packages/da/4e/58b927e08fbe9840e6c920d9e299b051ea667463b1f39a56e668669f8508/orjson-3.11.8-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:469ac2125611b7c5741a0b3798cd9e5786cbad6345f9f400c77212be89563bec", size = 135540, upload-time = "2026-03-31T16:15:18.404Z" }, + { url = "https://files.pythonhosted.org/packages/56/7c/ba7cb871cba1bcd5cd02ee34f98d894c6cea96353ad87466e5aef2429c60/orjson-3.11.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14778ffd0f6896aa613951a7fbf4690229aa7a543cb2bfbe9f358e08aafa9546", size = 146877, upload-time = "2026-03-31T16:15:19.833Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/eb9c25fc1386696c6a342cd361c306452c75e0b55e86ad602dd4827a7fd7/orjson-3.11.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea56a955056a6d6c550cf18b3348656a9d9a4f02e2d0c02cabf3c73f1055d506", size = 132837, upload-time = "2026-03-31T16:15:21.282Z" }, + { url = "https://files.pythonhosted.org/packages/37/87/5ddeb7fc1fbd9004aeccab08426f34c81a5b4c25c7061281862b015fce2b/orjson-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a0f57e59a530d18a142f4d4ba6dfc708dc5fdedce45e98ff06b44930a2a48f", size = 133624, upload-time = "2026-03-31T16:15:22.641Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/90048793db94ee4b2fcec4ac8e5ddb077367637d6650be896b3494b79bb7/orjson-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b48e274f8824567d74e2158199e269597edf00823a1b12b63d48462bbf5123e", size = 141904, upload-time = "2026-03-31T16:15:24.435Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cf/eb284847487821a5d415e54149a6449ba9bfc5872ce63ab7be41b8ec401c/orjson-3.11.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3f262401086a3960586af06c054609365e98407151f5ea24a62893a40d80dbbb", size = 423742, upload-time = "2026-03-31T16:15:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/09/e12423d327071c851c13e76936f144a96adacfc037394dec35ac3fc8d1e8/orjson-3.11.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8e8c6218b614badf8e229b697865df4301afa74b791b6c9ade01d19a9953a942", size = 147806, upload-time = "2026-03-31T16:15:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6d/37c2589ba864e582ffe7611643314785c6afb1f83c701654ef05daa8fcc7/orjson-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:093d489fa039ddade2db541097dbb484999fcc65fc2b0ff9819141e2ab364f25", size = 136485, upload-time = "2026-03-31T16:15:29.749Z" }, + { url = "https://files.pythonhosted.org/packages/be/c9/135194a02ab76b04ed9a10f68624b7ebd238bbe55548878b11ff15a0f352/orjson-3.11.8-cp312-cp312-win32.whl", hash = "sha256:e0950ed1bcb9893f4293fd5c5a7ee10934fbf82c4101c70be360db23ce24b7d2", size = 131966, upload-time = "2026-03-31T16:15:31.687Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9a/9796f8fbe3cf30ce9cb696748dbb535e5c87be4bf4fe2e9ca498ef1fa8cf/orjson-3.11.8-cp312-cp312-win_amd64.whl", hash = "sha256:3cf17c141617b88ced4536b2135c552490f07799f6ad565948ea07bef0dcb9a6", size = 127441, upload-time = "2026-03-31T16:15:33.333Z" }, + { url = "https://files.pythonhosted.org/packages/cc/47/5aaf54524a7a4a0dd09dd778f3fa65dd2108290615b652e23d944152bc8e/orjson-3.11.8-cp312-cp312-win_arm64.whl", hash = "sha256:48854463b0572cc87dac7d981aa72ed8bf6deedc0511853dc76b8bbd5482d36d", size = 127364, upload-time = "2026-03-31T16:15:34.748Z" }, + { url = "https://files.pythonhosted.org/packages/66/7f/95fba509bb2305fab0073558f1e8c3a2ec4b2afe58ed9fcb7d3b8beafe94/orjson-3.11.8-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3f23426851d98478c8970da5991f84784a76682213cd50eb73a1da56b95239dc", size = 229180, upload-time = "2026-03-31T16:15:36.426Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9d/b237215c743ca073697d759b5503abd2cb8a0d7b9c9e21f524bcf176ab66/orjson-3.11.8-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ebaed4cef74a045b83e23537b52ef19a367c7e3f536751e355a2a394f8648559", size = 128754, upload-time = "2026-03-31T16:15:38.049Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/27d65b6d11e63f133781425f132807aef793ed25075fec686fc8e46dd528/orjson-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97c8f5d3b62380b70c36ffacb2a356b7c6becec86099b177f73851ba095ef623", size = 131877, upload-time = "2026-03-31T16:15:39.484Z" }, + { url = "https://files.pythonhosted.org/packages/dd/cc/faee30cd8f00421999e40ef0eba7332e3a625ce91a58200a2f52c7fef235/orjson-3.11.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:436c4922968a619fb7fef1ccd4b8b3a76c13b67d607073914d675026e911a65c", size = 130361, upload-time = "2026-03-31T16:15:41.274Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bb/a6c55896197f97b6d4b4e7c7fd77e7235517c34f5d6ad5aadd43c54c6d7c/orjson-3.11.8-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ab359aff0436d80bfe8a23b46b5fea69f1e18aaf1760a709b4787f1318b317f", size = 135521, upload-time = "2026-03-31T16:15:42.758Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7c/ca3a3525aa32ff636ebb1778e77e3587b016ab2edb1b618b36ba96f8f2c0/orjson-3.11.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f89b6d0b3a8d81e1929d3ab3d92bbc225688bd80a770c49432543928fe09ac55", size = 146862, upload-time = "2026-03-31T16:15:44.341Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0c/18a9d7f18b5edd37344d1fd5be17e94dc652c67826ab749c6e5948a78112/orjson-3.11.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c009e7a2ca9ad0ed1376ce20dd692146a5d9fe4310848904b6b4fee5c5c137", size = 132847, upload-time = "2026-03-31T16:15:46.368Z" }, + { url = "https://files.pythonhosted.org/packages/23/91/7e722f352ad67ca573cee44de2a58fb810d0f4eb4e33276c6a557979fd8a/orjson-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b895b781b3e395c067129d8551655642dfe9437273211d5404e87ac752b53", size = 133637, upload-time = "2026-03-31T16:15:48.123Z" }, + { url = "https://files.pythonhosted.org/packages/af/04/32845ce13ac5bd1046ddb02ac9432ba856cc35f6d74dde95864fe0ad5523/orjson-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:88006eda83858a9fdf73985ce3804e885c2befb2f506c9a3723cdeb5a2880e3e", size = 141906, upload-time = "2026-03-31T16:15:49.626Z" }, + { url = "https://files.pythonhosted.org/packages/02/5e/c551387ddf2d7106d9039369862245c85738b828844d13b99ccb8d61fd06/orjson-3.11.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:55120759e61309af7fcf9e961c6f6af3dde5921cdb3ee863ef63fd9db126cae6", size = 423722, upload-time = "2026-03-31T16:15:51.176Z" }, + { url = "https://files.pythonhosted.org/packages/00/a3/ecfe62434096f8a794d4976728cb59bcfc4a643977f21c2040545d37eb4c/orjson-3.11.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:98bdc6cb889d19bed01de46e67574a2eab61f5cc6b768ed50e8ac68e9d6ffab6", size = 147801, upload-time = "2026-03-31T16:15:52.939Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/0dce10b9f6643fdc59d99333871a38fa5a769d8e2fc34a18e5d2bfdee900/orjson-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:708c95f925a43ab9f34625e45dcdadf09ec8a6e7b664a938f2f8d5650f6c090b", size = 136460, upload-time = "2026-03-31T16:15:54.431Z" }, + { url = "https://files.pythonhosted.org/packages/01/d6/6dde4f31842d87099238f1f07b459d24edc1a774d20687187443ab044191/orjson-3.11.8-cp313-cp313-win32.whl", hash = "sha256:01c4e5a6695dc09098f2e6468a251bc4671c50922d4d745aff1a0a33a0cf5b8d", size = 131956, upload-time = "2026-03-31T16:15:56.081Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f9/4e494a56e013db957fb77186b818b916d4695b8fa2aa612364974160e91b/orjson-3.11.8-cp313-cp313-win_amd64.whl", hash = "sha256:c154a35dd1330707450bb4d4e7dd1f17fa6f42267a40c1e8a1daa5e13719b4b8", size = 127410, upload-time = "2026-03-31T16:15:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/803203d00d6edb6e9e7eef421d4e1adbb5ea973e40b3533f3cfd9aeb374e/orjson-3.11.8-cp313-cp313-win_arm64.whl", hash = "sha256:4861bde57f4d253ab041e374f44023460e60e71efaa121f3c5f0ed457c3a701e", size = 127338, upload-time = "2026-03-31T16:15:59.106Z" }, + { url = "https://files.pythonhosted.org/packages/6d/35/b01910c3d6b85dc882442afe5060cbf719c7d1fc85749294beda23d17873/orjson-3.11.8-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ec795530a73c269a55130498842aaa762e4a939f6ce481a7e986eeaa790e9da4", size = 229171, upload-time = "2026-03-31T16:16:00.651Z" }, + { url = "https://files.pythonhosted.org/packages/c2/56/c9ec97bd11240abef39b9e5d99a15462809c45f677420fd148a6c5e6295e/orjson-3.11.8-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c492a0e011c0f9066e9ceaa896fbc5b068c54d365fea5f3444b697ee01bc8625", size = 128746, upload-time = "2026-03-31T16:16:02.673Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e4/66d4f30a90de45e2f0cbd9623588e8ae71eef7679dbe2ae954ed6d66a41f/orjson-3.11.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:883206d55b1bd5f5679ad5e6ddd3d1a5e3cac5190482927fdb8c78fb699193b5", size = 131867, upload-time = "2026-03-31T16:16:04.342Z" }, + { url = "https://files.pythonhosted.org/packages/19/30/2a645fc9286b928675e43fa2a3a16fb7b6764aa78cc719dc82141e00f30b/orjson-3.11.8-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5774c1fdcc98b2259800b683b19599c133baeb11d60033e2095fd9d4667b82db", size = 124664, upload-time = "2026-03-31T16:16:05.837Z" }, + { url = "https://files.pythonhosted.org/packages/db/44/77b9a86d84a28d52ba3316d77737f6514e17118119ade3f91b639e859029/orjson-3.11.8-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7381c83dd3d4a6347e6635950aa448f54e7b8406a27c7ecb4a37e9f1ae08b", size = 129701, upload-time = "2026-03-31T16:16:07.407Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ea/eff3d9bfe47e9bc6969c9181c58d9f71237f923f9c86a2d2f490cd898c82/orjson-3.11.8-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14439063aebcb92401c11afc68ee4e407258d2752e62d748b6942dad20d2a70d", size = 141202, upload-time = "2026-03-31T16:16:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/52/c8/90d4b4c60c84d62068d0cf9e4d8f0a4e05e76971d133ac0c60d818d4db20/orjson-3.11.8-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa72e71977bff96567b0f500fc5bfd2fdf915f34052c782a4c6ebbdaa97aa858", size = 127194, upload-time = "2026-03-31T16:16:11.02Z" }, + { url = "https://files.pythonhosted.org/packages/8d/c7/ea9e08d1f0ba981adffb629811148b44774d935171e7b3d780ae43c4c254/orjson-3.11.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7679bc2f01bb0d219758f1a5f87bb7c8a81c0a186824a393b366876b4948e14f", size = 133639, upload-time = "2026-03-31T16:16:13.434Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8c/ddbbfd6ba59453c8fc7fe1d0e5983895864e264c37481b2a791db635f046/orjson-3.11.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:14f7b8fcb35ef403b42fa5ecfa4ed032332a91f3dc7368fbce4184d59e1eae0d", size = 141914, upload-time = "2026-03-31T16:16:14.955Z" }, + { url = "https://files.pythonhosted.org/packages/4e/31/dbfbefec9df060d34ef4962cd0afcb6fa7a9ec65884cb78f04a7859526c3/orjson-3.11.8-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c2bdf7b2facc80b5e34f48a2d557727d5c5c57a8a450de122ae81fa26a81c1bc", size = 423800, upload-time = "2026-03-31T16:16:16.594Z" }, + { url = "https://files.pythonhosted.org/packages/87/cf/f74e9ae9803d4ab46b163494adba636c6d7ea955af5cc23b8aaa94cfd528/orjson-3.11.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ccd7ba1b0605813a0715171d39ec4c314cb97a9c85893c2c5c0c3a3729df38bf", size = 147837, upload-time = "2026-03-31T16:16:18.585Z" }, + { url = "https://files.pythonhosted.org/packages/64/e6/9214f017b5db85e84e68602792f742e5dc5249e963503d1b356bee611e01/orjson-3.11.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdbc8c9c02463fef4d3c53a9ba3336d05496ec8e1f1c53326a1e4acc11f5c600", size = 136441, upload-time = "2026-03-31T16:16:20.151Z" }, + { url = "https://files.pythonhosted.org/packages/24/dd/3590348818f58f837a75fb969b04cdf187ae197e14d60b5e5a794a38b79d/orjson-3.11.8-cp314-cp314-win32.whl", hash = "sha256:0b57f67710a8cd459e4e54eb96d5f77f3624eba0c661ba19a525807e42eccade", size = 131983, upload-time = "2026-03-31T16:16:21.823Z" }, + { url = "https://files.pythonhosted.org/packages/3f/0f/b6cb692116e05d058f31ceee819c70f097fa9167c82f67fabe7516289abc/orjson-3.11.8-cp314-cp314-win_amd64.whl", hash = "sha256:735e2262363dcbe05c35e3a8869898022af78f89dde9e256924dc02e99fe69ca", size = 127396, upload-time = "2026-03-31T16:16:23.685Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d1/facb5b5051fabb0ef9d26c6544d87ef19a939a9a001198655d0d891062dd/orjson-3.11.8-cp314-cp314-win_arm64.whl", hash = "sha256:6ccdea2c213cf9f3d9490cbd5d427693c870753df41e6cb375bd79bcbafc8817", size = 127330, upload-time = "2026-03-31T16:16:25.496Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, + { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, + { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, + { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, + { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, + { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, + { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, +] + +[[package]] +name = "plotly" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "narwhals" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/7f/0f100df1172aadf88a929a9dbb902656b0880ba4b960fe5224867159d8f4/plotly-6.7.0.tar.gz", hash = "sha256:45eea0ff27e2a23ccd62776f77eb43aa1ca03df4192b76036e380bb479b892c6", size = 6911286, upload-time = "2026-04-09T20:36:45.738Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/ad/cba91b3bcf04073e4d1655a5c1710ef3f457f56f7d1b79dcc3d72f4dd912/plotly-6.7.0-py3-none-any.whl", hash = "sha256:ac8aca1c25c663a59b5b9140a549264a5badde2e057d79b8c772ae2920e32ff0", size = 9898444, upload-time = "2026-04-09T20:36:39.812Z" }, +] + +[[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 = "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.13.3" +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/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a2/1ba90a83e85a3f94c796b184f3efde9c72f2830dcda493eea8d59ba78e6d/pydantic_core-2.46.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ab124d49d0459b2373ecf54118a45c28a1e6d4192a533fbc915e70f556feb8e5", size = 2106740, upload-time = "2026-04-20T14:41:20.932Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f6/99ae893c89a0b9d3daec9f95487aa676709aa83f67643b3f0abaf4ab628a/pydantic_core-2.46.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cca67d52a5c7a16aed2b3999e719c4bcf644074eac304a5d3d62dd70ae7d4b2c", size = 1948293, upload-time = "2026-04-20T14:43:42.115Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b8/2e8e636dc9e3f16c2e16bf0849e24be82c5ee82c603c65fc0326666328fc/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c024e08c0ba23e6fd68c771a521e9d6a792f2ebb0fa734296b36394dc30390e", size = 1973222, upload-time = "2026-04-20T14:41:57.841Z" }, + { url = "https://files.pythonhosted.org/packages/34/36/0e730beec4d83c5306f417afbd82ff237d9a21e83c5edf675f31ed84c1fe/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6645ce7eec4928e29a1e3b3d5c946621d105d3e79f0c9cddf07c2a9770949287", size = 2053852, upload-time = "2026-04-20T14:40:43.077Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f0/3071131f47e39136a17814576e0fada9168569f7f8c0e6ac4d1ede6a4958/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a712c7118e6c5ea96562f7b488435172abb94a3c53c22c9efc1412264a45cbbe", size = 2221134, upload-time = "2026-04-20T14:43:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a9/a2dc023eec5aa4b02a467874bad32e2446957d2adcab14e107eab502e978/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a868ef3ff206343579021c40faf3b1edc64b1cc508ff243a28b0a514ccb050", size = 2279785, upload-time = "2026-04-20T14:41:19.285Z" }, + { url = "https://files.pythonhosted.org/packages/0a/44/93f489d16fb63fbd41c670441536541f6e8cfa1e5a69f40bc9c5d30d8c90/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc7e8c32db809aa0f6ea1d6869ebc8518a65d5150fdfad8bcae6a49ae32a22e2", size = 2089404, upload-time = "2026-04-20T14:43:10.108Z" }, + { url = "https://files.pythonhosted.org/packages/2a/78/8692e3aa72b2d004f7a5d937f1dfdc8552ba26caf0bec75f342c40f00dec/pydantic_core-2.46.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3481bd1341dc85779ee506bc8e1196a277ace359d89d28588a9468c3ecbe63fa", size = 2114898, upload-time = "2026-04-20T14:44:51.475Z" }, + { url = "https://files.pythonhosted.org/packages/6a/62/e83133f2e7832532060175cebf1f13748f4c7e7e7165cdd1f611f174494b/pydantic_core-2.46.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8690eba565c6d68ffd3a8655525cbdd5246510b44a637ee2c6c03a7ebfe64d3c", size = 2157856, upload-time = "2026-04-20T14:43:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ec/6a500e3ad7718ee50583fae79c8651f5d37e3abce1fa9ae177ae65842c53/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4de88889d7e88d50d40ee5b39d5dac0bcaef9ba91f7e536ac064e6b2834ecccf", size = 2180168, upload-time = "2026-04-20T14:42:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/d8/53/8267811054b1aa7fc1dc7ded93812372ef79a839f5e23558136a6afbfde1/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e480080975c1ef7f780b8f99ed72337e7cc5efea2e518a20a692e8e7b278eb8b", size = 2322885, upload-time = "2026-04-20T14:41:05.253Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c1/1c0acdb3aa0856ddc4ecc55214578f896f2de16f400cf51627eb3c26c1c4/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de3a5c376f8cd94da9a1b8fd3dd1c16c7a7b216ed31dc8ce9fd7a22bf13b836e", size = 2360328, upload-time = "2026-04-20T14:41:43.991Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d0/ef39cd0f4a926814f360e71c1adeab48ad214d9727e4deb48eedfb5bce1a/pydantic_core-2.46.3-cp311-cp311-win32.whl", hash = "sha256:fc331a5314ffddd5385b9ee9d0d2fee0b13c27e0e02dad71b1ae5d6561f51eeb", size = 1979464, upload-time = "2026-04-20T14:43:12.215Z" }, + { url = "https://files.pythonhosted.org/packages/18/9c/f41951b0d858e343f1cf09398b2a7b3014013799744f2c4a8ad6a3eec4f2/pydantic_core-2.46.3-cp311-cp311-win_amd64.whl", hash = "sha256:b5b9c6cf08a8a5e502698f5e153056d12c34b8fb30317e0c5fd06f45162a6346", size = 2070837, upload-time = "2026-04-20T14:41:47.707Z" }, + { url = "https://files.pythonhosted.org/packages/9f/1e/264a17cd582f6ed50950d4d03dd5fefd84e570e238afe1cb3e25cf238769/pydantic_core-2.46.3-cp311-cp311-win_arm64.whl", hash = "sha256:5dfd51cf457482f04ec49491811a2b8fd5b843b64b11eecd2d7a1ee596ea78a6", size = 2053647, upload-time = "2026-04-20T14:42:27.535Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, + { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, + { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, + { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, + { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, + { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, + { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, + { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, + { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, + { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, + { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, + { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, + { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, + { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, + { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, + { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, + { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, + { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, + { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, + { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, + { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, + { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, + { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, + { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, + { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, + { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/66/7f/03dbad45cd3aa9083fbc93c210ae8b005af67e4136a14186950a747c6874/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:9715525891ed524a0a1eb6d053c74d4d4ad5017677fb00af0b7c2644a31bae46", size = 2105683, upload-time = "2026-04-20T14:42:19.779Z" }, + { url = "https://files.pythonhosted.org/packages/26/22/4dc186ac8ea6b257e9855031f51b62a9637beac4d68ac06bee02f046f836/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:9d2f400712a99a013aff420ef1eb9be077f8189a36c1e3ef87660b4e1088a874", size = 1940052, upload-time = "2026-04-20T14:43:59.274Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/d376391a5aff1f2e8188960d7873543608130a870961c2b6b5236627c116/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd2aab0e2e9dc2daf36bd2686c982535d5e7b1d930a1344a7bb6e82baab42a76", size = 1988172, upload-time = "2026-04-20T14:41:17.469Z" }, + { url = "https://files.pythonhosted.org/packages/0e/6b/523b9f85c23788755d6ab949329de692a2e3a584bc6beb67fef5e035aa9d/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9d76736da5f362fabfeea6a69b13b7f2be405c6d6966f06b2f6bfff7e64531", size = 2128596, upload-time = "2026-04-20T14:40:41.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, + { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, + { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, + { url = "https://files.pythonhosted.org/packages/1f/da/99d40830684f81dec901cac521b5b91c095394cc1084b9433393cde1c2df/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:13afdd885f3d71280cf286b13b310ee0f7ccfefd1dbbb661514a474b726e2f25", size = 2107973, upload-time = "2026-04-20T14:42:06.175Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/87024121818d75bbb2a98ddbaf638e40e7a18b5e0f5492c9ca4b1b316107/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f91c0aff3e3ee0928edd1232c57f643a7a003e6edf1860bc3afcdc749cb513f3", size = 1947191, upload-time = "2026-04-20T14:43:14.319Z" }, + { url = "https://files.pythonhosted.org/packages/60/62/0c1acfe10945b83a6a59d19fbaa92f48825381509e5701b855c08f13db76/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6529d1d128321a58d30afcc97b49e98836542f68dd41b33c2e972bb9e5290536", size = 2123791, upload-time = "2026-04-20T14:43:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/3b2393b4c8f44285561dc30b00cf307a56a2eff7c483a824db3b8221ca51/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:975c267cff4f7e7272eacbe50f6cc03ca9a3da4c4fbd66fffd89c94c1e311aa1", size = 2153197, upload-time = "2026-04-20T14:44:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ba/75/5af02fb35505051eee727c061f2881c555ab4f8ddb2d42da715a42c9731b/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2b8e4f2bbdf71415c544b4b1138b8060db7b6611bc927e8064c769f64bed651c", size = 2181073, upload-time = "2026-04-20T14:43:20.729Z" }, + { url = "https://files.pythonhosted.org/packages/10/92/7e0e1bd9ca3c68305db037560ca2876f89b2647deb2f8b6319005de37505/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e61ea8e9fff9606d09178f577ff8ccdd7206ff73d6552bcec18e1033c4254b85", size = 2315886, upload-time = "2026-04-20T14:44:04.826Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d8/101655f27eaf3e44558ead736b2795d12500598beed4683f279396fa186e/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b504bda01bafc69b6d3c7a0c7f039dcf60f47fab70e06fe23f57b5c75bdc82b8", size = 2360528, upload-time = "2026-04-20T14:40:47.431Z" }, + { url = "https://files.pythonhosted.org/packages/07/0f/1c34a74c8d07136f0d729ffe5e1fdab04fbdaa7684f61a92f92511a84a15/pydantic_core-2.46.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b00b76f7142fc60c762ce579bd29c8fa44aaa56592dd3c54fab3928d0d4ca6ff", size = 2184144, upload-time = "2026-04-20T14:42:57Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/98/c8345dccdc31de4228c039a98f6467a941e39558da41c1744fbe29fa5666/pydantic_settings-2.14.0.tar.gz", hash = "sha256:24285fd4b0e0c06507dd9fdfd331ee23794305352aaec8fc4eb92d4047aeb67d", size = 235709, upload-time = "2026-04-20T13:37:40.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/dd/bebff3040138f00ae8a102d426b27349b9a49acc310fcae7f92112d867e3/pydantic_settings-2.14.0-py3-none-any.whl", hash = "sha256:fc8d5d692eb7092e43c8647c1c35a3ecd00e040fcf02ed86f4cb5458ca62182e", size = 60940, upload-time = "2026-04-20T13:37:38.586Z" }, +] + +[[package]] +name = "pydyf" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/ee/fb410c5c854b6a081a49077912a9765aeffd8e07cbb0663cfda310b01fb4/pydyf-0.12.1.tar.gz", hash = "sha256:fbd7e759541ac725c29c506612003de393249b94310ea78ae44cb1d04b220095", size = 17716, upload-time = "2025-12-02T14:52:14.244Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/11/47efe2f66ba848a107adfd490b508f5c0cedc82127950553dca44d29e6c4/pydyf-0.12.1-py3-none-any.whl", hash = "sha256:ea25b4e1fe7911195cb57067560daaa266639184e8335365cc3ee5214e7eaadc", size = 8028, upload-time = "2025-12-02T14:52:12.938Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyphen" +version = "0.17.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/69/56/e4d7e1bd70d997713649c5ce530b2d15a5fc2245a74ca820fc2d51d89d4d/pyphen-0.17.2.tar.gz", hash = "sha256:f60647a9c9b30ec6c59910097af82bc5dd2d36576b918e44148d8b07ef3b4aa3", size = 2079470, upload-time = "2025-01-20T13:18:36.296Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/1f/c2142d2edf833a90728e5cdeb10bdbdc094dde8dbac078cee0cf33f5e11b/pyphen-0.17.2-py3-none-any.whl", hash = "sha256:3a07fb017cb2341e1d9ff31b8634efb1ae4dc4b130468c7c39dd3d32e7c3affd", size = 2079358, upload-time = "2025-01-20T13:18:29.629Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +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/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, +] + +[[package]] +name = "pytest-timeout" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382, upload-time = "2025-05-05T19:44:33.502Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.26" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/71/b145a380824a960ebd60e1014256dbb7d2253f2316ff2d73dfd8928ec2c3/python_multipart-0.0.26.tar.gz", hash = "sha256:08fadc45918cd615e26846437f50c5d6d23304da32c341f289a617127b081f17", size = 43501, upload-time = "2026-04-10T14:09:59.473Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/22/f1925cdda983ab66fc8ec6ec8014b959262747e58bdca26a4e3d1da29d56/python_multipart-0.0.26-py3-none-any.whl", hash = "sha256:c0b169f8c4484c13b0dcf2ef0ec3a4adb255c4b7d18d8e420477d2b1dd03f185", size = 28847, upload-time = "2026-04-10T14:09:58.131Z" }, +] + +[[package]] +name = "pytz" +version = "2026.1.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, +] + +[[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 = "requests" +version = "2.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, +] + +[[package]] +name = "simplejson" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/2a/54837395a3487c725669428d513293612a48d82b95a0642c936932e5d898/simplejson-4.1.1.tar.gz", hash = "sha256:c08eb9f7a90f77ae470e19a07472e9a79ebc0d1c2315d86a72767665bd5ba79f", size = 118860, upload-time = "2026-04-24T19:24:59.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/25/39013ffe279d90093ec1c848565b3683c586906c10fa55d9000ec29d046b/simplejson-4.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2867c64d92abd1992c15666fae198203093f593e43d6b81adf176bae530d493a", size = 111538, upload-time = "2026-04-24T19:22:49.051Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ae/2c272971c8a87e2539c54a98eb6ff037bee1e2e93943c3986cf7500a4f3a/simplejson-4.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c47c46e16c8ea9e4850061e6ed5aa2b9cd2074cb2274bfd9c138cba15ce7453", size = 90594, upload-time = "2026-04-24T19:22:50.408Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a2/6eebfb99dedc139f549200f61ade6d1890ac5707c5d427bdfa6fe39c9313/simplejson-4.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e294e33dbf316a9bbdd4030d46503c9b0f19470ae7ad6af5bae6c426bc2e869f", size = 90718, upload-time = "2026-04-24T19:22:51.694Z" }, + { url = "https://files.pythonhosted.org/packages/80/7e/c9e6c0c4ad8415e64dad0c47f619b556b02680a41631b4dbc281d55dc54d/simplejson-4.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7ce252b28fddbdd83db5bd7d93dad2a8a591d7ada098afec9c1b23d6b722a7a4", size = 180901, upload-time = "2026-04-24T19:22:53.025Z" }, + { url = "https://files.pythonhosted.org/packages/34/09/69e331e3994b1ed9be6ce9ace4ade704e7ed503edf869929ca7bb404eda8/simplejson-4.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c44ef6b02a4eb67ed17a72342341792149b3ff46f15426c26e970e49addf327", size = 178133, upload-time = "2026-04-24T19:22:54.574Z" }, + { url = "https://files.pythonhosted.org/packages/5d/40/ed806f24afef295c1032448f5ff6f6f2979392d5645ddb9f4fed7f38194d/simplejson-4.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82bfca2b85a34178c25829c703f0a9e9f113a5af7539285bd3efb583a0bf1ba3", size = 188155, upload-time = "2026-04-24T19:22:56.044Z" }, + { url = "https://files.pythonhosted.org/packages/38/94/8d6f515b827b0f7881a49c8c1ac6920b7ae9428939ef04238c973278b42a/simplejson-4.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e4b23f71dd781f8830f1663dc01a4944d3dbf87a1f93d78fba1cf64722d0ccf", size = 176225, upload-time = "2026-04-24T19:22:57.981Z" }, + { url = "https://files.pythonhosted.org/packages/c9/fd/6dffb4956563d48bbe46b91ff341adae34920e94008fd6b8d728072abfc7/simplejson-4.1.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:82fee635d7b73ad801030b05a75fbd34a098da0c2ecf600667a03636d09e1e42", size = 185535, upload-time = "2026-04-24T19:22:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/de/d2/a509ee37763e79aec75d68f8521db1440306edeba3b8b4064ab4ee8bf1d9/simplejson-4.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:68e62eda21192c5ea9bb92d571ca46a4477fef48762f50d433de2b4253051551", size = 179302, upload-time = "2026-04-24T19:23:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/d8/23/5b343bfd2a79d3b6818e4db3586c405a001a090d4c89d336e31273ce7177/simplejson-4.1.1-cp311-cp311-win32.whl", hash = "sha256:ffd3d82294b47f5ec64050021ace95fd62628a0c1cc8bbf4d06d2d1fb697e055", size = 88408, upload-time = "2026-04-24T19:23:02.808Z" }, + { url = "https://files.pythonhosted.org/packages/38/04/df9b37aedbd524dca20840d25ebe01d6ae486b89792aeff5d15b9c4114f7/simplejson-4.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:78a3fe0995be42bed62a26aa78e0e0b4d87c6545785346b9cc898f3389569a35", size = 90526, upload-time = "2026-04-24T19:23:04.408Z" }, + { url = "https://files.pythonhosted.org/packages/60/25/e90998fe8e480eb43b966c09e835379887d427567ebd496563d3b1e16b19/simplejson-4.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:19040a17154dc03d289bab68d73ce0a6a0be01de30c584bbdd93490bead14b22", size = 112414, upload-time = "2026-04-24T19:23:06.084Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a0/abd4785f36c3400f1fbb21f517be39295a750a714f04b7ee175adf6ef580/simplejson-4.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a94ebaecdbaa80d9551a3ec6bf0c9302fc8b53ab6c1b2bfd498a1df4cb28158d", size = 91120, upload-time = "2026-04-24T19:23:07.877Z" }, + { url = "https://files.pythonhosted.org/packages/b8/78/fc060d2e3b13c6ec59288574b8efac64075e316b2afba4396a56b2422f78/simplejson-4.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:67341c95c0a168ab4a6d1e807e50463f1c8da932c3286d81e201266c427061fa", size = 91055, upload-time = "2026-04-24T19:23:09.264Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b6/156a8de1e1b47694f0e7de6675866936608d45dc68388fd017d36f8693be/simplejson-4.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:45ec18e337fec538b7e902d489505c450b2454653d1290f3f50385e6fd8aa607", size = 190297, upload-time = "2026-04-24T19:23:11.226Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/e4d0eab695be3eb21d0f46bce820752031f03e7113f9c80a9b3c73ee7157/simplejson-4.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:820c69a4710400e9b248d5670647d60be58824369282d3925e516b3ff1a7cd82", size = 187002, upload-time = "2026-04-24T19:23:12.982Z" }, + { url = "https://files.pythonhosted.org/packages/76/0e/7f5a59d29426b062d5928fb88b403c3f797129d53be7102f955dbe51aa44/simplejson-4.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e708d373a10e4378ef2d59f8361850c7150fd907ed49efe49bc5492160476d1", size = 195146, upload-time = "2026-04-24T19:23:14.517Z" }, + { url = "https://files.pythonhosted.org/packages/78/18/9943db224dd4d5fa3c090c3e56a94c37b254338c83995ec5680285111c40/simplejson-4.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:980fc33353f81fd12d8c49d44f8c2760d1dc8192285e627c5180d141035b228a", size = 183931, upload-time = "2026-04-24T19:23:16.742Z" }, + { url = "https://files.pythonhosted.org/packages/c2/08/9a690da9a766161c06c627d805362cf159f1abe480969372b2897649b955/simplejson-4.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:de2ed102fff88dacf543699f53ee3a533cc11539a39baa176b7e09dd783069d6", size = 192228, upload-time = "2026-04-24T19:23:18.33Z" }, + { url = "https://files.pythonhosted.org/packages/05/88/bd8aad36b451ffb0e0a3f721d695a88befa6d1ac7d1e02ae788ca7ff4029/simplejson-4.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2785ff8edc0e28bf773a32543a6bbed46351453c997b3f6709c744e3c2f7eabb", size = 187808, upload-time = "2026-04-24T19:23:21.165Z" }, + { url = "https://files.pythonhosted.org/packages/04/ee/14f91db0d1f481533b651dafbf8cd0da088d9817f7af30c68f7f19f9c847/simplejson-4.1.1-cp312-cp312-win32.whl", hash = "sha256:2e0d5ead6d14610467ec356ec1f6b5d8a56aa216abaad8d41c8b873b16cf313f", size = 88512, upload-time = "2026-04-24T19:23:22.764Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c4/90de06b2d8737c68c05ff9274113f854dbf6a5f28b7a955212111672cb57/simplejson-4.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:63a5451f557d6be48a231bae932458655c620902b868170b2f1c8afed496f6b4", size = 90748, upload-time = "2026-04-24T19:23:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/37/a9/47b445eeb559c9593453a0648e0fd6d08e8adff64dd5e5ced66726da8a09/simplejson-4.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dff52fc7af272e84fc21cc5a06c927c823ca6ae00af14f3b0d7707b42775ed98", size = 113160, upload-time = "2026-04-24T19:23:26.033Z" }, + { url = "https://files.pythonhosted.org/packages/4c/65/cb72db31523c164dea5dc55b02dad065a40c478856bc7534b279d2b51906/simplejson-4.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:971aed0647ad6e840a3943bec812fcda5f2d26a5497a4981d1fb49aa4f9a396c", size = 91521, upload-time = "2026-04-24T19:23:27.572Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e5/54cb7c50ad5fdc1e0a86b7df4b135c2cbd5c4623605aa94466659098e8da/simplejson-4.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:249e2e220aa6d9b9d936bde84eb7bf79d5b6c5a8273c6e411f8b1635a9073f2d", size = 91407, upload-time = "2026-04-24T19:23:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/21a3ede87f0bf82d6c7bcb90480d50a6490eb974c6ab20881188e440957c/simplejson-4.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e5cdd6a5d52299f345c15ab5678cc4249e24f383f361d986afbc3c7072a6b6b", size = 192451, upload-time = "2026-04-24T19:23:30.56Z" }, + { url = "https://files.pythonhosted.org/packages/59/df/9903edd3102bf0b5984edfcb90c88612330996efa3b4fbf8a971d6e17839/simplejson-4.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:642cec364e0676e2d5a73fa4d31d0c7c55886997caa2fde24e8292ca44d32728", size = 189015, upload-time = "2026-04-24T19:23:32.647Z" }, + { url = "https://files.pythonhosted.org/packages/98/cd/33230927a780e1398b857e3944abb914556994d252b1d765ae40d112cb25/simplejson-4.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:76fe296ca1df23d290033f10aaacf534fd1b3e3007e7f9ff8aa68b21413aaa78", size = 196658, upload-time = "2026-04-24T19:23:34.563Z" }, + { url = "https://files.pythonhosted.org/packages/cd/84/2c5a7444eb53e9a86d3738299bffddd9f53aeed799ded2f45368221fdb19/simplejson-4.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f0ad25b7dc4e0fb23858355819f2e994f1a5badcdcde8737eac7921c2f1ed2a", size = 185967, upload-time = "2026-04-24T19:23:36.191Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/454378e06d059cd412a7ed5d87fb6d29fd5b60f13a4d89fc1f764ff434df/simplejson-4.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a59ebd0533f03fd06ff0c42ba0f02d93cbcdd7944922bf3b93911327a95b901f", size = 193940, upload-time = "2026-04-24T19:23:38.151Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d5/a15bf915f623a2c5a079d6e3be8256fdb8ef06f110669493a09b9d6933e0/simplejson-4.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bccbf4419676b517939852e5aeff2af6aee4dc046881c67a1581fa6f1cb01abd", size = 189795, upload-time = "2026-04-24T19:23:40.139Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c9/37212ae7dc4b607f0978c408e8633f05c810884e054c33113184c6c2c8a2/simplejson-4.1.1-cp313-cp313-win32.whl", hash = "sha256:6c845363eb5fd166fb7c72243da38f4fcfde666ede7fdf2cc6fd7762894626f7", size = 88773, upload-time = "2026-04-24T19:23:41.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a5/c7a0a47883a9015b54c9d8a4b62f2aba17bd4335b1787b9b8a0fc2fa6d52/simplejson-4.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:104d8324c34f25b4b90800bc5fa363780cbc3d8496aef061cba7ce1af9162270", size = 90888, upload-time = "2026-04-24T19:23:43.11Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/4a118a6a92eb33bb08c8e2fe7ec85cb96f0673491bb2b829930831ee4fbe/simplejson-4.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ed7473602b6625de793b6acba49aa949f144a475f538792067e4cf2fda2071f5", size = 110492, upload-time = "2026-04-24T19:23:44.957Z" }, + { url = "https://files.pythonhosted.org/packages/07/f4/84d160e9fa8cada1e0a9381cae4fa81eecd573577a5b34366d8ced59bdf7/simplejson-4.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:225c9caa324c5b554d009fb9cac22aee7711e71bd96f487938c659af467e828e", size = 90152, upload-time = "2026-04-24T19:23:46.355Z" }, + { url = "https://files.pythonhosted.org/packages/68/31/9a5432c433a7671107182cdc9a20ea78a70f99c4e5334aa54b6d4d0d79ed/simplejson-4.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:95407269340c7f22f09776ea7b717a52cf56cfcf119b5e45f66faa4a26445bea", size = 90115, upload-time = "2026-04-24T19:23:47.743Z" }, + { url = "https://files.pythonhosted.org/packages/78/91/3635cdb13318cb0a328abaa69e2b91251caad39d6779aa308098f341f6cb/simplejson-4.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3851658d642c1184d2023f0e6c9ce44a21eb1629e74e7c84ef956b128841fe12", size = 184036, upload-time = "2026-04-24T19:23:49.472Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/149b6ec5393f6849d98c59cadba888b710a8ef4b805ab91e11a566960d40/simplejson-4.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95a3bb0f78e85f4937f99092239f2011ce06f0f2d803df5c299cc05abbeae008", size = 180543, upload-time = "2026-04-24T19:23:51.023Z" }, + { url = "https://files.pythonhosted.org/packages/df/7c/a5d968d0b527a748b667e62bea94309ccbcb1e2b108e8f0cf8547efaa12b/simplejson-4.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bbfdaa7c0603f75b7b14b211b7f2be44696d4e26833ad2d91d5c87bf5fb9a920", size = 188725, upload-time = "2026-04-24T19:23:52.995Z" }, + { url = "https://files.pythonhosted.org/packages/db/e3/6a8d11181d587ef00e2db9112357e6832111e56dd56b01b5c11758a1965d/simplejson-4.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e3c584071dced8c21b4689f0254303521daeb9b5bc1f4289755d71fa3cb0d3", size = 177492, upload-time = "2026-04-24T19:23:54.581Z" }, + { url = "https://files.pythonhosted.org/packages/67/e3/8b0eb8b06e8198cfbd1270487da163d0093df05cc4f557350cd65e2f7e79/simplejson-4.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:036a27bd0469b9d79557cbddb392969f876cd7f278cfbd0fba81534927a06575", size = 185281, upload-time = "2026-04-24T19:23:56.13Z" }, + { url = "https://files.pythonhosted.org/packages/dc/5f/64990f07ec9e2cb1a814c674e2e21b5693207f74ac70eb72151b847ea4e6/simplejson-4.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b70bfd2f67f3351baba08aa3ae9233c83f21fd95ae5e6b3d0ecb8c647929112f", size = 181848, upload-time = "2026-04-24T19:23:57.92Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/bbc1bc0447f339f79f99ab8c37f7f037cb2f1f93af75d6a4d553096bb0c3/simplejson-4.1.1-cp314-cp314-win32.whl", hash = "sha256:37233c72ce88d06acb92747347742b3c07871eba6789f060c179c9302dde8efe", size = 88761, upload-time = "2026-04-24T19:23:59.397Z" }, + { url = "https://files.pythonhosted.org/packages/18/72/ec1b5cbdcb140c132e6c7bdf99bd73e4f675439e77126c88f472fcffa09c/simplejson-4.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:cc0442dea71cd9cbf30a0b8b9929ab5aa6c02c0443a3d977351e6ec5bada4388", size = 91018, upload-time = "2026-04-24T19:24:00.85Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/4fa437f68ff72219bac3bf3d050de9c6265691f3a170e16954bd69d7cddd/simplejson-4.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:c996a4d38290c515af347740659ce095b425449c164a5c9fa3977caa6eff5dbe", size = 113919, upload-time = "2026-04-24T19:24:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/c2/83/59de041d09eb4a9577f7015d7263c32095dfb7fde49717dff62145d89809/simplejson-4.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c65c763fb20d7ca113c1c14dce2fc04a0fc3a57aceff533d6fdac707c7bffb40", size = 91904, upload-time = "2026-04-24T19:24:03.812Z" }, + { url = "https://files.pythonhosted.org/packages/03/8e/46bb345d540f6eb31427d984a4e518cdb182d0621814fee4fee045e8815b/simplejson-4.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0da5c9f57206ee7ef280ff7f1d924937b0a64f9a271a5ef371a2ecdbebba7421", size = 91752, upload-time = "2026-04-24T19:24:05.622Z" }, + { url = "https://files.pythonhosted.org/packages/83/e2/1b2ce97f068835eb3d253c116a4df7a3f436b7bf2fb5ff1ba29287e8b0ec/simplejson-4.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ea3426e786425d10e9e82f8a6eda74a7d6eb10d99165ac3d0d3bbcb65c0ea343", size = 214021, upload-time = "2026-04-24T19:24:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/48/70/d93e556df6a0786298644a7c08304fcbeddc248325f23f38acbebeb21165/simplejson-4.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d75cea7a1025edd7e439b2966b3d977c45b5b899e2adaf422811b3ac702ed9fb", size = 213530, upload-time = "2026-04-24T19:24:09.289Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/c93bf305b9f00d7259e09e713d60e75bd0f7f53da970f716ab90491770e7/simplejson-4.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63c2ada8e58f266491f19eed2eeeb7c25c6141e52f8f9e820f6bb94156cf8dbc", size = 218282, upload-time = "2026-04-24T19:24:10.991Z" }, + { url = "https://files.pythonhosted.org/packages/0c/20/a9b5d2e27ec44b069ee251bd55544fc76929a067107b1050001566ba86f3/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d1fffb56305c5b475ee746cf9e04f97423ba5aaacd292dc1255bd75b1d3b124b", size = 209249, upload-time = "2026-04-24T19:24:12.662Z" }, + { url = "https://files.pythonhosted.org/packages/97/e4/e06ee682ed5df67592181f5ecb062e35878967e27f5b6e087237d4548d95/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a6525ec733f43d0541206cffa64fd2aad5a7ae3eb76566aff49cd4db6382209a", size = 213963, upload-time = "2026-04-24T19:24:14.302Z" }, + { url = "https://files.pythonhosted.org/packages/9c/9f/1e160e4cd8cdbf062bf6a454cdf814dc7a48eb47e566fdb8f80ccb202605/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:861e393260508efa64d8805a8e49c416c3484907e3f146ce966c69552b49b9a3", size = 210474, upload-time = "2026-04-24T19:24:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e6/cecd913df322df5bbe7ebb8ba39e0708e505a165553900da8a7761026d6f/simplejson-4.1.1-cp314-cp314t-win32.whl", hash = "sha256:d083b89d30948a751d3d97476c2ed91e4caaa24a1a1459bdbadb8876242c71fe", size = 91134, upload-time = "2026-04-24T19:24:17.635Z" }, + { url = "https://files.pythonhosted.org/packages/97/73/f540dde99cc1d393bd062ab3b5735b777561a5d8f8a5f2e241164444d77a/simplejson-4.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4cbb299d0528ec0447fe366d8c9641860e28f997a62730690fef905f1f41046e", size = 94467, upload-time = "2026-04-24T19:24:19.109Z" }, + { url = "https://files.pythonhosted.org/packages/ce/6a/8b74c52ffd33dbbde00fe7251fee6a0acdc8cea33f7a43805aed258fb79b/simplejson-4.1.1-py3-none-any.whl", hash = "sha256:2ce92b3748f02423e26d2bfb636fb9d7a8f67c8f5854dcae69d350d123b2eee2", size = 69195, upload-time = "2026-04-24T19:24:57.962Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.49" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/45/461788f35e0364a8da7bda51a1fe1b09762d0c32f12f63727998d85a873b/sqlalchemy-2.0.49.tar.gz", hash = "sha256:d15950a57a210e36dd4cec1aac22787e2a4d57ba9318233e2ef8b2daf9ff2d5f", size = 9898221, upload-time = "2026-04-03T16:38:11.704Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/b5/e3617cc67420f8f403efebd7b043128f94775e57e5b84e7255203390ceae/sqlalchemy-2.0.49-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5070135e1b7409c4161133aa525419b0062088ed77c92b1da95366ec5cbebbe", size = 2159126, upload-time = "2026-04-03T16:50:13.242Z" }, + { url = "https://files.pythonhosted.org/packages/20/9b/91ca80403b17cd389622a642699e5f6564096b698e7cdcbcbb6409898bc4/sqlalchemy-2.0.49-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ac7a3e245fd0310fd31495eb61af772e637bdf7d88ee81e7f10a3f271bff014", size = 3315509, upload-time = "2026-04-03T16:54:49.332Z" }, + { url = "https://files.pythonhosted.org/packages/b1/61/0722511d98c54de95acb327824cb759e8653789af2b1944ab1cc69d32565/sqlalchemy-2.0.49-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d4e5a0ceba319942fa6b585cf82539288a61e314ef006c1209f734551ab9536", size = 3315014, upload-time = "2026-04-03T16:56:56.376Z" }, + { url = "https://files.pythonhosted.org/packages/46/55/d514a653ffeb4cebf4b54c47bec32ee28ad89d39fafba16eeed1d81dccd5/sqlalchemy-2.0.49-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3ddcb27fb39171de36e207600116ac9dfd4ae46f86c82a9bf3934043e80ebb88", size = 3267388, upload-time = "2026-04-03T16:54:51.272Z" }, + { url = "https://files.pythonhosted.org/packages/2f/16/0dcc56cb6d3335c1671a2258f5d2cb8267c9a2260e27fde53cbfb1b3540a/sqlalchemy-2.0.49-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:32fe6a41ad97302db2931f05bb91abbcc65b5ce4c675cd44b972428dd2947700", size = 3289602, upload-time = "2026-04-03T16:56:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/51/6c/f8ab6fb04470a133cd80608db40aa292e6bae5f162c3a3d4ab19544a67af/sqlalchemy-2.0.49-cp311-cp311-win32.whl", hash = "sha256:46d51518d53edfbe0563662c96954dc8fcace9832332b914375f45a99b77cc9a", size = 2119044, upload-time = "2026-04-03T17:00:53.455Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/55a6d627d04b6ebb290693681d7683c7da001eddf90b60cfcc41ee907978/sqlalchemy-2.0.49-cp311-cp311-win_amd64.whl", hash = "sha256:951d4a210744813be63019f3df343bf233b7432aadf0db54c75802247330d3af", size = 2143642, upload-time = "2026-04-03T17:00:54.769Z" }, + { url = "https://files.pythonhosted.org/packages/49/b3/2de412451330756aaaa72d27131db6dde23995efe62c941184e15242a5fa/sqlalchemy-2.0.49-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbccb45260e4ff1b7db0be80a9025bb1e6698bdb808b83fff0000f7a90b2c0b", size = 2157681, upload-time = "2026-04-03T16:53:07.132Z" }, + { url = "https://files.pythonhosted.org/packages/50/84/b2a56e2105bd11ebf9f0b93abddd748e1a78d592819099359aa98134a8bf/sqlalchemy-2.0.49-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb37f15714ec2652d574f021d479e78cd4eb9d04396dca36568fdfffb3487982", size = 3338976, upload-time = "2026-04-03T17:07:40Z" }, + { url = "https://files.pythonhosted.org/packages/2c/fa/65fcae2ed62f84ab72cf89536c7c3217a156e71a2c111b1305ab6f0690e2/sqlalchemy-2.0.49-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb9ec6436a820a4c006aad1ac351f12de2f2dbdaad171692ee457a02429b672", size = 3351937, upload-time = "2026-04-03T17:12:23.374Z" }, + { url = "https://files.pythonhosted.org/packages/f8/2f/6fd118563572a7fe475925742eb6b3443b2250e346a0cc27d8d408e73773/sqlalchemy-2.0.49-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8d6efc136f44a7e8bc8088507eaabbb8c2b55b3dbb63fe102c690da0ddebe55e", size = 3281646, upload-time = "2026-04-03T17:07:41.949Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d7/410f4a007c65275b9cf82354adb4bb8ba587b176d0a6ee99caa16fe638f8/sqlalchemy-2.0.49-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e06e617e3d4fd9e51d385dfe45b077a41e9d1b033a7702551e3278ac597dc750", size = 3316695, upload-time = "2026-04-03T17:12:25.642Z" }, + { url = "https://files.pythonhosted.org/packages/d9/95/81f594aa60ded13273a844539041ccf1e66c5a7bed0a8e27810a3b52d522/sqlalchemy-2.0.49-cp312-cp312-win32.whl", hash = "sha256:83101a6930332b87653886c01d1ee7e294b1fe46a07dd9a2d2b4f91bcc88eec0", size = 2117483, upload-time = "2026-04-03T17:05:40.896Z" }, + { url = "https://files.pythonhosted.org/packages/47/9e/fd90114059175cac64e4fafa9bf3ac20584384d66de40793ae2e2f26f3bb/sqlalchemy-2.0.49-cp312-cp312-win_amd64.whl", hash = "sha256:618a308215b6cececb6240b9abde545e3acdabac7ae3e1d4e666896bf5ba44b4", size = 2144494, upload-time = "2026-04-03T17:05:42.282Z" }, + { url = "https://files.pythonhosted.org/packages/ae/81/81755f50eb2478eaf2049728491d4ea4f416c1eb013338682173259efa09/sqlalchemy-2.0.49-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df2d441bacf97022e81ad047e1597552eb3f83ca8a8f1a1fdd43cd7fe3898120", size = 2154547, upload-time = "2026-04-03T16:53:08.64Z" }, + { url = "https://files.pythonhosted.org/packages/a2/bc/3494270da80811d08bcfa247404292428c4fe16294932bce5593f215cad9/sqlalchemy-2.0.49-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e20e511dc15265fb433571391ba313e10dd8ea7e509d51686a51313b4ac01a2", size = 3280782, upload-time = "2026-04-03T17:07:43.508Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f5/038741f5e747a5f6ea3e72487211579d8cbea5eb9827a9cbd61d0108c4bd/sqlalchemy-2.0.49-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47604cb2159f8bbd5a1ab48a714557156320f20871ee64d550d8bf2683d980d3", size = 3297156, upload-time = "2026-04-03T17:12:27.697Z" }, + { url = "https://files.pythonhosted.org/packages/88/50/a6af0ff9dc954b43a65ca9b5367334e45d99684c90a3d3413fc19a02d43c/sqlalchemy-2.0.49-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:22d8798819f86720bc646ab015baff5ea4c971d68121cb36e2ebc2ee43ead2b7", size = 3228832, upload-time = "2026-04-03T17:07:45.38Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d1/5f6bdad8de0bf546fc74370939621396515e0cdb9067402d6ba1b8afbe9a/sqlalchemy-2.0.49-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9b1c058c171b739e7c330760044803099c7fff11511e3ab3573e5327116a9c33", size = 3267000, upload-time = "2026-04-03T17:12:29.657Z" }, + { url = "https://files.pythonhosted.org/packages/f7/30/ad62227b4a9819a5e1c6abff77c0f614fa7c9326e5a3bdbee90f7139382b/sqlalchemy-2.0.49-cp313-cp313-win32.whl", hash = "sha256:a143af2ea6672f2af3f44ed8f9cd020e9cc34c56f0e8db12019d5d9ecf41cb3b", size = 2115641, upload-time = "2026-04-03T17:05:43.989Z" }, + { url = "https://files.pythonhosted.org/packages/17/3a/7215b1b7d6d49dc9a87211be44562077f5f04f9bb5a59552c1c8e2d98173/sqlalchemy-2.0.49-cp313-cp313-win_amd64.whl", hash = "sha256:12b04d1db2663b421fe072d638a138460a51d5a862403295671c4f3987fb9148", size = 2141498, upload-time = "2026-04-03T17:05:45.7Z" }, + { url = "https://files.pythonhosted.org/packages/28/4b/52a0cb2687a9cd1648252bb257be5a1ba2c2ded20ba695c65756a55a15a4/sqlalchemy-2.0.49-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24bd94bb301ec672d8f0623eba9226cc90d775d25a0c92b5f8e4965d7f3a1518", size = 3560807, upload-time = "2026-04-03T16:58:31.666Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d8/fda95459204877eed0458550d6c7c64c98cc50c2d8d618026737de9ed41a/sqlalchemy-2.0.49-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a51d3db74ba489266ef55c7a4534eb0b8db9a326553df481c11e5d7660c8364d", size = 3527481, upload-time = "2026-04-03T17:06:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0a/2aac8b78ac6487240cf7afef8f203ca783e8796002dc0cf65c4ee99ff8bb/sqlalchemy-2.0.49-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:55250fe61d6ebfd6934a272ee16ef1244e0f16b7af6cd18ab5b1fc9f08631db0", size = 3468565, upload-time = "2026-04-03T16:58:33.414Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3d/ce71cfa82c50a373fd2148b3c870be05027155ce791dc9a5dcf439790b8b/sqlalchemy-2.0.49-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:46796877b47034b559a593d7e4b549aba151dae73f9e78212a3478161c12ab08", size = 3477769, upload-time = "2026-04-03T17:06:02.787Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e8/0a9f5c1f7c6f9ca480319bf57c2d7423f08d31445974167a27d14483c948/sqlalchemy-2.0.49-cp313-cp313t-win32.whl", hash = "sha256:9c4969a86e41454f2858256c39bdfb966a20961e9b58bf8749b65abf447e9a8d", size = 2143319, upload-time = "2026-04-03T17:02:04.328Z" }, + { url = "https://files.pythonhosted.org/packages/0e/51/fb5240729fbec73006e137c4f7a7918ffd583ab08921e6ff81a999d6517a/sqlalchemy-2.0.49-cp313-cp313t-win_amd64.whl", hash = "sha256:b9870d15ef00e4d0559ae10ee5bc71b654d1f20076dbe8bc7ed19b4c0625ceba", size = 2175104, upload-time = "2026-04-03T17:02:05.989Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/bf28f618c0a9597d14e0b9ee7d1e0622faff738d44fe986ee287cdf1b8d0/sqlalchemy-2.0.49-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:233088b4b99ebcbc5258c755a097aa52fbf90727a03a5a80781c4b9c54347a2e", size = 2156356, upload-time = "2026-04-03T16:53:09.914Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a7/5f476227576cb8644650eff68cc35fa837d3802b997465c96b8340ced1e2/sqlalchemy-2.0.49-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57ca426a48eb2c682dae8204cd89ea8ab7031e2675120a47924fabc7caacbc2a", size = 3276486, upload-time = "2026-04-03T17:07:46.9Z" }, + { url = "https://files.pythonhosted.org/packages/2e/84/efc7c0bf3a1c5eef81d397f6fddac855becdbb11cb38ff957888603014a7/sqlalchemy-2.0.49-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:685e93e9c8f399b0c96a624799820176312f5ceef958c0f88215af4013d29066", size = 3281479, upload-time = "2026-04-03T17:12:32.226Z" }, + { url = "https://files.pythonhosted.org/packages/91/68/bb406fa4257099c67bd75f3f2261b129c63204b9155de0d450b37f004698/sqlalchemy-2.0.49-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9e0400fa22f79acc334d9a6b185dc00a44a8e6578aa7e12d0ddcd8434152b187", size = 3226269, upload-time = "2026-04-03T17:07:48.678Z" }, + { url = "https://files.pythonhosted.org/packages/67/84/acb56c00cca9f251f437cb49e718e14f7687505749ea9255d7bd8158a6df/sqlalchemy-2.0.49-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a05977bffe9bffd2229f477fa75eabe3192b1b05f408961d1bebff8d1cd4d401", size = 3248260, upload-time = "2026-04-03T17:12:34.381Z" }, + { url = "https://files.pythonhosted.org/packages/56/19/6a20ea25606d1efd7bd1862149bb2a22d1451c3f851d23d887969201633f/sqlalchemy-2.0.49-cp314-cp314-win32.whl", hash = "sha256:0f2fa354ba106eafff2c14b0cc51f22801d1e8b2e4149342023bd6f0955de5f5", size = 2118463, upload-time = "2026-04-03T17:05:47.093Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4f/8297e4ed88e80baa1f5aa3c484a0ee29ef3c69c7582f206c916973b75057/sqlalchemy-2.0.49-cp314-cp314-win_amd64.whl", hash = "sha256:77641d299179c37b89cf2343ca9972c88bb6eef0d5fc504a2f86afd15cd5adf5", size = 2144204, upload-time = "2026-04-03T17:05:48.694Z" }, + { url = "https://files.pythonhosted.org/packages/1f/33/95e7216df810c706e0cd3655a778604bbd319ed4f43333127d465a46862d/sqlalchemy-2.0.49-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c1dc3368794d522f43914e03312202523cc89692f5389c32bea0233924f8d977", size = 3565474, upload-time = "2026-04-03T16:58:35.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/a4/ed7b18d8ccf7f954a83af6bb73866f5bc6f5636f44c7731fbb741f72cc4f/sqlalchemy-2.0.49-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c821c47ecfe05cc32140dcf8dc6fd5d21971c86dbd56eabfe5ba07a64910c01", size = 3530567, upload-time = "2026-04-03T17:06:04.587Z" }, + { url = "https://files.pythonhosted.org/packages/73/a3/20faa869c7e21a827c4a2a42b41353a54b0f9f5e96df5087629c306df71e/sqlalchemy-2.0.49-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9c04bff9a5335eb95c6ecf1c117576a0aa560def274876fd156cfe5510fccc61", size = 3474282, upload-time = "2026-04-03T16:58:37.131Z" }, + { url = "https://files.pythonhosted.org/packages/b7/50/276b9a007aa0764304ad467eceb70b04822dc32092492ee5f322d559a4dc/sqlalchemy-2.0.49-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7f605a456948c35260e7b2a39f8952a26f077fd25653c37740ed186b90aaa68a", size = 3480406, upload-time = "2026-04-03T17:06:07.176Z" }, + { url = "https://files.pythonhosted.org/packages/e5/c3/c80fcdb41905a2df650c2a3e0337198b6848876e63d66fe9188ef9003d24/sqlalchemy-2.0.49-cp314-cp314t-win32.whl", hash = "sha256:6270d717b11c5476b0cbb21eedc8d4dbb7d1a956fd6c15a23e96f197a6193158", size = 2149151, upload-time = "2026-04-03T17:02:07.281Z" }, + { url = "https://files.pythonhosted.org/packages/05/52/9f1a62feab6ed368aff068524ff414f26a6daebc7361861035ae00b05530/sqlalchemy-2.0.49-cp314-cp314t-win_amd64.whl", hash = "sha256:275424295f4256fd301744b8f335cff367825d270f155d522b30c7bf49903ee7", size = 2184178, upload-time = "2026-04-03T17:02:08.623Z" }, + { url = "https://files.pythonhosted.org/packages/e5/30/8519fdde58a7bdf155b714359791ad1dc018b47d60269d5d160d311fdc36/sqlalchemy-2.0.49-py3-none-any.whl", hash = "sha256:ec44cfa7ef1a728e88ad41674de50f6db8cfdb3e2af84af86e0041aaf02d43d0", size = 1942158, upload-time = "2026-04-03T16:53:44.135Z" }, +] + +[package.optional-dependencies] +asyncio = [ + { name = "greenlet" }, +] + +[[package]] +name = "starlette" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/69/17425771797c36cded50b7fe44e850315d039f28b15901ab44839e70b593/starlette-1.0.0.tar.gz", hash = "sha256:6a4beaf1f81bb472fd19ea9b918b50dc3a77a6f2e190a12954b25e6ed5eea149", size = 2655289, upload-time = "2026-03-22T18:29:46.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/c9/584bc9651441b4ba60cc4d557d8a547b5aff901af35bda3a4ee30c819b82/starlette-1.0.0-py3-none-any.whl", hash = "sha256:d3ec55e0bb321692d275455ddfd3df75fff145d009685eb40dc91fc66b03d38b", size = 72651, upload-time = "2026-03-22T18:29:45.111Z" }, +] + +[[package]] +name = "tiemeasureflow" +version = "2.0.0" +source = { virtual = "." } +dependencies = [ + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-dotenv" }, +] + +[package.optional-dependencies] +client = [ + { name = "flask" }, + { name = "flask-babel" }, + { name = "flask-wtf" }, + { name = "gunicorn" }, + { name = "requests" }, + { name = "urllib3" }, +] +dev = [ + { name = "aiosqlite" }, + { name = "coverage" }, + { name = "httpx" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, +] +server = [ + { name = "alembic" }, + { name = "asyncmy" }, + { name = "bcrypt" }, + { name = "fastapi" }, + { name = "jinja2" }, + { name = "kaleido" }, + { name = "pillow" }, + { name = "plotly" }, + { name = "python-multipart" }, + { name = "sqlalchemy", extra = ["asyncio"] }, + { name = "uvicorn", extra = ["standard"] }, + { name = "weasyprint" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiosqlite", marker = "extra == 'dev'", specifier = ">=0.20.0" }, + { name = "alembic", marker = "extra == 'server'", specifier = ">=1.13.0" }, + { name = "asyncmy", marker = "extra == 'server'", specifier = ">=0.2.0" }, + { name = "bcrypt", marker = "extra == 'server'", specifier = ">=4.0.0" }, + { name = "coverage", marker = "extra == 'dev'", specifier = ">=7.0.0" }, + { name = "fastapi", marker = "extra == 'server'", specifier = ">=0.110.0" }, + { name = "flask", marker = "extra == 'client'", specifier = ">=3.0.0" }, + { name = "flask-babel", marker = "extra == 'client'", specifier = ">=4.0.0" }, + { name = "flask-wtf", marker = "extra == 'client'", specifier = ">=1.2.0" }, + { name = "gunicorn", marker = "extra == 'client'", specifier = ">=21.0.0" }, + { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.27.0" }, + { name = "jinja2", marker = "extra == 'server'", specifier = ">=3.1.0" }, + { name = "kaleido", marker = "extra == 'server'", specifier = ">=0.2.0" }, + { name = "pillow", marker = "extra == 'server'", specifier = ">=10.0.0" }, + { name = "plotly", marker = "extra == 'server'", specifier = ">=5.0.0" }, + { name = "pydantic", specifier = ">=2.0.0" }, + { name = "pydantic-settings", specifier = ">=2.0.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" }, + { name = "python-dotenv", specifier = ">=1.0.0" }, + { name = "python-multipart", marker = "extra == 'server'", specifier = ">=0.0.6" }, + { name = "requests", marker = "extra == 'client'", specifier = ">=2.31.0" }, + { name = "sqlalchemy", extras = ["asyncio"], marker = "extra == 'server'", specifier = ">=2.0.0" }, + { name = "urllib3", marker = "extra == 'client'", specifier = ">=2.0.0" }, + { name = "uvicorn", extras = ["standard"], marker = "extra == 'server'", specifier = ">=0.30.0" }, + { name = "weasyprint", marker = "extra == 'server'", specifier = ">=62.0" }, +] +provides-extras = ["server", "client", "dev"] + +[[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 = "tinyhtml5" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/1f/cfe2f6b30557c92b3f31d41707e09cef5c1efbd87392bc6c0430c46b0e4d/tinyhtml5-2.1.0.tar.gz", hash = "sha256:60a50ec3d938a37e491efa01af895853060943dcebb5627de5b10d188b338a67", size = 179242, upload-time = "2026-03-05T17:06:30.704Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/48/01695a036b695f83fea7aef6955d735db0f517b1c8e25ddb399ac0bdbcbf/tinyhtml5-2.1.0-py3-none-any.whl", hash = "sha256:6e11cfff38515834268daf89d5f85bbde0b6dd02e8d9e212d1385c2289b89f0a", size = 39686, upload-time = "2026-03-05T17:06:28.498Z" }, +] + +[[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 = "uvicorn" +version = "0.46.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/93/041fca8274050e40e6791f267d82e0e2e27dd165627bd640d3e0e378d877/uvicorn-0.46.0.tar.gz", hash = "sha256:fb9da0926999cc6cb22dc7cd71a94a632f078e6ae47ff683c5c420750fb7413d", size = 88758, upload-time = "2026-04-23T07:16:00.151Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/a3/5b1562db76a5a488274b2332a97199b32d0442aca0ed193697fd47786316/uvicorn-0.46.0-py3-none-any.whl", hash = "sha256:bbebbcbed972d162afca128605223022bedd345b7bc7855ce66deb31487a9048", size = 70926, upload-time = "2026-04-23T07:15:58.355Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, + { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, + { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, + { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, + { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, +] + +[[package]] +name = "weasyprint" +version = "68.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, + { name = "cssselect2" }, + { name = "fonttools", extra = ["woff"] }, + { name = "pillow" }, + { name = "pydyf" }, + { name = "pyphen" }, + { name = "tinycss2" }, + { name = "tinyhtml5" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/3e/65c0f176e6fb5c2b0a1ac13185b366f727d9723541babfa7fa4309998169/weasyprint-68.1.tar.gz", hash = "sha256:d3b752049b453a5c95edb27ce78d69e9319af5a34f257fa0f4c738c701b4184e", size = 1542379, upload-time = "2026-02-06T15:04:11.203Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/dd/14eb73cea481ad8162d3b18a4850d4a84d6e804a22840cca207648532265/weasyprint-68.1-py3-none-any.whl", hash = "sha256:4dc3ba63c68bbbce3e9617cb2226251c372f5ee90a8a484503b1c099da9cf5be", size = 319789, upload-time = "2026-02-06T15:04:09.189Z" }, +] + +[[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 = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, + { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, +] + +[[package]] +name = "wtforms" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/e4/633d080897e769ed5712dcfad626e55dbd6cf45db0ff4d9884315c6a82da/wtforms-3.2.1.tar.gz", hash = "sha256:df3e6b70f3192e92623128123ec8dca3067df9cfadd43d59681e210cfb8d4682", size = 137801, upload-time = "2024-10-21T11:34:00.108Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/c9/2088fb5645cd289c99ebe0d4cdcc723922a1d8e1beaefb0f6f76dff9b21c/wtforms-3.2.1-py3-none-any.whl", hash = "sha256:583bad77ba1dd7286463f21e11aa3043ca4869d03575921d1a1698d0715e0fd4", size = 152454, upload-time = "2024-10-21T11:33:58.44Z" }, +] + +[[package]] +name = "zopfli" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/4d/a8cc1768b2eda3c0c7470bf8059dcb94ef96d45dd91fc6edd29430d44072/zopfli-0.4.1.tar.gz", hash = "sha256:07a5cdc5d1aaa6c288c5d9f5a5383042ba743641abf8e2fd898dcad622d8a38e", size = 179001, upload-time = "2026-02-13T14:17:27.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/2f/1a7082e9163ae3703b27d571720bf3c954a02a9cf1fdce47c51e70639256/zopfli-0.4.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:4238d4d746d1095e29c9125490985e0c12ffd3654f54a24af551e2391e936d54", size = 291570, upload-time = "2026-02-13T14:17:12.556Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/4a1a88edf9fa0ce102703f38ab4dfb285b7cd2dde5389184264ec759e06e/zopfli-0.4.1-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fdfb7ce9f5de37a5b2f75dd2642fd7717956ef2a72e0387302a36d382440db07", size = 829437, upload-time = "2026-02-13T14:17:14.431Z" }, + { url = "https://files.pythonhosted.org/packages/e3/77/d231012ddcaac9d2e184bd7808e106a8a0048855912e2e1c902b3f383413/zopfli-0.4.1-cp310-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7bcee1b189d64ec33d1e05cfa1b6a1268c29329c382f6ca1bd6245b04925c57", size = 818542, upload-time = "2026-02-13T14:17:16.353Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4e/9b23690c4ca14fbeae2a8f7f6b2006611bf4cd7d5bcb2d9e6c718bd4b0e9/zopfli-0.4.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:27823dc1161a4031d1c25925fd45d9868ec0cbc7692341830a7dcfa25063662c", size = 1778034, upload-time = "2026-02-13T14:17:17.509Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1b/51f7c28d4cde639cac4f5d47ff615548c1d9809f43cbacdd66eba5cd679d/zopfli-0.4.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5a4c22b6161f47f5bd34637dbaee6735abd287cd64e0d1ce28ef1871bf625f4b", size = 1863957, upload-time = "2026-02-13T14:17:19.259Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4d/1ef17017d38eabe7ae28f18ef0f16d48966cc23a5657e4555fff61704539/zopfli-0.4.1-cp310-abi3-win32.whl", hash = "sha256:a899eca405662a23ae75054affa3517a060362eae1185d3d791c86a50153c4dd", size = 82314, upload-time = "2026-02-13T14:17:20.795Z" }, + { url = "https://files.pythonhosted.org/packages/0f/94/806bc84b389c7d70051d7c9a0179cff52de8b9f8dc2fc25bcf0bca302986/zopfli-0.4.1-cp310-abi3-win_amd64.whl", hash = "sha256:84a31ba9edc921b1d3a4449929394a993888f32d70de3a3617800c428a947b9b", size = 102186, upload-time = "2026-02-13T14:17:21.622Z" }, + { url = "https://files.pythonhosted.org/packages/15/53/0afc94574553bad50d7add81f54eed1a864e13f91c3a342c99775a947ff9/zopfli-0.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:02086247dd12fda929f9bfe8b3962b6bcdbfc8c82e99255aebcf367867cf0760", size = 147127, upload-time = "2026-02-13T14:17:22.995Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/0d9e4bdfd3d646a36b8516a01dec4ccd2967554603801e7c2d6c72fede3d/zopfli-0.4.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a93c2ecafff372de6c0aa2212eff18a75f6c71a100372fee7b4b129cc0b6f9a7", size = 127349, upload-time = "2026-02-13T14:17:24.107Z" }, + { url = "https://files.pythonhosted.org/packages/23/f0/ad6e26aa06943ce9f1be4ae6738513a7b69d8ea1f3b13e46009a249a3f73/zopfli-0.4.1-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb136a74d14a4ecfae29cb0fdecece58a6c115abc9a74c12bc6ac62e80f229d7", size = 124371, upload-time = "2026-02-13T14:17:24.976Z" }, + { url = "https://files.pythonhosted.org/packages/7b/36/3c15d564db6dfdd740919b205bdb69be75113e9919c422cde658e6d013c0/zopfli-0.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2f992ac7d83cbddd889e1813ace576cbc91a05d5d7a0a21b366e2e5f492e7707", size = 102199, upload-time = "2026-02-13T14:17:26.246Z" }, +]