From d5ce027d443a1f52d7515349c37d4c6b4392624d Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 11 Jul 2026 16:58:27 +0200 Subject: [PATCH 01/31] =?UTF-8?q?adr:=200003-0007=20=E2=80=94=20sch=C3=A9m?= =?UTF-8?q?a=20canonique=20(lakehouse=20Iceberg,=20vocabulaire,=20identit?= =?UTF-8?q?=C3=A9=20stations,=20gateway=20legacy,=20serving=20chaud)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Décisions issues de l'étude R&D du 2026-07-11 et validées sur POC (année 2025 complète, 2,44 Md mesures, benchs gateway et tail) : - 0003 : Apache Iceberg v3 comme format de table du lakehouse (acceptée) - 0004 : vocabulaire contrôlé des paramètres, unités SI, (parametre, duree_s) ; amendée le 11/07 (clés profondeur/couche bornées, porte_occurrence, mesures techniques) après audit de traduisibilité du legacy - 0005 : identité stations unifiée, crosswalk SCD2, station_uid pivot - 0006 : Postgres comme gateway unique legacy→lakehouse (benchs PHP 7.4 : 109-273 ms sur table triée/partitionnée ; spike métadonnées documenté) - 0007 : serving chaud = modèle canonique long sur Timescale, obs_last + caggs ; trajectoire CA du doublage progressif (tail incrémental) intégrée ; amendée le 11/07 (dh_occurrence, position par observation) --- adr/0003-format-table-iceberg-lakehouse.md | 112 ++++++++++++ ...0004-vocabulaire-parametres-observation.md | 155 +++++++++++++++++ adr/0005-identite-stations-unifiee.md | 131 ++++++++++++++ adr/0006-postgres-gateway-legacy-lakehouse.md | 160 +++++++++++++++++ adr/0007-serving-chaud-modele-canonique.md | 164 ++++++++++++++++++ 5 files changed, 722 insertions(+) create mode 100644 adr/0003-format-table-iceberg-lakehouse.md create mode 100644 adr/0004-vocabulaire-parametres-observation.md create mode 100644 adr/0005-identite-stations-unifiee.md create mode 100644 adr/0006-postgres-gateway-legacy-lakehouse.md create mode 100644 adr/0007-serving-chaud-modele-canonique.md diff --git a/adr/0003-format-table-iceberg-lakehouse.md b/adr/0003-format-table-iceberg-lakehouse.md new file mode 100644 index 0000000..1541c3a --- /dev/null +++ b/adr/0003-format-table-iceberg-lakehouse.md @@ -0,0 +1,112 @@ +# ADR-0003 — Apache Iceberg comme format de table du lakehouse d'observations + +- Statut : acceptée (cadre R&D) +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Issue de l'étude R&D « évolution de schéma » du 2026-07-11 (hub sémantique en lakehouse, +> couches Bronze/Silver/Gold, table canonique `observation`). Cette ADR fixe le format de +> table ; le vocabulaire des paramètres et l'identité des stations sont traités par +> ADR-0004 et ADR-0005. Cadre : R&D open-source, sans contrainte d'infra ni de budget. + +## Contexte + +Le patrimoine d'observations vit dans deux systèmes aux modèles divergents : MariaDB +`V5_data_*` (~794 GiB, 4,4 Md lignes, sharding par nommage — 20 292 tables) et +TimescaleDB (~780 GiB, wide Météo-France). L'étude R&D conclut à un lakehouse ouvert : +Parquet sur stockage objet + format de table transactionnel + catalogue, moteurs de +requête interchangeables. + +Un pilote existe déjà : `climato-froid` a migré le synop pré-2000 (392,7 M lignes) en +**Delta Lake** sur R2 — compression 6× index compris, requêtes sub-secondes en DuckDB, +principes acquis (tri `(station, date)` + zstd + partition pruning, fidélité d'archive, +overwrite prédiqué par partition, réconciliation d'historiques divergents). + +Trois candidats pour généraliser : + +- **Delta Lake** (continuité du pilote) : delta-rs mûr en Python/Rust, mais catalogue + ouvert moins standardisé hors écosystème Databricks, et features récentes (variant, + row lineage) tirées par un seul éditeur. +- **Apache Iceberg** : le format le plus neutre — spec v3 (type `variant` pour le + semi-structuré, deletion vectors, row lineage), catalogues REST open-source + interchangeables (Lakekeeper, Apache Polaris, Nessie), lu/écrit par DuckDB, Trino, + Spark, ClickHouse, pyiceberg/iceberg-rust. +- **DuckLake** : catalogue = un simple Postgres, très peu de pièces mobiles — séduisant + pour une équipe mono-steward, mais jeune et couplé à l'écosystème DuckDB. + +## Décision + +**Apache Iceberg (spec v3) est le format de table des nouvelles tables du lakehouse** +(Bronze, Silver, Gold de l'étude). Modalités : + +1. **Catalogue REST léger.** Un catalogue Iceberg REST open-source auto-hébergé ; + le choix de l'implémentation (Lakekeeper vs Polaris) se fait par un **spike mesuré** + (critères : coût opérationnel mono-steward, auth simple, backup trivial) — c'est un + détail d'exécution, pas une décision d'architecture, il ne bloque rien : pyiceberg + sait démarrer sur un catalogue SQL minimal. + + *Précision du 2026-07-11 (décision d'hébergement full OVH, critère de + souveraineté européenne)* : les catalogues Iceberg **managés** hors UE + (ex. Cloudflare R2 Data Catalog, qui inclut aussi la compaction managée) + sont **exclus par principe**, bien qu'économiquement attractifs — + l'auto-hébergé est confirmé. Conséquence assumée : la **maintenance des + tables (expire_snapshots + compaction) reste à notre charge**, job + hebdomadaire non optionnel (leçon du POC : 1 227 snapshots = + +400 ms/requête en lecture par métadonnées). +2. **Conventions physiques héritées du pilote** : partition par `annee` (+ bucket sur + le paramètre pour la table canonique long, cf. étude), tri `(station_uid, dh_utc)`, + compression zstd, schémas Arrow explicites dérivés des contrats — famille sans + contrat = refus d'écrire. +3. **`variant` pour les payloads bruts.** `raw_msg` (synop, bouées), `donnees` + (ACARS, profils) vont en Bronze dans une colonne `variant` typée — fin du `text` + non requêtable, sans inventer un schéma pour du semi-structuré. +4. **Le pilote Delta reste tel quel.** `climatologie-cold` (R2) n'est pas re-commité : + DuckDB lit les deux formats, l'API climato-froid ne change pas. Migration éventuelle + vers Iceberg = décision d'exécution future, sur besoin réel (ex. unification du + catalogue), jamais par principe. +5. **Chaque table Iceberg = un contrat ODCS** (`physicalType: iceberg-table`), versionnée + selon ADR-0002 (bump semver + `changelog:` + RunEvent OpenLineage). Le namespace + lineage s'étend : `iceberg:///` à ajouter aux conventions + (`lineage/namespaces.md`). + +## Justification + +- **Neutralité moteur = la garantie R&D.** Le même jeu de tables doit être requêtable + par DuckDB (notebooks, API), Trino (SQL fédéré), Spark (ML distribué) et polars sans + copie. Iceberg est le seul des trois candidats dont le catalogue REST est un standard + multi-implémentations. +- **v3 couvre deux besoins précis du dossier** : `variant` (payloads bruts en Bronze) + et row lineage (traçabilité au grain ligne, complète OpenLineage au grain job). +- **L'expérience acquise transfère.** Les concepts delta-rs (log, snapshots, overwrite + prédiqué, vacuum) ont leurs équivalents directs Iceberg ; les pièges documentés du + pilote (historiques divergents, sync fichiers interdite) s'appliquent à l'identique. +- **DuckLake écarté comme choix par défaut, pas enterré** : la frugalité opérationnelle + est réelle, mais parier le schéma canonique sur un format jeune et mono-écosystème + contredit l'objectif d'interopérabilité. Voir critère de réouverture. + +## Conséquences + +- (+) Toute table du lakehouse est lisible par l'écosystème entier sans export ; les + datasets publics (phase 3 de l'étude) sont des tables Iceberg exposées telles quelles. +- (+) Schéma évolutif sans réécriture (add column, rename sûrs par ID de colonne) — + cohérent avec le versioning ODCS. +- (−) **Une pièce d'infra en plus** (le catalogue REST) à opérer, sauvegarder, + superviser — le point faible assumé face à DuckLake. Mitigation : spike de choix + orienté « coût mono-steward », et démarrage possible sur catalogue SQL pyiceberg. +- (−) Deux formats coexistent (Delta du pilote + Iceberg) tant que `climatologie-cold` + n'est pas migrée — acceptable car lecteurs communs, mais à documenter au catalogue. +- (−) L'écriture Python passe de delta-rs à pyiceberg : re-valider les débits + d'extraction du pilote (counts exacts, reprise idempotente) sur une année témoin. + +**Critère de réouverture** : si après 6 mois le catalogue REST s'avère être le poste +de coût opérationnel dominant du chantier (incidents, temps d'admin), ré-évaluer +DuckLake — la donnée reste en Parquet, le coût de conversion est un re-commit de +métadonnées, pas une réécriture. + +## Références + +- Étude R&D « évolution de schéma data » 2026-07-11 (workspace, hors repo — à ranger) +- Pilote : repo local `climato-froid/` (README — conventions physiques, pièges Delta/R2) +- ADR-0002 (versioning de schéma = fait de lineage — s'applique aux tables Iceberg) +- `lineage/namespaces.md` (namespace `iceberg://` à ajouter) +- Apache Iceberg spec v3 ; pyiceberg / iceberg-rust ; Lakekeeper, Apache Polaris (spike) diff --git a/adr/0004-vocabulaire-parametres-observation.md b/adr/0004-vocabulaire-parametres-observation.md new file mode 100644 index 0000000..a9b869b --- /dev/null +++ b/adr/0004-vocabulaire-parametres-observation.md @@ -0,0 +1,155 @@ +# ADR-0004 — Vocabulaire contrôlé des paramètres d'observation (`dim_parametre`) + +- Statut : proposée +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Phase 0 de l'étude R&D « évolution de schéma » du 2026-07-11, volet 1/2 (le volet +> identité des stations est ADR-0005). Principe directeur hérité d'ADR-0002 : +> **git fait foi, les tables et les tools sont des vues.** + +> **Amendée le 2026-07-11** (audit de traduisibilité legacy, +> `audit-traduisibilite-legacy-2026-07.md`) : ajout des conventions §7 +> (dimensions verticales/couches dans la clé, marqueur `porte_occurrence`, +> frontière profils verticaux) et recadrage du volume cible (~140 entrées — +> l'audit a inventorié les 94 colonnes wide MF réellement consommées, les 34 +> sous-champs packés de `static.complements` et les codes `_H` de `mf_data` +> lus par mobile-api). + +## Contexte + +Il n'existe aucune définition partagée de « ce qu'est un paramètre mesuré ». La même +grandeur physique vit sous des formes incompatibles selon le système : + +- **Noms** : `temperature` (familles IC), `T` (wide MF historique), `t` (temps réel MF, + en Kelvin dans l'API source), codes `_H` MF (`TSV_H`, `GLO2_H`…), éléments ECA&D + (`TX`, `TN`, `RR`), colonnes climato (`tn`, `tx`, `rr`, `ens`). +- **Types** : `temperature` en `float` (synop/static), `tinyint` (metar — troncature + au degré entier), `double` (bouées, mf_data) ; `nebulosite` en `enum('0'..'8')` ici, + `int(2)` ou `tinyint(4)` là. +- **Unités** : conventions MF au 1/10 (°C, mm) dans l'historique Timescale, unités + usuelles converties (°C, hPa, m/s) dans les tables temps réel, SI (K, Pa) dans l'API + brute — le piège K vs °C est déjà documenté comme incohérence entre contrats + (`climato-mf-timescale` vs `horaire-mf-timescale`). +- **Support temporel encodé dans les noms de colonnes** : `pluie_1h`/`pluie_3h`/ + `pluie_6h`/`pluie_12h`/`pluie_24h`/`pluie_cumul_0h`, `temperature_min`/`_max` sur des + fenêtres implicites, `vent_rafales` vs `vent_rafales_10min` — la durée est une + dimension, pas une grandeur, mais le schéma actuel les confond. +- **Dictionnaires hors modèle** : `static_qualite.id_parametre` et + `static_instruments.id_instrument` définis dans des `COMMENT` SQL (0=Température, + 1=Vent…), non requêtables, non versionnés. + +Toute fusion multi-source, tout export harmonisé, toute réponse LLM sur la donnée bute +sur cette absence de vocabulaire. Le repo a déjà l'embryon : `catalog/glossary.md` +(prose) et les contrats sources MF qui documentent champ par champ unités et types. + +## Décision + +Créer un **vocabulaire contrôlé des paramètres**, artefact versionné du repo, source +unique de vérité dont tables et outils dérivent. + +1. **Source de vérité : `catalog/parametres.yaml`.** Une entrée par grandeur, clés : + - `parametre` (clé stable snake_case, ex. `air_temperature`, `precipitation_amount`, + `wind_speed_of_gust`) ; + - `cf_standard_name` (conventions CF quand il existe, sinon `null` + justification) ; + - `unite_si` (unité de stockage canonique : K, Pa, m/s, kg m-2, %…) ; + - `domaine` (bornes physiques plausibles min/max — socle des contrôles qualité) ; + - `description_fr` ; + - `sources` : le **mapping par système** — colonne famille IC (`synop.temperature`), + code MF historique (`T`, facteur 1/10), colonne temps réel (`t`, K), code `_H`, + élément ECA&D, id du dictionnaire `static_qualite` — avec pour chacun le facteur + et l'offset de conversion vers l'unité SI. + Ordre de grandeur : ~150 entrées ; la matière existe déjà (contrats + `source-meteofrance-*`, DDL MariaDB, glossaire) — c'est une transcription outillée, + pas une découverte. +2. **Le support temporel est une dimension, pas un paramètre.** Le couple + `(parametre, duree_s)` remplace les familles de colonnes : `precipitation_amount` × + {3600, 10800, 21600, 43200, 86400} couvre `pluie_1h`…`pluie_24h` ; + `air_temperature_min` disparaît au profit de (`air_temperature`, agrégat min, + `duree_s`). Le vocabulaire liste pour chaque paramètre les supports **attendus** par + source (sert de test de complétude à l'ingestion). +3. **Convention de nommage : CF d'abord.** Quand CF définit un standard name, la clé le + suit ; les spécificités Infoclimat (ex. qualité déclarée StatIC) prennent un préfixe + `ic_`. Ni français ni codes MF dans les clés — le français vit dans `description_fr`, + les codes MF dans les mappings. +4. **Matérialisations dérivées** (jamais éditées à la main) : + - table Iceberg `dim_parametre` (ADR-0003) régénérée depuis le YAML ; + - blocs `schema.properties` des futurs contrats ODCS des tables canoniques, + **générés** depuis le vocabulaire (fin de la double saisie contrat/vocab) ; + - vue MCP/bot (précédent ADR-0001/0002 : le tool lit git) — le text-to-SQL et les + réponses du bot s'appuient sur le vocabulaire, pas sur une tradition orale. +5. **Évolution selon ADR-0002** : ajout de paramètre = MR + entrée changelog + (`non-breaking`) ; changement d'unité ou de sémantique d'une clé existante = + `breaking` (et donc, en pratique, création d'une nouvelle clé + dépréciation — + patron `replace` d'ADR-0002, qui s'applique tel quel). +6. **Validation en CI** : lint du YAML (unicité des clés, unités reconnues, bornes + cohérentes, mappings sans collision) + test croisé contre les contrats sources + (tout champ actif d'un contrat `source-meteofrance-*` doit être mappé ou + explicitement listé `non_retenu`). +7. **Conventions d'extension** (amendement 2026-07-11, issues de l'audit de + traduisibilité) : + - **Dimensions verticales et couches encodées dans la clé** quand la + cardinalité est **bornée et fixe** : `soil_temperature_10cm/_20cm/_50cm/ + _100cm`, `cloud_layer_1_area_fraction`…`cloud_layer_4_*` — précédent + GHCN-Daily (profondeur et couverture encodées dans le code élément). + **Frontière explicite** : cette convention ne s'étend PAS aux niveaux + nombreux ou variables — les profils verticaux (radiosondages, ACARS) + exigeront une vraie colonne de niveau ou une modélisation `profile` + dédiée (featureType CF), jamais une explosion de clés. + - **Marqueur `porte_occurrence: true`** sur les paramètres agrégés dont la + source fournit l'heure/date d'occurrence (TN/HTN, TX/HTX, rafales/HXY, + records de normales…) : déclare que la mesure alimente la colonne + `dh_occurrence` du modèle canonique (cf. ADR-0007 amendée). Le couple + (valeur, occurrence) reste atomique — c'est le motif retenu contre le + « paramètre apparié » (`time_of_maximum` séparé), qui expose des couples + orphelins au QC et au filtrage. + - **Mesures techniques** (tension batterie, facteur qualité SR50 — issues de + `static.complements`) : entrées de plein droit avec `domaine` technique, + taguées `technique: true` pour exclusion par défaut des produits météo. + +## Justification + +- **Les conversions d'unités deviennent structurellement uniques.** Un seul endroit + (le mapping) porte « MF historique = 1/10 °C » ; la conversion vers l'affichage vit + dans les vues Gold, une fois, testée. Le bug K vs °C cesse d'être possible par + construction. +- **Évolution additive sans ALTER.** Un nouveau capteur StatIC ou un nouveau champ MF + = une entrée YAML + une ligne de mapping — pas de migration sur des tables de + centaines de GiB, pas de bump majeur en cascade. +- **C'est le prérequis du format long.** La table canonique `observation` de l'étude + n'a de sens que si `parametre` référence un vocabulaire fermé et versionné. +- **Interopérabilité gratuite** : les clés CF alignent les exports sur ce que xarray, + MetPy, les catalogues climat et les équipes recherche attendent. + +## Conséquences + +- (+) Fin des dictionnaires en COMMENT SQL : `static_qualite`/`static_instruments` + se raccordent au vocabulaire par mapping explicite. +- (+) Les ~150 entrées documentent au passage les décisions d'harmonisation + (ex. metar tronqué au degré : mappé avec `qc_detail` de précision — la perte est + tracée, pas silencieuse). +- (+) Le MCP répond « quelles variables de vent existe-t-il et dans quelles sources ? » + depuis git, offline. +- (−) Coût initial de transcription et d'arbitrage (~150 entrées, quelques cas + ambigus : grandeurs MF sans équivalent CF, cumuls à heure d'occurrence en `char(5)`) ; + mitigé en démarrant par le noyau commun aux 3 modèles (~30 paramètres couvrent >95 % + des lignes). +- (−) Une dépendance de plus pour les pipelines (le vocabulaire devient bloquant à + l'ingestion canonique) — c'est voulu : paramètre inconnu = refus d'écrire en Silver, + la donnée reste en Bronze en attendant la MR de vocabulaire. + +**Critère de réouverture** : si le YAML unique devient ingérable (>500 entrées, +conflits de MR fréquents), éclater par domaine (`parametres/{thermo,vent,precip}.yaml`) +sans changer le contrat d'interface des vues. + +## Références + +- Étude R&D « évolution de schéma data » 2026-07-11 (§4.4, §8 mapping de convergence) +- `catalog/glossary.md` (embryon prose), `contracts/source-meteofrance-*.odcs.yaml` + (unités/champs bruts déjà transcrits) +- Dump `schemas/mariadb/schema.sql.gz` (dictionnaires en COMMENT, familles de colonnes) +- ADR-0002 (changelog, patron `replace`, sévérités) ; ADR-0003 (matérialisation Iceberg) +- Audit de traduisibilité legacy 2026-07-11 (`audit-traduisibilite-legacy-2026-07.md`, + workspace — inventaire des colonnes réellement consommées, source du §7) +- CF Standard Names (conventions Climate & Forecast) ; vocabulaire OMM/WIGOS ; + GHCN-Daily (précédent de l'encodage profondeur/couche dans le code élément) diff --git a/adr/0005-identite-stations-unifiee.md b/adr/0005-identite-stations-unifiee.md new file mode 100644 index 0000000..a626c88 --- /dev/null +++ b/adr/0005-identite-stations-unifiee.md @@ -0,0 +1,131 @@ +# ADR-0005 — Identité unifiée des stations (`dim_station`, crosswalk historisé) + +- Statut : proposée +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Phase 0 de l'étude R&D « évolution de schéma » du 2026-07-11, volet 2/2 (le volet +> vocabulaire des paramètres est ADR-0004). Cadre R&D open-source : le champ licence +> par station est **explicitement hors périmètre** de cette ADR. + +## Contexte + +Quatre systèmes d'identifiants de stations coexistent sans réconciliation d'ensemble : + +| Identifiant | Système | Format | +|---|---|---| +| `stations.id` | `V5_data_params.stations` (54 781 lignes, annuaire IC, genre enum) | char(15) | +| `NUM_POSTE` | TimescaleDB historique MF (Horaire, Quotidienne…) | char(8) | +| `geo_id_insee` | TimescaleDB temps réel MF | `ddnnnpp` | +| OACI / OMM / MFID | metar (`id_station` char(4)), `mf_stations`, normales (`ID_wmo`) | divers | + +Le crosswalk existe **en morceaux** : `ommid` (mapping mfid↔stid), `metsyn` +(id textuel↔numérique), `mf_stations.STID`, et la règle documentée au glossaire +« `NUM_POSTE` = `geo_id_insee` tronqué à 7 caractères, avec précision » — un +appariement non trivial appliqué au cas par cas dans le code. S'ajoutent : +`stations_europe` dupliquée dans 2 bases, `communes` en 3 exemplaires, aucune FK +nulle part (MyISAM), et des métadonnées riches mais orphelines — `static_qualite` +(qualité déclarée par paramètre), `static_instruments` (historique d'équipement, +hauteurs, emplacements), datées mais non reliées à une entité station stable. + +Conséquences : toute fusion multi-source (le cœur de la table canonique `observation` +de l'étude), tout dataset publiable, tout appariement obs↔grille repose sur des +jointures conventionnelles fragiles refaites à chaque usage. C'est le blocage n° 1 +identifié par l'étude. + +## Décision + +Créer une **entité station pivot, historisée, source de vérité du rattachement de +toute observation**. + +1. **`station_uid` : identifiant pivot interne, opaque et stable.** Jamais réutilisé, + jamais porteur de sémantique (pas de département encodé dedans — les identifiants + « intelligents » sont précisément ce qui a créé le problème `geo_id_insee`). + Toute table canonique référence `station_uid`, jamais un identifiant source. +2. **Crosswalk explicite** : `ids` = map `type → valeur` (`ic_id`, `num_poste`, + `geo_id_insee`, `oaci`, `omm`, `mfid`, `ecad`…), chaque appariement portant sa + **méthode** (`declared` — présent dans une table de mapping source ; `derived` — + règle documentée type troncature ; `manual` — arbitrage humain en MR) et sa + confiance. La règle de troncature `NUM_POSTE`↔`geo_id_insee` devient du code + versionné et testé, plus une tradition. +3. **Historisation SCD2** (`valid_from`/`valid_to`) : position, altitude, nom, réseau, + statut d'ouverture. Une station déplacée = deux versions, pas un UPDATE — les + études de séries longues (homogénéisation, cas d'usage IA de l'étude) exigent de + savoir *quand* une station a bougé. +4. **Les cas insolubles ont un statut, pas une résolution forcée.** `resolution: + resolved | ambiguous | conflicting`, avec les candidats conservés. Un appariement + douteux marqué `ambiguous` est une information ; un appariement faux silencieux est + une corruption. Jamais de fusion automatique de deux stations sur simple proximité + géo + nom. +5. **Rattachement des métadonnées orphelines** : `static_qualite` et + `static_instruments` (dictionnaires décodés via ADR-0004) deviennent des attributs + datés de l'entité — l'historique d'instrumentation est une métadonnée de rupture + de série de première classe. +6. **Alignement WIGOS en cible** : structure des identifiants compatible OMM + (`0-250-x-` pour un réseau tiers). La demande d'un bloc d'identifiants OMM + pour StatIC est une **piste ouverte** (visibilité WIS 2.0), pas un prérequis — la + colonne `wigos_id` existe, nullable. +7. **Matérialisation et gouvernance** : sources du crosswalk (règles + arbitrages + manuels) versionnées dans le repo ; pipeline de résolution **reproductible** qui + régénère la table `dim_station` (Iceberg + GeoParquet, ADR-0003) ; contrat ODCS + dédié ; évolutions selon ADR-0002 (un appariement corrigé = changelog + MR). + Sorties auditables : rapport de résolution chiffré (résolus/ambigus/conflits) à + chaque run, comparable dans le temps. +8. **Tranches** (chaque tranche autonome) : + 1. **Squelette + crosswalk déclaré** : entité pivot sur `stations` (IC) ⋈ `ommid` ⋈ + `metsyn` ⋈ `mf_stations` — les appariements déjà présents dans les données. + 2. **Appariements dérivés** : règle de troncature codée + testée, metar OACI, + ECA&D ; rapport d'ambiguïtés. + 3. **SCD2 + métadonnées datées** (positions historiques, instruments, qualité). + 4. **Dédoublonnage des référentiels annexes** (`stations_europe`, `communes`) + par rattachement au pivot. + +## Justification + +- **Prérequis de tout le reste.** La table canonique `observation` (étude §4.2), le + wide harmonisé, le benchmark nowcasting et les datasets publics référencent + `station_uid` : sans identité résolue, la fusion multi-source produit des doublons + ou des trous invisibles. +- **SCD2 plutôt qu'annuaire plat** : l'annuaire actuel (`stations`, une ligne par + station, `last_report` écrasé) perd l'histoire ; or les séries font un siècle, et + les déplacements/changements d'instruments sont la première cause de rupture. +- **La méthode d'appariement tracée** transforme le crosswalk en objet scientifique + auditable — condition pour que des tiers (recherche, DataForGood) fassent confiance + aux jointures. +- **Statut `ambiguous` assumé** : l'expérience des morceaux existants (troncature à + précision variable, ids réutilisés) garantit des cas limites ; les nier les ferait + ressortir en aval, en pire. + +## Conséquences + +- (+) Une seule réponse à « c'est quelle station ? » ; les jointures + historique↔temps réel↔IC deviennent mécaniques. +- (+) Les 970 M d'obs StatIC deviennent appariables aux réseaux officiels — condition + du QC par voisinage et des cas d'usage IA de l'étude. +- (+) `stations_europe`/`communes` dédupliquées par rattachement, au lieu de trois + vérités parallèles. +- (−) Chantier de résolution d'identité : des dizaines de cas manuels probables + (arbitrages en MR — c'est le coût de la traçabilité). Mitigé par les tranches : + la tranche 1 ne traite que le déclaré, valeur immédiate sans arbitrage. +- (−) `station_uid` introduit une indirection : les consommateurs habitués aux ids + source passent par le crosswalk (vue de traduction fournie — les ids source restent + des colonnes requêtables, ils cessent juste d'être des clés). +- (−) La qualité du résultat dépend de sources amont parfois fausses + (lat/lon `float` dans `mf_stations`, altitudes douteuses) : le rapport de résolution + doit chiffrer les incohérences géo détectées, pas les corriger silencieusement. + +**Critère de réouverture** : si la part d'`ambiguous` reste >10 % des stations actives +après la tranche 2, le modèle d'appariement (règles + manuel) est insuffisant — +ouvrir une ADR sur une résolution assistée (blocking géo + scoring), sans jamais +retirer la boucle humaine. + +## Références + +- Étude R&D « évolution de schéma data » 2026-07-11 (§2.2, §4.3, §7.3) +- `catalog/glossary.md` (identifiants NUM_POSTE/geo_id_insee/MFID, règle de troncature) +- Dump `schemas/mariadb/schema.sql.gz` : `V5_data_params.{stations,metsyn, + static_qualite,static_instruments}`, `V5_data_mf.mf_stations`, doublons + `stations_europe`/`communes` +- Timescale : `ommid`, `Station`/`StationTempsReel` (inventaire 2026-06-09) +- ADR-0003 (matérialisation Iceberg/GeoParquet) ; ADR-0004 (dictionnaires paramètres) +- WIGOS Station Identifiers (OMM) ; GeoParquet 1.1 diff --git a/adr/0006-postgres-gateway-legacy-lakehouse.md b/adr/0006-postgres-gateway-legacy-lakehouse.md new file mode 100644 index 0000000..e24f48f --- /dev/null +++ b/adr/0006-postgres-gateway-legacy-lakehouse.md @@ -0,0 +1,160 @@ +# ADR-0006 — Postgres comme gateway unique du legacy vers le lakehouse + +- Statut : proposée +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Découle du POC lakehouse 2025 (année complète d'observations en Iceberg/Parquet, +> 2,44 Md de mesures canoniques) et du spike gateway mesuré le 2026-07-11 : +> PHP 7.4 + PDO pgsql — le driver exact de `combined.php` — requêtant le lakehouse +> à travers une extension Postgres, sans changement de driver côté monolithe. +> S'appuie sur ADR-0003 (Iceberg), ADR-0004 (vocabulaire), ADR-0005 (identité). + +## Contexte + +Le monolithe PHP 7.4 (~2 200 fichiers) est couplé au stockage de deux façons : + +- **241 fichiers** référencent les bases shardées `V5_data_*` en MySQL, dont ~130 + interpolent l'année dans le nom de base (`V5_data_{$year}`) — une requête + pluriannuelle assemble à la main des dizaines de tables ; +- les lectures Météo-France passent déjà par **une couche unique**, + `include/MeteoFrance/combined.php` (~5 400 lignes), en **PDO `pgsql:`** vers + TimescaleDB — requêtes à FULL JOIN 4 sources + COALESCE en cascade. + +Si le lakehouse (ADR-0003) devient la source de vérité de l'historique, il faut +un chemin d'accès pour ce code. Trois options examinées : + +1. **API HTTP intermédiaire** (pattern climato-froid, prouvé en prod) : robuste, + mais chaque page legacy migrée exige de passer du SQL à des appels HTTP — + un changement de paradigme pour 241 fichiers. +2. **Réécriture directe** vers un client Iceberg : inexistant en PHP 7.4, exclu. +3. **Gateway protocole Postgres** : une extension Postgres embarquant DuckDB + (pg_duckdb, ou pg_lake) expose les tables Iceberg/Parquet comme des tables + SQL. Le legacy garde PDO `pgsql:`, seule la requête change — et elle se + simplifie (le FULL JOIN multi-sources devient un GROUP BY sur la table + canonique `observation`). + +Le spike (POC itération 3, conteneur `pgduckdb/pgduckdb:17-main`, vues générées +depuis les fichiers actifs Iceberg, bench PDO PHP 7.4.33 sur les 2,44 Md de +mesures 2025, table **non triée ni partitionnée** = borne haute) : + +| Pattern legacy rejoué | p50 mesuré | +|---|---| +| Page station, wide 8 jours (équiv. `get_combined_between`) | 473 ms | +| Série climato tn/tx sur l'année | 425 ms | +| Snapshot carte France à une heure | 183 ms | +| **Dernière observation d'une station (chemin chaud)** | **1 494 ms** | + +## Décision + +**Le protocole Postgres est l'interface unique du legacy vers la donnée : les +lectures chaudes restent sur les tables natives (TimescaleDB), les lectures +d'historique et d'analytique passent par des vues gateway sur les tables +Iceberg — dans la même connexion PDO `pgsql:`.** + +1. **Répartition chaud/froid par latence mesurée, pas par principe.** + - *Chaud* (dernière obs, live, upserts de modération, continuous aggregates) : + tables natives Postgres/Timescale. Le spike confirme que le point-lookup + n'est pas le métier du lakehouse (1,5 s). + - *Froid/analytique* (pages climato, séries longues, cartes historiques, + exports) : vues gateway sur Iceberg. **Confirmé par le spike + tri/partitionnement** (réécriture des 2,44 Md de mesures en partition + month(dh_utc) + tri (station_uid, dh_utc), même count exact, 62 min) — + p50 mesurés : page station 8 j **473 → 109 ms (4,3×)**, série année + **425 → 118 ms (3,6×)**, dernière obs **1 494 → 215 ms (7×)**, snapshot + carte 183 → 273 ms (le tri station-major dégrade légèrement la coupe + temporelle pure — arbitrage assumé, la partition mensuelle borne le coût). + Toutes les requêtes analytiques tiennent en 100-300 ms via PDO PHP 7.4. + Nota : la table triée pèse +13 % (l'entrelacement des paramètres par + station compresse moins bien que l'écriture par branches) — le tri + s'achète en octets, se paie en latence. +2. **TimescaleDB est repositionnée : serving chaud, plus jamais archive.** + Rétention glissante (~2 ans, à calibrer par l'usage réel des pages) + + compression ; le lakehouse est la seule source de vérité de l'historique. + Conséquence sur le plan BDD (`audits/bdd/`) : le P2 « migrer StatIC vers + TimescaleDB » (~1 Tio) est re-scopé en « StatIC live → serving chaud ; + historique StatIC → lakehouse » ; le P-parallèle « cold storage Parquet » + devient le chantier principal. +3. **Choix d'extension : pg_duckdb d'abord, pg_lake en challenger.** pg_duckdb a + fait le spike (fonctionnel, syntaxe `r['col']`, vues sur `read_parquet`) ; + pg_lake (ex-Crunchy, open-sourcé 2025) apporte l'intégration catalogue + Iceberg + écritures transactionnelles et sera évalué au même banc. Critère : + lecture du **catalogue** Iceberg (pas de listes de fichiers générées) et + cohabitation avec l'extension timescaledb sur la même instance — sinon, + instance gateway dédiée à côté du serving (deux Postgres, un seul protocole). + + *Spike métadonnées du 2026-07-11* : pg_lake n'a **pas d'images publiées** + (build depuis les sources — évaluation différée) ; testé à la place : + pg_duckdb + extension DuckDB `iceberg` (installable depuis le conteneur), + vue par `iceberg_scan(metadata.json)` — fonctionne (count exact, zéro liste + de fichiers) mais coûte **~+400 ms par requête** (498-1004 ms vs 109-215 ms + en liste statique) : les manifests sont relus à chaque requête, et la table + du POC traîne **1 227 snapshots** (un par append de 2 M de lignes). + Enseignements prod : (a) commits gros et rares à l'écriture, (b) maintenance + de table obligatoire (expire_snapshots/rewrite_manifests — absents de + pyiceberg 0.11, nécessitent un moteur ou une lib plus récente), (c) le + cache de métadonnées est LE critère d'évaluation de pg_lake. D'ici là, les + vues à liste statique restent le chemin rapide — régénérées à chaque commit, + acceptable pour des archives en lecture seule. +4. **Migration en strangler, par chemin de lecture.** `combined.php` est la + couture naturelle (les lectures MF y sont déjà centralisées) ; chaque page + migrée supprime sa gymnastique `V5_data_{$year}` multi-bases. Jamais de + bascule globale. Chaque vue gateway exposée = un contrat ODCS (les vues sont + des produits dérivés reconstructibles, ADR-0004 §4). +5. **L'API HTTP reste le canal externe** (opendata, MCP, tiers — pattern + climato-froid) ; la gateway est un canal **interne** pour le legacy. Les deux + lisent les mêmes tables Iceberg. + +## Justification + +- **Le spike l'a prouvé au lieu de le supposer** : PHP 7.4 inchangé (driver, + connexion, `fetchAll`) lit 2,44 Md de mesures en sub-seconde sur les patterns + analytiques — sur une table même pas optimisée. +- **Coût de migration minimal par page** : changer une requête SQL (en la + simplifiant), pas un paradigme. La couture `combined.php` existe déjà. +- **Un seul protocole à opérer et superviser** côté legacy ; l'alternative API + aurait ajouté un saut HTTP et un service à la disponibilité duquel chaque page + du site serait suspendue. +- **La répartition chaud/froid suit une mesure reproductible** (le bench est + versionné dans le POC) — la frontière pourra bouger quand le tri/partition + changera les chiffres, sans rouvrir l'architecture. + +## Conséquences + +- (+) Le décommissionnement du sharding `V5_data_*` a enfin un chemin incrémental + chiffrable (nombre de fichiers legacy encore couplés = métrique de progrès). +- (+) TimescaleDB passe de 780 GiB (et croissant) à un serving borné (~<100 GiB + compressé estimé) — la compression P0 reste utile, la crainte capacitaire + disparaît. +- (+) Les requêtes legacy migrées se simplifient (suppression des FULL JOIN + multi-sources : la fusion est faite une fois, en Silver). +- (−) Une extension non triviale (pg_duckdb/pg_lake) entre en prod dans le + chemin de lecture du site : à isoler (instance gateway dédiée si la + cohabitation timescaledb+pg_duckdb n'est pas sereine), à superviser (mémoire + DuckDB bornée — `duckdb.max_memory`). +- (−) Le chemin chaud et le chemin froid divergent dans le code le temps de la + migration : la couture `combined.php` doit router explicitement (fenêtre + temporelle demandée → chaud ou gateway), règle simple mais à tester. +- (−) Les vues gateway du spike reposent sur des listes de fichiers générées + (`gen_init.py`) : fragile face aux commits Iceberg. Levée par l'intégration + catalogue (critère du point 3) — c'est le principal écart spike → prod. + +**Critères de réouverture** : les requêtes mono-station plafonnent à ~105-120 ms +p50 (plancher protocole + vue à ~1 200 fichiers inclus) — acceptable pour des +pages archives ; si un usage exige mieux, la piste est l'intégration catalogue +(pruning de partitions au lieu d'une liste plate) avant de rouvrir la frontière +chaud/froid ; si ni pg_duckdb ni +pg_lake ne cohabitent proprement avec timescaledb ET que l'instance dédiée est +jugée trop lourde, revenir à l'option API interne (le pattern existe déjà). + +## Références + +- POC : `poc-lakehouse-2025/` (README §Itération 3, `deploy/pg-gateway/` — + compose, gen_init.py, bench.php avec les chiffres) +- Étude R&D « évolution de schéma data » 2026-07-11 (§5.4, question serving) +- `site-infoclimat/include/MeteoFrance/combined.php` (la couture) ; + `audits/bdd/reconciliation-proposition-migration.md` (P0-P3 à re-scoper) +- ADR-0003 (Iceberg), ADR-0004 (vocabulaire — vues = produits dérivés), + ADR-0005 (identité stations) +- pg_duckdb (MotherDuck/Hydra) ; pg_lake ; contrats `mf-data-fallback` / + `dual-source-targets.yaml` (le pattern de bascule mesurée à répliquer) diff --git a/adr/0007-serving-chaud-modele-canonique.md b/adr/0007-serving-chaud-modele-canonique.md new file mode 100644 index 0000000..bfcd07a --- /dev/null +++ b/adr/0007-serving-chaud-modele-canonique.md @@ -0,0 +1,164 @@ +# ADR-0007 — Serving chaud : le modèle canonique long sur Postgres/Timescale + +- Statut : proposée +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Referme la boucle ouverte par ADR-0006 (qui repositionne TimescaleDB en +> « serving chaud, plus jamais archive ») : à quoi ressemble ce serving chaud +> refait à l'état de l'art, sans contrainte legacy. Source : étude compagnon +> « serving chaud » du 2026-07-11. S'appuie sur ADR-0004 (vocabulaire) et +> ADR-0005 (identité stations). + +> **Amendée le 2026-07-11** (audit de traduisibilité legacy) : la table +> canonique `observation` — au chaud COMME au lakehouse (Silver) — gagne deux +> attributs optionnels issus des trous de modélisation identifiés : +> `dh_occurrence` et la position par observation (voir Décision §1bis). + +## Contexte + +Le TimescaleDB actuel (780 GiB) est un produit d'accrétion : 4 hypertables wide +Météo-France (~200 colonnes `PARAM`/`QPARAM`) aux identifiants et unités +divergents entre historique et temps réel, 12 matviews non versionnées +rafraîchies par Kestra, base en SQL_ASCII, compression jamais activée, et un +monolithe qui fusionne les 4 sources à chaque requête (FULL JOIN + COALESCE +dans `combined.php`). ADR-0006 lui retire le rôle d'archive ; reste à décider +le format du chaud (~2 ans glissants). + +Profil de charge du serving, mesuré ou connu : point-lookups à la milliseconde +(« dernière obs », des milliers/min sur les pages), petites fenêtres récentes +par station, snapshots carte, upserts continus (flux 6 min, corrections de +modération, réémissions MF), agrégats quotidiens/mensuels temps réel, records. + +## Décision + +**Le chaud adopte le modèle canonique du lakehouse — la table `observation` au +format long (ADR-0004/0005) — sur Postgres/TimescaleDB, avec deux mécanismes +dédiés aux lectures à la milliseconde. Chaud et froid deviennent deux fenêtres +temporelles du même modèle logique.** + +1. **Même modèle logique, deux moteurs.** Une hypertable `observation` + (station_id int, dh_utc timestamptz, parametre_id smallint, duree_s, valeur, + qc_flag smallint, version_obs, source_id), clés entières compactes issues + des référentiels répliqués depuis le lakehouse (jamais édités à chaud). + La fusion des sources est faite **une fois, à l'ingestion** — le FULL JOIN + 4 sources disparaît ; la frontière chaud/froid dans la couture `combined.php` + (ADR-0006 §4) devient un prédicat de temps sur le même SQL. +1bis. **Deux attributs optionnels sur `observation`** (amendement 2026-07-11, + valables au chaud ET en Silver — même modèle logique) : + - **`dh_occurrence timestamptz NULL`** : heure/date d'occurrence d'un + extrême ou d'un événement dans la période de la mesure (TN/HTN, TX/HTX, + rafale/HXY, record de normale). NULL pour les mesures instantanées. + Précédents : descripteurs associés BUFR/OMM, couples TN/HTN du wide MF, + MIDAS Met Office. Colonne d'attribut plutôt que paramètre apparié : le + couple (valeur, occurrence) reste insécable au QC et au filtrage. + - **`lat float8 NULL, lon float8 NULL`** : position PAR observation pour + les plateformes mobiles (bouées dérivantes, navires, demain AMDAR/ACARS). + NULL = la position est celle de `dim_station`. Précédents : ICOADS + (l'archive marine de référence stocke lat/lon par relevé), Argo, + featureType `trajectory` des conventions CF. Les vues Gold exposent la + **position effective** `COALESCE(obs.lat, station.lat)` pour des requêtes + spatiales uniformes. + Coût : colonnes creuses (NULL massivement dominant), négligeable en + columnar compressé des deux côtés. +2. **Postgres/Timescale est conservé, par convergence et non par legacy.** + Le profil (point-lookups, upserts, petites fenêtres) est le métier d'un + Postgres, et ADR-0006 en fait déjà le protocole unique vers le froid — un + seul dialecte, une opération mono-steward. ClickHouse est le challenger + documenté, avec critère de réouverture explicite (voir Conséquences). +3. **Physique de la table** : chunks 7 jours ; Hypercore + (`compress_segmentby = station_id, parametre_id`, `compress_orderby = + dh_utc`) au bout de 7 jours — le long segmenté est le cas d'école de la + compression Timescale (2-4 o/ligne attendus) ; **rétention 24 mois** + (à calibrer sur la distribution réelle des fenêtres demandées), le lakehouse + ayant l'intégralité. Cible : **20-40 GiB compressés** contre 780 GiB + aujourd'hui. +4. **Les lectures milliseconde ne touchent jamais le long** : + - `obs_last` (station × paramètre × durée → dernière valeur, ~1,6 M lignes, + UPSERT à l'ingestion) : « dernière obs » = index scan <1 ms — le chemin + que la gateway froide sert en 215 ms au mieux (bench ADR-0006) ; + - **continuous aggregates hiérarchiques temps réel** (`cagg_hourly_wide` — + le wide redevient un dérivé, ici aussi — → `cagg_daily` tn/tx/rr/raf → + `cagg_monthly`) : remplacent les 12 matviews + refresh Kestra — le P1 du + plan BDD (`audits/bdd/`) prend cette forme définitive. Les records battus + = `cagg_daily` × table des records synchronisée du lakehouse. +5. **Base neuve, pas de migration in place** : UTF-8 (l'actuelle est en + SQL_ASCII), `timestamptz` UTC. **Trajectoire choisie par le CA + (2026-07-11), pour minimiser la charge des développeurs** : le Timescale + legacy reste la cible de l'ingestion actuelle et n'est PAS modifié ; un + **pipeline de tail incrémental** micro-batch (~6 min) lit la fenêtre + récente des 4 tables wide legacy (avec chevauchement de quelques heures + pour les réémissions/corrections MF), convertit wide→long via le + vocabulaire (ADR-0004) et le crosswalk (ADR-0005), et **UPSERT idempotent** + dans le nouveau Timescale canonique. Pas de CDC Debezium/Kafka (déjà écarté + au recadrage prestataire ; réplication logique piégeuse sur hypertables) — + un watermark + fenêtre de relecture suffit sur des tables append-mostly à + clés temporelles. Les pages basculent une à une ; readiness mesurée au + pattern `check_dual_source` ; le jour où plus rien ne lit le wide, on coupe + le tail et on adapte enfin l'ingestion (pointage direct sur le canonique) — + c'est la DERNIÈRE étape, pas la première. +6. **Corrections = versions**, comme au lakehouse (`version_obs`, la vue de + serving prend la dernière) ; l'`UPDATE qc_flag` reste toléré à chaud + (pragmatisme modération) mais est répercaté au froid par le flux de + synchronisation — **jamais l'inverse**. +7. **Un seul flux chaud → froid** : export quotidien des jours clos (J-2) vers + Iceberg, idempotent (overwrite de partition), counts contrôlés. Le chaud + n'est jamais une archive, le froid n'est jamais écrit à la main. + +## Justification + +- **Un seul modèle à maintenir** : vocabulaire, identité, QC et sémantique des + durées sont définis une fois (ADR-0004/0005) et valent pour les deux moteurs ; + plus aucune réconciliation de schémas chaud/froid, plus de piège d'unités. +- **Le long à chaud est éprouvé** : c'est le modèle « narrow » recommandé pour + capteurs hétérogènes par Timescale même, et la sparsité des familles (2 à + ~90 paramètres selon la source) le rend inévitable — le wide MF actuel le + prouve par ses cimetières de NULL. +- **Les deux objections classiques au long à chaud tombent** avec les mécanismes + dédiés : le point-lookup par `obs_last` (O(1)), le wide de page par les caggs + (pré-pivotés, temps réel). Le long n'est le chemin de personne, il est la + vérité de tous. +- **La volumétrie cesse d'être un sujet** : 20-40 GiB compressés tiennent en + RAM d'un serveur modeste — les questions réplicas/capacité du dossier BDD + changent d'échelle. + +## Conséquences + +- (+) `combined.php` se réduit à un routage temporel + un GROUP BY ; les + contrats `horaire-mf-timescale`/`infrahoraire-mf`/`mf-data-fallback` + convergent vers un contrat unique `observation-chaud`. +- (+) Extinction programmée : 4 hypertables wide, 12 matviews, refresh Kestra, + fallback `mf_data` — chaque pièce a un remplaçant nommé dans cette ADR. +- (+) L'ingestion TS/Prisma existante se simplifie (une table cible au lieu de + 18 modèles wide), mais doit intégrer le mapping vocabulaire (ADR-0004) — + c'est le vrai chantier de code. +- (−) Réécriture des flux d'ingestion et double-alimentation transitoire : + coût réel, borné par le pattern de bascule mesurée déjà rodé (dual-source). +- (−) `obs_last` et les caggs sont des états supplémentaires à surveiller + (lag de matérialisation, dérive vs le long) — checks de cohérence à ajouter + aux contrôles CI/prod existants. +- (−) Questions ouvertes assumées : sentinelle `duree_s` (0 vs NULL vs -1), + `float4` vs `float8` pour `valeur`, PostGIS à chaud pour les cartes live, + et co-hébergement gateway pg_duckdb / serving sur la même instance (dépend + du spike de cohabitation ADR-0006 §3). + +**Critères de réouverture** : si un produit exige de l'analytique sub-seconde +sur l'intégralité du chaud (au-delà des caggs), ré-évaluer ClickHouse comme +moteur du chaud ; si la rétention nécessaire dépasse ~3-4 ans (usage réel des +pages), la frontière chaud/froid d'ADR-0006 est à recalibrer avant d'agrandir +le chaud. + +## Références + +- Étude compagnon « serving chaud » 2026-07-11 (workspace — DDL cible complet, + volumétries, trajectoire en Y) ; étude R&D « évolution de schéma » (§4, §5.4) +- Bench ADR-0006 (chemin chaud 215 ms au mieux via gateway → besoin d'obs_last) +- POC `poc-lakehouse-2025/` (vocabulaire et crosswalk réutilisables tels quels) +- `audits/bdd/reconciliation-proposition-migration.md` (P0 compression, P1 + continuous aggregates — absorbés par cette ADR), inventaire TimescaleDB + 2026-06-09 (SQL_ASCII, 0 policy, matviews non versionnées) +- Audit de traduisibilité legacy 2026-07-11 (`audit-traduisibilite-legacy-2026-07.md`, + workspace — source des amendements §1bis et de la table de préséance à venir) +- ADR-0004, ADR-0005, ADR-0006 ; Timescale Hypercore / continuous aggregates +- BUFR/OMM (heure d'occurrence associée) ; ICOADS, Argo, CF `trajectory` + (position par relevé) From f6d3e64d27a5d97d13024dcca5a96962025366e0 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Thu, 16 Jul 2026 18:52:17 +0200 Subject: [PATCH 02/31] contracts: gold-climato-legacy (mensuelle) --- contracts/gold-climato-legacy.odcs.yaml | 59 +++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 contracts/gold-climato-legacy.odcs.yaml diff --git a/contracts/gold-climato-legacy.odcs.yaml b/contracts/gold-climato-legacy.odcs.yaml new file mode 100644 index 0000000..37f9949 --- /dev/null +++ b/contracts/gold-climato-legacy.odcs.yaml @@ -0,0 +1,59 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-climato-legacy +name: Gold climato legacy (copie MF retro-compat) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-climato-legacy + +description: + purpose: >- + Produits Gold retro-compat : copie fidèle des tables climato Météo-France + (schéma complet, unités MF natives), publiée sur le bucket diffusion. + usage: Serving public via climato.chom.engineering /legacy/* + +tags: + - meteo + - climatologie + - meteofrance + - gold + - diffusion + +servers: + - server: diffusion-iceberg + type: iceberg + environment: production + location: s3://chom-ic-lake-diffusion/gold_legacy + +schema: + - name: mensuelle + physicalName: gold_legacy.mensuelle + physicalType: table + description: Climatologie mensuelle MF (schéma complet, unités natives) + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMM + physicalType: TIMESTAMPTZ + required: true + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: bronze.mf_mensuelle -> gold_legacy.mensuelle + - property: dataLicense + value: >- + Données source Météo-France, Licence Ouverte (Etalab) 2.0 + (meteo.data.gouv.fr) — attribution Météo-France requise. + - property: attribution + value: Météo-France / Infoclimat From 78409f935d5b7a6e09e1fc9a530899cb87f0a256 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Thu, 16 Jul 2026 19:51:09 +0200 Subject: [PATCH 03/31] contracts: gold-climato-legacy (+ decadaire, decadaire_agro) --- contracts/gold-climato-legacy.odcs.yaml | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/contracts/gold-climato-legacy.odcs.yaml b/contracts/gold-climato-legacy.odcs.yaml index 37f9949..31a263b 100644 --- a/contracts/gold-climato-legacy.odcs.yaml +++ b/contracts/gold-climato-legacy.odcs.yaml @@ -39,6 +39,38 @@ schema: physicalType: TIMESTAMPTZ required: true + - name: decadaire + physicalName: gold_legacy.decadaire + physicalType: table + description: Climatologie décadaire MF (schéma complet, unités natives) + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMM + physicalType: TIMESTAMPTZ + required: true + - name: NUM_DECADE + physicalType: INTEGER + required: true + description: 3e composante de la clé naturelle (1/2/3, 3 décades par mois) + + - name: decadaire_agro + physicalName: gold_legacy.decadaire_agro + physicalType: table + description: Climatologie décadaire agrométéo MF (schéma complet, unités natives) + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMM + physicalType: TIMESTAMPTZ + required: true + - name: NUM_DECADE + physicalType: INTEGER + required: true + description: 3e composante de la clé naturelle (1/2/3, 3 décades par mois) + team: - username: pam role: owner From c9fa5e70625d259b916dd67dc3e9d68cec5cf9a3 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Fri, 17 Jul 2026 01:01:57 +0200 Subject: [PATCH 04/31] contracts: gold-climato-v2 (4 datasets recalcul canonique) --- contracts/gold-climato-v2.odcs.yaml | 196 ++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 contracts/gold-climato-v2.odcs.yaml diff --git a/contracts/gold-climato-v2.odcs.yaml b/contracts/gold-climato-v2.odcs.yaml new file mode 100644 index 0000000..bed2f77 --- /dev/null +++ b/contracts/gold-climato-v2.odcs.yaml @@ -0,0 +1,196 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-climato-v2 +name: Gold climato v2 (recalcul canonique) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-climato-v2 + +description: + purpose: >- + Produits Gold recalculés depuis le schéma canonique (silver.observation_v2, + table longue). Unités conventionnelles (°C, mm), QC de plausibilité + physique appliqué en amont (air_temperature ∈ [-90, +60] °C, précipitation + horaire ∈ [0, 500] mm) — sans ce filtre tn/tx (donc records/itn) seraient + pollués par les aberrations du raw canonique. + usage: Serving public via climato.chom.engineering /v2/* + +tags: + - meteo + - climatologie + - meteofrance + - gold + - diffusion + - schema-canonique + +servers: + - server: diffusion-iceberg + type: iceberg + environment: production + location: s3://chom-ic-lake-diffusion/gold_v2 + +schema: + - name: journaliere + physicalName: gold_v2.journaliere + physicalType: table + description: >- + Climatologie journalière v2, recalculée depuis silver.observation_v2 + (fusionné). tn = min air_temperature du jour, tx = max, tm = tntxm = + (tn+tx)/2, rr = Σ précipitation. Unités conventionnelles (°C, mm). + properties: + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station Infoclimat (crosswalk dim_station) + - name: mfid + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France (crosswalk dim_station) + - name: date + physicalType: DATE + required: true + - name: tn + physicalType: DOUBLE + description: Température min du jour (°C) + - name: tx + physicalType: DOUBLE + description: Température max du jour (°C) + - name: tm + physicalType: DOUBLE + description: (tn+tx)/2 (°C) + - name: tntxm + physicalType: DOUBLE + description: alias de tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du jour (mm) + + - name: mensuelle + physicalName: gold_v2.mensuelle + physicalType: table + description: >- + Agrégats mensuels v2, dérivés de gold_v2.journaliere (extrêmes datés + via arg_min/arg_max, nb_jours_gel = jours avec tn < 0). + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mfid + physicalType: TEXT + required: true + - name: mois + physicalType: TIMESTAMP + required: true + description: Premier jour du mois (date_trunc('month', date)) + - name: tnm + physicalType: DOUBLE + description: Moyenne mensuelle des tn (°C) + - name: txm + physicalType: DOUBLE + description: Moyenne mensuelle des tx (°C) + - name: tmm + physicalType: DOUBLE + description: Moyenne mensuelle des tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du mois (mm) + - name: tnn + physicalType: DOUBLE + description: Température min du mois (°C) + - name: tnn_date + physicalType: DATE + - name: txx + physicalType: DOUBLE + description: Température max du mois (°C) + - name: txx_date + physicalType: DATE + - name: nb_jours_gel + physicalType: INTEGER + description: Nombre de jours du mois avec tn < 0 °C + + - name: records + physicalName: gold_v2.records + physicalType: table + description: >- + Records absolus par mois calendaire v2, dérivés de gold_v2.journaliere, + aligné D4G v_records_absolus_par_mois (extrême par station x mois + calendaire sur tout l'historique). + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mfid + physicalType: TEXT + required: true + - name: mois_calendaire + physicalType: INTEGER + required: true + description: Mois calendaire (1-12), 3e composante de la clé naturelle + - name: txx_max + physicalType: DOUBLE + description: Record absolu de température max sur le mois calendaire (°C) + - name: txx_max_date + physicalType: DATE + - name: tnn_min + physicalType: DOUBLE + description: Record absolu de température min sur le mois calendaire (°C) + - name: tnn_min_date + physicalType: DATE + + - name: itn + physicalName: gold_v2.itn + physicalType: table + description: >- + Indicateur Thermique National journalier, aligné D4G saison 14 + (v_itn_daily_all_years). NATIONAL — pas de station : moyenne de tntxm + sur les 30 stations de référence (HAVING >= 29/30 disponibles). Série + réelle (is_fictive=FALSE partout dans ce build). + properties: + - name: date + physicalType: DATE + required: true + - name: year + physicalType: INTEGER + required: true + - name: month + physicalType: INTEGER + required: true + - name: day_of_month + physicalType: INTEGER + required: true + - name: is_fictive + physicalType: BOOLEAN + description: 29/02 synthétique des années non-bissextiles (toujours FALSE dans ce build) + - name: itn + physicalType: DOUBLE + description: Indicateur Thermique National du jour (°C) + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: silver.observation_v2 -> gold_v2.journaliere -> {mensuelle, records, itn} + - property: dataLicense + value: >- + Agrégats dérivés de données Météo-France (Licence Ouverte Etalab 2.0) + + valeur ajoutée Infoclimat, politique opendata IC. + - property: attribution + value: Météo-France / Infoclimat + - property: methodologyRef + value: >- + github.com/dataforgoodfr/14_ValorisationDonneeMeteo (backend/sql) — + ITN 30 stations réf. ≥29/30, records absolus par mois. + - property: units + value: >- + Unités conventionnelles (°C, mm), pas les unités SI internes du + canonique. QC de plausibilité physique appliqué en amont de + gold_v2.journaliere (air_temperature ∈ [-90, +60] °C, précipitation + horaire ∈ [0, 500] mm) — hérité par mensuelle/records/itn. From fb920274936d65bb102e473ea95b2caec9ee8163 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Fri, 17 Jul 2026 01:19:20 +0200 Subject: [PATCH 05/31] contracts: gold-climato-legacy (+ quotidienne, quotidienne_autres) --- contracts/gold-climato-legacy.odcs.yaml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/contracts/gold-climato-legacy.odcs.yaml b/contracts/gold-climato-legacy.odcs.yaml index 31a263b..3e88c2f 100644 --- a/contracts/gold-climato-legacy.odcs.yaml +++ b/contracts/gold-climato-legacy.odcs.yaml @@ -71,6 +71,30 @@ schema: required: true description: 3e composante de la clé naturelle (1/2/3, 3 décades par mois) + - name: quotidienne + physicalName: gold_legacy.quotidienne + physicalType: table + description: Climatologie quotidienne MF (schéma complet, unités natives) + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMMJJ + physicalType: TIMESTAMPTZ + required: true + + - name: quotidienne_autres + physicalName: gold_legacy.quotidienne_autres + physicalType: table + description: Paramètres quotidiens complémentaires MF (schéma complet, unités natives) + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMMJJ + physicalType: TIMESTAMPTZ + required: true + team: - username: pam role: owner From fcb281abd5b862a842158f9ee87cb3346311fb47 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 18 Jul 2026 11:54:56 +0200 Subject: [PATCH 06/31] =?UTF-8?q?contracts:=20gold-dataclimat=20(cat=C3=A9?= =?UTF-8?q?gorie=20d=C3=A9di=C3=A9e=20dataclimat.fr/D4G=20=E2=80=94=207=20?= =?UTF-8?q?datasets=20drop-in=20MF-only,=20d=C3=A9viations=20classe=5Frece?= =?UTF-8?q?nte=20document=C3=A9es)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/gold-dataclimat.odcs.yaml | 236 ++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 contracts/gold-dataclimat.odcs.yaml diff --git a/contracts/gold-dataclimat.odcs.yaml b/contracts/gold-dataclimat.odcs.yaml new file mode 100644 index 0000000..7eacb90 --- /dev/null +++ b/contracts/gold-dataclimat.odcs.yaml @@ -0,0 +1,236 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-dataclimat +name: Gold dataclimat (drop-in dataclimat.fr / Data For Good) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-dataclimat + +description: + purpose: >- + Catégorie Gold dédiée à dataclimat.fr (projet Data For Good + `dataforgoodfr/14_ValorisationDonneeMeteo`) : réplique en « drop-in » les agrégats que + leur backend matérialise en SQL (materialized views), pour que le site les consomme via + l'API au lieu de les recalculer. Mono-source **Météo-France**, station identifiée par + `station_code` = NUM_POSTE. Colonnes et sémantique alignées sur leurs matviews. + usage: >- + Serving public via /dataclimat/*. Cible : backend dataclimat.fr (remplacement des + lectures `FROM mv_*` par des appels API). Relevé des règles métier le 2026-07-18 depuis + leur repo public + API prod (voir chom-poc-data/.superpowers/dataclimat-discovery.md). + +tags: [meteo, climatologie, meteofrance, gold, diffusion, dataclimat, dataforgood] + +servers: + - server: diffusion-iceberg + type: iceberg + environment: production + location: s3://chom-ic-lake-diffusion/gold_dataclimat + +schema: + - name: quotidienne + physicalName: gold_dataclimat.quotidienne + physicalType: table + description: >- + Climatologie journalière « jour climatologique » Météo-France, mono-source MF (archive + quotidienne officielle, source mf-q). tn/tx/tntxm = valeurs officielles MF. Historique + depuis 1816. Brique de base : mensuelle, records, itn en dérivent. + properties: + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: date + physicalType: DATE + required: true + - name: tntxm + physicalType: DOUBLE + description: Moyenne (tn+tx)/2 — midrange officiel MF (°C) + - name: tn + physicalType: DOUBLE + description: Température minimale du jour climatologique (°C) + - name: tx + physicalType: DOUBLE + description: Température maximale du jour climatologique (°C) + + - name: mensuelle + physicalName: gold_dataclimat.mensuelle + physicalType: table + description: Extrêmes mensuels + moyenne, dérivés de gold_dataclimat.quotidienne. + properties: + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: date + physicalType: DATE + required: true + description: Mois (premier jour du mois) + - name: tnn + physicalType: DOUBLE + description: Tn minimale du mois (°C) + - name: tnn_date + physicalType: DATE + description: Jour du Tn minimal (tie-break date la plus ancienne) + - name: txx + physicalType: DOUBLE + description: Tx maximale du mois (°C) + - name: txx_date + physicalType: DATE + description: Jour du Tx maximal + - name: tmm + physicalType: DOUBLE + description: Moyenne mensuelle de tntxm, arrondie à 0,1 °C + + - name: records_absolus + physicalName: gold_dataclimat.records_absolus + physicalType: table + description: >- + Records absolus figés (chaud/froid) par station × période (all_time / mois / saison). + DÉVIATION assumée vs D4G : filtre `classe_recente<=3` NON appliqué (classification + d'homogénéité MF absente du lac) ; colonnes `classe_recente`/`date_de_creation`/ + `date_de_fermeture` omises. À réintroduire au sourcing de la classification. + properties: + - name: period_type + physicalType: TEXT + required: true + description: all_time | month | season + - name: period_value + physicalType: TEXT + description: NULL (all_time) | '1'..'12' (mois) | spring|summer|autumn|winter + - name: record_type + physicalType: TEXT + required: true + description: TX (chaud) | TN (froid) + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: station_name + physicalType: TEXT + - name: department + physicalType: TEXT + - name: record_value + physicalType: DOUBLE + description: Valeur du record (°C) + - name: record_date + physicalType: DATE + description: Date du record (tie-break date la plus ancienne) + - name: lat + physicalType: DOUBLE + - name: lon + physicalType: DOUBLE + - name: alt + physicalType: DOUBLE + + - name: itn + physicalName: gold_dataclimat.itn + physicalType: table + description: >- + Indicateur Thermique National journalier = moyenne non pondérée de tntxm sur un panel + FIXE de 30 stations de référence Météo-France (règle Reims : bascule 51183001→51449002 + au 2012-05-08 ; 29 fév synthétique pour les années non bissextiles). + properties: + - name: date + physicalType: DATE + required: true + - name: year + physicalType: INTEGER + - name: month + physicalType: INTEGER + - name: day_of_month + physicalType: INTEGER + - name: is_fictive + physicalType: BOOLEAN + description: TRUE si 29 février synthétique (année non bissextile) + - name: itn + physicalType: DOUBLE + description: Indicateur Thermique National du jour (°C) + + - name: itn_baseline + physicalName: gold_dataclimat.itn_baseline + physicalType: table + description: >- + Normale 1991-2020 de l'ITN par jour calendaire (moyenne, écart-type, percentiles), + base des bandes baseline_mean ± stddev de l'endpoint national-indicator. + properties: + - name: month + physicalType: INTEGER + required: true + - name: day_of_month + physicalType: INTEGER + required: true + - name: sample_size + physicalType: INTEGER + - name: itn_mean + physicalType: DOUBLE + - name: itn_stddev + physicalType: DOUBLE + description: Écart-type de population (STDDEV_POP) + - name: itn_p20 + physicalType: DOUBLE + - name: itn_p80 + physicalType: DOUBLE + + - name: baseline_1991_2020 + physicalName: gold_dataclimat.baseline_1991_2020 + physicalType: table + description: >- + Normale 1991-2020 de tntxm par station × jour calendaire (base de l'endpoint deviation). + 29 fév réel (bissextiles) ou synthétique (moy 28/02 & 01/03) ; min 24 années. + DÉVIATION assumée vs D4G : filtre `classe_recente<=4` NON appliqué (classification + absente du lac) ; filtre first_temperature_date<1997 approximé par « présence de données + avant 1997 ». À réintroduire au sourcing de la classification. + properties: + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: month + physicalType: INTEGER + required: true + - name: day + physicalType: INTEGER + required: true + - name: sample_count + physicalType: INTEGER + description: Nombre d'années contributrices (>= 24) + - name: baseline_mean_tntxm + physicalType: DOUBLE + description: Moyenne 1991-2020 de tntxm pour ce jour calendaire (°C) + + - name: first_temperature_date + physicalName: gold_dataclimat.first_temperature_date + physicalType: table + description: >- + Premier mois (granularité AAAAMM) où la station dispose d'une température moyenne + mensuelle MF — seuil interne de qualification des stations chez D4G. + properties: + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: first_temperature_date + physicalType: TEXT + description: Mois AAAAMM du premier relevé de température + +customProperties: + - property: lineage + value: >- + silver.observation_v2 (source mf-q/mf-h) -> gold_dataclimat.quotidienne -> + {mensuelle, records_absolus, itn, itn_baseline, baseline_1991_2020, first_temperature_date} + - property: dataLicense + value: >- + Données source Météo-France, Licence Ouverte (Etalab) 2.0 (data.gouv.fr). Méthodologie + des agrégats : Data For Good, saison 14 (dataforgoodfr/14_ValorisationDonneeMeteo). + - property: attribution + value: Météo-France + - property: methodologyRef + value: >- + github.com/dataforgoodfr/14_ValorisationDonneeMeteo (backend/sql/materialized_views). + Règles reproduites en drop-in ; déviations documentées (classe_recente absente du lac). + - property: deviations + value: >- + classe_recente (classification d'homogénéité MF) non disponible dans le lac : filtres + classe_recente<=3 (records) et <=4 (baseline) non appliqués, colonne classe_recente omise. + À réintroduire quand la classification station sera sourcée (mutualisé chantier StatIC). From 7f69caae412b0f253a094c2b1323da39a36c521e Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 18 Jul 2026 12:17:40 +0200 Subject: [PATCH 07/31] =?UTF-8?q?contracts:=20descriptions=20orient=C3=A9e?= =?UTF-8?q?s=20usage=20(public)=20au=20lieu=20de=20la=20logique=20de=20con?= =?UTF-8?q?struction=20=E2=80=94=20datasets=20+=20purpose=20des=203=20cat?= =?UTF-8?q?=C3=A9gories=20gold?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/gold-climato-legacy.odcs.yaml | 28 +++++++++++---- contracts/gold-climato-v2.odcs.yaml | 34 +++++++++--------- contracts/gold-dataclimat.odcs.yaml | 46 +++++++++++-------------- 3 files changed, 59 insertions(+), 49 deletions(-) diff --git a/contracts/gold-climato-legacy.odcs.yaml b/contracts/gold-climato-legacy.odcs.yaml index 3e88c2f..cda5e2f 100644 --- a/contracts/gold-climato-legacy.odcs.yaml +++ b/contracts/gold-climato-legacy.odcs.yaml @@ -9,8 +9,9 @@ dataProduct: gold-climato-legacy description: purpose: >- - Produits Gold retro-compat : copie fidèle des tables climato Météo-France - (schéma complet, unités MF natives), publiée sur le bucket diffusion. + Les données climatologiques Météo-France (mensuelles, décadaires, quotidiennes), + dans leur format d'origine — pour les sites, apps ou scripts déjà construits sur + le schéma Météo-France et qui veulent continuer à s'en servir sans rien changer. usage: Serving public via climato.chom.engineering /legacy/* tags: @@ -30,7 +31,10 @@ schema: - name: mensuelle physicalName: gold_legacy.mensuelle physicalType: table - description: Climatologie mensuelle MF (schéma complet, unités natives) + description: >- + Le résumé de chaque mois par station — moyenne et extrêmes (jour le plus + froid / le plus chaud) : pour des bilans mensuels, au format Météo-France + d'origine. properties: - name: NUM_POSTE physicalType: TEXT @@ -42,7 +46,9 @@ schema: - name: decadaire physicalName: gold_legacy.decadaire physicalType: table - description: Climatologie décadaire MF (schéma complet, unités natives) + description: >- + Cumuls et moyennes par décade (période de 10 jours) par station, au format + Météo-France d'origine — utile pour l'agronomie et le suivi des cultures. properties: - name: NUM_POSTE physicalType: TEXT @@ -58,7 +64,9 @@ schema: - name: decadaire_agro physicalName: gold_legacy.decadaire_agro physicalType: table - description: Climatologie décadaire agrométéo MF (schéma complet, unités natives) + description: >- + Cumuls et moyennes agrométéo par décade (période de 10 jours) par station, + au format Météo-France d'origine — pensé pour le suivi des cultures. properties: - name: NUM_POSTE physicalType: TEXT @@ -74,7 +82,10 @@ schema: - name: quotidienne physicalName: gold_legacy.quotidienne physicalType: table - description: Climatologie quotidienne MF (schéma complet, unités natives) + description: >- + Températures et précipitations journalières par station, au format + Météo-France d'origine : pour tracer des courbes de température ou + alimenter un tableau de bord compatible avec les outils existants. properties: - name: NUM_POSTE physicalType: TEXT @@ -86,7 +97,10 @@ schema: - name: quotidienne_autres physicalName: gold_legacy.quotidienne_autres physicalType: table - description: Paramètres quotidiens complémentaires MF (schéma complet, unités natives) + description: >- + Les autres paramètres journaliers (pression, humidité, ensoleillement, + vent, neige…) au-delà de la température et de la pluie, au format + Météo-France d'origine. properties: - name: NUM_POSTE physicalType: TEXT diff --git a/contracts/gold-climato-v2.odcs.yaml b/contracts/gold-climato-v2.odcs.yaml index bed2f77..6c568f5 100644 --- a/contracts/gold-climato-v2.odcs.yaml +++ b/contracts/gold-climato-v2.odcs.yaml @@ -9,11 +9,11 @@ dataProduct: gold-climato-v2 description: purpose: >- - Produits Gold recalculés depuis le schéma canonique (silver.observation_v2, - table longue). Unités conventionnelles (°C, mm), QC de plausibilité - physique appliqué en amont (air_temperature ∈ [-90, +60] °C, précipitation - horaire ∈ [0, 500] mm) — sans ce filtre tn/tx (donc records/itn) seraient - pollués par les aberrations du raw canonique. + Les mêmes données climatologiques que la version legacy, mais recalculées avec un + contrôle qualité qui écarte les valeurs physiquement impossibles (températures ou + cumuls de pluie aberrants), et exprimées en unités simples (°C, mm). Destiné aux + usages publics (site web, API, tableaux de bord) qui veulent des chiffres fiables + sans avoir à filtrer les données eux-mêmes. usage: Serving public via climato.chom.engineering /v2/* tags: @@ -35,9 +35,10 @@ schema: physicalName: gold_v2.journaliere physicalType: table description: >- - Climatologie journalière v2, recalculée depuis silver.observation_v2 - (fusionné). tn = min air_temperature du jour, tx = max, tm = tntxm = - (tn+tx)/2, rr = Σ précipitation. Unités conventionnelles (°C, mm). + Températures journalières (min, max, moyenne) et cumul de précipitation par + station, en °C et mm : pour tracer des courbes de température ou alimenter un + tableau de bord. Recalculé avec un contrôle qualité qui écarte les valeurs + aberrantes. properties: - name: ic_id physicalType: TEXT @@ -70,8 +71,8 @@ schema: physicalName: gold_v2.mensuelle physicalType: table description: >- - Agrégats mensuels v2, dérivés de gold_v2.journaliere (extrêmes datés - via arg_min/arg_max, nb_jours_gel = jours avec tn < 0). + Le résumé de chaque mois par station — moyennes, extrêmes datés (jour le plus + froid / le plus chaud), nombre de jours de gel : pour des bilans mensuels. properties: - name: ic_id physicalType: TEXT @@ -113,9 +114,9 @@ schema: physicalName: gold_v2.records physicalType: table description: >- - Records absolus par mois calendaire v2, dérivés de gold_v2.journaliere, - aligné D4G v_records_absolus_par_mois (extrême par station x mois - calendaire sur tout l'historique). + Les records de température (chaud/froid) de chaque station, par mois + calendaire sur tout l'historique : pour afficher « record battu » et les + extrêmes historiques. properties: - name: ic_id physicalType: TEXT @@ -142,10 +143,9 @@ schema: physicalName: gold_v2.itn physicalType: table description: >- - Indicateur Thermique National journalier, aligné D4G saison 14 - (v_itn_daily_all_years). NATIONAL — pas de station : moyenne de tntxm - sur les 30 stations de référence (HAVING >= 29/30 disponibles). Série - réelle (is_fictive=FALSE partout dans ce build). + L'Indicateur Thermique National — la température moyenne quotidienne de la + France (30 stations de référence) : pour suivre vagues de chaleur et de froid + à l'échelle du pays. properties: - name: date physicalType: DATE diff --git a/contracts/gold-dataclimat.odcs.yaml b/contracts/gold-dataclimat.odcs.yaml index 7eacb90..29dfbde 100644 --- a/contracts/gold-dataclimat.odcs.yaml +++ b/contracts/gold-dataclimat.odcs.yaml @@ -9,11 +9,10 @@ dataProduct: gold-dataclimat description: purpose: >- - Catégorie Gold dédiée à dataclimat.fr (projet Data For Good - `dataforgoodfr/14_ValorisationDonneeMeteo`) : réplique en « drop-in » les agrégats que - leur backend matérialise en SQL (materialized views), pour que le site les consomme via - l'API au lieu de les recalculer. Mono-source **Météo-France**, station identifiée par - `station_code` = NUM_POSTE. Colonnes et sémantique alignées sur leurs matviews. + Les indicateurs climatiques du projet dataclimat.fr (Data For Good) : températures + journalières et mensuelles par station, records de chaleur et de froid, normales + 1991-2020, et l'Indicateur Thermique National — la température moyenne quotidienne de + la France. Toutes ces données proviennent de Météo-France. usage: >- Serving public via /dataclimat/*. Cible : backend dataclimat.fr (remplacement des lectures `FROM mv_*` par des appels API). Relevé des règles métier le 2026-07-18 depuis @@ -32,9 +31,9 @@ schema: physicalName: gold_dataclimat.quotidienne physicalType: table description: >- - Climatologie journalière « jour climatologique » Météo-France, mono-source MF (archive - quotidienne officielle, source mf-q). tn/tx/tntxm = valeurs officielles MF. Historique - depuis 1816. Brique de base : mensuelle, records, itn en dérivent. + Températures journalières (min, max, moyenne) par station, valeurs officielles + Météo-France, historique depuis 1816 : pour tracer des courbes de température ou + alimenter un tableau de bord. properties: - name: station_code physicalType: TEXT @@ -56,7 +55,9 @@ schema: - name: mensuelle physicalName: gold_dataclimat.mensuelle physicalType: table - description: Extrêmes mensuels + moyenne, dérivés de gold_dataclimat.quotidienne. + description: >- + Le résumé de chaque mois par station — moyenne et extrêmes (jour le plus froid / + le plus chaud) : pour des bilans mensuels. properties: - name: station_code physicalType: TEXT @@ -86,10 +87,8 @@ schema: physicalName: gold_dataclimat.records_absolus physicalType: table description: >- - Records absolus figés (chaud/froid) par station × période (all_time / mois / saison). - DÉVIATION assumée vs D4G : filtre `classe_recente<=3` NON appliqué (classification - d'homogénéité MF absente du lac) ; colonnes `classe_recente`/`date_de_creation`/ - `date_de_fermeture` omises. À réintroduire au sourcing de la classification. + Les records de température (chaud/froid) de chaque station, toute l'année / par + mois / par saison : pour afficher « record battu » et les extrêmes historiques. properties: - name: period_type physicalType: TEXT @@ -127,9 +126,9 @@ schema: physicalName: gold_dataclimat.itn physicalType: table description: >- - Indicateur Thermique National journalier = moyenne non pondérée de tntxm sur un panel - FIXE de 30 stations de référence Météo-France (règle Reims : bascule 51183001→51449002 - au 2012-05-08 ; 29 fév synthétique pour les années non bissextiles). + L'Indicateur Thermique National — la température moyenne quotidienne de la France + (30 stations de référence) : pour suivre vagues de chaleur et de froid à l'échelle + du pays. properties: - name: date physicalType: DATE @@ -151,8 +150,8 @@ schema: physicalName: gold_dataclimat.itn_baseline physicalType: table description: >- - Normale 1991-2020 de l'ITN par jour calendaire (moyenne, écart-type, percentiles), - base des bandes baseline_mean ± stddev de l'endpoint national-indicator. + La normale 1991-2020 de l'ITN, jour par jour : la référence pour dire si une + journée est au-dessus ou en dessous de la normale nationale. properties: - name: month physicalType: INTEGER @@ -176,11 +175,8 @@ schema: physicalName: gold_dataclimat.baseline_1991_2020 physicalType: table description: >- - Normale 1991-2020 de tntxm par station × jour calendaire (base de l'endpoint deviation). - 29 fév réel (bissextiles) ou synthétique (moy 28/02 & 01/03) ; min 24 années. - DÉVIATION assumée vs D4G : filtre `classe_recente<=4` NON appliqué (classification - absente du lac) ; filtre first_temperature_date<1997 approximé par « présence de données - avant 1997 ». À réintroduire au sourcing de la classification. + La normale de température 1991-2020 de chaque station, jour par jour de l'année : + pour calculer l'écart à la normale. properties: - name: station_code physicalType: TEXT @@ -203,8 +199,8 @@ schema: physicalName: gold_dataclimat.first_temperature_date physicalType: table description: >- - Premier mois (granularité AAAAMM) où la station dispose d'une température moyenne - mensuelle MF — seuil interne de qualification des stations chez D4G. + Depuis quel mois chaque station mesure la température : pour connaître + l'ancienneté d'une station. properties: - name: station_code physicalType: TEXT From a431845ce801dcb0fa58c8442b51b30fc2e361c8 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 18 Jul 2026 14:18:27 +0200 Subject: [PATCH 08/31] =?UTF-8?q?contracts(gold-dataclimat):=20pr=C3=A9cis?= =?UTF-8?q?er=20le=20format=20AAAAMM=20de=20first=5Ftemperature=5Fdate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chaîne AAAAMM (ex. 187206 = juin 1872), ni date ISO ni nombre. Précisé dans la description du dataset (rendue sur le portail) et de la propriété. --- contracts/gold-dataclimat.odcs.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contracts/gold-dataclimat.odcs.yaml b/contracts/gold-dataclimat.odcs.yaml index 29dfbde..d7e2568 100644 --- a/contracts/gold-dataclimat.odcs.yaml +++ b/contracts/gold-dataclimat.odcs.yaml @@ -200,7 +200,8 @@ schema: physicalType: table description: >- Depuis quel mois chaque station mesure la température : pour connaître - l'ancienneté d'une station. + l'ancienneté d'une station. La date est un texte au format AAAAMM (année + puis mois sur deux chiffres) — par exemple « 187206 » = juin 1872. properties: - name: station_code physicalType: TEXT @@ -208,7 +209,10 @@ schema: description: NUM_POSTE Météo-France - name: first_temperature_date physicalType: TEXT - description: Mois AAAAMM du premier relevé de température + description: >- + Mois du premier relevé de température, texte au format AAAAMM (année + + mois sur deux chiffres), ex. « 187206 » = juin 1872. Ni date ISO ni + nombre. customProperties: - property: lineage From 8d1db3c1e59a27d0a2a2a0987f75258751603714 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 18 Jul 2026 15:34:52 +0200 Subject: [PATCH 09/31] =?UTF-8?q?contracts(gold-ic):=20nouveau=20contrat?= =?UTF-8?q?=20climato=20r=C3=A9seau=20IC=20pur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 3 datasets (journaliere, mensuelle, records), kernels v2 filtrés sources IC (source LIKE '%-ic'), attribution Infoclimat, mfid non requis (stations IC pures). --- contracts/gold-ic.odcs.yaml | 175 ++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 contracts/gold-ic.odcs.yaml diff --git a/contracts/gold-ic.odcs.yaml b/contracts/gold-ic.odcs.yaml new file mode 100644 index 0000000..4c635d3 --- /dev/null +++ b/contracts/gold-ic.odcs.yaml @@ -0,0 +1,175 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-ic +name: Gold réseau IC (climatologie réseau Infoclimat) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-ic + +description: + purpose: >- + La climatologie du seul réseau de stations Infoclimat — stations participatives + et StatIC — calculée à partir des seules mesures Infoclimat, sans apport + Météo-France. Températures journalières et mensuelles, records par station. + Utile pour valoriser le réseau participatif et le comparer aux données + officielles. Contrôle qualité et unités simples (°C, mm) identiques à la + version v2. + usage: Serving public via climato.chom.engineering /ic/* + +tags: + - meteo + - climatologie + - infoclimat + - reseau-participatif + - gold + - diffusion + - schema-canonique + +servers: + - server: diffusion-iceberg + type: iceberg + environment: production + location: s3://chom-ic-lake-diffusion/gold_ic + +schema: + - name: journaliere + physicalName: gold_ic.journaliere + physicalType: table + description: >- + Températures journalières (min, max, moyenne) et cumul de précipitation par + station du réseau Infoclimat, en °C et mm : pour tracer des courbes ou + alimenter un tableau de bord à partir des mesures IC seules. Contrôle qualité + qui écarte les valeurs aberrantes. + properties: + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station Infoclimat (crosswalk dim_station) + - name: mfid + physicalType: TEXT + description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide + - name: date + physicalType: DATE + required: true + - name: tn + physicalType: DOUBLE + description: Température min du jour (°C) + - name: tx + physicalType: DOUBLE + description: Température max du jour (°C) + - name: tm + physicalType: DOUBLE + description: (tn+tx)/2 (°C) + - name: tntxm + physicalType: DOUBLE + description: alias de tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du jour (mm) + + - name: mensuelle + physicalName: gold_ic.mensuelle + physicalType: table + description: >- + Le résumé de chaque mois par station du réseau Infoclimat — moyennes, extrêmes + datés (jour le plus froid / le plus chaud), nombre de jours de gel : pour des + bilans mensuels sur les seules mesures IC. + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mfid + physicalType: TEXT + description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide + - name: mois + physicalType: TIMESTAMP + required: true + description: Premier jour du mois (date_trunc('month', date)) + - name: tnm + physicalType: DOUBLE + description: Moyenne mensuelle des tn (°C) + - name: txm + physicalType: DOUBLE + description: Moyenne mensuelle des tx (°C) + - name: tmm + physicalType: DOUBLE + description: Moyenne mensuelle des tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du mois (mm) + - name: tnn + physicalType: DOUBLE + description: Température min du mois (°C) + - name: tnn_date + physicalType: DATE + - name: txx + physicalType: DOUBLE + description: Température max du mois (°C) + - name: txx_date + physicalType: DATE + - name: nb_jours_gel + physicalType: INTEGER + description: Nombre de jours du mois avec tn < 0 °C + + - name: records + physicalName: gold_ic.records + physicalType: table + description: >- + Les records de température (chaud/froid) de chaque station du réseau Infoclimat, + par mois calendaire sur tout l'historique : pour afficher « record battu » et + les extrêmes historiques du réseau participatif. + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mfid + physicalType: TEXT + description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide + - name: mois_calendaire + physicalType: INTEGER + required: true + description: Mois calendaire (1-12), 3e composante de la clé naturelle + - name: txx_max + physicalType: DOUBLE + description: Record absolu de température max sur le mois calendaire (°C) + - name: txx_max_date + physicalType: DATE + - name: tnn_min + physicalType: DOUBLE + description: Record absolu de température min sur le mois calendaire (°C) + - name: tnn_min_date + physicalType: DATE + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: silver.observation_v2 (source LIKE '%-ic') -> gold_ic.journaliere -> {mensuelle, records} + - property: dataLicense + value: >- + Données du réseau participatif Infoclimat (mesures IC seules), politique + opendata Infoclimat. + - property: attribution + value: Infoclimat + - property: methodologyRef + value: >- + Kernels identiques à gold_v2 (github.com/dataforgoodfr/14_ValorisationDonneeMeteo, + backend/sql) — mêmes agrégats journaliers/mensuels/records, appliqués aux seules + sources IC. + - property: sourceFilter + value: >- + source LIKE '%-ic' (synop-ic, static-ic, metar-ic, bouees-ic). Exclut les + sources Météo-France (mf-*) et les anciens agrégats IC (climato-auto). + - property: units + value: >- + Unités conventionnelles (°C, mm). QC de plausibilité physique appliqué en amont + de gold_ic.journaliere (air_temperature ∈ [-90, +60] °C, précipitation horaire + ∈ [0, 500] mm) — hérité par mensuelle/records. From e305edb3f91c16fb8c105307b24c87030e5b3b3b Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sun, 19 Jul 2026 11:28:50 +0200 Subject: [PATCH 10/31] =?UTF-8?q?contracts(gold-statIC):=20climato=20du=20?= =?UTF-8?q?r=C3=A9seau=20participatif=20StatIC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 3 datasets (journaliere/mensuelle/records), kernel v2 filtré source='static-ic', champs qualité (n_obs, taux_qc_valide), transparence plutôt qu'homogénéisation. Déviation classe_station documentée (siting StatIC non sourçable). Attribution Infoclimat / réseau StatIC. --- contracts/gold-statIC.odcs.yaml | 187 ++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 contracts/gold-statIC.odcs.yaml diff --git a/contracts/gold-statIC.odcs.yaml b/contracts/gold-statIC.odcs.yaml new file mode 100644 index 0000000..b765e2f --- /dev/null +++ b/contracts/gold-statIC.odcs.yaml @@ -0,0 +1,187 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-statIC +name: Gold StatIC (climato du réseau participatif Infoclimat) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-statIC + +description: + purpose: >- + La climatologie du réseau de stations participatives StatIC (Infoclimat) : + températures journalières et mensuelles, records par station — servie comme un + produit Météo-France, mais en assumant la nature participative des stations + (emplacements et capteurs hétérogènes) par la TRANSPARENCE plutôt que le + masquage : chaque valeur est accompagnée de sa densité d'observations et de son + taux de mesures physiquement plausibles. Rien n'est retiré d'autorité ; + l'utilisateur filtre selon son besoin. + usage: Serving public via climato.chom.engineering /statIC/* + limitations: >- + classe_station (classification siting StatIC) est présente mais NON RENSEIGNÉE + (NULL) : cette classification n'est pas disponible comme donnée sourçable dans + le canonique ni la métadata IC inventoriée (décision 2026-07-18). Elle sera + renseignée quand la source sera identifiée. Le taux_qc_valide s'appuie sur la + plausibilité physique (les obs StatIC sont qc_flag='raw', sans QC amont). + +tags: + - meteo + - climatologie + - infoclimat + - statIC + - reseau-participatif + - gold + - diffusion + +servers: + - server: diffusion-iceberg + type: iceberg + environment: production + location: s3://chom-ic-lake-diffusion/gold_statIC + +schema: + - name: journaliere + physicalName: gold_statIC.journaliere + physicalType: table + description: >- + Températures journalières (min, max, moyenne) et cumul de précipitation par + station StatIC, en °C et mm, avec la densité d'observations et le taux de + mesures plausibles : pour exploiter le réseau participatif en connaissance de + cause. + properties: + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station StatIC (Infoclimat) + - name: date + physicalType: DATE + required: true + - name: tn + physicalType: DOUBLE + description: Température min du jour (°C) + - name: tx + physicalType: DOUBLE + description: Température max du jour (°C) + - name: tm + physicalType: DOUBLE + description: (tn+tx)/2 (°C) + - name: tntxm + physicalType: DOUBLE + description: alias de tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du jour (mm), nul si > 2000 mm (impossible) + - name: n_obs + physicalType: INTEGER + description: Nombre d'observations de température agrégées ce jour (densité) + - name: taux_qc_valide + physicalType: DOUBLE + description: Part des obs de température dans les bornes physiques [-90,+60] °C (0-1) + - name: classe_station + physicalType: INTEGER + description: Classe siting StatIC (1-5) — NON RENSEIGNÉE (déviation, cf. limitations) + + - name: mensuelle + physicalName: gold_statIC.mensuelle + physicalType: table + description: >- + Le résumé de chaque mois par station StatIC — moyennes, extrêmes datés, jours + de gel — avec la densité et le taux de mesures plausibles du mois. + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mois + physicalType: TIMESTAMP + required: true + description: Premier jour du mois + - name: tnm + physicalType: DOUBLE + description: Moyenne mensuelle des tn (°C) + - name: txm + physicalType: DOUBLE + description: Moyenne mensuelle des tx (°C) + - name: tmm + physicalType: DOUBLE + description: Moyenne mensuelle des tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du mois (mm) + - name: tnn + physicalType: DOUBLE + description: Température min du mois (°C) + - name: tnn_date + physicalType: DATE + - name: txx + physicalType: DOUBLE + description: Température max du mois (°C) + - name: txx_date + physicalType: DATE + - name: nb_jours_gel + physicalType: INTEGER + description: Nombre de jours du mois avec tn < 0 °C + - name: n_obs + physicalType: INTEGER + description: Nombre d'observations de température du mois + - name: taux_qc_valide + physicalType: DOUBLE + description: Taux d'obs plausibles du mois, pondéré par la densité (0-1) + - name: classe_station + physicalType: INTEGER + description: Classe siting StatIC — NON RENSEIGNÉE (déviation) + + - name: records + physicalName: gold_statIC.records + physicalType: table + description: >- + Les records de température (chaud/froid) de chaque station StatIC, par mois + calendaire sur tout l'historique : extrêmes bruts du réseau participatif (à + lire avec la densité/qualité de la station). + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mois_calendaire + physicalType: INTEGER + required: true + description: Mois calendaire (1-12) + - name: txx_max + physicalType: DOUBLE + description: Record de température max sur le mois calendaire (°C) + - name: txx_max_date + physicalType: DATE + - name: tnn_min + physicalType: DOUBLE + description: Record de température min sur le mois calendaire (°C) + - name: tnn_min_date + physicalType: DATE + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: silver.observation_v2 (source='static-ic') -> gold_statIC.journaliere -> {mensuelle, records} + - property: dataLicense + value: >- + Données du réseau participatif StatIC (Infoclimat), Licence Ouverte (Etalab) + 2.0 (cf. infoclimat.fr/opendata). Licence propre à trancher au besoin (gate CA). + - property: attribution + value: Infoclimat / réseau StatIC + - property: methodologyRef + value: >- + Kernels identiques à gold_v2 appliqués aux seules obs source='static-ic' ; + transparence qualité (n_obs, taux_qc_valide) au lieu d'homogénéisation MF. + - property: deviations + value: >- + classe_station (siting StatIC) NON sourçable dans le canonique/métadata IC + inventoriée -> colonne NULL (décision 2026-07-18), à renseigner au sourcing. + Indicateur réseau (ITN-StatIC spatialement représentatif) = livraison suivante. + - property: units + value: Unités conventionnelles (°C, mm), QC plausibilité amont comme gold_v2. From 4688ac19eff5b49579294cb2bf862ee7cee8161c Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sun, 19 Jul 2026 11:39:26 +0200 Subject: [PATCH 11/31] =?UTF-8?q?contracts(gold-statIC):=20+=20indicateur?= =?UTF-8?q?=5Freseau=20(ITN-StatIC=20repr=C3=A9sentatif=20spatial)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/gold-statIC.odcs.yaml | 43 +++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/contracts/gold-statIC.odcs.yaml b/contracts/gold-statIC.odcs.yaml index b765e2f..d548732 100644 --- a/contracts/gold-statIC.odcs.yaml +++ b/contracts/gold-statIC.odcs.yaml @@ -156,6 +156,42 @@ schema: - name: tnn_min_date physicalType: DATE + - name: indicateur_reseau + physicalName: gold_statIC.indicateur_reseau + physicalType: table + description: >- + L'indicateur thermique national du réseau StatIC — la température moyenne + quotidienne de la France, calculée pour être SPATIALEMENT REPRÉSENTATIVE : + moyenne par département puis moyenne des départements couverts (et non moyenne + brute des stations, qui sur-pondérerait les zones denses). La couverture + (nombre de stations, de départements) et la dispersion sont exposées pour la + transparence. V1 national ; régional et anomalies vs normales = suite. + properties: + - name: date + physicalType: DATE + required: true + - name: echelle + physicalType: TEXT + description: Échelle spatiale ('national' en V1) + - name: itn_statIC + physicalType: DOUBLE + description: Indicateur thermique StatIC du jour, représentatif (°C) + - name: tn_moy + physicalType: DOUBLE + description: Moyenne réseau des tn (par maille puis des mailles) (°C) + - name: tx_moy + physicalType: DOUBLE + description: Moyenne réseau des tx (°C) + - name: n_stations + physicalType: INTEGER + description: Nombre de stations StatIC contribuant ce jour (transparence) + - name: n_mailles + physicalType: INTEGER + description: Nombre de départements couverts ce jour (représentativité) + - name: ecart_type + physicalType: DOUBLE + description: Écart-type inter-stations des tm (dispersion, transparence) + team: - username: pam role: owner @@ -167,7 +203,9 @@ support: customProperties: - property: lineage - value: silver.observation_v2 (source='static-ic') -> gold_statIC.journaliere -> {mensuelle, records} + value: >- + silver.observation_v2 (source='static-ic') -> gold_statIC.journaliere -> + {mensuelle, records, indicateur_reseau (+ dim.station pour la stratification département)} - property: dataLicense value: >- Données du réseau participatif StatIC (Infoclimat), Licence Ouverte (Etalab) @@ -182,6 +220,7 @@ customProperties: value: >- classe_station (siting StatIC) NON sourçable dans le canonique/métadata IC inventoriée -> colonne NULL (décision 2026-07-18), à renseigner au sourcing. - Indicateur réseau (ITN-StatIC spatialement représentatif) = livraison suivante. + Indicateur réseau : V1 national, stratification par DÉPARTEMENT (approximation + surfacique ; grille équi-surface = raffinement futur), DOM-TOM exclus. - property: units value: Unités conventionnelles (°C, mm), QC plausibilité amont comme gold_v2. From e347538db869392ea42b693d0ea6e90f0b10fe6d Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sun, 19 Jul 2026 14:38:00 +0200 Subject: [PATCH 12/31] =?UTF-8?q?contracts(gold-ic):=20clarifie=20'collect?= =?UTF-8?q?e=20Infoclimat=20hors=20MF'=20(pas=20un=20r=C3=A9seau=20propre)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit purpose/descriptions/dataLicense/attribution/name corrigés : gold_ic = agrégats des sources collectées par IC hors flux MF (synop/metar/bouées officiels relayés + StatIC + Météo-à-l'École), pas 'le réseau participatif Infoclimat'. Pour les stations propres d'IC = gold-statIC. --- contracts/gold-ic.odcs.yaml | 51 +++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/contracts/gold-ic.odcs.yaml b/contracts/gold-ic.odcs.yaml index 4c635d3..48d6676 100644 --- a/contracts/gold-ic.odcs.yaml +++ b/contracts/gold-ic.odcs.yaml @@ -1,7 +1,7 @@ apiVersion: v3.0.2 kind: DataContract id: urn:infoclimat:contract:gold-ic -name: Gold réseau IC (climatologie réseau Infoclimat) +name: Gold collecte IC (climatologie des sources collectées par Infoclimat, hors Météo-France) version: 0.1.0 status: draft domain: climato @@ -9,19 +9,22 @@ dataProduct: gold-ic description: purpose: >- - La climatologie du seul réseau de stations Infoclimat — stations participatives - et StatIC — calculée à partir des seules mesures Infoclimat, sans apport - Météo-France. Températures journalières et mensuelles, records par station. - Utile pour valoriser le réseau participatif et le comparer aux données - officielles. Contrôle qualité et unités simples (°C, mm) identiques à la - version v2. + Les agrégats climatologiques calculés sur TOUTES les sources collectées par + Infoclimat À L'EXCLUSION du flux officiel Météo-France : réseaux synoptiques et + METAR officiels (décodés depuis les diffusions internationales SYNOP/BUFR), + bouées marines, le réseau participatif StatIC et Météo-à-l'École. Ce n'est donc + PAS un réseau propre à Infoclimat mais l'ensemble de sa collecte hors + Météo-France — un regroupement technique par source. Pour les SEULES stations + opérées par Infoclimat, voir gold-statIC (réseau participatif). Températures + journalières et mensuelles, records par station ; QC et unités (°C, mm) + identiques à v2. usage: Serving public via climato.chom.engineering /ic/* tags: - meteo - climatologie - infoclimat - - reseau-participatif + - collecte-multi-sources - gold - diffusion - schema-canonique @@ -38,9 +41,9 @@ schema: physicalType: table description: >- Températures journalières (min, max, moyenne) et cumul de précipitation par - station du réseau Infoclimat, en °C et mm : pour tracer des courbes ou - alimenter un tableau de bord à partir des mesures IC seules. Contrôle qualité - qui écarte les valeurs aberrantes. + station, en °C et mm, à partir des sources collectées par Infoclimat hors + Météo-France (synop/metar/bouées officiels relayés + StatIC + Météo-à-l'École). + Contrôle qualité qui écarte les valeurs aberrantes. properties: - name: ic_id physicalType: TEXT @@ -72,9 +75,9 @@ schema: physicalName: gold_ic.mensuelle physicalType: table description: >- - Le résumé de chaque mois par station du réseau Infoclimat — moyennes, extrêmes - datés (jour le plus froid / le plus chaud), nombre de jours de gel : pour des - bilans mensuels sur les seules mesures IC. + Le résumé de chaque mois par station — moyennes, extrêmes datés (jour le plus + froid / le plus chaud), nombre de jours de gel — sur les sources collectées par + Infoclimat hors Météo-France. properties: - name: ic_id physicalType: TEXT @@ -116,9 +119,9 @@ schema: physicalName: gold_ic.records physicalType: table description: >- - Les records de température (chaud/froid) de chaque station du réseau Infoclimat, - par mois calendaire sur tout l'historique : pour afficher « record battu » et - les extrêmes historiques du réseau participatif. + Les records de température (chaud/froid) de chaque station, par mois calendaire + sur tout l'historique, sur les sources collectées par Infoclimat hors + Météo-France : pour afficher « record battu » et les extrêmes historiques. properties: - name: ic_id physicalType: TEXT @@ -155,10 +158,13 @@ customProperties: value: silver.observation_v2 (source LIKE '%-ic') -> gold_ic.journaliere -> {mensuelle, records} - property: dataLicense value: >- - Données du réseau participatif Infoclimat (mesures IC seules), politique - opendata Infoclimat. + Sources multiples collectées par Infoclimat hors Météo-France : réseaux + officiels SYNOP/METAR/bouées (diffusions internationales) et réseaux + participatifs StatIC / Météo-à-l'École, redistribués sous la politique + opendata Infoclimat. Les données officielles restent sous la licence de leur + producteur. - property: attribution - value: Infoclimat + value: Infoclimat (collecte multi-sources hors Météo-France) - property: methodologyRef value: >- Kernels identiques à gold_v2 (github.com/dataforgoodfr/14_ValorisationDonneeMeteo, @@ -166,8 +172,9 @@ customProperties: sources IC. - property: sourceFilter value: >- - source LIKE '%-ic' (synop-ic, static-ic, metar-ic, bouees-ic). Exclut les - sources Météo-France (mf-*) et les anciens agrégats IC (climato-auto). + source LIKE '%-ic' : synop-ic (SYNOP officiel relayé), metar-ic (METAR), + bouees-ic (bouées), static-ic (StatIC participatif), mae-ic (Météo-à-l'École). + Exclut les sources Météo-France (mf-*) et les anciens agrégats IC (climato-auto). - property: units value: >- Unités conventionnelles (°C, mm). QC de plausibilité physique appliqué en amont From 63acf5f436bf8877024732a08472d66c128cbc82 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:31:13 +0200 Subject: [PATCH 13/31] =?UTF-8?q?contract=20gold-dataclimat:=20classe=5Fre?= =?UTF-8?q?cente=20sourc=C3=A9e=20+=20expos=C3=A9e=20(d=C3=A9viation=20lev?= =?UTF-8?q?=C3=A9e)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit records_absolus et baseline_1991_2020 portent désormais classe_recente (classification d'homogénéité MF, socle dataclimat prod). Filtres iso-D4G appliqués: records<=3 (v_station_records), baseline<=4 (v_station_deviation). deviations réduit à l'approximation first_temperature_date (dates poste absentes du lac). --- contracts/gold-dataclimat.odcs.yaml | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/contracts/gold-dataclimat.odcs.yaml b/contracts/gold-dataclimat.odcs.yaml index d7e2568..f4b0ee8 100644 --- a/contracts/gold-dataclimat.odcs.yaml +++ b/contracts/gold-dataclimat.odcs.yaml @@ -121,6 +121,12 @@ schema: physicalType: DOUBLE - name: alt physicalType: DOUBLE + - name: classe_recente + physicalType: INTEGER + description: >- + Classe d'homogénéité MF de la station (1 = meilleure … 5), valeur courante + (station_classe.date_fin IS NULL). Le dataset ne retient que classe_recente <= 3 + (iso-comportement D4G v_station_records). - name: itn physicalName: gold_dataclimat.itn @@ -194,6 +200,12 @@ schema: - name: baseline_mean_tntxm physicalType: DOUBLE description: Moyenne 1991-2020 de tntxm pour ce jour calendaire (°C) + - name: classe_recente + physicalType: INTEGER + description: >- + Classe d'homogénéité MF de la station (1 = meilleure … 5), valeur courante + (station_classe.date_fin IS NULL). Le dataset ne retient que classe_recente <= 4 + (iso-comportement D4G v_station_deviation). - name: first_temperature_date physicalName: gold_dataclimat.first_temperature_date @@ -228,9 +240,15 @@ customProperties: - property: methodologyRef value: >- github.com/dataforgoodfr/14_ValorisationDonneeMeteo (backend/sql/materialized_views). - Règles reproduites en drop-in ; déviations documentées (classe_recente absente du lac). + Règles reproduites en drop-in. + - property: classeRecente + value: >- + classe_recente (classification d'homogénéité MF, 1=meilleure..5) sourcée depuis la table + station_classe du socle dataclimat de production (valeur courante = date_fin IS NULL). + Filtres iso-D4G appliqués : records_absolus classe_recente<=3 (v_station_records), + baseline_1991_2020 classe_recente<=4 (v_station_deviation) ; colonne exposée dans les deux. - property: deviations value: >- - classe_recente (classification d'homogénéité MF) non disponible dans le lac : filtres - classe_recente<=3 (records) et <=4 (baseline) non appliqués, colonne classe_recente omise. - À réintroduire quand la classification station sera sourcée (mutualisé chantier StatIC). + first_temperature_date >= now()-50 ans (records) non appliqué (dates d'ouverture/fermeture + de poste absentes du lac) ; l'antériorité est approximée par « au moins une observation + avant 1997-01-01 ». date_de_creation/date_de_fermeture du payload D4G omises. From c574431f14e4821d944e24fbb850fa5c8b69172d Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:37:51 +0200 Subject: [PATCH 14/31] contract gold-dataclimat: dataset records_battus (historique progressif des records) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 8e dataset de la famille : timeline des records progressivement battus par station (all_time/mois/saison, TX/TN), drop-in D4G /records (alias /records/historical), distinct de records_absolus. classe_recente<=3, colonne exposée. Lineage + deviations mis à jour. --- contracts/gold-dataclimat.odcs.yaml | 62 ++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/contracts/gold-dataclimat.odcs.yaml b/contracts/gold-dataclimat.odcs.yaml index f4b0ee8..723271d 100644 --- a/contracts/gold-dataclimat.odcs.yaml +++ b/contracts/gold-dataclimat.odcs.yaml @@ -128,6 +128,52 @@ schema: (station_classe.date_fin IS NULL). Le dataset ne retient que classe_recente <= 3 (iso-comportement D4G v_station_records). + - name: records_battus + physicalName: gold_dataclimat.records_battus + physicalType: table + description: >- + L'HISTORIQUE des records progressivement battus par station : une ligne par date où + la station a établi un nouvel extrême (chaud/froid), toute l'année / par mois / par + saison. Distinct de records_absolus (extrême figé) — sert la timeline « records + battus » de dataclimat.fr (API /records, alias /records/historical). + properties: + - name: period_type + physicalType: TEXT + required: true + description: all_time | month | season + - name: period_value + physicalType: TEXT + description: NULL (all_time) | '1'..'12' (mois) | spring|summer|autumn|winter + - name: record_type + physicalType: TEXT + required: true + description: TX (chaud) | TN (froid) + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: station_name + physicalType: TEXT + - name: department + physicalType: TEXT + - name: record_value + physicalType: DOUBLE + description: Valeur du record établi ce jour-là (°C) + - name: record_date + physicalType: DATE + description: Date à laquelle ce nouvel extrême a été atteint + - name: lat + physicalType: DOUBLE + - name: lon + physicalType: DOUBLE + - name: alt + physicalType: DOUBLE + - name: classe_recente + physicalType: INTEGER + description: >- + Classe d'homogénéité MF (1 = meilleure … 5), valeur courante. Filtre + classe_recente <= 3 (iso-comportement D4G v_records_battus). + - name: itn physicalName: gold_dataclimat.itn physicalType: table @@ -230,7 +276,8 @@ customProperties: - property: lineage value: >- silver.observation_v2 (source mf-q/mf-h) -> gold_dataclimat.quotidienne -> - {mensuelle, records_absolus, itn, itn_baseline, baseline_1991_2020, first_temperature_date} + {mensuelle, records_absolus, records_battus, itn, itn_baseline, baseline_1991_2020, + first_temperature_date} - property: dataLicense value: >- Données source Météo-France, Licence Ouverte (Etalab) 2.0 (data.gouv.fr). Méthodologie @@ -245,10 +292,13 @@ customProperties: value: >- classe_recente (classification d'homogénéité MF, 1=meilleure..5) sourcée depuis la table station_classe du socle dataclimat de production (valeur courante = date_fin IS NULL). - Filtres iso-D4G appliqués : records_absolus classe_recente<=3 (v_station_records), - baseline_1991_2020 classe_recente<=4 (v_station_deviation) ; colonne exposée dans les deux. + Filtres iso-D4G appliqués : records_absolus + records_battus classe_recente<=3 + (v_station_records), baseline_1991_2020 classe_recente<=4 (v_station_deviation) ; + colonne exposée partout. - property: deviations value: >- - first_temperature_date >= now()-50 ans (records) non appliqué (dates d'ouverture/fermeture - de poste absentes du lac) ; l'antériorité est approximée par « au moins une observation - avant 1997-01-01 ». date_de_creation/date_de_fermeture du payload D4G omises. + first_temperature_date >= now()-50 ans (records_absolus/records_battus) non appliqué + (dates d'ouverture/fermeture de poste absentes du lac) ; l'antériorité est approximée + par « au moins une observation avant 1997-01-01 » (baseline) — records_battus émet donc + l'historique complet dès la 1re observation. date_de_creation/date_de_fermeture du + payload D4G omises. From b22eaeb1da5951c507a1a083ffed13257a519cd7 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Wed, 22 Jul 2026 22:12:25 +0200 Subject: [PATCH 15/31] =?UTF-8?q?feat(contracts):=20gold-ref=20(r=C3=A9f?= =?UTF-8?q?=C3=A9rentiel=20stations=20Gold,=202=20datasets)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/gold-ref.odcs.yaml | 133 +++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 contracts/gold-ref.odcs.yaml diff --git a/contracts/gold-ref.odcs.yaml b/contracts/gold-ref.odcs.yaml new file mode 100644 index 0000000..5832144 --- /dev/null +++ b/contracts/gold-ref.odcs.yaml @@ -0,0 +1,133 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-ref +name: Gold référentiel stations (annuaire géolocalisé + réseau + activité par paramètre) +version: 0.1.0 +status: draft +domain: referentiel +dataProduct: gold-ref + +description: + purpose: >- + Le référentiel unique des stations météo connues d'Infoclimat : identité + (ic_id, mfid), géolocalisation, réseau (StatIC participatif / synop, et pour + Météo-France le type de poste principale/secondaire), état d'ouverture, et la + liste des paramètres réellement mesurés avec leur activité (première/dernière + observation, volume). Remplace le feed live stations_xhr.php et les exports + GeoJSON figés côté cartes. + usage: Serving public via climato.chom.engineering /ref/* + +tags: + - meteo + - referentiel + - stations + - infoclimat + - gold + - diffusion + - schema-canonique + +servers: + - server: diffusion-iceberg + type: iceberg + environment: production + location: s3://chom-ic-lake-diffusion/gold_ref + +schema: + - name: station + physicalName: gold_ref.station + physicalType: table + description: >- + Une ligne par station : identité, géolocalisation, réseau, état d'ouverture, + paramètres mesurés (tableau) et date de dernière activité. + properties: + - name: station_uid + physicalType: TEXT + required: true + description: Identifiant canonique de station (UUID) + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station Infoclimat + - name: mfid + physicalType: TEXT + description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide + - name: genre + physicalType: TEXT + description: Réseau (static = StatIC participatif, synop = synoptique) + - name: type_poste + physicalType: TEXT + description: Type de poste Météo-France (principale/secondaire), sinon vide + - name: libelle + physicalType: TEXT + - name: latitude + physicalType: DOUBLE + required: true + - name: longitude + physicalType: DOUBLE + required: true + - name: altitude + physicalType: INTEGER + description: Altitude (m) + - name: departement + physicalType: TEXT + - name: pays + physicalType: TEXT + - name: ouverte + physicalType: BOOLEAN + description: Station déclarée ouverte dans l'annuaire + - name: dh_ouverture + physicalType: TIMESTAMP + - name: parametres_mesures + physicalType: ARRAY + description: Clés canoniques des paramètres réellement observés + - name: derniere_activite + physicalType: TIMESTAMP + description: Dernière observation, tous paramètres confondus + + - name: station_parametre + physicalName: gold_ref.station_parametre + physicalType: table + description: >- + Pont station × paramètre : pour chaque paramètre observé par une station, + première/dernière observation et volume. Fait autorité sur « quelles stations + mesurent quoi ». + properties: + - name: station_uid + physicalType: TEXT + required: true + - name: parametre + physicalType: TEXT + required: true + description: Clé canonique du paramètre (vocabulaire dim_parametre) + - name: premiere_obs + physicalType: TIMESTAMP + - name: derniere_obs + physicalType: TIMESTAMP + - name: n_obs + physicalType: BIGINT + description: Nombre d'observations du couple (station, paramètre) + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: dim.station + silver.observation_v2 -> gold_ref.station_parametre -> gold_ref.station + - property: dataLicense + value: >- + Référentiel multi-sources (réseau participatif StatIC Infoclimat + stations + officielles Météo-France et autres producteurs), redistribué sous la politique + opendata Infoclimat ; les métadonnées officielles restent sous la licence de + leur producteur. + - property: attribution + value: Infoclimat / réseau StatIC + - property: activityWindow + value: >- + Le serving /ref/stations filtre par défaut sur derniere_activite >= aujourd'hui + - 365 jours (paramètre actif_depuis pour élargir/restreindre). From 3e719eb11632ea2ebdabbdcfd62c02e6c1886044 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Fri, 24 Jul 2026 11:06:58 +0200 Subject: [PATCH 16/31] contract(gold-canicule): socle observatoire canicule (station_insee, station_saison, territoire_saison) --- contracts/gold-canicule.odcs.yaml | 95 +++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 contracts/gold-canicule.odcs.yaml diff --git a/contracts/gold-canicule.odcs.yaml b/contracts/gold-canicule.odcs.yaml new file mode 100644 index 0000000..0762342 --- /dev/null +++ b/contracts/gold-canicule.odcs.yaml @@ -0,0 +1,95 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-canicule +name: gold-canicule +version: 0.1.0 +status: draft +domain: climatologie +dataProduct: gold-canicule +description: + purpose: > + Socle "observatoire canicule" : indicateurs de chaleur mesurés (nuits + tropicales, jours de forte chaleur) par station et par territoire INSEE + (commune/EPCI/département), avec rattachement géographique et comptage par + source (StatIC / Météo-France principale / secondaire). + usage: > + Alimente le serving canicule et les surfaces carte/bulletin destinées aux + collectivités. Données mesurées uniquement — aucune interpolation. + limitations: > + Ne matérialise que les territoires réellement mesurés (>= 1 station). Les + statuts approchée/angle mort sont résolus au serving. saison_annee = année + civile. +tags: [gold, diffusion, schema-canonique, canicule, climatologie] +servers: + - server: diffusion-iceberg + type: iceberg + environment: production + location: s3://chom-ic-lake-diffusion/gold_canicule +schema: + - name: station_insee + physicalName: gold_canicule.station_insee + physicalType: table + description: Rattachement station -> commune/EPCI/département + source. + properties: + - {name: station_uid, physicalType: TEXT, required: true, description: UID station canonique} + - {name: ic_id, physicalType: TEXT, required: false, description: identifiant Infoclimat} + - {name: source, physicalType: TEXT, required: true, description: statIC|mf_principale|mf_secondaire|autre} + - {name: latitude, physicalType: DOUBLE, required: true, description: latitude WGS84} + - {name: longitude, physicalType: DOUBLE, required: true, description: longitude WGS84} + - {name: insee_com, physicalType: TEXT, required: true, description: code INSEE commune} + - {name: nom_com, physicalType: TEXT, required: false, description: nom de la commune} + - {name: siren_epci, physicalType: TEXT, required: false, description: code SIREN de l'EPCI} + - {name: insee_dep, physicalType: TEXT, required: false, description: code département} + - name: station_saison + physicalName: gold_canicule.station_saison + physicalType: table + description: Indicateurs de chaleur par station et par année. + properties: + - {name: station_uid, physicalType: TEXT, required: true, description: UID station canonique} + - {name: ic_id, physicalType: TEXT, required: false, description: identifiant Infoclimat} + - {name: source, physicalType: TEXT, required: true, description: source de la station} + - {name: insee_com, physicalType: TEXT, required: true, description: code INSEE commune} + - {name: siren_epci, physicalType: TEXT, required: false, description: code SIREN EPCI} + - {name: insee_dep, physicalType: TEXT, required: false, description: code département} + - {name: latitude, physicalType: DOUBLE, required: true, description: latitude WGS84} + - {name: longitude, physicalType: DOUBLE, required: true, description: longitude WGS84} + - {name: saison_annee, physicalType: INTEGER, required: true, description: année civile} + - {name: nb_nuits_tropicales, physicalType: INTEGER, required: true, description: nb nuits Tn>=20 degC} + - {name: nb_jours_tx30, physicalType: INTEGER, required: true, description: nb jours Tx>=30 degC} + - {name: nb_jours_tx35, physicalType: INTEGER, required: true, description: nb jours Tx>=35 degC} + - {name: n_jours_tn, physicalType: INTEGER, required: true, description: nb jours avec Tn valide} + - {name: n_jours_tx, physicalType: INTEGER, required: true, description: nb jours avec Tx valide} + - name: territoire_saison + physicalName: gold_canicule.territoire_saison + physicalType: table + description: Roll-up par territoire INSEE + comptage source + rang historique. + properties: + - {name: niveau, physicalType: TEXT, required: true, description: commune|epci|departement} + - {name: code, physicalType: TEXT, required: true, description: code INSEE/SIREN du territoire} + - {name: saison_annee, physicalType: INTEGER, required: true, description: année civile} + - {name: n_stations, physicalType: INTEGER, required: true, description: nb stations mesurées} + - {name: n_statIC, physicalType: INTEGER, required: true, description: dont StatIC} + - {name: n_mf_principale, physicalType: INTEGER, required: true, description: dont MF principale} + - {name: n_mf_secondaire, physicalType: INTEGER, required: true, description: dont MF secondaire} + - {name: nuits_trop_moy, physicalType: DOUBLE, required: true, description: moyenne nuits tropicales} + - {name: nuits_trop_max, physicalType: INTEGER, required: true, description: max nuits tropicales} + - {name: jours_tx30_moy, physicalType: DOUBLE, required: true, description: moyenne jours Tx>=30} + - {name: jours_tx30_max, physicalType: INTEGER, required: true, description: max jours Tx>=30} + - {name: jours_tx35_moy, physicalType: DOUBLE, required: true, description: moyenne jours Tx>=35} + - {name: jours_tx35_max, physicalType: INTEGER, required: true, description: max jours Tx>=35} + - {name: rang_nuits_trop, physicalType: INTEGER, required: true, description: rang de l'année (1=plus chaude)} + - {name: n_saisons, physicalType: INTEGER, required: true, description: nb d'années disponibles} +team: + - username: pam + role: owner +support: + channel: data + tool: email + url: mailto:pamahe@proton.me +customProperties: + - property: lineage + value: gold_ref.station + communes IGN + INSEE COG -> gold_canicule.station_insee ; silver.observation_v2 + gold_canicule.station_insee -> gold_canicule.station_saison -> gold_canicule.territoire_saison + - property: dataLicense + value: à préciser (aligné legacy/v2 — données multi-sources StatIC + Météo-France) + - property: attribution + value: Infoclimat From 165a80c076e7a6917c3c99ebd51e4e85b32bbac5 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Fri, 24 Jul 2026 11:15:44 +0200 Subject: [PATCH 17/31] =?UTF-8?q?contract(gold-canicule):=20support=20en?= =?UTF-8?q?=20liste=20(conforme=20ODCS=20v3=20+=20contrats=20fr=C3=A8res)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/gold-canicule.odcs.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/gold-canicule.odcs.yaml b/contracts/gold-canicule.odcs.yaml index 0762342..244b0b4 100644 --- a/contracts/gold-canicule.odcs.yaml +++ b/contracts/gold-canicule.odcs.yaml @@ -83,9 +83,9 @@ team: - username: pam role: owner support: - channel: data - tool: email - url: mailto:pamahe@proton.me + - channel: data + tool: email + url: mailto:pamahe@proton.me customProperties: - property: lineage value: gold_ref.station + communes IGN + INSEE COG -> gold_canicule.station_insee ; silver.observation_v2 + gold_canicule.station_insee -> gold_canicule.station_saison -> gold_canicule.territoire_saison From 39ff3562f46a39abbc37c0bad4525e51b84c9767 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sun, 26 Jul 2026 09:04:14 +0200 Subject: [PATCH 18/31] contract(gold-canicule): 4e table commune_couverture (statut couverture par commune) --- contracts/gold-canicule.odcs.yaml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/contracts/gold-canicule.odcs.yaml b/contracts/gold-canicule.odcs.yaml index 244b0b4..8049159 100644 --- a/contracts/gold-canicule.odcs.yaml +++ b/contracts/gold-canicule.odcs.yaml @@ -79,6 +79,18 @@ schema: - {name: jours_tx35_max, physicalType: INTEGER, required: true, description: max jours Tx>=35} - {name: rang_nuits_trop, physicalType: INTEGER, required: true, description: rang de l'année (1=plus chaude)} - {name: n_saisons, physicalType: INTEGER, required: true, description: nb d'années disponibles} + - name: commune_couverture + physicalName: gold_canicule.commune_couverture + physicalType: table + description: Statut de couverture (mesuree/approchee/angle_mort) par commune INSEE, rayon 25 km. + properties: + - {name: insee_com, physicalType: TEXT, required: true, description: code INSEE commune} + - {name: statut, physicalType: TEXT, required: true, description: mesuree|approchee|angle_mort} + - {name: n_stations, physicalType: INTEGER, required: true, description: nb stations mesurées dans la commune} + - {name: nearest_station_uid, physicalType: TEXT, required: false, description: UID station mesurée la plus proche (si non mesuree)} + - {name: nearest_ic_id, physicalType: TEXT, required: false, description: ic_id de la station la plus proche} + - {name: nearest_km, physicalType: DOUBLE, required: false, description: distance à la station la plus proche (km)} + - {name: h3_maille, physicalType: TEXT, required: true, description: cellule H3 res 5 du centroïde communal} team: - username: pam role: owner @@ -88,7 +100,7 @@ support: url: mailto:pamahe@proton.me customProperties: - property: lineage - value: gold_ref.station + communes IGN + INSEE COG -> gold_canicule.station_insee ; silver.observation_v2 + gold_canicule.station_insee -> gold_canicule.station_saison -> gold_canicule.territoire_saison + value: gold_ref.station + communes IGN + INSEE COG -> gold_canicule.station_insee ; silver.observation_v2 + gold_canicule.station_insee -> gold_canicule.station_saison -> gold_canicule.territoire_saison ; gold_canicule.station_insee + communes IGN -> gold_canicule.commune_couverture (rayon 25 km) - property: dataLicense value: à préciser (aligné legacy/v2 — données multi-sources StatIC + Météo-France) - property: attribution From 7a1330849103785905f28200c079dee66c0731fc Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sun, 26 Jul 2026 09:10:54 +0200 Subject: [PATCH 19/31] =?UTF-8?q?contract(gold-canicule):=20limitations=20?= =?UTF-8?q?=C3=A0=20jour=20(commune=5Fcouverture=20pr=C3=A9calcul=C3=A9e?= =?UTF-8?q?=20toutes=20communes;=20plancher=201950)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/gold-canicule.odcs.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/contracts/gold-canicule.odcs.yaml b/contracts/gold-canicule.odcs.yaml index 8049159..f9730d7 100644 --- a/contracts/gold-canicule.odcs.yaml +++ b/contracts/gold-canicule.odcs.yaml @@ -16,9 +16,11 @@ description: Alimente le serving canicule et les surfaces carte/bulletin destinées aux collectivités. Données mesurées uniquement — aucune interpolation. limitations: > - Ne matérialise que les territoires réellement mesurés (>= 1 station). Les - statuts approchée/angle mort sont résolus au serving. saison_annee = année - civile. + station_saison / territoire_saison ne matérialisent que les territoires + réellement mesurés (>= 1 station). commune_couverture précalcule au contraire + le statut de couverture (mesuree/approchee/angle_mort) pour TOUTES les + communes métropolitaines (rayon 25 km ; DROM absents du référentiel géo). + saison_annee = année civile ; rang/n_saisons sur l'ère >= 1950 (normales OMM). tags: [gold, diffusion, schema-canonique, canicule, climatologie] servers: - server: diffusion-iceberg From f4831f2c07d06d893cf550aa0d699cc662693d9c Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:31:11 +0200 Subject: [PATCH 20/31] =?UTF-8?q?feat(contracts):=20gold=5FstatIC.stations?= =?UTF-8?q?=20=E2=80=94=20annuaire=20StatIC=20station=20=C3=97=20param?= =?UTF-8?q?=C3=A8tre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/gold-statIC.odcs.yaml | 56 +++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/contracts/gold-statIC.odcs.yaml b/contracts/gold-statIC.odcs.yaml index d548732..37ff144 100644 --- a/contracts/gold-statIC.odcs.yaml +++ b/contracts/gold-statIC.odcs.yaml @@ -191,6 +191,62 @@ schema: - name: ecart_type physicalType: DOUBLE description: Écart-type inter-stations des tm (dispersion, transparence) + - name: stations + physicalName: gold_statIC.stations + physicalType: table + description: >- + L'annuaire du réseau StatIC, triable par département : pour chaque station, + tous les paramètres réellement mesurés et leur profondeur temporelle + (première/dernière observation, volume). Grain : 1 ligne par + (station, paramètre). Stations fermées incluses — les colonnes ouverte et + derniere_obs permettent de filtrer. Dérivée de gold_ref (référentiel), + refresh quotidien. + properties: + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station StatIC (Infoclimat) + - name: libelle + physicalType: TEXT + description: Nom de la station + - name: departement + physicalType: TEXT + description: Département (code, ex. « 31 ») — null hors France + - name: pays + physicalType: TEXT + description: Code pays (ex. FR) + - name: latitude + physicalType: DOUBLE + required: true + - name: longitude + physicalType: DOUBLE + required: true + - name: altitude + physicalType: INTEGER + description: Altitude (m) + - name: ouverte + physicalType: BOOLEAN + required: true + description: Station encore ouverte dans le référentiel + - name: dh_ouverture + physicalType: TIMESTAMP + description: Date d'ouverture de la station + - name: parametre + physicalType: TEXT + required: true + description: Paramètre mesuré (vocabulaire canonique, cf. /params) + - name: premiere_obs + physicalType: TIMESTAMP + required: true + description: Première observation de ce paramètre sur cette station + - name: derniere_obs + physicalType: TIMESTAMP + required: true + description: Dernière observation de ce paramètre sur cette station + - name: n_obs + physicalType: BIGINT + required: true + description: Nombre total d'observations de ce paramètre team: - username: pam From 238215e947723a16c6455b925c08a478c9c61dc8 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 14:56:48 +0200 Subject: [PATCH 21/31] =?UTF-8?q?docs(gold-ref):=20publiable,=20libelle=5F?= =?UTF-8?q?source,=20et=20ic=5Fid=20d=C3=A9sign=C3=A9=20canonique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit station_uid était décrit comme « identifiant canonique » alors qu'il est un uuid5 dérivé de ic_id — donc pas plus stable que lui. C'est ic_id qui fait foi. Refs infoclimat-labs/chom-poc-data#8 --- contracts/gold-ref.odcs.yaml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/contracts/gold-ref.odcs.yaml b/contracts/gold-ref.odcs.yaml index 5832144..323dfa3 100644 --- a/contracts/gold-ref.odcs.yaml +++ b/contracts/gold-ref.odcs.yaml @@ -43,11 +43,17 @@ schema: - name: station_uid physicalType: TEXT required: true - description: Identifiant canonique de station (UUID) + description: >- + Pivot de jointure interne. uuid5(ns, "ic:" + ic_id) — DÉRIVÉ de ic_id, + donc pas plus stable que lui : il change si ic_id change. L'identifiant + canonique est ic_id. - name: ic_id physicalType: TEXT required: true - description: Identifiant station Infoclimat + description: >- + Identifiant station Infoclimat — IDENTIFIANT CANONIQUE, celui qui fait + foi. Hétérogène par conception (code OACI pour les metar, indicatif OMM + pour les synop, identifiant d'annuaire pour StatIC). - name: mfid physicalType: TEXT description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide @@ -59,6 +65,13 @@ schema: description: Type de poste Météo-France (principale/secondaire), sinon vide - name: libelle physicalType: TEXT + - name: libelle_source + physicalType: TEXT + description: >- + Libellé brut du référentiel amont, avant normalisation. Conservé pour + traçabilité : 13 087 libellés portent un préfixe laissé par l'import CSV + Météo-France (« TEST MF CSV … ») qui ne désigne PAS des stations de + test — ce sont des postes Météo-France réels. - name: latitude physicalType: DOUBLE required: true @@ -77,6 +90,14 @@ schema: description: Station déclarée ouverte dans l'annuaire - name: dh_ouverture physicalType: TIMESTAMP + - name: publiable + physicalType: BOOLEAN + required: true + description: >- + La station porte au moins une observation dans gold_ref.station_parametre. + Seul critère de quarantaine du référentiel diffusé : les endpoints + /stations et /ref/stations écartent les lignes à false par défaut + (publiable=0 les rouvre). - name: parametres_mesures physicalType: ARRAY description: Clés canoniques des paramètres réellement observés From 0775b3bf2ab04095490b6a40045d6cdfba02b529 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 15:38:14 +0200 Subject: [PATCH 22/31] fix(contracts): corrige la description de ic_id dans gold-ref (StatIC n'a aucun format) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le contrat affirmait à tort un « identifiant d'annuaire » pour StatIC. Aligne sur la formulation de référence : hétérogène par conception, aucune forme unique pour StatIC (00006, STATIC0253, MNWERO090). Refs infoclimat-labs/chom-poc-data#8 --- contracts/gold-ref.odcs.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/gold-ref.odcs.yaml b/contracts/gold-ref.odcs.yaml index 323dfa3..eee1ecb 100644 --- a/contracts/gold-ref.odcs.yaml +++ b/contracts/gold-ref.odcs.yaml @@ -52,8 +52,10 @@ schema: required: true description: >- Identifiant station Infoclimat — IDENTIFIANT CANONIQUE, celui qui fait - foi. Hétérogène par conception (code OACI pour les metar, indicatif OMM - pour les synop, identifiant d'annuaire pour StatIC). + foi. Hétérogène par conception : code OACI pour les metar (FMEE), + indicatif OMM à 5 chiffres pour les synop (61980). Les stations StatIC + n'ont AUCUNE forme unique (00006, STATIC0253, MNWERO090) : ne présumez + d'aucun format, lisez la valeur. - name: mfid physicalType: TEXT description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide From 8a5a6e14df667045669b1b21c26ac45d7e41ed74 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:25:24 +0200 Subject: [PATCH 23/31] =?UTF-8?q?chore:=20ignore=20.DS=5FStore=20et=20audi?= =?UTF-8?q?ts/bdd=20(volet=20commercial,=20d=C3=A9p=C3=B4t=20public)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 92c05b7..a94b999 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,10 @@ __pycache__/ # IDE .idea/ .vscode/ + +# macOS +.DS_Store + +# Réponse à l'appel d'offres BDD (BPU/DQE, mémoire technique, résumés CA) — +# volet commercial CONFIDENTIEL : ce dépôt est public, ces pièces n'y entrent pas. +audits/bdd/ From d04502110fa09b26bf2d62b5d15e22207b43ef14 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:25:24 +0200 Subject: [PATCH 24/31] =?UTF-8?q?docs(adr-0004):=20amendement=20NOTE-A=20?= =?UTF-8?q?=E2=80=94=20l'historique=20MF=20est=20en=20unit=C3=A9s=20r?= =?UTF-8?q?=C3=A9elles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'échantillonnage prod du 2026-07-12 (Horaire, années 1980/1989/2024) réfute la convention « MF au 1/10 » que l'ADR tenait du contrat source : les valeurs sont en unités réelles, facteur=1 dans tous les mappings. La mention MF « °C et 1/10 » est une précision décimale, pas un facteur d'échelle. Corrige les 3 contrats source qui propageaient la lecture erronée et acte la règle de méthode : toute unité douteuse se tranche par échantillon prod, jamais par le seul contrat. --- ...0004-vocabulaire-parametres-observation.md | 39 +++++++++++++++---- contracts/infrahoraire-mf.odcs.yaml | 1 + ...ce-meteofrance-climato-data-gouv.odcs.yaml | 2 +- contracts/source-meteofrance-dpclim.odcs.yaml | 1 + 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/adr/0004-vocabulaire-parametres-observation.md b/adr/0004-vocabulaire-parametres-observation.md index a9b869b..4e22cae 100644 --- a/adr/0004-vocabulaire-parametres-observation.md +++ b/adr/0004-vocabulaire-parametres-observation.md @@ -27,10 +27,12 @@ grandeur physique vit sous des formes incompatibles selon le système : - **Types** : `temperature` en `float` (synop/static), `tinyint` (metar — troncature au degré entier), `double` (bouées, mf_data) ; `nebulosite` en `enum('0'..'8')` ici, `int(2)` ou `tinyint(4)` là. -- **Unités** : conventions MF au 1/10 (°C, mm) dans l'historique Timescale, unités - usuelles converties (°C, hPa, m/s) dans les tables temps réel, SI (K, Pa) dans l'API - brute — le piège K vs °C est déjà documenté comme incohérence entre contrats - (`climato-mf-timescale` vs `horaire-mf-timescale`). +- **Unités** : unités RÉELLES (°C, hPa, mm) dans l'historique Timescale — corrigé par + l'amendement du 2026-07-13 ci-dessous : le contrat annonçait une convention au 1/10, + l'échantillonnage prod l'a réfutée — unités usuelles converties (°C, hPa, m/s) dans + les tables temps réel, SI (K, Pa) dans l'API brute ; le piège K vs °C est déjà + documenté comme incohérence entre contrats (`climato-mf-timescale` vs + `horaire-mf-timescale`). - **Support temporel encodé dans les noms de colonnes** : `pluie_1h`/`pluie_3h`/ `pluie_6h`/`pluie_12h`/`pluie_24h`/`pluie_cumul_0h`, `temperature_min`/`_max` sur des fenêtres implicites, `vent_rafales` vs `vent_rafales_10min` — la durée est une @@ -56,7 +58,8 @@ unique de vérité dont tables et outils dérivent. - `domaine` (bornes physiques plausibles min/max — socle des contrôles qualité) ; - `description_fr` ; - `sources` : le **mapping par système** — colonne famille IC (`synop.temperature`), - code MF historique (`T`, facteur 1/10), colonne temps réel (`t`, K), code `_H`, + code MF historique (`T`, facteur 1 — °C réels, amendement 2026-07-13), colonne + temps réel (`t`, K), code `_H`, élément ECA&D, id du dictionnaire `static_qualite` — avec pour chacun le facteur et l'offset de conversion vers l'unité SI. Ordre de grandeur : ~150 entrées ; la matière existe déjà (contrats @@ -110,9 +113,9 @@ unique de vérité dont tables et outils dérivent. ## Justification - **Les conversions d'unités deviennent structurellement uniques.** Un seul endroit - (le mapping) porte « MF historique = 1/10 °C » ; la conversion vers l'affichage vit - dans les vues Gold, une fois, testée. Le bug K vs °C cesse d'être possible par - construction. + (le mapping) porte par exemple « uv StatIC = centi-index, facteur 1/100 » (vérifié + par échantillon prod, revue A3) ; la conversion vers l'affichage vit dans les vues + Gold, une fois, testée. Le bug K vs °C cesse d'être possible par construction. - **Évolution additive sans ALTER.** Un nouveau capteur StatIC ou un nouveau champ MF = une entrée YAML + une ligne de mapping — pas de migration sur des tables de centaines de GiB, pas de bump majeur en cascade. @@ -142,6 +145,26 @@ unique de vérité dont tables et outils dérivent. conflits de MR fréquents), éclater par domaine (`parametres/{thermo,vent,precip}.yaml`) sans changer le contrat d'interface des vues. +## Amendement 2026-07-13 — unités de l'historique Timescale MF (NOTE-A) + +La version initiale de cet ADR affirmait, sur la foi du contrat +`source-meteofrance-*`, que l'historique Timescale MF suivait les « conventions +MF au 1/10 » (°C, mm stockés en dixièmes). **C'est faux, et corrigé** : +l'échantillonnage prod du 2026-07-12 (SELECT sur `Horaire`, années 1980/1989/ +2024 : T min −30,3 / max 36,9 / moyenne 13,1 en 1980 ; PMER en hPa réels) est +sans ambiguïté — **les valeurs sont en unités réelles, `facteur = 1`** dans +tous les mappings concernés du vocabulaire. + +Conséquences : +1. le contrat ODCS source est à corriger (il documentait une convention que la + donnée ne suit pas) ; +2. règle de méthode ajoutée à la revue A3 : **toute unité douteuse se tranche + par échantillon prod, jamais par le seul contrat ou la seule doc** (patron + `sample_unites`) — le contrat décrit une intention, l'échantillon décrit la + donnée ; +3. les 20 mappings encore `unite_incertaine` restent exclus de l'unpivot + (garde `load_vocab`) tant qu'ils n'ont pas leur échantillon. + ## Références - Étude R&D « évolution de schéma data » 2026-07-11 (§4.4, §8 mapping de convergence) diff --git a/contracts/infrahoraire-mf.odcs.yaml b/contracts/infrahoraire-mf.odcs.yaml index c76c3eb..0baeaa6 100644 --- a/contracts/infrahoraire-mf.odcs.yaml +++ b/contracts/infrahoraire-mf.odcs.yaml @@ -18,6 +18,7 @@ description: Unités : la table temps réel (InfrahoraireTempsReel) est en conventions météo usuelles — °C, hPa, m/s (vérifié en base le 2026-06-15). La table historique (Infrahoraire) suit les conventions MF (°C et 1/10, mm et 1/10). + Lecture correcte (NOTE-A, échantillon prod 2026-07-12, amendement ADR-0004) : « °C et 1/10 » = valeurs RÉELLES en °C à précision 0,1 — PAS un facteur x10 ; facteur=1 dans le vocabulaire. limitations: >- Couverture limitée aux stations MF. Les données temps réel peuvent être révisées par la passe historique. Pas de garantie de complétude par station (pannes capteurs). diff --git a/contracts/source-meteofrance-climato-data-gouv.odcs.yaml b/contracts/source-meteofrance-climato-data-gouv.odcs.yaml index 95638f2..3baced5 100644 --- a/contracts/source-meteofrance-climato-data-gouv.odcs.yaml +++ b/contracts/source-meteofrance-climato-data-gouv.odcs.yaml @@ -55,7 +55,7 @@ customProperties: auth: none probeUrl: https://object.files.data.gouv.fr/meteofrance/data/synchro_ftp/BASE/HOR/H_descriptif_champs.csv verified: "✅ open data (sans token)" - unitsNote: Unités CONVENTIONNELLES (°C, 1/10) — pas SI. Indicateur qualité Q* (ou C* pour DecadaireAgro). + unitsNote: "Unités CONVENTIONNELLES (°C, 1/10) — pas SI. Lecture correcte (NOTE-A, échantillon prod 2026-07-12, amendement ADR-0004) : « °C et 1/10 » = valeurs RÉELLES en °C à précision 0,1 — PAS un facteur x10 ; facteur=1 dans le vocabulaire. Indicateur qualité Q* (ou C* pour DecadaireAgro)." descriptor: BASE/{FREQ}/{FREQ}_descriptif_champs.csv (ex. H_descriptif_champs.csv) quirks: - Sans auth (Licence Ouverte Etalab 2.0). diff --git a/contracts/source-meteofrance-dpclim.odcs.yaml b/contracts/source-meteofrance-dpclim.odcs.yaml index 5e983d5..01b22bd 100644 --- a/contracts/source-meteofrance-dpclim.odcs.yaml +++ b/contracts/source-meteofrance-dpclim.odcs.yaml @@ -12,6 +12,7 @@ description: Contrat de la SOURCE API DPClim (climatologie stations, données historiques sur commande) — référentiel stations + commandes de fichiers CSV horaire / infrahoraire / quotidien / mensuel / décadaire / décadaire-agro. Schéma en unités CONVENTIONNELLES (°C, 1/10, m/s). + Lecture correcte (NOTE-A, échantillon prod 2026-07-12, amendement ADR-0004) : « °C et 1/10 » = valeurs RÉELLES en °C à précision 0,1 — PAS un facteur x10 ; facteur=1 dans le vocabulaire. usage: >- Consommé par les pipelines d'ingestion climatologie. Workflow asynchrone : POST /commande-station/{freq} → id de commande → GET /commande/fichier?id-cmde={id} → CSV. From 737333011f17b5ef19c6b8d66f2bac95852113f0 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:25:33 +0200 Subject: [PATCH 25/31] =?UTF-8?q?docs(adr-0007):=20amendement=20=E2=80=94?= =?UTF-8?q?=20obs=5Flast.source=5Fprio=20(pr=C3=A9s=C3=A9ance=20=C3=A0=20l?= =?UTF-8?q?'upsert)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La coquille obs_last déployée en POC D1 ne stocke pas la source, alors que la règle de préséance A2 (« une source moins prioritaire ne remplace jamais une valeur plus prioritaire au même dh_utc ») en a besoin pour arbitrer et éviter le ping-pong D2/D2b. Ajoute source_prio smallint (rang de préséance, comparable directement, plus compact qu'un source_id + jointure) et fixe l'ordre v1. --- adr/0007-serving-chaud-modele-canonique.md | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/adr/0007-serving-chaud-modele-canonique.md b/adr/0007-serving-chaud-modele-canonique.md index bfcd07a..294946b 100644 --- a/adr/0007-serving-chaud-modele-canonique.md +++ b/adr/0007-serving-chaud-modele-canonique.md @@ -148,6 +148,34 @@ moteur du chaud ; si la rétention nécessaire dépasse ~3-4 ans (usage réel de pages), la frontière chaud/froid d'ADR-0006 est à recalibrer avant d'agrandir le chaud. +## Amendement 2026-07-16 — `obs_last.source_prio` (préséance à l'upsert) + +Le POC D1 a révélé que la coquille `obs_last` déployée (PK `station_id, +parametre_id, duree_s` ; colonnes `dh_utc, valeur, qc_flag`) **ne stocke pas +la source** — or la règle de préséance A2 à l'upsert (« une source moins +prioritaire ne remplace jamais une valeur plus prioritaire au même dh_utc », +qui empêche le ping-pong entre D2 et D2b sur la même case) a besoin de +connaître la source de la valeur en place pour arbitrer. + +**Décision (pam, 16/07)** : ajouter `source_prio smallint NOT NULL` à +`obs_last` — le **rang de préséance** (petit = prioritaire), directement +comparable, plus compact qu'un `source_id` + jointure. Ordre v1 (préséance A2, +AMB-1 « natif IC prioritaire par défaut ») : + +| source_prio | source | | +|---|---|---| +| 0 | moderation (saisie humaine) | AMB-3, priorité absolue | +| 10-14 | synop-ic, static-ic, metar-ic, bouees-ic, mae-ic | natif IC | +| 20-22 | mf-h, mf-i, mf-q | Météo-France | + +Règle d'upsert : `ON CONFLICT (station_id, parametre_id, duree_s) DO UPDATE` +si `excluded.dh_utc > obs_last.dh_utc` (récence) **OU** (`=` ET +`excluded.source_prio < obs_last.source_prio`, préséance à dh_utc égal). +Backfill équivalent : par clé, `ORDER BY dh_utc DESC, source_prio ASC LIMIT 1`. +Les exceptions par paramètre d'AMB-1 (certains params où MF écrase) sont une +**raffinement Gold/v2**, pas portées dans ce rang total v1 (obs_last = +« dernière valeur » live, IC-natif-gagne par défaut est défendable). + ## Références - Étude compagnon « serving chaud » 2026-07-11 (workspace — DDL cible complet, From 011b0f23fb375a0e6a842781a79a16ee96e2e881 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:25:33 +0200 Subject: [PATCH 26/31] =?UTF-8?q?feat(rgpd):=20registre=20art.=2030=20v2?= =?UTF-8?q?=20=E2=80=94=20en-t=C3=AAte=20responsable/socle=20+=20champs=20?= =?UTF-8?q?manquants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit traitements.yaml v2 : en-tête meta (responsable de traitement, socle de sécurité commun, réserve juridique) et 4 champs par fiche — destinataires, transferts hors-UE, localisation, securite — calqués sur un registre art. 30 de référence. Les fiches sans `securite` retombent sur le socle commun. Sépare explicitement le factuel data (renseigné ici depuis l'inventaire et le code) des champs juridiques, qui restent « à confirmer » par le bureau. Générateur mis à jour (rendu des nouveaux champs, _flat mutualisé) et registre régénéré. --- audits/rgpd/README.md | 17 +++++++---- audits/rgpd/registre-traitements.md | 31 ++++++++++++++++++-- audits/rgpd/traitements.yaml | 45 +++++++++++++++++++++++++++-- tools/build_rgpd_register.py | 28 ++++++++++++++---- 4 files changed, 106 insertions(+), 15 deletions(-) diff --git a/audits/rgpd/README.md b/audits/rgpd/README.md index 7f2d33e..ba7f187 100644 --- a/audits/rgpd/README.md +++ b/audits/rgpd/README.md @@ -6,18 +6,25 @@ dans le système d'information, regroupées par finalité. | Fichier | Rôle | |---|---| -| `traitements.yaml` | **Source** — traitements (finalité, personnes, données, base légale, conservation) et tables rattachées. À éditer ici. | +| `traitements.yaml` | **Source** — en-tête `meta` (responsable, socle de sécurité, réserve juridique) + traitements (finalité, personnes, données, destinataires, transferts, base légale, conservation, localisation, sécurité) et tables rattachées. À éditer ici. | | `registre-traitements.md` | **Généré** par `tools/build_rgpd_register.py`. Ne pas éditer à la main. | +Modèle de fiche calqué sur un registre art. 30 de référence. Champs par traitement : +`finalite`, `personnes`, `donnees`, `destinataires?`, `transferts?`, `base_legale`, +`conservation`, `localisation`, `securite?`, `contrat?`, `note?`, `tables` (les `?` sont +optionnels — une fiche sans `securite` retombe sur le socle commun de l'en-tête). + ## Périmètre et limites - Le **périmètre des données personnelles** fait foi depuis `inventory/tables.yaml` (flag `personal_data: true`). Le générateur échoue si une table flaggée manque au registre ou inversement — le registre ne peut pas dériver en silence de l'inventaire. -- Les champs **juridiques** (base légale, durée de conservation, mesures de sécurité, - exercice des droits) relèvent du **bureau de l'association** et sont à confirmer. Ce - volet documente le *factuel data* (quelles données, où, pour quelle finalité), pas la - position légale arrêtée. +- Le **factuel data** (quelles données, où — `localisation`, destinataires/transferts + constatés, mesures de sécurité techniques connues) est renseigné par le volet + data-platform à partir de l'inventaire et du code. +- Les champs **juridiques** (base légale, durée de conservation, qualification des + transferts, exercice des droits) relèvent du **bureau de l'association** et restent + marqués « à confirmer » : ce sont des constats, pas la position légale arrêtée. ## Régénérer / vérifier diff --git a/audits/rgpd/registre-traitements.md b/audits/rgpd/registre-traitements.md index 5b916bf..30286c0 100644 --- a/audits/rgpd/registre-traitements.md +++ b/audits/rgpd/registre-traitements.md @@ -4,10 +4,12 @@ Ce registre recense **où vivent les données personnelles** dans le système d'information, regroupées par finalité. Il constitue la contribution technique de la data-platform au registre des traitements de l'association (art. 30 RGPD). -Les champs juridiques (**base légale**, **durée de conservation**, mesures de sécurité) relèvent du bureau de l'association et sont à confirmer — ils figurent ici en l'état pour être complétés, non comme position arrêtée. - **10 traitements**, **32 tables** porteuses de données personnelles (source de vérité du périmètre : `inventory/tables.yaml`, flag `personal_data`). +- **Responsable de traitement** : Association Infoclimat (responsable de traitement). Délégué / référent à la protection des données : à désigner — bureau. +- **Socle de sécurité commun** : Hébergement auto-hébergé (Proxmox/LXC, infrastructure interne) ; accès réseau restreint ; chiffrement TLS en bordure (Cloudflare) ; base principale répliquée. Le détail d'exploitation (adresses, ports, sauvegardes) est tenu en interne. +- **Réserve juridique** : Base légale, durée de conservation, destinataires et transferts hors-UE doivent être validés par le bureau. Les valeurs « à confirmer » sont des constats data, pas une position juridique arrêtée. + ## Gestion des comptes utilisateurs et de l'authentification - **Identifiant** : `comptes-authentification` @@ -15,6 +17,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Identité (pseudo), secret (mot de passe haché), email de contact, IP et user-agent de connexion, jetons de session et de réinitialisation - **Base légale** : à confirmer (exécution du service / consentement à l'inscription) - **Conservation** : à confirmer (jetons à expiration ; comptes ?) +- **Localisation** : MariaDB `ct-mariadb-1` (table `connectes` en ENGINE=MEMORY, fenêtre ~5 min) +- **Mesures de sécurité** : Mots de passe hachés ; jetons de session et de réinitialisation à expiration - **Contrat de données** : [`v5-comptes-utilisateurs`](../../contracts/v5-comptes-utilisateurs.odcs.yaml) - **Tables** : - `mariadb://V5/comptes` @@ -29,8 +33,12 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Identifiant** : `applications-mobiles` - **Personnes concernées** : Utilisateurs des applications iOS/Android - **Données** : Jetons d'appareil (APNS/FCM), paramètres applicatifs liés au compte +- **Destinataires** : Apple Push Notification service (APNS) et Google Firebase Cloud Messaging (FCM) pour l'acheminement des notifications +- **Transferts hors-UE** : Oui — Apple / Google (États-Unis), hors UE — encadrement à confirmer (bureau) - **Base légale** : à confirmer (consentement aux notifications) - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : — - **Tables** : - `mariadb://V5/apns_devices` @@ -45,6 +53,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Lien compte (id_compte), géolocalisation des contributions, contenus, messages privés - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : Messages privés (`mp_mp`) — chiffrement au repos à confirmer (bureau) - **Contrat de données** : [`photolive`](../../contracts/photolive.odcs.yaml) - **Tables** : - `mariadb://V5/personnes` @@ -58,8 +68,12 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Identifiant** : `vie-associative` - **Personnes concernées** : Adhérents de l'association - **Données** : Identité, coordonnées, paiements (dont HelloAsso), pouvoirs de vote +- **Destinataires** : HelloAsso (encaissement des cotisations / dons en ligne) +- **Transferts hors-UE** : Non (HelloAsso — France / UE) — à confirmer (bureau) - **Base légale** : à confirmer (obligation légale comptable / exécution de l'adhésion) - **Conservation** : à confirmer (obligations comptables et statutaires) +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : — - **Tables** : - `mariadb://asso/asso_adherants` @@ -72,8 +86,11 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Identifiant** : `boutique` - **Personnes concernées** : Clients de la boutique - **Données** : Identité, coordonnées de livraison, données de commande +- **Destinataires** : Prestataires de paiement et de livraison — à confirmer (bureau) - **Base légale** : à confirmer (exécution du contrat de vente) - **Conservation** : à confirmer (obligations comptables) +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : — - **Tables** : - `mariadb://V5/boutique_commandes` @@ -85,6 +102,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Lien compte, inscriptions - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : — - **Tables** : - `mariadb://concoursprevi/participants_v5` @@ -97,6 +116,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Lien compte, pseudo, périmètre d'habilitation - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : [`previsions-bulletins`](../../contracts/previsions-bulletins.odcs.yaml) - **Tables** : - `mariadb://V5_prevs/previsionnistes` @@ -109,6 +130,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Lien compte propriétaire, adresses IP des stations - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : Authentification HMAC des stations autonomes (serveur-station-autonome) - **Contrat de données** : [`static-stations-obs`](../../contracts/static-stations-obs.odcs.yaml) - **Tables** : - `mariadb://V5_data_params/static_ip` @@ -121,6 +144,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Identifiants FTP - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` (table d'auth ProFTPD) +- **Mesures de sécurité** : Transport FTP (en clair ?) — à confirmer (bureau) - **Contrat de données** : — - **Tables** : - `mariadb://proftpd/ftpuser` @@ -132,6 +157,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Profils et sessions des membres - **Base légale** : à confirmer - **Conservation** : gérée par IPBoard — hors périmètre data-platform +- **Localisation** : MariaDB `ct-mariadb-1`, via l'application tierce IPBoard (gestion autonome) +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : [`forums2-ipboard`](../../contracts/forums2-ipboard.odcs.yaml) - **Note** : Base applicative tierce (IPBoard), gestion autonome. Les tables forums/ibf_* sont mortes (ancienne version, candidates à suppression — à confirmer côté RGPD). - **Tables** : diff --git a/audits/rgpd/traitements.yaml b/audits/rgpd/traitements.yaml index cff5a2c..e1c8701 100644 --- a/audits/rgpd/traitements.yaml +++ b/audits/rgpd/traitements.yaml @@ -3,12 +3,32 @@ # Recense OÙ vivent les données personnelles dans le SI, regroupées par finalité. # C'est la contribution technique de la data-platform au registre des traitements # de l'association (art. 30 RGPD) — les champs juridiques (base légale, durée de -# conservation, mesures de sécurité) relèvent du bureau et restent à confirmer. +# conservation) relèvent du bureau et restent à confirmer. # # Chaque table `personal_data: true` de inventory/tables.yaml DOIT figurer ici # (sinon `tools/build_rgpd_register.py` échoue). Réciproquement, retirer une table # de l'inventaire impose de la retirer ici. -version: 1 +# +# Champs par traitement (modèle art. 30, calqué sur un registre de référence) : +# finalite, personnes, donnees, destinataires?, transferts?, base_legale, +# conservation, localisation, securite?, contrat?, note?, tables +# Les champs `?` sont optionnels (omis = retombe sur le socle commun de `meta`). +version: 2 + +# Identité et socle communs à tous les traitements (art. 30, en-tête du registre). +meta: + responsable: >- + Association Infoclimat (responsable de traitement). Délégué / référent à la + protection des données : à désigner — bureau. + socle_securite: >- + Hébergement auto-hébergé (Proxmox/LXC, infrastructure interne) ; accès réseau + restreint ; chiffrement TLS en bordure (Cloudflare) ; base principale répliquée. + Le détail d'exploitation (adresses, ports, sauvegardes) est tenu en interne. + note_juridique: >- + Base légale, durée de conservation, destinataires et transferts hors-UE doivent + être validés par le bureau. Les valeurs « à confirmer » sont des constats data, + pas une position juridique arrêtée. + traitements: - id: comptes-authentification finalite: Gestion des comptes utilisateurs et de l'authentification @@ -16,6 +36,8 @@ traitements: donnees: Identité (pseudo), secret (mot de passe haché), email de contact, IP et user-agent de connexion, jetons de session et de réinitialisation base_legale: à confirmer (exécution du service / consentement à l'inscription) conservation: à confirmer (jetons à expiration ; comptes ?) + localisation: MariaDB `ct-mariadb-1` (table `connectes` en ENGINE=MEMORY, fenêtre ~5 min) + securite: Mots de passe hachés ; jetons de session et de réinitialisation à expiration contrat: v5-comptes-utilisateurs tables: - mariadb://V5/comptes @@ -29,8 +51,11 @@ traitements: finalite: Notifications push et paramètres des applications mobiles personnes: Utilisateurs des applications iOS/Android donnees: Jetons d'appareil (APNS/FCM), paramètres applicatifs liés au compte + destinataires: Apple Push Notification service (APNS) et Google Firebase Cloud Messaging (FCM) pour l'acheminement des notifications + transferts: Oui — Apple / Google (États-Unis), hors UE — encadrement à confirmer (bureau) base_legale: à confirmer (consentement aux notifications) conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` contrat: null tables: - mariadb://V5/apns_devices @@ -44,6 +69,8 @@ traitements: donnees: Lien compte (id_compte), géolocalisation des contributions, contenus, messages privés base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` + securite: Messages privés (`mp_mp`) — chiffrement au repos à confirmer (bureau) contrat: photolive tables: - mariadb://V5/personnes @@ -56,8 +83,11 @@ traitements: finalite: Gestion des adhérents, cotisations et votes de l'association personnes: Adhérents de l'association donnees: Identité, coordonnées, paiements (dont HelloAsso), pouvoirs de vote + destinataires: HelloAsso (encaissement des cotisations / dons en ligne) + transferts: Non (HelloAsso — France / UE) — à confirmer (bureau) base_legale: à confirmer (obligation légale comptable / exécution de l'adhésion) conservation: à confirmer (obligations comptables et statutaires) + localisation: MariaDB `ct-mariadb-1` contrat: null tables: - mariadb://asso/asso_adherants @@ -69,8 +99,10 @@ traitements: finalite: Traitement des commandes de la boutique personnes: Clients de la boutique donnees: Identité, coordonnées de livraison, données de commande + destinataires: Prestataires de paiement et de livraison — à confirmer (bureau) base_legale: à confirmer (exécution du contrat de vente) conservation: à confirmer (obligations comptables) + localisation: MariaDB `ct-mariadb-1` contrat: null tables: - mariadb://V5/boutique_commandes @@ -81,6 +113,7 @@ traitements: donnees: Lien compte, inscriptions base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` contrat: null tables: - mariadb://concoursprevi/participants_v5 @@ -92,6 +125,7 @@ traitements: donnees: Lien compte, pseudo, périmètre d'habilitation base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` contrat: previsions-bulletins tables: - mariadb://V5_prevs/previsionnistes @@ -103,6 +137,8 @@ traitements: donnees: Lien compte propriétaire, adresses IP des stations base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` + securite: Authentification HMAC des stations autonomes (serveur-station-autonome) contrat: static-stations-obs tables: - mariadb://V5_data_params/static_ip @@ -114,6 +150,8 @@ traitements: donnees: Identifiants FTP base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` (table d'auth ProFTPD) + securite: Transport FTP (en clair ?) — à confirmer (bureau) contrat: null tables: - mariadb://proftpd/ftpuser @@ -124,10 +162,11 @@ traitements: donnees: Profils et sessions des membres base_legale: à confirmer conservation: gérée par IPBoard — hors périmètre data-platform - contrat: forums2-ipboard + localisation: MariaDB `ct-mariadb-1`, via l'application tierce IPBoard (gestion autonome) note: >- Base applicative tierce (IPBoard), gestion autonome. Les tables forums/ibf_* sont mortes (ancienne version, candidates à suppression — à confirmer côté RGPD). + contrat: forums2-ipboard tables: - mariadb://forums2/core_members - mariadb://forums2/core_sessions diff --git a/tools/build_rgpd_register.py b/tools/build_rgpd_register.py index 8a8df3c..1c23ec6 100644 --- a/tools/build_rgpd_register.py +++ b/tools/build_rgpd_register.py @@ -36,9 +36,15 @@ def check(data: dict, inventory: set[str]) -> list[str]: return errors +def _flat(value) -> str: + """Aplatit un scalaire YAML multi-ligne (bloc `>-`) en une ligne.""" + return ' '.join(str(value).split()) + + def render(data: dict, inventory: set[str]) -> str: n_tr = len(data['traitements']) n_tab = len({t for tr in data['traitements'] for t in tr['tables']}) + meta = data.get('meta', {}) lines = [ "# Registre des traitements de données personnelles — volet data-platform", "", @@ -49,22 +55,34 @@ def render(data: dict, inventory: set[str]) -> str: "d'information, regroupées par finalité. Il constitue la contribution technique " "de la data-platform au registre des traitements de l'association (art. 30 RGPD).", "", - "Les champs juridiques (**base légale**, **durée de conservation**, mesures de " - "sécurité) relèvent du bureau de l'association et sont à confirmer — ils figurent " - "ici en l'état pour être complétés, non comme position arrêtée.", - "", f"**{n_tr} traitements**, **{n_tab} tables** porteuses de données personnelles " f"(source de vérité du périmètre : `inventory/tables.yaml`, flag `personal_data`).", "", ] + if meta.get('responsable'): + lines += [f"- **Responsable de traitement** : {_flat(meta['responsable'])}"] + if meta.get('socle_securite'): + lines += [f"- **Socle de sécurité commun** : {_flat(meta['socle_securite'])}"] + if meta.get('note_juridique'): + lines += [f"- **Réserve juridique** : {_flat(meta['note_juridique'])}"] + lines.append("") + for tr in data['traitements']: lines.append(f"## {tr['finalite']}") lines.append("") lines.append(f"- **Identifiant** : `{tr['id']}`") lines.append(f"- **Personnes concernées** : {tr['personnes']}") lines.append(f"- **Données** : {tr['donnees']}") + if tr.get('destinataires'): + lines.append(f"- **Destinataires** : {_flat(tr['destinataires'])}") + if tr.get('transferts'): + lines.append(f"- **Transferts hors-UE** : {_flat(tr['transferts'])}") lines.append(f"- **Base légale** : {tr['base_legale']}") lines.append(f"- **Conservation** : {tr['conservation']}") + if tr.get('localisation'): + lines.append(f"- **Localisation** : {_flat(tr['localisation'])}") + lines.append(f"- **Mesures de sécurité** : " + f"{_flat(tr['securite']) if tr.get('securite') else 'socle commun (cf. en-tête)'}") contrat = tr.get('contrat') if contrat: lines.append(f"- **Contrat de données** : [`{contrat}`]" @@ -72,7 +90,7 @@ def render(data: dict, inventory: set[str]) -> str: else: lines.append("- **Contrat de données** : —") if tr.get('note'): - lines.append(f"- **Note** : {' '.join(str(tr['note']).split())}") + lines.append(f"- **Note** : {_flat(tr['note'])}") lines.append("- **Tables** :") for t in tr['tables']: dead = t not in inventory From 0dec7140b85d62053b16ca975e3f33780ed1a34d Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:25:44 +0200 Subject: [PATCH 27/31] =?UTF-8?q?feat(catalog):=20preseance.yaml=20v1.0.0?= =?UTF-8?q?=20=E2=80=94=20r=C3=A8gles=20de=20fusion=20des=20sources=20(lot?= =?UTF-8?q?=20A2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Transcription des règles de préséance du monolithe (combined.php, climato.php, tableaux.php, stations.inc.php) en table déclarative : chaque règle cite sa source fichier:ligne, chaque ambiguïté (AMB-1..9) porte sa décision. Validé et gelé le 2026-07-14 après contre-revue sceptique du 13/07. 14 tests de non-régression : la table ne peut plus dériver du code cité sans casser un test. --- catalog/preseance.yaml | 195 ++++++++++++++++++++++++++++++++++ tools/tests/test_preseance.py | 110 +++++++++++++++++++ 2 files changed, 305 insertions(+) create mode 100644 catalog/preseance.yaml create mode 100644 tools/tests/test_preseance.py diff --git a/catalog/preseance.yaml b/catalog/preseance.yaml new file mode 100644 index 0000000..edc836f --- /dev/null +++ b/catalog/preseance.yaml @@ -0,0 +1,195 @@ +# Table de préséance des sources — transcription des règles de fusion du +# monolithe (lot A2 du chantier schéma canonique, ADR-0004/0007). +# +# STATUT : VALIDÉ ET GELÉ le 2026-07-14 (pam) — v1.0.0. Décisions actées le +# 13/07 (adoption des recommandations issues de la contre-revue sceptique), +# consultation Discord rendue sans objet par la validation directe. Toute +# réouverture passe par une nouvelle version majeure. Chaque règle cite sa +# source fichier:ligne dans le monolithe ; chaque ambiguïté porte sa décision. +# Reste ouvert (hors gel, porté par D1/E3) : la revue champ par champ des +# exceptions MF d'AMB-1 au moment d'implémenter la fusion obs_last. +# +# Sémantique : `priorite` = liste ordonnée, LA PREMIÈRE VALEUR NON NULLE GAGNE +# (transcription des COALESCE SQL). `regle` explicite les autres mécanismes +# (ecrase, min, max, premier_charge…). + +meta: + version: 1.0.0 + date_extraction: "2026-07-12" + date_decisions: "2026-07-13" + statut_decisions: "VALIDÉ-GELÉ (pam, 14/07) — v1.0.0" + contre_revue: "2026-07-13 — chaque AMB attaquée par un agent sceptique (code, + appelants, git log) ; corrections intégrées : lignes climato décalées, + AMB-5/6 = code mort, AMB-3 = masquage affichage (aucune écriture base dans + climato.php), max() rr/ens introduit 2025-03-21, bloc enneigement = toute + synop FR >= 2021 ; AMB-8/AMB-9 ajoutées" + fichiers_analyses: + - include/MeteoFrance/combined.php + - stations-meteo/climato.php + - stations-meteo/tableaux.php + - stations-meteo/stations.inc.php + - include/MeteoFrance/load_data.php + - mobile-api/inc/station-meteo_api.model.php + statut: valide-gele-v1 + +# Dictionnaire des sources (aligne dim_source du modèle canonique) +sources: + synop-ic: {description: "réseau IC synop, shards V5_data_YYYY.synop_*"} + static-ic: {description: "réseau IC StatIC, shards static_*"} + metar-ic: {description: "réseau IC metar, shards metar_*"} + mf-h: {description: "Météo-France archive horaire (mf_data H)"} + mf-htr: {description: "Météo-France temps réel horaire (HTR)"} + mf-i: {description: "Météo-France archive infra-horaire 6 min (I)"} + mf-itr: {description: "Météo-France temps réel infra-horaire (ITR)"} + mf-noaa: {description: "MF via fichiers NOAA (mf_data['noaa'])"} + eca: {description: "ECA&D, tables eca_*_FR (1881-1999)"} + gsod: {description: "NOAA GSOD (1975-2010)"} + climato-auto: {description: "climato_journaliere_auto (agrégats IC)"} + climato-manu: {description: "climato_journaliere_injectee (saisie manuelle, tag MANU)"} + nivose: {description: "enneigement NIVOSE (synop FR, an >= 2021)"} + +# --------------------------------------------------------------------------- +# CONTEXTE 1 — SQL combined.php : fusion intra-MF (tables H/HTR/I/ITR) +# Règle transversale : H > HTR > I/ITR, câblée dans l'ordre des COALESCE. +# --------------------------------------------------------------------------- +sql_combined: + regle_globale: "archive horaire (H) > temps réel horaire (HTR) > infra-horaire (I/ITR)" + ordres_standards: # fonctions adapted_to_synop/mf *_from_at (COALESCE croisés) + id_station: {priorite: [mf-i.NUM_POSTE, mf-itr.geo_id_insee, mf-h.NUM_POSTE, mf-htr.geo_id_insee], source: "combined.php:26,414"} + dh_utc: {priorite: [mf-i.AAAAMMJJHHMN, mf-itr.validity_time, mf-h.AAAAMMJJHH, mf-htr.validity_time], source: "combined.php:27,415"} + temperature: {priorite: [mf-h.T, mf-htr.t, mf-itr.t], source: "combined.php:28,434"} + pression: {priorite: [mf-h.PMER, mf-h.PSTAT, mf-htr.pmer, mf-htr.pres, mf-itr.pmer, mf-itr.pres], source: "combined.php:29,457"} + humidite: {priorite: [mf-h.U, mf-htr.u, mf-itr.u], source: "combined.php:31,449"} + point_de_rosee: {priorite: [mf-h.TD, mf-htr.td, mf-itr.td], source: "combined.php:32,435"} + visibilite: {priorite: [mf-h.VV, mf-htr.vv, mf-itr.vv], source: "combined.php:33,478"} + vent_moyen: {priorite: [mf-h.FF, mf-h.FF2, mf-htr.ff, mf-itr.ff], conversion: "x3.6 (m/s -> km/h)", source: "combined.php:34,418"} + vent_rafales: {priorite: [mf-h.FXI3S, mf-h.FXI, mf-h.FXY, mf-h.FXI2, mf-htr.raf, mf-htr.fxi, mf-htr.fxy, mf-itr.raf10, mf-itr.fxi10, mf-h.FF, mf-h.FF2, mf-htr.ff, mf-itr.ff], conversion: "x3.6", note: "fallback final sur le vent moyen", source: "combined.php:35,423"} + vent_rafales_10min: {priorite: [mf-h.FXY, mf-h.FXI, mf-h.FXI2, mf-h.FXI3S, mf-htr.fxy, mf-htr.raf, mf-htr.fxi, mf-itr.raf10, mf-itr.fxi10, mf-h.FF, mf-h.FF2, mf-htr.ff, mf-itr.ff], conversion: "x3.6", source: "combined.php:36,420"} + vent_direction: {priorite: [mf-h.DD, mf-h.DD2, mf-htr.dd, mf-itr.dd], source: "combined.php:37,419"} + temperature_min: {priorite: [mf-h.TN, mf-htr.tn, mf-h.TNSOL, mf-h.TN50], source: "combined.php:38,436"} + temperature_max: {priorite: [mf-h.TX, mf-htr.tx], source: "combined.php:39,438"} + pluie_6mn: {priorite: [mf-i.RR, mf-itr.rr_per], source: "combined.php:40"} + pluie_1h: {priorite: [mf-h.RR1, mf-htr.rr1], source: "combined.php:41,416"} + rayonnement_glo: {priorite: [mf-h.GLO, mf-h.GLO2, mf-h.UV, mf-h.UV2, mf-htr.ray_glo01, mf-itr.ray_glo01], source: "combined.php:49-50,495"} + ensoleillement: {priorite: [mf-h.INS, mf-htr.insolh, mf-itr.insolh, mf-h.INS2], source: "combined.php:51,501"} + neige_au_sol: {priorite: [mf-h.NEIGETOT, mf-htr.sss, mf-itr.sss], conversion: "sss x100 (m -> cm)", source: "combined.php:58,490"} + nebulosite: {priorite: [mf-h.N, mf-h.NBAS, mf-h.N1, mf-h.N2, mf-h.N3, mf-h.N4, mf-htr.n, mf-itr.n], source: "combined.php:461"} + sol_etat: {priorite: [mf-h.SOL, mf-htr.etat_sol, mf-itr.etat_sol], source: "combined.php:483"} + profondeur_temp: {priorite: [mf-h.T10, mf-htr.t_10, mf-itr.t_10], note: "idem T20/T50/T100", source: "combined.php:441-444"} + variantes: + - contexte: "fonctions *_from_between (blocs H / HTR / ITR unionnés)" + regle: "AUCUN fallback croisé entre tables — chaque bloc mono-source, ordres internes identiques" + source: "combined.php:116-149,299-334,557-655,857-957,1148-1151" + - contexte: "get_combined_adapted_to_mf_from_between_H — ⚠️ CODE MORT (contre-revue 13/07 : seul appelant = _merged_manually:1565, lui-même jamais appelé)" + champ: rayonnement_glo + priorite: [mf-h.UV, mf-h.UV2, mf-h.GLO] + note: "ORDRE INVERSÉ (UV avant GLO) — seule inversion sur 16 COALESCE GLO/UV du fichier (15 GLO-first), sans commentaire ; sans effet à l'exécution (code mort)" + source: "combined.php:1429" + - contexte: "get_combined_adapted_to_mf_from_between_H — ⚠️ CODE MORT (idem)" + champ: neige_au_sol + priorite: [mf-h.NEIGETOT, mf-h.HNEIGEFI1] + note: "fallback sur neige fraîche 1h — unique" + source: "combined.php:1424" + - contexte: "ordre majoritaire réel (contre-revue) : famille synop = COALESCE(GLO, GLO2, UV, UV2) (6 occ., l.49-50,124-125,307-308) ; famille mf = COALESCE(GLO, UV, UV2) SANS GLO2 (8 occ., ex. l.495,632,2702) ; l.2106 (get_live_for_mobile_api, pas get_image_mf_data) = somme de composantes" + champ: rayonnement_glo + - contexte: "get_image_mf_data (rayo)" + regle: "somme de composantes : GLO, sinon GLO2, sinon UV+INFRAR, sinon UV2+INFRAR2, sinon DIR+DIF, sinon DIR2+DIF2" + source: "combined.php:2106" + - contexte: "get_combined_adapted_to_mf_from_between_merged_manually — ⚠️ CODE MORT (contre-revue 13/07 : AUCUN appelant dans le repo ; îlot mort avec _from_between_H et _from_between_HTR)" + regle: "fusion PHP par timestamp : array_merge(HTR, H) l.1574 — les deux SELECT ayant des alias identiques, la ligne HTR est INTÉGRALEMENT remplacée par la ligne H, valeurs NULL comprises ; la prod passe par les variantes SQL COALESCE (H préféré aussi, mais NULL tombe)" + source: "combined.php:1562-1582" + +# --------------------------------------------------------------------------- +# CONTEXTE 2 — PHP live ($_DATA_LIVE) : fusion natif IC <-> MF <-> METAR +# Règle : ordre de chargement + gardes !isset => premier chargé gagne, +# SAUF exceptions où MF écrase explicitement. +# --------------------------------------------------------------------------- +php_live: + ordre_chargement: + - {rang: 1, source: "natif IC (loadData, genre de la station)", note: "priorité maximale", source_code: "tableaux.php:1373-1429, stations.inc.php:1689"} + - {rang: 2, source: nivose, regle: "REMPLACE LA LIGNE ENTIÈRE au timestamp (sans garde) — contre-revue 13/07 : concerne TOUTE station synop FR an >= 2021 (condition l.1431), pas seulement les balises NIVOSE ; clé $dh_utc arrondie à l'heure (natif = 5 min) donc collision aux heures rondes ; le SELECT enneigement n'a ni vent ni pression ni visibilité -> perdus sur collision", source_code: "tableaux.php:1431-1470"} + - {rang: 3, source: "VENTOUX synop MF (station spéciale)", source_code: "tableaux.php:1519-1569"} + - {rang: 4, source: "MF mf_data (champ par champ, gardes ci-dessous)", source_code: "tableaux.php:1627-1892"} + - {rang: 5, source: metar-ic, regle: "générique !isset — ne comble que les trous", source_code: "tableaux.php:1904-1938"} + champs: + temperature: {regle: "natif gagne SAUF source native == meteo24 (MF écrase)", source: "tableaux.php:1648-1652, station-meteo_api.model.php:32"} + pluie_1h: {regle: "MF ÉCRASE TOUJOURS si non vide", source: "tableaux.php:1643-1646, station-meteo_api.model.php:26-29"} + vent_rafales: {regle: "MF ÉCRASE TOUJOURS si non vide", source: "tableaux.php:1665-1668"} + mf_ecrase_si_non_vide: + champs: [neige_au_sol, TNSOL_H, neige_tombee_1h, neige_tombee_3h, plafond_nuageux, duree_precips, PMERMIN_H, ens_h, etat_mer, visi_mer, temps_passe1, temps_passe2, nebulosite, visibilite, tn_h, htn, tx_h, htx, uv] + note: "contre-revue 13/07 : nebulosite (l.1702), visibilite (l.1707), tn_h/htn (l.1712-1714), tx_h/htx (l.1716-1718), uv (l.1743-1749) écrasent AUSSI sans !isset — l'écrasement est la RÈGLE (~19 champs), la protection l'exception (6)" + source: "tableaux.php:1643-1749" + natif_gagne: + champs: [humidite, point_de_rosee, vent_moyen, vent_direction, pression] + regle: "MF seulement si !isset (l.1653,1657,1661,1669,1673) ; + temperature sauf source native == meteo24 (l.1648-1649)" + source: "tableaux.php:1648-1673" + contradiction_point_entree: + regle: "load_data.php (graphiques MF) écrase TOUT inconditionnellement, sans gardes — préséance IC/MF INCOHÉRENTE selon le point d'entrée du site" + source: "include/MeteoFrance/load_data.php:58-68 vs tableaux.php:1627-1892" + decision_canonique: "À TRANCHER EN REVUE — le modèle canonique doit choisir UNE règle" + +# --------------------------------------------------------------------------- +# CONTEXTE 3 — Climato quotidienne (agrégats journaliers, climato.php) +# --------------------------------------------------------------------------- +climato_quotidienne: + # ⚠️ Contre-revue 13/07 : climato.php = AFFICHAGE SEULEMENT (zéro INSERT/UPDATE + # dans le fichier). La table stockée climato_journaliere_auto est écrite par + # cron/climato_annuelle.inc.php:1794 avec une AUTRE règle (null-fill-ou- + # supérieur, l.566-571) -> l'affiché et le stocké peuvent diverger (AMB-9). + agregats: + tn: {regle: "min(natif, mf, existant) — le minimum toutes sources gagne", source: "climato.php:1111-1116"} + tx: {regle: "max(natif, mf, existant)", source: "climato.php:1117-1122"} + rr: {regle: "max à 3 termes : rr direct (pluie_24h ou somme rr1h), cumul horaire natif, cumul horaire MF — le terme MF n'est dans le max QUE depuis 2025-03-21 (commit 3bc3747ba « WIP add timescale ») ; écrasable en aval par static (l.1225) et MANU (l.1419-1421)", todo: "TODO l.1133-1134 : forcer MF si toutes les données MF, MÊME SI INFÉRIEURE (arrondis SYNOP) — NON implémenté (ni ici ni dans le cron, qui porte le même commentaire d'intention l.384,616)", source: "climato.php:1130-1136"} + ens: {regle: "idem rr avec garde !is_null et round(...,1) avant comparaison", todo: "TODO l.1140 : forcer MF si complet — NON implémenté", source: "climato.php:1138-1142"} + pmoy: {regle: "MF gagne si comptage MF >= comptage natif", source: "climato.php:1144-1147"} + divers_max: {champs: [DG_H, dgel, dhr40, dhr80, drr], regle: "max(natif, mf)", source: "climato.php:1148-1152"} + cluster_vent2: {regle: "MF remplace si count(mf) >= count(natif)", source: "climato.php:1154-1156"} + sources_archives_ordre_effectif: + regle: "ordre final effectif (AFFICHAGE) : quotidiennes-mf > climato-manu (MANU) > (eca | gsod | climato-auto selon nullité) ; en amont, ECA écrase aussi les obs synop natives déjà chargées (>= 1920)" + note_nommage: "le bloc « noaa » l.1304 = GSOD (table V5_climato_noaa) ; mf_data['noaa'] l.1431 = quotidiennes MF officielles lues via Timescale au format noaa — deux choses différentes" + detail: + - {source: synop-natif, periode: ">= 1920", regle: "chargé d'abord (bloc l.527), écrasé ensuite par ECA sans garde", source_code: "climato.php:527,860-1074"} + - {source: eca, periode: "1881-1999 (condition l.1251)", regle: "écrit sans garde de nullité là où ECA a la donnée (station dans eca_stations + jour présent)", source_code: "climato.php:1251-1302"} + - {source: gsod, periode: "1975-2010 (condition l.1304)", regle: "tn/tx/rr seulement si null (is_null/is_nullv) — ECA gagne le recouvrement par ordre + asymétrie des gardes ; temps_omm appendé sans garde ; bug latent : (float)null -> 0.0 mm sur rr", source_code: "climato.php:1304-1362"} + - {source: climato-auto, regle: "seulement si null ; exclut VENTOUX", source_code: "climato.php:1377-1388"} + - {source: climato-manu, regle: "force si non null, tag MANU, pose $output[d]['manual']=true (jamais reconsulté ensuite)", source_code: "climato.php:1407-1428"} + - {source: quotidiennes-mf, regle: "force si isset, champ par champ, source réécrite en 'mf' — MASQUE la saisie manuelle À L'AFFICHAGE (la ligne MANU reste intacte en base) ; stations avec MFID seulement ; non borné en année", source_code: "climato.php:1431-1485"} + fenetres_jour: + regle: "h>18 -> Tn attribuée à J+1 ; h>6 -> Tx à J, sinon J-1" + source: "climato.php:1046-1080" + cas_stations: + - {station: "98404003 (DDU)", regle: "fenêtres Tx 21Z-21Z, Tn 9Z-9Z, vent 15Z-15Z", source: "climato.php:1018-1045"} + - {station: "VENTOUX", regle: "exclu de climato-auto ; synop MF dédié", source: "climato.php:1365, tableaux.php:1473"} + +# --------------------------------------------------------------------------- +# AMBIGUÏTÉS À TRANCHER EN REVUE (le canonique ne doit PAS les reproduire +# aveuglément — chacune demande une décision) +# --------------------------------------------------------------------------- +ambiguites: # résumés amendés par la contre-revue du 13/07 ; décisions actées 13/07 (pam) + - id: AMB-1 + resume: "préséance IC/MF dépend du point d'entrée : tableaux.php protège 6 champs (!isset) et en écrase ~19 ; la page graphiques (graphiques.inc.php:176 -> load_data.php:68) réapplique MF sur TOUT sans garde" + decision: "règle canonique = natif IC prioritaire par défaut + exceptions MF explicites REVUES CHAMP PAR CHAMP (base : gardes tableaux.php, mais la liste actuelle est incohérente — nebulosite/visibilite écrasées sans justification documentée, à statuer champ par champ au moment du gel) ; la règle 'MF écrase tout' des graphiques n'est PAS portée. AMPLEUR (prod RO, 13/07) : 15 752 correspondances mf_stations, TOUTES de genre synop (15 745 FR + 3 PF + 2 NC, 2 STID hors annuaire) — le conflit concerne le réseau synop, pas les StatIC" + - id: AMB-2 + resume: "rr/ens : trois règles concurrentes — page (max 3 termes, terme MF depuis 2025-03-21), cron stocké (null-fill-ou-supérieur), TODO jamais codé (forcer MF si complet, même si inférieure)" + decision: "la règle du CRON (le stocké, climato_annuelle.inc.php:566-571 null-fill-ou-supérieur) fait foi pour le Gold — c'est la référence de la réconciliation F1 ; l'intention TODO (forcer MF si complet) = amélioration candidate post-bascule, rejeu dédié et mesurable" + - id: AMB-3 + resume: "les quotidiennes MF officielles MASQUENT la saisie manuelle MANU à l'affichage (ordre d'exécution, badge source réécrit 'mf') — pas de perte en base aujourd'hui, mais le canonique matérialisera la fusion" + decision: "climato-manu AU SOMMET (une correction humaine ne cède que devant un humain) + JOURNAL DES CONFLITS : quand une source auto contredit une valeur MANU au même (jour, champ), MANU tient et le conflit est loggé pour revue (canal admin, lot G2) ; écart d'affichage vs prod assumé et documenté" + - id: AMB-4 + resume: "ECA > GSOD sur 1975-1999 par ordre + asymétrie des gardes (pas de règle explicite) ; ECA écrase aussi les obs synop natives chargées (1920-1999)" + decision: "ordre explicite gravé : eca > gsod sur le recouvrement 1975-1999 (ECA&D homogénéisée), ET eca > synop-natif sur 1881-1999 (l'homogénéisation corrige les biais des obs brutes anciennes) — zéro écart vs l'affichage actuel ; rouvrable sur objection climatologique argumentée en consultation" + - id: AMB-5 + resume: "ordre rayonnement inversé [UV,UV2,GLO] (combined.php:1429, 1 occ. sur 16) — dans du CODE MORT" + decision: "ordre canonique = GLO d'abord (l'ordre majoritaire vivant, 15/16) ; l'îlot mort n'est pas porté (suppression au lot E3) ; GIT BLAME FAIT (13/07) : l'inversion date du commit de CRÉATION de la fonction (1c66ca63f, WIP 2026-02-19, migration Timescale) qui contient LES DEUX ordres le même jour — coquille de copie jamais relue car fonction jamais branchée, pas un choix documenté ; dans le modèle long GLO et UV restent des paramètres distincts, cet ordre ne sert qu'aux vues de compatibilité" + - id: AMB-6 + resume: "_merged_manually : array_merge remplace la ligne HTR entière par la ligne H, NULL compris — CODE MORT" + decision: "sémantique UNIVERSELLE de la table : « source prioritaire » = première valeur NON NULLE gagne (COALESCE) — un NULL ne remplace JAMAIS une valeur ; l'îlot mort n'est pas porté ; le besoin d'invalidation explicite d'une mesure relève du canal qualité/flags du modèle canonique, pas de la préséance" + - id: AMB-7 + resume: "bloc enneigement (toute synop FR >= 2021, pas seulement NIVOSE) remplace la ligne $_DATA_LIVE entière à l'heure ronde — champs natifs hors SELECT (vent, pression, visibilité) perdus sur collision" + decision: "préséance PAR PARAMÈTRE : l'enneigement ne gagne que sur les paramètres qu'il fournit, les autres champs du même horodatage survivent ; le comportement ligne-entière est traité comme bug non porté ; CONTRÔLE FAIT (prod RO, 13/07) : janvier 2026 = 1 164 lignes enneigement / 101 stations, ZÉRO ligne synop native pour ces stations → aucune collision observée, décision sans écart vs prod" + - id: AMB-8 + resume: "DÉCOUVERTE contre-revue : les blocs MF MariaDB (elseif tableaux.php:1579) et TimescaleDB (:1762, inconditionnel) s'exécutent TOUS LES DEUX -> double application, mélange possible si les magasins divergent ; conversion uv différente entre blocs (:1744 vs :1885)" + decision: "dans le canonique, UNE SEULE source MF par observation — le dual-source se résout à l'INGESTION, jamais à l'affichage ; côté legacy, clarifier avec l'équipe si la double passe est un état transitoire connu et si le bloc MariaDB doit être retiré (hors périmètre A2, à porter au lot E3)" + - id: AMB-9 + resume: "DÉCOUVERTE contre-revue : climato affichée (climato.php, fusion au rendu) != climato stockée (cron climato_annuelle.inc.php:566-571,1794) — deux règles, deux résultats possibles selon le consommateur" + decision: "le STOCKÉ fait foi (cohérent avec AMB-2) : le Gold canonique matérialise la fusion du cron, et les pages deviennent des consommateurs du stocké au lieu de recalculer leur propre fusion au rendu" diff --git a/tools/tests/test_preseance.py b/tools/tests/test_preseance.py new file mode 100644 index 0000000..d35f067 --- /dev/null +++ b/tools/tests/test_preseance.py @@ -0,0 +1,110 @@ +"""Tests de non-régression de catalog/preseance.yaml (lot A2) : les règles +transcrites doivent rester fidèles aux cas extraits du monolithe (citations +fichier:ligne dans le YAML). Si un test casse, c'est que la table a été +éditée — vérifier contre le code source cité avant d'adapter le test.""" + +from pathlib import Path + +import yaml + +YAML_PATH = Path(__file__).resolve().parents[2] / "catalog" / "preseance.yaml" + + +def load(): + return yaml.safe_load(YAML_PATH.read_text()) + + +def test_yaml_valide_et_sections(): + doc = load() + for section in ("meta", "sources", "sql_combined", "php_live", + "climato_quotidienne", "ambiguites"): + assert section in doc, f"section manquante: {section}" + + +def test_regle_transversale_h_htr_itr(): + """combined.php : H > HTR > ITR — vérifié sur temperature (ligne 28/434).""" + ordres = load()["sql_combined"]["ordres_standards"] + assert ordres["temperature"]["priorite"] == ["mf-h.T", "mf-htr.t", "mf-itr.t"] + + +def test_vent_rafales_fallback_vent_moyen(): + """combined.php:35 — la cascade rafales finit sur le vent moyen.""" + prio = load()["sql_combined"]["ordres_standards"]["vent_rafales"]["priorite"] + assert prio[0] == "mf-h.FXI3S" + assert prio[-4:] == ["mf-h.FF", "mf-h.FF2", "mf-htr.ff", "mf-itr.ff"] + + +def test_pression_pmer_avant_pstat(): + prio = load()["sql_combined"]["ordres_standards"]["pression"]["priorite"] + assert prio.index("mf-h.PMER") < prio.index("mf-h.PSTAT") + + +def test_php_live_exceptions_mf_ecrase(): + """tableaux.php:1643/1665 — pluie_1h et vent_rafales : MF écrase toujours.""" + champs = load()["php_live"]["champs"] + assert "ÉCRASE TOUJOURS" in champs["pluie_1h"]["regle"] + assert "ÉCRASE TOUJOURS" in champs["vent_rafales"]["regle"] + + +def test_php_live_temperature_exception_meteo24(): + assert "meteo24" in load()["php_live"]["champs"]["temperature"]["regle"] + + +def test_php_live_natif_gagne_champs_standard(): + """Contre-revue 13/07 : seuls 5 champs sont gardés !isset (tableaux.php: + 1648-1673) ; visibilite (l.1707) et nebulosite (l.1702) écrasent SANS + garde et appartiennent à mf_ecrase_si_non_vide.""" + champs = load()["php_live"]["champs"] + natif = champs["natif_gagne"]["champs"] + for c in ("humidite", "pression", "vent_moyen", "vent_direction", "point_de_rosee"): + assert c in natif + ecrase = champs["mf_ecrase_si_non_vide"]["champs"] + for c in ("visibilite", "nebulosite"): + assert c not in natif and c in ecrase + + +def test_ordre_chargement_natif_premier_metar_dernier(): + ordre = load()["php_live"]["ordre_chargement"] + assert ordre[0]["rang"] == 1 and "natif" in ordre[0]["source"] + assert ordre[-1]["source"] == "metar-ic" + + +def test_climato_tn_min_tx_max(): + ag = load()["climato_quotidienne"]["agregats"] + assert ag["tn"]["regle"].startswith("min(") + assert ag["tx"]["regle"].startswith("max(") + + +def test_ordre_archives_quotidiennes_mf_prioritaires(): + """Contre-revue 13/07 : le bloc final climato.php:1431-1485 lit les + quotidiennes MF officielles (via Timescale, format noaa) — renommé + quotidiennes-mf pour ne pas confondre avec GSOD (V5_climato_noaa).""" + archives = load()["climato_quotidienne"]["sources_archives_ordre_effectif"] + assert archives["regle"].split(">")[0].strip().endswith("quotidiennes-mf") + assert "noaa" in archives["note_nommage"] + + +def test_ambiguites_documentees(): + """AMB-8 et AMB-9 découvertes par la contre-revue du 13/07.""" + ids = [a["id"] for a in load()["ambiguites"]] + assert ids == [f"AMB-{i}" for i in range(1, 10)] + + +def test_ambiguites_toutes_tranchees(): + """Décisions actées le 13/07 (adoption des recommandations de la + contre-revue) — chaque ambiguïté doit porter une décision non vide.""" + for a in load()["ambiguites"]: + assert a.get("decision", "").strip(), f"{a['id']} sans décision" + + +def test_decision_amb6_semantique_coalesce(): + """AMB-6 fixe la sémantique universelle de la table : un NULL ne gagne + jamais. Toute édition qui la retire doit casser un test.""" + amb6 = next(a for a in load()["ambiguites"] if a["id"] == "AMB-6") + assert "NON NULLE" in amb6["decision"] + + +def test_toutes_les_regles_citent_leur_source(): + """Chaque ordre standard doit citer combined.php:.""" + for champ, spec in load()["sql_combined"]["ordres_standards"].items(): + assert "combined.php:" in spec.get("source", ""), f"{champ} sans citation" From d0bbe4c92d59697ff65f92099c8ff978775c2f33 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:25:44 +0200 Subject: [PATCH 28/31] =?UTF-8?q?feat(catalog):=20parametres.yaml=20?= =?UTF-8?q?=E2=80=94=20vocabulaire=20contr=C3=B4l=C3=A9=20(lot=20A3,=20BRO?= =?UTF-8?q?UILLON)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Source de vérité du vocabulaire d'ADR-0004 : ~150 grandeurs, mapping par système (colonnes wide MF, static.complements, codes _H de mf_data, temps réel), avec facteur/offset vers l'unité SI et domaine de plausibilité. BROUILLON assumé : les 16 mappings dont l'unité n'est pas tranchée par un échantillon prod portent `unite_incertaine: true` plutôt qu'une valeur devinée, et restent exclus de l'unpivot. Revue humaine A3 encore à faire. --- catalog/parametres.yaml | 1680 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 1680 insertions(+) create mode 100644 catalog/parametres.yaml diff --git a/catalog/parametres.yaml b/catalog/parametres.yaml new file mode 100644 index 0000000..6dcffcf --- /dev/null +++ b/catalog/parametres.yaml @@ -0,0 +1,1680 @@ +# Vocabulaire contrôlé des paramètres d'observation — ADR-0004 (§7 amendée 2026-07-11) +# +# BROUILLON — lot A3, à revoir par une humaine avant fusion. Rigueur > vitesse : +# les zones d'incertitude sont marquées `unite_incertaine: true` plutôt que devinées. +# +# Structure du fichier (5 tranches d'extension, dans l'ordre demandé par le mandat) : +# 0. Entrées existantes du POC (poc-lakehouse-2025/catalog/parametres.yaml + +# parametres_mf_tr.yaml) — 33 entrées, fusionnées en un seul fichier. Les champs +# cf_standard_name / unite_si / domaine / description_fr / sources pré-existants +# sont repris À L'IDENTIQUE. Extension : de nouvelles clés sont ajoutées au bloc +# `sources:` de plusieurs de ces entrées quand une colonne des tranches 1-5 +# s'avère être la MÊME grandeur (ex. RR1 du Horaire MF = precipitation_amount_1h +# existant) — sinon on aurait soit une collision de clé, soit une perte de +# traçabilité pour ~20 colonnes wide MF qui n'ont pas de grandeur distincte. +# Voir le rapport de restitution pour la discussion de ce choix d'interprétation. +# 1. Colonnes wide MF consommées — table Timescale `Horaire` (historique, 99 colonnes +# utiles hors indicateurs Q*), doc source site-infoclimat/include/MeteoFrance/docs/ +# H_HTR_I_ITR.txt (section « H »), structure vérifiée contre +# data-platform/schemas/timescaledb/schema.sql.gz et le contrat +# contracts/horaire-mf-timescale.odcs.yaml. +# 2. `static.complements` — 33 sous-champs packés (@-séparés), désérialisés par +# deserialize_complements() dans site-infoclimat/data/complements.inc.php +# (constat : 33 champs réels, pas 34 — l'audit de traduisibilité comptait large). +# 3. Codes `_H` de `mf_data` (MariaDB, fallback dual-source) — PAS de nouvelles clés : +# mf_data_{AAAA}_{MM} porte les MÊMES grandeurs que la tranche 1 (mêmes noms MF +# sans le suffixe _H, cf. site-infoclimat/include/MeteoFrance/docs/mf_data.txt qui +# liste les deux nomenclatures côte à côte). Cette tranche ajoute donc des sources +# `mf_data` sur des entrées déjà créées en tranche 1, uniquement pour les champs +# explicitement cités par l'audit comme lus par mobile-api (W1_H/W2_H, B1_H, +# TNSOL_H, HNEIGEFI1_H/HNEIGEFI3_H, ETATMER_H). mf_data est en fin de vie planifiée +# (contracts/mf-data-fallback.odcs.yaml : ~0% de couverture, un seul écrivain vivant +# hors-sujet ici) — dupliquer une source par entrée n'apportait pas de valeur de +# gouvernance proportionnée à l'effort. +# 4. Bouées / mer — table MariaDB `bouees_{MM}_d{d}`, DDL avec COMMENT SQL dans +# site-infoclimat/cron/yearly/creer_tables_annee.php:41-68 (source la plus fiable : +# commentaires SQL explicites sur les unités/tables OMM). +# 5. Enneigement (nivo) — source-meteofrance-donnees-libres-nivo.odcs.yaml, alimente +# V5_data_mf.enneigement via cron/enneigement/recup_donneespub_mf.php. +# 6. `mf_quotidienne` — 26 colonnes de mesures de la table Timescale `Quotidienne` +# (climatologie quotidienne à mensuelle MF, contracts/quotidienne-mf-timescale.odcs.yaml), +# alimentée par telechargement-climatologie-meteo-data-gouv (mêmes CSV data.gouv que le +# contrat cite en sourceRepo). 17 colonnes rejoignent des clés EXISTANTES via un bloc +# `sources: mf_quotidienne:` supplémentaire à duree_s: 86400 (même grandeur, fenêtre +# journalière — RR→precipitation_amount_24h, TN/TX→air_temperature_min/max, +# TNSOL/TN50→grass_minimum_temperature_10cm/50cm, DG→duration_of_frost, +# DRR→duration_of_precipitation_1h [nom de clé hérité, non renommé — hors périmètre], +# FFM/FF2M→wind_speed/wind_speed_2m, FXY/DXY/FXI/DXI/FXI2/DXI2/FXI3S/DXI3S→les 4 couples +# wind_speed_of_gust*/wind_from_direction_of_gust*). 6 colonnes (HTN/HTX/HXY/HXI/HXI2/HXI3S) +# sont des heures d'occurrence pures → `porte_occurrence: true` sur la clé valeur +# correspondante, PAS d'entrée séparée (ADR-0004 §7) ; au passage, deux gaps +# pré-existants sont comblés (wind_speed_of_gust_2m/_3s n'avaient pas encore +# `porte_occurrence: true` alors que mf_horaire HXI2/HFXI3S existent déjà). 3 colonnes +# sont des grandeurs distinctes sans équivalent → nouvelles clés air_temperature_mean +# (TM, moyenne vraie horaire), air_temperature_midrange (TNTXM, (TN+TX)/2 — volontairement +# PAS fusionnée avec TM) et air_temperature_range (TAMPLI, écart TX-TN, offset=0 car +# delta). Le contrat ne documente explicitement que RR/TN/TX (mm, °C) ; les 17 autres +# colonnes n'ont ni commentaire d'unité dans le DDL (schemas/timescaledb/schema.sql.gz, +# toutes `double precision`/`integer`) ni description dans le contrat — l'unité retenue +# vient de la doc source amont (telechargement-climatologie-meteo-data-gouv/src/csv/ +# quotidiennes/rr-t-vent/parseCSV.ts, qui transcrit la doc MF officielle), facteur=1 +# partout (cf. NOTE-A : la mention MF « et 1/10 » y est une précision décimale, pas un +# facteur d'échelle — les exemples parseCSV.ts sont déjà des décimaux, ex. RR: 1.1). +# DG/DRR (durées en minutes) sont marquées `unite_incertaine: true` : seule la doc source +# amont confirme l'unité, le contrat est muet même indirectement sur ces deux champs. +# +# AVERTISSEMENT DE LECTURE — l'ordre physique du fichier NE suit PAS strictement ces +# 5 tranches : les entrées sont groupées par PROXIMITÉ THÉMATIQUE pour la relecture +# humaine (ex. wind_speed_2m est juste après wind_speed, pas dans le bloc « TRANCHE 1 » +# plus bas). Les commentaires `# TRANCHE N` marquent seulement où commence le GROS des +# entrées propres à chaque tranche qui n'ont pas de parent thématique en tranche 0. +# Décompte exact par tranche : voir le rapport de restitution de l'agent (pas +# reconstituable depuis les seuls marqueurs de section de ce fichier). +# +# ─── NOTE-A — TRANCHÉE le 2026-07-12 : échantillon prod Horaire (1980/1989/2024) +# = unités RÉELLES (°C, hPa), PAS de 1/10 — l'ADR-0004 est à corriger, le contrat +# horaire-mf-timescale faisait foi. Bornes réelles de la table : 1777 → now. ──────────────────────────────────────── +# H_HTR_I_ITR.txt (doc MF officielle transcrite dans site-infoclimat) documente les +# colonnes de la table Horaire en convention MF « et 1/10 » (T, RR1, FF, TSV, PMER, +# PSTAT, PMERMIN, TMER, T10-T100, TNSOL, TN50, TCHAUSSEE, HVAGUE, PVAGUE... = valeurs +# entières en dixièmes). Mais : +# - le contrat contracts/horaire-mf-timescale.odcs.yaml décrit T comme +# « REAL — Température sous abri (°C) » SANS mention de 1/10 ; +# - le schéma réel (data-platform/schemas/timescaledb/schema.sql.gz) déclare ces +# colonnes en `double precision`, compatible avec les deux hypothèses ; +# - la vue de production `v_quotidienne_realtime` (schema.sql.gz, définition autour de +# la ligne 1605) UNIONne directement `"Horaire"."T"` avec `"HoraireTempsReel".t` (qui +# est confirmé en °C réel par le contrat infrahoraire/horaire temps réel) SANS +# aucune division par 10 — ce qui n'aurait pas de sens si Horaire.T était encore en +# dixièmes. +# Faisceau d'indices en faveur d'un facteur déjà réel (1) au moment de l'ingestion dans +# Horaire, contredisant la doc source MF sur le fichier brut. Facteur retenu ICI = 1 +# (aligné sur le contrat et la vue de prod, « les contrats font foi »), mais chaque +# champ concerné est marqué `unite_incertaine: true` — À CONFIRMER par échantillonnage +# (`SELECT "T","RR1" FROM "Horaire" ORDER BY "AAAAMMJJHH" DESC LIMIT 20`) avant toute +# mise en production du vocabulaire. C'est la plus grosse zone d'incertitude de ce +# brouillon — elle touche ~25 champs numériques continus de la tranche 1. +# ─────────────────────────────────────────────────────────────────────────────────── + +version: 0.3.0 + +parametres: + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 0 — entrées existantes du POC (33), fusion base + overlay TR + # ══════════════════════════════════════════════════════════════════════════════ + + air_temperature: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température de l'air sous abri + sources: + synop: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + static: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + metar: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: entier tronqué au degré à la source (tinyint)} + bouees: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mae: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire_tr: {colonne: t, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: t, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire: {colonne: T, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "CONFIRMÉ 13/07 (échantillon prod : °C réels, NOTE-A par colonne) — NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : unités réelles, facteur=1 confirmé). Source : site-infoclimat/include/MeteoFrance/docs/H_HTR_I_ITR.txt (section H) ; data-platform/contracts/horaire-mf-timescale.odcs.yaml"} + mf_nivo: {colonne: temperature, unite: K, facteur: 1, offset: 0, duree_s: 0, + note: "source déjà en Kelvin, offset -273.15 appliqué par le consommateur PHP. Source : data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + air_temperature_min: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température minimale sur la période de la source (agrégat min) + porte_occurrence: true # cf. ADR-0004 §7 — HTN (mf_horaire), HTN (mf_quotidienne), tn_1h_heure (complements) alimentent dh_occurrence + sources: + synop: {colonne: temperature_min, unite: degC, facteur: 1, offset: 273.15, duree_s: null, + note: période variable selon heure synoptique (12 h à 06 UTC)} + static: {colonne: temperature_min, unite: degC, facteur: 1, offset: 273.15, duree_s: null} + mf_horaire_tr: {colonne: tn, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600} + mf_horaire: {colonne: TN, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "CONFIRMÉ 13/07 (échantillon 2024 : −31,0→40,9 °C) — min « dans l'heure ». NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : unités réelles, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + complements_1h: {colonne: tn_1h, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "site-infoclimat/data/complements.inc.php:205 (@Unit °C @Timespan 1h)"} + mf_nivo_12h: {colonne: tn_12h, unite: K, facteur: 1, offset: 0, duree_s: 43200, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_nivo_24h: {colonne: tn_24h, unite: K, facteur: 1, offset: 0, duree_s: 86400, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_quotidienne: {colonne: TN, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« température minimale sous abri (en °C et 1/10) » — min journalier, heure d'occurrence HTN portée par porte_occurrence (pas d'entrée séparée). Unité confirmée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (property TN : REAL, °C, sans mention 1/10 — cohérent avec NOTE-A). Source : contracts/quotidienne-mf-timescale.odcs.yaml ; telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + air_temperature_max: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température maximale sur la période de la source (agrégat max) + porte_occurrence: true # cf. ADR-0004 §7 — HTX (mf_horaire), HTX (mf_quotidienne), tx_1h_heure (complements) alimentent dh_occurrence + sources: + synop: {colonne: temperature_max, unite: degC, facteur: 1, offset: 273.15, duree_s: null} + static: {colonne: temperature_max, unite: degC, facteur: 1, offset: 273.15, duree_s: null} + mf_horaire_tr: {colonne: tx, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600} + mf_horaire: {colonne: TX, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "CONFIRMÉ 13/07 (échantillon 2024 : −29,0→41,7 °C) — max « dans l'heure ». NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : unités réelles, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + complements_1h: {colonne: tx_1h, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "site-infoclimat/data/complements.inc.php:212 (@Unit °C @Timespan 1h)"} + mf_nivo_12h: {colonne: tx_12h, unite: K, facteur: 1, offset: 0, duree_s: 43200, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_nivo_24h: {colonne: tx_24h, unite: K, facteur: 1, offset: 0, duree_s: 86400, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_quotidienne: {colonne: TX, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« température maximale sous abri (en °C et 1/10) » — max journalier, heure d'occurrence HTX portée par porte_occurrence (pas d'entrée séparée). Unité confirmée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (property TX : REAL, °C, sans mention 1/10 — cohérent avec NOTE-A). Source : contracts/quotidienne-mf-timescale.odcs.yaml ; telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + dew_point_temperature: + cf_standard_name: dew_point_temperature + unite_si: K + domaine: {min: 180.0, max: 320.0} + description_fr: Température du point de rosée + sources: + synop: {colonne: point_de_rosee, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + static: {colonne: point_de_rosee, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + metar: {colonne: point_de_rosee, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + bouees: {colonne: point_de_rosee, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire_tr: {colonne: td, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: td, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire: {colonne: TD, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: point_de_rosee, unite: K, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + relative_humidity: + cf_standard_name: relative_humidity + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative + sources: + synop: {colonne: humidite, unite: "%", facteur: 1, offset: 0, duree_s: 0} + static: {colonne: humidite, unite: "%", facteur: 1, offset: 0, duree_s: 0} + bouees: {colonne: humidite, unite: "%", facteur: 1, offset: 0, duree_s: 0} + mf_horaire_tr: {colonne: u, unite: "%", facteur: 1, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: u, unite: "%", facteur: 1, offset: 0, duree_s: 0} + mf_horaire: {colonne: U, unite: "%", facteur: 1, offset: 0, duree_s: 0, + note: "% déjà entier dans la doc source (pas de mention 1/10) — pas d'incertitude ici. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: humidite, unite: "%", facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + relative_humidity_min: + cf_standard_name: relative_humidity + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative minimale sur la période de la source (agrégat min, réseau MF extérieur) + porte_occurrence: true # HUN + sources: + mf_horaire: {colonne: UN, unite: "%", facteur: 1, offset: 0, duree_s: 3600, + note: "min « dans l'heure ». Source : H_HTR_I_ITR.txt section H"} + + relative_humidity_max: + cf_standard_name: relative_humidity + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative maximale sur la période de la source (agrégat max, réseau MF extérieur) + porte_occurrence: true # HUX + sources: + mf_horaire: {colonne: UX, unite: "%", facteur: 1, offset: 0, duree_s: 3600, + note: "max « dans l'heure ». Source : H_HTR_I_ITR.txt section H"} + + air_pressure_at_sea_level: + cf_standard_name: air_pressure_at_sea_level + unite_si: Pa + domaine: {min: 87000.0, max: 108500.0} + description_fr: Pression ramenée au niveau de la mer + sources: + synop: {colonne: pression, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + static: {colonne: pression, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + metar: {colonne: pression, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + bouees: {colonne: pression, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_horaire_tr: {colonne: pmer, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: pmer, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_horaire: {colonne: PMER, unite: hPa, facteur: 100, offset: 0, duree_s: 0, + note: "NOTE-A (documenté 1/10 hPa). Source : H_HTR_I_ITR.txt section H"} + + air_pressure_at_sea_level_min_1h: + cf_standard_name: air_pressure_at_sea_level + unite_si: Pa + domaine: {min: 87000.0, max: 108500.0} + description_fr: Minimum horaire de la pression ramenée au niveau de la mer (PMERMIN) + sources: + mf_horaire: {colonne: PMERMIN, unite: hPa, facteur: 100, offset: 0, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + + tendency_of_air_pressure: + cf_standard_name: tendency_of_air_pressure + unite_si: Pa + domaine: {min: -3000.0, max: 3000.0} + description_fr: Variation de pression sur 3 heures + sources: + synop: {colonne: pression_variation_3h, unite: hPa, facteur: 100, offset: 0, duree_s: 10800} + static: {colonne: pression_variation_3h, unite: hPa, facteur: 100, offset: 0, duree_s: 10800} + bouees: {colonne: pression_variation_3h, unite: hPa, facteur: 100, offset: 0, duree_s: 10800} + + visibility_in_air: + cf_standard_name: visibility_in_air + unite_si: m + domaine: {min: 0.0, max: 100000.0} + description_fr: Visibilité horizontale + sources: + synop: {colonne: visibilite, unite: m, facteur: 1, offset: 0, duree_s: 0} + static: {colonne: visibilite, unite: m, facteur: 1, offset: 0, duree_s: 0} + metar: {colonne: visibilite, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: 9999 = « 10 km ou plus » (valeur censurée, pas une mesure)} + bouees: {colonne: visibilite, unite: m, facteur: 1, offset: 0, duree_s: 0} + mf_horaire_tr: {colonne: vv, unite: m, facteur: 1, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: vv, unite: m, facteur: 1, offset: 0, duree_s: 0} + mf_horaire: {colonne: VV, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "en m, pas de mention 1/10. Source : H_HTR_I_ITR.txt section H"} + + wind_speed: + cf_standard_name: wind_speed + unite_si: m s-1 + domaine: {min: 0.0, max: 75.0} + description_fr: Vitesse du vent moyen (moyenne 10 min) + sources: + synop: {colonne: vent_moyen, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + static: {colonne: vent_moyen, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + metar: {colonne: vent_moyen, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600, + note: converti des nœuds à l'acquisition (granularité 1,85 km/h)} + bouees: {colonne: vent_moyen, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + mf_horaire_tr: {colonne: ff, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: ff MF nativement en m/s (pas de conversion)} + mf_infrahoraire_tr: {colonne: ff, unite: m s-1, facteur: 1, offset: 0, duree_s: 600} + mf_horaire: {colonne: FF, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: "NOTE-A (documenté 1/10 m/s). Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: vent_moyen, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_quotidienne: {colonne: FFM, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« moyenne quotidienne de la force du vent moyenné sur 10 mn, à 10 m » — moyenne journalière de la même mesure 10-min que wind_speed (duree_s du sous-jacent inchangé, 600 s ; 86400 est la fenêtre d'agrégation quotidienne, cohérent avec le modèle (paramètre, duree_s) d'ADR-0004 §2). Unité non documentée explicitement par le contrat (DDL : double precision) ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_2m: + cf_standard_name: wind_speed + unite_si: m s-1 + domaine: {min: 0.0, max: 60.0} + description_fr: Vitesse du vent moyen, variante mesurée à 2 m (FF2, au lieu de 10 m par défaut) + sources: + mf_horaire: {colonne: FF2, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Hauteur de mesure (2 m) bornée et fixe, encodée dans la clé (ADR-0004 §7, précédent profondeur/couche). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: FF2M, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« moyenne quotidienne de la force du vent moyenné sur 10 mn, à 2 m » — même remarque que wind_speed/FFM (mf_quotidienne). Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_2m: + cf_standard_name: wind_from_direction + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction d'origine du vent, variante mesurée à 2 m (DD2) + sources: + mf_horaire: {colonne: DD2, unite: degree, facteur: 1, offset: 0, duree_s: 600, + note: "direction jamais en 1/10 dans la doc source. Source : H_HTR_I_ITR.txt section H"} + + wind_speed_of_gust: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 120.0} + description_fr: Rafale maximale instantanée sur la période de la source + porte_occurrence: true # HXI (mf_horaire) + sources: + synop: {colonne: vent_rafales, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: null} + static: {colonne: vent_rafales, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: null} + bouees: {colonne: vent_rafales, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: null} + mf_horaire_tr: {colonne: fxi, unite: m s-1, facteur: 1, offset: 0, duree_s: null, + note: rafale instantanée max, période source} + mf_horaire: {colonne: FXI, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600, + note: "« instantané dans l'heure ». NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + complements_day: {colonne: rafale_max_day, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 86400, + note: "site-infoclimat/data/complements.inc.php:58 (@Unit km/h @Timespan day)"} + mf_quotidienne: {colonne: FXI, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« maximum quotidien de la force maximale horaire du vent instantané, à 10 m » — max journalier du même FXI horaire (mf_horaire), heure d'occurrence HXI portée par porte_occurrence. Unité non documentée explicitement par le contrat (DDL : double precision) ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_of_gust: + cf_standard_name: null # pas de standard name CF distinct pour la direction de rafale + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction associée à la rafale instantanée maximale (DXI) + sources: + mf_horaire: {colonne: DXI, unite: degree, facteur: 1, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DXI, unite: degree, facteur: 1, offset: 0, duree_s: 86400, + note: "« direction de FXI (en rose de 360) » — direction associée au max journalier de FXI. Direction jamais en 1/10. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_of_gust_hourly: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 120.0} + description_fr: Rafale maximale horaire (FXY MF) + porte_occurrence: true # HXY (mf_horaire, mf_quotidienne) + sources: + mf_horaire_tr: {colonne: fxy, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600} + mf_horaire: {colonne: FXY, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: FXY, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« maximum quotidien de la force maximale horaire du vent moyenné sur 10 mn, à 10 m » — max journalier du même FXY horaire, heure d'occurrence HXY portée par porte_occurrence. Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_of_gust_hourly: + cf_standard_name: null + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction associée à la rafale maximale horaire (DXY) + sources: + mf_horaire: {colonne: DXY, unite: degree, facteur: 1, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DXY, unite: degree, facteur: 1, offset: 0, duree_s: 86400, + note: "« direction de FXY (rose de 360) » — direction associée au max journalier de FXY. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_of_gust_2m: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 100.0} + description_fr: Rafale instantanée maximale, variante mesurée à 2 m (FXI2) + porte_occurrence: true # HXI2 — gap comblé ici : mf_horaire H_HTR_I_ITR.txt documente déjà HXI2 (heure de FXI2) sans qu'une entrée précédente ne l'ait signalé ; mf_quotidienne HXI2 (heure du max journalier) s'y ajoute + sources: + mf_horaire: {colonne: FXI2, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: FXI2, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« maximum quotidien de la force maximale horaire du vent instantané, à 2 m » — max journalier du même FXI2 horaire, heure d'occurrence HXI2 portée par porte_occurrence. Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_of_gust_2m: + cf_standard_name: null + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction associée à la rafale maximale à 2 m (DXI2) + sources: + mf_horaire: {colonne: DXI2, unite: degree, facteur: 1, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DXI2, unite: degree, facteur: 1, offset: 0, duree_s: 86400, + note: "« direction de FXI2 (rose de 360) » — direction associée au max journalier de FXI2. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_of_gust_3s: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 120.0} + description_fr: >- + Rafale maximale sur moyenne glissante 3 secondes dans l'heure (FXI3S) — technique + de mesure distincte de FXI (« instantané », fréquence d'échantillonnage non + documentée) + porte_occurrence: true # HFXI3S (mf_horaire, gap comblé ici — même remarque que wind_speed_of_gust_2m/HXI2), HXI3S (mf_quotidienne). Colonnes de noms différents (HFXI3S vs HXI3S) selon la table, même sémantique (heure d'occurrence) + sources: + mf_horaire: {colonne: FXI3S, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: FXI3S, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« maximum quotidien de la force maximale horaire du vent moyenné sur 3 s, à 10 m » — max journalier du même FXI3S horaire, heure d'occurrence HXI3S portée par porte_occurrence. Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_of_gust_3s: + cf_standard_name: null + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction associée à la rafale 3 s maximale (DXI3S) + sources: + mf_horaire: {colonne: DXI3S, unite: degree, facteur: 1, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DXI3S, unite: degree, facteur: 1, offset: 0, duree_s: 86400, + note: "« direction de FXI3S (rose de 360) » — direction associée au max journalier de FXI3S. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_of_gust_10min: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 120.0} + description_fr: Rafale maximale sur les 10 dernières minutes + sources: + synop: {colonne: vent_rafales_10min, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + static: {colonne: vent_rafales_10min, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + metar: {colonne: vent_rafales_10min, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + mf_infrahoraire_tr: {colonne: fxi10, unite: m s-1, facteur: 1, offset: 0, duree_s: 600} + + wind_from_direction: + cf_standard_name: wind_from_direction + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction d'origine du vent + sources: + synop: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600} + static: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600} + metar: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600} + bouees: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600} + mf_horaire_tr: {colonne: dd, unite: degree, facteur: 1, offset: 0, duree_s: 600} + mf_infrahoraire_tr: {colonne: dd, unite: degree, facteur: 1, offset: 0, duree_s: 600} + mf_horaire: {colonne: DD, unite: degree, facteur: 1, offset: 0, duree_s: 600, + note: "direction jamais en 1/10. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + precipitation_amount_1h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 150.0} + description_fr: Cumul de précipitations sur 1 heure + sources: + synop: {colonne: pluie_1h, unite: mm, facteur: 1, offset: 0, duree_s: 3600} + static: {colonne: pluie_1h, unite: mm, facteur: 1, offset: 0, duree_s: 3600} + mae: {colonne: pluie_1h, unite: mm, facteur: 1, offset: 0, duree_s: 3600} + mf_horaire_tr: {colonne: rr1, unite: mm, facteur: 1, offset: 0, duree_s: 3600} + mf_horaire: {colonne: RR1, unite: mm, facteur: 1, offset: 0, duree_s: 3600, + note: "NOTE-A (documenté 1/10 mm). Source : H_HTR_I_ITR.txt section H"} + + precipitation_amount_6min: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 60.0} + description_fr: Cumul de précipitations sur le pas infrahoraire (6 min) + sources: + mf_infrahoraire_tr: {colonne: rr_per, unite: mm, facteur: 1, offset: 0, duree_s: 360} + mf_infrahoraire: {colonne: RR, unite: mm, facteur: 1, offset: 0, duree_s: 360, + note: "archive Timescale Infrahoraire (2,84 Md lignes) — contrat infrahoraire-mf:101-107 (REAL, mm)"} + + duration_of_precipitation_1h: + cf_standard_name: null # durée, pas une grandeur météo CF standard + unite_si: s + domaine: {min: 0.0, max: 86400.0} # borne élargie à 86400 (mf_quotidienne, fenêtre journalière) — était 3600 (mf_horaire seul) + description_fr: >- + Durée effective des précipitations sur la période de la source — horaire (DRR1 + mf_horaire) ou quotidienne (DRR mf_quotidienne). Le suffixe `_1h` de la clé est un + héritage pré-ADR-0004 §7 (créé avant la convention « durée = dimension duree_s, pas + de clé suffixée ») ; non renommé ici (renommage = breaking, patron `replace` + d'ADR-0002, hors périmètre de cette extension) — la source mf_quotidienne ci-dessous + encode correctement sa fenêtre via duree_s: 86400 malgré le nom de clé. + sources: + mf_horaire: {colonne: DRR1, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DRR, unite: min, facteur: 60, offset: 0, duree_s: 86400, + note: "CONFIRMÉ 13/07 : minutes (max échantillon = 1440 exactement) — « durée des précipitations (en mn) » — cumul journalier, même grandeur que DRR1 mf_horaire (facteur 60 identique). unite_incertaine car le contrat ne documente pas cette colonne (DDL : integer, sans commentaire d'unité) ; minutes confirmées uniquement par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + precipitation_amount_3h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 300.0} + description_fr: Cumul de précipitations sur 3 heures + sources: + synop: {colonne: pluie_3h, unite: mm, facteur: 1, offset: 0, duree_s: 10800} + static: {colonne: pluie_3h, unite: mm, facteur: 1, offset: 0, duree_s: 10800} + + precipitation_amount_6h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 400.0} + description_fr: Cumul de précipitations sur 6 heures + sources: + synop: {colonne: pluie_6h, unite: mm, facteur: 1, offset: 0, duree_s: 21600} + static: {colonne: pluie_6h, unite: mm, facteur: 1, offset: 0, duree_s: 21600} + + precipitation_amount_12h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 600.0} + description_fr: Cumul de précipitations sur 12 heures + sources: + synop: {colonne: pluie_12h, unite: mm, facteur: 1, offset: 0, duree_s: 43200} + static: {colonne: pluie_12h, unite: mm, facteur: 1, offset: 0, duree_s: 43200} + + precipitation_amount_24h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 1000.0} + description_fr: Cumul de précipitations sur 24 heures + sources: + synop: {colonne: pluie_24h, unite: mm, facteur: 1, offset: 0, duree_s: 86400} + static: {colonne: pluie_24h, unite: mm, facteur: 1, offset: 0, duree_s: 86400} + mf_nivo: {colonne: pluie_24h, unite: mm, facteur: 1, offset: 0, duree_s: 86400, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_quotidienne: {colonne: RR, unite: mm, facteur: 1, offset: 0, duree_s: 86400, + note: "« quantité de précipitation tombée en 24 heures (de 06h FU le jour J à 06h FU le jour J+1), affectée au jour J ». Unité confirmée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (property RR : REAL, mm, sans mention 1/10 — cohérent avec NOTE-A). Support = 06 UTC→06 UTC, pas minuit→minuit (différent de pluie_24h synop/static, dont le support est aussi variable — non fusionné plus finement faute d'un sous-typage par borne horaire dans ce vocabulaire). Source : contracts/quotidienne-mf-timescale.odcs.yaml ; telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + precipitation_amount_10min: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 50.0} + description_fr: Cumul de précipitations sur 10 minutes (station StatIC weatherlink) + sources: + complements: {colonne: rr_10mn, unite: mm, facteur: 1, offset: 0, duree_s: 600, + note: "site-infoclimat/data/complements.inc.php:241 (@Unit mm @Timespan 10 minutes)"} + + precipitation_amount_since_0h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 1000.0} + description_fr: Cumul de précipitations depuis 00 UTC (support variable dans la journée) + sources: + static: {colonne: pluie_cumul_0h, unite: mm, facteur: 1, offset: 0, duree_s: null, + note: support = minuit→dh_utc, normalisable en aval seulement} + + precipitation_amount_year: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 15000.0} + description_fr: Cumul de précipitations glissant sur l'année (compteur StatIC weatherlink) + sources: + complements: {colonne: rr_year, unite: mm, facteur: 1, offset: 0, duree_s: 31536000, + note: "site-infoclimat/data/complements.inc.php:37 (@Unit mm @Timespan year)"} + + rainfall_rate: + cf_standard_name: rainfall_rate + unite_si: kg m-2 h-1 + domaine: {min: 0.0, max: 500.0} + description_fr: Intensité de précipitation instantanée + sources: + static: {colonne: pluie_intensite, unite: mm h-1, facteur: 1, offset: 0, duree_s: 0} + + rainfall_rate_max_1h: + cf_standard_name: rainfall_rate + unite_si: kg m-2 h-1 + domaine: {min: 0.0, max: 500.0} + description_fr: Intensité maximale de précipitation sur 1 heure + sources: + static: {colonne: pluie_intensite_max_1h, unite: mm h-1, facteur: 1, offset: 0, duree_s: 3600} + + uv_index: + cf_standard_name: null # pas de standard name CF pour l'index UV + unite_si: "1" + domaine: {min: 0.0, max: 20.0} + description_fr: Index UV + sources: + static: {colonne: uv, unite: centi-index, facteur: 0.01, offset: 0, duree_s: 0, + note: "CONFIRMÉ 13/07 : centi-index (échantillon max 1782 ↔ uv_index complements max 17 — les deux sources concordent après /100)"} + complements: {colonne: uv_index, unite: "1", facteur: 1, offset: 0, duree_s: 0, + note: "CONFIRMÉ 13/07 : index UV direct (échantillon 0→17, n=1,85 M) — @Unit littéralement 'None' dans le code (site-infoclimat/data/complements.inc.php:9). CAS AMBIGU : deuxième source d'« UV index » distincte de static.uv, relation entre les deux non établie (même grandeur ? capteurs différents selon logiciel d'acquisition weatherlink/vws ?) — à échantillonner avant de fusionner ou de choisir une source prioritaire."} + mf_horaire: {colonne: UV_INDICE, unite: "1", facteur: 1, offset: 0, duree_s: 3600, + note: "indice UV horaire MF, sans unité — trou détecté par check_couverture 12/07"} + + uv_index_max: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 20.0} + description_fr: Index UV maximal (agrégat max, timespan non documenté à la source) + porte_occurrence: false + sources: + complements: {colonne: uv_index_max, unite: "1", facteur: 1, offset: 0, duree_s: null, + note: "CONFIRMÉ 13/07 : index UV direct (échantillon 0→17) — @Unit 'None', @Timespan 'TODO' dans le code source — aucune des deux n'est documentée. site-infoclimat/data/complements.inc.php:16"} + + duration_of_sunshine: + cf_standard_name: duration_of_sunshine + unite_si: s + domaine: {min: 0.0, max: 86400.0} + description_fr: Durée d'ensoleillement sur la période de la source + sources: + synop: {colonne: ensoleillement, unite: h, facteur: 3600, offset: 0, duree_s: null, + note: échantillon max 22,8 → heures ; support quotidien probable, à confirmer} + static: {colonne: ensoleillement, unite: h, facteur: 3600, offset: 0, duree_s: null, + unite_incertaine: true, + note: "trou détecté par check_couverture 12/07 (colonne Bronze non mappée) ; unité SUPPOSÉE = synop, à échantillonner"} + mf_horaire_tr: {colonne: insolh, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: HYPOTHÈSE minutes sur l'heure — à valider} + mf_infrahoraire_tr: {colonne: insolh, unite: min, facteur: 60, offset: 0, duree_s: 360} + mf_horaire: {colonne: INS, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "« en mn », pas de mention 1/10 pour les durées. Source : H_HTR_I_ITR.txt section H"} + + surface_downwelling_shortwave_flux_in_air: + cf_standard_name: surface_downwelling_shortwave_flux_in_air + unite_si: W m-2 + domaine: {min: 0.0, max: 1500.0} + description_fr: Rayonnement global instantané + sources: + synop: {colonne: radiations, unite: W m-2, facteur: 1, offset: 0, duree_s: 0} + + soil_temperature: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 220.0, max: 340.0} + description_fr: >- + Température du sol (profondeur non précisée à la source synop/static — CAS + AMBIGU : possible doublon partiel avec soil_temperature_10cm si la convention + WMO à 10 cm est celle réellement utilisée, non confirmé) + sources: + synop: {colonne: temperature_sol, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + static: {colonne: temperature_sol, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "PIÈGE, colonne quasi non alimentée (NULL en base le 2026-06-15) — cf. contracts/static-stations-obs.odcs.yaml"} + + surface_snow_thickness: + cf_standard_name: surface_snow_thickness + unite_si: m + domaine: {min: 0.0, max: 10.0} + description_fr: Épaisseur de neige au sol + sources: + synop: {colonne: neige_au_sol, unite: cm, facteur: 0.01, offset: 0, duree_s: 0} + mf_horaire: {colonne: NEIGETOT, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "« en cm », pas de mention 1/10. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: ht_neige, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + complements: {colonne: snow_height, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "site-infoclimat/data/complements.inc.php:184 (@Unit cm @Timespan instant)"} + + cloud_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité totale (octas convertis en fraction) + sources: + synop: {colonne: nebulosite, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: enum '0'..'8' à la source, casté numérique} + metar: {colonne: nebulosite, unite: okta, facteur: 0.125, offset: 0, duree_s: 0} + bouees: {colonne: nebulosite, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:66 (int(2), pas de COMMENT unité — hypothèse octa par cohérence avec synop/metar)"} + mf_horaire_tr: {colonne: n, unite: okta, facteur: 0.125, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: n, unite: okta, facteur: 0.125, offset: 0, duree_s: 0} + mf_horaire: {colonne: N, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "9 = ciel invisible (brouillard/etc.), à traiter en QC hors domaine [0,8]. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: nebulosite, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + cloud_area_fraction_lowest_layer: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: >- + Nébulosité de la couche nuageuse principale la plus basse (NBAS) — CAS AMBIGU : + relation avec cloud_layer_1_area_fraction (N1, « 1ère couche ») non établie ; les + deux pourraient désigner la même couche sous deux conventions MF différentes + (couche « principale la plus basse » vs couche numérotée 1) ou être réellement + distinctes. À échantillonner en base avant de trancher un éventuel alias. + sources: + mf_horaire: {colonne: NBAS, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: nbas, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "colonne 'nbas' du fichier nivo, unité non explicitée dans le contrat (description : « nébulosité basse »). Un second champ 'nnuage1' existe dans le même enregistrement nivo sans que sa relation à nbas soit documentée — cas ambigu supplémentaire, non modélisé séparément. data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + present_weather: + cf_standard_name: null # code OMM 4677/4680, pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 510.0} + description_fr: Temps présent (code OMM) + sources: + synop: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0} + static: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0} + metar: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0} + bouees: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0} + mf_horaire: {colonne: WW, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "table OMM 4677/4680. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + sea_surface_temperature: + cf_standard_name: sea_surface_temperature + unite_si: K + domaine: {min: 250.0, max: 310.0} + description_fr: Température de surface de la mer + sources: + bouees: {colonne: temperature_eau, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire: {colonne: TMER, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + + sea_surface_wave_significant_height: + cf_standard_name: sea_surface_wave_significant_height + unite_si: m + domaine: {min: 0.0, max: 25.0} + description_fr: Hauteur significative des vagues + sources: + bouees: {colonne: hauteur_vagues_1, unite: m, facteur: 1, offset: 0, duree_s: null, + note: colonne hauteur_vagues_1 — sémantique exacte (H1/3 vs Hmax) à confirmer} + mf_horaire: {colonne: HVAGUE, unite: m, facteur: 0.1, offset: 0, duree_s: null, + unite_incertaine: true, + note: "H_HTR_I_ITR.txt documente explicitement « en m et 1/10 » pour ce champ précis (contrairement à T, où l'évidence est contradictoire — cf. NOTE-A) : facteur 0.1 retenu avec une confiance modérément plus élevée, mais toujours à confirmer par échantillonnage. Source : H_HTR_I_ITR.txt section H"} + + sea_surface_wave_maximum_height: + cf_standard_name: null # non confirmé dans la table CF officielle (recherche 2026-07-12) — laissé null par prudence + unite_si: m + domaine: {min: 0.0, max: 30.0} + description_fr: >- + Deuxième mesure de hauteur de vagues (hauteur_vagues_5, bouées) — CAS AMBIGU : + la sémantique exacte de « _5 » (Hmax ? période de calcul différente ?) n'est + documentée nulle part dans le code consulté ; relation avec + sea_surface_wave_significant_height (hauteur_vagues_1) non établie. + sources: + bouees: {colonne: hauteur_vagues_5, unite: m, facteur: 1, offset: 0, duree_s: null, + unite_incertaine: true, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:57 (double, pas de COMMENT SQL sur l'unité — hypothèse m par cohérence avec hauteur_vagues_1)"} + + sea_surface_wave_mean_period: + cf_standard_name: sea_surface_wave_mean_period + unite_si: s + domaine: {min: 0.0, max: 30.0} + description_fr: Période moyenne des vagues + sources: + bouees: {colonne: periode_vagues, unite: s, facteur: 1, offset: 0, duree_s: null} + mf_horaire: {colonne: PVAGUE, unite: s, facteur: 0.1, offset: 0, duree_s: null, + unite_incertaine: true, + note: "« en s et 1/10 » documenté explicitement. Facteur 0.1 retenu, confiance modérée (cf. note sur HVAGUE). Source : H_HTR_I_ITR.txt section H"} + + sea_surface_wave_from_direction: + cf_standard_name: sea_surface_wave_from_direction + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction de la houle (sémaphores) — 999 = direction variable (sentinelle, pas une mesure) + sources: + mf_horaire: {colonne: DIRHOULE, unite: degree, facteur: 1, offset: 0, duree_s: null, + note: "999 = variable, à traiter comme sentinelle QC. Source : H_HTR_I_ITR.txt section H"} + + surface_air_pressure: + cf_standard_name: surface_air_pressure + unite_si: Pa + domaine: {min: 45000.0, max: 108500.0} + description_fr: Pression au niveau de la station (non ramenée mer) + sources: + mf_horaire_tr: {colonne: pres, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: pres, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_horaire: {colonne: PSTAT, unite: hPa, facteur: 100, offset: 0, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 1 — colonnes wide MF `Horaire` (Timescale, historique) consommées, + # nouvelles grandeurs (pas de correspondance dans les 33 entrées ci-dessus) + # ══════════════════════════════════════════════════════════════════════════════ + + duration_of_frost: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 86400.0} # borne élargie à 86400 (mf_quotidienne, fenêtre journalière) — était 3600 (mf_horaire seul) + description_fr: Durée de gel sous abri (T ≤ 0 °C) sur la période de la source — horaire (DG mf_horaire) ou quotidienne (DG mf_quotidienne) + sources: + mf_horaire: {colonne: DG, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DG, unite: min, facteur: 60, offset: 0, duree_s: 86400, + note: "CONFIRMÉ 13/07 : minutes (max échantillon = 1440 exactement) — « durée de gel sous abri (T ≤ 0°C) (en mn) » — cumul journalier, même grandeur que DG mf_horaire (facteur 60 identique). unite_incertaine car contracts/quotidienne-mf-timescale.odcs.yaml ne documente PAS cette colonne (seuls RR/TN/TX ont une property explicite) ; DDL (schemas/timescaledb/schema.sql.gz) déclare seulement `integer`, sans commentaire d'unité. Minutes confirmées uniquement par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + soil_temperature_10cm: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 220.0, max: 320.0} + description_fr: Température du sol à 10 cm de profondeur (T10 — n'existe pas pour les sémaphores) + sources: + mf_horaire: {colonne: T10, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_horaire_tr: {colonne: t_10, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "confirmé °C réel (pas 1/10) par contracts/infrahoraire-mf.odcs.yaml"} + mf_infrahoraire_tr: {colonne: t_10, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + + soil_temperature_20cm: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 220.0, max: 320.0} + description_fr: Température du sol à 20 cm de profondeur (T20) + sources: + mf_horaire: {colonne: T20, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_horaire_tr: {colonne: t_20, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: t_20, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + + soil_temperature_50cm: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 230.0, max: 315.0} + description_fr: Température du sol à 50 cm de profondeur (T50) + sources: + mf_horaire: {colonne: T50, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_horaire_tr: {colonne: t_50, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: t_50, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + + soil_temperature_100cm: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 240.0, max: 310.0} + description_fr: Température du sol à 1 m de profondeur (T100) + sources: + mf_horaire: {colonne: T100, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_horaire_tr: {colonne: t_100, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: t_100, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + + grass_minimum_temperature_10cm: + cf_standard_name: null # pas de standard name CF pour la « température minimale au-dessus du sol » (grass minimum) + unite_si: K + domaine: {min: 200.0, max: 330.0} + description_fr: >- + Température minimale à 10 cm AU-DESSUS du sol (TNSOL) — CAS AMBIGU DE NOMMAGE : + malgré le même nombre « 10 », cette grandeur n'a rien à voir avec + soil_temperature_10cm (qui est à 10 cm EN DESSOUS du sol) ; ce sont deux capteurs + différents mesurant deux positions opposées. Clé volontairement distincte + (grass_minimum_temperature_*) pour éviter toute confusion — à signaler + explicitement en revue. + porte_occurrence: false + sources: + mf_horaire: {colonne: TNSOL, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: TNSOL_H, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "citée par l'audit comme lue par mobile-api. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt ; data-platform/contracts/mf-data-fallback.odcs.yaml"} + mf_quotidienne: {colonne: TNSOL, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« température quotidienne minimale à 10 cm au-dessus du sol ». Même colonne MF (TNSOL) que la source mf_horaire ci-dessus, fenêtre journalière au lieu d'horaire — pas de collision (famille, colonne) distincte (mf_quotidienne vs mf_horaire). Unité non documentée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (DDL : double precision, sans commentaire) ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + grass_minimum_temperature_50cm: + cf_standard_name: null + unite_si: K + domaine: {min: 210.0, max: 325.0} + description_fr: >- + Température minimale à 50 cm AU-DESSUS du sol (TN50) — même remarque que + grass_minimum_temperature_10cm vis-à-vis de soil_temperature_50cm (positions + opposées, ne pas fusionner). + sources: + mf_horaire: {colonne: TN50, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: TN50, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« température quotidienne minimale à 50 cm au-dessus du sol ». Même remarque que grass_minimum_temperature_10cm/TNSOL (mf_quotidienne). Unité non documentée explicitement par le contrat (DDL : double precision) ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + road_surface_temperature: + cf_standard_name: null + unite_si: K + domaine: {min: 230.0, max: 345.0} + description_fr: >- + Température de surface mesurée sur herbe OU sur bitume selon le poste (TCHAUSSEE) + — CAS AMBIGU : la doc source ne permet pas de distinguer, pour une station + donnée, laquelle des deux surfaces est réellement mesurée ; la clé « route » + est un choix de nommage par défaut (majorité des postes équipés = stations + routières), possiblement trompeur pour les postes « herbe ». + sources: + mf_horaire: {colonne: TCHAUSSEE, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + + surface_wetness_duration: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 3600.0} + description_fr: Durée d'humectation de la surface dans l'heure (DHUMEC) + sources: + mf_horaire: {colonne: DHUMEC, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + duration_relative_humidity_below_40pct: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 3600.0} + description_fr: Durée avec humidité relative ≤ 40 % dans l'heure (DHUMI40) + sources: + mf_horaire: {colonne: DHUMI40, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + duration_relative_humidity_above_80pct: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 3600.0} + description_fr: Durée avec humidité relative ≥ 80 % dans l'heure (DHUMI80) + sources: + mf_horaire: {colonne: DHUMI80, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + water_vapor_partial_pressure_in_air: + cf_standard_name: water_vapor_partial_pressure_in_air # confirmé NERC Vocabulary Server (miroir CF), non revérifié contre la table officielle cfconventions.org + unite_si: Pa + domaine: {min: 0.0, max: 7000.0} + description_fr: Tension de vapeur (TSV) + sources: + mf_horaire: {colonne: TSV, unite: hPa, facteur: 100, offset: 0, duree_s: 0, + note: "NOTE-A (documenté 1/10 hPa). Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: TSV_H, unite: hPa, facteur: 100, offset: 0, duree_s: 0, + note: "Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + geopotential_height: + cf_standard_name: geopotential_height + unite_si: m + domaine: {min: 700.0, max: 3000.0} + description_fr: >- + Géopotentiel du poste (GEOP), renseigné uniquement pour les stations d'altitude + supérieure à 750 m + sources: + mf_horaire: {colonne: GEOP, unite: mgp, facteur: 1, offset: 0, duree_s: 0, + note: "CONFIRMÉ 13/07 : mètres géopotentiels (échantillon 1200→1661) — mètre géopotentiel (mgp) assimilé au mètre standard par approximation usuelle — écart réel négligeable aux altitudes concernées mais non vérifié formellement ici. Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_1_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité de la 1ère couche nuageuse (N1) + sources: + mf_horaire: {colonne: N1, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_1_type: + cf_standard_name: null # code SYNOP, pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre (code SYNOP OMM-N°407) de la 1ère couche nuageuse (C1) + sources: + mf_horaire: {colonne: C1, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_1_base_height: + cf_standard_name: null # CF a cloud_base_altitude (référentiel MSL) ; B1 est une hauteur AGL, pas confirmé équivalent — laissé null par prudence + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: Base de la 1ère couche nuageuse (B1) + sources: + mf_horaire: {colonne: B1, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: B1_H, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "citée par l'audit comme « plafond » lu par mobile-api. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + cloud_layer_2_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité de la 2ème couche nuageuse (N2) + sources: + mf_horaire: {colonne: N2, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_2_type: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre de la 2ème couche nuageuse (C2) + sources: + mf_horaire: {colonne: C2, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_2_base_height: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: Base de la 2ème couche nuageuse (B2) + sources: + mf_horaire: {colonne: B2, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_3_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité de la 3ème couche nuageuse (N3) + sources: + mf_horaire: {colonne: N3, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_3_type: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre de la 3ème couche nuageuse (C3) + sources: + mf_horaire: {colonne: C3, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_3_base_height: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: Base de la 3ème couche nuageuse (B3) + sources: + mf_horaire: {colonne: B3, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_4_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité de la 4ème couche nuageuse (N4) + sources: + mf_horaire: {colonne: N4, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_4_type: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre de la 4ème couche nuageuse (C4) + sources: + mf_horaire: {colonne: C4, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_4_base_height: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: Base de la 4ème couche nuageuse (B4) + sources: + mf_horaire: {colonne: B4, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + duration_low_visibility_200m: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 3600.0} + description_fr: Durée avec visibilité < 200 m dans l'heure (DVV200) + sources: + mf_horaire: {colonne: DVV200, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + past_weather_1: + cf_standard_name: null # code OMM 4687, pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Temps passé 1 (code OMM W1) + sources: + mf_horaire: {colonne: W1, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: W1_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "citée explicitement par l'audit comme lue par mobile-api. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt ; data-platform/contracts/mf-data-fallback.odcs.yaml"} + + past_weather_2: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Temps passé 2 (code OMM W2) + sources: + mf_horaire: {colonne: W2, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: W2_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "citée explicitement par l'audit. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + ground_state: + cf_standard_name: null # code OMM (table SOL), pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: État du sol sans neige (code SOL, table OMM — 0=sec ... 9=très sec avec fissures) + sources: + mf_horaire: {colonne: SOL, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: SOL_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + ground_state_snow: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: État du sol avec neige (code SOLNG, table OMM) + sources: + mf_horaire: {colonne: SOLNG, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: SOLNG_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + sea_visibility_code: + cf_standard_name: null # code OMM (0-9), pas une grandeur physique continue — distinct de visibility_in_air (mètres) + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Visibilité vers la mer pour les sémaphores, codée 0 (< 50 m) à 9 (≥ 50 km) — VVMER + sources: + mf_horaire: {colonne: VVMER, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + sea_state_code: + cf_standard_name: null # échelle Douglas codée, pas une hauteur de vague continue + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: >- + État de la mer pour les sémaphores, code 0 (calme) à 9 (énorme, > 14 m) — ETATMER. + CAS AMBIGU : recouvre partiellement sea_surface_wave_significant_height (échelle + Douglas codée vs mesure continue en mètres) ; les deux entrées sont conservées + distinctes car les échelles ne sont pas interconvertibles terme à terme. + sources: + mf_horaire: {colonne: ETATMER, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: ETATMER_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "citée explicitement par l'audit. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + snowfall_thickness_1h: + cf_standard_name: thickness_of_snowfall_amount # confirmé NERC Vocabulary Server (miroir CF) + unite_si: m + domaine: {min: 0.0, max: 1.0} + description_fr: Hauteur de neige fraîche tombée en 1 h (HNEIGEFI1, facultatif hors heures synoptiques) + sources: + mf_horaire: {colonne: HNEIGEFI1, unite: cm, facteur: 0.01, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: HNEIGEFI1_H, unite: cm, facteur: 0.01, offset: 0, duree_s: 3600, + note: "citée explicitement par l'audit. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + snowfall_thickness_3h: + cf_standard_name: thickness_of_snowfall_amount + unite_si: m + domaine: {min: 0.0, max: 1.5} + description_fr: Hauteur de neige fraîche tombée en 3 h (HNEIGEFI3, facultatif aux heures intermédiaires) + sources: + mf_horaire: {colonne: HNEIGEFI3, unite: cm, facteur: 0.01, offset: 0, duree_s: 10800, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: HNEIGEFI3_H, unite: cm, facteur: 0.01, offset: 0, duree_s: 10800, + note: "citée explicitement par l'audit. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + snowfall_thickness_6h: + cf_standard_name: thickness_of_snowfall_amount + unite_si: m + domaine: {min: 0.0, max: 2.0} + description_fr: Hauteur de neige fraîche tombée en 6 h, toujours renseignée aux heures synoptiques principales (HNEIGEF) + sources: + mf_horaire: {colonne: HNEIGEF, unite: cm, facteur: 0.01, offset: 0, duree_s: 21600, + note: "Source : H_HTR_I_ITR.txt section H"} + + snow_surface_temperature: + cf_standard_name: null # pas de standard name CF distinct pour la température de surface de la neige + unite_si: K + domaine: {min: 200.0, max: 275.0} + description_fr: Température de surface de la neige (TSNEIGE) + sources: + mf_horaire: {colonne: TSNEIGE, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: t_neige, unite: K, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_tube_penetration_depth: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 5.0} + description_fr: Enfoncement du tube de neige (TUBENEIGE) + sources: + mf_horaire: {colonne: TUBENEIGE, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "« en cm », pas de mention 1/10. Source : H_HTR_I_ITR.txt section H"} + + surface_downwelling_shortwave_energy_1h: + cf_standard_name: null # accumulation horaire (J/m2), distincte de surface_downwelling_shortwave_flux_in_air (flux instantané W/m2) — pas de standard name CF « intégré dans le temps » confirmé pour cette forme précise + unite_si: J m-2 + domaine: {min: 0.0, max: 5400000.0} + description_fr: Rayonnement global cumulé sur l'heure, référentiel UTC (GLO) + sources: + mf_horaire: {colonne: GLO, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + surface_downwelling_shortwave_energy_1h_tsv: + cf_standard_name: null + unite_si: J m-2 + domaine: {min: 0.0, max: 5400000.0} + description_fr: >- + Rayonnement global cumulé sur l'heure, référentiel temps solaire vrai (GLO2) — + même grandeur que surface_downwelling_shortwave_energy_1h, référentiel temporel + différent (heure TSV et non UTC) ; conservée comme entrée distincte car les deux + colonnes coexistent dans le même enregistrement Horaire sans relation triviale + (bornes d'heure décalées, pas une simple conversion de fuseau constant) + sources: + mf_horaire: {colonne: GLO2, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "seul le _H (GLO2_H) apparaît consommé par mobile-api d'après mf_data.txt — DIR2/DIF2/UV2/INFRAR2/INS2 (mêmes variantes TSV pour d'autres rayonnements) ne le sont pas, cf. non_retenus. Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: GLO2_H, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + surface_direct_downwelling_shortwave_energy_1h: + cf_standard_name: null + unite_si: J m-2 + domaine: {min: 0.0, max: 5400000.0} + description_fr: Rayonnement direct cumulé sur l'heure, référentiel UTC (DIR) + sources: + mf_horaire: {colonne: DIR, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + surface_diffuse_downwelling_shortwave_energy_1h: + cf_standard_name: null + unite_si: J m-2 + domaine: {min: 0.0, max: 2000000.0} + description_fr: Rayonnement diffus cumulé sur l'heure, référentiel UTC (DIF) + sources: + mf_horaire: {colonne: DIF, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + surface_downwelling_infrared_energy_1h: + cf_standard_name: null # MF documente « infra-rouge », non confirmé équivalent au longwave CF (bande spectrale non précisée dans la doc source) + unite_si: J m-2 + domaine: {min: 0.0, max: 1800000.0} + description_fr: Rayonnement infrarouge cumulé sur l'heure, référentiel UTC (INFRAR) + sources: + mf_horaire: {colonne: INFRAR, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 2 — static.complements (33 sous-champs packés, site-infoclimat/data/ + # complements.inc.php) : nouvelles grandeurs. Les fusions (uv_index, snow_height, + # tn_1h/tx_1h, rafale_max_day) sont déjà faites dans les entrées de la tranche 0. + # fuseau (offset de fuseau horaire de la station) est un métadonnée, pas une + # observation → non_retenus. heure_tn_interieur/heure_tx_interieur/ + # heure_hr_interieur_min/heure_hr_interieur_max/tx_heure/tn_heure sont des heures + # d'occurrence pures → portées par porte_occurrence, pas d'entrée séparée. + # ══════════════════════════════════════════════════════════════════════════════ + + surface_downwelling_shortwave_flux_in_air_max_day: + cf_standard_name: null # variante « max journalier » de surface_downwelling_shortwave_flux_in_air ; pas de standard name CF pour l'agrégat max + unite_si: W m-2 + domaine: {min: 0.0, max: 1500.0} + description_fr: Rayonnement global maximal instantané sur la journée (solar_rad_max) + sources: + complements: {colonne: solar_rad_max, unite: "W m-2", facteur: 1, offset: 0, duree_s: 86400, + note: "CONFIRMÉ 13/07 : W/m² (99,9985 % ≤ 1500 ; ~30 aberrantes → QC) — @Unit 'None' dans le code — unité W/m2 supposée par cohérence avec radiations/GLO, NON confirmée. site-infoclimat/data/complements.inc.php:23"} + + air_temperature_max_month: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température maximale du mois glissant (compteur StatIC weatherlink, tx_month) + sources: + complements: {colonne: tx_month, unite: degC, facteur: 1, offset: 273.15, duree_s: 2678400, + note: "site-infoclimat/data/complements.inc.php:30 (@Unit °C @Timespan month)"} + + air_temperature_min_month: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température minimale du mois glissant (compteur StatIC weatherlink, tn_month) + sources: + complements: {colonne: tn_month, unite: degC, facteur: 1, offset: 273.15, duree_s: 2678400, + note: "site-infoclimat/data/complements.inc.php:51 (@Unit °C @Timespan month)"} + + evapotranspiration_month: + cf_standard_name: null # pas d'équivalent CF direct pour l'évapotranspiration potentielle (ET_month, non distingué actual/potential dans la source) + unite_si: kg m-2 + domaine: {min: 0.0, max: 300.0} + description_fr: Évapotranspiration cumulée du mois glissant (ET_month) + sources: + complements: {colonne: ET_month, unite: "unknown", facteur: 1, offset: 0, duree_s: 2678400, + unite_incertaine: true, + note: "@Unit littéralement 'TODO' dans le code — mm (kg/m2) supposé par convention météo usuelle, NON confirmé. site-infoclimat/data/complements.inc.php:44"} + + evapotranspiration_year: + cf_standard_name: null + unite_si: kg m-2 + domaine: {min: 0.0, max: 2500.0} + description_fr: Évapotranspiration cumulée glissante sur l'année (ET_year) + sources: + complements: {colonne: ET_year, unite: "unknown", facteur: 1, offset: 0, duree_s: 31536000, + unite_incertaine: true, + note: "@Unit 'TODO' dans le code. site-infoclimat/data/complements.inc.php:114"} + + ic_indoor_air_temperature: + cf_standard_name: null # air_temperature CF suppose implicitement une mesure extérieure sous abri météo standard ; distinction volontaire pour une mesure intérieure + unite_si: K + domaine: {min: 250.0, max: 330.0} + description_fr: Température intérieure (capteur console StatIC weatherlink, t_interieur) + sources: + complements: {colonne: t_interieur, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "site-infoclimat/data/complements.inc.php:65 (@Unit °C @Timespan instant)"} + + ic_indoor_air_temperature_min_day: + cf_standard_name: null + unite_si: K + domaine: {min: 250.0, max: 330.0} + description_fr: Température intérieure minimale du jour (tn_interieur_day) + porte_occurrence: true # heure_tn_interieur + sources: + complements: {colonne: tn_interieur_day, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "site-infoclimat/data/complements.inc.php:72 (@Timespan TODO — jour supposé par le nom du champ, non confirmé)"} + + ic_indoor_air_temperature_max_day: + cf_standard_name: null + unite_si: K + domaine: {min: 250.0, max: 330.0} + description_fr: Température intérieure maximale du jour (tx_interieur_day) + porte_occurrence: true # heure_tx_interieur + sources: + complements: {colonne: tx_interieur_day, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "site-infoclimat/data/complements.inc.php:79 (@Timespan TODO)"} + + wind_chill_of_temperature: + cf_standard_name: wind_chill_of_temperature # nom plausible d'après connaissance générale des conventions CF, NON revérifié contre la table officielle + unite_si: K + domaine: {min: 200.0, max: 320.0} + description_fr: Refroidissement éolien ressenti (windchill) + sources: + complements: {colonne: windchill, unite: "unknown", facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "@Unit littéralement 'None' — impossible de déterminer si la valeur stockée est déjà en °C, en K, ou dans une autre échelle (le calcul windchill des consoles Davis peut être en °F selon la locale). site-infoclimat/data/complements.inc.php:100"} + + ic_heat_index: + cf_standard_name: null # heat index = indice empirique NWS US, pas de standard name CF + unite_si: K + domaine: {min: 270.0, max: 330.0} + description_fr: Indice de chaleur ressentie (heat_index) + sources: + complements: {colonne: heat_index, unite: "unknown", facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "@Unit 'None' — même réserve que windchill. site-infoclimat/data/complements.inc.php:107"} + + ic_indoor_relative_humidity: + cf_standard_name: null + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative intérieure (hr_interieur) + sources: + complements: {colonne: hr_interieur, unite: "%", facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/data/complements.inc.php:122 (@Unit % @Timespan instant)"} + + ic_indoor_relative_humidity_min: + cf_standard_name: null + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative intérieure minimale (hr_interieur_min) + porte_occurrence: true # heure_hr_interieur_min + sources: + complements: {colonne: hr_interieur_min, unite: "%", facteur: 1, offset: 0, duree_s: null, + note: "@Timespan TODO. site-infoclimat/data/complements.inc.php:130"} + + ic_indoor_relative_humidity_max: + cf_standard_name: null + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative intérieure maximale (hr_interieur_max) + porte_occurrence: true # heure_hr_interieur_max + sources: + complements: {colonne: hr_interieur_max, unite: "%", facteur: 1, offset: 0, duree_s: null, + note: "@Timespan TODO. site-infoclimat/data/complements.inc.php:138"} + + ic_battery_voltage: + cf_standard_name: null + unite_si: V + domaine: {min: 0.0, max: 15.0} + description_fr: Tension de la batterie de la station (battery_tension) + technique: true # ADR-0004 §7 — mesure technique, exclue par défaut des produits météo + sources: + complements: {colonne: battery_tension, unite: V, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/data/complements.inc.php:191 (@Unit V @Timespan instant)"} + + surface_downwelling_shortwave_energy_10min: + cf_standard_name: null + unite_si: J m-2 + domaine: {min: 0.0, max: 900000.0} + description_fr: Énergie solaire cumulée sur 10 minutes (solar_energy_10mn, StatIC) + sources: + complements: {colonne: solar_energy_10mn, unite: MJ m-2, facteur: 1000000, offset: 0, duree_s: 600, + note: "site-infoclimat/data/complements.inc.php:198 (@Unit MJ/m² @Timespan 10 minutes)"} + + ic_snow_depth_sensor_quality_factor: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 600.0} # plage constructeur SR50, échantillon 13/07 max 422 + description_fr: Facteur qualité du capteur de hauteur de neige SR50A, lié à surface_snow_thickness (sr50_qfactor) + technique: true # ADR-0004 §7 — facteur qualité instrument, exemple cité explicitement par l'ADR + sources: + complements: {colonne: sr50_qfactor, unite: "1", facteur: 1, offset: 0, duree_s: 0, + note: "CONFIRMÉ 13/07 : facteur qualité SR50 sans unité (échantillon 0→422, plage constructeur ~0-600) — @Unit littéralement 'arbitrary' dans le code — pas d'unité SI réelle, domaine de valeur du capteur SR50A à vérifier auprès du fabricant. site-infoclimat/data/complements.inc.php:233"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 3 — codes `_H` de mf_data (MariaDB fallback) : voir note en tête de + # fichier. Les grandeurs sont IDENTIQUES à la tranche 1 ; seules les sources + # explicitement citées par l'audit comme lues par mobile-api ont reçu un bloc + # `mf_data` dédié (déjà ajouté ci-dessus : past_weather_1/2, cloud_layer_1_base_height, + # grass_minimum_temperature_10cm, snowfall_thickness_1h/3h, sea_state_code, + # ground_state, ground_state_snow, water_vapor_partial_pressure_in_air). + # Aucune nouvelle entrée dans cette tranche. + # ══════════════════════════════════════════════════════════════════════════════ + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 4 — bouées / mer (site-infoclimat/cron/yearly/creer_tables_annee.php:41-68) + # ══════════════════════════════════════════════════════════════════════════════ + + sea_ice_accretion_code: + cf_standard_name: null # code OMM 1751, pas une grandeur physique continue + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Accrétion de glace sur la structure (code table OMM 1751, acc_glace) + sources: + bouees: {colonne: acc_glace, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:63 (COMMENT SQL : 'table omm 1751')"} + + sea_ice_thickness: + cf_standard_name: sea_ice_thickness + unite_si: m + domaine: {min: 0.0, max: 5.0} + description_fr: Épaisseur de la glace de mer accrétée (epaisseur_glace) + sources: + bouees: {colonne: epaisseur_glace, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:64 (COMMENT SQL : 'centimetres')"} + + sea_ice_accretion_rate_code: + cf_standard_name: null # code OMM 3551, pas une grandeur physique continue + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Taux d'accrétion de glace (code table OMM 3551, vitesse_glace) + sources: + bouees: {colonne: vitesse_glace, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:65 (COMMENT SQL : 'table omm 3551')"} + + cloud_type_low: + cf_standard_name: null # code SYNOP (Atlas international des nuages OMM-N°407), pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre des nuages bas (code SYNOP, CL) + sources: + bouees: {colonne: CL, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:60"} + mf_horaire: {colonne: CL, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: cl, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + cloud_type_medium: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre des nuages moyens (code SYNOP, CM) + sources: + bouees: {colonne: CM, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:61"} + mf_horaire: {colonne: CM, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: cm, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + cloud_type_high: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre des nuages élevés (code SYNOP, CH) + sources: + bouees: {colonne: CH, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:62"} + mf_horaire: {colonne: CH, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: ch, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 5 — enneigement (nivo), data-platform/contracts/ + # source-meteofrance-donnees-libres-nivo.odcs.yaml. Champs avalanche/nivologie + # ultra-spécialisés (codes bulletin) volontairement laissés en non_retenus — voir + # bloc non_retenus.mf_nivo en fin de fichier pour la justification du périmètre. + # ══════════════════════════════════════════════════════════════════════════════ + + cloud_base_height_lowest_layer: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: >- + Hauteur de la base de la couche nuageuse basse (hbas, nivo) — CAS AMBIGU : relation + avec cloud_layer_1_base_height (B1) non établie, même remarque que + cloud_area_fraction_lowest_layer vis-à-vis de N1/NBAS. + sources: + mf_nivo: {colonne: hbas, unite: m, facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "unité non explicitée dans le contrat, m supposé par cohérence avec B1-B4. data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_state_code: + cf_standard_name: null # code descriptif OMM (ESNEIGE), pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: >- + État descriptif de la neige pour les postes nivométéorologiques (etat_neige) — + même échelle que le code ESNEIGE documenté dans H_HTR_I_ITR.txt (0=neige fraîche + sèche ... 9=surface lisse et glacée), colonne ESNEIGE elle-même non consommée côté + wide MF (cf. non_retenus.mf_horaire) + sources: + mf_nivo: {colonne: etat_neige, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + fresh_snow_thickness: + cf_standard_name: thickness_of_snowfall_amount + unite_si: m + domaine: {min: 0.0, max: 2.0} + description_fr: >- + Épaisseur de neige fraîche (ssfrai, nivo), fenêtre temporelle variable donnée par + le champ compagnon perssfrai (non modélisé séparément — durée de mesure, pas une + grandeur météo) + sources: + mf_nivo: {colonne: ssfrai, unite: cm, facteur: 0.01, offset: 0, duree_s: null, + note: "durée réelle dans perssfrai (h), variable. data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_fresh_snow_thickness_secondary: + cf_standard_name: thickness_of_snowfall_amount + unite_si: m + domaine: {min: 0.0, max: 2.0} + description_fr: >- + Second champ « neige fraîche » du même enregistrement nivo (neige_fraiche) — CAS + AMBIGU : sémantique exacte non distinguée de fresh_snow_thickness (ssfrai) dans la + documentation source ; conservé comme entrée séparée plutôt que fusionné, faute de + certitude sur l'équivalence + sources: + mf_nivo: {colonne: neige_fraiche, unite: cm, facteur: 0.01, offset: 0, duree_s: null, + unite_incertaine: true, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_probe_depth: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 10.0} + description_fr: Profondeur de sondage du manteau neigeux (prof_sonde, nivo) + sources: + mf_nivo: {colonne: prof_sonde, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_water_content: + cf_standard_name: null + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Teneur en eau du manteau neigeux (teneur_eau, nivo) + sources: + mf_nivo: {colonne: teneur_eau, unite: "%", facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_grain_diameter: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 0.02} + description_fr: Diamètre du grain de neige prédominant (grain_diametre, nivo) + sources: + mf_nivo: {colonne: grain_diametre, unite: mm, facteur: 0.001, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_snow_grain_type_code: + cf_standard_name: null # classification internationale de la neige (UNESCO 1990), pas une grandeur physique continue + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: >- + Type de grain prédominant du manteau neigeux (grain_predom, nivo) — classification + internationale de la neige saisonnière, cardinalité exacte du code non vérifiée + (domaine 0-9 par défaut, à confirmer) + sources: + mf_nivo: {colonne: grain_predom, unite: code, facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "domaine du code non documenté dans le contrat. data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_density: + cf_standard_name: snow_density # confirmé NERC Vocabulary Server (miroir CF) + unite_si: kg m-3 + domaine: {min: 0.0, max: 1000.0} + description_fr: Masse volumique de la neige (m_vol_neige, nivo) + sources: + mf_nivo: {colonne: m_vol_neige, unite: kg m-3, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_wind_speed_at_altitude_station: + cf_standard_name: wind_speed + unite_si: m s-1 + domaine: {min: 0.0, max: 75.0} + description_fr: >- + Vitesse du vent d'un point de mesure en altitude compagnon (ff_alti, nivo) — + second point de mesure dans le même enregistrement, sans identifiant de station + propre dans le contrat consulté (limitation de modélisation, non résolue ici) + sources: + mf_nivo: {colonne: ff_alti, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_wind_from_direction_at_altitude_station: + cf_standard_name: wind_from_direction + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction du vent au point de mesure en altitude compagnon (dd_alti, nivo) + sources: + mf_nivo: {colonne: dd_alti, unite: degree, facteur: 1, offset: 0, duree_s: 600, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_snow_thickness_at_altitude_station: + cf_standard_name: surface_snow_thickness + unite_si: m + domaine: {min: 0.0, max: 15.0} + description_fr: Hauteur de neige au point de mesure en altitude compagnon (ht_neige_alti, nivo) + sources: + mf_nivo: {colonne: ht_neige_alti, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_snow_drifting_indicator: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Indicateur de chasse-neige (chasse_neige, nivo) + sources: + mf_nivo: {colonne: chasse_neige, unite: "unknown", facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "échelle du code non documentée dans le contrat (booléen ? intensité ?). data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 6 — table Timescale `Quotidienne` (climatologie quotidienne MF, + # contracts/quotidienne-mf-timescale.odcs.yaml), famille `mf_quotidienne`. + # 23 des 26 colonnes rejoignent des clés existantes (tranches 0/1 ci-dessus, + # sources ajoutées en place). Les 3 grandeurs ci-dessous n'ont pas d'équivalent : + # TM (moyenne vraie horaire) et TNTXM ((TN+TX)/2) sont DISTINCTES par construction + # (cf. site-infoclimat/include/MeteoFrance/quotidiennes.php:556, COALESCE(TNTXM, TM) + # — un repli de l'une vers l'autre, pas une fusion) ; TAMPLI est une différence de + # température (TX-TN), pas une température absolue. + # ══════════════════════════════════════════════════════════════════════════════ + + air_temperature_mean: + cf_standard_name: air_temperature # même base que air_temperature_min/_max (cell_methods mean, pas de standard name CF distinct) + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: >- + Moyenne quotidienne des températures horaires sous abri (TM) — moyenne calculée à + partir des relevés horaires effectivement observés dans la journée, DISTINCTE de + air_temperature_midrange (TNTXM, moyenne arithmétique des seuls extrêmes TN/TX). + site-infoclimat/include/MeteoFrance/quotidiennes.php:556 traite TNTXM comme un + repli (COALESCE) vers TM quand TM est absent, ce qui confirme que ce sont deux + calculs différents et non des synonymes. + sources: + mf_quotidienne: {colonne: TM, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« moyenne quotidienne des températures horaires sous abri ». Unité non documentée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (DDL : double precision, sans commentaire) ; confirmée par la doc source amont (parseCSV.ts), facteur=1 par cohérence avec RR/TN/TX (NOTE-A : « et 1/10 » = précision décimale, pas facteur d'échelle). Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + air_temperature_midrange: + cf_standard_name: null # pas de standard name CF pour la moyenne des seuls extrêmes (« midrange » climatologique) ; distinct de air_temperature (cell_methods mean, qui couvrirait plutôt TM) + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: >- + Moyenne quotidienne (TN+TX)/2 (TNTXM) — moyenne arithmétique des seuls extrêmes + journaliers (« midrange »), DISTINCTE de air_temperature_mean (TM, moyenne vraie + des relevés horaires). Volontairement non fusionnée avec TM malgré la parenté + sémantique : ce sont deux estimateurs différents de la température moyenne du + jour, coexistant dans le même enregistrement Quotidienne (cf. note sur + air_temperature_mean). + sources: + mf_quotidienne: {colonne: TNTXM, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« moyenne quotidienne (TN+TX)/2 » — calcul arithmétique des extrêmes, pas une moyenne des observations horaires. Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + air_temperature_range: + cf_standard_name: null # pas de standard name CF officiel confirmé pour l'amplitude thermique diurne (DTR climatologique, ETCCDI) — à revérifier + unite_si: K + domaine: {min: 0.0, max: 40.0} + description_fr: >- + Amplitude thermique quotidienne, écart entre TX et TN quotidiens (TAMPLI) — DELTA + de température, pas une température absolue. site-infoclimat/include/MeteoFrance/ + quotidiennes.php:718 calcule d'ailleurs COALESCE(TAMPLI, TX-TN), confirmant + l'identité entre la colonne et le calcul TX-TN. + sources: + mf_quotidienne: {colonne: TAMPLI, unite: degC, facteur: 1, offset: 0, duree_s: 86400, + note: "« amplitude thermique quotidienne : écart entre TX et TN quotidiens (TX-TN) ». offset=0 volontairement (une différence en °C égale la même différence en K — ne PAS appliquer +273.15, contrairement à toute température absolue de ce fichier). Unité non documentée explicitement par le contrat ; confirmée par la doc source amont et par le calcul PHP de repli. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts ; site-infoclimat/include/MeteoFrance/quotidiennes.php:718"} + +# Colonnes vues et volontairement NON retenues dans ce vocabulaire (traçabilité +# ADR-0004). Reprend le bloc du POC (synop/static/metar/bouees/mae inchangé, SAUF +# bouees : CL, CM, CH, acc_glace, epaisseur_glace, vitesse_glace et hauteur_vagues_5 +# sont RETIRÉS de cette liste car désormais modélisés en tranche 4 — laisser une +# colonne à la fois "non retenue" et "définie comme paramètre" serait incohérent. +# nebulosite (bouees) était déjà non_retenu mais rejoint cloud_area_fraction (source +# ajoutée en tranche 0) pour la même raison ; lat/lng restent non_retenus (position +# par observation, cf. ADR-0007 amendée §4.2, colonnes observation.lat/lon dédiées et +# non un paramètre du vocabulaire) ; raw_msg reste hors périmètre (archivistique, +# Bronze). +non_retenus: + synop: [temps_passe1, temps_passe2, etat_sol, plafond_nuageux, type_nuages, raw_msg, source] + static: [complements, source] + metar: [source] + bouees: [lat, lng, raw_msg] + mae: [source] + # Tranche 1 — colonnes wide MF Horaire confirmées NON consommées (mf_data.txt, + # marquées "--COLONNE--" = absentes de la table mf_data malgré leur présence dans + # Horaire). ESNEIGE et CHARGENEIGE : le nom ESNEIGE de la table Horaire n'est pas + # consommé, mais la même sémantique de code EST consommée côté nivo → voir + # snow_state_code (tranche 5), pas une contradiction. + mf_horaire: [DIR2, DIF2, UV, UV2, INFRAR2, INS2, TLAGON, TVEGETAUX, ECOULEMENT, + ESNEIGE, CHARGENEIGE] + # Tranche 5 — champs nivo hors périmètre météo (codes bulletin avalanche, codes + # internes sans grandeur physique associée, ou doublons non résolus jugés trop + # spéculatifs pour être modélisés sans confirmation). + mf_nivo: [phenspe1, phenspe2, nuage_val, grain_nombre, homogeneite, + aval_descr, aval_genre, aval_depart, aval_expo, aval_risque] From 9f0d1766cdf0d1401ce6e93797170725fc7cca6a Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:25:44 +0200 Subject: [PATCH 29/31] =?UTF-8?q?docs(adr-0008):=20pr=C3=A9visions=20num?= =?UTF-8?q?=C3=A9riques=20=E2=80=94=20dimensions=20partag=C3=A9es,=20table?= =?UTF-8?q?=20s=C3=A9par=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adr/0008-modele-canonique-previsions.md | 227 ++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 adr/0008-modele-canonique-previsions.md diff --git a/adr/0008-modele-canonique-previsions.md b/adr/0008-modele-canonique-previsions.md new file mode 100644 index 0000000..cc3ac46 --- /dev/null +++ b/adr/0008-modele-canonique-previsions.md @@ -0,0 +1,227 @@ +# ADR-0008 — Prévisions numériques : dimensions partagées, table séparée + +- Statut : proposée +- Date : 2026-07-27 +- Décideurs : data engineer (pam) + +> Répond à une question posée pendant le POC canonique : faut-il verser les +> sorties des modèles de prévision (AROME, ARPEGE, GFS…) dans la table +> `observation` du canonique « pour tout harmoniser » ? Prolonge ADR-0004 +> (vocabulaire, explicitement borné à l'observation), ADR-0005 (identité +> stations) et ADR-0007 (modèle canonique long, chaud et froid). + +## Contexte + +Les modèles vivent aujourd'hui dans un monde parallèle au reste de la donnée. +`modeles-ncl` télécharge et décode les runs (AROME, ARPEGE, GEFS, COAMPS, BOM, +WRF…), `modeles-php` orchestre les lancements sur srx-modeles-2, et la sortie +utile est une **image** : des cartes NCL. Entre le GRIB décodé et la carte, il +n'existe aucune matérialisation requêtable, aucun vocabulaire commun avec +l'observation, aucun rattachement au référentiel stations. + +Conséquences concrètes, toutes constatées : + +- **Impossible de comparer prévu et observé** sans réécrire un mapping ad hoc : + le modèle sort `T2M` ou `t2m` en kelvin sur une grille, l'observation sort + `air_temperature` en kelvin sur une station — les deux disent la même chose et + ne se joignent pas. +- **Aucun score de vérification** n'est calculé ni publié (biais, RMSE, taux de + bonne détection), alors que c'est la métrique la plus demandée sur un service + météo participatif et le premier argument de transparence. +- **Une page station ne peut pas juxtaposer** la mesure et la prévision au même + point : il n'y a pas de prévision « au point station », seulement des rasters. + +D'où la tentation d'unifier par le bas : une seule table `observation`, on y met +tout, le problème de vocabulaire disparaît. Cette ADR tranche ce point. + +Rappel du grain canonique (ADR-0007) : `(station_id, dh_utc, parametre_id, +duree_s)` → `valeur`, avec `qc_flag`, `version_obs`, `source_id`. + +## Décision + +**Les sorties de modèle ne rejoignent pas la table `observation`. Elles +réutilisent en revanche l'intégralité des dimensions du canonique — vocabulaire, +identité des stations, sémantique des durées, unités SI — et se matérialisent +dans une table sœur `prevision`, réservée aux prévisions ponctuelles extraites +aux stations. Les champs grillés restent dans leur format natif.** + +### 1. `observation` reste la table des observations + +Quatre raisons, dont la première est dirimante. + +**1a. La clé n'a pas les bons axes.** Une prévision n'est pas identifiée par +`(station, instant, paramètre, durée)`. Il y manque le **run** (heure +d'analyse) : pour un même instant valide, les runs successifs produisent +plusieurs prévisions qui coexistent légitimement. Il y manque le **modèle** et, +pour les ensembles, le **membre**. + +Et `version_obs` n'est pas le refuge de ces axes. Ce champ versionne la +**correction d'une vérité unique** — une mesure re-validée remplace la +précédente, la dernière version fait foi. Deux prévisions de runs différents ne +se corrigent pas l'une l'autre. Les confondre ferait mentir `obs_last` +(« dernière valeur connue » n'aurait plus de sens) et la contrainte d'unicité de +la PK. + +**1b. La géométrie diffère.** `dim_station` (ADR-0005) référence un site +physique : coordonnées, altitude, classe de siting, période d'activité, +rattachement INSEE. Un modèle produit un champ sur une grille régulière. Inscrire +les points de grille comme pseudo-stations ferait passer `dim_station` de ~15 750 +entrées à des millions de lignes sans métadonnée de siting, sans historique, sans +commune — ce qui viderait de sens tout ce qui s'appuie dessus : `/ref/stations`, +le crosswalk canicule, la carte de couverture, les filtres par réseau. + +**1c. Le volume est d'un autre ordre.** Ordre de grandeur pour AROME seul, +hypothèses explicites : ~10⁶ points de grille × ~40 paramètres × ~50 échéances × +8 runs/jour ≈ **10 milliards de valeurs par jour**. L'archive d'observations +complète, remontant à 1777, en compte 39 milliards. Le modèle réécrirait +l'équivalent du fonds tous les quatre jours. + +Le tuning physique suit la même logique : `observation` est partitionnée en +tranches de 7 jours et compressée `segmentby (station_id, parametre_id)`, ce qui +suppose peu de stations et beaucoup d'historique. Le profil prévision est +exactement l'inverse. + +**1d. Le cycle de vie est opposé.** Une observation se garde indéfiniment. Une +prévision perd sa valeur d'usage passée son échéance ; seule une fraction est +conservée, et pour un autre motif (le calcul de scores). Mélanger les deux dans +une table impose la rétention la plus longue au volume le plus gros. + +### 2. Les dimensions, elles, sont partagées — c'est là qu'est l'harmonisation + +- **`dim_parametre` (ADR-0004) est étendu, pas dupliqué.** Une grandeur + pronostiquée porte la même clé que la grandeur observée : le T2M d'AROME est + `air_temperature`, en kelvin, avec les mêmes bornes de plausibilité. Le + nommage CF est issu des conventions *Climate and Forecast* — prévu dès + l'origine pour couvrir les sorties de modèle. Les grandeurs sans équivalent + observé (CAPE, hauteur de couche limite, précipitations convectives) entrent + comme nouvelles clés du même vocabulaire, avec la même règle d'unité SI. +- **`dim_station` (ADR-0005) est partagé tel quel.** La prévision au point + Grenoble-St-Geoirs porte le `station_uid` de Grenoble-St-Geoirs. +- **`duree_s` garde sa sémantique.** Le Tx prévu sur 24 h et le Tx observé sur + 24 h ont la même durée d'accumulation : la comparaison est licite sans + retraitement. +- **Nouvelle dimension `dim_modele`** : identité du modèle (nom, centre + producteur, résolution, domaine, version de cycle), versionnée comme les + autres référentiels — git fait foi, la table est une vue (ADR-0002). + +Avec ces dimensions communes, comparer prévu et observé devient une **jointure**, +pas une couche de traduction. C'est tout l'objet de l'ADR. + +### 3. Table sœur `prevision`, prévisions ponctuelles aux stations + +| Colonne | Type | Rôle | +|---|---|---| +| `modele_id` | smallint | → `dim_modele` | +| `run_utc` | timestamptz | heure d'analyse | +| `dh_utc` | timestamptz | instant valide (l'échéance se dérive : `dh_utc − run_utc`) | +| `station_id` | int | → `dim_station`, **même référentiel** | +| `parametre_id` | smallint | → `dim_parametre`, **même vocabulaire**, unités SI | +| `duree_s` | int | même sémantique d'accumulation | +| `membre` | smallint | 0 = déterministe, n = membre d'ensemble | +| `valeur` | float8 | | + +PK : `(modele_id, run_utc, station_id, parametre_id, duree_s, membre, dh_utc)`. + +Deux différences assumées avec `observation` : + +- **pas de `qc_flag`** — une prévision ne se contrôle pas à l'ingestion, elle se + vérifie a posteriori. Sa qualité est un produit dérivé (§5), pas un attribut + de ligne ; +- **pas de `version_obs`** — l'axe `run_utc` porte déjà la temporalité des + révisions, et deux runs ne se remplacent pas. + +Volumétrie cible : ~15 000 stations au lieu de ~10⁶ points de grille, soit trois +ordres de grandeur en moins. Rétention courte par défaut sur les runs, longue sur +l'échantillon conservé pour les scores. + +### 4. Les champs grillés restent dans leur format natif + +GRIB2 en réception, converti en **Zarr** (ou équivalent chunké) pour l'accès +analytique, stocké sur S3 et **référencé par le catalogue** — jamais dépivoté en +lignes. Un champ grillé compressé coûte 1 à 2 octets par valeur ; la même valeur +en modèle long en coûte 5 à 20 fois plus, les clés étant répétées à chaque point. +Le lakehouse indexe les rasters, il ne les avale pas. + +`prevision` est donc un **produit d'extraction** de ces champs (interpolation au +point station, méthode et voisinage documentés dans le contrat), pas leur +matérialisation exhaustive. + +### 5. La vérification est un dataset Gold + +Les scores (biais, RMSE, MAE par échéance et par modèle, taux de détection sur +seuils) se calculent par jointure `prevision × observation` sur +`(station_id, parametre_id, duree_s, dh_utc)` — jointure devenue triviale par +construction. Ils se publient comme les autres datasets Gold, avec contrat ODCS. + +## Justification + +- **L'harmonisation réelle est dans les dimensions, pas dans la table.** Ce que + coûte aujourd'hui l'hétérogénéité — impossibilité de joindre, pièges d'unités, + double vocabulaire — est intégralement réglé par le partage de + `dim_parametre`/`dim_station`. Fusionner les tables n'apporte rien de plus et + détruit les invariants de chacune. +- **Le précédent existe partout.** Aucun système d'état ne mélange observations + et prévisions dans la même table : le WMO les sépare jusque dans les formats + d'échange (BUFR pour l'observation, GRIB pour le champ prévu) ; les archives de + vérification (ECMWF, MET Norway, NOAA MDL) modélisent la prévision avec l'axe + `reference_time` × `valid_time` distinct, exactement la structure retenue ici. +- **Le coût de l'erreur inverse est asymétrique.** Séparer et devoir joindre est + un coût de requête, borné et connu. Fusionner et devoir re-séparer, c'est une + migration de plusieurs dizaines de milliards de lignes avec un modèle dont la + PK est fausse — ce que le POC a précisément passé six mois à défaire sur le + legacy. +- **La sparsité qui justifiait le long pour l'observation ne vaut pas ici.** Une + sortie de modèle est **dense** : tous les points ont toutes les valeurs. Le + modèle long, choisi en ADR-0007 parce que le wide MF était un cimetière de + NULL, perd son argument principal face à un champ grillé complet — d'où le + format natif au §4. + +## Conséquences + +- (+) Comparaison prévu/observé et scores de vérification deviennent + atteignables : une jointure sur des clés partagées, un dataset Gold, un + endpoint. C'est le produit qui manque le plus visiblement aujourd'hui. +- (+) `dim_parametre` gagne un second consommateur, ce qui **valide le pari + d'ADR-0004** : un vocabulaire contrôlé n'a d'intérêt que s'il traverse les + domaines. Le nommage CF y était déjà prêt. +- (+) Les invariants d'`observation` sont préservés : `obs_last` garde son sens, + la PK reste vraie, la compression reste adaptée au profil, `dim_station` + reste un référentiel de sites physiques. +- (+) `modeles-ncl`/`modeles-php` cessent d'être une impasse : leur sortie + devient de la donnée requêtable, pas seulement des images. +- (−) **Une chaîne d'extraction à construire** : décodage GRIB → conversion Zarr + → interpolation au point station → écriture `prevision`. C'est le vrai + chantier, non trivial, avec des choix à documenter (méthode d'interpolation, + traitement du relief, gestion des points de mer). +- (−) **Le mapping des paramètres modèles est à faire** (~40-60 clés par modèle, + dont plusieurs sans équivalent observé). Travail comparable au mapping des 280 + entrées de l'observation, mais mieux outillé puisque le vocabulaire existe. +- (−) **Une dimension et une table de plus** à gouverner : contrat ODCS, + lineage OpenLineage, politique de rétention par modèle. +- (−) `prevision` ne couvre pas les usages cartographiques (carte de prévision + France entière) : ceux-ci restent servis par les champs grillés, donc **deux + chemins de lecture** coexistent selon qu'on veut un point ou un champ. + +**Critères de réouverture** : si un usage exige des prévisions sur un maillage +dense et non plus aux stations (post-traitement statistique type MOS sur grille, +downscaling par maille), réexaminer l'ajout d'un axe `cellule_id` à `prevision` +plutôt qu'un élargissement de `dim_station` — la frontière à tenir reste +« une station est un site physique ». Si le volume de `prevision` dépasse celui +d'`observation` malgré la restriction aux stations, revoir la rétention avant le +modèle. + +## Références + +- ADR-0004 (vocabulaire `dim_parametre`, périmètre observation — étendu ici), + ADR-0005 (identité stations, réutilisée telle quelle), ADR-0007 (modèle + canonique long, chaud et froid), ADR-0002 (versioning des schémas de sources + externes — `dim_modele` suit le même régime), ADR-0003 (Iceberg) +- POC CHOM : `chom-poc-data/docs/utiliser-les-donnees.md` (format canonique tel + que servi), `deploy/staging/initdb-canonical/01-schema.sql` (DDL `observation`) +- Repos concernés : `modeles-ncl` (downloaders et décodage AROME/ARPEGE/GEFS/ + COAMPS/BOM), `modeles-php` (orchestration des runs) +- Conventions CF (*Climate and Forecast*) — le vocabulaire d'ADR-0004 couvre par + construction les grandeurs pronostiquées ; WMO GRIB2 (champs prévus) vs BUFR + (observations), séparation des formats d'échange +- Pratique des archives de vérification (`reference_time` × `valid_time` × membre) + chez ECMWF, MET Norway (Thredds/Zarr), NOAA MDL From f82b6d10fc0c5404c6218c7e3feb06777635b227 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:25:44 +0200 Subject: [PATCH 30/31] =?UTF-8?q?chore(tools):=20uv.lock=20(verrouillage?= =?UTF-8?q?=20des=20d=C3=A9pendances=20de=20l'outillage)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/uv.lock | 1949 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1949 insertions(+) create mode 100644 tools/uv.lock diff --git a/tools/uv.lock b/tools/uv.lock new file mode 100644 index 0000000..150d62a --- /dev/null +++ b/tools/uv.lock @@ -0,0 +1,1949 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] + +[[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.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/72/5562aabb8dd7181e8e860622a38bea08d17842b99ecd4c91f84ac95251b0/anyio-4.14.1.tar.gz", hash = "sha256:8d648a3544c1a700e3ff78615cd679e4c5c3f149904287e73687b2596963629e", size = 254831, upload-time = "2026-06-24T20:56:06.017Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/7b/90df4a0a816d98d6ea26f559d87836d494a2cf1fcf063be67df50a7bcc30/anyio-4.14.1-py3-none-any.whl", hash = "sha256:4e5533c5b8ff0a24f5d7a176cbe6877129cd183893f66b537f8f227d10527d72", size = 124875, upload-time = "2026-06-24T20:56:04.413Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "boto3" +version = "1.43.46" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/e7/976bf3dfe0aa5d7f31bec2f2cf57c79641620c910a39bc843a237aa9592d/boto3-1.43.46.tar.gz", hash = "sha256:66c0d943b049a46a492ec4ec2ebe73c930b1842c7137bee83aad6d93e95d4d96", size = 112654, upload-time = "2026-07-10T19:32:12.498Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/1d/c52e66ff32ba7911664e6c4c2ac62e1c6d2d1e7550c7ac185d3f4b70a8a4/boto3-1.43.46-py3-none-any.whl", hash = "sha256:69453e2c1bcb9fd9806527ab99950cacfc2826cb0dce9a3a0414d19270c06c3c", size = 140031, upload-time = "2026-07-10T19:32:11.129Z" }, +] + +[[package]] +name = "botocore" +version = "1.43.46" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/f1/1917891851ac5ac09bb9f4862b8fc9252a009d7c24e8688bb67e4383d9e7/botocore-1.43.46.tar.gz", hash = "sha256:59f2e1ac3cdc66d191cae91c0804bc41847ce817dc8147cf43eaada8f76a5533", size = 15694635, upload-time = "2026-07-10T19:32:00.437Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/f2/4bd8f2f419088feb3ce55f0ca91040ff902f402edfd197450b20a2e1d533/botocore-1.43.46-py3-none-any.whl", hash = "sha256:cb673891e623ae6e6a1bf24d94ef169504f3eb02584adb5d5bee2f6aae819b60", size = 15380350, upload-time = "2026-07-10T19:31:57.616Z" }, +] + +[[package]] +name = "cachebox" +version = "5.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/f6/85f176d2518cf1d1be5f981fc2dadf6b131e33fefd721f36b330e3434d6c/cachebox-5.2.3.tar.gz", hash = "sha256:b1f68246685aa739bbbd2734befb1465363a1e1042407c154feadb065f17a099", size = 63686, upload-time = "2026-04-10T12:21:35.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/9e/88193fcb7a2a43fe8ed9d9888374d43fa5c7176aa802651e68b28f1aee4a/cachebox-5.2.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2c89720547271d36e10cad2c7302bbe11f46eb39eead0a2c321c2d371b8f8b6", size = 374393, upload-time = "2026-04-10T12:20:20.424Z" }, + { url = "https://files.pythonhosted.org/packages/98/8d/e0b13d9bfd43f295cce7824ebaac1970f818a7027c16f290de404934cafe/cachebox-5.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7f33d24e90dc8aa26762e25898c91a1223b66685420a28a3628fa2e006924f5", size = 356318, upload-time = "2026-04-10T12:20:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/bc/02/8ae1b63dbdebb2ebf600523f48b54e9bfb10db5a28551c3432346f49e1dd/cachebox-5.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56cb03ec6289a2ac5daf7422d755683324f02d821bfa796087100df2a7ebd5de", size = 395782, upload-time = "2026-04-10T12:18:50.054Z" }, + { url = "https://files.pythonhosted.org/packages/e4/2f/79a8a0057f354581c25a1a00ddabbd5db4b8631d192670d7a0cc4271dbb7/cachebox-5.2.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71a71df463ba4c86bc843fa01c3a2a721033adefad888af28c6b65e1915a75c", size = 353194, upload-time = "2026-04-10T12:19:03.083Z" }, + { url = "https://files.pythonhosted.org/packages/3b/57/a1fead35cf481432bd87def0653cd4a069b1ea5847589255795e49ae74b8/cachebox-5.2.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbe4655371d19fc9f4f5874312bcb6e5b5b6182989979ac33d93c34c8d10c012", size = 371090, upload-time = "2026-04-10T12:19:16.019Z" }, + { url = "https://files.pythonhosted.org/packages/8c/58/53f1fab8bcc3238fd6c533ef3ab146097986a8acb722863c688a2410c1b2/cachebox-5.2.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4974476d1779961df89d6e6f79e6103a1659289d3ee11c92adcb52e236a8aaeb", size = 390902, upload-time = "2026-04-10T12:19:28.258Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/5abff74666f8388d2c9516c265f99c33484c827f7fcb3cd703c2f3cbb17e/cachebox-5.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad16d733219f4cab3eec6533af30ab7b9c919c6e3e22ad1ef4eb82629a62edef", size = 395855, upload-time = "2026-04-10T12:19:54.207Z" }, + { url = "https://files.pythonhosted.org/packages/dd/11/30b429db12ab5df663aa108bcfac42805f733da65b0bf452f60bfaf4a530/cachebox-5.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:12a9e0a93774ca2b3a9fe8a2a0d0812e399fac4af0fce6246a5bca1e7009b8fc", size = 425760, upload-time = "2026-04-10T12:19:41.138Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b4/fdac1bb902b954c03d23eb301d645a328c9664caff5898930fdbd92fde80/cachebox-5.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:be89497a011eb7a638d13cc520244d77579c0f515b95bf759b3de0b90a015203", size = 564988, upload-time = "2026-04-10T12:20:34.673Z" }, + { url = "https://files.pythonhosted.org/packages/4e/63/76cd5405b0339f15bf86593258bf9bc5608f10a5e0fa6f37a282b42a6caa/cachebox-5.2.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:dd01fc0c1934cccb76493eb4b149a9232d299e5e0275f557adf875c3d25cec81", size = 669110, upload-time = "2026-04-10T12:20:49.039Z" }, + { url = "https://files.pythonhosted.org/packages/d9/bc/52d154aa0407bafce94d1d8d3ff27ca5e842f8311be43cfabdefcbb0f6b7/cachebox-5.2.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a0dfd97b0968f8bd48c33098a03d10f797964559c3a437c84bf97a9973545714", size = 643768, upload-time = "2026-04-10T12:21:04.095Z" }, + { url = "https://files.pythonhosted.org/packages/51/d9/82627eb8cecaf5e7e601bbc65d474a1c3053a2fbc21618ddc6aac19c47dc/cachebox-5.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:223ccf7ac60f595def258e7bc74c0b1d6f43991c9cae6d06749c803d22786d99", size = 610047, upload-time = "2026-04-10T12:21:19.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2e/cc5b303746418fde00c93ddbc295733b4e2d131d2e8f5afbc6f45f50454e/cachebox-5.2.3-cp310-cp310-win32.whl", hash = "sha256:745b805fdd99931c3ce1d87d2ee21ca3fb62cba6b4e1f674907af87aad73dce4", size = 275529, upload-time = "2026-04-10T12:21:49.84Z" }, + { url = "https://files.pythonhosted.org/packages/31/72/fb10d6f779d041f701b89f0b7830329f51d1846fbc600869f9f7d635b7b5/cachebox-5.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:a87b19c0a3d8d665a9805b5b4afd64b40082395b70ebe2756131ed1edb0c8f02", size = 287988, upload-time = "2026-04-10T12:21:36.41Z" }, + { url = "https://files.pythonhosted.org/packages/81/88/154179d492f2c000fe6efab3c3ff6b8eb94fbfaa09efe47999bce6b1e29f/cachebox-5.2.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:996f49d04b234082530afcc650bdd00556afbebc19c6c0daaafb85950340cb3c", size = 374245, upload-time = "2026-04-10T12:20:22.042Z" }, + { url = "https://files.pythonhosted.org/packages/7d/9d/3b03f2e063161bcb1a5e0969d521b5c622c2da02252a5c8bd4ef0e4f9914/cachebox-5.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23a3300ebbb526fa12ce6fa53699002f5fba6da23b4bbbaf8ba8b18a3f03e6b3", size = 356308, upload-time = "2026-04-10T12:20:09.149Z" }, + { url = "https://files.pythonhosted.org/packages/bb/9b/8da38af731e3832e9f987548e4bfb610d7f3054019e12c44a94ba9272b37/cachebox-5.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79c63ee1589364caa04c018405e625d2e44e0bf9994f2715b2f322075d8c45b6", size = 395666, upload-time = "2026-04-10T12:18:51.89Z" }, + { url = "https://files.pythonhosted.org/packages/01/dd/1522aa808f94c904c5eb3640991799fed14dd43c1dd99a9f7b71bd95b1e3/cachebox-5.2.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebd0f8d4ebc3943c1ddcbbdc54f1a8ddf95505c862ed5731319cebd1eb98ae41", size = 353362, upload-time = "2026-04-10T12:19:04.536Z" }, + { url = "https://files.pythonhosted.org/packages/dd/52/95bf883ec9b69a76f3a7d9fb14d015d9a4bdab0143a3eff62ceebc8b1419/cachebox-5.2.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:569966efcc6309aa7d774443e3513cdbb8671efae0158138ba2ebb7d8cc9d8ed", size = 371007, upload-time = "2026-04-10T12:19:17.484Z" }, + { url = "https://files.pythonhosted.org/packages/4b/3d/cc02066d5ccfcb8b35adbaf867977fdb54572cda56ace56da396f0caa3bf/cachebox-5.2.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5774d06f0da37dd566239a4376d6ca8cf983d3e4c3228712ec22b4130f662f21", size = 390670, upload-time = "2026-04-10T12:19:29.685Z" }, + { url = "https://files.pythonhosted.org/packages/b3/50/8e4d59b3e344405d8393d6cc5cc92754d3cc1d81134041ebffd3f5ab73e6/cachebox-5.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae5bf8755bc66bcf42e7ca5c42d703a041a7aaad58f9a0c3be54d5b1cefd2641", size = 395765, upload-time = "2026-04-10T12:19:56.169Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d4/d731cff1c4cec22404bd3ddda05b233c5efaa5f13d7abf4e2728905b7cdd/cachebox-5.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63f061cc6a5ca70bbce2e6be0588fe2fee00a93a1b0581b1086d54b10288cdb6", size = 425707, upload-time = "2026-04-10T12:19:42.714Z" }, + { url = "https://files.pythonhosted.org/packages/36/01/3ec8aadceb0dcc66dbd0b9b32966cf7b6928ed84471424c24d21b0af62d0/cachebox-5.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:577c781f18b559f4dc9eea176c6aed008843ef4b8e045cf61bb519e09dccc9ef", size = 564759, upload-time = "2026-04-10T12:20:36.268Z" }, + { url = "https://files.pythonhosted.org/packages/db/23/31cbc8623ecc2e25900f7e8f20f11bfb84786989a59a8046e70b27cbea6d/cachebox-5.2.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7f691e25572a3ddbb018e19d796f774713bd6b0f7ce9be2e71f6e18572de264a", size = 669309, upload-time = "2026-04-10T12:20:51.117Z" }, + { url = "https://files.pythonhosted.org/packages/34/29/5a9e92bdc7b32dc865e73dd776638244f900136daee5bb0591a67e1530fa/cachebox-5.2.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:33368adf86669c29b936fbae5d6219cf90aacd4b1db71dae2e23d584a8219cd6", size = 643705, upload-time = "2026-04-10T12:21:05.882Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/5273a412855fdc11f674e4749aee6d5ec0a91f5c1a9f6e922f7fa0cb7a83/cachebox-5.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:38ce67b7b45713e49459a09411d07f82de04022c04aecde6202cd32f934c2b1f", size = 609751, upload-time = "2026-04-10T12:21:21.331Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a4/0fadb5e6a00f373cc3fe56b4415cdea2fc0147f6ec475611762d16eb4b05/cachebox-5.2.3-cp311-cp311-win32.whl", hash = "sha256:a7cd2c81347063ab6c512d0f569aeb5f75fc2dfe686c8486258ffd08052324f4", size = 275485, upload-time = "2026-04-10T12:21:51.563Z" }, + { url = "https://files.pythonhosted.org/packages/03/83/67c1bf83f815294d2c3acd7631f25b5cbe6067e1d56495f76829dd60057b/cachebox-5.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:7e45798d6b969794840bb302857946d710ecb32af78dfcb3ab40f4e68ee7fdaf", size = 288024, upload-time = "2026-04-10T12:21:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e7/6fa6abfc9c4c07b88f09a88466fa93c7081fd679d8e06f8f558bb4ac845c/cachebox-5.2.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09c0340e9daa7b4530801e5a570cb0c1a1ad941a85d245d360020d3986d0e787", size = 377791, upload-time = "2026-04-10T12:20:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/3a/79/89e4423352d0ca33bbf80fc1b4b665e654a93de8b16cf41e96fcac81801a/cachebox-5.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3162758792626685ec34950eedd565d015b115d0ff0d751d2716031fc32d51b", size = 359562, upload-time = "2026-04-10T12:20:10.626Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ab/e533c2751e6a3411ebe369277aaed03199b9e4586a48f0a3712a1f4b418b/cachebox-5.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a189a780c3ccd7b9d157074ba6bf3e191e522b39abbdb590075111851f02d50d", size = 397910, upload-time = "2026-04-10T12:18:53.336Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0d/b8492d6ca53278499a37c9f9d51afd4ad77bfbe813d6281944d45b97a1e7/cachebox-5.2.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:410b67baa99d433644199b11289627f7ebba4ee5786f95ca9858f238afcee157", size = 353699, upload-time = "2026-04-10T12:19:06.248Z" }, + { url = "https://files.pythonhosted.org/packages/78/d4/fd20b3a5362651303fa12d3ee62f56af2bd396e4a7303d7014a1a1e5b392/cachebox-5.2.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81474dc19d3865fa5e57263f834bc6bbc00e471a594fb9d934ed552732c02fd", size = 372510, upload-time = "2026-04-10T12:19:18.997Z" }, + { url = "https://files.pythonhosted.org/packages/71/94/3ec55c946d300cc4eaed3a0f79740051ac6e11ef4032421332c6ca15f5d5/cachebox-5.2.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85ccd827193b3e3e887a88a16b88ef7ed174e7e65be515b5253322aa75e665c3", size = 392802, upload-time = "2026-04-10T12:19:31.196Z" }, + { url = "https://files.pythonhosted.org/packages/01/b1/1a3c4e436ad8a4c4ba3e70f4c62e1f927cbbb3c943a9bba5813b8b815bde/cachebox-5.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a1e7d3cb8a5e7e68996a8619e3ef8771a124d14568c251f9e586eba88d759c1", size = 398223, upload-time = "2026-04-10T12:19:57.583Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ea/d36ad3976c4396b350b96a1582411b7a00e56c144eec0bb5ba5f36ce7d86/cachebox-5.2.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:adcedfcfcb933b21e7fdcfe560c79887bc8287abceab0586aa3730417dd0277d", size = 427696, upload-time = "2026-04-10T12:19:44.361Z" }, + { url = "https://files.pythonhosted.org/packages/a8/36/71845b5c7a9ffbd85e6fdb470c11a174f499bd5238fa37b1214157c2454d/cachebox-5.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c7f0c72c51a3a9e7049ea6ff2a43cd3877ab7fee966eb65771a59621563b75e3", size = 567854, upload-time = "2026-04-10T12:20:38.357Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a2/baf0e5a8392e64e352b137ccd7356b3d98068c842fd19f510a7790c05d34/cachebox-5.2.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c48c10e498d573511aafbd545570e7f43b40a7428dc282183bf5adc334d9e1a8", size = 670306, upload-time = "2026-04-10T12:20:52.903Z" }, + { url = "https://files.pythonhosted.org/packages/a5/22/cd4e4c1d624b8ef9fb4b8bebf0bf5d2d74a399cf1ac46b667bb79d15359a/cachebox-5.2.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2f1e086ab5ffd082a68bb63699d517655a59b06414927bfc84e01df91b81e34d", size = 645943, upload-time = "2026-04-10T12:21:08.238Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d6/55859981f5ec6a9e412baaa4db6aa5973a00008750b3f054cdefcb6491fc/cachebox-5.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:649d18399f13735bb82daa33800196f815529c49e967767c40ca221723e68afa", size = 612309, upload-time = "2026-04-10T12:21:23.404Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1e/313f650467ac85824c4199188f8f1ee3386cd12eb665dbf7c88d372e4956/cachebox-5.2.3-cp312-cp312-win32.whl", hash = "sha256:0a17aeb4e5b1c6ef1c3db8fc5186f9986e215ba5ea5a5d08baa45bcf55f261b2", size = 279789, upload-time = "2026-04-10T12:21:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/c5/50/3b334f887accfa811cf5c7533b8ce22c523eb009363a86401198899dadd2/cachebox-5.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:cfd69114141ab362acaa2099e425a1b965cf7b021a539a4e953143d593930b74", size = 290917, upload-time = "2026-04-10T12:21:39.696Z" }, + { url = "https://files.pythonhosted.org/packages/31/3b/16d5c295f6ec2913ef595b39986dc7b7cc179fdd2e73f5ebd1814c38fd51/cachebox-5.2.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9527c5c70f8735f2d696331d8bcf77254f03b4dc8542046807823bd36ed4e8ba", size = 377408, upload-time = "2026-04-10T12:20:25.444Z" }, + { url = "https://files.pythonhosted.org/packages/cd/87/45f834154f79721e5b64a80ffab4f9710834c4f9c01fa977f94a9116c32a/cachebox-5.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40ac878af00d5969862c1f6bc076de1e34ca248662fce6aecca1761f52e33e32", size = 359274, upload-time = "2026-04-10T12:20:12.127Z" }, + { url = "https://files.pythonhosted.org/packages/46/17/794e5f93e0a172aa14ecd692f6d89bdf094f71eb35fa923d0a0af25cef1c/cachebox-5.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5ff26bfd8f7e95b3becf6d5f65c25edaca50fa68078868648b70d79bcccc260", size = 397520, upload-time = "2026-04-10T12:18:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/19/9470b1a96de6e480192b1a92b2fafa72aa052efc2509a5418a5652205b33/cachebox-5.2.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82e7002dd343afeeba2fcf0e483131b342a27ec3bc34b2214dc617691bda40d6", size = 353183, upload-time = "2026-04-10T12:19:07.797Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2b/72813f80397ed4640e337cbd1a14ab7eaafe33e479291d3623b6a6a55fec/cachebox-5.2.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ccbdc54a6c4b5758408c1083bdfa217bd382894a8331c7d0a54b84ba0cf51e5b", size = 372239, upload-time = "2026-04-10T12:19:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/05/17/47dc9687288fa55486573627089ecd9aae124de5924a4bce008af96d80b6/cachebox-5.2.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df5135a168f143d186b1cc3be0ca16b66446897ab5cedc03bd80bcc926fcd403", size = 392568, upload-time = "2026-04-10T12:19:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/13/95/450765b971a3bed9d7cf003c3833c1976482eb83b0241b6dbb840a25b43b/cachebox-5.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10bedf96db8f9766cc956f9adcc623e604264e5d6fa2e255432f8c2ed7519143", size = 397920, upload-time = "2026-04-10T12:19:59.314Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3e/dd8f4c1f92e58d479913ce9cbaa3227c911128e6046c82f4fd44309f685a/cachebox-5.2.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f22732d0d69bb84ad2dca7480bffdfd0430c647152d488936e152ecbbfee52fb", size = 427332, upload-time = "2026-04-10T12:19:45.888Z" }, + { url = "https://files.pythonhosted.org/packages/7e/20/80d8c26ce63e78da3874a5bb07a3a78de53a2b0356ba80583a4927f0a074/cachebox-5.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:26ae0b68979204d360327f4c0725cfdc95cfc34ab73ab1a8f528e3bd2f6d023c", size = 567494, upload-time = "2026-04-10T12:20:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/10/35/7249885dfed3602b3b48c1e67781197dcdc536c50f72caeabe3944348af8/cachebox-5.2.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f3d628b816e28a6e7661d460e02dd5b421247cc2cd275814f80ea79621245fc4", size = 669968, upload-time = "2026-04-10T12:20:55.155Z" }, + { url = "https://files.pythonhosted.org/packages/2d/8a/e5b58f0bbd6fef74da5d8e5ab49e67898ce7e6df28c16280a0f2b78461f7/cachebox-5.2.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:64057caa6b741320655cd3c5997fe642dae5dbff571eb530e6f53e58272bb43b", size = 645547, upload-time = "2026-04-10T12:21:09.948Z" }, + { url = "https://files.pythonhosted.org/packages/d8/25/51783a4c6f25ca87ef1b4b762ff0364bd98053a02d597b30d26ff4cf13c5/cachebox-5.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa325306084aa2dc0b21e07723d7700f4d43dece3732c7fdaf7a269dc5e35aa7", size = 611844, upload-time = "2026-04-10T12:21:25.286Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c5/b26c4b046e296d0e249448fe297626b3caca2e851837712f03c358662cb7/cachebox-5.2.3-cp313-cp313-win32.whl", hash = "sha256:55003089d21c2f5515089c307be063b45558e884a4a1cc9593944374c89975c4", size = 279421, upload-time = "2026-04-10T12:21:54.921Z" }, + { url = "https://files.pythonhosted.org/packages/e0/7f/a49420670393bfea618de7a893d45cae9294cf3293d7b158e7af20e8f39e/cachebox-5.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:dcc5edb6ecf2b516e90b773d232360c5e4ed8fdcda038b19441da2ed9cf208ab", size = 290702, upload-time = "2026-04-10T12:21:41.458Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0b/bf83bda13ef6fc490d208a1d4dd712034624526a88f61713cca0edc9884f/cachebox-5.2.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a4b7559fa4994c4032dd07466c2041d57e055feb814762e1f73f4e8beef188d0", size = 371704, upload-time = "2026-04-10T12:20:27.253Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ea/aa5162273238e84f9e41b33600c69299572dc1c8f0f768d07660b71be07d/cachebox-5.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f57afada3d9327adf87f3b5cf0094348c6fd49354ab2e9bd20b044648eb094ae", size = 353385, upload-time = "2026-04-10T12:20:13.668Z" }, + { url = "https://files.pythonhosted.org/packages/47/96/3ca013e2e48df5c1d7855669b208f4bf8014ccb842ccf7a3a0eaac07bee0/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8342ff350ce86f062492752d612e9f056ac5dc56375713d75c3bf6e83b4d18db", size = 392181, upload-time = "2026-04-10T12:18:56.385Z" }, + { url = "https://files.pythonhosted.org/packages/63/ca/1bacb4efa0b0ce8065d1fb7c8dc7c382ec4e1cc3f007eb08417732be2725/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:405f9cc8492fc9d953b5a6b9e2b661e99583755c6639ab8d09a287fdf336503c", size = 349494, upload-time = "2026-04-10T12:19:09.505Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2e/75db4bda3768658f5baa5a54f6a4f643bc2de1a16788e40581a080e803c7/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94aae393ec1d9b26565d346445bb6afa3963d2a0d3eb5e4188d0e510fab871a0", size = 369216, upload-time = "2026-04-10T12:19:22.224Z" }, + { url = "https://files.pythonhosted.org/packages/f5/82/e1f833be0d57e29a8c5eb0a0275cd34b962f3c7f5b9e0517ec4bf75e7cc3/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8b0b575066fc09f6fae0d4bd30d6ff56584a6870cbe7d202916c5e0d725cfd4", size = 385922, upload-time = "2026-04-10T12:19:34.198Z" }, + { url = "https://files.pythonhosted.org/packages/53/d6/615a3c16c1d63839f2c67644eb414c4dc9769ab2e169d935110fd8e268d5/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41e99c1240106d39b63ce7868a6cd8c9da9243fef08848b85d428164e0769fd2", size = 393276, upload-time = "2026-04-10T12:20:00.925Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a6/7844c9c84b170dae1005b22da174639968e64c8055d66a209a1598663771/cachebox-5.2.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:432ca62b99f7eafc21af669d76c88c1b7377db179b89fb6fca3ea93b8f9fff19", size = 421355, upload-time = "2026-04-10T12:19:47.691Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0f/43f62355846cae3dc41cb4daccac0a4bb2b7b8b3c7d77d1b6a220bae6d54/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e51d9c59006b53447f806145406eb37a7fc3c25553d4fd24c3887f3b268d214e", size = 561656, upload-time = "2026-04-10T12:20:42.161Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fc/a453813c6d000d69a41a06c6a3143a6c4d0d0e41f23c155db2f82ea0edfa/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:5e48a405f699fb001b8af120a6e0b4a981277f84eb5dd66a1faa21e4b6fe9485", size = 665791, upload-time = "2026-04-10T12:20:56.842Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a3/f6a9e75f1e602b67b6d67088a9a766adfc4e0a740a9c4b68e4e6207c1006/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8cbfc007ea78af61d75d7d26e5854df53dc5da6877d074afd4b4696c074f4ee7", size = 640975, upload-time = "2026-04-10T12:21:11.641Z" }, + { url = "https://files.pythonhosted.org/packages/a3/15/4ac98277f7fd9d855c8ed337e8e2a3386d17997cce2dd3eadb23dedc08e3/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6a94d0da8133b3a0707ae11c9ea321f8fc37e3b5a14517019a05d632218b0f56", size = 607242, upload-time = "2026-04-10T12:21:27.27Z" }, + { url = "https://files.pythonhosted.org/packages/9c/0b/ce61907a803f75854e0cc91b84c16e14dce0e4e939efbda26293eb4c8784/cachebox-5.2.3-cp313-cp313t-win32.whl", hash = "sha256:5fee33549877c03c2494ec5359a57a7667f872fe8e296a7f39d3dfe08dd3914c", size = 271619, upload-time = "2026-04-10T12:21:56.768Z" }, + { url = "https://files.pythonhosted.org/packages/b0/06/fece190ad5173d06b2779494aaad5528907f2e55c809618e5b67c2e3dbb5/cachebox-5.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:67548a05cd41fcc4f7af80a2f97f742fef3d436537ac2e1a1dce0fcba5d41190", size = 283133, upload-time = "2026-04-10T12:21:43.037Z" }, + { url = "https://files.pythonhosted.org/packages/b8/8b/72c0e80aad08e09867ce14a621bce689a733552f20cdf2ef96d4b052da10/cachebox-5.2.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:37fa0891f0defee053c09f5f43f802f731e36e6e6ca055d7d174af07f77232ca", size = 380523, upload-time = "2026-04-10T12:20:29.345Z" }, + { url = "https://files.pythonhosted.org/packages/fc/62/33aaade81b181d5191cc39c867c297aa7c65f3191aa9749bf99b77496b88/cachebox-5.2.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dc6315902f2ef4afbf10bc8e08c54ff34de5ce124546b8e0016c9b0d327be21e", size = 362424, upload-time = "2026-04-10T12:20:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0b/3eedaf9ea4b41c931f4340bfa42056efe2bb5fe3a79649d6c8a1dce585a5/cachebox-5.2.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df1735ca778480d51b8232fed397ffe3935158f20d34fb1c5ed171b53d5a6e2", size = 399572, upload-time = "2026-04-10T12:18:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/be/69/c79b8a6a5b889ac4a60800bacea3553cb3b86f6fd13b2262bade1cb962c6/cachebox-5.2.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e22451cde8f884051e941b21870e4fc91fcf58d0d8c285bb8964107e1f02445c", size = 353803, upload-time = "2026-04-10T12:19:11.21Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c3/bc7838de51039f8c50506d8dc82f22ff9a652794339a223b12af595e1d2f/cachebox-5.2.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcbccf3015d9a42bcf41260fa5cc048a5bdb75aa10997d514d6c976117f30ee2", size = 374474, upload-time = "2026-04-10T12:19:23.658Z" }, + { url = "https://files.pythonhosted.org/packages/65/61/e5231ad2ae952ca482f9b9df55df4b96add1a80de28de537c5f574605987/cachebox-5.2.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:311eae5079e256cbbfafdc3dcff1714b6598a767f9c1ef8c3709e74ea0cc12b0", size = 393045, upload-time = "2026-04-10T12:19:35.651Z" }, + { url = "https://files.pythonhosted.org/packages/78/c4/c9b3fa764ac5420a9e079ad53fa8840d4a26b74c4ccda56acbef49cf76ff/cachebox-5.2.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f4d2a80a5cd3380739c67f7d89e596634f5897b8d5a4a3dc1598312cb077535", size = 398700, upload-time = "2026-04-10T12:20:02.513Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3e/c4e3acd4cb04e01c5fb7cc7a4de16059b9594d90672fff85af8670275267/cachebox-5.2.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3977515b727a5203f494c44c4566fb936c4b940351c01d3d8e7b5d104dff4f53", size = 426725, upload-time = "2026-04-10T12:19:49.385Z" }, + { url = "https://files.pythonhosted.org/packages/25/5d/610b79479719951581109d985244d34c97f86a308c3d7c83443e2b1dac46/cachebox-5.2.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c5be17dd5c4fabcfecd5bcf6d54f9c6fb719daed3ef01ac1c03a14af0e2b26c1", size = 570042, upload-time = "2026-04-10T12:20:43.793Z" }, + { url = "https://files.pythonhosted.org/packages/8c/63/cad8a05db4d0c0f5ba6bccb32e57d15c472276de9476f56004445b40711f/cachebox-5.2.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6d37334fc218fdaee31db8a4f938938716e7c3b1b4059e25de27c8447fc95fde", size = 670974, upload-time = "2026-04-10T12:20:58.528Z" }, + { url = "https://files.pythonhosted.org/packages/54/d1/9cff7c2b9048d1c38b7ad8199ce856596d09720b3bea74043f3bad71970b/cachebox-5.2.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1e5f1b7e23411b748d919348c3b65db1f9f8927ab8f6f3acae19bd617543df2d", size = 646213, upload-time = "2026-04-10T12:21:13.619Z" }, + { url = "https://files.pythonhosted.org/packages/27/ae/2e1ad162ec13903e84469c8a753baf385f1bc324279d6c7cb6365e7099df/cachebox-5.2.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7b06a75a898b31fd73c4d8bf727a9b9f8b5b7738cccd0ab5e6fd2a9cf659d3c", size = 612787, upload-time = "2026-04-10T12:21:29.271Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8a/07b5ffd841e1ff534bb6e8721c39fdfe0d7cdaac1398e1783b2a0c37bd22/cachebox-5.2.3-cp314-cp314-win32.whl", hash = "sha256:3b798052719f09a2ce7bf9fa9452dc0a7d4dc53b50a2d3aba6ce6ebc12d39df7", size = 278559, upload-time = "2026-04-10T12:21:58.482Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/b88a82ce9ec7a2fa0f09ed1cdd031692c8664c41f9ab71831e177c7ce2df/cachebox-5.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:4afc8b8575e3228a42ad8d819de5fbbecc6bd0b521295966b00244be37ae3b9b", size = 291928, upload-time = "2026-04-10T12:21:44.621Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/8c79c07c8c6517fb2fe7d479dd87044e38aac5b9af0245b33fcd695eae37/cachebox-5.2.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:0e8a34b82be30d3d9fb7dfaf9a86ec2b3ab9bc264715909ef27fc3d3587324d2", size = 374325, upload-time = "2026-04-10T12:20:30.923Z" }, + { url = "https://files.pythonhosted.org/packages/7f/51/0fc26b923e80ab857ac99d5f7f3784dc941e7b4de361c204835233176ddf/cachebox-5.2.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4d4e336aebf866463878ccd28a4d0ef4003ea216708cf4a02a7f198481b3af81", size = 355444, upload-time = "2026-04-10T12:20:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/c1/6d/a6b399221f8dc4b3e01b37d3240ef5b8a7eb78cd9bfbb99b0e655dd01649/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b102fcdd97b0602bf5d6ba1a571bba3e3d6fa912b89fd768b0da5427408eab8", size = 393978, upload-time = "2026-04-10T12:18:59.753Z" }, + { url = "https://files.pythonhosted.org/packages/bd/f1/4c8f998c117c1941a82bd824d6687280c50167f21fea6392e41531d641e2/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:245a79fb2c5d3bff252f4263f76210ef3ad7c2ff9b0234859b26974830a80491", size = 349298, upload-time = "2026-04-10T12:19:12.843Z" }, + { url = "https://files.pythonhosted.org/packages/d1/dd/683bc5a32a0da660d02fa248b880b71a2b834e9b54b8d272b5801282f402/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd0e8dbd8fd4cf664c645c08f9e10508e133353756705c4a738e90a5406224b5", size = 370619, upload-time = "2026-04-10T12:19:25.298Z" }, + { url = "https://files.pythonhosted.org/packages/81/49/d6c47c78a7769b355076c5b635c2b538c8b88e8ceeb408e104d0f269b515/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb74294bdc33e39e26606919a9b2229038d5fac0edb80c9056683c08584d4a9", size = 385988, upload-time = "2026-04-10T12:19:37.638Z" }, + { url = "https://files.pythonhosted.org/packages/70/e2/b669555ada7fa1392e4cdb8a19f3367db5c6abef0fde8ab034a9747760df/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bba3e9a7f52fa196b434522f39675f3b32a076976ef2373ded6f1065e99f4d20", size = 394090, upload-time = "2026-04-10T12:20:03.978Z" }, + { url = "https://files.pythonhosted.org/packages/8f/01/42916249e53fe4fcbdf0419fb55dbc09b9f377475376e1d7f4ae9c9bd6cd/cachebox-5.2.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abb21f0f937fb66528f1b9f1a04874d6aa503e78bbb26f4cf33bf67faddbdd68", size = 421632, upload-time = "2026-04-10T12:19:51.048Z" }, + { url = "https://files.pythonhosted.org/packages/a1/54/34eebe18c6ed8ba27b1331b5e3d08bd8bb62f03ba81fbf47a2db0fa646f7/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:dab6fd3189b0c746fb03e1915fd947aaca9112cedf26ef3a0c39383acf87d2e5", size = 563871, upload-time = "2026-04-10T12:20:45.417Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b2/f92da0d54e4f18609588709090de8c81dd7c8b20ed6ac30f9b91bedbedf5/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b4e7d2935b9df11d3717f99c7237b6780f1f8c70e6a99b69b8430d89929ec825", size = 665677, upload-time = "2026-04-10T12:21:00.512Z" }, + { url = "https://files.pythonhosted.org/packages/43/9d/bf2d3dc949afe4d21fc7eb15b7524255e834b9252df6bba111e6686d1c6f/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:611aa260fe1b2506330ff72f415e2cb4053c9c4e3776ac68fe2eedee0e1b91b1", size = 642067, upload-time = "2026-04-10T12:21:15.727Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4f/a789eda189550d239fbaf165b9810f148e733e97a2a4eda7c4192295c7f8/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a424ffb8514a9cb49bacff7995b7c767625cb2239692bd6524245e8579e375cc", size = 608048, upload-time = "2026-04-10T12:21:31.156Z" }, + { url = "https://files.pythonhosted.org/packages/41/c3/590e161c04ffbd36e33933e6dcca5ffa40b5548e3121a21d77aad42af138/cachebox-5.2.3-cp314-cp314t-win32.whl", hash = "sha256:83988dd8e9075ee837e8407e26db49a9944ae74924d5db57b477444d7d98622c", size = 271694, upload-time = "2026-04-10T12:22:00.589Z" }, + { url = "https://files.pythonhosted.org/packages/66/f4/f60b8506df467261178afe918801df37c02c46ec2b8ce019760a14e2abe7/cachebox-5.2.3-cp314-cp314t-win_amd64.whl", hash = "sha256:dbda6390fa5070a19157ae35ab8066d3fe468634e0e9e21452c68ce7999c7d0c", size = 284212, upload-time = "2026-04-10T12:21:46.241Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7b/5eead1ca0d437b1993a742c6571079ae58ae4db50d94d42e87b514aed6c3/cachebox-5.2.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c798cddfb780156db09d3d96ed5da4c2d5fc01dad4bc7b54db5b20c34f221926", size = 376199, upload-time = "2026-04-10T12:20:32.674Z" }, + { url = "https://files.pythonhosted.org/packages/77/e3/5e45042f9b552a5087cafc2e0fed834e632531fca17818201d72e78593ce/cachebox-5.2.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:c8f3de4afeb3fd721620be3d02f2338bcbc3fdbd464ca14e1c474088c9669db0", size = 357109, upload-time = "2026-04-10T12:20:18.554Z" }, + { url = "https://files.pythonhosted.org/packages/d4/51/3c4743b718b42e4b80166fa61f8722b603eba7bf206768a7892c4699dce7/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39022c258872185327acffa9ad42d6bdf42f37d006d35c825a684eb5fa98d40", size = 396433, upload-time = "2026-04-10T12:19:01.463Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/678da91187bdb2836db2b8da62519da75359b46bc28697799a7caa314519/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a0599fb85dcb6df9a86502435643fe90c793bbcd50b5d85217c70f2bc2e38fc", size = 354287, upload-time = "2026-04-10T12:19:14.55Z" }, + { url = "https://files.pythonhosted.org/packages/df/06/769446da6c9f2855499aaa19e2d7260aa47934bc2e15a931e5b737f8685a/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3cdbe8f1b7716a44dc82ef3a6830a612260c7379478cfa80804632e2e6252b8e", size = 372507, upload-time = "2026-04-10T12:19:26.763Z" }, + { url = "https://files.pythonhosted.org/packages/79/cf/86c60994a7be734abef0395e440dc11714f84ffcd369cbcd8e61c3d58126/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:783d1b9a0b3c77c43e7ae331b9d6561ad75827e16b2484e2a6cc289ec4d392ee", size = 390831, upload-time = "2026-04-10T12:19:39.591Z" }, + { url = "https://files.pythonhosted.org/packages/9d/db/acfb55f8d5ee4ea1c5f2d32ede25d4d04e944ba09d2832c27c085022490d/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c6476a2a842906fee782d92f8fbcb03ecfd22eecc39adb7fb5b047d7e1cf020", size = 396277, upload-time = "2026-04-10T12:20:05.735Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4f/35e27e85a48e15671c5863addcabde910eb311800a621c3e47c04bd36d17/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:184bbcfa1370415b6d1f09e4fb74ab697dac8df09f522aa217a2fac65f973744", size = 426980, upload-time = "2026-04-10T12:19:52.622Z" }, + { url = "https://files.pythonhosted.org/packages/09/4b/50f2cadf20c02db9e449f2e9fee95f3eb5768ab1804dd0a5eba6c98119ad/cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f89df36b46f8f5e11c0c49701ec3cebddf51191f96afb7bb75c394faf3c1cbc8", size = 565539, upload-time = "2026-04-10T12:20:47.051Z" }, + { url = "https://files.pythonhosted.org/packages/43/53/b8e948cadb48b8bcf1d13c2aa4a788ff0e95b50ddb808c18e998499b4680/cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:fb0bdcd9e28686e3b91d5210c843542858f0f10de151181aee27a7978fe4992e", size = 670870, upload-time = "2026-04-10T12:21:02.141Z" }, + { url = "https://files.pythonhosted.org/packages/29/7b/d68ca3f59a9d6963c2f6b19bc4b1926a37db2e4a4f6c9891d12788e49ce2/cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:5196f0d2c2f99c92ddf0d2c37803ff90509d14a5df211b7754feb8b61ffd8740", size = 644542, upload-time = "2026-04-10T12:21:17.541Z" }, + { url = "https://files.pythonhosted.org/packages/f8/c8/44ae6d5dff09f044d61a92591e6a8db17f3b2ee51a54d375cce90271527b/cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:73671850d8c3634ab217398c83715d3feb52589ec97bd8e2f4d22e472741ea48", size = 610235, upload-time = "2026-04-10T12:21:32.93Z" }, + { url = "https://files.pythonhosted.org/packages/9a/1b/31cf2449da9a296f6c6c0002c7ae91a25c3a4bfef071763bbeb85300b402/cachebox-5.2.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:70c718f6bb77e6ba142b9a055b81ce85412a0c0e5e82a154489b45e6f91d09ec", size = 287614, upload-time = "2026-04-10T12:21:47.909Z" }, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/81/8e983840c6e5b93b33c2ba81aa3d52c2e42f0e9a690ce7607a2e61da4a5c/charset_normalizer-3.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a", size = 322240, upload-time = "2026-07-07T14:32:36.236Z" }, + { url = "https://files.pythonhosted.org/packages/de/d1/b4319dc3229d8272fba305e206fc0a148e2de8d4087917ce62ae6382f359/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616", size = 216475, upload-time = "2026-07-07T14:32:38.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/6c99c1b3e6b8bf730e1bc809b9a2608f224145069114c479a2e9e1494346/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209", size = 238670, upload-time = "2026-07-07T14:32:39.658Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f4/ffbb83546e1f198ecc70ecd372b65cf2b50f9068b380abd67640f17a8e18/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99", size = 233476, upload-time = "2026-07-07T14:32:41.155Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5f/b98b8da398637b551e427e7be922bdec19177dc54d6811dcdaa503f23aac/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8", size = 223817, upload-time = "2026-07-07T14:32:42.592Z" }, + { url = "https://files.pythonhosted.org/packages/36/31/a276bb2e66243072a3fd06fdcab9cbb61a305b02143d70d2bda21d888fa8/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b", size = 207974, upload-time = "2026-07-07T14:32:44.258Z" }, + { url = "https://files.pythonhosted.org/packages/5e/be/7ee4453d7e88dfbc4104ccd34900b9f2c7c17dac22881865fe0e82424a25/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2", size = 221655, upload-time = "2026-07-07T14:32:45.64Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/181c652953eb5276d198f375b1dd641047392050098100a3a02d6534f657/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9", size = 219229, upload-time = "2026-07-07T14:32:47.376Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e7/aaf6da33fc9f4691cda8f7efbc9f69179d3d39ec8a4799baf273ee1d8db0/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15", size = 209704, upload-time = "2026-07-07T14:32:48.855Z" }, + { url = "https://files.pythonhosted.org/packages/63/01/f2fb3bd3a73be48b173ee0c6aa8d2497af97d5663a8c4c4b491de4c62f7a/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d", size = 226243, upload-time = "2026-07-07T14:32:50.239Z" }, + { url = "https://files.pythonhosted.org/packages/c4/02/c57a22739fe05246b0b5783b3bfb6afaac4eebb46f3ececdfb2f048f780e/charset_normalizer-3.4.9-cp310-cp310-win32.whl", hash = "sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381", size = 150935, upload-time = "2026-07-07T14:32:51.676Z" }, + { url = "https://files.pythonhosted.org/packages/37/8d/ca39a7559a4797505530d084fd3a49a2c959efbbbff146302fb7be4e3b35/charset_normalizer-3.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee", size = 162314, upload-time = "2026-07-07T14:32:53.193Z" }, + { url = "https://files.pythonhosted.org/packages/01/da/a44bd7a13d426e69e4894557106cd58669097bfad4a8681123b618fbfc5d/charset_normalizer-3.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419", size = 153075, upload-time = "2026-07-07T14:32:54.554Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e3/85ec501f206fb049259288c1f3506e53876937fb00edb47009348e66756b/charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5", size = 317075, upload-time = "2026-07-07T14:32:56.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/69/2a5385192e67175f7d8bd5ce4f57c24bc956439adeae5c13a99aa28a53d1/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2", size = 213837, upload-time = "2026-07-07T14:32:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/b3/46/03ddc7da576d814fe0a36dd1f0fd3258e95404b4b2e3c026b7923d7e133f/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a", size = 235503, upload-time = "2026-07-07T14:32:59.205Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6e/de0229a7ef40f6f9d28a837eebf4ec47bdca5dab4e900c84f22919af636a/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29", size = 229944, upload-time = "2026-07-07T14:33:00.803Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/49b9060e8418b14fb5cba9cf6bfb383111e2538a03a1fb18e66a95aeb3d5/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c", size = 221276, upload-time = "2026-07-07T14:33:02.199Z" }, + { url = "https://files.pythonhosted.org/packages/44/95/80282cce0fae9c3061203d723ee87da996aed79679e65d8935050ee7ca1f/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b", size = 205260, upload-time = "2026-07-07T14:33:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/0c/74/2f62c8821b969ea3bd67cc2e6976834f48ca5d12664d2559ebcd9bcfbed7/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db", size = 217786, upload-time = "2026-07-07T14:33:05.12Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8d/feabb82cb49fcad14515b1d7d1ca4787b0da7fc723a212bf89bc9e0fac52/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993", size = 216798, upload-time = "2026-07-07T14:33:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ff/c946d63bc3786d5b84d960b0f7ab7e25b828486a946b5aa997625bcaf6a6/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da", size = 206429, upload-time = "2026-07-07T14:33:08.006Z" }, + { url = "https://files.pythonhosted.org/packages/af/ba/5e5007c370702f85d2ef75791fac7943ed41e080364a673b20142e430e3e/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3", size = 223066, upload-time = "2026-07-07T14:33:09.783Z" }, + { url = "https://files.pythonhosted.org/packages/83/d5/9096aa3cf532dfad237861544eb47a0f20d5adbf1039760fed8eaae935d9/charset_normalizer-3.4.9-cp311-cp311-win32.whl", hash = "sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d", size = 150456, upload-time = "2026-07-07T14:33:11.217Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a1/e29995109e455dc8eff8d0fac6ae509be39561318a7cfeac5d33ad029213/charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1", size = 161410, upload-time = "2026-07-07T14:33:12.743Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8d/1569f4d0032d6ba2a4fe4591c35bf87868c600c41a71eb5c2e1ffa8464c2/charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec", size = 152649, upload-time = "2026-07-07T14:33:14.173Z" }, + { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" }, + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" }, + { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[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 = "datacontract-cli" +version = "1.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boto3" }, + { name = "click" }, + { name = "datacontract-specification" }, + { name = "deepdiff" }, + { name = "fastjsonschema" }, + { name = "jinja-partials" }, + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "open-data-contract-standard" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "python-multipart" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rich" }, + { name = "ruamel-yaml" }, + { name = "sqlglot" }, + { name = "truststore" }, + { name = "typer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/65/5e9dea0f69ee7f7e564b2c150a9f92b989eb6d6d98ec802d54d9f6b5f029/datacontract_cli-1.0.12.tar.gz", hash = "sha256:6775fea8431697382bdad7889997739f343f95d6f6ff12cf9e782e5078ee7578", size = 3048918, upload-time = "2026-07-10T15:58:35.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/84/6ce1dd559bb3163e58c1d4c29f4416b471659790ed63ae50a0c6cfe7e617/datacontract_cli-1.0.12-py3-none-any.whl", hash = "sha256:ad521e1492b2e3a746ab9edb155483bd9954b65e396150aec76c2b4e4358e39a", size = 3047292, upload-time = "2026-07-10T15:58:34.174Z" }, +] + +[[package]] +name = "datacontract-specification" +version = "1.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/a5/3ee2bc8671b08e0c350091308386d2171bb03f8255647466ddcfab8717ca/datacontract_specification-1.2.3.tar.gz", hash = "sha256:5fc612255667581321b480e3f646c76ece618632a4aca4cd6ea5f647d98cbb61", size = 16162, upload-time = "2025-09-25T14:25:49.494Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/0e/ec63c117fbdb5ecfd6625e7527a267b85eaf26b4227e94a144509859a3dd/datacontract_specification-1.2.3-py3-none-any.whl", hash = "sha256:3d5a998a33be33ca95a20e3681a693b4d720baf0b956ff8970f3e85a77d6f35a", size = 15231, upload-time = "2025-09-25T14:25:48.107Z" }, +] + +[[package]] +name = "deepdiff" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachebox" }, + { name = "orderly-set" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/6b/6a4a5aaf38535eb332c2856aa08e73ed7c549d0851b1215401af0a2db1a7/deepdiff-9.1.0.tar.gz", hash = "sha256:07e9e366fab4297755153c4eab795ad4ef3cbd0d51660e847f5751c6bd727687", size = 382149, upload-time = "2026-05-15T20:18:05.751Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/26/4a2bad8eb430d8d805a4642c4bff25103a37548d74ab346f8b1e024abcc5/deepdiff-9.1.0-py3-none-any.whl", hash = "sha256:80c0460e1993b04f6f0ca79abf25548b129fd218478c4ebb08f80560f5d10610", size = 184662, upload-time = "2026-05-15T20:18:03.956Z" }, +] + +[[package]] +name = "deprecation" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788, upload-time = "2020-04-20T14:23:38.738Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178, upload-time = "2020-04-20T14:23:36.581Z" }, +] + +[[package]] +name = "eval-type-backport" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/15/273a4baf8248d6d76220723c3caf039d283774b31a7c46ba686120145b76/eval_type_backport-0.4.0.tar.gz", hash = "sha256:8397d25e6524c2e67b9576bb0636be27dea2192017711220c534ec2de921e9b0", size = 10260, upload-time = "2026-06-02T13:22:06.059Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/a7/bb99bf5e6f78736ddb53480f2c3ff3702ffe2196a7c5e1661c03081d398e/eval_type_backport-0.4.0-py3-none-any.whl", hash = "sha256:ad5e2a8db71b6696a56eafb938b0f5a337d3217f256b8e158b469422b4772b20", size = 6432, upload-time = "2026-06-02T13:22:04.827Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + +[[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 = "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.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "infoclimat-data-platform-tools" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "psycopg", extra = ["binary"] }, + { name = "pymysql" }, + { name = "pyyaml" }, +] + +[package.optional-dependencies] +code-index = [ + { name = "lancedb" }, + { name = "mistralai" }, + { name = "tree-sitter-language-pack" }, +] +contracts = [ + { name = "datacontract-cli" }, +] + +[package.metadata] +requires-dist = [ + { name = "datacontract-cli", marker = "extra == 'contracts'", specifier = ">=0.10" }, + { name = "lancedb", marker = "extra == 'code-index'", specifier = ">=0.13" }, + { name = "mistralai", marker = "extra == 'code-index'", specifier = ">=2.4" }, + { name = "psycopg", extras = ["binary"], specifier = ">=3.1" }, + { name = "pymysql", specifier = ">=1.1" }, + { name = "pyyaml", specifier = ">=6.0" }, + { name = "tree-sitter-language-pack", marker = "extra == 'code-index'", specifier = ">=0.9" }, +] +provides-extras = ["contracts", "code-index"] + +[[package]] +name = "jinja-partials" +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/d3/ef7bea796d230199e6b36d4466148d92503d937d82a9f55f54b14e81708e/jinja_partials-0.3.2.tar.gz", hash = "sha256:4ecaeb02735b48dd7643d0cb6f112e4669fa69cf83ce1c601b6f3c882283d013", size = 2974521, upload-time = "2026-06-11T16:43:05.572Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/7f/eab7def87914f272500236e3d765649c64a7bc83e24cf1b8303f76bfc6cf/jinja_partials-0.3.2-py3-none-any.whl", hash = "sha256:331219b75db8b8b5289a8e0aace2854c74d36b3b993ba960748f7f2ed049743b", size = 9295, upload-time = "2026-06-11T16:43:06.848Z" }, +] + +[[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 = "jmespath" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z" }, +] + +[[package]] +name = "jsonpath-python" +version = "1.1.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/18/4ca8742534a5993ff383f7602e325ce2d5d7cc93d72ac5e1cdedbea8a458/jsonpath_python-1.1.6.tar.gz", hash = "sha256:dded9932b4ec41fb8726e09c83afa4e6be618f938c2db287cc2a81723c639671", size = 88178, upload-time = "2026-05-07T01:26:34.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/8a/1270a6803bd821cbfcdda387eaa13cb41a7b1f7b9bd145979b3bfb9d6cb7/jsonpath_python-1.1.6-py3-none-any.whl", hash = "sha256:a1c50afd8d3fbbaf47a4873bc890dcb3c15da96f5c020327977d844d8731a2d4", size = 14453, upload-time = "2026-05-07T01:26:33.306Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "lance-namespace" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lance-namespace-urllib3-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/81/4cf8d0412e1f37b2bfa70d0aeb9c7ae4ab73607534e44d60b55efb485306/lance_namespace-0.9.0.tar.gz", hash = "sha256:f738b641cc615b17323baa4eb47900f184688739ee3d2ea9fe39396b9588e53d", size = 11637, upload-time = "2026-07-01T07:42:41.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/fe/f38747c9610ade83dd9a99a0470b9432b6f21ce4e2bb5524edbe66f626fd/lance_namespace-0.9.0-py3-none-any.whl", hash = "sha256:f785ff10927e4ce0db69986576670fedd37f8a33521e8a4630c6be22db8061b2", size = 13501, upload-time = "2026-07-01T07:42:39.372Z" }, +] + +[[package]] +name = "lance-namespace-urllib3-client" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "typing-extensions" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/c3/32d0e2618549ace857c80a457e5915ef3e1145661baff876c8a5ec27be5b/lance_namespace_urllib3_client-0.9.0.tar.gz", hash = "sha256:cf796fa5307fa4dde91fe4bec2af28b90ba79191852d4394e8fe44276538e40f", size = 235805, upload-time = "2026-07-01T07:42:42.563Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/ab/c8754da0a1efc817f8480100cfe12b7e04034df834759de8ecf02beff3cc/lance_namespace_urllib3_client-0.9.0-py3-none-any.whl", hash = "sha256:be819c8cffb1e460a3a504dbf52d1ca009560a48e7202b8c4279998e4adf9fe4", size = 405586, upload-time = "2026-07-01T07:42:40.503Z" }, +] + +[[package]] +name = "lancedb" +version = "0.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecation" }, + { name = "lance-namespace" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "overrides", marker = "python_full_version < '3.12'" }, + { name = "packaging" }, + { name = "pyarrow" }, + { name = "pydantic" }, + { name = "tqdm" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/f7/5262b9aa593f790757163c0165ab0da1dda054758901bea7e4f02c9cb633/lancedb-0.34.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c462f2e6f933cad659fd0179394eaab578acbc9151fe2ef41bc29b36ecca5058", size = 52654213, upload-time = "2026-07-02T17:13:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/69/99/05ea0d32229ebea695193ff20c15d6ecae25785ad82a9d4723d98832a284/lancedb-0.34.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:48829e88e708947d0520454ab9e4f8efa35f3e3626469eadd3a6e061b89cb223", size = 55434501, upload-time = "2026-07-02T17:13:34.81Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4e/4325c13d5afa93c466428a5a0f168ad4d96f5eb4a77bbe7c5100d39c9897/lancedb-0.34.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:05ba8a5b58e064edfbe5be71b1abf2e411b4eaf295d1a173dcb1a55c5bfb5285", size = 58659359, upload-time = "2026-07-02T17:13:38.424Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/8ca165f1386caf6c4d1c515afd52f345b66432264eecfdfb7fd33eefd9af/lancedb-0.34.0-cp39-abi3-win_amd64.whl", hash = "sha256:51cbc11808f9e3332819b9367c975b3a888541447a8e7bea09c57c852a279153", size = 63530726, upload-time = "2026-07-02T17:13:41.612Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[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/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mistralai" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eval-type-backport" }, + { name = "httpx" }, + { name = "jsonpath-python" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/c1/c6452c81a3d7fc0423b4cfcd84840cf7141c93a0c50755abc27a7619a988/mistralai-2.6.0.tar.gz", hash = "sha256:531a86292ad498fc0fcd6dfcd480a3f4db9e92f558e14ffb22172824831e3a6e", size = 518760, upload-time = "2026-07-06T14:40:08.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/d5/6b9c08ab9b5b890970e8949bf00a9f8f82653826de5cc5ad506fe1c1fb73/mistralai-2.6.0-py3-none-any.whl", hash = "sha256:4b7202b0cab84ea03f8ff4a933c8cfc615b3057520d9d76467c07aa23939dab2", size = 1235945, upload-time = "2026-07-06T14:40:06.226Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", +] +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, + { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, + { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, + { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, + { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, + { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" }, + { url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" }, + { url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" }, + { url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" }, + { url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" }, + { url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" }, +] + +[[package]] +name = "open-data-contract-standard" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/81076b5398c08444f50f749a363f43f0f063b05f7de232da7437129ef458/open_data_contract_standard-3.1.2.tar.gz", hash = "sha256:9da18e1e961388bca6110e5a394c85bdf69de3e9966b2acf3f81f0092694d714", size = 18095, upload-time = "2025-12-17T12:43:56.88Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/9c/ed60cc0d1fcbfe9605abf7449f0301d215d15db8a000f3b2402c04407789/open_data_contract_standard-3.1.2-py3-none-any.whl", hash = "sha256:da801b93af6f18704100387a830388c7d78f8811ce834d84505241f22b882213", size = 17253, upload-time = "2025-12-17T12:43:55.533Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.39.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/b9/3161be15bb8e3ad01be8be5a968a9237c3027c5be504362ff800fca3e442/opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c", size = 65767, upload-time = "2025-12-11T13:32:39.182Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/df/d3f1ddf4bb4cb50ed9b1139cc7b1c54c34a1e7ce8fd1b9a37c0d1551a6bd/opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950", size = 66356, upload-time = "2025-12-11T13:32:17.304Z" }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.60b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/df/553f93ed38bf22f4b999d9be9c185adb558982214f33eae539d3b5cd0858/opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953", size = 137935, upload-time = "2025-12-11T13:32:50.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/5e/5958555e09635d09b75de3c4f8b9cae7335ca545d77392ffe7331534c402/opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb", size = 219982, upload-time = "2025-12-11T13:32:36.955Z" }, +] + +[[package]] +name = "orderly-set" +version = "5.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/88/39c83c35d5e97cc203e9e77a4f93bf87ec89cf6a22ac4818fdcc65d66584/orderly_set-5.5.0.tar.gz", hash = "sha256:e87185c8e4d8afa64e7f8160ee2c542a475b738bc891dc3f58102e654125e6ce", size = 27414, upload-time = "2025-07-10T20:10:55.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl", hash = "sha256:46f0b801948e98f427b412fcabb831677194c05c3b699b80de260374baa0b1e7", size = 13068, upload-time = "2025-07-10T20:10:54.377Z" }, +] + +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812, upload-time = "2024-01-27T21:01:33.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload-time = "2024-01-27T21:01:31.393Z" }, +] + +[[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 = "psycopg" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/2f/cb91e5502ec9de1de6f1b76cfbf69531932725361168bb06963620c77e2e/psycopg-3.3.4.tar.gz", hash = "sha256:e21207764952cff81b6b8bdacad9a3939f2793367fdac2987b3aac36a651b5bc", size = 165799, upload-time = "2026-05-01T23:31:55.179Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/e0/7b3dee031daae7743609ce3c746565d4a3ed7c2c186479eb48e34e838c64/psycopg-3.3.4-py3-none-any.whl", hash = "sha256:b6bbc25ccf05c8fad3b061d9db2ef0909a555171b84b07f29458a447253d679a", size = 213001, upload-time = "2026-05-01T23:20:50.816Z" }, +] + +[package.optional-dependencies] +binary = [ + { name = "psycopg-binary", marker = "implementation_name != 'pypy'" }, +] + +[[package]] +name = "psycopg-binary" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/bf/70d8a60488f9955cbbcd538beae44d56bb2f1d19e673b72788f2d343ff55/psycopg_binary-3.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7bfff1ca23732b488cbca3076fc11bc98d520ee122514fdb17a8e20d3338f5a", size = 4609750, upload-time = "2026-05-01T23:24:20.06Z" }, + { url = "https://files.pythonhosted.org/packages/db/b0/29e98ba210c9dbc75a6dc91e3f99b9e06ea901a62ca95804e02a1ae13e6b/psycopg_binary-3.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32a6fbf8481e3a370d0d72b860d35948a693cb01281da217f7b2f307636e591a", size = 4676700, upload-time = "2026-05-01T23:25:21.727Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ab/3df087b3c12bf74e47c08204172b2fabb5a144679110d5c7ad12d9201323/psycopg_binary-3.3.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bdef84570ebbce1d42b4e7ea952d21c414c5f118ad02fee00c5625f35e134429", size = 5496319, upload-time = "2026-05-01T23:25:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/f088207b4cd6772f9e0d8a91807e79fa2458d4eb9eb1ae406c68415f2bec/psycopg_binary-3.3.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa1cbc10768a796c96d3243656016bf4e337c81c71097270bb7b0ad6210d9765", size = 5171906, upload-time = "2026-05-01T23:25:34.004Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/4523a857f253871d75c22e1c2e79fd47e599e736bcba1bad58d83e24be02/psycopg_binary-3.3.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf7f73a4a792bc5db58a4b385d8a1467e8d468f7548702fb0ed1e9b7501b1c13", size = 6762621, upload-time = "2026-05-01T23:25:41.392Z" }, + { url = "https://files.pythonhosted.org/packages/7c/d1/925bf776503345bef428e6c45fb017d0139ddbe0e211814b585c4253dca8/psycopg_binary-3.3.4-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7b4d40c153fa352ab3cca530f3a0baedf7621b2ebcbd7f084009522c21788fc", size = 5006319, upload-time = "2026-05-01T23:25:51.419Z" }, + { url = "https://files.pythonhosted.org/packages/6f/aa/99727337206fbba357ca084bf4ea8b29dc986f61842a2685859af61416db/psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f9b1c2533af01cd7648378599f82b0b8ae32f293296e6eec5753a625bc97ef28", size = 4535388, upload-time = "2026-05-01T23:25:57.957Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a4/567ba2c37d19d8c2f63d836385dfd2495aa5897bbee6cfab104d9ee58624/psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad3bc94054876155549fdaedf4a46d1ec69d39a5bcee377148afe498e84c4b8e", size = 4224544, upload-time = "2026-05-01T23:26:03.832Z" }, + { url = "https://files.pythonhosted.org/packages/b7/23/86457f5a82731685d7701de7bfaa5eb783dd1fecbf875321897d9d9ce33a/psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb4eed2079c01a4850bf467deacfab56d356d4225040170af03dc9958321242d", size = 3956282, upload-time = "2026-05-01T23:26:09.983Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d8/249456df16d47de082abd9b73bce8ccdeb0293eb12e590f9150c7cbdb788/psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f80e3f2b5331dbbf0901bcb658056c03eeb2c1ef31d774afb0d61598b242e744", size = 4261736, upload-time = "2026-05-01T23:26:16.798Z" }, + { url = "https://files.pythonhosted.org/packages/15/6b/c4abe228acafd8a385c1fb615d4f1e3c9b8ad7a4e4f0e84118ba3ffeed9c/psycopg_binary-3.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:574ea21a9651958f1535c5a1c649c7409e9168bcbffa29a3f2f961f58b322949", size = 3570620, upload-time = "2026-05-01T23:26:22.655Z" }, + { url = "https://files.pythonhosted.org/packages/b6/82/df3312c0ca083d5b43b352f27d4dd8b1e614bd334473074715d9e0000da4/psycopg_binary-3.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:612a627d733f695b1de1f9b4bd511c15f999a5d8b915d444bbd7dd71cf3370da", size = 4609813, upload-time = "2026-05-01T23:26:30.612Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b5/d74d542458d3e8ac0571d8a88f57ca369999b9a82f4fa528052d0d7d3e4c/psycopg_binary-3.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:13a7f380824c35896dcac7fe0f61440f7ca49d6dc73f3c13a9a4471e6a3b302e", size = 4676799, upload-time = "2026-05-01T23:26:38.475Z" }, + { url = "https://files.pythonhosted.org/packages/09/67/06bab9c60671999f4c6ceff1b334f3ac1f9fc5789eb467c714623ea21de9/psycopg_binary-3.3.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:276904e3452d6a23d474ef9a21eee19f20eed3d53ddd2576af033827e0ba0992", size = 5497050, upload-time = "2026-05-01T23:26:47.061Z" }, + { url = "https://files.pythonhosted.org/packages/72/9b/023433e2b20f970de1e22d29132a95281277646da0b2e2879dd4ee94b8c1/psycopg_binary-3.3.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ab8cca8ef8fb1ccf5b048ae5bd78ba55b9e4b5d472e3ce5ca39ff4d2a9c249e4", size = 5172428, upload-time = "2026-05-01T23:26:56.708Z" }, + { url = "https://files.pythonhosted.org/packages/08/cd/ae16da8fde228a38b2fe9269bbc13cf89e0186173f2265600f02d6a71e64/psycopg_binary-3.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7465bfe6087d2d5b42d4c53b9b11ca9f218e477317a4a162a10e3c19e984ba8e", size = 6762746, upload-time = "2026-05-01T23:27:07.023Z" }, + { url = "https://files.pythonhosted.org/packages/4f/81/0ba09fa5f5f88779093a2541a8e02489825721f258ab88058b11d68b3eb5/psycopg_binary-3.3.4-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22cdbf5f91ef7bb91fe0c5757e1962d3127a8010256eefd9c61fcaf441802097", size = 5006033, upload-time = "2026-05-01T23:27:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/73/6a/629136040cc3497adb442a305710b5913f2a754d4630fc3d3717c4c0df65/psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e2631da29253a98bd496e6c4813b24e09a4fe3fb2a9e88513305d6f8747cce95", size = 4534175, upload-time = "2026-05-01T23:27:18.248Z" }, + { url = "https://files.pythonhosted.org/packages/7c/32/1027f843c6dc2d5d51960ee62cc0c2cf755a4c39455aff1371173edbef7d/psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7f7668f30b9dd5163197e5cbf4e0efd54e00f0a859cc566ce56cfc31f4054839", size = 4224203, upload-time = "2026-05-01T23:27:24.3Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e1/380a724d9093c74adb14d4fce920ea8327838abb61f760b1448586b14a8e/psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:cffc3408d77a27973f33e5d909b624cce683db5fc25964b02fe0aae7886c1007", size = 3954509, upload-time = "2026-05-01T23:27:30.815Z" }, + { url = "https://files.pythonhosted.org/packages/db/cd/895893ae575a09c97ccfd5def070d88993d955ef34df45a881fd5ff506d6/psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0579252a1202cd73e4da137a1426e2dae993ae44e757605344282af3a082848c", size = 4259551, upload-time = "2026-05-01T23:27:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c6/2330a20794e37a3ec609ef2fd8522919ec7a4395a1abf979a8e2d1775cd5/psycopg_binary-3.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:41f2ec0fea529832982bcb6c9415de3c86264ebe562b77a467c0fbcd7efbba8d", size = 3572054, upload-time = "2026-05-01T23:27:45.455Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/03818e13ba7f36de93573c93ee3482006d3dfa8b0f8d28df511bad0a1a92/psycopg_binary-3.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5ab28a2a7649df3b72e6b674b4c190e448e8e77cf496a65bd846472048de2089", size = 4591122, upload-time = "2026-05-01T23:27:56.162Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b9/11b341edf8d54e2694726b273fe9652b254d989f4f63e3ac6816ad6b55f4/psycopg_binary-3.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6402a9d8146cf4b3974ded3fd28a971e83dc6a0333eb7822524a3aa20b546578", size = 4669943, upload-time = "2026-05-01T23:28:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/18/4665bacd65e7865b4372fcd8abb8b9186ada4b0025f8c2ca691b364a556c/psycopg_binary-3.3.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:580ae30a5f95ccd90008ec697d3ed6a4a2047a516407ad904283fa42086936e9", size = 5469697, upload-time = "2026-05-01T23:28:11.337Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b1/b83136c6e510593d9b0c759ba5384337bc4ad82d19fda675adc4b2703c84/psycopg_binary-3.3.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7510c37550f91a187e3660a8cc50d4b760f8c3b8b2f89ebc5698cd2c7f2c85d", size = 5152995, upload-time = "2026-05-01T23:28:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/67/8d/a9821e2a648afe6091989929982a3b0f00b2631a859cb81379728f08fb75/psycopg_binary-3.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77df19583501ea288eaf15ac0fe7ad01e6d8091a91d5c41df5c718f307d8e31b", size = 6738180, upload-time = "2026-05-01T23:28:30.654Z" }, + { url = "https://files.pythonhosted.org/packages/7e/58/2e349e8d23905dc2317b80ac65f48fb6f821a4777a4e994a60da91c4850f/psycopg_binary-3.3.4-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:018fbed325936da502feb546642c982dcc4b9ffdea32dfef78dbf3b7f7ad4070", size = 4978828, upload-time = "2026-05-01T23:28:37.277Z" }, + { url = "https://files.pythonhosted.org/packages/45/48/57b00d03b4721878326122a1f1e6b0a90b85bcaec56b5b2f8ea6cfa45235/psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17a21953a9e5ff3a16dab692625a3676e2f101db5e40072f39dbee2250194d68", size = 4509757, upload-time = "2026-05-01T23:28:43.078Z" }, + { url = "https://files.pythonhosted.org/packages/25/37/33b47d8c007df69aec500df5889767c4d313748e8e9e27a2fef8a6dabcee/psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:eb05ee1c2b817d27c537333224c9e83c7afb86fe7296ba970990068baf819b16", size = 4190546, upload-time = "2026-05-01T23:28:50.016Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c6/32b0835dbc2122617902b649d76a91c1e75406e76bf3d595b0c3bb5ffad6/psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:773d573e11f437ce0bdb95b7c18dc58390494f96d43f8b45b9760436114f7652", size = 3926197, upload-time = "2026-05-01T23:28:55.55Z" }, + { url = "https://files.pythonhosted.org/packages/cd/68/d190ef0c0c5b16ded07831dabc8ddd412f4cdab07ec6e30ed38d9bda0e1f/psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e55ccbdfae79a2ed9c6369c3008a3025817ff9d7e27b32a2d84e2a4267e66e", size = 4236627, upload-time = "2026-05-01T23:29:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/25/8f/81dcbc2e8454b74d14881275ea45f00791052dac531a9fa8be1730d1685b/psycopg_binary-3.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:494ca54901be8cf9eb7e02c25b731f2317c378efa44f43e8f9bd0e1184ae7be4", size = 3560782, upload-time = "2026-05-01T23:29:11.967Z" }, + { url = "https://files.pythonhosted.org/packages/09/43/13e9c406fbbf354580476e248a16b64802a376873ebe6339e30bb655572d/psycopg_binary-3.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fbd1d4ed566895ad2d3bf4ddfd8bae90026930ddf29df3b9d91d32c8c47866a7", size = 4590377, upload-time = "2026-05-01T23:29:18.782Z" }, + { url = "https://files.pythonhosted.org/packages/22/be/2923cd7c3683e7afdecf4f10796a18de02f5c5ddc0969aa2ad0a8cdd3bbd/psycopg_binary-3.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:75a9067e236f9b9ae3535b66fe99bddb33d39c0de10112e49b9ab11eee53dc31", size = 4669023, upload-time = "2026-05-01T23:29:25.884Z" }, + { url = "https://files.pythonhosted.org/packages/96/a0/2c913d6fe13d6a8bd13597d36739bf47af063ad9399e402cfecab16f3c1e/psycopg_binary-3.3.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b56b603ebcea8aa10b46228b8410ba7f13e7c2ee54389d4d9be0927fd8ce2a70", size = 5467423, upload-time = "2026-05-01T23:29:33.416Z" }, + { url = "https://files.pythonhosted.org/packages/e7/38/205d10bc1ad0df4a21c5c51659126bd3ea0ef98fcad1e852f78c249bb9c3/psycopg_binary-3.3.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c677c4ad433cb7150c8cd304a0769ae3bcfbe5ea0676eb53faa7b1443b16d0d3", size = 5151137, upload-time = "2026-05-01T23:29:42.013Z" }, + { url = "https://files.pythonhosted.org/packages/36/fc/f0381ddcd45eff3bb70dbca6823a996048d7f507b2ec3fc92c6fabc0fe87/psycopg_binary-3.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26df2717e59c0473e4465a97dfb1b7afebaa479277870fd5784d1436470db47c", size = 6736671, upload-time = "2026-05-01T23:29:51.626Z" }, + { url = "https://files.pythonhosted.org/packages/95/40/fa545ae152c24327651e5624e4902121e808270be36c10b12e9939be09bc/psycopg_binary-3.3.4-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dc1f79fd16bb1f3f4421417a514607539f17804d95c7ed617265369d1981cae", size = 4979601, upload-time = "2026-05-01T23:29:56.961Z" }, + { url = "https://files.pythonhosted.org/packages/86/e4/2f8a47ee97f90cd2b933d0463081d35631ff419de2b8c984a5f369857de0/psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:136f199a407b5348b9b857c504aff60c77622a28482e7195839ce1b51238c4cc", size = 4510513, upload-time = "2026-05-01T23:30:07.243Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0e/94e842ff4a7f98ed162580ca2e8b8864b28c1e0350f2443f8ee47f821167/psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b6f5a29e9c775b9f12a1a717aa7a2c80f9e1db6f27ba44a5b59c80ac61d2ffcf", size = 4187243, upload-time = "2026-05-01T23:30:15.352Z" }, + { url = "https://files.pythonhosted.org/packages/d0/83/fc6c174b672e29b7de996ea77b6cbddf46c891751c3355f6974292baa6b4/psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:ee17a2cf4943cde261adfad1bbc5bf38d6b3776d7afff74c7cabcbeaeb08c260", size = 3927347, upload-time = "2026-05-01T23:30:21.186Z" }, + { url = "https://files.pythonhosted.org/packages/e9/65/768364d4a97a15b1a7f47ba52688c1686f22941d8332a8398cefc468e25f/psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c4ab71be17bdca30cb34c34c4e1496e2f5d6f20c199c12bad226070b22ef9bf", size = 4236393, upload-time = "2026-05-01T23:30:26.211Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3b/218efbc9e645becd80cdf651acda05f85cfe546b7a9c0458c7cbc8fe1f74/psycopg_binary-3.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:dbfdb9b6cc79f31104a7b162a2b921b765fcc62af6c00540a167a8de47e4ed38", size = 3564592, upload-time = "2026-05-01T23:30:31.764Z" }, + { url = "https://files.pythonhosted.org/packages/48/a6/828c9185701dab71b234c2a76c38a08b098ebfec5020716b4e93807492b5/psycopg_binary-3.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:28b7398fdd19db3232c884fb24550bdfe951221f510e195e233299e4c9b78f97", size = 4607292, upload-time = "2026-05-01T23:30:38.962Z" }, + { url = "https://files.pythonhosted.org/packages/92/58/5b40dbc9d839045c9dae956960e4fb6d20bcabe6c59a2aa34fc3a371913f/psycopg_binary-3.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1fbaa292a3c8bb61b45df1ad3da1908ccee7cb889db9425e3557d9e34e2a4829", size = 4687023, upload-time = "2026-05-01T23:30:47.227Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/793f0ac107a9003b48441d0d1f9f616d96e0f37458dd8dc12528ceff55fb/psycopg_binary-3.3.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94596f9e7633ee3f6440711d43bb70aa31cc0a46a900ab8b4201a366ace5c9e7", size = 5486985, upload-time = "2026-05-01T23:30:55.517Z" }, + { url = "https://files.pythonhosted.org/packages/8f/26/42e8533497e2592334f68ec529cf5f840f7fa4e99575a4bb61aa184dbfbf/psycopg_binary-3.3.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8c0056529e68dbe9184cd4019a1f3d8f3a4ead2f6fc7a5afcf27d3314edd1277", size = 5168745, upload-time = "2026-05-01T23:31:01.904Z" }, + { url = "https://files.pythonhosted.org/packages/15/af/b7151776cc08d5935d45c833ec818a9beb417cf7c08239af1aafbdae78ee/psycopg_binary-3.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c09aad7051326e7603c14e50636db9c01f78272dc54b3accff03d46370461e6", size = 6761486, upload-time = "2026-05-01T23:31:14.511Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ed/c92533b9124712d592cbf1cd6c76da933a2e0acea81dfe1fbe7e735f0cff/psycopg_binary-3.3.4-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:514404ed543efd620c85602b747df2a23cf1241b4067199e1a66f2d2757aaa41", size = 4997427, upload-time = "2026-05-01T23:31:20.901Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/ccadfd0de416aa188356daa199453af24087b042e296088706d190ae0295/psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:46893c26858be12cc49ca4226ed6a60b4bfccadd946b3bebb783a60b38788228", size = 4533549, upload-time = "2026-05-01T23:31:26.204Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a0/c8f43cee36386f7bc891ab41a9d31ea07cf9826038e732da79f26b1e5f34/psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:df1d567fc430f6df15c9fcf67d87685fc49bdb325adc0db5af1adfb2f44eb5c9", size = 4210256, upload-time = "2026-05-01T23:31:33.884Z" }, + { url = "https://files.pythonhosted.org/packages/4e/2c/c1547871be3790676e8868b38655496422f94f0978dfb66b74bdba2f1676/psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:6b9016b1714da4dd5ecaaa75b82098aa5a0b87854ce9b092e21c27c4ae23e014", size = 3946204, upload-time = "2026-05-01T23:31:39.626Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b1/f6670f00fa7ea601584623f6c11602ab92117d83eaff885e0210f6de7418/psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:47c656a8a7ba6eb0cff1801a4caaa9c8bdc12d03080e273aff1c8ac39971a77e", size = 4255811, upload-time = "2026-05-01T23:31:44.986Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e6/5fff07a70d1f945ed90ae131c3bd76cab32beff7c58c6db15ad5820b6d1f/psycopg_binary-3.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:c37e024c07308cd06cf3ec51bfd0e7f6157585a4d84d1bce4a7f5f7913719bf8", size = 3666849, upload-time = "2026-05-01T23:31:51.165Z" }, +] + +[[package]] +name = "pyarrow" +version = "25.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/f3/95428098d1fa7d04432fb750eed06b41304c2f6a5d3319985e64db2d9d41/pyarrow-25.0.0.tar.gz", hash = "sha256:d2d697008b5ec06d75952ef260c2e9a8a0f6ccfce24266c04c9c8ade927cb3b4", size = 1199181, upload-time = "2026-07-10T08:29:50.116Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/2a/eaa70e6d6ed430c2e90c0599e2831a41a50251879e44788ccdbc73115af1/pyarrow-25.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ce0ca222802087b9a8cb031a6468442cb6b67c290a45a601cac64753d34954d3", size = 35945551, upload-time = "2026-07-10T08:25:23.153Z" }, + { url = "https://files.pythonhosted.org/packages/df/e0/917086af6b246143012cdc8a7c886b018b53204f3d69fc5f9be5857a8b80/pyarrow-25.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7d6da02ffc7a3a9bda3b7ded4cc2a27ff73969ab37153f3afd46bbbc1ba4f0f7", size = 37636698, upload-time = "2026-07-10T08:25:28.031Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/c87829f92503f84993721791c942f3d9aa81044de51a8cfb1da5810e5345/pyarrow-25.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:dbf9fa5d4bde73b1cc16377dcaaa010f971e6fa7f5083f5d44f34b50bc1d74af", size = 46858364, upload-time = "2026-07-10T08:25:34.527Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ba/2030d454c2747e26cce23e4a0338067ee0830a155b7894da04caa96783a5/pyarrow-25.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b72d943ff4e10fec8d48aedb23322d8f6ea8bc2d698b81db37e73730f69e4862", size = 50056398, upload-time = "2026-07-10T08:25:40.785Z" }, + { url = "https://files.pythonhosted.org/packages/78/ce/ba7a5ce7bf0cfc372ec48203a34ece42f73aa2f3231706f61c55e105ecd0/pyarrow-25.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5fb2d837960f1df7f679ff9f1a55065e306347d379e0768cebf14781254d6194", size = 49958146, upload-time = "2026-07-10T08:25:46.98Z" }, + { url = "https://files.pythonhosted.org/packages/75/eb/c34a29fb7a70dca2f903c7d85a928928ef55af20cd56e99de6b4c0d897bc/pyarrow-25.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:add690feafa0953c443cdba9e9e87f5eaa198f1ea2e43a3b146ea83f202262d0", size = 53096264, upload-time = "2026-07-10T08:25:53.925Z" }, + { url = "https://files.pythonhosted.org/packages/36/f9/35b1f83a0727d84951588e4034aca2feb76dfb45b0725918c0037b0a48f7/pyarrow-25.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:d293e9959b29a24c82d936d04ab2b7fd8b8d334030de2e56a99aba94f008ad7a", size = 27840572, upload-time = "2026-07-10T08:25:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/a7/98/ae2b5acf9876dbeffa6f320776242c52caab062df55c8ac5501ed2679e74/pyarrow-25.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:2e3b6544e26e393fe2cd530f523e36c1c8d3c345bbbb60cca3fd866be8322517", size = 35939080, upload-time = "2026-07-10T08:26:04.53Z" }, + { url = "https://files.pythonhosted.org/packages/80/09/3de2a968edbd496c86cb8b932cdbee2d4b08c4a28e9884a15e5c705a646b/pyarrow-25.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b724d127783b4c19f088fcdfc844cbc318809246a30307bcabd5ed02045e890e", size = 37633420, upload-time = "2026-07-10T08:26:10.354Z" }, + { url = "https://files.pythonhosted.org/packages/19/86/8399243a4ce080426ec37db18d5e29148b7ec960a8a8c7f9059a7bf6ef0a/pyarrow-25.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:244f98a595f70fa4fd35faa7508c4ae67e14a173397a4b3b49d2b3c360fb0062", size = 46861050, upload-time = "2026-07-10T08:26:16.397Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/72d704b02bc5fc6d06954d76a0208c1e79cad3ab370f6d6a91ffe5078870/pyarrow-25.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:0222f0071d13313962a88d21bf28b80d355ac39d81bfa6ff3fe00eeaf748e4be", size = 50056458, upload-time = "2026-07-10T08:26:23.271Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/3c31a60b6403d63cad2e0f829096f5fc5763a129ead4207a5d4690b96448/pyarrow-25.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b58726f118c079f9d4ed7e904975d4f15fd69d0741ba511a4e2dcaa4ef16354f", size = 49957793, upload-time = "2026-07-10T08:26:30.232Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/8f8a019061f9863a831915329264372a87ed25eaf9109ce56eb0e84012c5/pyarrow-25.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:38a2c887cb3883e241b70201688db34133b6dfadd04f03c8f9213df53770c18e", size = 53100544, upload-time = "2026-07-10T08:26:36.414Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e2/738071e95c5ddad7b3dfc12f569ffa992db89d7d7b4a95258fd184191249/pyarrow-25.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:161649d60a7a46c613a19fd795763ea8a88c36ba997dd99d9bc66e6794ee36e8", size = 27848311, upload-time = "2026-07-10T08:26:41.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/44/fdd3a4377807b7dcabe2d4b5aa99dbbc98e2e5df3f1ca4e7f0aec492d987/pyarrow-25.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:149730a3d1f0fb59d663a0b8aa210adfd9c17c27cd94a0d143e60daea8320d4e", size = 35850884, upload-time = "2026-07-10T08:26:47.357Z" }, + { url = "https://files.pythonhosted.org/packages/bf/71/9f053177a7709b8c90abb00a2375b916286f9f0d6cfb21a5cadd4ef811e8/pyarrow-25.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:0721332c30fdd453fdd1fc203b2ac1f4c9db5aea28fa38d41f2574c4b068b9ec", size = 37616197, upload-time = "2026-07-10T08:26:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/95/1a/22bfb6597dcdc861fa83c39c06e1457cb56f698940eff42fbb25de30e8e5/pyarrow-25.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fa1482b3da10cac2d4db6e26b81da543e237616af2ef6d466018b31ca586496f", size = 46841966, upload-time = "2026-07-10T08:27:07.685Z" }, + { url = "https://files.pythonhosted.org/packages/55/0e/cd705c042bc4fe7022478db577fcab4abdcfabb9bc37ab7a75556b3fcb2b/pyarrow-25.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:5d1dbf24e151042f2fa3c129563f65d66674128868496fb008c4272b16bdf778", size = 50088993, upload-time = "2026-07-10T08:27:14.268Z" }, + { url = "https://files.pythonhosted.org/packages/98/ee/d822e1ee31fe31ec5d057210e0605c950b975dcd8d9a332976cc859a9df8/pyarrow-25.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:20887a762dd61dcc530f93a140840ab1f6aa7836b33270e42d627ab3cf11e537", size = 49941005, upload-time = "2026-07-10T08:27:21.274Z" }, + { url = "https://files.pythonhosted.org/packages/33/1b/207a90cc64619a095eb75a263ae069735f2810056d43c667befd573ec083/pyarrow-25.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:58d1ab556b0cea1c93fdb799b24ad58adb2f2a2788dbce782a94f64ae1a5cc9b", size = 53112355, upload-time = "2026-07-10T08:27:27.911Z" }, + { url = "https://files.pythonhosted.org/packages/7e/fe/81d1e5f8beed15c01e98649d5c6e2167b67fd395884a2488f18bf1cf0dba/pyarrow-25.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:3f356afe61186395c861d5cd63dc21ff7d5fa335012a4668d979257df7fea0f5", size = 27945954, upload-time = "2026-07-10T08:27:32.903Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c8/098ce17d778fd9d29e40bb8c5f19a40cc90c3f0b46c9057b0d7993f42f54/pyarrow-25.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:8831a3ba52fa7cdb78d368d968b1dcd06171e6dff5461e16d90de91d371e47bc", size = 35844549, upload-time = "2026-07-10T08:27:37.956Z" }, + { url = "https://files.pythonhosted.org/packages/bc/66/24c28877219abf6263d909b1592c97ff82c59f13a59acbed11fc87c0654f/pyarrow-25.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:5f4bacb60f91dd2fca6c52f1b9a0012cd090e0294f1f781dc1881a247a352f8e", size = 37610397, upload-time = "2026-07-10T08:27:43.803Z" }, + { url = "https://files.pythonhosted.org/packages/53/55/6d1d5f5aff317ec5de9421594679ed51ed828fe7e2ce209327f819d801e4/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:59516c822d5fd8e544aaa0dfe72f36fed5d4c24ea8390aab1bcd31d7e959c6be", size = 46841701, upload-time = "2026-07-10T08:27:49.741Z" }, + { url = "https://files.pythonhosted.org/packages/b5/5d/f790fb6965ab54c9da0dda7856abc75fd0d7648d865f8d603c111d203a64/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f9dbd83e91c239a1f5ee7ce13f108b5f6c0efbe40a4375260d8f08b43ad05e9", size = 50090118, upload-time = "2026-07-10T08:27:56.051Z" }, + { url = "https://files.pythonhosted.org/packages/0c/8c/faf025357ebf31bc96777f234277aa31e2aeca6dd4ecaa391f29085473c2/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18dcc8cc50b5e72eae6fcbfc6c8776c21a007176b27a3cdec5c2f5bcf126708d", size = 49945559, upload-time = "2026-07-10T08:28:01.927Z" }, + { url = "https://files.pythonhosted.org/packages/07/a1/bd051871708ea99a5e0fc711926c26c6f2c6d0130c7aaac8093e34998af6/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4ec1895a87aa834c3b99b7a1e758747eb8bb57f922b32c0e0fa04afb8d6998b1", size = 53114238, upload-time = "2026-07-10T08:28:08.594Z" }, + { url = "https://files.pythonhosted.org/packages/7c/31/737f0c3cffcd6af647849477d1dd68045deac2e3963c3f9f211bedc48540/pyarrow-25.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:77c8d1ae46a44b4006e8db1cc977bbcc6ce4873c92f74137d68e45503b97fb18", size = 27861162, upload-time = "2026-07-10T08:28:12.975Z" }, + { url = "https://files.pythonhosted.org/packages/55/c7/581ccbcdb3d897eb2893328d68db3d52eca373bf2a7e964d0a6276b8e85b/pyarrow-25.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:72132b9a8a0a1840197794d4dea26080069b6b0981c116bc078762dc9691b21b", size = 35878945, upload-time = "2026-07-10T08:28:18.222Z" }, + { url = "https://files.pythonhosted.org/packages/64/d1/ccb01db7329ea0411ef4fbd9b62a04d3268b36777d4e758d5e39b91ddeab/pyarrow-25.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e009ef945e498dca2f050ea10d2e9764cb44017254826fc4574fdb8d2530173b", size = 37630854, upload-time = "2026-07-10T08:28:23.452Z" }, + { url = "https://files.pythonhosted.org/packages/af/9f/2d81ba89d1e4198d0cb25fe7529de936830fdaec0db926bb52a1ef7080d4/pyarrow-25.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:f57a39dbcb416345401c2e77a4373669b45fd111a1768e6cf267a7a0607ff0ec", size = 46905617, upload-time = "2026-07-10T08:28:29.376Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/0ed312ec800fb536f93783215126cee4b8977dcfeccba6f0f44df0cc87d7/pyarrow-25.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:447df764beb07c544f0178a5f6b70ef44b9ecf382b3cdfad4c2d7867353c3887", size = 50119765, upload-time = "2026-07-10T08:28:35.826Z" }, + { url = "https://files.pythonhosted.org/packages/ca/88/cab5063ba0c4d46a9f6b4b7eb1c9029dc0302d65cd5ab3510c949a386568/pyarrow-25.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac5dfeee59f9ceb4d45ba76e83b026c38c24334135bb329d8274baa49cec3c62", size = 50027563, upload-time = "2026-07-10T08:28:43.848Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fb/4d24f1b7fe2e042dc4ef315ef75e4e702d8e46fe10c37e63caff00502b03/pyarrow-25.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0f100dacf2c0f400601664a79d1a907ced4740514bb2b00917341038e2ce76f", size = 53162437, upload-time = "2026-07-10T08:28:52.819Z" }, + { url = "https://files.pythonhosted.org/packages/fa/65/da20806de93ca6ee91e72cb6a9b08b3ac890b46efc8d94a7326c651c4c81/pyarrow-25.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:2e093efbecb5317372f819228fa4b4e6157eee48d3f0a7b0303705ebf81a7104", size = 28613262, upload-time = "2026-07-10T08:29:47.544Z" }, + { url = "https://files.pythonhosted.org/packages/86/9f/c632afb1d3ef4a7814cee236718235f3a47eac46e97eb87df40f550b6b48/pyarrow-25.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:26be35b80780d2d21f4bae3d568b1666337c3a89722cc1794c956a77017cb24e", size = 36120702, upload-time = "2026-07-10T08:28:59.577Z" }, + { url = "https://files.pythonhosted.org/packages/36/0a/093d53a0e72ad06e45d6443e00651bbc2d21af4211295086cbf4d873d3b9/pyarrow-25.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:6f4812bfbf11ca7d8faf59eb8fff8bf4dd25ce3a38b62baa010cc17a0926d1b2", size = 37750674, upload-time = "2026-07-10T08:29:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/8a/18/b37fc31a69cff4bdfb8842683def5612f551b93fff6f44375e4a4a6a5535/pyarrow-25.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b8af8ceedf0c9c160fd2b63440f2d205b9404db85866c1217bfea601de7cfb50", size = 46912304, upload-time = "2026-07-10T08:29:14.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/35/5cae19ba72493e5598022468b56f6a5571f399f485bf412f157356476caa/pyarrow-25.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c70a5fd9a82bd1a702fd482bdc62d38dcb672fb2b449b1d7c0d7d1f4be7b7bfe", size = 50073652, upload-time = "2026-07-10T08:29:22.467Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a5/ddd508424bdfd5e6945765e9e2ffc687e2f6115972badc8ecf423076c407/pyarrow-25.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0490a7f8b38ffe11cc26526b50c65d111cb54ddac3717cec781806793f1244dc", size = 50058654, upload-time = "2026-07-10T08:29:29.689Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a4/324d0db203ff5eebe8694ec2d6ec5a23f9aaa5d02e5b8c692914c518c33c/pyarrow-25.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e83916bbcf380866b4e14255850b33323ff678dc9758411d0409cdd2523880b0", size = 53140153, upload-time = "2026-07-10T08:29:36.041Z" }, + { url = "https://files.pythonhosted.org/packages/bd/8d/d236e9c82fe315f9128885c8be3ec719f41965a1eb6b6f4b42470904cd41/pyarrow-25.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:13240f0d3dc5932ccd0bfa90cd76d835680b9d94a7661c635df4b703d40ce849", size = 28743657, upload-time = "2026-07-10T08:29:42.742Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +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/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146, upload-time = "2026-05-06T13:37:36.537Z" }, + { url = "https://files.pythonhosted.org/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769, upload-time = "2026-05-06T13:37:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958, upload-time = "2026-05-06T13:37:28.611Z" }, + { url = "https://files.pythonhosted.org/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118, upload-time = "2026-05-06T13:36:55.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876, upload-time = "2026-05-06T13:38:25.455Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703, upload-time = "2026-05-06T13:37:53.304Z" }, + { url = "https://files.pythonhosted.org/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042, upload-time = "2026-05-06T13:38:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231, upload-time = "2026-05-06T13:39:23.146Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388, upload-time = "2026-05-06T13:40:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769, upload-time = "2026-05-06T13:38:13.901Z" }, + { url = "https://files.pythonhosted.org/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312, upload-time = "2026-05-06T13:39:08.24Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817, upload-time = "2026-05-06T13:38:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085, upload-time = "2026-05-06T13:39:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311, upload-time = "2026-05-06T13:39:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, +] + +[[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 = "pymysql" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/bc/1c6a92f385940f727daeecf3bacaf186e03875dff57197801046c583bcf0/pymysql-1.2.0.tar.gz", hash = "sha256:6c7b17ca686988104d7426c27895b455cdeea3e9d3ceb1270f0c3704fead8c33", size = 49021, upload-time = "2026-05-19T08:26:22.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/bd/2534e130295c8cfd4f0a2e31623baab7502278f1e97bcfe61db75656a77f/pymysql-1.2.0-py3-none-any.whl", hash = "sha256:62169ce6d5510f08e140c5e7990ee884a9764024e4a9a27b2cc11f1099322ae0", size = 45716, upload-time = "2026-05-19T08:26:20.974Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "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.32" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", size = 46881, upload-time = "2026-06-04T16:18:58.647Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", size = 30042, upload-time = "2026-06-04T16:18:57.319Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[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/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { 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 = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, + { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, + { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, + { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, + { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, + { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, + { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, + { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, + { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, + { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, + { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, + { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, + { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, + { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, + { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, + { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, + { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, + { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.6.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/1f/a2dca5ffdbf1d475ffc4e80e4d5d720ff3a00f691795910116960ee12511/rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7", size = 342174, upload-time = "2026-06-30T07:14:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/323d08583c0832911768663d1944f0107fcd4088704858d84b5e06d105a0/rpds_py-2026.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db08f45aecde626498fb3df07bcf6d2ec040af42e859a4f5040d79c200342911", size = 345513, upload-time = "2026-06-30T07:14:56.515Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2a/e31989834d18d2f26ec1d2774c5b1eb3331df4ea8ada525175294c94b48a/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc992ab27b15f852c76755eb2ab7dce86585ddadba6fa5946e58556088845b4", size = 373783, upload-time = "2026-06-30T07:14:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/fe/e80107ee3639585c9941c17d6a42cd65325022f656c023191fce78c324c8/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f88d653e7b3b779d71ae7454e20dcc9b6bae903f33c269db9f2be41bda3f261", size = 378316, upload-time = "2026-06-30T07:14:59.077Z" }, + { url = "https://files.pythonhosted.org/packages/22/6f/81e3adf81acfb6fa694de2a6e4e7d8863121e3e0799e0a7725e6cf5679c4/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e52655eaf81e32593abedaa4bfe33170c8cfedf3365ed9be6e11e07f148f0278", size = 499423, upload-time = "2026-06-30T07:15:00.488Z" }, + { url = "https://files.pythonhosted.org/packages/2d/9a/41263969df0ce3d9af2a96d5005a288200af1989aed3354bfceb5fc0b21f/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfcc8b909769d19db55c7cc9541eb64b9b774b1057ffffb4f1048070475bb9f9", size = 386077, upload-time = "2026-06-30T07:15:01.911Z" }, + { url = "https://files.pythonhosted.org/packages/5e/19/7e98f468bd50346faff5b10e5297374b443bfdddacc8e9fbc65984539597/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1255b302953c86a486b81d330d5ee1d5bd937691ce271b6be0ef0e299eaab7", size = 371315, upload-time = "2026-06-30T07:15:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/99/3c/2b973b4d371906a134b03decfea7f5d9835a2c6d263454392e15b64b5b18/rpds_py-2026.6.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8d2294a31386bfa251d8c8a39472beee17db67d4f1a6eabea665d35c9a4461c3", size = 383502, upload-time = "2026-06-30T07:15:04.627Z" }, + { url = "https://files.pythonhosted.org/packages/98/2a/12e2799500af0a307bca76b63361c51f9fe479223561489c29eea1f2ee41/rpds_py-2026.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8f23ead891a3b762f35ab3b04623da7056545b48aa60d59957e6789914545da", size = 402673, upload-time = "2026-06-30T07:15:05.856Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e3/21e5872d165fe08be4f229e3d5ee9d90019c0bf0e5538de60dbd54009450/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:421aba32367055614287a4292b6a17f1939c9452299f7a0209c117e990b646d4", size = 549964, upload-time = "2026-06-30T07:15:07.159Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d0/5ee0fe36844297de8123bee27bc12078c1a7416ad9f1b8a8ca18d6b0c0ac/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e5822dfc2f0d4ab7e745eaa6d85945069329beeccef965af3f3bb26058fcab6", size = 615446, upload-time = "2026-06-30T07:15:08.531Z" }, + { url = "https://files.pythonhosted.org/packages/b1/80/1ea5873cb683f2fbe5f21b23ea1f6d179ead19f3c5b249b7eb5dca568ef2/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83e35b57523816c8613fd0776b40cd8bb9f596b37ddd2692eb4a6bb5ab2f8c93", size = 576975, upload-time = "2026-06-30T07:15:09.97Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e1/90ef639217a5ddb15b7f4f61b1c33911fd044ad03c311bafdd2bcab85582/rpds_py-2026.6.3-cp311-cp311-win32.whl", hash = "sha256:de3eceba0b683bcbb1ab93da016d0270df1f9ae7be716b40214c5dafac6ea45a", size = 204453, upload-time = "2026-06-30T07:15:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b7/b7a1695d7af36f521fb11e80d6d3adbd744f73b921859bd3c2a2c0dc706f/rpds_py-2026.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:2c54a076ca4d370980ab57bc0e31df57bbe8d41340436a90ef8b1219a3cbb127", size = 223219, upload-time = "2026-06-30T07:15:12.476Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a2/145afacf796e4506062825941176ad9445c2dcf2b3b6a1f13d3030a15e19/rpds_py-2026.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:168c733a7112e071bb7a66460e667edfcff06c017a3c523f7a8a8e08d0140804", size = 219137, upload-time = "2026-06-30T07:15:13.631Z" }, + { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, + { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, + { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, + { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, + { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, + { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, + { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, + { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, + { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, + { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, + { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, + { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, + { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, + { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, + { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/08/ae/f23a2697e6ee6340a578b0f136be6483657bef0c6f9497b752bb5c0964bb/rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13", size = 344726, upload-time = "2026-06-30T07:16:44.5Z" }, + { url = "https://files.pythonhosted.org/packages/c3/63/e7b3a1a5358dd32c930a1062d8e15b67fd6e8922e81df9e91706d66ee5c8/rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05", size = 339587, upload-time = "2026-06-30T07:16:46.255Z" }, + { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, + { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, + { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, + { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, + { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, + { url = "https://files.pythonhosted.org/packages/29/71/4d8fcf700931815594bce892255bbd973b94efaf0fc1932b0590df18d886/rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369", size = 202864, upload-time = "2026-06-30T07:17:05.746Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/b577562de0edbb55b2be85ce5fd09c33e386b9b13eee09833af4240fd5c4/rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146", size = 220430, upload-time = "2026-06-30T07:17:07.471Z" }, + { url = "https://files.pythonhosted.org/packages/c8/95/d6d0b2509825141eef60669a5739eec88dbc6a48053d6c92993a5704defe/rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e", size = 215877, upload-time = "2026-06-30T07:17:09.008Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bf/f3ea278f0afd615c1d0f19cb69043a41526e2bb600c2b536eb192218eb27/rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b", size = 346933, upload-time = "2026-06-30T07:17:10.762Z" }, + { url = "https://files.pythonhosted.org/packages/9d/29/9907bdf1c5346763cf10b7f6852aad86652168c259def904cbe0082c5864/rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690", size = 340274, upload-time = "2026-06-30T07:17:12.266Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, + { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, + { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, + { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, + { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/ba/76/65002b08596c389105720a8c0d22298b8dc25a4baf89b2ce431343c8b1de/rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577", size = 201204, upload-time = "2026-06-30T07:17:30.193Z" }, + { url = "https://files.pythonhosted.org/packages/8c/97/d855d6b3c322d1f27e26f5241c42016b56cf01377ea8ed348285f54652f0/rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324", size = 220719, upload-time = "2026-06-30T07:17:31.788Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9c/f0d19ac587fd0e4ab6b72cda355e9c5a6166b01ef7e064e437aef8eb9fef/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4cf2d36a2357e4d07bb5a4f98801265327b48256867816cfd2ceb001e9754a8f", size = 349791, upload-time = "2026-06-30T07:17:33.315Z" }, + { url = "https://files.pythonhosted.org/packages/38/c7/1d49d204c9fd2ee6c537601dc4c1ba921e03363ca576bfab94a00254ac9a/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30c6dc199b24a5e3e81d50da0f00858c5bbdb2617a750395687f4339c5818171", size = 352842, upload-time = "2026-06-30T07:17:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e5/c0b5dc93cd0d4c06ce1f438907649514e2ea077bcd911e3154a51e96c38e/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9891e594296ab9dada6551c8e7b387b2721f27a67eecd528412e8906247a7b90", size = 382094, upload-time = "2026-06-30T07:17:36.514Z" }, + { url = "https://files.pythonhosted.org/packages/0d/54/ec0e907b4ca8d541112db352409bd15f871c9b243e0c92c9b5a46ae96f01/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5c2dc92304aa48a4a60443b548bb12f12e119d4b72f314015e67b9e1be97fca", size = 388662, upload-time = "2026-06-30T07:17:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f4/921c22a4fd0f1c1ac13a3996ffbf0aa67951e2c8ad0d1d9574938a2932e8/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:127e08c0642d880cf32ca47ec2a4a77b901f7e2dd1ad9762adb13955d72ffcc9", size = 504896, upload-time = "2026-06-30T07:17:39.689Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1b/a114b972cefa1ab1cdb3c7bb177cd3844a12826c507c722d3a73516dbbaf/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bb68f03f395eb793220b45c097bd4d8c32944393da0fad8b999efac0868fc8c", size = 391545, upload-time = "2026-06-30T07:17:41.336Z" }, + { url = "https://files.pythonhosted.org/packages/4e/98/af9b3db77d47fcbe6c8c1f36e2c2147ec70292819e99c325f871584a1c11/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3450b693fde92133e9f51060568a4c31fcca76d5e53bbd611e689ca446517e9", size = 380059, upload-time = "2026-06-30T07:17:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ba/0efd8668b97c1d26a61566386c636a7a7a09829e474fdf807caa15a2c844/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:5e8d07bddee435a2ff6f1920e18feff28d0bc4533e42f4bf6927fbd073312c41", size = 393235, upload-time = "2026-06-30T07:17:44.637Z" }, + { url = "https://files.pythonhosted.org/packages/62/90/8c139ee9690f73b0829f32647de6f40d826f8f443af6fa72644f96351aac/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a83ae6c67b7676b9878378547ca8e93ed77a580037bcbcd1d32f739e1e6089c", size = 413008, upload-time = "2026-06-30T07:17:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/0043896fdd7828ce09a1d9a8b06433714d0960fc4ff3fc4aa72b666b764e/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2bfd04c19ddbd6640de0b51894d764bd2758854d5b75bd102d2ef10cb9c293a9", size = 558118, upload-time = "2026-06-30T07:17:47.759Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/02355f0e134f783a8f9814c4680a1bd311d37671577a5964ea838573ff37/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ca6546b66be9dc4738b1b043d5ebd5488c66c578c5ff0fd0e8065313fe3afb76", size = 623138, upload-time = "2026-06-30T07:17:49.355Z" }, + { url = "https://files.pythonhosted.org/packages/10/85/48f0abdcef5cce4e034c7a5b0ceeceba0b01bf0d942824f4bb720afe2dec/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8e65860d238379ed982fd9ba690579b5e95af2f4840f99c772816dbe573cb826", size = 586486, upload-time = "2026-06-30T07:17:51.141Z" }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.15' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/2b/7a1f1ebcd6b3f14febdc003e658778d81e76b40df2267904ee6b13f0c5c6/ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c", size = 149602, upload-time = "2025-12-17T20:02:55.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d", size = 121594, upload-time = "2025-12-17T20:02:07.657Z" }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/97/60fda20e2fb54b83a61ae14648b0817c8f5d84a3821e40bfbdae1437026a/ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600", size = 225794, upload-time = "2025-11-16T16:12:59.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/5a/4ab767cd42dcd65b83c323e1620d7c01ee60a52f4032fb7b61501f45f5c2/ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03", size = 147454, upload-time = "2025-11-16T16:13:02.54Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/184173ac1e74fd35d308108bcbf83904d6ef8439c70763189225a166b238/ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77", size = 132467, upload-time = "2025-11-16T16:13:03.539Z" }, + { url = "https://files.pythonhosted.org/packages/49/1b/2d2077a25fe682ae335007ca831aff42e3cbc93c14066675cf87a6c7fc3e/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4be366220090d7c3424ac2b71c90d1044ea34fca8c0b88f250064fd06087e614", size = 693454, upload-time = "2025-11-16T20:22:41.083Z" }, + { url = "https://files.pythonhosted.org/packages/90/16/e708059c4c429ad2e33be65507fc1730641e5f239fb2964efc1ba6edea94/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f66f600833af58bea694d5892453f2270695b92200280ee8c625ec5a477eed3", size = 700345, upload-time = "2025-11-16T16:13:04.771Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/0e8ef51df1f0950300541222e3332f20707a9c210b98f981422937d1278c/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da3d6adadcf55a93c214d23941aef4abfd45652110aed6580e814152f385b862", size = 731306, upload-time = "2025-11-16T16:13:06.312Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f4/2cdb54b142987ddfbd01fc45ac6bd882695fbcedb9d8bbf796adc3fc3746/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9fde97ecb7bb9c41261c2ce0da10323e9227555c674989f8d9eb7572fc2098d", size = 692415, upload-time = "2025-11-16T16:13:07.465Z" }, + { url = "https://files.pythonhosted.org/packages/a0/07/40b5fc701cce8240a3e2d26488985d3bbdc446e9fe397c135528d412fea6/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:05c70f7f86be6f7bee53794d80050a28ae7e13e4a0087c1839dcdefd68eb36b6", size = 705007, upload-time = "2025-11-16T20:22:42.856Z" }, + { url = "https://files.pythonhosted.org/packages/82/19/309258a1df6192fb4a77ffa8eae3e8150e8d0ffa56c1b6fa92e450ba2740/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f1d38cbe622039d111b69e9ca945e7e3efebb30ba998867908773183357f3ed", size = 723974, upload-time = "2025-11-16T16:13:08.72Z" }, + { url = "https://files.pythonhosted.org/packages/67/3a/d6ee8263b521bfceb5cd2faeb904a15936480f2bb01c7ff74a14ec058ca4/ruamel_yaml_clib-0.2.15-cp310-cp310-win32.whl", hash = "sha256:fe239bdfdae2302e93bd6e8264bd9b71290218fff7084a9db250b55caaccf43f", size = 102836, upload-time = "2025-11-16T16:13:10.27Z" }, + { url = "https://files.pythonhosted.org/packages/ed/03/92aeb5c69018387abc49a8bb4f83b54a0471d9ef48e403b24bac68f01381/ruamel_yaml_clib-0.2.15-cp310-cp310-win_amd64.whl", hash = "sha256:468858e5cbde0198337e6a2a78eda8c3fb148bdf4c6498eaf4bc9ba3f8e780bd", size = 121917, upload-time = "2025-11-16T16:13:12.145Z" }, + { url = "https://files.pythonhosted.org/packages/2c/80/8ce7b9af532aa94dd83360f01ce4716264db73de6bc8efd22c32341f6658/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd", size = 147998, upload-time = "2025-11-16T16:13:13.241Z" }, + { url = "https://files.pythonhosted.org/packages/53/09/de9d3f6b6701ced5f276d082ad0f980edf08ca67114523d1b9264cd5e2e0/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137", size = 132743, upload-time = "2025-11-16T16:13:14.265Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f7/73a9b517571e214fe5c246698ff3ed232f1ef863c8ae1667486625ec688a/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401", size = 731459, upload-time = "2025-11-16T20:22:44.338Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a2/0dc0013169800f1c331a6f55b1282c1f4492a6d32660a0cf7b89e6684919/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262", size = 749289, upload-time = "2025-11-16T16:13:15.633Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/3fb20a1a96b8dc645d88c4072df481fe06e0289e4d528ebbdcc044ebc8b3/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f", size = 777630, upload-time = "2025-11-16T16:13:16.898Z" }, + { url = "https://files.pythonhosted.org/packages/60/50/6842f4628bc98b7aa4733ab2378346e1441e150935ad3b9f3c3c429d9408/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d", size = 744368, upload-time = "2025-11-16T16:13:18.117Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b0/128ae8e19a7d794c2e36130a72b3bb650ce1dd13fb7def6cf10656437dcf/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922", size = 745233, upload-time = "2025-11-16T20:22:45.833Z" }, + { url = "https://files.pythonhosted.org/packages/75/05/91130633602d6ba7ce3e07f8fc865b40d2a09efd4751c740df89eed5caf9/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490", size = 770963, upload-time = "2025-11-16T16:13:19.344Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4b/fd4542e7f33d7d1bc64cc9ac9ba574ce8cf145569d21f5f20133336cdc8c/ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c", size = 102640, upload-time = "2025-11-16T16:13:20.498Z" }, + { url = "https://files.pythonhosted.org/packages/bb/eb/00ff6032c19c7537371e3119287999570867a0eafb0154fccc80e74bf57a/ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e", size = 121996, upload-time = "2025-11-16T16:13:21.855Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/5fde11a0722d676e469d3d6f78c6a17591b9c7e0072ca359801c4bd17eee/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff", size = 149088, upload-time = "2025-11-16T16:13:22.836Z" }, + { url = "https://files.pythonhosted.org/packages/85/82/4d08ac65ecf0ef3b046421985e66301a242804eb9a62c93ca3437dc94ee0/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2", size = 134553, upload-time = "2025-11-16T16:13:24.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cb/22366d68b280e281a932403b76da7a988108287adff2bfa5ce881200107a/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1", size = 737468, upload-time = "2025-11-16T20:22:47.335Z" }, + { url = "https://files.pythonhosted.org/packages/71/73/81230babf8c9e33770d43ed9056f603f6f5f9665aea4177a2c30ae48e3f3/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60", size = 753349, upload-time = "2025-11-16T16:13:26.269Z" }, + { url = "https://files.pythonhosted.org/packages/61/62/150c841f24cda9e30f588ef396ed83f64cfdc13b92d2f925bb96df337ba9/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9", size = 788211, upload-time = "2025-11-16T16:13:27.441Z" }, + { url = "https://files.pythonhosted.org/packages/30/93/e79bd9cbecc3267499d9ead919bd61f7ddf55d793fb5ef2b1d7d92444f35/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642", size = 743203, upload-time = "2025-11-16T16:13:28.671Z" }, + { url = "https://files.pythonhosted.org/packages/8d/06/1eb640065c3a27ce92d76157f8efddb184bd484ed2639b712396a20d6dce/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690", size = 747292, upload-time = "2025-11-16T20:22:48.584Z" }, + { url = "https://files.pythonhosted.org/packages/a5/21/ee353e882350beab65fcc47a91b6bdc512cace4358ee327af2962892ff16/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a", size = 771624, upload-time = "2025-11-16T16:13:29.853Z" }, + { url = "https://files.pythonhosted.org/packages/57/34/cc1b94057aa867c963ecf9ea92ac59198ec2ee3a8d22a126af0b4d4be712/ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144", size = 100342, upload-time = "2025-11-16T16:13:31.067Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e5/8925a4208f131b218f9a7e459c0d6fcac8324ae35da269cb437894576366/ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc", size = 119013, upload-time = "2025-11-16T16:13:32.164Z" }, + { url = "https://files.pythonhosted.org/packages/17/5e/2f970ce4c573dc30c2f95825f2691c96d55560268ddc67603dc6ea2dd08e/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb", size = 147450, upload-time = "2025-11-16T16:13:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471", size = 133139, upload-time = "2025-11-16T16:13:34.587Z" }, + { url = "https://files.pythonhosted.org/packages/dc/19/40d676802390f85784235a05788fd28940923382e3f8b943d25febbb98b7/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25", size = 731474, upload-time = "2025-11-16T20:22:49.934Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a", size = 748047, upload-time = "2025-11-16T16:13:35.633Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf", size = 782129, upload-time = "2025-11-16T16:13:36.781Z" }, + { url = "https://files.pythonhosted.org/packages/de/4b/e98086e88f76c00c88a6bcf15eae27a1454f661a9eb72b111e6bbb69024d/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d", size = 736848, upload-time = "2025-11-16T16:13:37.952Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/5964fcd1fd9acc53b7a3a5d9a05ea4f95ead9495d980003a557deb9769c7/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf", size = 741630, upload-time = "2025-11-16T20:22:51.718Z" }, + { url = "https://files.pythonhosted.org/packages/07/1e/99660f5a30fceb58494598e7d15df883a07292346ef5696f0c0ae5dee8c6/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51", size = 766619, upload-time = "2025-11-16T16:13:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/fa0344a9327b58b54970e56a27b32416ffbcfe4dcc0700605516708579b2/ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec", size = 100171, upload-time = "2025-11-16T16:13:40.456Z" }, + { url = "https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6", size = 118845, upload-time = "2025-11-16T16:13:41.481Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bd/ab8459c8bb759c14a146990bf07f632c1cbec0910d4853feeee4be2ab8bb/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef", size = 147248, upload-time = "2025-11-16T16:13:42.872Z" }, + { url = "https://files.pythonhosted.org/packages/69/f2/c4cec0a30f1955510fde498aac451d2e52b24afdbcb00204d3a951b772c3/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf", size = 133764, upload-time = "2025-11-16T16:13:43.932Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/2480d062281385a2ea4f7cc9476712446e0c548cd74090bff92b4b49e898/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000", size = 730537, upload-time = "2025-11-16T20:22:52.918Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/e365ee305367559f57ba6179d836ecc3d31c7d3fdff2a40ebf6c32823a1f/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4", size = 746944, upload-time = "2025-11-16T16:13:45.338Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/8b56b08db91e569d0a4fbfa3e492ed2026081bdd7e892f63ba1c88a2f548/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c", size = 778249, upload-time = "2025-11-16T16:13:46.871Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1d/70dbda370bd0e1a92942754c873bd28f513da6198127d1736fa98bb2a16f/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043", size = 737140, upload-time = "2025-11-16T16:13:48.349Z" }, + { url = "https://files.pythonhosted.org/packages/5b/87/822d95874216922e1120afb9d3fafa795a18fdd0c444f5c4c382f6dac761/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524", size = 741070, upload-time = "2025-11-16T20:22:54.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/17/4e01a602693b572149f92c983c1f25bd608df02c3f5cf50fd1f94e124a59/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e", size = 765882, upload-time = "2025-11-16T16:13:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/17/7999399081d39ebb79e807314de6b611e1d1374458924eb2a489c01fc5ad/ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa", size = 102567, upload-time = "2025-11-16T16:13:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/67/be582a7370fdc9e6846c5be4888a530dcadd055eef5b932e0e85c33c7d73/ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467", size = 122847, upload-time = "2025-11-16T16:13:51.807Z" }, +] + +[[package]] +name = "s3transfer" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/da/4bef7ce7bb989b222aa4785a413896dbec53306dfc59c6ce7d16a7ffbd6a/s3transfer-0.19.1.tar.gz", hash = "sha256:d3d6371dc3f1e5c5427b2b457bcf13bcf87bec334c95aed18642eae61f6926f3", size = 165354, upload-time = "2026-07-10T19:32:04.849Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/23/e84c64ad0e8bc59cd1b2ef98def848deff0ef3456c542afe74d51e9e8c85/s3transfer-0.19.1-py3-none-any.whl", hash = "sha256:d5fd7005ee39307455ad5f310b5ea67f4b1960d7fed5b3671ee50c249de675de", size = 90072, upload-time = "2026-07-10T19:32:03.673Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sqlglot" +version = "30.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/ed/a6c45aec29353b6392ea34548c40af3ac6ffd6bc5572cf23b2ce250876fc/sqlglot-30.12.0.tar.gz", hash = "sha256:6b8369704662d4f654bc934cea4dd31c916c2a571b389210cb9e951a275e5fd9", size = 5905110, upload-time = "2026-06-26T14:09:40.408Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/9e/82a390ecc85f066ff80affa01d195f744e3de60ad4d695b8de31c9a66da3/sqlglot-30.12.0-py3-none-any.whl", hash = "sha256:86cccc610073c645c03e72b55b60ae0518aa3253a7fc3bd56551370d003c6554", size = 707583, upload-time = "2026-06-26T14:09:38.525Z" }, +] + +[[package]] +name = "tqdm" +version = "4.68.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/5f/57ff8b434839e70dab45601284ea413e947a63799891b7553e5960a793a8/tqdm-4.68.4.tar.gz", hash = "sha256:19829c9673638f2a0b8617da4cdcb927e831cd88bcfcb6e78d42a4d1af131520", size = 792418, upload-time = "2026-07-07T09:58:18.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/2a/5e5e750890ada51017d18d0d4c30da696e5b5bd3180947729927628fc3cb/tqdm-4.68.4-py3-none-any.whl", hash = "sha256:5168118b2368f48c561afda8020fd79195b1bdb0bdf8086b88442c267a315dc2", size = 676612, upload-time = "2026-07-07T09:58:16.256Z" }, +] + +[[package]] +name = "tree-sitter" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/03/5600b84aff2e6c4fe80cfebb4063fe2f50299521befe5f6092ab8c082f4a/tree_sitter-0.26.0.tar.gz", hash = "sha256:b40c219edccc4564530c96f8f1556f6202b37cda964d1cbd7bd2b7e68b40a245", size = 191423, upload-time = "2026-06-30T12:14:27.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/2f/201c33ea65875d8e4ec73e4d1949718ec49780d84c0adf19793ef75d99a2/tree_sitter-0.26.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff527388df14cb5009f9274faf78cc69a7393ae6acf3b04784b8acca249519c5", size = 148676, upload-time = "2026-06-30T12:13:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/9e/db/05b9d45dd2b9827bf91b6819e749227ca6d686d58658292c0f149294b18e/tree_sitter-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7bcbadfa614326debef581957d5c780a9d7f66065c13deea61aa21d1dd36263f", size = 140757, upload-time = "2026-06-30T12:13:44.007Z" }, + { url = "https://files.pythonhosted.org/packages/b9/08/1e1da65c1585b8d70130b26d65b41a71737ab623c1fab1008479c2b95b50/tree_sitter-0.26.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f941cea06128c1f74f8937a8e2a90c7db49cf4be6647cd9e07d92a306d91517", size = 631526, upload-time = "2026-06-30T12:13:45.008Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b7/06353044a80ee58a71e884b4a9b2913705849d81025d87308abdfef8f883/tree_sitter-0.26.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e9e46b664887d8c1014f1fb33e09454bbdd9ec1fe29b7fd02dde7b46bc1bb81a", size = 658688, upload-time = "2026-06-30T12:13:46.491Z" }, + { url = "https://files.pythonhosted.org/packages/df/56/c4b22ccbc4f89ae507c0b76e29f363ad4f16eb38c43f7392b3eb9afec64e/tree_sitter-0.26.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:763627db05db34f12333081bd7422cc1c675893d373cc870b3e9249e200700e4", size = 644399, upload-time = "2026-06-30T12:13:47.719Z" }, + { url = "https://files.pythonhosted.org/packages/b5/b7/6b3f0192d5b9b49a199cb0dcd5e45dd1327a82c52c80a49edd790e3a2d9b/tree_sitter-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:17a1c5cfd3a05d5c7c86bf4282b6ef8092c91dc0a98390499669c3fedb7d1814", size = 655316, upload-time = "2026-06-30T12:13:49.03Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6b/f7475c8f8d699671c2a80c3ed16f5cddd161280c6ed5b845117179c66075/tree_sitter-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:f289be0225ba2ace8e87d6c9639b2bc9ff2b5271afb7c5d39282a4a00e248682", size = 129494, upload-time = "2026-06-30T12:13:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/f6/20/0df8dd708638cba7ef875fff4ce80122af7f604f1f0b566de2164108bc01/tree_sitter-0.26.0-cp310-cp310-win_arm64.whl", hash = "sha256:526a165a2cb1d1f79e247d400f0e0acd8d49a817d6f312d543513af200b1f886", size = 116486, upload-time = "2026-06-30T12:13:51.21Z" }, + { url = "https://files.pythonhosted.org/packages/41/18/78aae7e4b5a36daaebb0276e4b07d084d45298758000787838e89329e11f/tree_sitter-0.26.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1d6fe0e8fb4df77b5ee816228e2c4475a63d8cc1d4d3a7ffd7097b2b87fc3e95", size = 148679, upload-time = "2026-06-30T12:13:52.27Z" }, + { url = "https://files.pythonhosted.org/packages/24/e4/b371b9553b0e47d130fc2073e56cab94fecc868be04666bf5bbd1fcd1cc9/tree_sitter-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:514a9bf8993e5210e7970736aaf6020d1759b670e195ef17b1c48f586aa30736", size = 140759, upload-time = "2026-06-30T12:13:53.221Z" }, + { url = "https://files.pythonhosted.org/packages/22/7d/266fb0f2c41e6fb00b0f40e7a3338cdf99651e6a6511ca72bc78fc697636/tree_sitter-0.26.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10f0d4eb94aa7242dcb7f554bcd24dd7ba1c114f00d58759ba08c7a46c8ec51a", size = 637206, upload-time = "2026-06-30T12:13:54.334Z" }, + { url = "https://files.pythonhosted.org/packages/40/9f/47cf22febb47132d5b3a507a27bb99ef89fe5c8ec420a13c6daa9b64f782/tree_sitter-0.26.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:335294ce0504fcefde5245dff596778ffaf820205b98ae0b549c72e48855f1d8", size = 664758, upload-time = "2026-06-30T12:13:55.42Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4d/8d144ca3beb46a62a5102b6deac76bb0da55235c2c7840faf3b12f2e9d97/tree_sitter-0.26.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9997ba61368c48ed54e715676afadf703947a1542464e39d047764fb3624b01", size = 647438, upload-time = "2026-06-30T12:13:56.523Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ed/ed1d6e78520c4fb64ed52fec3f2947bf8c1fbad7bc24e282c56193c9ba42/tree_sitter-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c56581ad256c4195a21bfe449fed5d44a02fe83a4a7d6e70e6ec302c881191c7", size = 661944, upload-time = "2026-06-30T12:13:57.82Z" }, + { url = "https://files.pythonhosted.org/packages/10/83/45f5bd43db1b8248d2fd08ef6cbe43e2725c539e09a2cfb8bc2818646788/tree_sitter-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f8793fd18ad7eec276ed4b51c097b4bf2002b357259b66b0d75db1f3f41c754", size = 129496, upload-time = "2026-06-30T12:13:59.216Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8d/be68e6c04563eb54145424cc83fe0aa8b0ba6c90d8989cf8a032671b5f16/tree_sitter-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:dea4b4e27d49e9ec5b785d4f994da000e6726882fcc6ad05ec98478500c71aef", size = 116484, upload-time = "2026-06-30T12:14:00.147Z" }, + { url = "https://files.pythonhosted.org/packages/87/ca/565702c44815393e3a973552ad546db4e5ca081ca8698640b4e93d809f51/tree_sitter-0.26.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6cb2bd20efb2544c19ac54486ab7cb8ec7b36f913bbe1ce95df84acb96743d9c", size = 148934, upload-time = "2026-06-30T12:14:01.188Z" }, + { url = "https://files.pythonhosted.org/packages/54/6f/8bb61957f16ec1b1d92410a006cdc84a952b6352a7313b2ad299f2d21484/tree_sitter-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:918d89529786873f0982a0f59c2a303cd065fbfd1b903d71a8e4e1584f67b42e", size = 140820, upload-time = "2026-06-30T12:14:02.087Z" }, + { url = "https://files.pythonhosted.org/packages/78/0a/8a6f08559182643a814a4ab559948ae817b2851890fd9b995a4fff6541ce/tree_sitter-0.26.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30a88be89ff1f2755297f81e8080d88b795dd98720c3f9fa2acf93873182cc95", size = 638844, upload-time = "2026-06-30T12:14:03.428Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2f/6e6781b31677231366cb3cf27bc8269157f6d4b03c9032865a4f5f2bbe7e/tree_sitter-0.26.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a6b333b0282d8bb0af741f9b018bd2523d4eecb2686bf6717066a625fecfaa4", size = 667487, upload-time = "2026-06-30T12:14:04.669Z" }, + { url = "https://files.pythonhosted.org/packages/02/0b/0483078c8567445557a7015b0e5b187f6d7d4fda73464df9c4bdea7f7f3c/tree_sitter-0.26.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f3c44339dd34fe8eb2b8d5aa7610660499a795f70376b130bbee7a437337280", size = 647975, upload-time = "2026-06-30T12:14:05.797Z" }, + { url = "https://files.pythonhosted.org/packages/27/68/da83ca72c984e96ab4eb3bee0db1a6ffb5de1c8c455f92bd9f420cde7f0e/tree_sitter-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94550e13b6ae576969da40246f4c4abb206380b5375ad43f26dd9151d55438e3", size = 665018, upload-time = "2026-06-30T12:14:07.278Z" }, + { url = "https://files.pythonhosted.org/packages/d1/36/4d67927fd47b89af4a00f65f55a7370e28778cd50e972c2430487e3ecc27/tree_sitter-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca89e361a276dbc934b28a43dd881199e25d34ff5493ee0ce45f3c52a6124a37", size = 129619, upload-time = "2026-06-30T12:14:08.373Z" }, + { url = "https://files.pythonhosted.org/packages/ed/72/cdefad523eb78710679c6da6a79e3d90f5afd32b1c6aa5a17bac7eef99f6/tree_sitter-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:bc6cb01d5ee75c85424aa1f1c72a82d8f07fd52539a0f3c4a6ed3e8721079b84", size = 116545, upload-time = "2026-06-30T12:14:09.273Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/465257cf8f972ad9f9812ec1cbaa8ec210ebebb601ade9a15881aa2436b4/tree_sitter-0.26.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed0889dbed843ce45ede9f5169c0b2dea2222f12685844a03fadb81f12705867", size = 148893, upload-time = "2026-06-30T12:14:10.541Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ec/19d093e854b45e807fecfdd26105c266f43aeecc39c4dc97992a7074ad5a/tree_sitter-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6189c6c340c7384357711e3d92645e96bfb79f7a502f86de1ebdb23eb43f7dab", size = 140829, upload-time = "2026-06-30T12:14:11.626Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ee/87e74671ed63a837e7a1f17ab94aa3913871e033b27523d8e7b83d6f7ad0/tree_sitter-0.26.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ff2e0750b7daa722302838356d7b65e303829b7eb73c915df127ddba115e1d1", size = 639334, upload-time = "2026-06-30T12:14:12.836Z" }, + { url = "https://files.pythonhosted.org/packages/66/e7/f7e04cd9dff6b6ac0adf23922796fbc76accd4cf4bcda50542748d485679/tree_sitter-0.26.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7075ef857ef86f327dbb72d1e2574dda78db5754b3a1fca6506acd7fe5d561a7", size = 668102, upload-time = "2026-06-30T12:14:14.035Z" }, + { url = "https://files.pythonhosted.org/packages/d3/90/0bfb16b7894fea728c774a89d5af421a9368a2f913bbd4e8dcab7caaecfb/tree_sitter-0.26.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:26c996c1edfee86e977bb3f5462e74fcec0d0b0db1e85a3c475875763caa03be", size = 648560, upload-time = "2026-06-30T12:14:15.302Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e6/0fe05ba396e9623b0ae40ccf34171336b8701ec8d7bd0ee9f5224d638665/tree_sitter-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00289bfe7978f3e0dc0ce69813a20fa9f44ea4c100b3ec62043e5eb74ccfc3a2", size = 665121, upload-time = "2026-06-30T12:14:16.403Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/a944b1ca35bed6068dc84a9967aaf3049d8cc0b7a36179eea8787270a6ab/tree_sitter-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:93e220cab7e6a823efeb2046c49171427de92ef71c7c681c01820d14d8d3721f", size = 129615, upload-time = "2026-06-30T12:14:17.463Z" }, + { url = "https://files.pythonhosted.org/packages/09/ef/c7ca48293580d2249f36940c4eed5b4ddeb9ce75baf9a4ef30621987e0c7/tree_sitter-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:b31a8195d2f224224c530ac814632d98c1dcc123d227442c07c736e86b70d564", size = 116525, upload-time = "2026-06-30T12:14:18.53Z" }, + { url = "https://files.pythonhosted.org/packages/c5/7a/4d84e6f6ae2c3e757490dd84de251712c31e293dfe31f28da1ec019cefa2/tree_sitter-0.26.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5a3c93a352b7e6f70f73e121bbfa2d0117ba7478bd51114ed35c91b0b78814fa", size = 148901, upload-time = "2026-06-30T12:14:19.452Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d9/efe62ec65dc9d096e834d27b8c058127e2146e42ff3380b822a233f016a6/tree_sitter-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5fc2f41bf246ff2f70a9cc3690be35ec7580a4923151873d898c8bcb1a4503d3", size = 140805, upload-time = "2026-06-30T12:14:20.478Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2c/c82326b7b97e3c485c18679883b16f89e5e913c639d3b219d3da70c9e67e/tree_sitter-0.26.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8ea92a255c91671a7ec4625aba3ab7bb5220c423630ffbf83c45d7312abe084", size = 640586, upload-time = "2026-06-30T12:14:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7a/f56e7d8282859452611024c7cbc623bfba5b24b8cb9b8f8bc88c5219fe9a/tree_sitter-0.26.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f665510f0fcf4636fb9696f1f7853bed7a3bd764b7bb0cb8494e619c14ed5a0c", size = 668300, upload-time = "2026-06-30T12:14:22.728Z" }, + { url = "https://files.pythonhosted.org/packages/91/51/240ee81b9d5e9ca0a6cb1528e8605ffa70ab58c89ce126631be96d3e4bae/tree_sitter-0.26.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:253df7ab82cc0a9d311cd65f06e9f99fb3eac55996ae9fc94da22f123a861b90", size = 649627, upload-time = "2026-06-30T12:14:23.819Z" }, + { url = "https://files.pythonhosted.org/packages/6a/54/760035cefedf9eb44f0f84c4ac22f1322e73155853e272576ee876336312/tree_sitter-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ff80d4833d330a73184a3ac5132abe93c575d2dea31975c6f15c0d21fef238aa", size = 664885, upload-time = "2026-06-30T12:14:25.064Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1b/0b36fe2a984ecedc4ce6aefd5d56447a6626a8e9b595c4e48658510ce8f8/tree_sitter-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:a4033fecc8f606c7f2e8b8014d0057b74668a7f0152763606f7bc25c5f9ec64c", size = 132688, upload-time = "2026-06-30T12:14:26.106Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/ebc041a13fbf40144afdb0d4b447e48e0b4012ca866c63de8b48f801f0c1/tree_sitter-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:823251c4b6725a7c03ed497a339135ede7ae4bdde75bb8be7ef5e305aeb4ff52", size = 120287, upload-time = "2026-06-30T12:14:26.991Z" }, +] + +[[package]] +name = "tree-sitter-language-pack" +version = "1.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tree-sitter" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/d0/06624b30acf3100ed663d604ac893882beafde603971e76f1160808ae02c/tree_sitter_language_pack-1.12.5.tar.gz", hash = "sha256:e6ca8fd7f1cc24496f2fff73156d0ce20284ce56e18a84f4c0c10388a1e4c951", size = 81955, upload-time = "2026-07-07T12:58:02.012Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/b9/015240f1e091f0d7608582e2930b62580839f4b3e94b5813bc1894017cf3/tree_sitter_language_pack-1.12.5-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c3613f26f1660d757626b50e2f7fd50ce269193ec9e8e0ad699ae47bf03fd664", size = 2140086, upload-time = "2026-07-07T12:57:53.574Z" }, + { url = "https://files.pythonhosted.org/packages/08/fd/8ca53b11ea1058c920944b52b41c4c4d96ccf67c62b15174f6d3d2a0126f/tree_sitter_language_pack-1.12.5-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:30010156a06179e7c179ae51ba6f2da148bd0bc364f750bcc5ef81ab1c4e0c53", size = 2031270, upload-time = "2026-07-07T12:57:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/03/e1/af79d0d302f1f47f190fd1f09146a6e5f88a32a7c0d0759820d7ca9aafc3/tree_sitter_language_pack-1.12.5-cp310-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:1609b9cc2518e4657f6ef80a8ac533a8f5a04d4a74135d744fb171eca434e6eb", size = 2189197, upload-time = "2026-07-07T12:57:56.37Z" }, + { url = "https://files.pythonhosted.org/packages/25/da/6e3db4ad85802747ead34f46f402508d796cd11be65b79d6ba6d76281a3f/tree_sitter_language_pack-1.12.5-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:de5ec0c1b184176443fc6093f07fe5a1c403ee51ec8593bde372bd5960819941", size = 2299397, upload-time = "2026-07-07T12:57:58.087Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/ac271b8013ff4f386ddce86cab080b8c6352d3efa45e8b2285d246eed318/tree_sitter_language_pack-1.12.5-cp310-abi3-win_amd64.whl", hash = "sha256:eb58ecee144247d8cde52a567bbe5c6f950ed1d2c416295e00f0e31389f1751e", size = 2073479, upload-time = "2026-07-07T12:57:59.491Z" }, + { url = "https://files.pythonhosted.org/packages/79/80/fbe56f84daec7fec163023f6e8865969e8873ec42b85241c750953320e1f/tree_sitter_language_pack-1.12.5-cp310-abi3-win_arm64.whl", hash = "sha256:41399bdd45eb4ced5840ddf1d44aa02fe69763c867bd7286aa20d182bfe397af", size = 1984602, upload-time = "2026-07-07T12:58:00.918Z" }, +] + +[[package]] +name = "truststore" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, +] + +[[package]] +name = "typer" +version = "0.26.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/f7/68adc395201b20b872d68e975386832e8005ffeacedd43a1d837a32815be/typer-0.26.8.tar.gz", hash = "sha256:c244a6bd558886fe3f8780efb6bdd28bb9aff005a94eedebaa5cb32926fe2f7e", size = 202097, upload-time = "2026-06-26T09:22:45.705Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/87/b9fd69c92c6102a066e1b86a35243f53e70bd4c709f2a26d9f4fee4f4dc0/typer-0.26.8-py3-none-any.whl", hash = "sha256:3512ca79ac5c11113414b36e80281b872884477722440691c89d1112e321a49c", size = 122564, upload-time = "2026-06-26T09:22:44.72Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[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 = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "zipp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, +] From a86cfb0a4f1713513805fc75633fe88af4b29d53 Mon Sep 17 00:00:00 2001 From: citarf <8773429+citarf@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:28:26 +0200 Subject: [PATCH 31/31] fix(contracts): serveur des 7 contrats gold conforme ODCS v3 (s3 + format iceberg) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `type: iceberg` n'existe pas dans l'énumération des types de serveur ODCS v3 : les 7 contrats gold faisaient échouer le job « Lint des contrats ODCS » de la CI (datacontract-cli 1.0.16). Le support réel est un bucket S3 dont le format de table est Iceberg — c'est exactement ce qu'ODCS exprime par `type: s3` + `format: iceberg`. Aucun changement de cible : `location` est inchangée. --- contracts/gold-canicule.odcs.yaml | 3 ++- contracts/gold-climato-legacy.odcs.yaml | 3 ++- contracts/gold-climato-v2.odcs.yaml | 3 ++- contracts/gold-dataclimat.odcs.yaml | 3 ++- contracts/gold-ic.odcs.yaml | 3 ++- contracts/gold-ref.odcs.yaml | 3 ++- contracts/gold-statIC.odcs.yaml | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/contracts/gold-canicule.odcs.yaml b/contracts/gold-canicule.odcs.yaml index f9730d7..c49f31e 100644 --- a/contracts/gold-canicule.odcs.yaml +++ b/contracts/gold-canicule.odcs.yaml @@ -24,9 +24,10 @@ description: tags: [gold, diffusion, schema-canonique, canicule, climatologie] servers: - server: diffusion-iceberg - type: iceberg + type: s3 environment: production location: s3://chom-ic-lake-diffusion/gold_canicule + format: iceberg schema: - name: station_insee physicalName: gold_canicule.station_insee diff --git a/contracts/gold-climato-legacy.odcs.yaml b/contracts/gold-climato-legacy.odcs.yaml index cda5e2f..65b4536 100644 --- a/contracts/gold-climato-legacy.odcs.yaml +++ b/contracts/gold-climato-legacy.odcs.yaml @@ -23,9 +23,10 @@ tags: servers: - server: diffusion-iceberg - type: iceberg + type: s3 environment: production location: s3://chom-ic-lake-diffusion/gold_legacy + format: iceberg schema: - name: mensuelle diff --git a/contracts/gold-climato-v2.odcs.yaml b/contracts/gold-climato-v2.odcs.yaml index 6c568f5..4354bd7 100644 --- a/contracts/gold-climato-v2.odcs.yaml +++ b/contracts/gold-climato-v2.odcs.yaml @@ -26,9 +26,10 @@ tags: servers: - server: diffusion-iceberg - type: iceberg + type: s3 environment: production location: s3://chom-ic-lake-diffusion/gold_v2 + format: iceberg schema: - name: journaliere diff --git a/contracts/gold-dataclimat.odcs.yaml b/contracts/gold-dataclimat.odcs.yaml index 723271d..8617db7 100644 --- a/contracts/gold-dataclimat.odcs.yaml +++ b/contracts/gold-dataclimat.odcs.yaml @@ -22,9 +22,10 @@ tags: [meteo, climatologie, meteofrance, gold, diffusion, dataclimat, dataforgoo servers: - server: diffusion-iceberg - type: iceberg + type: s3 environment: production location: s3://chom-ic-lake-diffusion/gold_dataclimat + format: iceberg schema: - name: quotidienne diff --git a/contracts/gold-ic.odcs.yaml b/contracts/gold-ic.odcs.yaml index 48d6676..f2fb41f 100644 --- a/contracts/gold-ic.odcs.yaml +++ b/contracts/gold-ic.odcs.yaml @@ -31,9 +31,10 @@ tags: servers: - server: diffusion-iceberg - type: iceberg + type: s3 environment: production location: s3://chom-ic-lake-diffusion/gold_ic + format: iceberg schema: - name: journaliere diff --git a/contracts/gold-ref.odcs.yaml b/contracts/gold-ref.odcs.yaml index eee1ecb..538fbfe 100644 --- a/contracts/gold-ref.odcs.yaml +++ b/contracts/gold-ref.odcs.yaml @@ -28,9 +28,10 @@ tags: servers: - server: diffusion-iceberg - type: iceberg + type: s3 environment: production location: s3://chom-ic-lake-diffusion/gold_ref + format: iceberg schema: - name: station diff --git a/contracts/gold-statIC.odcs.yaml b/contracts/gold-statIC.odcs.yaml index 37ff144..45b1110 100644 --- a/contracts/gold-statIC.odcs.yaml +++ b/contracts/gold-statIC.odcs.yaml @@ -35,9 +35,10 @@ tags: servers: - server: diffusion-iceberg - type: iceberg + type: s3 environment: production location: s3://chom-ic-lake-diffusion/gold_statIC + format: iceberg schema: - name: journaliere