From 595930f3c8832eba22debc7fd8bf1c1bf13369f4 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Wed, 3 Jun 2026 19:53:43 +0200 Subject: [PATCH] feat: analisis NATS pub/sub con 3 notebooks --- .claude/CLAUDE.md | 40 + .ipython/profile_default/history.sqlite | Bin 0 -> 57344 bytes .../profile_default/startup/00_fn_registry.py | 100 + .jupyter-port | 1 + .jupyter/collaboration_sessions.json | 12 + .jupyter_ystore.db | Bin 0 -> 450560 bytes .mcp.json | 12 + .python-version | 1 + README.md | 0 analysis.md | 57 + build_notebooks.py | 580 +++ jupyter.log | 110 + main.py | 6 + .../01_core_pubsub-checkpoint.ipynb | 15 + ...2_queue_request_jetstream-checkpoint.ipynb | 15 + .../03_procesos_reales-checkpoint.ipynb | 331 ++ notebooks/01_core_pubsub.ipynb | 440 +++ notebooks/02_queue_request_jetstream.ipynb | 391 ++ notebooks/03_procesos_reales.ipynb | 518 +++ notebooks/procs/publisher.py | 48 + notebooks/procs/subscriber.py | 61 + pyproject.toml | 16 + run-jupyter-lab.sh | 50 + uv.lock | 3363 +++++++++++++++++ 24 files changed, 6167 insertions(+) create mode 100644 .claude/CLAUDE.md create mode 100644 .ipython/profile_default/history.sqlite create mode 100644 .ipython/profile_default/startup/00_fn_registry.py create mode 100644 .jupyter-port create mode 100644 .jupyter/collaboration_sessions.json create mode 100644 .jupyter_ystore.db create mode 100644 .mcp.json create mode 100644 .python-version create mode 100644 README.md create mode 100644 analysis.md create mode 100644 build_notebooks.py create mode 100644 jupyter.log create mode 100644 main.py create mode 100644 notebooks/.ipynb_checkpoints/01_core_pubsub-checkpoint.ipynb create mode 100644 notebooks/.ipynb_checkpoints/02_queue_request_jetstream-checkpoint.ipynb create mode 100644 notebooks/.ipynb_checkpoints/03_procesos_reales-checkpoint.ipynb create mode 100644 notebooks/01_core_pubsub.ipynb create mode 100644 notebooks/02_queue_request_jetstream.ipynb create mode 100644 notebooks/03_procesos_reales.ipynb create mode 100644 notebooks/procs/publisher.py create mode 100644 notebooks/procs/subscriber.py create mode 100644 pyproject.toml create mode 100755 run-jupyter-lab.sh create mode 100644 uv.lock diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 100644 index 0000000..36a65c7 --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1,40 @@ +# JUPYTER HABILITADO EN ESTE ANALISIS + +## Reglas OBLIGATORIAS para Claude + +### 1. CODIGO INMUTABLE — NUNCA MODIFICAR CELDAS EXISTENTES +- **PROHIBIDO** usar NotebookEdit para reemplazar celdas existentes +- **SIEMPRE** anadir celdas NUEVAS al final del notebook +- Si hay un error en una celda, crear celda nueva con la correccion +- El historial de trabajo debe quedar intacto para trazabilidad + +### 2. PROGRAMACION FUNCIONAL OBLIGATORIA +- **Funciones puras**: sin efectos secundarios, mismo input -> mismo output +- **Inmutabilidad**: nunca mutar datos, crear copias transformadas +- **Composicion**: funciones pequenas que se combinan +- Preferir: `map`, `filter`, `reduce`, list comprehensions +- Evitar: loops con mutacion, `global`, modificar argumentos in-place + +### 3. SIEMPRE usar MCP jupyter para ejecutar codigo Python +- Las ejecuciones se ven en tiempo real en Jupyter Lab del usuario +- Compartimos variables y estado del kernel +- **NUNCA usar bash para ejecutar Python en este analisis** + +### 4. Verificar Jupyter activo ANTES de ejecutar +- Si no esta activo: pedir al usuario que ejecute `./run-jupyter-lab.sh` + +### 5. Gestion de notebooks +- Notebooks en la carpeta `notebooks/` o subcarpetas +- Si un notebook tiene >50 celdas, crear uno nuevo +- Nombrar descriptivamente: `01_exploracion.ipynb`, `02_limpieza.ipynb` + +### 6. Gestion de Python +- **SIEMPRE usar `uv`** para gestionar dependencias +- Anadir paquetes con `uv add nombre_paquete` + +### 7. Acceso al fn_registry +- `FN_REGISTRY_ROOT` apunta a la raiz del registry +- Para importar funciones Python: `sys.path.insert(0, os.path.join(os.environ["FN_REGISTRY_ROOT"], "python", "functions"))` +- Para consultar registry.db: `sqlite3` o `import sqlite3` con la ruta `$FN_REGISTRY_ROOT/registry.db` + + diff --git a/.ipython/profile_default/history.sqlite b/.ipython/profile_default/history.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..2f356a20c0fc83131293da321d3de896617f5c1a GIT binary patch literal 57344 zcmeHQOKc-YdL|`}G@?gl_OgS(a8PM2pyrxtiIRX z*-dvhHPUDW#6EZs3_S25J_mcq!3Q4#0|BxKu-NF7OMqO0AeR7(MFIo~kOV<4x#aun z(IhpRu^nR*cw8I}*gcSSL=pJY$Q6Un>-gg�hC=|Yp|Ig#U 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 O#30aG&3#R+=Kcq(SRniW literal 0 HcmV?d00001 diff --git a/.ipython/profile_default/startup/00_fn_registry.py b/.ipython/profile_default/startup/00_fn_registry.py new file mode 100644 index 0000000..af5d4d1 --- /dev/null +++ b/.ipython/profile_default/startup/00_fn_registry.py @@ -0,0 +1,100 @@ +""" +fn_registry kernel startup +Autoconfigura acceso al registry en cada notebook. +Generado por write_jupyter_registry_kernel (fn_registry). +""" +import os +import sys +import sqlite3 +from pathlib import Path + +# ── FN_REGISTRY_ROOT ──────────────────────────────────────── +# Prioridad: env var > path hardcoded > descubrimiento automatico +def _discover_registry_root(): + if os.environ.get("FN_REGISTRY_ROOT"): + return Path(os.environ["FN_REGISTRY_ROOT"]).resolve() + hardcoded = Path("/home/enmanuel/fn_registry") + if (hardcoded / "registry.db").exists(): + return hardcoded + # Subir desde CWD hasta encontrar registry.db + p = Path.cwd() + for _ in range(10): + if (p / "registry.db").exists(): + return p + if p.parent == p: + break + p = p.parent + return hardcoded + +FN_REGISTRY_ROOT = _discover_registry_root() +os.environ["FN_REGISTRY_ROOT"] = str(FN_REGISTRY_ROOT) + +# ── sys.path: importar funciones Python del registry ──────── +_python_functions = FN_REGISTRY_ROOT / "python" / "functions" +for _domain in sorted(_python_functions.iterdir()) if _python_functions.exists() else []: + if _domain.is_dir() and not _domain.name.startswith("_"): + _path = str(_domain) + if _path not in sys.path: + sys.path.insert(0, _path) + +# Tambien el directorio padre para imports por dominio: from core import filter_list +_pf = str(_python_functions) +if _pf not in sys.path: + sys.path.insert(0, _pf) + +# ── fn_query: consultar registry.db desde el notebook ─────── +_REGISTRY_DB = FN_REGISTRY_ROOT / "registry.db" + +def fn_query(sql, params=()): + """Ejecuta una consulta SQL sobre registry.db y retorna las filas. + + Ejemplos: + fn_query("SELECT id, description FROM functions WHERE domain = ?", ("finance",)) + fn_query("SELECT id FROM functions_fts WHERE functions_fts MATCH ?", ("slice*",)) + """ + if not _REGISTRY_DB.exists(): + raise FileNotFoundError(f"registry.db no encontrado en {_REGISTRY_DB}") + con = sqlite3.connect(str(_REGISTRY_DB)) + con.row_factory = sqlite3.Row + try: + rows = con.execute(sql, params).fetchall() + return [dict(r) for r in rows] + finally: + con.close() + +def fn_search(term): + """Busca funciones y tipos en el registry por nombre o descripcion. + + Ejemplo: + fn_search("slice") + fn_search("finance") + """ + fts_term = f"name:{term}* OR description:{term}*" + functions = fn_query( + "SELECT id, kind, purity, lang, description FROM functions " + "WHERE id IN (SELECT id FROM functions_fts WHERE functions_fts MATCH ?) " + "ORDER BY name", (fts_term,) + ) + types = fn_query( + "SELECT id, algebraic, lang, description FROM types " + "WHERE id IN (SELECT id FROM types_fts WHERE types_fts MATCH ?) " + "ORDER BY name", (fts_term,) + ) + return {"functions": functions, "types": types} + +def fn_code(function_id): + """Retorna el codigo fuente de una funcion del registry. + + Ejemplo: + print(fn_code("filter_list_py_core")) + """ + rows = fn_query("SELECT code FROM functions WHERE id = ?", (function_id,)) + if not rows: + raise KeyError(f"Funcion no encontrada: {function_id}") + return rows[0]["code"] + +# ── Mensaje de bienvenida ─────────────────────────────────── +print(f"fn_registry conectado: {FN_REGISTRY_ROOT}") +print(f" registry.db: {'OK' if _REGISTRY_DB.exists() else 'NO ENCONTRADO'}") +print(f" Python functions: {_pf}") +print(f" Helpers: fn_query(), fn_search(), fn_code()") diff --git a/.jupyter-port b/.jupyter-port new file mode 100644 index 0000000..b19aaf9 --- /dev/null +++ b/.jupyter-port @@ -0,0 +1 @@ +8890 diff --git a/.jupyter/collaboration_sessions.json b/.jupyter/collaboration_sessions.json new file mode 100644 index 0000000..be08011 --- /dev/null +++ b/.jupyter/collaboration_sessions.json @@ -0,0 +1,12 @@ +{ + "a298cd70-8577-4ca9-82d7-517ca946d137": { + "version": "2.4.0", + "created_at": "2026-06-03T17:36:33.757848+00:00", + "document_version": "2.0.0" + }, + "17291f8f-336e-4a5f-8407-a4d22149d581": { + "version": "2.4.0", + "created_at": "2026-06-03T17:46:15.674895+00:00", + "document_version": "2.0.0" + } +} \ No newline at end of file diff --git a/.jupyter_ystore.db b/.jupyter_ystore.db new file mode 100644 index 0000000000000000000000000000000000000000..f852f01fb8d74a66b20802d0edf65903dd5941ed GIT binary patch literal 450560 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%0AF}RC?8C2o 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 IWwNXPH|xYcPXGV_ literal 0 HcmV?d00001 diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..12c5f56 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "jupyter": { + "command": "/home/enmanuel/fn_registry/analysis/nats/.venv/bin/jupyter-mcp-server", + "args": [ + "--transport", "stdio", + "--jupyter-url", "http://localhost:8890", + "--jupyter-token", "" + ] + } + } +} diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/analysis.md b/analysis.md new file mode 100644 index 0000000..5b32239 --- /dev/null +++ b/analysis.md @@ -0,0 +1,57 @@ +--- +name: nats +lang: py +domain: datascience +description: "Demostracion de envio de datos por pub/sub entre procesos con NATS (core pub/sub, wildcards, queue groups, request/reply, JetStream y procesos OS reales)" +tags: [nats, pubsub, messaging, jetstream, asyncio, docker] +uses_functions: [] +uses_types: [] +framework: "jupyterlab" +entry_point: "notebooks/01_core_pubsub.ipynb" +dir_path: "analysis/nats" +repo_url: "" +--- + +## Notas + +Analisis didactico de **NATS** como sistema de mensajeria pub/sub entre procesos. El broker corre en Docker (`nats:latest -js`, puerto 4222) y el cliente es `nats-py` (asyncio). Tres notebooks progresivos: + +| Notebook | Contenido | +|---|---| +| `01_core_pubsub.ipynb` | Modelo base: conexion, publish/subscribe, fan-out a N subscribers, wildcards `*` y `>`. | +| `02_queue_request_jetstream.ipynb` | Queue groups (reparto de carga), request/reply (RPC con inbox temporal), JetStream (stream persistente + consumer durable + replay). | +| `03_procesos_reales.ipynb` | Publisher y subscribers como **procesos del SO independientes** (`subprocess`), cada uno con su PID. Demuestra el desacople real: el publisher no conoce a sus subscribers. | + +Los scripts `notebooks/procs/publisher.py` y `notebooks/procs/subscriber.py` son los programas que el notebook 03 lanza como procesos reales. + +### Como usar + +1. Requiere Docker disponible (con permisos para el usuario actual). La primera celda de cada notebook arranca el broker de forma idempotente con la funcion `ensure_nats`, asi que cada notebook funciona de forma aislada. +2. Lanzar Jupyter del analisis: `cd analysis/nats && ./run-jupyter-lab.sh` (puerto 8890). +3. Abrir cualquier notebook y ejecutar las celdas en orden. + +### Requisitos + +- `nats-py` (instalado en el `.venv` del analisis). +- Imagen Docker `nats:latest` (se descarga con `docker pull nats:latest` la primera vez). +- El broker comparte el contenedor `nats_demo` entre los tres notebooks. + +### Parar el broker + +Cuando termines, para y elimina el contenedor: + +```bash +docker stop nats_demo && docker rm nats_demo +``` + +### Reproducir / regenerar los notebooks + +El script `build_notebooks.py` regenera los tres `.ipynb` desde cero con `nbformat` (sin ejecutar). La ejecucion se hace luego desde JupyterLab o via el MCP de Jupyter: + +```bash +.venv/bin/python build_notebooks.py +``` + +### Nota tecnica sobre el MCP de Jupyter + +Si abres Claude desde la raiz de `fn_registry`, su MCP de Jupyter apunta al servidor global (puerto 8899, root `fn_registry`), no al servidor de este analisis (8890). Para usar el MCP contra este analisis con su propio `.venv`, abre Claude desde el directorio del analisis: `cd analysis/nats && claude` — el `.mcp.json` local enlaza el MCP al puerto 8890. diff --git a/build_notebooks.py b/build_notebooks.py new file mode 100644 index 0000000..014f189 --- /dev/null +++ b/build_notebooks.py @@ -0,0 +1,580 @@ +#!/usr/bin/env python3 +"""Generador de los notebooks del analisis NATS. + +Construye los tres .ipynb con nbformat (sin ejecutar). La ejecucion se hace +despues a traves del MCP de Jupyter, contra el kernel del servidor, para que +los outputs queden persistidos y visibles en JupyterLab. + +Reproducible: re-ejecutar este script regenera los notebooks desde cero. +""" +from pathlib import Path + +import nbformat as nbf + +NBDIR = Path("/home/enmanuel/fn_registry/analysis/nats/notebooks") +PROCS_ABS = str(NBDIR / "procs") + + +def build(filename: str, cells: list[tuple[str, str]]) -> None: + nb = nbf.v4.new_notebook() + nb.metadata["kernelspec"] = { + "name": "python3", + "display_name": "Python 3 (ipykernel)", + "language": "python", + } + nb.cells = [ + nbf.v4.new_markdown_cell(src) if typ == "md" else nbf.v4.new_code_cell(src) + for typ, src in cells + ] + nbf.write(nb, str(NBDIR / filename)) + print(f"escrito {filename}: {len(cells)} celdas") + + +# Bloque de codigo reutilizado al inicio de cada notebook para arrancar el broker. +ENSURE_NATS = '''import subprocess, time, json + +NATS_CONTAINER = "nats_demo" +NATS_PORT = 4222 +NATS_URL = f"nats://127.0.0.1:{NATS_PORT}" + +def _docker(*args, check=True): + return subprocess.run(["docker", *args], capture_output=True, text=True, check=check) + +def ensure_nats(name=NATS_CONTAINER, port=NATS_PORT): + """Arranca un broker NATS en Docker de forma idempotente. Devuelve el estado.""" + out = _docker("ps", "-a", "--filter", f"name=^{name}$", "--format", "{{.State}}", check=False).stdout.strip() + if out == "running": + state = "already-running" + elif out in ("exited", "created", "paused"): + _docker("start", name) + state = "started" + else: + _docker("run", "-d", "--name", name, "-p", f"{port}:4222", "-p", "8222:8222", + "nats:latest", "-js", "-m", "8222") + state = "created" + time.sleep(1.0) + return state''' + + +# ---------------------------------------------------------------------------- +# Notebook 01 — Core pub/sub y wildcards +# ---------------------------------------------------------------------------- +nb1 = [ +("md", """# NATS pub/sub — 01 · Core publish/subscribe y wildcards + +**NATS** es un sistema de mensajería ligero y de alto rendimiento orientado a la comunicación entre procesos (microservicios, IoT, pipelines de datos). Su modelo central es **publish/subscribe** sobre *subjects*. + +### Conceptos clave + +- **Subject**: una cadena jerárquica separada por puntos, por ejemplo `pedidos.creados` o `sensor.cocina.temp`. Es la *dirección* de un mensaje. No hay que declararlo: existe en cuanto alguien publica o se suscribe. +- **Publisher**: un proceso que envía un mensaje a un subject. No sabe quién lo va a recibir (ni si alguien lo recibirá). +- **Subscriber**: un proceso que expresa interés en uno o varios subjects. Recibe todos los mensajes publicados en ellos mientras esté conectado. +- **Broker (`nats-server`)**: el proceso central que enruta cada mensaje publicado a todos los subscribers interesados. Desacopla a publishers de subscribers: ninguno conoce la dirección de red del otro, solo el broker y el subject. + +### Garantías del *core* NATS + +El core es **fire-and-forget** (*at-most-once*): si en el momento de publicar no hay ningún subscriber conectado a ese subject, el mensaje se descarta. No hay persistencia ni reintentos. Esto lo hace extremadamente rápido. Cuando se necesita persistencia y *replay* se usa **JetStream** (notebook 02). + +En este notebook levantamos un broker en Docker y demostramos: conexión, pub/sub básico, *fan-out* a varios subscribers y *wildcards*."""), + +("md", """## 0 · Entorno: el broker NATS en Docker + +Levantamos `nats:latest` con el flag `-js` (habilita JetStream, que usaremos en el notebook 02) y publicamos el puerto estándar `4222` en el host. La función `ensure_nats` es **idempotente**: si el contenedor ya existe lo reutiliza, si está parado lo arranca, y solo lo crea si no existe. Así los tres notebooks de este análisis comparten el mismo broker."""), + +("code", ENSURE_NATS + ''' + +state = ensure_nats() +print(f"Broker NATS: {state} en {NATS_URL}") +# El endpoint de monitorización (puerto 8222) expone métricas del servidor en JSON +import urllib.request +varz = json.loads(urllib.request.urlopen("http://127.0.0.1:8222/varz", timeout=3).read()) +print(f"nats-server version: {varz['version']} | jetstream activo: {bool(varz.get('jetstream'))}")'''), + +("md", """## 1 · Conectar un cliente + +Usamos `nats-py`, el cliente oficial para Python basado en `asyncio`. IPython permite usar `await` directamente en las celdas (*top-level await*), así que mantenemos la conexión `nc` viva en una variable global y la reutilizamos a lo largo del notebook, igual que haría un proceso real."""), + +("code", '''import asyncio +import nats + +# Conexión persistente del notebook (simula el cliente de un proceso de larga vida) +nc = await nats.connect(NATS_URL, name="notebook-01") +info = nc._server_info # metadata que el broker envía en el handshake +print("Conectado.") +print(f" server_id : {info['server_id']}") +print(f" max_payload: {info['max_payload']/1024/1024:.0f} MiB por mensaje") +print(f" client_id : {info['client_id']}")'''), + +("md", """## 2 · Publish/Subscribe básico + +El patrón mínimo: un subscriber declara interés en un subject, un publisher envía un mensaje, el broker lo entrega. + +Aquí usamos una **suscripción síncrona** (`sub.next_msg()`), cómoda para ir paso a paso en un notebook: pedimos explícitamente el siguiente mensaje. El payload siempre viaja como `bytes` — NATS no impone formato; aquí codificamos texto UTF-8."""), + +("code", '''# El subscriber declara interés ANTES de que se publique (core = at-most-once) +sub = await nc.subscribe("saludos") + +# El publisher envía. No sabe quién escucha; solo conoce el subject. +await nc.publish("saludos", b"hola desde el publisher") +await nc.flush() # fuerza el envío al broker antes de seguir + +# El subscriber recoge el mensaje +msg = await sub.next_msg(timeout=2) +print(f"subject recibido : {msg.subject}") +print(f"payload : {msg.data.decode()}") + +await sub.unsubscribe()'''), + +("md", """## 3 · Fan-out: un publisher, N subscribers + +La potencia del pub/sub es el **fan-out**: cuando varios subscribers están interesados en el mismo subject, el broker entrega una **copia a cada uno**. El publisher hace *una* llamada `publish` y no cambia nada en su código aunque haya 1 o 1000 subscribers. + +Aquí registramos 3 subscribers al subject `noticias` mediante *callbacks* asíncronos (cada uno simula un proceso distinto) y publicamos un único mensaje."""), + +("code", '''recibidos = [] # registro de quién recibió qué + +def make_handler(nombre): + async def handler(msg): + recibidos.append({"subscriber": nombre, "subject": msg.subject, "data": msg.data.decode()}) + return handler + +# Tres subscribers independientes al MISMO subject +subs = [] +for nombre in ["sub-A", "sub-B", "sub-C"]: + s = await nc.subscribe("noticias", cb=make_handler(nombre)) + subs.append(s) + +# Un único publish... +await nc.publish("noticias", b"titular: NATS entrega a todos") +await nc.flush() +await asyncio.sleep(0.3) # dar tiempo a los callbacks + +for r in recibidos: + print(f"{r['subscriber']} <- [{r['subject']}] {r['data']}") +print() +print(f"Un publish -> {len(recibidos)} entregas (fan-out)") + +for s in subs: + await s.unsubscribe()'''), + +("md", """## 4 · Wildcards: `*` y `>` + +Los subjects son jerárquicos y los subscribers pueden usar comodines para suscribirse a familias enteras de subjects: + +- **`*`** (asterisco) — comodín de **un único token**. `sensor.*.temp` casa con `sensor.cocina.temp` y `sensor.salon.temp`, pero **no** con `sensor.cocina.planta1.temp`. +- **`>`** (mayor que) — comodín de **uno o más tokens** hasta el final. `sensor.>` casa con `sensor.cocina.temp`, `sensor.salon.humedad`, `sensor.garaje.puerta.estado`... + +Esto permite que un proceso se suscriba a "todo lo de los sensores" o "la temperatura de cualquier habitación" sin conocer de antemano qué subjects concretos existirán."""), + +("code", '''wild = [] + +async def on_star(msg): + wild.append({"patron": "sensor.*.temp", "subject": msg.subject, "data": msg.data.decode()}) + +async def on_gt(msg): + wild.append({"patron": "sensor.>", "subject": msg.subject, "data": msg.data.decode()}) + +s_star = await nc.subscribe("sensor.*.temp", cb=on_star) +s_gt = await nc.subscribe("sensor.>", cb=on_gt) + +# Publicamos en varios subjects concretos +publicados = { + "sensor.cocina.temp": "21.5", + "sensor.salon.temp": "22.1", + "sensor.salon.humedad": "48", + "sensor.garaje.puerta.estado": "abierta", +} +for subj, val in publicados.items(): + await nc.publish(subj, val.encode()) +await nc.flush() +await asyncio.sleep(0.3) + +print("Mensajes publicados:", list(publicados)) +print() +for w in wild: + print(f"[{w['patron']:14}] casó {w['subject']}") + +await s_star.unsubscribe(); await s_gt.unsubscribe()'''), + +("md", """## 5 · Visualización: qué patrón casó qué subject + +Una matriz `subject × patrón` deja claro el alcance de cada comodín: `sensor.>` captura los cuatro subjects; `sensor.*.temp` solo las dos temperaturas de un nivel (no la humedad, que no es `temp`, ni la del garaje, que tiene un token de más)."""), + +("code", '''import pandas as pd +import matplotlib.pyplot as plt +import numpy as np + +patrones = ["sensor.*.temp", "sensor.>"] +subjects = list(publicados) + +# Construir matriz de coincidencias a partir de lo que recibió cada suscripción +M = np.zeros((len(patrones), len(subjects)), dtype=int) +for w in wild: + i = patrones.index(w["patron"]) + j = subjects.index(w["subject"]) + M[i, j] = 1 + +fig, ax = plt.subplots(figsize=(9, 2.6)) +ax.imshow(M, cmap="Greens", vmin=0, vmax=1, aspect="auto") +ax.set_xticks(range(len(subjects))); ax.set_xticklabels(subjects, rotation=25, ha="right", fontsize=9) +ax.set_yticks(range(len(patrones))); ax.set_yticklabels(patrones, fontsize=10) +for i in range(len(patrones)): + for j in range(len(subjects)): + ax.text(j, i, "OK" if M[i, j] else "-", ha="center", va="center", + color="white" if M[i, j] else "#999", fontsize=12) +ax.set_title("Coincidencia de wildcards (OK = el subscriber recibió el mensaje)") +plt.tight_layout(); plt.show() + +pd.DataFrame(M, index=patrones, columns=subjects)'''), + +("md", """## Resumen + +- El **broker** desacopla publishers y subscribers: solo comparten el *subject*. +- El core es **fire-and-forget**: sin subscriber conectado, el mensaje se pierde. +- **Fan-out** automático: una publicación llega a todos los subscribers interesados. +- **Wildcards** `*` (un token) y `>` (resto de la jerarquía) permiten suscribirse a familias de subjects. + +**Siguiente** → `02_queue_request_jetstream.ipynb`: repartir carga entre workers (*queue groups*), RPC (*request/reply*) y mensajería **persistente** con JetStream. + +> La conexión `nc` y el contenedor `nats_demo` siguen vivos para los siguientes notebooks."""), +] + + +# ---------------------------------------------------------------------------- +# Notebook 02 — Queue groups, Request/Reply, JetStream +# ---------------------------------------------------------------------------- +nb2 = [ +("md", """# NATS pub/sub — 02 · Queue groups, Request/Reply y JetStream + +En el notebook 01 vimos el *fan-out* del core: una publicación llega a **todos** los subscribers. Aquí cubrimos tres patrones que construyen sobre esa base: + +1. **Queue groups** — repartir la carga: varios *workers* comparten el trabajo y cada mensaje lo procesa **uno solo**. +2. **Request/Reply** — RPC sobre mensajería: un cliente pregunta y espera la respuesta de un servicio. +3. **JetStream** — la capa de **persistencia**: streams que almacenan los mensajes y permiten *replay*, a diferencia del core *fire-and-forget*. + +> Requiere el broker `nats_demo` del notebook 01. La primera celda lo arranca de forma idempotente, así que este notebook también funciona de forma aislada."""), + +("md", """## 0 · Setup: broker + conexión + +Reutilizamos el mismo broker en Docker. `ensure_nats` es idempotente; si el contenedor sigue vivo del notebook 01, simplemente se reaprovecha."""), + +("code", ENSURE_NATS + ''' + +import asyncio +import nats + +print("Broker:", ensure_nats()) +nc = await nats.connect(NATS_URL, name="notebook-02") +print("Conectado, client_id:", nc._server_info["client_id"])'''), + +("md", """## 1 · Queue groups — reparto de carga entre workers + +Un **queue group** convierte el fan-out en una **cola de trabajo**. Varios subscribers se suscriben al mismo subject pero declarando el mismo nombre de *queue*. El broker entonces entrega cada mensaje a **exactamente uno** de los miembros del grupo (balanceo de carga), en lugar de a todos. + +Es el patrón de los *worker pools*: escalas el procesamiento añadiendo más workers al grupo, sin tocar al publisher. Si un worker cae, los demás siguen recibiendo. Aquí lanzamos 3 workers en el queue `procesadores` y publicamos 12 tareas."""), + +("code", '''from collections import Counter + +trabajo = Counter() # cuántas tareas procesó cada worker +orden = [] # traza temporal (worker, tarea) + +def make_worker(nombre): + async def worker(msg): + tarea = msg.data.decode() + trabajo[nombre] += 1 + orden.append((nombre, tarea)) + return worker + +# 3 workers, MISMO subject, MISMO queue group -> NATS reparte +workers = [] +for nombre in ["worker-1", "worker-2", "worker-3"]: + s = await nc.subscribe("tareas", queue="procesadores", cb=make_worker(nombre)) + workers.append(s) + +# Publicar 12 tareas +for i in range(12): + await nc.publish("tareas", f"tarea-{i:02d}".encode()) +await nc.flush() +await asyncio.sleep(0.5) + +print("Reparto de carga (cada tarea fue a UN solo worker):") +for w, n in sorted(trabajo.items()): + print(f" {w}: {n} tareas") +print(f" TOTAL procesado: {sum(trabajo.values())} de 12 tareas") + +for s in workers: + await s.unsubscribe()'''), + +("md", """### Visualización del reparto + +El total siempre suma 12 (ninguna tarea se duplica ni se pierde), repartido de forma aproximadamente equilibrada entre los workers."""), + +("code", '''import matplotlib.pyplot as plt + +nombres = [f"worker-{i}" for i in (1, 2, 3)] +valores = [trabajo.get(n, 0) for n in nombres] + +fig, ax = plt.subplots(figsize=(7, 3)) +barras = ax.bar(nombres, valores, color=["#2563eb", "#16a34a", "#db2777"]) +ax.bar_label(barras, padding=3) +ax.set_ylabel("tareas procesadas") +ax.set_title(f"Queue group 'procesadores' — 12 tareas repartidas entre {len(nombres)} workers") +ax.set_ylim(0, max(valores) + 2) +plt.tight_layout(); plt.show()'''), + +("md", """## 2 · Request/Reply — RPC sobre NATS + +NATS implementa **petición/respuesta** sobre el mismo modelo pub/sub. El cliente usa `nc.request(subject, datos)`: por debajo, NATS crea un subject de respuesta temporal único (un *inbox*), lo adjunta al mensaje y espera la primera respuesta que llegue a ese inbox. + +El servicio se suscribe al subject, procesa, y responde con `msg.respond(datos)`. Esto da RPC con descubrimiento automático (el cliente no conoce la dirección del servicio, solo el subject) y *timeouts* integrados. Si varios servicios escuchan en un queue group, además se balancea la carga de las peticiones."""), + +("code", '''import nats.errors + +# Servicio: convierte el texto recibido a mayúsculas y responde +async def servicio_mayusculas(msg): + respuesta = msg.data.decode().upper() + await msg.respond(respuesta.encode()) + +sub_svc = await nc.subscribe("servicio.mayusculas", cb=servicio_mayusculas) + +# Cliente: pide y espera respuesta (con timeout) +peticiones = ["hola mundo", "nats request reply", "desacople total"] +for texto in peticiones: + resp = await nc.request("servicio.mayusculas", texto.encode(), timeout=1.0) + print(f" peticion : {texto!r}") + print(f" respuesta: {resp.data.decode()!r} (vino por el inbox {resp.subject})") + print() + +# ¿Qué pasa si nadie escucha el subject? El broker avisa al instante con +# NoRespondersError (no hace falta esperar al timeout completo). +try: + await nc.request("servicio.inexistente", b"hay alguien?", timeout=0.5) +except nats.errors.NoRespondersError: + print("servicio.inexistente -> NoRespondersError: el broker confirma que no hay ningún servicio escuchando") +except (nats.errors.TimeoutError, asyncio.TimeoutError): + print("servicio.inexistente -> TimeoutError: nadie respondió a tiempo") + +await sub_svc.unsubscribe()'''), + +("md", """## 3 · JetStream — persistencia y replay + +Todo lo anterior es **efímero**: si no hay nadie escuchando en el instante exacto de la publicación, el mensaje se pierde. **JetStream** añade una capa de almacenamiento: + +- Un **stream** captura y persiste todos los mensajes de unos subjects dados. +- Los **consumers** leen del stream a su ritmo, pueden ser **durables** (recuerdan por dónde iban) y permiten **replay** de mensajes históricos. + +Demostramos la diferencia clave con el core: publicamos a un stream **sin ningún consumidor activo** y, *después*, creamos un consumidor que recupera todos esos mensajes."""), + +("code", '''js = nc.jetstream() + +# Crear (o recrear limpio) un stream que persiste todo lo de 'eventos.>' +try: + await js.delete_stream("EVENTOS") +except Exception: + pass +stream = await js.add_stream(name="EVENTOS", subjects=["eventos.>"]) +print(f"Stream creado: {stream.config.name} subjects={stream.config.subjects} storage={stream.config.storage}") + +# Publicar 5 eventos SIN que haya ningún consumidor escuchando todavía +for i in range(5): + ack = await js.publish("eventos.click", f"evento #{i}".encode()) + print(f" publicado eventos.click -> stream='{ack.stream}' seq={ack.seq}") + +estado = (await js.stream_info("EVENTOS")).state +print() +print(f"Mensajes retenidos en el stream: {estado.messages} (siguen ahí aunque nadie los haya leído)")'''), + +("md", """### Replay: leer los mensajes históricos + +Ahora creamos un **consumer durable** (`lector-eventos`) y hacemos *fetch*. Recuperamos los 5 mensajes que se publicaron **antes** de que este consumidor existiera — algo imposible con el core NATS."""), + +("code", '''# Pull consumer durable: pedimos los mensajes bajo demanda +psub = await js.pull_subscribe("eventos.>", durable="lector-eventos") + +mensajes = await psub.fetch(5, timeout=2) +print(f"Recuperados {len(mensajes)} mensajes del stream (replay):") +for m in mensajes: + print(f" seq={m.metadata.sequence.stream} subject={m.subject} data={m.data.decode()!r}") + await m.ack() # confirmamos el procesado; el durable avanza su cursor + +# Tras el ack, un segundo fetch no devuelve nada nuevo (cursor avanzado) +try: + extra = await psub.fetch(1, timeout=1) +except Exception: + extra = [] +print() +print(f"Segundo fetch tras ack: {len(extra)} mensajes (el durable recuerda que ya los leyó)")'''), + +("md", """## Resumen + +| Patrón | Entrega | Persistencia | Caso de uso | +|---|---|---|---| +| Core pub/sub (nb 01) | a **todos** los subscribers | no (at-most-once) | eventos en vivo, telemetría | +| **Queue group** | a **uno** del grupo | no | *worker pool*, reparto de carga | +| **Request/Reply** | a uno, con respuesta | no | RPC, servicios | +| **JetStream** | configurable + **replay** | **sí** | event sourcing, colas durables, auditoría | + +**Siguiente** → `03_procesos_reales.ipynb`: hasta ahora todo ha ocurrido dentro de un mismo kernel. Allí lanzamos publisher y subscribers como **procesos del sistema operativo independientes** para ver el desacople real."""), +] + + +# ---------------------------------------------------------------------------- +# Notebook 03 — Procesos del sistema operativo reales +# ---------------------------------------------------------------------------- +nb3 = [ +("md", """# NATS pub/sub — 03 · Procesos del sistema operativo reales + +En los notebooks 01 y 02 todo ocurrió dentro de un mismo kernel: varias conexiones `asyncio` simulaban procesos distintos. Eso es cómodo para explicar, pero NATS brilla precisamente cuando los participantes son **procesos del sistema operativo separados** —incluso en máquinas distintas— que solo comparten la dirección del broker y los nombres de subject. + +Aquí lanzamos **procesos reales** con `subprocess`: + +- un **publisher** (`procs/publisher.py`) que emite telemetría a `telemetria.cpu` y `telemetria.mem`; +- dos **subscribers** independientes (`procs/subscriber.py`), cada uno con su propio PID: + - `sub-todo` escucha `telemetria.>` (toda la telemetría), + - `sub-cpu` escucha solo `telemetria.cpu`. + +Cada proceso abre su propia conexión al broker. El publisher **no sabe** cuántos subscribers hay ni qué escuchan: solo publica a un subject. Ese es el desacople real."""), + +("md", """## 0 · Broker + scripts de los procesos + +Arrancamos el broker (idempotente) y mostramos el código de los dos scripts que vamos a lanzar como procesos. Cada uno es un programa autónomo que se conecta a `nats://127.0.0.1:4222` y emite eventos como líneas JSON en su stdout, que el notebook recogerá."""), + +("code", ENSURE_NATS + f''' + +from pathlib import Path + +PROCS = Path(r"{PROCS_ABS}") +print("Broker:", ensure_nats()) +print("Scripts de proceso en:", PROCS) +print() +print("=== procs/publisher.py ===") +print(Path(PROCS / "publisher.py").read_text())'''), + +("code", '''print("=== procs/subscriber.py ===") +print((PROCS / "subscriber.py").read_text())'''), + +("md", """## 1 · Lanzar los procesos y orquestarlos + +El notebook actúa de **orquestador**: + +1. Lanza los dos subscribers como procesos (`subprocess.Popen`), cada uno con su PID. Les damos 1.5 s para que conecten y se suscriban. +2. Lanza el publisher, que emite 8 mensajes y termina. +3. Espera a que los subscribers terminen solos (su `--seconds`) y recoge su stdout. + +Usamos `sys.executable` para que los procesos hijos usen el mismo intérprete (con `nats-py` instalado) que el kernel."""), + +("code", '''import subprocess, sys, json, time + +def lanzar_subscriber(nombre, subjects, seconds=4.5): + return subprocess.Popen( + [sys.executable, str(PROCS / "subscriber.py"), + "--name", nombre, "--subjects", subjects, "--seconds", str(seconds)], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, + ) + +# 1. Subscribers: procesos OS independientes +procs = { + "sub-todo": lanzar_subscriber("sub-todo", "telemetria.>"), + "sub-cpu": lanzar_subscriber("sub-cpu", "telemetria.cpu"), +} +print("Subscribers lanzados (PIDs del SO):", {n: p.pid for n, p in procs.items()}) +time.sleep(1.5) # que conecten y se suscriban antes de publicar + +# 2. Publisher: otro proceso OS, publica 8 mensajes y termina +pub = subprocess.run( + [sys.executable, str(PROCS / "publisher.py"), "--count", "8", "--interval", "0.15"], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, +) +pub_eventos = [json.loads(l) for l in pub.stdout.splitlines() if l.strip()] +print(f"Publisher (PID {pub_eventos[0]['pid']}) publicó {sum(1 for e in pub_eventos if e['event']=='published')} mensajes") + +# 3. Recoger stdout de los subscribers (terminan solos por --seconds) +eventos = [] +for nombre, p in procs.items(): + out, err = p.communicate(timeout=10) + for l in out.splitlines(): + if l.strip(): + eventos.append(json.loads(l)) + if err.strip(): + print(f"[{nombre} stderr] {err.strip()[:200]}") + +msgs = [e for e in eventos if e["event"] == "msg"] +print(f"\\nTotal de entregas recibidas entre todos los procesos: {len(msgs)}")'''), + +("md", """## 2 · Qué recibió cada proceso + +Cada subscriber es un PID distinto. `sub-todo` (suscrito a `telemetria.>`) recibe los 8 mensajes; `sub-cpu` (suscrito solo a `telemetria.cpu`) recibe únicamente los 4 de CPU. El broker filtró por subject sin que el publisher supiera nada de ello."""), + +("code", '''import pandas as pd + +df = pd.DataFrame(msgs) +# PID por nombre de proceso (demuestra que son procesos distintos) +pids = {e["name"]: e["pid"] for e in eventos if e["event"] == "ready"} +print("PID de cada proceso subscriber:", pids) +print() + +# Conteo de mensajes por (proceso, subject) +tabla = df.groupby(["name", "subject"]).size().unstack(fill_value=0) +print("Mensajes recibidos por proceso y subject:") +print(tabla) +tabla'''), + +("code", '''import matplotlib.pyplot as plt + +resumen = df.groupby("name").size().reindex(["sub-todo", "sub-cpu"]).fillna(0).astype(int) + +fig, ax = plt.subplots(figsize=(7, 3.2)) +barras = ax.bar(resumen.index, resumen.values, color=["#7c3aed", "#0891b2"]) +ax.bar_label(barras, padding=3) +ax.set_ylabel("mensajes recibidos") +ax.set_title("Telemetría recibida por cada PROCESO (8 publicados: 4 cpu + 4 mem)") +ax.set_ylim(0, 10) +for i, name in enumerate(resumen.index): + ax.text(i, -1.4, f"PID {pids.get(name, '?')}\\n{('telemetria.>' if name=='sub-todo' else 'telemetria.cpu')}", + ha="center", va="top", fontsize=8, color="#555") +plt.tight_layout(); plt.show()'''), + +("md", """## 3 · Línea de tiempo de las entregas + +Ordenando los mensajes por su marca temporal (`t`, segundos desde que cada proceso arrancó) se ve cómo ambos subscribers reciben los mensajes de CPU casi a la vez (fan-out), mientras que los de memoria solo llegan a `sub-todo`."""), + +("code", '''fig, ax = plt.subplots(figsize=(9, 3)) +colores = {"telemetria.cpu": "#ef4444", "telemetria.mem": "#3b82f6"} +y_de = {"sub-todo": 1, "sub-cpu": 0} +for e in msgs: + ax.scatter(e["t"], y_de[e["name"]], color=colores[e["subject"]], s=80, zorder=3) +ax.set_yticks([0, 1]); ax.set_yticklabels(["sub-cpu", "sub-todo"]) +ax.set_xlabel("t (segundos desde el arranque de cada proceso)") +ax.set_title("Timeline de entregas — rojo: telemetria.cpu, azul: telemetria.mem") +ax.grid(axis="x", alpha=0.3) +from matplotlib.patches import Patch +ax.legend(handles=[Patch(color=c, label=s) for s, c in colores.items()], loc="upper right") +plt.tight_layout(); plt.show()'''), + +("md", """## Resumen del análisis + +A lo largo de los tres notebooks hemos visto cómo distintos procesos envían datos por pub/sub con NATS: + +- **01** — el modelo base: publishers y subscribers desacoplados por un broker, *fan-out* y *wildcards*. +- **02** — patrones de orden superior: *queue groups* (reparto de carga), *request/reply* (RPC) y *JetStream* (persistencia y replay). +- **03** — **procesos del SO reales**: el desacople de verdad. El publisher no conoce a sus subscribers; el broker enruta por subject. Añadir o quitar procesos consumidores no cambia ni una línea del publisher. + +Esa es la idea central de NATS: **los procesos se comunican por nombres de subject, no por direcciones**, y el broker se encarga del resto. + +### Limpieza (opcional) + +Para parar el broker cuando termines: + +```python +import subprocess +subprocess.run(["docker", "stop", "nats_demo"]) # detener +subprocess.run(["docker", "rm", "nats_demo"]) # eliminar +```"""), +] + + +if __name__ == "__main__": + build("01_core_pubsub.ipynb", nb1) + build("02_queue_request_jetstream.ipynb", nb2) + build("03_procesos_reales.ipynb", nb3) + print("OK: 3 notebooks generados en", NBDIR) diff --git a/jupyter.log b/jupyter.log new file mode 100644 index 0000000..166fb55 --- /dev/null +++ b/jupyter.log @@ -0,0 +1,110 @@ +════════════════════════════════════════════════ + Jupyter Lab + Colaboracion en puerto 8890 +════════════════════════════════════════════════ + + Abre: http://localhost:8890 + Ctrl+C para detener + +[W 2026-06-03 19:41:26.217 ServerApp] ServerApp.token config is deprecated in 2.0. Use IdentityProvider.token. +[I 2026-06-03 19:41:26.656 ServerApp] jupyter_lsp | extension was successfully linked. +[I 2026-06-03 19:41:26.658 ServerApp] jupyter_mcp_server | extension was successfully linked. +[I 2026-06-03 19:41:26.658 ServerApp] jupyter_mcp_tools | extension was successfully linked. +[I 2026-06-03 19:41:26.660 ServerApp] jupyter_server_fileid | extension was successfully linked. +[I 2026-06-03 19:41:26.662 ServerApp] jupyter_server_nbmodel | extension was successfully linked. +[I 2026-06-03 19:41:26.663 ServerApp] jupyter_server_terminals | extension was successfully linked. +[I 2026-06-03 19:41:26.665 ServerApp] jupyter_server_ydoc | extension was successfully linked. +[I 2026-06-03 19:41:26.667 ServerApp] jupyterlab | extension was successfully linked. +[I 2026-06-03 19:41:26.669 ServerApp] notebook | extension was successfully linked. +[I 2026-06-03 19:41:26.670 ServerApp] notebook_shim | extension was successfully linked. +[W 2026-06-03 19:41:26.680 ServerApp] All authentication is disabled. Anyone who can connect to this server will be able to run code. +[I 2026-06-03 19:41:26.681 ServerApp] notebook_shim | extension was successfully loaded. +[I 2026-06-03 19:41:26.682 ServerApp] jupyter_lsp | extension was successfully loaded. +[06/03/26 19:41:26] INFO Auto-enrolled document extension.py:195 + 'notebook.ipynb' as 'default' + INFO Jupyter MCP Server Extension extension.py:197 + settings initialized + INFO Registered MCP handlers at /mcp/ extension.py:233 + INFO - MCP protocol: /mcp (SSE-based) extension.py:234 + INFO - Health check: /mcp/healthz extension.py:235 + INFO - List tools: /mcp/tools/list extension.py:236 + INFO - Call tool: /mcp/tools/call extension.py:237 +[I 2026-06-03 19:41:26.784 ServerApp] jupyter_mcp_server | extension was successfully loaded. +[I 2026-06-03 19:41:26.784 ServerApp] Registered jupyter_mcp_tools server extension +[I 2026-06-03 19:41:26.784 ServerApp] jupyter_mcp_tools | extension was successfully loaded. +[I 2026-06-03 19:41:26.784 FileIdExtension] Configured File ID manager: ArbitraryFileIdManager +[I 2026-06-03 19:41:26.784 FileIdExtension] ArbitraryFileIdManager : Configured root dir: /home/enmanuel/fn_registry/analysis/nats +[I 2026-06-03 19:41:26.784 FileIdExtension] ArbitraryFileIdManager : Configured database path: /home/enmanuel/.local/share/jupyter/file_id_manager.db +[I 2026-06-03 19:41:26.785 FileIdExtension] ArbitraryFileIdManager : Successfully connected to database file. +[I 2026-06-03 19:41:26.785 FileIdExtension] ArbitraryFileIdManager : Creating File ID tables and indices with journal_mode = DELETE +[I 2026-06-03 19:41:26.785 FileIdExtension] Attached event listeners. +[I 2026-06-03 19:41:26.785 ServerApp] jupyter_server_fileid | extension was successfully loaded. +[I 2026-06-03 19:41:26.785 ServerApp] jupyter_server_nbmodel | extension was successfully loaded. +[I 2026-06-03 19:41:26.786 ServerApp] jupyter_server_terminals | extension was successfully loaded. +[I 2026-06-03 19:41:26.787 ServerApp] jupyter_server_ydoc | extension was successfully loaded. +[I 2026-06-03 19:41:26.789 LabApp] JupyterLab extension loaded from /home/enmanuel/fn_registry/analysis/nats/.venv/lib/python3.12/site-packages/jupyterlab +[I 2026-06-03 19:41:26.789 LabApp] JupyterLab application directory is /home/enmanuel/fn_registry/analysis/nats/.venv/share/jupyter/lab +[I 2026-06-03 19:41:26.789 LabApp] Extension Manager is 'pypi'. +[I 2026-06-03 19:41:26.810 ServerApp] jupyterlab | extension was successfully loaded. +[I 2026-06-03 19:41:26.811 ServerApp] notebook | extension was successfully loaded. +[I 2026-06-03 19:41:26.812 ServerApp] Serving notebooks from local directory: /home/enmanuel/fn_registry/analysis/nats +[I 2026-06-03 19:41:26.812 ServerApp] Jupyter Server 2.19.0 is running at: +[I 2026-06-03 19:41:26.812 ServerApp] http://localhost:8890/lab +[I 2026-06-03 19:41:26.812 ServerApp] http://127.0.0.1:8890/lab +[I 2026-06-03 19:41:26.812 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). +[I 2026-06-03 19:41:26.876 ServerApp] Skipped non-installed server(s): basedpyright, bash-language-server, dockerfile-language-server-nodejs, javascript-typescript-langserver, jedi-language-server, julia-language-server, pyrefly, pyright, python-language-server, python-lsp-server, r-languageserver, sql-language-server, texlab, typescript-language-server, unified-language-server, vscode-css-languageserver-bin, vscode-html-languageserver-bin, vscode-json-languageserver-bin, yaml-language-server +[I 2026-06-03 19:46:15.569 ServerApp] Request for Y document (previously indexed) 'notebooks/01_core_pubsub.ipynb' with room ID: f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:46:15.654 LabApp] Build is up to date +[I 2026-06-03 19:46:15.656 ServerApp] MCP Tools WebSocket connection opened +[W 2026-06-03 19:46:15.669 ServerApp] The websocket_ping_timeout (90000) cannot be longer than the websocket_ping_interval (30000). + Setting websocket_ping_timeout=30000 +[I 2026-06-03 19:46:15.672 YDocExtension] Creating FileLoader for: notebooks/01_core_pubsub.ipynb +[I 2026-06-03 19:46:15.673 YDocExtension] Watching file: notebooks/01_core_pubsub.ipynb +[I 2026-06-03 19:46:15.675 ServerApp] Initializing room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:46:15.676 ServerApp] Registered 414 tools +[I 2026-06-03 19:46:15.716 ServerApp] Content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 loaded from the ystore SQLiteYStore +[I 2026-06-03 19:46:15.719 ServerApp] Content in file notebooks/01_core_pubsub.ipynb is out-of-sync with the ystore SQLiteYStore +[I 2026-06-03 19:46:15.720 ServerApp] Content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 loaded from file notebooks/01_core_pubsub.ipynb +[I 2026-06-03 19:46:16.735 ServerApp] Saving the content from room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:46:16.738 YDocExtension] Saving file: notebooks/01_core_pubsub.ipynb +[I 2026-06-03 19:47:15.407 YDocExtension] Processed 31 Y patches in one minute +[I 2026-06-03 19:47:15.407 YDocExtension] Connected Y users: 2 +[I 2026-06-03 19:48:15.407 YDocExtension] Processed 16 Y patches in one minute +[I 2026-06-03 19:48:15.408 YDocExtension] Connected Y users: 2 +[I 2026-06-03 19:49:15.408 YDocExtension] Processed 16 Y patches in one minute +[I 2026-06-03 19:49:15.409 YDocExtension] Connected Y users: 2 +[I 2026-06-03 19:49:52.746 ServerApp] Out-of-band changes. Overwriting the content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[W 2026-06-03 19:49:52.770 ServerApp] Notebook notebooks/01_core_pubsub.ipynb is not trusted +[I 2026-06-03 19:50:15.409 YDocExtension] Processed 16 Y patches in one minute +[I 2026-06-03 19:50:15.409 YDocExtension] Connected Y users: 2 +[I 2026-06-03 19:50:16.900 ServerApp] Out-of-band changes. Overwriting the content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:50:17.929 ServerApp] Out-of-band changes. Overwriting the content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:50:22.970 ServerApp] Out-of-band changes. Overwriting the content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:50:26.008 ServerApp] Out-of-band changes. Overwriting the content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:50:30.051 ServerApp] Out-of-band changes. Overwriting the content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:50:34.088 ServerApp] Out-of-band changes. Overwriting the content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[I 2026-06-03 19:50:37.127 ServerApp] Out-of-band changes. Overwriting the content in room json:notebook:f0c81420-7285-42fa-afcf-aa618e651df6 +[06/03/26 19:50:37] ERROR Notebook JSON is invalid: Additional __init__.py:98 + properties are not allowed + ('transient' was unexpected) + + Failed validating + 'additionalProperties' in + display_data: + + On + instance['cells'][12]['outputs'][0]: + {'data': {'image/png': + 'iVBORw0KGgoAAAANSUhEUgAAA3oAAAD5CAY + AAABxn0eTAAAAOnRFWHRTb2Z0d2Fy...', + 'text/plain': '
'}, + 'metadata': {}, + 'output_type': 'display_data', + 'transient': {}} +[W 2026-06-03 19:50:37.149 ServerApp] Notebook notebooks/01_core_pubsub.ipynb is not trusted +[I 2026-06-03 19:51:15.410 YDocExtension] Processed 16 Y patches in one minute +[I 2026-06-03 19:51:15.411 YDocExtension] Connected Y users: 2 +[I 2026-06-03 19:52:15.414 YDocExtension] Processed 16 Y patches in one minute +[I 2026-06-03 19:52:15.414 YDocExtension] Connected Y users: 2 +[I 2026-06-03 19:53:15.417 YDocExtension] Processed 16 Y patches in one minute +[I 2026-06-03 19:53:15.417 YDocExtension] Connected Y users: 2 diff --git a/main.py b/main.py new file mode 100644 index 0000000..7622f3f --- /dev/null +++ b/main.py @@ -0,0 +1,6 @@ +def main(): + print("Hello from nats!") + + +if __name__ == "__main__": + main() diff --git a/notebooks/.ipynb_checkpoints/01_core_pubsub-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/01_core_pubsub-checkpoint.ipynb new file mode 100644 index 0000000..59091f8 --- /dev/null +++ b/notebooks/.ipynb_checkpoints/01_core_pubsub-checkpoint.ipynb @@ -0,0 +1,15 @@ +{ + "cells": [], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/.ipynb_checkpoints/02_queue_request_jetstream-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/02_queue_request_jetstream-checkpoint.ipynb new file mode 100644 index 0000000..59091f8 --- /dev/null +++ b/notebooks/.ipynb_checkpoints/02_queue_request_jetstream-checkpoint.ipynb @@ -0,0 +1,15 @@ +{ + "cells": [], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/.ipynb_checkpoints/03_procesos_reales-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/03_procesos_reales-checkpoint.ipynb new file mode 100644 index 0000000..feb1325 --- /dev/null +++ b/notebooks/.ipynb_checkpoints/03_procesos_reales-checkpoint.ipynb @@ -0,0 +1,331 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "05860b9f", + "metadata": {}, + "source": [ + "# NATS pub/sub — 03 · Procesos del sistema operativo reales\n", + "\n", + "En los notebooks 01 y 02 todo ocurrió dentro de un mismo kernel: varias conexiones `asyncio` simulaban procesos distintos. Eso es cómodo para explicar, pero NATS brilla precisamente cuando los participantes son **procesos del sistema operativo separados** —incluso en máquinas distintas— que solo comparten la dirección del broker y los nombres de subject.\n", + "\n", + "Aquí lanzamos **procesos reales** con `subprocess`:\n", + "\n", + "- un **publisher** (`procs/publisher.py`) que emite telemetría a `telemetria.cpu` y `telemetria.mem`;\n", + "- dos **subscribers** independientes (`procs/subscriber.py`), cada uno con su propio PID:\n", + " - `sub-todo` escucha `telemetria.>` (toda la telemetría),\n", + " - `sub-cpu` escucha solo `telemetria.cpu`.\n", + "\n", + "Cada proceso abre su propia conexión al broker. El publisher **no sabe** cuántos subscribers hay ni qué escuchan: solo publica a un subject. Ese es el desacople real." + ] + }, + { + "cell_type": "markdown", + "id": "c5127085", + "metadata": {}, + "source": [ + "## 0 · Broker + scripts de los procesos\n", + "\n", + "Arrancamos el broker (idempotente) y mostramos el código de los dos scripts que vamos a lanzar como procesos. Cada uno es un programa autónomo que se conecta a `nats://127.0.0.1:4222` y emite eventos como líneas JSON en su stdout, que el notebook recogerá." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bb720c29", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Broker: already-running\n", + "Scripts de proceso en: /home/enmanuel/fn_registry/analysis/nats/notebooks/procs\n", + "\n", + "=== procs/publisher.py ===\n", + "#!/usr/bin/env python3\n", + "\"\"\"Publisher NATS como proceso del sistema operativo independiente.\n", + "\n", + "Se conecta al broker y publica una rafaga de mensajes de telemetria,\n", + "alternando entre los subjects `telemetria.cpu` y `telemetria.mem`.\n", + "No sabe ni le importa cuantos subscribers hay escuchando: solo conoce el\n", + "subject. Emite cada publicacion como linea JSON en stdout.\n", + "\"\"\"\n", + "import argparse\n", + "import asyncio\n", + "import json\n", + "import os\n", + "import random\n", + "import time\n", + "\n", + "import nats\n", + "\n", + "NATS_URL = \"nats://127.0.0.1:4222\"\n", + "\n", + "\n", + "def emit(event: dict) -> None:\n", + " print(json.dumps(event), flush=True)\n", + "\n", + "\n", + "async def main(count: int, interval: float) -> None:\n", + " pid = os.getpid()\n", + " nc = await nats.connect(NATS_URL, name=\"publisher\")\n", + " emit({\"event\": \"ready\", \"pid\": pid, \"name\": \"publisher\"})\n", + "\n", + " for i in range(count):\n", + " subject = \"telemetria.cpu\" if i % 2 == 0 else \"telemetria.mem\"\n", + " payload = json.dumps({\"i\": i, \"valor\": round(random.uniform(0, 100), 1)})\n", + " await nc.publish(subject, payload.encode())\n", + " emit({\"event\": \"published\", \"pid\": pid, \"subject\": subject, \"i\": i})\n", + " await asyncio.sleep(interval)\n", + "\n", + " await nc.flush()\n", + " emit({\"event\": \"done\", \"pid\": pid, \"name\": \"publisher\", \"published\": count})\n", + " await nc.drain()\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " parser = argparse.ArgumentParser(description=\"Publisher NATS de demostracion\")\n", + " parser.add_argument(\"--count\", type=int, default=8, help=\"Numero de mensajes a publicar\")\n", + " parser.add_argument(\"--interval\", type=float, default=0.15,\n", + " help=\"Segundos entre publicaciones\")\n", + " args = parser.parse_args()\n", + " asyncio.run(main(args.count, args.interval))\n", + "\n" + ] + } + ], + "source": [ + "import subprocess, time, json\n", + "\n", + "NATS_CONTAINER = \"nats_demo\"\n", + "NATS_PORT = 4222\n", + "NATS_URL = f\"nats://127.0.0.1:{NATS_PORT}\"\n", + "\n", + "def _docker(*args, check=True):\n", + " return subprocess.run([\"docker\", *args], capture_output=True, text=True, check=check)\n", + "\n", + "def ensure_nats(name=NATS_CONTAINER, port=NATS_PORT):\n", + " \"\"\"Arranca un broker NATS en Docker de forma idempotente. Devuelve el estado.\"\"\"\n", + " out = _docker(\"ps\", \"-a\", \"--filter\", f\"name=^{name}$\", \"--format\", \"{{.State}}\", check=False).stdout.strip()\n", + " if out == \"running\":\n", + " state = \"already-running\"\n", + " elif out in (\"exited\", \"created\", \"paused\"):\n", + " _docker(\"start\", name)\n", + " state = \"started\"\n", + " else:\n", + " _docker(\"run\", \"-d\", \"--name\", name, \"-p\", f\"{port}:4222\", \"-p\", \"8222:8222\",\n", + " \"nats:latest\", \"-js\", \"-m\", \"8222\")\n", + " state = \"created\"\n", + " time.sleep(1.0)\n", + " return state\n", + "\n", + "from pathlib import Path\n", + "\n", + "PROCS = Path(r\"/home/enmanuel/fn_registry/analysis/nats/notebooks/procs\")\n", + "print(\"Broker:\", ensure_nats())\n", + "print(\"Scripts de proceso en:\", PROCS)\n", + "print()\n", + "print(\"=== procs/publisher.py ===\")\n", + "print(Path(PROCS / \"publisher.py\").read_text())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3412b705", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"=== procs/subscriber.py ===\")\n", + "print((PROCS / \"subscriber.py\").read_text())" + ] + }, + { + "cell_type": "markdown", + "id": "e17dd705", + "metadata": {}, + "source": [ + "## 1 · Lanzar los procesos y orquestarlos\n", + "\n", + "El notebook actúa de **orquestador**:\n", + "\n", + "1. Lanza los dos subscribers como procesos (`subprocess.Popen`), cada uno con su PID. Les damos 1.5 s para que conecten y se suscriban.\n", + "2. Lanza el publisher, que emite 8 mensajes y termina.\n", + "3. Espera a que los subscribers terminen solos (su `--seconds`) y recoge su stdout.\n", + "\n", + "Usamos `sys.executable` para que los procesos hijos usen el mismo intérprete (con `nats-py` instalado) que el kernel." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f647029e", + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess, sys, json, time\n", + "\n", + "def lanzar_subscriber(nombre, subjects, seconds=4.5):\n", + " return subprocess.Popen(\n", + " [sys.executable, str(PROCS / \"subscriber.py\"),\n", + " \"--name\", nombre, \"--subjects\", subjects, \"--seconds\", str(seconds)],\n", + " stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,\n", + " )\n", + "\n", + "# 1. Subscribers: procesos OS independientes\n", + "procs = {\n", + " \"sub-todo\": lanzar_subscriber(\"sub-todo\", \"telemetria.>\"),\n", + " \"sub-cpu\": lanzar_subscriber(\"sub-cpu\", \"telemetria.cpu\"),\n", + "}\n", + "print(\"Subscribers lanzados (PIDs del SO):\", {n: p.pid for n, p in procs.items()})\n", + "time.sleep(1.5) # que conecten y se suscriban antes de publicar\n", + "\n", + "# 2. Publisher: otro proceso OS, publica 8 mensajes y termina\n", + "pub = subprocess.run(\n", + " [sys.executable, str(PROCS / \"publisher.py\"), \"--count\", \"8\", \"--interval\", \"0.15\"],\n", + " stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,\n", + ")\n", + "pub_eventos = [json.loads(l) for l in pub.stdout.splitlines() if l.strip()]\n", + "print(f\"Publisher (PID {pub_eventos[0]['pid']}) publicó {sum(1 for e in pub_eventos if e['event']=='published')} mensajes\")\n", + "\n", + "# 3. Recoger stdout de los subscribers (terminan solos por --seconds)\n", + "eventos = []\n", + "for nombre, p in procs.items():\n", + " out, err = p.communicate(timeout=10)\n", + " for l in out.splitlines():\n", + " if l.strip():\n", + " eventos.append(json.loads(l))\n", + " if err.strip():\n", + " print(f\"[{nombre} stderr] {err.strip()[:200]}\")\n", + "\n", + "msgs = [e for e in eventos if e[\"event\"] == \"msg\"]\n", + "print(f\"\\nTotal de entregas recibidas entre todos los procesos: {len(msgs)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "33dcf1f4", + "metadata": {}, + "source": [ + "## 2 · Qué recibió cada proceso\n", + "\n", + "Cada subscriber es un PID distinto. `sub-todo` (suscrito a `telemetria.>`) recibe los 8 mensajes; `sub-cpu` (suscrito solo a `telemetria.cpu`) recibe únicamente los 4 de CPU. El broker filtró por subject sin que el publisher supiera nada de ello." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01ae57ed", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "df = pd.DataFrame(msgs)\n", + "# PID por nombre de proceso (demuestra que son procesos distintos)\n", + "pids = {e[\"name\"]: e[\"pid\"] for e in eventos if e[\"event\"] == \"ready\"}\n", + "print(\"PID de cada proceso subscriber:\", pids)\n", + "print()\n", + "\n", + "# Conteo de mensajes por (proceso, subject)\n", + "tabla = df.groupby([\"name\", \"subject\"]).size().unstack(fill_value=0)\n", + "print(\"Mensajes recibidos por proceso y subject:\")\n", + "print(tabla)\n", + "tabla" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a5ee65b", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "resumen = df.groupby(\"name\").size().reindex([\"sub-todo\", \"sub-cpu\"]).fillna(0).astype(int)\n", + "\n", + "fig, ax = plt.subplots(figsize=(7, 3.2))\n", + "barras = ax.bar(resumen.index, resumen.values, color=[\"#7c3aed\", \"#0891b2\"])\n", + "ax.bar_label(barras, padding=3)\n", + "ax.set_ylabel(\"mensajes recibidos\")\n", + "ax.set_title(\"Telemetría recibida por cada PROCESO (8 publicados: 4 cpu + 4 mem)\")\n", + "ax.set_ylim(0, 10)\n", + "for i, name in enumerate(resumen.index):\n", + " ax.text(i, -1.4, f\"PID {pids.get(name, '?')}\\n{('telemetria.>' if name=='sub-todo' else 'telemetria.cpu')}\",\n", + " ha=\"center\", va=\"top\", fontsize=8, color=\"#555\")\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "b8d60d73", + "metadata": {}, + "source": [ + "## 3 · Línea de tiempo de las entregas\n", + "\n", + "Ordenando los mensajes por su marca temporal (`t`, segundos desde que cada proceso arrancó) se ve cómo ambos subscribers reciben los mensajes de CPU casi a la vez (fan-out), mientras que los de memoria solo llegan a `sub-todo`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1656576f", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(figsize=(9, 3))\n", + "colores = {\"telemetria.cpu\": \"#ef4444\", \"telemetria.mem\": \"#3b82f6\"}\n", + "y_de = {\"sub-todo\": 1, \"sub-cpu\": 0}\n", + "for e in msgs:\n", + " ax.scatter(e[\"t\"], y_de[e[\"name\"]], color=colores[e[\"subject\"]], s=80, zorder=3)\n", + "ax.set_yticks([0, 1]); ax.set_yticklabels([\"sub-cpu\", \"sub-todo\"])\n", + "ax.set_xlabel(\"t (segundos desde el arranque de cada proceso)\")\n", + "ax.set_title(\"Timeline de entregas — rojo: telemetria.cpu, azul: telemetria.mem\")\n", + "ax.grid(axis=\"x\", alpha=0.3)\n", + "from matplotlib.patches import Patch\n", + "ax.legend(handles=[Patch(color=c, label=s) for s, c in colores.items()], loc=\"upper right\")\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5914c849", + "metadata": {}, + "source": [ + "## Resumen del análisis\n", + "\n", + "A lo largo de los tres notebooks hemos visto cómo distintos procesos envían datos por pub/sub con NATS:\n", + "\n", + "- **01** — el modelo base: publishers y subscribers desacoplados por un broker, *fan-out* y *wildcards*.\n", + "- **02** — patrones de orden superior: *queue groups* (reparto de carga), *request/reply* (RPC) y *JetStream* (persistencia y replay).\n", + "- **03** — **procesos del SO reales**: el desacople de verdad. El publisher no conoce a sus subscribers; el broker enruta por subject. Añadir o quitar procesos consumidores no cambia ni una línea del publisher.\n", + "\n", + "Esa es la idea central de NATS: **los procesos se comunican por nombres de subject, no por direcciones**, y el broker se encarga del resto.\n", + "\n", + "### Limpieza (opcional)\n", + "\n", + "Para parar el broker cuando termines:\n", + "\n", + "```python\n", + "import subprocess\n", + "subprocess.run([\"docker\", \"stop\", \"nats_demo\"]) # detener\n", + "subprocess.run([\"docker\", \"rm\", \"nats_demo\"]) # eliminar\n", + "```" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/01_core_pubsub.ipynb b/notebooks/01_core_pubsub.ipynb new file mode 100644 index 0000000..9402ea6 --- /dev/null +++ b/notebooks/01_core_pubsub.ipynb @@ -0,0 +1,440 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9cdccc58", + "metadata": {}, + "source": [ + "# NATS pub/sub — 01 · Core publish/subscribe y wildcards\n", + "\n", + "**NATS** es un sistema de mensajería ligero y de alto rendimiento orientado a la comunicación entre procesos (microservicios, IoT, pipelines de datos). Su modelo central es **publish/subscribe** sobre *subjects*.\n", + "\n", + "### Conceptos clave\n", + "\n", + "- **Subject**: una cadena jerárquica separada por puntos, por ejemplo `pedidos.creados` o `sensor.cocina.temp`. Es la *dirección* de un mensaje. No hay que declararlo: existe en cuanto alguien publica o se suscribe.\n", + "- **Publisher**: un proceso que envía un mensaje a un subject. No sabe quién lo va a recibir (ni si alguien lo recibirá).\n", + "- **Subscriber**: un proceso que expresa interés en uno o varios subjects. Recibe todos los mensajes publicados en ellos mientras esté conectado.\n", + "- **Broker (`nats-server`)**: el proceso central que enruta cada mensaje publicado a todos los subscribers interesados. Desacopla a publishers de subscribers: ninguno conoce la dirección de red del otro, solo el broker y el subject.\n", + "\n", + "### Garantías del *core* NATS\n", + "\n", + "El core es **fire-and-forget** (*at-most-once*): si en el momento de publicar no hay ningún subscriber conectado a ese subject, el mensaje se descarta. No hay persistencia ni reintentos. Esto lo hace extremadamente rápido. Cuando se necesita persistencia y *replay* se usa **JetStream** (notebook 02).\n", + "\n", + "En este notebook levantamos un broker en Docker y demostramos: conexión, pub/sub básico, *fan-out* a varios subscribers y *wildcards*." + ] + }, + { + "cell_type": "markdown", + "id": "2078b7a9", + "metadata": {}, + "source": [ + "## 0 · Entorno: el broker NATS en Docker\n", + "\n", + "Levantamos `nats:latest` con el flag `-js` (habilita JetStream, que usaremos en el notebook 02) y publicamos el puerto estándar `4222` en el host. La función `ensure_nats` es **idempotente**: si el contenedor ya existe lo reutiliza, si está parado lo arranca, y solo lo crea si no existe. Así los tres notebooks de este análisis comparten el mismo broker." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f304bf13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Broker NATS: already-running en nats://127.0.0.1:4222\n", + "nats-server version: 2.14.2 | jetstream activo: True\n" + ] + } + ], + "source": [ + "import subprocess, time, json\n", + "\n", + "NATS_CONTAINER = \"nats_demo\"\n", + "NATS_PORT = 4222\n", + "NATS_URL = f\"nats://127.0.0.1:{NATS_PORT}\"\n", + "\n", + "def _docker(*args, check=True):\n", + " return subprocess.run([\"docker\", *args], capture_output=True, text=True, check=check)\n", + "\n", + "def ensure_nats(name=NATS_CONTAINER, port=NATS_PORT):\n", + " \"\"\"Arranca un broker NATS en Docker de forma idempotente. Devuelve el estado.\"\"\"\n", + " out = _docker(\"ps\", \"-a\", \"--filter\", f\"name=^{name}$\", \"--format\", \"{{.State}}\", check=False).stdout.strip()\n", + " if out == \"running\":\n", + " state = \"already-running\"\n", + " elif out in (\"exited\", \"created\", \"paused\"):\n", + " _docker(\"start\", name)\n", + " state = \"started\"\n", + " else:\n", + " _docker(\"run\", \"-d\", \"--name\", name, \"-p\", f\"{port}:4222\", \"-p\", \"8222:8222\",\n", + " \"nats:latest\", \"-js\", \"-m\", \"8222\")\n", + " state = \"created\"\n", + " time.sleep(1.0)\n", + " return state\n", + "\n", + "state = ensure_nats()\n", + "print(f\"Broker NATS: {state} en {NATS_URL}\")\n", + "# El endpoint de monitorización (puerto 8222) expone métricas del servidor en JSON\n", + "import urllib.request\n", + "varz = json.loads(urllib.request.urlopen(\"http://127.0.0.1:8222/varz\", timeout=3).read())\n", + "print(f\"nats-server version: {varz['version']} | jetstream activo: {bool(varz.get('jetstream'))}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e708766a", + "metadata": {}, + "source": [ + "## 1 · Conectar un cliente\n", + "\n", + "Usamos `nats-py`, el cliente oficial para Python basado en `asyncio`. IPython permite usar `await` directamente en las celdas (*top-level await*), así que mantenemos la conexión `nc` viva en una variable global y la reutilizamos a lo largo del notebook, igual que haría un proceso real." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54b982ec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Conectado.\n", + " server_id : NBMS5DILO6BHTJILLYQZCV44PQ7K5JRAAGHW76QTTQKKMFPXDKN3SYDE\n", + " max_payload: 1 MiB por mensaje\n", + " client_id : 14\n" + ] + } + ], + "source": [ + "import asyncio\n", + "import nats\n", + "\n", + "# Conexión persistente del notebook (simula el cliente de un proceso de larga vida)\n", + "nc = await nats.connect(NATS_URL, name=\"notebook-01\")\n", + "info = nc._server_info # metadata que el broker envía en el handshake\n", + "print(\"Conectado.\")\n", + "print(f\" server_id : {info['server_id']}\")\n", + "print(f\" max_payload: {info['max_payload']/1024/1024:.0f} MiB por mensaje\")\n", + "print(f\" client_id : {info['client_id']}\")" + ] + }, + { + "cell_type": "markdown", + "id": "f83e4c5e", + "metadata": {}, + "source": [ + "## 2 · Publish/Subscribe básico\n", + "\n", + "El patrón mínimo: un subscriber declara interés en un subject, un publisher envía un mensaje, el broker lo entrega.\n", + "\n", + "Aquí usamos una **suscripción síncrona** (`sub.next_msg()`), cómoda para ir paso a paso en un notebook: pedimos explícitamente el siguiente mensaje. El payload siempre viaja como `bytes` — NATS no impone formato; aquí codificamos texto UTF-8." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7d5f48e1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "subject recibido : saludos\n", + "payload : hola desde el publisher\n" + ] + } + ], + "source": [ + "# El subscriber declara interés ANTES de que se publique (core = at-most-once)\n", + "sub = await nc.subscribe(\"saludos\")\n", + "\n", + "# El publisher envía. No sabe quién escucha; solo conoce el subject.\n", + "await nc.publish(\"saludos\", b\"hola desde el publisher\")\n", + "await nc.flush() # fuerza el envío al broker antes de seguir\n", + "\n", + "# El subscriber recoge el mensaje\n", + "msg = await sub.next_msg(timeout=2)\n", + "print(f\"subject recibido : {msg.subject}\")\n", + "print(f\"payload : {msg.data.decode()}\")\n", + "\n", + "await sub.unsubscribe()" + ] + }, + { + "cell_type": "markdown", + "id": "544fc965", + "metadata": {}, + "source": [ + "## 3 · Fan-out: un publisher, N subscribers\n", + "\n", + "La potencia del pub/sub es el **fan-out**: cuando varios subscribers están interesados en el mismo subject, el broker entrega una **copia a cada uno**. El publisher hace *una* llamada `publish` y no cambia nada en su código aunque haya 1 o 1000 subscribers.\n", + "\n", + "Aquí registramos 3 subscribers al subject `noticias` mediante *callbacks* asíncronos (cada uno simula un proceso distinto) y publicamos un único mensaje." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c43d65d9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sub-A <- [noticias] titular: NATS entrega a todos\n", + "sub-B <- [noticias] titular: NATS entrega a todos\n", + "sub-C <- [noticias] titular: NATS entrega a todos\n", + "\n", + "Un publish -> 3 entregas (fan-out)\n" + ] + } + ], + "source": [ + "recibidos = [] # registro de quién recibió qué\n", + "\n", + "def make_handler(nombre):\n", + " async def handler(msg):\n", + " recibidos.append({\"subscriber\": nombre, \"subject\": msg.subject, \"data\": msg.data.decode()})\n", + " return handler\n", + "\n", + "# Tres subscribers independientes al MISMO subject\n", + "subs = []\n", + "for nombre in [\"sub-A\", \"sub-B\", \"sub-C\"]:\n", + " s = await nc.subscribe(\"noticias\", cb=make_handler(nombre))\n", + " subs.append(s)\n", + "\n", + "# Un único publish...\n", + "await nc.publish(\"noticias\", b\"titular: NATS entrega a todos\")\n", + "await nc.flush()\n", + "await asyncio.sleep(0.3) # dar tiempo a los callbacks\n", + "\n", + "for r in recibidos:\n", + " print(f\"{r['subscriber']} <- [{r['subject']}] {r['data']}\")\n", + "print()\n", + "print(f\"Un publish -> {len(recibidos)} entregas (fan-out)\")\n", + "\n", + "for s in subs:\n", + " await s.unsubscribe()" + ] + }, + { + "cell_type": "markdown", + "id": "a390783b", + "metadata": {}, + "source": [ + "## 4 · Wildcards: `*` y `>`\n", + "\n", + "Los subjects son jerárquicos y los subscribers pueden usar comodines para suscribirse a familias enteras de subjects:\n", + "\n", + "- **`*`** (asterisco) — comodín de **un único token**. `sensor.*.temp` casa con `sensor.cocina.temp` y `sensor.salon.temp`, pero **no** con `sensor.cocina.planta1.temp`.\n", + "- **`>`** (mayor que) — comodín de **uno o más tokens** hasta el final. `sensor.>` casa con `sensor.cocina.temp`, `sensor.salon.humedad`, `sensor.garaje.puerta.estado`...\n", + "\n", + "Esto permite que un proceso se suscriba a \"todo lo de los sensores\" o \"la temperatura de cualquier habitación\" sin conocer de antemano qué subjects concretos existirán." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c1e8d839", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mensajes publicados: ['sensor.cocina.temp', 'sensor.salon.temp', 'sensor.salon.humedad', 'sensor.garaje.puerta.estado']\n", + "\n", + "[sensor.> ] casó sensor.cocina.temp\n", + "[sensor.> ] casó sensor.salon.temp\n", + "[sensor.> ] casó sensor.salon.humedad\n", + "[sensor.> ] casó sensor.garaje.puerta.estado\n", + "[sensor.*.temp ] casó sensor.cocina.temp\n", + "[sensor.*.temp ] casó sensor.salon.temp\n" + ] + } + ], + "source": [ + "wild = []\n", + "\n", + "async def on_star(msg):\n", + " wild.append({\"patron\": \"sensor.*.temp\", \"subject\": msg.subject, \"data\": msg.data.decode()})\n", + "\n", + "async def on_gt(msg):\n", + " wild.append({\"patron\": \"sensor.>\", \"subject\": msg.subject, \"data\": msg.data.decode()})\n", + "\n", + "s_star = await nc.subscribe(\"sensor.*.temp\", cb=on_star)\n", + "s_gt = await nc.subscribe(\"sensor.>\", cb=on_gt)\n", + "\n", + "# Publicamos en varios subjects concretos\n", + "publicados = {\n", + " \"sensor.cocina.temp\": \"21.5\",\n", + " \"sensor.salon.temp\": \"22.1\",\n", + " \"sensor.salon.humedad\": \"48\",\n", + " \"sensor.garaje.puerta.estado\": \"abierta\",\n", + "}\n", + "for subj, val in publicados.items():\n", + " await nc.publish(subj, val.encode())\n", + "await nc.flush()\n", + "await asyncio.sleep(0.3)\n", + "\n", + "print(\"Mensajes publicados:\", list(publicados))\n", + "print()\n", + "for w in wild:\n", + " print(f\"[{w['patron']:14}] casó {w['subject']}\")\n", + "\n", + "await s_star.unsubscribe(); await s_gt.unsubscribe()" + ] + }, + { + "cell_type": "markdown", + "id": "1bd82c55", + "metadata": {}, + "source": [ + "## 5 · Visualización: qué patrón casó qué subject\n", + "\n", + "Una matriz `subject × patrón` deja claro el alcance de cada comodín: `sensor.>` captura los cuatro subjects; `sensor.*.temp` solo las dos temperaturas de un nivel (no la humedad, que no es `temp`, ni la del garaje, que tiene un token de más)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "01cb9af2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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+umnJLuoAUl2UcuUKZNRFzVra+skHyiESG7qtdljHz58yObNm+ncuTP379+ndOnS9O3bl9GjRwMQFBREoUKF0Ol0zJ49G29vb/r378/Nmzfp3bs3e/fupVSpUixfvpzt27cbLZMA8kUvUoZXe23ExsYSEhKivWZmZsbq1au5ffs2586dY9y4cfzyyy9s2LABgLCwMEJDQ4mNjWXmzJlkzpyZ5s2bkyNHDgBy5sz56S9IiHdgKPc//vgjI0aMMHrt5s2bdO3aldy5c7N8+XKcnJwYMGAAO3bsAP7XzVIpRb58+fDx8WHr1q306dOHcuXKkStXLho3bpzkeaVSW6RmMkYvlTLUTiU1+cOrXdQcHR2BlwugG7qorV27liVLltCqVSsgcRc1Ly+vROeTG51ISQxj414fIzFx4kQWL15M1apVmT9/PvDywbVHjx506dKFatWqUa1aNaNj6tevr6VTunRpSpcuDSQ9zk+IlMDExITY2FhWrlzJ999/z6BBg8ibN6+27unQoUPZsmUL7du3x9TUFG9vbxo2bMjRo0epU6cOZ86cIU+ePNjZ2bFkyZJES4IIkRIZKtoKFiyIiYkJoaGhWqvbli1beP78OePHjwegRo0ajBs3jvLly1O5cmUsLS2NKuoaNmxIcHAwlStXZs6cOdqakUKkNTr1epW4SFViYmLo168fERER1KlTh/bt2wMvb4jt27fHzMyMoKAgSpYsSYkSJejXrx9jx45l0KBBfP3112zbto0iRYqwdOlSo9YLmWBFpAZ79uwhMjISDw8PChQoQEhICB07diR37tz8/vvvWjnOkSMHPXv25McffyQkJIT9+/ezefNm9u3bx8CBA+nZs6dRukopGWgvUgS9Xo+JiYlRedyyZQu///47sbGxDBw4kJIlSyY6TinFvXv3cHJyAqBSpUp8++23dOzYkb///pv79+9ToECBT3YdQvwbb6pwW7duHX5+fty5c4csWbIwbNgw9Ho9+fPnZ/To0URFRdG7d2+6deumHXP+/HmmT5/OxIkTsbCwoF27diQkJDB06FBy5sypTc4iRFoiT/KphHRRE5+rpLonX716lYoVK9KiRQvWrVuHp6cngYGBuLu74+3tzdOnTzl79qxWjn/66SemTp3KixcvMDc3Z8OGDbi5uREWFpYoyAOZTU2kHIaW60ePHmnbsmXLRlhYGCEh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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data", + "transient": {} + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sensor.cocina.tempsensor.salon.tempsensor.salon.humedadsensor.garaje.puerta.estado
sensor.*.temp1100
sensor.>1111
\n", + "
" + ], + "text/plain": [ + " sensor.cocina.temp sensor.salon.temp sensor.salon.humedad \\\n", + "sensor.*.temp 1 1 0 \n", + "sensor.> 1 1 1 \n", + "\n", + " sensor.garaje.puerta.estado \n", + "sensor.*.temp 0 \n", + "sensor.> 1 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "patrones = [\"sensor.*.temp\", \"sensor.>\"]\n", + "subjects = list(publicados)\n", + "\n", + "# Construir matriz de coincidencias a partir de lo que recibió cada suscripción\n", + "M = np.zeros((len(patrones), len(subjects)), dtype=int)\n", + "for w in wild:\n", + " i = patrones.index(w[\"patron\"])\n", + " j = subjects.index(w[\"subject\"])\n", + " M[i, j] = 1\n", + "\n", + "fig, ax = plt.subplots(figsize=(9, 2.6))\n", + "ax.imshow(M, cmap=\"Greens\", vmin=0, vmax=1, aspect=\"auto\")\n", + "ax.set_xticks(range(len(subjects))); ax.set_xticklabels(subjects, rotation=25, ha=\"right\", fontsize=9)\n", + "ax.set_yticks(range(len(patrones))); ax.set_yticklabels(patrones, fontsize=10)\n", + "for i in range(len(patrones)):\n", + " for j in range(len(subjects)):\n", + " ax.text(j, i, \"OK\" if M[i, j] else \"-\", ha=\"center\", va=\"center\",\n", + " color=\"white\" if M[i, j] else \"#999\", fontsize=12)\n", + "ax.set_title(\"Coincidencia de wildcards (OK = el subscriber recibió el mensaje)\")\n", + "plt.tight_layout(); plt.show()\n", + "\n", + "pd.DataFrame(M, index=patrones, columns=subjects)" + ] + }, + { + "cell_type": "markdown", + "id": "26a3785a", + "metadata": {}, + "source": [ + "## Resumen\n", + "\n", + "- El **broker** desacopla publishers y subscribers: solo comparten el *subject*.\n", + "- El core es **fire-and-forget**: sin subscriber conectado, el mensaje se pierde.\n", + "- **Fan-out** automático: una publicación llega a todos los subscribers interesados.\n", + "- **Wildcards** `*` (un token) y `>` (resto de la jerarquía) permiten suscribirse a familias de subjects.\n", + "\n", + "**Siguiente** → `02_queue_request_jetstream.ipynb`: repartir carga entre workers (*queue groups*), RPC (*request/reply*) y mensajería **persistente** con JetStream.\n", + "\n", + "> La conexión `nc` y el contenedor `nats_demo` siguen vivos para los siguientes notebooks." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/02_queue_request_jetstream.ipynb b/notebooks/02_queue_request_jetstream.ipynb new file mode 100644 index 0000000..99d90a4 --- /dev/null +++ b/notebooks/02_queue_request_jetstream.ipynb @@ -0,0 +1,391 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a5e95055", + "metadata": {}, + "source": [ + "# NATS pub/sub — 02 · Queue groups, Request/Reply y JetStream\n", + "\n", + "En el notebook 01 vimos el *fan-out* del core: una publicación llega a **todos** los subscribers. Aquí cubrimos tres patrones que construyen sobre esa base:\n", + "\n", + "1. **Queue groups** — repartir la carga: varios *workers* comparten el trabajo y cada mensaje lo procesa **uno solo**.\n", + "2. **Request/Reply** — RPC sobre mensajería: un cliente pregunta y espera la respuesta de un servicio.\n", + "3. **JetStream** — la capa de **persistencia**: streams que almacenan los mensajes y permiten *replay*, a diferencia del core *fire-and-forget*.\n", + "\n", + "> Requiere el broker `nats_demo` del notebook 01. La primera celda lo arranca de forma idempotente, así que este notebook también funciona de forma aislada." + ] + }, + { + "cell_type": "markdown", + "id": "1ab4e0d1", + "metadata": {}, + "source": [ + "## 0 · Setup: broker + conexión\n", + "\n", + "Reutilizamos el mismo broker en Docker. `ensure_nats` es idempotente; si el contenedor sigue vivo del notebook 01, simplemente se reaprovecha." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f17ec9ef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Broker: already-running\n", + "Conectado, client_id: 15\n" + ] + } + ], + "source": [ + "import subprocess, time, json\n", + "\n", + "NATS_CONTAINER = \"nats_demo\"\n", + "NATS_PORT = 4222\n", + "NATS_URL = f\"nats://127.0.0.1:{NATS_PORT}\"\n", + "\n", + "def _docker(*args, check=True):\n", + " return subprocess.run([\"docker\", *args], capture_output=True, text=True, check=check)\n", + "\n", + "def ensure_nats(name=NATS_CONTAINER, port=NATS_PORT):\n", + " \"\"\"Arranca un broker NATS en Docker de forma idempotente. Devuelve el estado.\"\"\"\n", + " out = _docker(\"ps\", \"-a\", \"--filter\", f\"name=^{name}$\", \"--format\", \"{{.State}}\", check=False).stdout.strip()\n", + " if out == \"running\":\n", + " state = \"already-running\"\n", + " elif out in (\"exited\", \"created\", \"paused\"):\n", + " _docker(\"start\", name)\n", + " state = \"started\"\n", + " else:\n", + " _docker(\"run\", \"-d\", \"--name\", name, \"-p\", f\"{port}:4222\", \"-p\", \"8222:8222\",\n", + " \"nats:latest\", \"-js\", \"-m\", \"8222\")\n", + " state = \"created\"\n", + " time.sleep(1.0)\n", + " return state\n", + "\n", + "import asyncio\n", + "import nats\n", + "\n", + "print(\"Broker:\", ensure_nats())\n", + "nc = await nats.connect(NATS_URL, name=\"notebook-02\")\n", + "print(\"Conectado, client_id:\", nc._server_info[\"client_id\"])" + ] + }, + { + "cell_type": "markdown", + "id": "6736be4f", + "metadata": {}, + "source": [ + "## 1 · Queue groups — reparto de carga entre workers\n", + "\n", + "Un **queue group** convierte el fan-out en una **cola de trabajo**. Varios subscribers se suscriben al mismo subject pero declarando el mismo nombre de *queue*. El broker entonces entrega cada mensaje a **exactamente uno** de los miembros del grupo (balanceo de carga), en lugar de a todos.\n", + "\n", + "Es el patrón de los *worker pools*: escalas el procesamiento añadiendo más workers al grupo, sin tocar al publisher. Si un worker cae, los demás siguen recibiendo. Aquí lanzamos 3 workers en el queue `procesadores` y publicamos 12 tareas." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "630b847e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reparto de carga (cada tarea fue a UN solo worker):\n", + " worker-1: 7 tareas\n", + " worker-3: 5 tareas\n", + " TOTAL procesado: 12 de 12 tareas\n" + ] + } + ], + "source": [ + "from collections import Counter\n", + "\n", + "trabajo = Counter() # cuántas tareas procesó cada worker\n", + "orden = [] # traza temporal (worker, tarea)\n", + "\n", + "def make_worker(nombre):\n", + " async def worker(msg):\n", + " tarea = msg.data.decode()\n", + " trabajo[nombre] += 1\n", + " orden.append((nombre, tarea))\n", + " return worker\n", + "\n", + "# 3 workers, MISMO subject, MISMO queue group -> NATS reparte\n", + "workers = []\n", + "for nombre in [\"worker-1\", \"worker-2\", \"worker-3\"]:\n", + " s = await nc.subscribe(\"tareas\", queue=\"procesadores\", cb=make_worker(nombre))\n", + " workers.append(s)\n", + "\n", + "# Publicar 12 tareas\n", + "for i in range(12):\n", + " await nc.publish(\"tareas\", f\"tarea-{i:02d}\".encode())\n", + "await nc.flush()\n", + "await asyncio.sleep(0.5)\n", + "\n", + "print(\"Reparto de carga (cada tarea fue a UN solo worker):\")\n", + "for w, n in sorted(trabajo.items()):\n", + " print(f\" {w}: {n} tareas\")\n", + "print(f\" TOTAL procesado: {sum(trabajo.values())} de 12 tareas\")\n", + "\n", + "for s in workers:\n", + " await s.unsubscribe()" + ] + }, + { + "cell_type": "markdown", + "id": "5b390568", + "metadata": {}, + "source": [ + "### Visualización del reparto\n", + "\n", + "El total siempre suma 12 (ninguna tarea se duplica ni se pierde), repartido de forma aproximadamente equilibrada entre los workers." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3d9bbd36", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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IiLSNSayleCjjz7CRx99pO8wdOrQoUMYN24c+vbtCxsbGxw9ehTffPMNmjRpgr59++o7PCIiInoFMJGlcnFzc4OLiwsWL16Me/fuoVatWnjvvfcwa9asYpPcExEREVUEjpElIiIiIoPEeWSJiIiIyCAxkSUiIiIig2TQY2SLiopw8+ZNWFpaSv4JPCIiIiKqeoQQyM3NhZOTE4yMSu9zNehE9ubNm3BxcdF3GERERESkY9euXUOdOnVKrWPQiazypzavXbsGKysrPUdDRERERC8qJycHLi4uqjyvNAadyCqHE1hZWTGRJSIiInqJaDNslDd7EREREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAZJr4lsYWEhpkyZgrp168Lc3BweHh749NNPIYTQZ1hEREREZACq6XPjs2fPRlxcHNasWYPGjRvj8OHDCA8Ph0KhwOjRo/UZGhERERFVcXpNZP/66y+888476Nq1KwDAzc0N69evx99//63PsIiIiIjIAOh1aEHr1q2RkJCACxcuAACOHz+O/fv3o3Pnzhrr5+XlIScnR+2PiIiIiF5Neu2RnThxInJycuDp6QljY2MUFhZi+vTpGDRokMb6M2fORGxsbCVHSURERERVkV57ZDdu3IjvvvsO33//PY4ePYo1a9Zg7ty5WLNmjcb6kyZNQnZ2turv2rVrlRwxEREREVUVMqHHKQJcXFwwceJEREVFqco+++wzrFu3DufOnStz+ZycHCgUCmRnZ8PKyqoiQyUiIiKiSiAlv9Nrj+zDhw9hZKQegrGxMYqKivQUEREREREZCr2Oke3WrRumT5+O1157DY0bN8axY8cwf/58RERE6DMsIiIiIjIAeh1akJubiylTpmDr1q1IS0uDk5MTQkJCMHXqVJiampa5PIcWEBEREb1cpOR3ek1kXxQTWSIiIqKXi8GMkSUiIiIiKi8mslSp3NzcIJPJiv09O3MFERERkTb0erMXvXqSk5NRWFioenzq1Cl06NABffv21WNUREREZIiYyFKlsrW1VXs8a9Ys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REREJZI8tGDu3Lno1KkTvLy88PjxYwwcOBAXL15E7dq1sX79+oqIkYiIiIioGMmJrIuLC44fP44NGzbg+PHjuH//PoYMGYJBgwap3fxFRERERFSRJCWyT548gaenJ+Lj4zFo0CAMGjSoouIiIiIiIiqVpDGyJiYmePz4cUXFQkRERESkNck3e0VFRWH27NkoKCioiHiIiIiIiLQieYxscnIyEhISsHPnTjRt2hQWFhZqz2/ZskVnwRERERERlURyImttbY3evXtXRCxERERERFqTnMiuWrWqIuIgIiIiIpJE8hhZIiIiIqKqQHKPLABs2rQJGzduRGpqKvLz89WeO3r0qE4CIyIiIiIqjeQe2cWLFyM8PBz29vY4duwYWrRoARsbG/z777/o3LlzRcRIRERERFSM5ER26dKlWLFiBb744guYmpriww8/xK5duzB69GhkZ2dXRIxERERERMVITmRTU1PRunVrAIC5uTlyc3MBAO+++y7Wr1+v2+iIiIiIiEogOZF1cHDAvXv3AACvvfYaDh06BAC4cuUKhBC6jY6IiIiIqASSE9l27drh559/BgCEh4dj3Lhx6NChA/r374+ePXvqPEAiIiIiIk0kz1qwYsUKFBUVAXj6c7U2Njb466+/0L17dwwbNkzSumbOnIktW7bg3LlzMDc3R+vWrTF79mw0bNhQalhERERE9IqR3CN7/fp1GBsbqx4PGDAAixcvxqhRo3D79m1J69q7dy+ioqJw6NAh7Nq1C0+ePEHHjh3x4MEDqWERERER0StGco9s3bp1cevWLdjZ2amV37t3D3Xr1kVhYaHW69qxY4fa49WrV8POzg5HjhxBQECA1NCIiIiI6BUiuUdWCAGZTFas/P79+zAzM3uhYJTTd9WqVeuF1kNERERELz+te2Sjo6MBADKZDFOmTEH16tVVzxUWFiIpKQnNmjUrdyBFRUUYO3Ys/Pz80KRJE4118vLykJeXp3qck5NT7u0RERERkWHTOpE9duwYgKc9sidPnoSpqanqOVNTU3h7e2P8+PHlDiQqKgqnTp3C/v37S6wzc+ZMxMbGlnsbRERERPTy0DqR3bNnD4CnU24tWrQIVlZWOgti1KhRiI+Px759+1CnTp0S602aNEnVMww87ZF1cXHRWRxEREREZDgk3+y1atUqnW1cCIEPPvgAW7duxZ9//om6deuWWl8ul0Mul+ts+0RERERkuCQnsroUFRWF77//Htu2bYOlpaVq+i6FQgFzc3N9hkZEREREVZzkWQt0KS4uDtnZ2Wjbti0cHR1Vfxs2bNBnWERERERkAPTaIyuE0OfmiYiIiMiA6bVHloiIiIiovJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRERERAaJiSwRERERGSQmskRERERkkJjIEhEREZFBYiJLRGQAvvzyS7i5ucHMzAwtW7bE33//re+QiIj0joksEVEVt2HDBkRHRyMmJgZHjx6Ft7c3goODkZaWpu/QiIj0ioksEVEVN3/+fERGRiI8PBxeXl5YtmwZqlevjpUrV+o7NCIivWIiS0RUheXn5+PIkSNo3769qszIyAjt27fHwYMH9RgZEZH+MZElIqrCMjIyUFhYCHt7e7Vye3t73L59W09RERFVDUxkiYiIiMggMZElIqrCateuDWNjY9y5c0et/M6dO3BwcNBTVEREVQMTWSKiKszU1BQ+Pj5ISEhQlRUVFSEhIQGtWrXSY2RERPpXTd8BEBFR6aKjoxEWFgZfX1+0aNECCxcuxIMHDxAeHq7v0IiI9IqJLBFRFde/f3+kp6dj6tSpuH37Npo1a4YdO3YUuwGMiOhVw0SWiMgAjBo1CqNGjdJ3GEREVQrHyBIRERGRQWIiS0REREQGqUoksl9++SXc3NxgZmaGli1b4u+//9Z3SERERERUxek9kd2wYQOio6MRExODo0ePwtvbG8HBwUhLS9N3aERERERUhek9kZ0/fz4iIyMRHh4OLy8vLFu2DNWrV8fKlSv1HRoRERERVWF6nbUgPz8fR44cwaRJk1RlRkZGaN++PQ4ePFisfl5eHvLy8lSPs7OzAQA5OTkVH+wzCvNzK3V7RKXJyTHVdwhEpGO5hXllVyKqJJWdZym3J4Qos65eE9mMjAwUFhYWmwvR3t4e586dK1Z/5syZiI2NLVbu4uJSYTESVXWKtfqOgIiI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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data", + "transient": {} + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "nombres = [f\"worker-{i}\" for i in (1, 2, 3)]\n", + "valores = [trabajo.get(n, 0) for n in nombres]\n", + "\n", + "fig, ax = plt.subplots(figsize=(7, 3))\n", + "barras = ax.bar(nombres, valores, color=[\"#2563eb\", \"#16a34a\", \"#db2777\"])\n", + "ax.bar_label(barras, padding=3)\n", + "ax.set_ylabel(\"tareas procesadas\")\n", + "ax.set_title(f\"Queue group 'procesadores' — 12 tareas repartidas entre {len(nombres)} workers\")\n", + "ax.set_ylim(0, max(valores) + 2)\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "fd720547", + "metadata": {}, + "source": [ + "## 2 · Request/Reply — RPC sobre NATS\n", + "\n", + "NATS implementa **petición/respuesta** sobre el mismo modelo pub/sub. El cliente usa `nc.request(subject, datos)`: por debajo, NATS crea un subject de respuesta temporal único (un *inbox*), lo adjunta al mensaje y espera la primera respuesta que llegue a ese inbox.\n", + "\n", + "El servicio se suscribe al subject, procesa, y responde con `msg.respond(datos)`. Esto da RPC con descubrimiento automático (el cliente no conoce la dirección del servicio, solo el subject) y *timeouts* integrados. Si varios servicios escuchan en un queue group, además se balancea la carga de las peticiones." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6a0f9d88", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " peticion : 'hola mundo'\n", + " respuesta: 'HOLA MUNDO' (vino por el inbox _INBOX.kmbvFiNMylb4SeFIS6GIZi.kmbvFiNMylb4SeFIS6GIdz68d9)\n", + "\n", + " peticion : 'nats request reply'\n", + " respuesta: 'NATS REQUEST REPLY' (vino por el inbox _INBOX.kmbvFiNMylb4SeFIS6GIZi.kmbvFiNMylb4SeFIS6GIiG3daa)\n", + "\n", + " peticion : 'desacople total'\n", + " respuesta: 'DESACOPLE TOTAL' (vino por el inbox _INBOX.kmbvFiNMylb4SeFIS6GIZi.kmbvFiNMylb4SeFIS6GImX083f)\n", + "\n", + "servicio.inexistente -> NoRespondersError: el broker confirma que no hay ningún servicio escuchando\n" + ] + } + ], + "source": [ + "import nats.errors\n", + "\n", + "# Servicio: convierte el texto recibido a mayúsculas y responde\n", + "async def servicio_mayusculas(msg):\n", + " respuesta = msg.data.decode().upper()\n", + " await msg.respond(respuesta.encode())\n", + "\n", + "sub_svc = await nc.subscribe(\"servicio.mayusculas\", cb=servicio_mayusculas)\n", + "\n", + "# Cliente: pide y espera respuesta (con timeout)\n", + "peticiones = [\"hola mundo\", \"nats request reply\", \"desacople total\"]\n", + "for texto in peticiones:\n", + " resp = await nc.request(\"servicio.mayusculas\", texto.encode(), timeout=1.0)\n", + " print(f\" peticion : {texto!r}\")\n", + " print(f\" respuesta: {resp.data.decode()!r} (vino por el inbox {resp.subject})\")\n", + " print()\n", + "\n", + "# ¿Qué pasa si nadie escucha el subject? El broker avisa al instante con\n", + "# NoRespondersError (no hace falta esperar al timeout completo).\n", + "try:\n", + " await nc.request(\"servicio.inexistente\", b\"hay alguien?\", timeout=0.5)\n", + "except nats.errors.NoRespondersError:\n", + " print(\"servicio.inexistente -> NoRespondersError: el broker confirma que no hay ningún servicio escuchando\")\n", + "except (nats.errors.TimeoutError, asyncio.TimeoutError):\n", + " print(\"servicio.inexistente -> TimeoutError: nadie respondió a tiempo\")\n", + "\n", + "await sub_svc.unsubscribe()" + ] + }, + { + "cell_type": "markdown", + "id": "c8d7cea4", + "metadata": {}, + "source": [ + "## 3 · JetStream — persistencia y replay\n", + "\n", + "Todo lo anterior es **efímero**: si no hay nadie escuchando en el instante exacto de la publicación, el mensaje se pierde. **JetStream** añade una capa de almacenamiento:\n", + "\n", + "- Un **stream** captura y persiste todos los mensajes de unos subjects dados.\n", + "- Los **consumers** leen del stream a su ritmo, pueden ser **durables** (recuerdan por dónde iban) y permiten **replay** de mensajes históricos.\n", + "\n", + "Demostramos la diferencia clave con el core: publicamos a un stream **sin ningún consumidor activo** y, *después*, creamos un consumidor que recupera todos esos mensajes." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "aa891890", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Stream creado: EVENTOS subjects=['eventos.>'] storage=file\n", + " publicado eventos.click -> stream='EVENTOS' seq=1\n", + " publicado eventos.click -> stream='EVENTOS' seq=2\n", + " publicado eventos.click -> stream='EVENTOS' seq=3\n", + " publicado eventos.click -> stream='EVENTOS' seq=4\n", + " publicado eventos.click -> stream='EVENTOS' seq=5\n", + "\n", + "Mensajes retenidos en el stream: 5 (siguen ahí aunque nadie los haya leído)\n" + ] + } + ], + "source": [ + "js = nc.jetstream()\n", + "\n", + "# Crear (o recrear limpio) un stream que persiste todo lo de 'eventos.>'\n", + "try:\n", + " await js.delete_stream(\"EVENTOS\")\n", + "except Exception:\n", + " pass\n", + "stream = await js.add_stream(name=\"EVENTOS\", subjects=[\"eventos.>\"])\n", + "print(f\"Stream creado: {stream.config.name} subjects={stream.config.subjects} storage={stream.config.storage}\")\n", + "\n", + "# Publicar 5 eventos SIN que haya ningún consumidor escuchando todavía\n", + "for i in range(5):\n", + " ack = await js.publish(\"eventos.click\", f\"evento #{i}\".encode())\n", + " print(f\" publicado eventos.click -> stream='{ack.stream}' seq={ack.seq}\")\n", + "\n", + "estado = (await js.stream_info(\"EVENTOS\")).state\n", + "print()\n", + "print(f\"Mensajes retenidos en el stream: {estado.messages} (siguen ahí aunque nadie los haya leído)\")" + ] + }, + { + "cell_type": "markdown", + "id": "ff7c086f", + "metadata": {}, + "source": [ + "### Replay: leer los mensajes históricos\n", + "\n", + "Ahora creamos un **consumer durable** (`lector-eventos`) y hacemos *fetch*. Recuperamos los 5 mensajes que se publicaron **antes** de que este consumidor existiera — algo imposible con el core NATS." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "04be5410", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Recuperados 5 mensajes del stream (replay):\n", + " seq=1 subject=eventos.click data='evento #0'\n", + " seq=2 subject=eventos.click data='evento #1'\n", + " seq=3 subject=eventos.click data='evento #2'\n", + " seq=4 subject=eventos.click data='evento #3'\n", + " seq=5 subject=eventos.click data='evento #4'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Segundo fetch tras ack: 0 mensajes (el durable recuerda que ya los leyó)\n" + ] + } + ], + "source": [ + "# Pull consumer durable: pedimos los mensajes bajo demanda\n", + "psub = await js.pull_subscribe(\"eventos.>\", durable=\"lector-eventos\")\n", + "\n", + "mensajes = await psub.fetch(5, timeout=2)\n", + "print(f\"Recuperados {len(mensajes)} mensajes del stream (replay):\")\n", + "for m in mensajes:\n", + " print(f\" seq={m.metadata.sequence.stream} subject={m.subject} data={m.data.decode()!r}\")\n", + " await m.ack() # confirmamos el procesado; el durable avanza su cursor\n", + "\n", + "# Tras el ack, un segundo fetch no devuelve nada nuevo (cursor avanzado)\n", + "try:\n", + " extra = await psub.fetch(1, timeout=1)\n", + "except Exception:\n", + " extra = []\n", + "print()\n", + "print(f\"Segundo fetch tras ack: {len(extra)} mensajes (el durable recuerda que ya los leyó)\")" + ] + }, + { + "cell_type": "markdown", + "id": "9742fa68", + "metadata": {}, + "source": [ + "## Resumen\n", + "\n", + "| Patrón | Entrega | Persistencia | Caso de uso |\n", + "|---|---|---|---|\n", + "| Core pub/sub (nb 01) | a **todos** los subscribers | no (at-most-once) | eventos en vivo, telemetría |\n", + "| **Queue group** | a **uno** del grupo | no | *worker pool*, reparto de carga |\n", + "| **Request/Reply** | a uno, con respuesta | no | RPC, servicios |\n", + "| **JetStream** | configurable + **replay** | **sí** | event sourcing, colas durables, auditoría |\n", + "\n", + "**Siguiente** → `03_procesos_reales.ipynb`: hasta ahora todo ha ocurrido dentro de un mismo kernel. Allí lanzamos publisher y subscribers como **procesos del sistema operativo independientes** para ver el desacople real." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/03_procesos_reales.ipynb b/notebooks/03_procesos_reales.ipynb new file mode 100644 index 0000000..9e5d425 --- /dev/null +++ b/notebooks/03_procesos_reales.ipynb @@ -0,0 +1,518 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "05860b9f", + "metadata": {}, + "source": [ + "# NATS pub/sub — 03 · Procesos del sistema operativo reales\n", + "\n", + "En los notebooks 01 y 02 todo ocurrió dentro de un mismo kernel: varias conexiones `asyncio` simulaban procesos distintos. Eso es cómodo para explicar, pero NATS brilla precisamente cuando los participantes son **procesos del sistema operativo separados** —incluso en máquinas distintas— que solo comparten la dirección del broker y los nombres de subject.\n", + "\n", + "Aquí lanzamos **procesos reales** con `subprocess`:\n", + "\n", + "- un **publisher** (`procs/publisher.py`) que emite telemetría a `telemetria.cpu` y `telemetria.mem`;\n", + "- dos **subscribers** independientes (`procs/subscriber.py`), cada uno con su propio PID:\n", + " - `sub-todo` escucha `telemetria.>` (toda la telemetría),\n", + " - `sub-cpu` escucha solo `telemetria.cpu`.\n", + "\n", + "Cada proceso abre su propia conexión al broker. El publisher **no sabe** cuántos subscribers hay ni qué escuchan: solo publica a un subject. Ese es el desacople real." + ] + }, + { + "cell_type": "markdown", + "id": "c5127085", + "metadata": {}, + "source": [ + "## 0 · Broker + scripts de los procesos\n", + "\n", + "Arrancamos el broker (idempotente) y mostramos el código de los dos scripts que vamos a lanzar como procesos. Cada uno es un programa autónomo que se conecta a `nats://127.0.0.1:4222` y emite eventos como líneas JSON en su stdout, que el notebook recogerá." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bb720c29", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Broker: already-running\n", + "Scripts de proceso en: /home/enmanuel/fn_registry/analysis/nats/notebooks/procs\n", + "\n", + "=== procs/publisher.py ===\n", + "#!/usr/bin/env python3\n", + "\"\"\"Publisher NATS como proceso del sistema operativo independiente.\n", + "\n", + "Se conecta al broker y publica una rafaga de mensajes de telemetria,\n", + "alternando entre los subjects `telemetria.cpu` y `telemetria.mem`.\n", + "No sabe ni le importa cuantos subscribers hay escuchando: solo conoce el\n", + "subject. Emite cada publicacion como linea JSON en stdout.\n", + "\"\"\"\n", + "import argparse\n", + "import asyncio\n", + "import json\n", + "import os\n", + "import random\n", + "import time\n", + "\n", + "import nats\n", + "\n", + "NATS_URL = \"nats://127.0.0.1:4222\"\n", + "\n", + "\n", + "def emit(event: dict) -> None:\n", + " print(json.dumps(event), flush=True)\n", + "\n", + "\n", + "async def main(count: int, interval: float) -> None:\n", + " pid = os.getpid()\n", + " nc = await nats.connect(NATS_URL, name=\"publisher\")\n", + " emit({\"event\": \"ready\", \"pid\": pid, \"name\": \"publisher\"})\n", + "\n", + " for i in range(count):\n", + " subject = \"telemetria.cpu\" if i % 2 == 0 else \"telemetria.mem\"\n", + " payload = json.dumps({\"i\": i, \"valor\": round(random.uniform(0, 100), 1)})\n", + " await nc.publish(subject, payload.encode())\n", + " emit({\"event\": \"published\", \"pid\": pid, \"subject\": subject, \"i\": i})\n", + " await asyncio.sleep(interval)\n", + "\n", + " await nc.flush()\n", + " emit({\"event\": \"done\", \"pid\": pid, \"name\": \"publisher\", \"published\": count})\n", + " await nc.drain()\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " parser = argparse.ArgumentParser(description=\"Publisher NATS de demostracion\")\n", + " parser.add_argument(\"--count\", type=int, default=8, help=\"Numero de mensajes a publicar\")\n", + " parser.add_argument(\"--interval\", type=float, default=0.15,\n", + " help=\"Segundos entre publicaciones\")\n", + " args = parser.parse_args()\n", + " asyncio.run(main(args.count, args.interval))\n", + "\n" + ] + } + ], + "source": [ + "import subprocess, time, json\n", + "\n", + "NATS_CONTAINER = \"nats_demo\"\n", + "NATS_PORT = 4222\n", + "NATS_URL = f\"nats://127.0.0.1:{NATS_PORT}\"\n", + "\n", + "def _docker(*args, check=True):\n", + " return subprocess.run([\"docker\", *args], capture_output=True, text=True, check=check)\n", + "\n", + "def ensure_nats(name=NATS_CONTAINER, port=NATS_PORT):\n", + " \"\"\"Arranca un broker NATS en Docker de forma idempotente. Devuelve el estado.\"\"\"\n", + " out = _docker(\"ps\", \"-a\", \"--filter\", f\"name=^{name}$\", \"--format\", \"{{.State}}\", check=False).stdout.strip()\n", + " if out == \"running\":\n", + " state = \"already-running\"\n", + " elif out in (\"exited\", \"created\", \"paused\"):\n", + " _docker(\"start\", name)\n", + " state = \"started\"\n", + " else:\n", + " _docker(\"run\", \"-d\", \"--name\", name, \"-p\", f\"{port}:4222\", \"-p\", \"8222:8222\",\n", + " \"nats:latest\", \"-js\", \"-m\", \"8222\")\n", + " state = \"created\"\n", + " time.sleep(1.0)\n", + " return state\n", + "\n", + "from pathlib import Path\n", + "\n", + "PROCS = Path(r\"/home/enmanuel/fn_registry/analysis/nats/notebooks/procs\")\n", + "print(\"Broker:\", ensure_nats())\n", + "print(\"Scripts de proceso en:\", PROCS)\n", + "print()\n", + "print(\"=== procs/publisher.py ===\")\n", + "print(Path(PROCS / \"publisher.py\").read_text())" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3412b705", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== procs/subscriber.py ===\n", + "#!/usr/bin/env python3\n", + "\"\"\"Subscriber NATS como proceso del sistema operativo independiente.\n", + "\n", + "Se conecta al broker, se suscribe a uno o varios subjects y emite cada evento\n", + "como una linea JSON en stdout para que el proceso padre (el notebook) la lea.\n", + "Termina solo tras `--seconds` segundos.\n", + "\"\"\"\n", + "import argparse\n", + "import asyncio\n", + "import json\n", + "import os\n", + "import time\n", + "\n", + "import nats\n", + "\n", + "NATS_URL = \"nats://127.0.0.1:4222\"\n", + "\n", + "\n", + "def emit(event: dict) -> None:\n", + " \"\"\"Escribe un evento como linea JSON en stdout, con flush inmediato.\"\"\"\n", + " print(json.dumps(event), flush=True)\n", + "\n", + "\n", + "async def main(name: str, subjects: list[str], seconds: float) -> None:\n", + " pid = os.getpid()\n", + " nc = await nats.connect(NATS_URL, name=name)\n", + " received = 0\n", + " t0 = time.monotonic()\n", + "\n", + " async def handler(msg):\n", + " nonlocal received\n", + " received += 1\n", + " emit({\n", + " \"event\": \"msg\",\n", + " \"pid\": pid,\n", + " \"name\": name,\n", + " \"subject\": msg.subject,\n", + " \"data\": msg.data.decode(),\n", + " \"t\": round(time.monotonic() - t0, 4),\n", + " })\n", + "\n", + " for subject in subjects:\n", + " await nc.subscribe(subject, cb=handler)\n", + "\n", + " # Senal de que este proceso ya esta escuchando (el padre la espera).\n", + " emit({\"event\": \"ready\", \"pid\": pid, \"name\": name, \"subjects\": subjects})\n", + "\n", + " await asyncio.sleep(seconds)\n", + " emit({\"event\": \"done\", \"pid\": pid, \"name\": name, \"received\": received})\n", + " await nc.drain()\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " parser = argparse.ArgumentParser(description=\"Subscriber NATS de demostracion\")\n", + " parser.add_argument(\"--name\", required=True, help=\"Nombre logico del subscriber\")\n", + " parser.add_argument(\"--subjects\", required=True,\n", + " help=\"Subjects separados por coma (admite wildcards)\")\n", + " parser.add_argument(\"--seconds\", type=float, default=4.0,\n", + " help=\"Tiempo de escucha antes de terminar\")\n", + " args = parser.parse_args()\n", + " asyncio.run(main(args.name, args.subjects.split(\",\"), args.seconds))\n", + "\n" + ] + } + ], + "source": [ + "print(\"=== procs/subscriber.py ===\")\n", + "print((PROCS / \"subscriber.py\").read_text())" + ] + }, + { + "cell_type": "markdown", + "id": "e17dd705", + "metadata": {}, + "source": [ + "## 1 · Lanzar los procesos y orquestarlos\n", + "\n", + "El notebook actúa de **orquestador**:\n", + "\n", + "1. Lanza los dos subscribers como procesos (`subprocess.Popen`), cada uno con su PID. Les damos 1.5 s para que conecten y se suscriban.\n", + "2. Lanza el publisher, que emite 8 mensajes y termina.\n", + "3. Espera a que los subscribers terminen solos (su `--seconds`) y recoge su stdout.\n", + "\n", + "Usamos `sys.executable` para que los procesos hijos usen el mismo intérprete (con `nats-py` instalado) que el kernel." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f647029e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subscribers lanzados (PIDs del SO): {'sub-todo': 4191523, 'sub-cpu': 4191524}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Publisher (PID 4191735) publicó 8 mensajes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Total de entregas recibidas entre todos los procesos: 12\n" + ] + } + ], + "source": [ + "import subprocess, sys, json, time\n", + "\n", + "def lanzar_subscriber(nombre, subjects, seconds=4.5):\n", + " return subprocess.Popen(\n", + " [sys.executable, str(PROCS / \"subscriber.py\"),\n", + " \"--name\", nombre, \"--subjects\", subjects, \"--seconds\", str(seconds)],\n", + " stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,\n", + " )\n", + "\n", + "# 1. Subscribers: procesos OS independientes\n", + "procs = {\n", + " \"sub-todo\": lanzar_subscriber(\"sub-todo\", \"telemetria.>\"),\n", + " \"sub-cpu\": lanzar_subscriber(\"sub-cpu\", \"telemetria.cpu\"),\n", + "}\n", + "print(\"Subscribers lanzados (PIDs del SO):\", {n: p.pid for n, p in procs.items()})\n", + "time.sleep(1.5) # que conecten y se suscriban antes de publicar\n", + "\n", + "# 2. Publisher: otro proceso OS, publica 8 mensajes y termina\n", + "pub = subprocess.run(\n", + " [sys.executable, str(PROCS / \"publisher.py\"), \"--count\", \"8\", \"--interval\", \"0.15\"],\n", + " stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,\n", + ")\n", + "pub_eventos = [json.loads(l) for l in pub.stdout.splitlines() if l.strip()]\n", + "print(f\"Publisher (PID {pub_eventos[0]['pid']}) publicó {sum(1 for e in pub_eventos if e['event']=='published')} mensajes\")\n", + "\n", + "# 3. Recoger stdout de los subscribers (terminan solos por --seconds)\n", + "eventos = []\n", + "for nombre, p in procs.items():\n", + " out, err = p.communicate(timeout=10)\n", + " for l in out.splitlines():\n", + " if l.strip():\n", + " eventos.append(json.loads(l))\n", + " if err.strip():\n", + " print(f\"[{nombre} stderr] {err.strip()[:200]}\")\n", + "\n", + "msgs = [e for e in eventos if e[\"event\"] == \"msg\"]\n", + "print(f\"\\nTotal de entregas recibidas entre todos los procesos: {len(msgs)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "33dcf1f4", + "metadata": {}, + "source": [ + "## 2 · Qué recibió cada proceso\n", + "\n", + "Cada subscriber es un PID distinto. `sub-todo` (suscrito a `telemetria.>`) recibe los 8 mensajes; `sub-cpu` (suscrito solo a `telemetria.cpu`) recibe únicamente los 4 de CPU. El broker filtró por subject sin que el publisher supiera nada de ello." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "01ae57ed", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PID de cada proceso subscriber: {'sub-todo': 4191523, 'sub-cpu': 4191524}\n", + "\n", + "Mensajes recibidos por proceso y subject:\n", + "subject telemetria.cpu telemetria.mem\n", + "name \n", + "sub-cpu 4 0\n", + "sub-todo 4 4\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjecttelemetria.cputelemetria.mem
name
sub-cpu40
sub-todo44
\n", + "
" + ], + "text/plain": [ + "subject telemetria.cpu telemetria.mem\n", + "name \n", + "sub-cpu 4 0\n", + "sub-todo 4 4" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "df = pd.DataFrame(msgs)\n", + "# PID por nombre de proceso (demuestra que son procesos distintos)\n", + "pids = {e[\"name\"]: e[\"pid\"] for e in eventos if e[\"event\"] == \"ready\"}\n", + "print(\"PID de cada proceso subscriber:\", pids)\n", + "print()\n", + "\n", + "# Conteo de mensajes por (proceso, subject)\n", + "tabla = df.groupby([\"name\", \"subject\"]).size().unstack(fill_value=0)\n", + "print(\"Mensajes recibidos por proceso y subject:\")\n", + "print(tabla)\n", + "tabla" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9a5ee65b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data", + "transient": {} + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "resumen = df.groupby(\"name\").size().reindex([\"sub-todo\", \"sub-cpu\"]).fillna(0).astype(int)\n", + "\n", + "fig, ax = plt.subplots(figsize=(7, 3.2))\n", + "barras = ax.bar(resumen.index, resumen.values, color=[\"#7c3aed\", \"#0891b2\"])\n", + "ax.bar_label(barras, padding=3)\n", + "ax.set_ylabel(\"mensajes recibidos\")\n", + "ax.set_title(\"Telemetría recibida por cada PROCESO (8 publicados: 4 cpu + 4 mem)\")\n", + "ax.set_ylim(0, 10)\n", + "for i, name in enumerate(resumen.index):\n", + " ax.text(i, -1.4, f\"PID {pids.get(name, '?')}\\n{('telemetria.>' if name=='sub-todo' else 'telemetria.cpu')}\",\n", + " ha=\"center\", va=\"top\", fontsize=8, color=\"#555\")\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "b8d60d73", + "metadata": {}, + "source": [ + "## 3 · Línea de tiempo de las entregas\n", + "\n", + "Ordenando los mensajes por su marca temporal (`t`, segundos desde que cada proceso arrancó) se ve cómo ambos subscribers reciben los mensajes de CPU casi a la vez (fan-out), mientras que los de memoria solo llegan a `sub-todo`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1656576f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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xY+siImJUXuun7b127x5M/r27YuePXsiNTUV3377Lfz9/dWSpGHDhgEAOnTogB9//FGtjnbt2sHT07NC8Wmjy2MSgMeJpLW1Nb799ltYWFhALpejTZs28PDwwPfff4/u3bujSZMmGDZsGFxcXHDt2jXs378flpaW+O2337TWWZOfOboev01NTeHv74+ff/4ZPj4+sLW1RdOmTbXes1uWnj17YuHChXjllVcwePBg3L59G0uXLkWjRo3UPpcA3fdBRXz++efYv38/2rRpg1GjRsHf3x/379/HiRMnsHfvXq3PwCV6KjU1XCeRPqjMYxLmzZunVq54GOSSw9sXD1mdkJCgUT40NFRYWVkJExMT4eXlJYYOHSr++usvVZmKPCZBW/3QMpS6LsstzalTp0RISIgwMTERLi4uYtasWWLlypVahzF/muXk5OSIadOmiUaNGgkjIyNRv3590a5dOzF//nzVENOl7QchhMbw20VFRWLChAnCzs5OSCQS1TYtqw4hhEhJSRERERHC0dFRGBoaChcXF/Hqq6+KjRs3qpVLTEwU7du3F8bGxqJBgwZizpw54quvvhIAxM2bN1Xl4uPjRdu2bYWpqalwdnYWH3zwgWro7eL9dPnyZTF8+HDh5eUlTExMhK2trejUqZPYu3dvuduturi5uYmePXtqfS8lJUX0799fWFtbCxMTE9G6dWuxbds2tTLaHpMghBB79+4VwcHBwtTUVFhaWopevXqJs2fPaiwDOj4mQYjHw7S7uLgIqVSq0S43bdokXnrpJSGXy4VcLheNGzcW48aNE8nJyaoy2oZhF0KI5cuXi5YtWwpTU1NhYWEhAgICxAcffCCuX7+uKlPadgIgxo0bp3WblGx7ura5FStWCE9PTyGTydTaT1n7SttjEt5//33h5OQkTE1NRXBwsDhy5IjWYf5L2werVq0SgYGBwtjYWNjY2IiQkBCxZ88ejW2ye/du0axZM2FsbCwaN26s9TEgf//9t2jTpo0wMjISDRs2FAsXLtT6GIIlS5aU+iiIJymVSvHZZ58JNzc3YWxsLAIDA8W2bds09nHxoxy0/T3ZZnWN72kekyDE40e9+Pv7CwMDA40YEhMTRb9+/US9evWEsbGxcHNzE2FhYeKPP/5QlSnt0RK6HJOHDBki5HK5RkwhISGiSZMmGtO1tTddjt9CCHH48GHRsmVL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iIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiIiIiI9AQTPCIiIiIiIj3BBI+IiIiIiEhPMMEjIiIiIiLSE0zwiIiI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Mplqmp+fH27evImCggIYGRmVuzzeg0fPheDgYFy/fh25ubmqaRcuXIBUKtX5A5v0W35+PqRS9UNi8cGVY1HpJyEExo8fjy1btmDfvn3w8PAod56goCD88ccfatP27NmDoKCg6gqTakll2gcAzJ07F7NmzcKuXbvQqlWrao6SalNF20jjxo1x+vRpJCUlqf5ee+01dOrUCUlJSXB1da2hyKmmVOY4EhwcjEuXLqmSf+Dxd1YnJyedkrviBRM9c3JyckRiYqJITEwUAMTChQtFYmKiuHLlihBCiKlTp4q33npLrXyDBg1E//79xZkzZ8SBAweEt7e3GDlyZG2tAlWziraRmJgYYWBgIL755huRkpIi/vzzT9GqVSvRunXr2loFqmZvv/22sLKyEnFxceLGjRuqv/z8fFWZt956S0ydOlX1Oj4+XhgYGIj58+eLc+fOiaioKGFoaChOnz5dG6tA1agy7ePzzz8XRkZGYuPGjWrz5OTk1MYqUDWrTBspaciQIaJ37941EC3Vhsq0kfT0dGFhYSHGjx8vkpOTxbZt24S9vb2YPXu2zstlgkfPpP379wsAGn9DhgwRQjw+YIaEhKjNc+7cOdGlSxdhamoqGjRoIN577z21Dkb6pTJt5KuvvhL+/v7C1NRUODk5iTfeeEP8+++/NR881Qht7QOAiImJUZUJCQlRtZliv/zyi/Dx8RFGRkaiSZMmYvv27TUbONWIyrQPNzc3rfNERUXVePxU/Sp7DHkSEzz9Vtk2cvjwYdGmTRthbGwsPD09xaeffiqKiop0Xi6fg0dERERERKQneA8eERERERGRnmCCR0REREREpCeY4BEREREREekJJnhERERERER6ggkeERERERGRnmCCR0REREREpCeY4BEREREREekJJnhERERERER6ggkeET33kpOT4ejoiJycnNoO5anFxsbC2tq6RpcZHR2NFi1aVOsyJBIJfv3112pdRseOHREZGVmty9B3dXUb1tW46oKzZ8+iQYMGyMvLq+1QiKiKMMEjIr1UkS9006ZNw4QJE2BhYVG9QRER1TH+/v5o27YtFi5cWNuhEFEVYYJHRM+19PR0bNu2DUOHDq3tUEgPFRQUaExTKBRQKpW1EA3VtMLCwtoOQSfDhg3DsmXLUFRUVNuhEFEVYIJHRHpn6NChOHDgABYvXgyJRAKJRIK0tDSt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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data", + "transient": {} + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(9, 3))\n", + "colores = {\"telemetria.cpu\": \"#ef4444\", \"telemetria.mem\": \"#3b82f6\"}\n", + "y_de = {\"sub-todo\": 1, \"sub-cpu\": 0}\n", + "for e in msgs:\n", + " ax.scatter(e[\"t\"], y_de[e[\"name\"]], color=colores[e[\"subject\"]], s=80, zorder=3)\n", + "ax.set_yticks([0, 1]); ax.set_yticklabels([\"sub-cpu\", \"sub-todo\"])\n", + "ax.set_xlabel(\"t (segundos desde el arranque de cada proceso)\")\n", + "ax.set_title(\"Timeline de entregas — rojo: telemetria.cpu, azul: telemetria.mem\")\n", + "ax.grid(axis=\"x\", alpha=0.3)\n", + "from matplotlib.patches import Patch\n", + "ax.legend(handles=[Patch(color=c, label=s) for s, c in colores.items()], loc=\"upper right\")\n", + "plt.tight_layout(); plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5914c849", + "metadata": {}, + "source": [ + "## Resumen del análisis\n", + "\n", + "A lo largo de los tres notebooks hemos visto cómo distintos procesos envían datos por pub/sub con NATS:\n", + "\n", + "- **01** — el modelo base: publishers y subscribers desacoplados por un broker, *fan-out* y *wildcards*.\n", + "- **02** — patrones de orden superior: *queue groups* (reparto de carga), *request/reply* (RPC) y *JetStream* (persistencia y replay).\n", + "- **03** — **procesos del SO reales**: el desacople de verdad. El publisher no conoce a sus subscribers; el broker enruta por subject. Añadir o quitar procesos consumidores no cambia ni una línea del publisher.\n", + "\n", + "Esa es la idea central de NATS: **los procesos se comunican por nombres de subject, no por direcciones**, y el broker se encarga del resto.\n", + "\n", + "### Limpieza (opcional)\n", + "\n", + "Para parar el broker cuando termines:\n", + "\n", + "```python\n", + "import subprocess\n", + "subprocess.run([\"docker\", \"stop\", \"nats_demo\"]) # detener\n", + "subprocess.run([\"docker\", \"rm\", \"nats_demo\"]) # eliminar\n", + "```" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/procs/publisher.py b/notebooks/procs/publisher.py new file mode 100644 index 0000000..81196fa --- /dev/null +++ b/notebooks/procs/publisher.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +"""Publisher NATS como proceso del sistema operativo independiente. + +Se conecta al broker y publica una rafaga de mensajes de telemetria, +alternando entre los subjects `telemetria.cpu` y `telemetria.mem`. +No sabe ni le importa cuantos subscribers hay escuchando: solo conoce el +subject. Emite cada publicacion como linea JSON en stdout. +""" +import argparse +import asyncio +import json +import os +import random +import time + +import nats + +NATS_URL = "nats://127.0.0.1:4222" + + +def emit(event: dict) -> None: + print(json.dumps(event), flush=True) + + +async def main(count: int, interval: float) -> None: + pid = os.getpid() + nc = await nats.connect(NATS_URL, name="publisher") + emit({"event": "ready", "pid": pid, "name": "publisher"}) + + for i in range(count): + subject = "telemetria.cpu" if i % 2 == 0 else "telemetria.mem" + payload = json.dumps({"i": i, "valor": round(random.uniform(0, 100), 1)}) + await nc.publish(subject, payload.encode()) + emit({"event": "published", "pid": pid, "subject": subject, "i": i}) + await asyncio.sleep(interval) + + await nc.flush() + emit({"event": "done", "pid": pid, "name": "publisher", "published": count}) + await nc.drain() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Publisher NATS de demostracion") + parser.add_argument("--count", type=int, default=8, help="Numero de mensajes a publicar") + parser.add_argument("--interval", type=float, default=0.15, + help="Segundos entre publicaciones") + args = parser.parse_args() + asyncio.run(main(args.count, args.interval)) diff --git a/notebooks/procs/subscriber.py b/notebooks/procs/subscriber.py new file mode 100644 index 0000000..be2ed46 --- /dev/null +++ b/notebooks/procs/subscriber.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +"""Subscriber NATS como proceso del sistema operativo independiente. + +Se conecta al broker, se suscribe a uno o varios subjects y emite cada evento +como una linea JSON en stdout para que el proceso padre (el notebook) la lea. +Termina solo tras `--seconds` segundos. +""" +import argparse +import asyncio +import json +import os +import time + +import nats + +NATS_URL = "nats://127.0.0.1:4222" + + +def emit(event: dict) -> None: + """Escribe un evento como linea JSON en stdout, con flush inmediato.""" + print(json.dumps(event), flush=True) + + +async def main(name: str, subjects: list[str], seconds: float) -> None: + pid = os.getpid() + nc = await nats.connect(NATS_URL, name=name) + received = 0 + t0 = time.monotonic() + + async def handler(msg): + nonlocal received + received += 1 + emit({ + "event": "msg", + "pid": pid, + "name": name, + "subject": msg.subject, + "data": msg.data.decode(), + "t": round(time.monotonic() - t0, 4), + }) + + for subject in subjects: + await nc.subscribe(subject, cb=handler) + + # Senal de que este proceso ya esta escuchando (el padre la espera). + emit({"event": "ready", "pid": pid, "name": name, "subjects": subjects}) + + await asyncio.sleep(seconds) + emit({"event": "done", "pid": pid, "name": name, "received": received}) + await nc.drain() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Subscriber NATS de demostracion") + parser.add_argument("--name", required=True, help="Nombre logico del subscriber") + parser.add_argument("--subjects", required=True, + help="Subjects separados por coma (admite wildcards)") + parser.add_argument("--seconds", type=float, default=4.0, + help="Tiempo de escucha antes de terminar") + args = parser.parse_args() + asyncio.run(main(args.name, args.subjects.split(","), args.seconds)) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..7133b8b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,16 @@ +[project] +name = "nats" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "jupyter>=1.1.1", + "jupyter-collaboration>=4.4.0", + "jupyter-mcp-server>=1.0.2", + "jupyterlab>=4.5.7", + "matplotlib>=3.10.9", + "nats-py>=2.14.0", + "numpy>=2.4.6", + "pandas>=3.0.3", +] diff --git a/run-jupyter-lab.sh b/run-jupyter-lab.sh new file mode 100755 index 0000000..0739b68 --- /dev/null +++ b/run-jupyter-lab.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Jupyter Lab — modo colaborativo con autodeteccion de puerto +# Generado por write_jupyter_launcher (fn_registry) + +find_free_port() { + for port in 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899; do + if ! ss -tln 2>/dev/null | grep -q ":${port} " && \ + ! lsof -i:"$port" >/dev/null 2>&1; then + echo $port + return + fi + done + echo 8888 +} + +PORT=${1:-$(find_free_port)} +cd "$(dirname "$0")" + +echo $PORT > .jupyter-port + +source .venv/bin/activate 2>/dev/null || true + +# IPython startup: cargar .ipython/ local (FN_REGISTRY_ROOT, helpers, sys.path) +if [ -d "$(pwd)/.ipython" ]; then + export IPYTHONDIR="$(pwd)/.ipython" +fi + +if ! python -c "import jupyter_collaboration" 2>/dev/null; then + echo "ERROR: jupyter-collaboration no esta instalado" + echo "Instala con: uv add jupyter-collaboration" + exit 1 +fi + +echo "════════════════════════════════════════════════" +echo " Jupyter Lab + Colaboracion en puerto $PORT" +echo "════════════════════════════════════════════════" +echo "" +echo " Abre: http://localhost:$PORT" +echo " Ctrl+C para detener" +echo "" + +jupyter lab \ + --port=$PORT \ + --no-browser \ + --ServerApp.token='' \ + --ServerApp.password='' \ + --ServerApp.disable_check_xsrf=True \ + --ServerApp.allow_origin='*' \ + --ServerApp.root_dir="$(pwd)" \ + --collaborative diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..5f4e3c1 --- /dev/null +++ b/uv.lock @@ -0,0 +1,3363 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/c6/61a2d7b7572279226bb2e7f61d7a19ca7c90da0329c93fa0d560cbf288d8/aiohappyeyeballs-2.6.2.tar.gz", hash = "sha256:e202810ee718bd01fc6ef49e8ea53d023d5cb6b581076d7925aa499fa55dbe64", size = 22591, upload-time = "2026-05-20T15:12:24.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl", hash = "sha256:4708045e2d7a6c6bdf8aafa8ed39649eaf926a4543b54560659129e3365953c4", size = 15062, upload-time = "2026-05-20T15:12:23.328Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/ab/93ce242f899b68c51b0578c027aafa791ab3614cb9345fa5d37b5f5c8e3e/aiohttp-3.14.0.tar.gz", hash = "sha256:2882de819734c715fd1b9c11c97e09fa020d14438203d1d354d8ed1702791c9b", size = 7940674, upload-time = "2026-06-01T19:41:02.763Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/97/2b6889bfb6b6847520d50d95eb8c4307a45e28aaca39faf4a9454b3d1b2f/aiohttp-3.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b29518c9c2ec7e373e68259206a137c7f4f5439c58baaec4b5ab3ab799850a4e", size = 750194, upload-time = "2026-06-01T19:37:48.164Z" }, + { url = "https://files.pythonhosted.org/packages/21/e2/62634b7fff918ed98c3c6b2f0e70d520f7f28846cb412d451b04354c6459/aiohttp-3.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dbec68ce61b64cb73cab4d33df9433427b1713c8bcccb181dce695c1b6f8e87c", size = 506966, upload-time = "2026-06-01T19:37:50.014Z" }, + { url = "https://files.pythonhosted.org/packages/dd/fb/5ce075150828c797a5106f1c2fb26034e709d4289b9d2bf8b07f1e59fac6/aiohttp-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cdf534aa455593e589302990c5097aa5c92c06c4262a20da22934f9186a5fff", size = 507527, upload-time = "2026-06-01T19:37:51.96Z" }, + { url = "https://files.pythonhosted.org/packages/01/d5/405a0ae4e6b081754a3609c1c97c63a950e000a2def16046f1e736933a0e/aiohttp-3.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb6c657104393b5fbff01a5f59b2023db74058a8077d94475d6c25d03882a108", size = 1762420, upload-time = "2026-06-01T19:37:53.839Z" }, + { url = "https://files.pythonhosted.org/packages/ae/1d/e05a7c896b15a6bc6fb8fc5319eb437861c2c49c34559ef928add6590315/aiohttp-3.14.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:46fbbec4e4fab7428d4396a3823f9320e4560aa3113b89eeebce712c27c9ed5a", size = 1733672, upload-time = "2026-06-01T19:37:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/cc/22/a72f7c459e195fa41bf4f7abd1f925b91fe91f8097e51c654229ba144a33/aiohttp-3.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c2c7e05dd5335b298085abf45ddf98673934c3ee1c083d0b9ea13d4186ad500", size = 1805064, upload-time = "2026-06-01T19:37:57.931Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/e85bdaba0be59ca4838005ebfef4048fcdd5f35a02b07057a9a123394440/aiohttp-3.14.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3c7139100fbaae76515b73051d8f0aa3a3ff02e415eec8a8eee8e2223d9ba955", size = 1902125, upload-time = "2026-06-01T19:38:00.225Z" }, + { url = "https://files.pythonhosted.org/packages/19/d8/51de5c6b971c27bb1ef620293b8d1ca611ec78736b34b3f6ccf68e4c8785/aiohttp-3.14.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78d6f9286a629ce52728430afe18f8ed2b6c39a1fddb3802d7244b9983910ad2", size = 1783112, upload-time = "2026-06-01T19:38:02.641Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b4402bfde77e43dfb1b6ccff83c7b7ab63ed06b50c4754f0c5423fb374fe/aiohttp-3.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3c3e12cdaeb92d7dcf13db00e9f6b1956b910e47256e696df1cfa946d02159", size = 1586356, upload-time = "2026-06-01T19:38:04.637Z" }, + { url = "https://files.pythonhosted.org/packages/bc/05/750a3265ca4dc54a460bd0cb1121a8f2ce9171fce4a135fb47ea7fd594d2/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4d6a998191f5ebe3b8c28463ff72bc030250008b3193c402464efadd08b5ca02", size = 1723119, upload-time = "2026-06-01T19:38:06.713Z" }, + { url = "https://files.pythonhosted.org/packages/37/01/8c0812c50b3b1b1c37b323bf170d6be8847a8f234060485b7d1e71953f60/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0fc2b75ae8d169d853be2862d960be8550da6c5c65711d5476407eb3fdb006bd", size = 1757216, upload-time = "2026-06-01T19:38:08.736Z" }, + { url = "https://files.pythonhosted.org/packages/47/2a/50fb98028a26887cbe48dcc1df92a90825615bc73b5584301304090cded8/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:16eee56bcc72d04600bc56c1759982c2385ec0b41d3fd3521f836bf64a0957ef", size = 1770500, upload-time = "2026-06-01T19:38:11.111Z" }, + { url = "https://files.pythonhosted.org/packages/bd/32/0ffd598a2fa2b9a423daf242e700cfdabda35d6e602394ad9ae58972c1c7/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5a2e7ca615c3ddc15b82687e05a624e5f5cba3f1d6c20cb81172d70ea498451e", size = 1576224, upload-time = "2026-06-01T19:38:13.391Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f9/b9fc381dd9b66afb33f2634c40e229d106467be0afcabe79648631ab6712/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0b7b8bbbec3ce9467ee0ebe334622fd90624f593edd3136c567811453fc4fae", size = 1794252, upload-time = "2026-06-01T19:38:15.498Z" }, + { url = "https://files.pythonhosted.org/packages/a8/fb/05d9214c975f23225a8cd5c439325e338c7c377b315480ef3871db51f54e/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ba10966d4f03dd96a14365be4b8e37c327c76f11c3ca867116966cdd9f98066", size = 1760193, upload-time = "2026-06-01T19:38:17.624Z" }, + { url = "https://files.pythonhosted.org/packages/d9/4b/02992fc4fb9e1b6673ee3f888a8e587a6447afda1f6f4aca776c148c2876/aiohttp-3.14.0-cp312-cp312-win32.whl", hash = "sha256:101df7779c80c0636014a6b2c6642acd3efb5b355d48347c9d7dfb720aee9430", size = 448650, upload-time = "2026-06-01T19:38:19.545Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/246532214c3abda518477cbaaf16d420295ad8effa5233844cbb38f299ab/aiohttp-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:b0a5747586d4467efd1f932710b269131c9717a872dce082cd92a00c1c13123a", size = 476145, upload-time = "2026-06-01T19:38:21.505Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c3/63f8c20090048915711598b0adf475b149216d736157961de06480a45b15/aiohttp-3.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:5f1c5be60add78fabb4aacd13c5a348ae79d2fcbfc7fa78da8f1eb192273b370", size = 444250, upload-time = "2026-06-01T19:38:24.027Z" }, + { url = "https://files.pythonhosted.org/packages/21/61/d11f7d9a3144bffe825247d6367cd93053666da50b94707c9129c78868d5/aiohttp-3.14.0-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:25400d710641a8040bf022a8a99f579e581ffa1c5bd42c33255d7d6f3957c127", size = 502399, upload-time = "2026-06-01T19:38:25.955Z" }, + { url = "https://files.pythonhosted.org/packages/4f/9b/a7e317625d36356844f8bb022cabd305b541f968856cc3c2e0b58e53ee6e/aiohttp-3.14.0-cp313-cp313-android_21_x86_64.whl", hash = "sha256:c5492b9929826e07cc3fcb9739ae87aab05dff6b5e67a9b73fd1700c6d008981", size = 510068, upload-time = "2026-06-01T19:38:27.828Z" }, + { url = "https://files.pythonhosted.org/packages/11/41/cc2d2cfbfbdc3126ba258f3cd27d1ac8a33492ae3c35a4583ee21f0ba7f1/aiohttp-3.14.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3366751d68d237c621264233a32f3078bbc21b7904ab90a77e03d21390c742c6", size = 481670, upload-time = "2026-06-01T19:38:29.836Z" }, + { url = "https://files.pythonhosted.org/packages/3c/07/381f4023c3b08cb616e520f566d8c58957abad54e56441d41fe67cfb0195/aiohttp-3.14.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:57ea07d28695a7a40304d42251892a8df765e5588c10ee32afeddcd5df33c0a2", size = 487591, upload-time = "2026-06-01T19:38:31.704Z" }, + { url = "https://files.pythonhosted.org/packages/fb/4d/4506fdb7a022bdf70011a3bbb4ca00c5c570026ef6a3c5bd7bc70c39089c/aiohttp-3.14.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:076cb014191ae2e65d949e1ad01f1dcfe33e32789b5172510f3e79c79fc04d50", size = 496503, upload-time = "2026-06-01T19:38:33.6Z" }, + { url = "https://files.pythonhosted.org/packages/ef/7d/c814111e04894a45d9e2defc94443879a6f118d9633d5fedfe6e2e8af5f0/aiohttp-3.14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2f3fc37054564dee64a855b5b092d87ec35dcddfaabf7dacb1c8a2b1f83dc0a9", size = 745870, upload-time = "2026-06-01T19:38:36.013Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ee/80eee0efddfe187e7cd05027086b7ce1c0e492e82a4eda58f5c5543a44a0/aiohttp-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8fcaef74d2ab0f607d7ff85a0d15e21bb5a258c4a58df1908396eb50d7f4ed3c", size = 505588, upload-time = "2026-06-01T19:38:38.282Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f8/0f28f04eef75d52fc9c715dde7ce9c0abb810fd20cfeb0fea7afd2ab1e98/aiohttp-3.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4c01b0bfc6209590960e68eac083cd22d5d87c21f974dd6208cafa5d3542bc8", size = 504492, upload-time = "2026-06-01T19:38:40.611Z" }, + { url = "https://files.pythonhosted.org/packages/ff/db/44c755232085545065c94378dfce38641b1aee647f4939fcd32f5b32e719/aiohttp-3.14.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f12eb7896e81caf403a2b18c9406426f1207361e7239c057ab29c076d4257e83", size = 1752111, upload-time = "2026-06-01T19:38:42.682Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6a/42e030a46743841414402a3b00cd3d78419055e86c66fb5822c14b5abfc6/aiohttp-3.14.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6c79a044cacf360ec46738d863d2f41c9300d2a06ef4a7402ea0df306a350e61", size = 1729674, upload-time = "2026-06-01T19:38:44.79Z" }, + { url = "https://files.pythonhosted.org/packages/34/26/3199beb415202e3108e7b83ecebe10914d806d33fb9860c3e4aa60a19be3/aiohttp-3.14.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:85e0675f47be4eff0636bf88c02140ea89168ae0df3ff1f3f464e9de9610d277", size = 1798808, upload-time = "2026-06-01T19:38:47.01Z" }, + { url = "https://files.pythonhosted.org/packages/bd/94/b9b6fcf0ee17c21d0d19fb8c22bf83ad18f82e702a9c3bd901a868f5e446/aiohttp-3.14.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b33e751cab03fdc960095b1e326cb5a03f5ee577d6ded59f3d1c100f8668882", size = 1891921, upload-time = "2026-06-01T19:38:49.233Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a3/3800dbd095cb2bb165a7ea5d94d790914677e27f45638c7d80e3f34c8945/aiohttp-3.14.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9224c6dd7f5c749aba4f61315a894601448b28d94d12f4dea0903e26d2096", size = 1777241, upload-time = "2026-06-01T19:38:52.04Z" }, + { url = "https://files.pythonhosted.org/packages/21/2a/45be91ad1b860508557448d4cc2e165a2ee68dd865657b73bf66cc5a00fb/aiohttp-3.14.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6281aecdf2732940f4fe06bd6adec5ae4d59b78b080b8e3a6b81467301010988", size = 1579554, upload-time = "2026-06-01T19:38:54.508Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/dc94df99ed1511fdf28314f722643ed334112643cab00223577085e788c4/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:23e8314e7aed8576fbe33314d218bd81447a3adbc91dc36f1163bf583cd3084c", size = 1714864, upload-time = "2026-06-01T19:38:56.788Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e4/1f1c8acbb3acd5c8f795473b92c9c3d44eb60a5692c6104256c8a1c83a0c/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3b54fbff46127aeafdd764cecd0d99fa2f24a0e37ea5c18a7c3a4ac450df1db3", size = 1749803, upload-time = "2026-06-01T19:38:59.367Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c8/c45ea6e7ed84cebba939b9c334498a045ba19d79c61b0110df5f21580de3/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b27d89af91a555f58e08e4902dbcbc48862fd40095720ca705990476bd93b7ac", size = 1765023, upload-time = "2026-06-01T19:39:01.651Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a1/a932941784432962fe390e1066823aaef64b4e5ac9fa595df57b5fe472a9/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:25d2326a4967bf705a9f9913a13005e93b6020ad8a9f6bd6bd78850d5171332e", size = 1571671, upload-time = "2026-06-01T19:39:04.044Z" }, + { url = "https://files.pythonhosted.org/packages/b0/01/e1280feac522597a4d46eb67a0cdfa053cfae263033030b761ab146f29fb/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a1d209375c503472b3c0a340cdf3c55fcd82e84b46dda7caeaced59faba373ec", size = 1789904, upload-time = "2026-06-01T19:39:06.294Z" }, + { url = "https://files.pythonhosted.org/packages/fa/10/ab28818262f4d26bdb47ed5f1fc7999b69e2fc6e0370b02d0f49011f45ea/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:666c7c5036df57b693026398b69b41874a1931ac5b3485fd910e57bfac253869", size = 1754516, upload-time = "2026-06-01T19:39:08.788Z" }, + { url = "https://files.pythonhosted.org/packages/af/cc/c122eabd7a1b7e0c9bbdd6be60e4715905b858399145d9df872bb94f1427/aiohttp-3.14.0-cp313-cp313-win32.whl", hash = "sha256:23f094a1ef64823fd35854ddf5c7a80a078162f37f9d2f7c6142b51a6affa456", size = 448656, upload-time = "2026-06-01T19:39:11.171Z" }, + { url = "https://files.pythonhosted.org/packages/41/a5/bab07d79848a00eedd8ed979ccb302aaea3ac6eb9fa16bd0ed87135869b4/aiohttp-3.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e03abdaa17d553f17e1d1d06bb266b3970106c78051d06795723e748d8e49d11", size = 475803, upload-time = "2026-06-01T19:39:13.439Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/f03ade8566c153666a3871afccbedf6d99911da006325e1fc6cf72a2de99/aiohttp-3.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:acdb400538cf4769543548bb5d1eb23d39bed4f96554a6078cb728c7cb2c268b", size = 443889, upload-time = "2026-06-01T19:39:15.945Z" }, + { url = "https://files.pythonhosted.org/packages/28/03/5f36ab196a88ba5e9648ae5643e6531e67a3a8c0e96f9c6510ff41540fec/aiohttp-3.14.0-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:363ef9e91014e7891679bfb2ac0a7c6ea93435dbbfd10ecf41b9f06fcf506c5f", size = 503330, upload-time = "2026-06-01T19:39:18.195Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ce/8b49ec2f30f68e02f314f4832186cd45e583360a5a386058be36855d23b6/aiohttp-3.14.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:884a4edbdad77be9d0ef36142c8b504351b170df0bf62b51e784fadabf311c42", size = 509822, upload-time = "2026-06-01T19:39:20.396Z" }, + { url = "https://files.pythonhosted.org/packages/1a/fe/6edbf5d39bf29322b6816365b17ed8ede4dace164a3aea1abcd30110eb78/aiohttp-3.14.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:70ea956f6cc4a37620966b56c2e205d88ca3e6d85ec063277e414b1035cddad3", size = 483329, upload-time = "2026-06-01T19:39:22.607Z" }, + { url = "https://files.pythonhosted.org/packages/1b/5a/fae531bdbc6456fb6241f46b7b81e4d8a0dd3fc09118a0055dc7141ac1ec/aiohttp-3.14.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:ea3b9806c89f61da22fddf1f12dd524fb368e5e28f1261fbdafe5c3cd8ce893b", size = 489502, upload-time = "2026-06-01T19:39:24.881Z" }, + { url = "https://files.pythonhosted.org/packages/36/f4/48a7b0414db7fed77a03d5dde34508c026afd83510ab6bca08c313855776/aiohttp-3.14.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a071be341c2bd9b0188e62d173509f024e0a35b1c342c53c50f8daaeda8c3bd8", size = 497357, upload-time = "2026-06-01T19:39:27.197Z" }, + { url = "https://files.pythonhosted.org/packages/75/75/e85a13a370acc007fca5feb1fd1b88ac2d8426e6dadd625479b7cadd55a3/aiohttp-3.14.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:198cfe61bf253b19da1fb3e0fa122249dc4f14c12709493fed8054aa0411cc76", size = 750898, upload-time = "2026-06-01T19:39:29.563Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e4/3d637f800c724eff0e2bed64df72557444482366fd0a35b0cec0e6968f6c/aiohttp-3.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9dc203d6ce6b9106d54e2a93f41dfdfebfbca2d99962ba503bfd3e5921a6549e", size = 506986, upload-time = "2026-06-01T19:39:31.872Z" }, + { url = "https://files.pythonhosted.org/packages/1d/df/35161f3598bf7501d2b2a805b41ab4f45a2e34150c421bcb4ef8c0d281a7/aiohttp-3.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9e19d17ab02bf16832a2c8c0d55a486792c5b1645665652ee9531aebcc30cb72", size = 508033, upload-time = "2026-06-01T19:39:34.137Z" }, + { url = "https://files.pythonhosted.org/packages/e5/39/b36e5d3d31e850fb4691dd3e941684ac490a2559249f6fa634b6b0fdf020/aiohttp-3.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d925fba0c14d5b498a8028b0107beebdfd16c5d48d702ff54f879cb017aaaca3", size = 1746213, upload-time = "2026-06-01T19:39:36.654Z" }, + { url = "https://files.pythonhosted.org/packages/b1/28/24e1409e605a9aa5d84abe0e2acb365354b70ae56d40948101cabe3341ab/aiohttp-3.14.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d33e61021222ce7f9792bcac870d6f58d8adfceda33ab857b01264f4560f2c5f", size = 1705862, upload-time = "2026-06-01T19:39:38.968Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d0/e5eb3ff1daeaf644c7e36a957517672494122628e067c38b263fa04eda77/aiohttp-3.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:44eca38755d0105bb32f47d085f5dd449846a449e1245fc105889e3279dcf8e3", size = 1798909, upload-time = "2026-06-01T19:39:41.334Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ba/8943f906f0570342886ababb9a722a44e360f786a028c5e0b0e29e3f735b/aiohttp-3.14.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f13087e06f68fea4941c21a0c541c00553aa16e4f8fd7bbe2b198df761e964d6", size = 1868892, upload-time = "2026-06-01T19:39:43.807Z" }, + { url = "https://files.pythonhosted.org/packages/3a/05/27df32c844b2156e1675a8d8ec22d963e3c8ba469ed7ceb1863320c7b521/aiohttp-3.14.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff82be7f1ef73634cb77890a770743239bc3d487b848669be1c599889336dc0a", size = 1751659, upload-time = "2026-06-01T19:39:46.398Z" }, + { url = "https://files.pythonhosted.org/packages/7f/62/da182e5910ab912b2e88aa919b61a16046a37a95714a5795b02eb57b2d18/aiohttp-3.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a150c0875ac8fd87f1c398650841308a30d65facf7416b12dbdb9cfdcbe5a48c", size = 1578775, upload-time = "2026-06-01T19:39:48.902Z" }, + { url = "https://files.pythonhosted.org/packages/66/e3/53c67097e8a5ce98625e91e3fa7f43c9c6940de680345d03b3509a72a078/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:edc01ea4e1ec5a1649a28866262bf24195889ff7b27bdd947029a6086741de9b", size = 1710090, upload-time = "2026-06-01T19:39:51.392Z" }, + { url = "https://files.pythonhosted.org/packages/dd/55/0e2732ca598c7a4dfe8a775662376d0ca2977cb1030e48386d4da5d9a456/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:540632bf882ff8fc88f2e1697be0761578e89e0d79fb4a8a6d65dc5da7e729d4", size = 1715016, upload-time = "2026-06-01T19:39:53.807Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/f0b73730798c9ca525afc30b39f1f81bbe24e245d9654c54d3b39d63212d/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:860a86bc2c80237f5dff52edcf427e10a8d8352271fd84845429a3e60199e02c", size = 1763810, upload-time = "2026-06-01T19:39:56.31Z" }, + { url = "https://files.pythonhosted.org/packages/71/cc/11acb6c4518f448323405a7312b6f255d0f974a34373ad1db7633c4aadc8/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5cbd50e6a50d6b99283a826b18cbdebf65b0797689a7535cb0e9dd37be0f63c3", size = 1573064, upload-time = "2026-06-01T19:39:58.718Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/28c31dde0a7dc98c0ee7d0da2ddcec3f7688c4fc131e5989e278d0c03c0a/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:20144819e99db593e22bbd2f3f2691a5e149f879142d6b8670254708853ff4fb", size = 1775765, upload-time = "2026-06-01T19:40:01.195Z" }, + { url = "https://files.pythonhosted.org/packages/b8/69/155c4ef3aec96417d47024800472b33b16c5d8a665371dcd044c2afdf25d/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:26b6d79aa54cb4ed50cc7d41ed14e99e0f1fc8e7c2d42f2e05b37aea897b2b52", size = 1733716, upload-time = "2026-06-01T19:40:03.631Z" }, + { url = "https://files.pythonhosted.org/packages/5f/44/6126116fd8a316b712bb615660b855c78466bb67ba1bb1742427eafcf7ac/aiohttp-3.14.0-cp314-cp314-win32.whl", hash = "sha256:106ed074a856f3e21d186b8579e2c8afb6da598e267cdaab01059e13db2fc44d", size = 453684, upload-time = "2026-06-01T19:40:06.277Z" }, + { url = "https://files.pythonhosted.org/packages/a2/d7/eff4c58a88c5cac5e38b55f44fb8a6d3929c3cbd77356e383e094d3220bd/aiohttp-3.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f770846edae8f00ecc57af825bce811f787f87a7dcf0e90d191790efe5b31f7", size = 481758, upload-time = "2026-06-01T19:40:08.653Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ed/17b5bd9fbcb46e688f02e572f517754a9a75831e7b54702f027761dc4fa5/aiohttp-3.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:acf1581c4f21ed4b80a2dded504d87b055a071a84d5737ea966435f768275ac6", size = 450557, upload-time = "2026-06-01T19:40:11.03Z" }, + { url = "https://files.pythonhosted.org/packages/12/34/6180103ce9aabc8ebff3f7bb55a1228ffe60f61042823031d9692cb7b101/aiohttp-3.14.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6aa1a40f9cbb3da9f80714c5966b8946c21e6a2530d809b9498b33161e3c8733", size = 787878, upload-time = "2026-06-01T19:40:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/92/e9/08954a40e8b7baa3d8beadd2b074b186e9b1e9c8ddabc288678a6265de50/aiohttp-3.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b62af5a8cc96a194eaa01a9ed7b34a3ffa58d3d8daaa1a0d7a749353ad12d228", size = 524400, upload-time = "2026-06-01T19:40:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/08/6a/b5965a634ac4d5ba99a463314cf4ab214ca073fcdc38a15e0294273701fc/aiohttp-3.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6eb63b1417efaf7d1002a6ad034a40d44376afcc16508a57f8e74b49ad26a095", size = 527904, upload-time = "2026-06-01T19:40:18.28Z" }, + { url = "https://files.pythonhosted.org/packages/06/b4/932bcdd850c354d9bcca30f360e475d7852e30413fbbd44b182782ed5432/aiohttp-3.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c20b9ad156a79eb97be5cf9e069eec01d2f0dc8472ffbd75299a8b2d4c2cbbde", size = 1912162, upload-time = "2026-06-01T19:40:20.825Z" }, + { url = "https://files.pythonhosted.org/packages/c6/85/ce79bab0310d2e3fd2d7bc7e44412abeff7c8338f8a21dd0f2f1714989e5/aiohttp-3.14.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:40ae7b0642c25632c7eabc4a04754012691864d2a1b93becf7cddb76027b838a", size = 1778813, upload-time = "2026-06-01T19:40:23.726Z" }, + { url = "https://files.pythonhosted.org/packages/05/54/ba62ac2d1bc87e010aad23751e383b8794e45d931df67677313a2da78823/aiohttp-3.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:95f5217e76a046b9f228a101717ef8d42b1eb3d9d196d15202db5bf41df88936", size = 1899969, upload-time = "2026-06-01T19:40:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/dc/82/7cc7907725d83a19f31551334061e1ab8e108b1d7ac52632a2a844a4acb5/aiohttp-3.14.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1a4a9f17e85b80878c176695c1998c790e83731d8271881e5d356488652a1f9e", size = 1991771, upload-time = "2026-06-01T19:40:29.061Z" }, + { url = "https://files.pythonhosted.org/packages/d0/1c/a57de71a4508c93a830b77c28af3d08cd97f606dedfc6b94275347744508/aiohttp-3.14.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:145262119b07d7f95abc1839add35ba2bfc84551d4b4660ca11542c0b215455b", size = 1868606, upload-time = "2026-06-01T19:40:31.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ae/3839726cd49150a53ed340cc24ce5ba09d4c2117020ef9d45542bec5eb2f/aiohttp-3.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:49a33ded29b0b2fa7a367a02cf0fb89af602bb87542a16177ec8ce1c9c51d12a", size = 1665437, upload-time = "2026-06-01T19:40:35.01Z" }, + { url = "https://files.pythonhosted.org/packages/35/1e/c237923232c7da7f0392ea25d89fc5e60c0e93f685f4ebca8e7bcdd5271c/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cc736a9c9fc2bc4dd71fd404815741b6573df27c3f985948ec4076989ac57de", size = 1834090, upload-time = "2026-06-01T19:40:37.733Z" }, + { url = "https://files.pythonhosted.org/packages/98/02/a5a7a2524f92d3911761b405a7c067c751891942144adc13e2ad79611e39/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b4141a3e5342ee3053a9cab54d25b64ed28289c1041e4c54b3d99839314d90ce", size = 1816907, upload-time = "2026-06-01T19:40:40.46Z" }, + { url = "https://files.pythonhosted.org/packages/fa/76/a8b9f0d09234d516af9f2d7dd715557f33b5da3b0b56ead41d1170e86e3c/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e30871b2d58996cb81aac52d2b1d15ac05257131ef0f90f18c2115a380fbfe7c", size = 1840382, upload-time = "2026-06-01T19:40:43.48Z" }, + { url = "https://files.pythonhosted.org/packages/c9/8e/140e715a0a4bbc211979ea30ec8396ad2ed5bf90ab87d8058fc4668b1923/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:667b881d083ccae3900ea5a241e17e5007ca78844c53ed389bb63d48f729d9c7", size = 1659497, upload-time = "2026-06-01T19:40:46.265Z" }, + { url = "https://files.pythonhosted.org/packages/10/c7/7ba5de8af9650b9767b063c675427b8685f43fa7ce563673a7bc3af60f08/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:b584dfe615d151e9b8f0a8ecb3aee6147f2927ec5b95ba25fe621f5377510928", size = 1870829, upload-time = "2026-06-01T19:40:49.583Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bc/2aaab2f85cadb26ea59c091fa2b8e370d625154b5c14b478f1b489d07551/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6199707cc40e0e9cd39c36fbc97bec416c704e1d0ddce03412bb3b3e6a90ccd0", size = 1832281, upload-time = "2026-06-01T19:40:52.303Z" }, + { url = "https://files.pythonhosted.org/packages/39/98/31b9ad9fbc01f0075ee7221002df5fd2d10b647f451ca5f30edc802d9dd6/aiohttp-3.14.0-cp314-cp314t-win32.whl", hash = "sha256:a8d93334d4961c9d566b1f046c81dee475b7c21eb730728d38237bfa70d1c8e6", size = 490597, upload-time = "2026-06-01T19:40:54.937Z" }, + { url = "https://files.pythonhosted.org/packages/59/1f/299b21441c8de42ff70fddc7cfe65e92f810abcf740739a09b56f7835364/aiohttp-3.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2d2ffe9b614f50f069068b3b52e73414e4107fc10b7efc939a76acff9251fdd2", size = 525789, upload-time = "2026-06-01T19:40:57.306Z" }, + { url = "https://files.pythonhosted.org/packages/70/11/7f83fcba9ee05d4c54d61b3f8104da0d43a59adac44dd28effc0c9a10422/aiohttp-3.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:7a3fc4358e65826c515350f199c210de747cf669998211b1ee6c2e46de364b24", size = 467399, upload-time = "2026-06-01T19:40:59.993Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, +] + +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "async-lru" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/1f/989ecfef8e64109a489fff357450cb73fa73a865a92bd8c272170a6922c2/async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6", size = 16332, upload-time = "2026-03-19T01:04:32.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315", size = 8403, upload-time = "2026-03-19T01:04:30.883Z" }, +] + +[[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 = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, +] + +[[package]] +name = "bleach" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + +[[package]] +name = "certifi" +version = "2026.5.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[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 = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, +] + +[[package]] +name = "cryptography" +version = "48.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/6b/84/70e3feea9feea87fd7cbe77efb2712ae1e3e6edf10749dc6e95f4e60e455/cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec", size = 7986556, upload-time = "2026-05-04T22:58:11.172Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" }, + { url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" }, + { url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" }, + { url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" }, + { url = "https://files.pythonhosted.org/packages/75/54/cc6d0f3deac3e81c7f847e8a189a12b6cdd65059b43dad25d4316abd849a/cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f", size = 3270954, upload-time = "2026-05-04T22:58:38.791Z" }, + { url = "https://files.pythonhosted.org/packages/49/67/cc947e288c0758a4e5473d1dcb743037ab7785541265a969240b8885441a/cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12", size = 3797313, upload-time = "2026-05-04T22:58:40.746Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/aa/12037145b7a56eaa5b29b41872f7a21b538e807e13f32c4d3c46e59be084/debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6", size = 1697577, upload-time = "2026-06-01T19:30:35.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/df/bf625547431a9cadc9f4cbfeda38866e2b17f6aed147b625377e87834449/debugpy-1.8.21-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:9f96713896f39c3dff0ee841f47320c3f2983d33c341e009361bb0ebc79adc4e", size = 2483609, upload-time = "2026-06-01T19:30:50.794Z" }, + { url = "https://files.pythonhosted.org/packages/bf/09/59324b903599031ff9faaec1758292409f6561a0ec2492fe4b703327705a/debugpy-1.8.21-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c193d474f0a211191f2b4449d2d06157c689013035bd952f3b617e0ef422b176", size = 3968900, upload-time = "2026-06-01T19:30:52.341Z" }, + { url = "https://files.pythonhosted.org/packages/14/cd/27f65b805d7fe005c44e1a36b9183ecdfbcdbf9d3e721a5115d461ecc7ee/debugpy-1.8.21-cp312-cp312-win32.whl", hash = "sha256:4743373c1cac7f9e74a1b9915bf1dbe0e900eca657ffb170ae07ac8363205ae9", size = 5336340, upload-time = "2026-06-01T19:30:54.047Z" }, + { url = "https://files.pythonhosted.org/packages/77/1d/c84e30c0c674184948b66f076ab271c01d940618a2824c23cd035a27bc20/debugpy-1.8.21-cp312-cp312-win_amd64.whl", hash = "sha256:bd7ba9dd3daa7c2f942c6ca8d4695a16bf9ac16b63615261c7982bc74f7ed20c", size = 5374751, upload-time = "2026-06-01T19:30:55.891Z" }, + { url = "https://files.pythonhosted.org/packages/77/6b/d817e1f8cc77aa055d37fba092e0febfdff40fe652d8d53d4cd7a86ad98d/debugpy-1.8.21-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:13678151fc401e2d68c9880b91e28714f797d40422994572b24560ef80910a88", size = 2477398, upload-time = "2026-06-01T19:30:57.644Z" }, + { url = "https://files.pythonhosted.org/packages/48/57/412421516afc3055fa577516f00beec3d663f9b0ab330639547ae6c57720/debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2", size = 3962096, upload-time = "2026-06-01T19:30:59.235Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2c616337cf6ba7b07ebbc97f02c6c945a8e2f76b365e33ee809c32ee36d1/debugpy-1.8.21-cp313-cp313-win32.whl", hash = "sha256:2c2ae706dec41d99a9ca1f7ebc987a83e65578363be6f6b3ac9067504917fae1", size = 5336288, upload-time = "2026-06-01T19:31:00.79Z" }, + { url = "https://files.pythonhosted.org/packages/f8/99/9175103392f84c4b1bf7622888cdc68da07f0ff7d9e581266428f6776033/debugpy-1.8.21-cp313-cp313-win_amd64.whl", hash = "sha256:aa648733047443eb1d07682c4ef287d36a54507b643ffdf38b09a3ef002c72a0", size = 5376567, upload-time = "2026-06-01T19:31:02.56Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3d/f4bbb323a548bfab2af3d6b4ffd9bf22636e55956a1285d317a1de643aad/debugpy-1.8.21-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9bb2a685287a2ac9b181cde89edcec64845cb51de7faaa75badb9a698bc24782", size = 2477209, upload-time = "2026-06-01T19:31:04.157Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2d/6e7ec524984a1702777868de49a4c53202bddac2a432a76a093469587750/debugpy-1.8.21-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3d6922439bf33fd38a3e2c447869ebc7b97da5cd3d329ff1ef9bc06c4903437e", size = 3927115, upload-time = "2026-06-01T19:31:05.863Z" }, + { url = "https://files.pythonhosted.org/packages/97/47/d1aa6d64005a98a9144647d99306b419396f9ad7bf1d73c119e17a81fb4d/debugpy-1.8.21-cp314-cp314-win32.whl", hash = "sha256:15d4963bd5ffa48f0da0947fd06757fa7621945048a14ad7705431566d3c0e7c", size = 5336724, upload-time = "2026-06-01T19:31:07.711Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/b905b90d163af11878c1af8abafa4a25206335e112e284e413454543a6da/debugpy-1.8.21-cp314-cp314-win_amd64.whl", hash = "sha256:fe0744a12353406de0ae8ccff0d0a4a666f00801a3db8fd04e7a5f761cd520e8", size = 5373803, upload-time = "2026-06-01T19:31:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/67e7cf11a53e40694f720457d5b3a1cdaaa3d5a9a633e482f225456b93ff/debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92", size = 5352888, upload-time = "2026-06-01T19:31:25.186Z" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fastapi" +version = "0.136.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/2d/ff8d91d7b564d464629a0fd50a4489c97fcb836ac230bf3a7269232a9b1f/fastapi-0.136.3.tar.gz", hash = "sha256:e487fae93ad408e6f47641ee4dfe389864fd7bec92e547ea8498fc13f43e83ab", size = 396410, upload-time = "2026-05-23T18:53:15.192Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/82/45359b62a067409bd929ae8a56b8ed13e5a8c8a61194b3c236920999ab83/fastapi-0.136.3-py3-none-any.whl", hash = "sha256:3d2a69bdf04b7e9f3afa292c3bc7a98816bbfafa10bc9b45f3f3700d2f761620", size = 117481, upload-time = "2026-05-23T18:53:16.924Z" }, +] + +[[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 = "fonttools" +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, + { url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" }, + { url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" }, + { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" }, + { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" }, + { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" }, + { url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" }, + { url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" }, + { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" }, + { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" }, + { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" }, + { url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" }, + { url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" }, + { url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" }, + { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" }, + { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[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 = "httpx-sse" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, +] + +[[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 = "ipykernel" +version = "7.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/8d/b68b728e2d06b9e0051019640a40a9eb7a88fcd82c2e1b5ce70bef5ff044/ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e", size = 176046, upload-time = "2026-02-06T16:43:27.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/b9/e73d5d9f405cba7706c539aa8b311b49d4c2f3d698d9c12f815231169c71/ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661", size = 118788, upload-time = "2026-02-06T16:43:25.149Z" }, +] + +[[package]] +name = "ipython" +version = "9.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "psutil", marker = "sys_platform != 'emscripten'" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/c2/c0064cf15d026501a1ef70e42efd9c3f818663089399aacc5e37a82901c1/ipython-9.14.0.tar.gz", hash = "sha256:6f27ff0f1d9ea050e0551f71568bc4b34d8aba579e8f111c5b4175f44ac6b4aa", size = 4432601, upload-time = "2026-05-29T15:13:24.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/a3/9e59340f02c1dc8f8c0a05b09244712b8609eb5439f9996e887e2b82f452/ipython-9.14.0-py3-none-any.whl", hash = "sha256:8fd984a3372c14b12790b084ba6b5cff5678c0cb063244a0034f06a51f20d6c2", size = 627457, upload-time = "2026-05-29T15:13:22.942Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[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 = "json5" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/4b/6f8906aaf67d501e259b0adab4d312945bb7211e8b8d4dcc77c92320edaa/json5-0.14.0.tar.gz", hash = "sha256:b3f492fad9f6cdbced8b7d40b28b9b1c9701c5f561bef0d33b81c2ff433fefcb", size = 52656, upload-time = "2026-03-27T22:50:48.108Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl", hash = "sha256:56cf861bab076b1178eb8c92e1311d273a9b9acea2ccc82c276abf839ebaef3a", size = 36271, upload-time = "2026-03-27T22:50:47.073Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +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.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "rfc3987-syntax" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + +[[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 = "jupyter" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipywidgets" }, + { name = "jupyter-console" }, + { name = "jupyterlab" }, + { name = "nbconvert" }, + { name = "notebook" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-collaboration" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-collaboration-ui" }, + { name = "jupyter-docprovider" }, + { name = "jupyter-server-ydoc" }, + { name = "jupyterlab" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/4a/1f8ba60881f3ed86112e7d77a4098ee859dea729e854140a862f2b52df95/jupyter_collaboration-4.4.0.tar.gz", hash = "sha256:d492a2f69bd91d6f472991051b2df83dc2cdfaeecbfa2d75dabee5fc3178814d", size = 3727, upload-time = "2026-05-11T11:05:17.778Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/70/9d44957eef95c0e8ce80fbf90cacaa3dabd579fd811278dc517148e7b777/jupyter_collaboration-4.4.0-py3-none-any.whl", hash = "sha256:c10828d3e83e73448051dfceadb89bf61bcdd97c3000eaac878b39be5aa8358f", size = 4751, upload-time = "2026-05-11T11:05:15.924Z" }, +] + +[[package]] +name = "jupyter-collaboration-ui" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/bf/f6494fbba8d192d34dce04994fe43a7c1069d11e9d443c6988013c099afa/jupyter_collaboration_ui-2.4.0.tar.gz", hash = "sha256:9a1942ed90f8d98c83a1b6fbc0108bf5d1a4b1484668b634364868806caf5d7c", size = 79142, upload-time = "2026-05-11T11:04:52.467Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/97/585c550ed6349c9a9bfa8b217ebbac606eeeda45af812602803b8aef05e1/jupyter_collaboration_ui-2.4.0-py3-none-any.whl", hash = "sha256:543fd8d63106e00f50c9e3d0fd70e32d8242de8d7f887b503dcbcec6cb586e5c", size = 46696, upload-time = "2026-05-11T11:04:50.525Z" }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "pyzmq" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyter-docprovider" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/1e48717f4f499b649cc9c0d3ff95b64efaf4c69142ecc7dee3caf011a681/jupyter_docprovider-2.4.0.tar.gz", hash = "sha256:7b901fb9d800599e2ab68557fd6391102a6888845286c4f7cbb6eb2bba3094e0", size = 51324, upload-time = "2026-05-11T11:05:04.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/cc/74b80ecbb804266f55cc82fb9242b49437572dcc4203bff5cfc7c449cbeb/jupyter_docprovider-2.4.0-py3-none-any.whl", hash = "sha256:cf0582cededc46bc5a055e31b4f4b9352f8d48bbb55fbea389e953b166dacf1b", size = 35927, upload-time = "2026-05-11T11:05:02.394Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "packaging" }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/f8/475c4241b2b75af0deaae453ed003c6c851766dbc44d332d8baf245dc931/jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3", size = 62854, upload-time = "2026-04-20T23:17:50.66Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf", size = 19512, upload-time = "2026-04-20T23:17:48.927Z" }, +] + +[[package]] +name = "jupyter-kernel-client" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-mimetypes" }, + { name = "requests" }, + { name = "traitlets" }, + { name = "typing-extensions" }, + { name = "websocket-client" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/68/287315ba355aa93bda2e344de5febc45e6de1b47d8f4a5b69400b24cfdfd/jupyter_kernel_client-0.9.0-py3-none-any.whl", hash = "sha256:77acb8f2f738d97625d6bd01ee8cf21c4d59790b7ba464108712db3870416f20", size = 40097, upload-time = "2026-02-11T06:42:05.133Z" }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/ff/1e4a61f5170a9a1d978f3ac3872449de6c01fc71eaf89657824c878b1549/jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6", size = 55677, upload-time = "2026-04-02T08:10:06.749Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81", size = 77513, upload-time = "2026-04-02T08:10:01.753Z" }, +] + +[[package]] +name = "jupyter-mcp-server" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "fastapi" }, + { name = "jupyter-kernel-client" }, + { name = "jupyter-mcp-tools" }, + { name = "jupyter-nbmodel-client" }, + { name = "jupyter-server" }, + { name = "jupyter-server-client" }, + { name = "jupyter-server-nbmodel" }, + { name = "mcp", extra = ["cli"] }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-sdk" }, + { name = "pydantic" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "uvicorn" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/ae/7843fe02bb57c5a2928fa830b01779a3c2395ca382e91e690aac987fa054/jupyter_mcp_server-1.0.2.tar.gz", hash = "sha256:a1e1b4816d4cbc53944a6f76385e0c3b6b4d8aa5c9f855cbce153fad1b18c3fe", size = 80102, upload-time = "2026-04-27T06:08:37.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/5e/f306a728502f2d26988c76a882121dd1bb1a87c59e6db8b096a9a7b35903/jupyter_mcp_server-1.0.2-py3-none-any.whl", hash = "sha256:6be3c923fc6469094856e329dd593e4cbd4938cedb068b65697b3b1bc8543538", size = 111133, upload-time = "2026-04-27T06:08:36.01Z" }, +] + +[[package]] +name = "jupyter-mcp-tools" +version = "0.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "jupyter-server" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/f4/28e9cbdd05d3146d5adedc474f64a2d669c21b0e672d09b0885a1cc7c85a/jupyter_mcp_tools-0.1.6-py3-none-any.whl", hash = "sha256:45cb18658d5853a62faccd5e8ea17becc3a1850482a43c49a9e4bb2c854effd7", size = 45664, upload-time = "2026-01-08T15:32:10.559Z" }, +] + +[[package]] +name = "jupyter-mimetypes" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyarrow" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/45/cb4671e13fed39f721066ad1a00714d4b607982b8d3e97a25f836198d1df/jupyter_mimetypes-0.2.0-py3-none-any.whl", hash = "sha256:e6dcd989258e3fc944365b656d9173191517e0e393bd878e97ce500e5b388527", size = 16724, upload-time = "2025-08-10T18:18:27.309Z" }, +] + +[[package]] +name = "jupyter-nbmodel-client" +version = "0.14.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-ydoc" }, + { name = "nbformat" }, + { name = "pycrdt" }, + { name = "requests" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/f9/bf5a0ba321a227ba4c94bafa3d3950f9e773658773a81e379381b8687e25/jupyter_nbmodel_client-0.14.7.tar.gz", hash = "sha256:c9ff959ea26f5b2876271dfe37882c4674551e0e2aafc7633a4ebc57c0260563", size = 25909, upload-time = "2026-04-25T10:40:46.108Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/61/5d6ada9177f164f3ca0394af899d09a7bb82b6ba9bb5f1d559a9d9f53758/jupyter_nbmodel_client-0.14.7-py3-none-any.whl", hash = "sha256:ff9371378608dd46f5cb58e394493aa6bde4efcbabbcb988fc331f55b5b7cef3", size = 23025, upload-time = "2026-04-25T10:40:44.046Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/a0/eb3c511f54df7b54ca5fc7bff3f4d2277d69052d6a7f521643dfed5279d6/jupyter_server-2.19.0.tar.gz", hash = "sha256:1731236bc32b680223e1ceb9d68209a845203475012ef68773a81434b46a31a7", size = 754561, upload-time = "2026-05-29T11:21:26.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/78/d2881e68894cecdcd05912a9c585cfb776ef1fb38b62c8dba98f12ab3adc/jupyter_server-2.19.0-py3-none-any.whl", hash = "sha256:cb76591b76d7093584c2ad2ae72ac3d58614a4b597507a1bb04e1f9f683cf9ea", size = 392244, upload-time = "2026-05-29T11:21:23.871Z" }, +] + +[[package]] +name = "jupyter-server-client" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "requests" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/2e/d22899abfdbc6fdd33860152f2108e6f377b11083e951bb67e6472e0247b/jupyter_server_client-0.1.1-py3-none-any.whl", hash = "sha256:5fc28099b95ea4b02e0bc85760507701c4c4315801897129e4b6c606582cf025", size = 19683, upload-time = "2025-10-22T11:19:29.907Z" }, +] + +[[package]] +name = "jupyter-server-fileid" +version = "0.9.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-events" }, + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/eb/7c2c09454bbf66b3727ba8c431d16159d642c0eb1aa179412a4f7af721cf/jupyter_server_fileid-0.9.3.tar.gz", hash = "sha256:521608bb87f606a8637fcbdce2f3d24a8b3cc89d2eef61751cb40e468d4e54be", size = 54959, upload-time = "2024-09-06T07:18:40.412Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/d6/5e5bca083664b1dd368e261107cbe2d350e3bdc62bdba8720fdbb9b9db39/jupyter_server_fileid-0.9.3-py3-none-any.whl", hash = "sha256:f73c01c19f90005d3fff93607b91b4955ba4e1dccdde9bfe8026646f94053791", size = 16922, upload-time = "2024-09-06T07:18:38.445Z" }, +] + +[[package]] +name = "jupyter-server-nbmodel" +version = "0.1.1a4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/2a/1d13aa10cd573f6b823acc833f6f4cf6d1c2bd3b201f066496b78f964ed6/jupyter_server_nbmodel-0.1.1a4.tar.gz", hash = "sha256:ee072daa1e6b09db53f20e8f2d180d4f5e68dbff40003ad14dddfea8addf5cc3", size = 207265, upload-time = "2025-10-30T15:12:02.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/70/23edf6756dd2ae7c81ce5c2add66d986674d58072192152b80d417efbc4d/jupyter_server_nbmodel-0.1.1a4-py3-none-any.whl", hash = "sha256:f1c40906aaf98d6b66c3c9d5ebd6cad1b278d00c09d0a9227b0c15d972ec399a", size = 35316, upload-time = "2025-10-30T15:11:59.987Z" }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/a7/bcd0a9b0cbba88986fe944aaaf91bfda603e5a50bda8ed15123f381a3b2f/jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5", size = 31770, upload-time = "2026-01-14T16:53:20.213Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14", size = 13704, upload-time = "2026-01-14T16:53:18.738Z" }, +] + +[[package]] +name = "jupyter-server-ydoc" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jupyter-events" }, + { name = "jupyter-server" }, + { name = "jupyter-server-fileid" }, + { name = "jupyter-ydoc" }, + { name = "pycrdt" }, + { name = "pycrdt-websocket" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/fb/88a92c659864429342ab0d6c3b4829cdc6b008df10484820224e3871cf7b/jupyter_server_ydoc-2.4.0.tar.gz", hash = "sha256:74631f47a55d9dadf7dc918d78a083feaecc6c36af4d2fcdf26c0ee36bf70372", size = 33271, upload-time = "2026-05-11T11:04:41.019Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/6e/ec1dfa20b8efdf782a9fb162abc5e6a394bd122c21a0c9ff55e0e60f5a35/jupyter_server_ydoc-2.4.0-py3-none-any.whl", hash = "sha256:0442bf1e2ef8da16d7f0fb541db5080b249b43f098616cf8cd7dd173e4ae6cef", size = 34151, upload-time = "2026-05-11T11:04:39.135Z" }, +] + +[[package]] +name = "jupyter-ydoc" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "pycrdt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/de/f38e5b0b0705553ee0cb4ea87b8ad421cb1e8d79014b56a746f272def4d8/jupyter_ydoc-3.5.0.tar.gz", hash = "sha256:98a1918d7c2f333b62ad5ab88eaf1381a100dbe4c32ba80c263d3a02338af031", size = 973601, upload-time = "2026-06-03T14:13:53.53Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/20/36a7a146b469c551cd474c20f2ffa5e960042adef988eda74d19497a1d1f/jupyter_ydoc-3.5.0-py3-none-any.whl", hash = "sha256:092bfdd2e300e7e382349420f226a56efd41c7e6d8d2b9346e0870fba22adb80", size = 14534, upload-time = "2026-06-03T14:13:51.729Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.5.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "setuptools" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/22/8440ec827762146e7cdecf04335bd348795899d29dc6ae82238707353a2c/jupyterlab-4.5.7.tar.gz", hash = "sha256:55a9822c4754da305f41e113452c68383e214dcf96de760146af89ce5d5117b0", size = 23992763, upload-time = "2026-04-29T16:43:51.328Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl", hash = "sha256:fba4cb0e2c44a52859669d8c98b45de029d5e515f8407bf8534d2a8fc5f0964d", size = 12450123, upload-time = "2026-04-29T16:43:46.639Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, + { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, + { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, +] + +[[package]] +name = "lark" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, +] + +[[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/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 = "matplotlib" +version = "3.10.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/c6/5581e26c72233ebb2a2a6fed2d24fb7c66b4700120b813f51b0555acf0b6/matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1", size = 8319908, upload-time = "2026-04-24T00:12:21.323Z" }, + { url = "https://files.pythonhosted.org/packages/b7/18/4880dd762e40cd360c1bf06e890c5a97b997e91cb324602b1a19950ad5ce/matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320", size = 8216016, upload-time = "2026-04-24T00:12:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/d024616abdba99e83120e07a20658976f6a343646710760c4a51df126029/matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285", size = 8789336, upload-time = "2026-04-24T00:12:26.096Z" }, + { url = "https://files.pythonhosted.org/packages/5c/04/030a2f61ef2158f5e4c259487a92ac877732499fb33d871585d89e03c42d/matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2", size = 9604602, upload-time = "2026-04-24T00:12:29.052Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c2/541e4d09d87bb6b5830fc28b4c887a9a8cf4e1c6cee698a8c05552ae2003/matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf", size = 9670966, upload-time = "2026-04-24T00:12:32.131Z" }, + { url = "https://files.pythonhosted.org/packages/04/a1/4571fc46e7702de8d0c2dc54ad1b2f8e29328dea3ee90831181f7353d93c/matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6", size = 8217462, upload-time = "2026-04-24T00:12:35.226Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d0/2269edb12aa30c13c8bcc9382892e39943ce1d28aab4ec296e0381798e81/matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42", size = 8136688, upload-time = "2026-04-24T00:12:37.442Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d3/8d4f6afbecb49fc04e060a57c0fce39ea51cc163a6bd87303ccd698e4fa6/matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f", size = 8320331, upload-time = "2026-04-24T00:12:39.688Z" }, + { url = "https://files.pythonhosted.org/packages/63/d9/9e14bc7564bf92d5ffa801ae5fac819ce74b925dfb55e3ebde61a3bbad3e/matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e", size = 8216461, upload-time = "2026-04-24T00:12:42.494Z" }, + { url = "https://files.pythonhosted.org/packages/8a/17/4402d0d14ccf1dfc70932600b68097fbbf9c898a4871d2cbbe79c7801a32/matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f", size = 8790091, upload-time = "2026-04-24T00:12:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0b/322aeec06dd9b91411f92028b37d447342770a24392aa4813e317064dad5/matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838", size = 9605027, upload-time = "2026-04-24T00:12:47.583Z" }, + { url = "https://files.pythonhosted.org/packages/74/88/5f13482f55e7b00bcfc09838b093c2456e1379978d2a146844aae05350ad/matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2", size = 9671269, upload-time = "2026-04-24T00:12:50.878Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/0840fd2f93da988ec660b8ad1984abe9f25d2aed22a5e394ff1c68c88307/matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921", size = 8217588, upload-time = "2026-04-24T00:12:53.784Z" }, + { url = "https://files.pythonhosted.org/packages/47/b9/d706d06dd605c49b9f83a2aed8c13e3e5db70697d7a80b7e3d7915de6b17/matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8", size = 8136913, upload-time = "2026-04-24T00:12:56.501Z" }, + { url = "https://files.pythonhosted.org/packages/9b/45/6e32d96978264c8ca8c4b1010adb955a1a49cfaf314e212bbc8908f04a61/matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9", size = 8368019, upload-time = "2026-04-24T00:12:58.896Z" }, + { url = "https://files.pythonhosted.org/packages/86/0a/c8e3d3bba245f0f7fc424937f8ff7ef77291a36af3edb97ccd78aa93d84f/matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4", size = 8264645, upload-time = "2026-04-24T00:13:01.406Z" }, + { url = "https://files.pythonhosted.org/packages/3d/aa/5bf5a14fe4fed73a4209a155606f8096ff797aad89c6c35179026571133e/matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc", size = 8802194, upload-time = "2026-04-24T00:13:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5e/b4be852d6bba6fd15893fadf91ff26ae49cb91aac789e95dde9d342e664f/matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99", size = 9622684, upload-time = "2026-04-24T00:13:06.647Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/ed428c971139112ef730f62770654d609467346d09d4b62617e1afd68a5a/matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d", size = 9680790, upload-time = "2026-04-24T00:13:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/e7/09/052e884aaf2b985c63cb79f715f1d5b6a3eaa7de78f6a52b9dbc077d5b53/matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8", size = 8287571, upload-time = "2026-04-24T00:13:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/f4/38/ae27288e788c35a4250491422f3db7750366fc8c97d6f36fbdecfc1f5518/matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38", size = 8188292, upload-time = "2026-04-24T00:13:15.546Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e6/3bd8afd04949f02eabc1c17115ea5255e19cacd4d06fc5abdde4eeb0052c/matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d", size = 8321276, upload-time = "2026-04-24T00:13:18.318Z" }, + { url = "https://files.pythonhosted.org/packages/41/86/86231232fff41c9f8e4a1a7d7a597d349a02527109c3af7d618366122139/matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f", size = 8218218, upload-time = "2026-04-24T00:13:20.974Z" }, + { url = "https://files.pythonhosted.org/packages/85/8f/becc9722cafc64f5d2eb0b7c1bf5f585271c618a45dbd8fabeb021f898b6/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b", size = 9608145, upload-time = "2026-04-24T00:13:23.228Z" }, + { url = "https://files.pythonhosted.org/packages/32/5d/f7e914f7d9325abff4057cee62c0fa70263683189f774473cbfb534cd13b/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2", size = 9885085, upload-time = "2026-04-24T00:13:25.849Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fd/fa69f2221534e80cc5772ac2b7d222011a2acafc2ec7216d5dd174c864ae/matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716", size = 9672358, upload-time = "2026-04-24T00:13:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/ab/1a/5a4f747a8b271cbb024946d2dd3c913ab5032ba430626f8c3528ada96b4b/matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f", size = 8349970, upload-time = "2026-04-24T00:13:31.904Z" }, + { url = "https://files.pythonhosted.org/packages/64/dc/95d60ecaefe30680a154b52ea96ab4b0dab547f1fd6aa12f5fb655e89cae/matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456", size = 8272785, upload-time = "2026-04-24T00:13:34.511Z" }, + { url = "https://files.pythonhosted.org/packages/70/a0/005d68bc8b8418300ce6591f18586910a8526806e2ab663933d9f20a41e9/matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe", size = 8367999, upload-time = "2026-04-24T00:13:36.962Z" }, + { url = "https://files.pythonhosted.org/packages/22/05/1236cc9290be70b2498af20ca348add76e3fffe7f67b477db5133a84f3ea/matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6", size = 8264543, upload-time = "2026-04-24T00:13:39.851Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c2/071f5a5ff6c5bd63aaaf2f45c811d9bf2ced94bde188d9e1a519e21d0cba/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c", size = 9622800, upload-time = "2026-04-24T00:13:42.296Z" }, + { url = "https://files.pythonhosted.org/packages/95/57/da7d1f10a85624b9e7db68e069dd94e58dc41dbf9463c5921632ecbe3661/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4", size = 9888561, upload-time = "2026-04-24T00:13:45.026Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/ef8d6bb59b0edb6c16c968b70f548aa13b54348972def5aa6ac85df67145/matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf", size = 9680884, upload-time = "2026-04-24T00:13:48.066Z" }, + { url = "https://files.pythonhosted.org/packages/61/1c/d21bfeb9931881ebe96bcfcff27c7ae4b160ae0ec291a714c42641a56d75/matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39", size = 8432333, upload-time = "2026-04-24T00:13:51.008Z" }, + { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785, upload-time = "2026-04-24T00:13:53.633Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "mcp" +version = "1.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/3c/347cf965d313f5d41764e7d46bea6ffe7d9ef13b983cc429b0340962a082/mcp-1.27.2.tar.gz", hash = "sha256:8e02db104096d1c25b28e64bde29a5c32b31bc241710213e12fd4d84985bdfef", size = 621116, upload-time = "2026-05-29T17:16:04.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/11/252c6f971dc4f16af1d98a1c469d8ba523aab00d1bb76b4d3bc1ff32eacc/mcp-1.27.2-py3-none-any.whl", hash = "sha256:d6ff5160c6ca65d93013626efb3fc249de683c30b2d8570755ceddd490344de5", size = 220498, upload-time = "2026-05-29T17:16:02.442Z" }, +] + +[package.optional-dependencies] +cli = [ + { name = "python-dotenv" }, + { name = "typer" }, +] + +[[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 = "mistune" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "nats" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "jupyter" }, + { name = "jupyter-collaboration" }, + { name = "jupyter-mcp-server" }, + { name = "jupyterlab" }, + { name = "matplotlib" }, + { name = "nats-py" }, + { name = "numpy" }, + { name = "pandas" }, +] + +[package.metadata] +requires-dist = [ + { name = "jupyter", specifier = ">=1.1.1" }, + { name = "jupyter-collaboration", specifier = ">=4.4.0" }, + { name = "jupyter-mcp-server", specifier = ">=1.0.2" }, + { name = "jupyterlab", specifier = ">=4.5.7" }, + { name = "matplotlib", specifier = ">=3.10.9" }, + { name = "nats-py", specifier = ">=2.14.0" }, + { name = "numpy", specifier = ">=2.4.6" }, + { name = "pandas", specifier = ">=3.0.3" }, +] + +[[package]] +name = "nats-py" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/f8/b956c4621ba88748ed707c52e69f95b7a50c8914e750edca59a5bef84a76/nats_py-2.14.0.tar.gz", hash = "sha256:4ed02cb8e3b55c68074a063aa2687087115d805d1513297da90cb2068fb07bed", size = 120751, upload-time = "2026-02-23T22:44:58.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/39/0e87753df1072254bac190b33ed34b264f28f6aa9bea0f01b7e818071756/nats_py-2.14.0-py3-none-any.whl", hash = "sha256:4116f5d2233ce16e63c3d5538fa40a5e207f75fcf42a741773929ddf1e29d19d", size = 82259, upload-time = "2026-02-23T22:45:00.152Z" }, +] + +[[package]] +name = "nbclient" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "notebook" +version = "7.5.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, + { name = "jupyterlab" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/c2/cf59bd2e6f2c8b976b52477e3e53bf6f97bc714ed046a51821afb428eaee/notebook-7.5.6.tar.gz", hash = "sha256:621174aade80108f0020b0f00738000b215f75fa3cd90771ad7aa0f24536a4e1", size = 14170814, upload-time = "2026-04-30T11:46:26.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/d6/1fd0646b9bbd9efbb0b8ae21b2325fbef515769a5621c03e31d8eb8da587/notebook-7.5.6-py3-none-any.whl", hash = "sha256:4dde3f8fb55fa8fb7946d58c6e869ce9baf46d00fc070664f62604569d0faca0", size = 14581730, upload-time = "2026-04-30T11:46:22.342Z" }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +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/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" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.42.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/1c/125e1c936c0873796771b7f04f6c93b9f1bf5d424cea90fda94a99f61da8/opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716", size = 72296, upload-time = "2026-05-21T16:32:49.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/ca/9520cc1f3dfbbd03ac5903bbf55833e257bc64b1cf30fa8b0d6df374d821/opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714", size = 61311, upload-time = "2026-05-21T16:32:28.822Z" }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.42.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/f7/b390bd9bfd703bf98a68fea1f27786c6872331fd617164a54b8a59bdc008/opentelemetry_sdk-1.42.1.tar.gz", hash = "sha256:8c834e8f8c9ba4171d4ec843d0cb8a67e4c7394d3f9e9297e582cbd9456ddbf7", size = 239262, upload-time = "2026-05-21T16:33:04.641Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/6b/4287766cfbde577ae2272e8884abac325aeaac0d64f41c61d5b8cc595105/opentelemetry_sdk-1.42.1-py3-none-any.whl", hash = "sha256:083cd4bbfaa5aa7b5a9e552430d9951219967cfb27aa61feb13a77aba1fc839d", size = 170907, upload-time = "2026-05-21T16:32:45.894Z" }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.63b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/99/4d7dd6df64795951413ce6e815f8cf1eb191daf7196ae86574589643d5f3/opentelemetry_semantic_conventions-0.63b1.tar.gz", hash = "sha256:3daf963611334b365e98a57438183eb012d3bfb40b2d931a9af613476b8701a9", size = 148340, upload-time = "2026-05-21T16:33:05.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/7a/7fe66f5f3682b1dd47d88cc4e11f1c6c0966b737de2d16671146e23c39a5/opentelemetry_semantic_conventions-0.63b1-py3-none-any.whl", hash = "sha256:dfe5ef4dee82586b746f522b818ceb298d00b3d59f660042bd79404bff8d0682", size = 203713, upload-time = "2026-05-21T16:32:47.016Z" }, +] + +[[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 = "pandas" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" }, + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, + { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" }, + { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" }, + { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" }, + { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" }, + { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "propcache" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" }, + { url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654, upload-time = "2026-05-08T21:00:12.604Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" }, + { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" }, + { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" }, + { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" }, + { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" }, + { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" }, + { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" }, + { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" }, + { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" }, + { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" }, + { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" }, + { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" }, + { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835, upload-time = "2026-05-08T21:00:38.072Z" }, + { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" }, + { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" }, + { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" }, + { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" }, + { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" }, + { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" }, + { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" }, + { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257, upload-time = "2026-05-08T21:01:01.195Z" }, + { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" }, + { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" }, + { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" }, + { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" }, + { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" }, + { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" }, + { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" }, + { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662, upload-time = "2026-05-08T21:01:22.683Z" }, + { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928, upload-time = "2026-05-08T21:01:23.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650, upload-time = "2026-05-08T21:01:25.305Z" }, + { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912, upload-time = "2026-05-08T21:01:26.545Z" }, + { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300, upload-time = "2026-05-08T21:01:27.937Z" }, + { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208, upload-time = "2026-05-08T21:01:29.484Z" }, + { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633, upload-time = "2026-05-08T21:01:31.068Z" }, + { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724, upload-time = "2026-05-08T21:01:32.374Z" }, + { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069, upload-time = "2026-05-08T21:01:33.67Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099, upload-time = "2026-05-08T21:01:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391, upload-time = "2026-05-08T21:01:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626, upload-time = "2026-05-08T21:01:37.545Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781, upload-time = "2026-05-08T21:01:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570, upload-time = "2026-05-08T21:01:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" }, + { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" }, + { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395, upload-time = "2026-05-08T21:01:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653, upload-time = "2026-05-08T21:01:47.307Z" }, + { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914, upload-time = "2026-05-08T21:01:48.573Z" }, + { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567, upload-time = "2026-05-08T21:01:49.903Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542, upload-time = "2026-05-08T21:01:51.204Z" }, + { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845, upload-time = "2026-05-08T21:01:52.539Z" }, + { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985, upload-time = "2026-05-08T21:01:53.847Z" }, + { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999, upload-time = "2026-05-08T21:01:55.179Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779, upload-time = "2026-05-08T21:01:57.489Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796, upload-time = "2026-05-08T21:01:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023, upload-time = "2026-05-08T21:02:00.228Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448, upload-time = "2026-05-08T21:02:01.888Z" }, + { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329, upload-time = "2026-05-08T21:02:03.484Z" }, + { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172, upload-time = "2026-05-08T21:02:04.745Z" }, + { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" }, + { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pyarrow" +version = "24.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", hash = "sha256:85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83", size = 1180261, upload-time = "2026-04-21T10:51:25.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/a9/9686d9f07837f91f775e8932659192e02c74f9d8920524b480b85212cc68/pyarrow-24.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6233c9ed9ab9d1db47de57d9753256d9dcffbf42db341576099f0fd9f6bf4810", size = 34981559, upload-time = "2026-04-21T10:47:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/80/b6/0ddf0e9b6ead3474ab087ae598c76b031fc45532bf6a63f3a553440fb258/pyarrow-24.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:f7616236ec1bc2b15bfdec22a71ab38851c86f8f05ff64f379e1278cf20c634a", size = 36663654, upload-time = "2026-04-21T10:47:28.315Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3b/926382efe8ce27ba729071d3566ade6dfb86bdf112f366000196b2f5780a/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:1617043b99bd33e5318ae18eb2919af09c71322ef1ca46566cdafc6e6712fb66", size = 45679394, upload-time = "2026-04-21T10:47:34.821Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7a/829f7d9dfd37c207206081d6dad474d81dde29952401f07f2ba507814818/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6165461f55ef6314f026de6638d661188e3455d3ec49834556a0ebbdbace18bb", size = 48863122, upload-time = "2026-04-21T10:47:42.056Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e8/f88ce625fe8babaae64e8db2d417c7653adb3019b08aae85c5ed787dc816/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b13dedfe76a0ad2d1d859b0811b53827a4e9d93a0bcb05cf59333ab4980cc7e", size = 49376032, upload-time = "2026-04-21T10:47:48.967Z" }, + { url = "https://files.pythonhosted.org/packages/36/7a/82c363caa145fff88fb475da50d3bf52bb024f61917be5424c3392eaf878/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:25ea65d868eb04015cd18e6df2fbe98f07e5bda2abefabcb88fce39a947716f6", size = 51929490, upload-time = "2026-04-21T10:47:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/66/1c/e3e72c8014ad2743ca64a701652c733cc5cbcee15c0463a32a8c55518d9e/pyarrow-24.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:295f0a7f2e242dabd513737cf076007dc5b2d59237e3eca37b05c0c6446f3826", size = 27355660, upload-time = "2026-04-21T10:48:01.718Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a1abf004482026ddc17f4503db227787fa3cfe41ec5091ff20e4fea55e57/pyarrow-24.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:02b001b3ed4723caa44f6cd1af2d5c86aa2cf9971dacc2ffa55b21237713dfba", size = 34976759, upload-time = "2026-04-21T10:48:07.258Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4a/34f0a36d28a2dd32225301b79daad44e243dc1a2bb77d43b60749be255c4/pyarrow-24.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:04920d6a71aabd08a0417709efce97d45ea8e6fb733d9ca9ecffb13c67839f68", size = 36658471, upload-time = "2026-04-21T10:48:13.347Z" }, + { url = "https://files.pythonhosted.org/packages/1f/78/543b94712ae8bb1a6023bcc1acf1a740fbff8286747c289cd9468fced2a5/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a964266397740257f16f7bb2e4f08a0c81454004beab8ff59dd531b73610e9f2", size = 45675981, upload-time = "2026-04-21T10:48:20.201Z" }, + { url = "https://files.pythonhosted.org/packages/84/9f/8fb7c222b100d314137fa40ec050de56cd8c6d957d1cfff685ce72f15b17/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f066b179d68c413374294bc1735f68475457c933258df594443bb9d88ddc2a0", size = 48859172, upload-time = "2026-04-21T10:48:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d3/1ea72538e6c8b3b475ed78d1049a2c518e655761ea50fe1171fc855fcab7/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1183baeb14c5f587b1ec52831e665718ce632caab84b7cd6b85fd44f96114495", size = 49385733, upload-time = "2026-04-21T10:48:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/c3/be/c3d8b06a1ba35f2260f8e1f771abbee7d5e345c0937aab90675706b1690a/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:806f24b4085453c197a5078218d1ee08783ebbba271badd153d1ae22a3ee804f", size = 51934335, upload-time = "2026-04-21T10:48:42.099Z" }, + { url = "https://files.pythonhosted.org/packages/9c/62/89e07a1e7329d2cde3e3c6994ba0839a24977a2beda8be6005ea3d860b99/pyarrow-24.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:e4505fc6583f7b05ab854934896bcac8253b04ac1171a77dfb73efef92076d91", size = 27271748, upload-time = "2026-04-21T10:49:42.532Z" }, + { url = "https://files.pythonhosted.org/packages/17/1a/cff3a59f80b5b1658549d46611b67163f65e0664431c076ad728bf9d5af4/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:1a4e45017efbf115032e4475ee876d525e0e36c742214fbe405332480ecd6275", size = 35238554, upload-time = "2026-04-21T10:48:48.526Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/cce0f42a327bfef2c420fb6078a3eb834826e5d6697bf3009fe11d2ad051/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:7986f1fa71cee060ad00758bcc79d3a93bab8559bf978fab9e53472a2e25a17b", size = 36782301, upload-time = "2026-04-21T10:48:55.181Z" }, + { url = "https://files.pythonhosted.org/packages/2a/66/8e560d5ff6793ca29aca213c53eec0dd482dd46cb93b2819e5aab52e4252/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:d3e0b61e8efb24ed38898e5cdc5fffa9124be480008d401a1f8071500494ae42", size = 45721929, upload-time = "2026-04-21T10:49:03.676Z" }, + { url = "https://files.pythonhosted.org/packages/27/0c/a26e25505d030716e078d9f16eb74973cbf0b33b672884e9f9da1c83b871/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:55a3bc1e3df3b5567b7d27ef551b2283f0c68a5e86f1cd56abc569da4f31335b", size = 48825365, upload-time = "2026-04-21T10:49:11.714Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/771f9ecb0c65e73fe9dccdd1717901b9594f08c4515d000c7c62df573811/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:641f795b361874ac9da5294f8f443dfdbee355cf2bd9e3b8d97aaac2306b9b37", size = 49451819, upload-time = "2026-04-21T10:49:21.474Z" }, + { url = "https://files.pythonhosted.org/packages/48/da/61ae89a88732f5a785646f3ec6125dbb640fa98a540eb2b9889caa561403/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8adc8e6ce5fccf5dc707046ae4914fd537def529709cc0d285d37a7f9cd442ca", size = 51909252, upload-time = "2026-04-21T10:49:31.164Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1a/8dd5cafab7b66573fa91c03d06d213356ad4edd71813aa75e08ce2b3a844/pyarrow-24.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:9b18371ad2f44044b81a8d23bc2d8a9b6a6226dca775e8e16cfee640473d6c5d", size = 27388127, upload-time = "2026-04-21T10:49:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/ad/80/d022a34ff05d2cbedd8ccf841fc1f532ecfa9eb5ed1711b56d0e0ea71fc9/pyarrow-24.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:1cc9057f0319e26333b357e17f3c2c022f1a83739b48a88b25bfd5fa2dc18838", size = 35007997, upload-time = "2026-04-21T10:49:48.796Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ff/f01485fda6f4e5d441afb8dd5e7681e4db18826c1e271852f5d3957d6a80/pyarrow-24.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e6f1278ee4785b6db21229374a1c9e54ec7c549de5d1efc9630b6207de7e170b", size = 36678720, upload-time = "2026-04-21T10:49:55.858Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c2/2d2d5fea814237923f71b36495211f20b43a1576f9a4d6da7e751a64ec6f/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:adbbedc55506cbdabb830890444fb856bfb0060c46c6f8026c6c2f2cf86ae795", size = 45741852, upload-time = "2026-04-21T10:50:04.624Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3a/28ba9c1c1ebdbb5f1b94dfebb46f207e52e6a554b7fe4132540fde29a3a0/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:ae8a1145af31d903fa9bb166824d7abe9b4681a000b0159c9fb99c11bc11ad26", size = 48889852, upload-time = "2026-04-21T10:50:12.293Z" }, + { url = "https://files.pythonhosted.org/packages/df/51/4a389acfd31dca009f8fb82d7f510bb4130f2b3a8e18cf00194d0687d8ac/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d7027eba1df3b2069e2e8d80f644fa0918b68c46432af3d088ddd390d063ecde", size = 49445207, upload-time = "2026-04-21T10:50:20.677Z" }, + { url = "https://files.pythonhosted.org/packages/19/4b/0bab2b23d2ae901b1b9a03c0efd4b2d070256f8ce3fc43f6e58c167b2081/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e56a1ffe9bf7b727432b89104cc0849c21582949dd7bdcb34f17b2001a351a76", size = 51954117, upload-time = "2026-04-21T10:50:29.14Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/f4e9145da0417b3d2c12035a8492b35ff4a3dbc653e614fcfb51d9dedb38/pyarrow-24.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:38be1808cdd068605b787e6ca9119b27eb275a0234e50212c3492331680c3b1e", size = 28001155, upload-time = "2026-04-21T10:51:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/79/4f/46a49a63f43526da895b1a45bbb51d5baf8e4d77159f8528fc3e5490007f/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:418e48ce50a45a6a6c73c454677203a9c75c966cb1e92ca3370959185f197a05", size = 35250387, upload-time = "2026-04-21T10:50:35.552Z" }, + { url = "https://files.pythonhosted.org/packages/a0/da/d5e0cd5ef00796922404806d5f00325cdadc3441ce2c13fe7115f2df9a64/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:2f16197705a230a78270cdd4ea8a1d57e86b2fdcbc34a1f6aebc72e65c986f9a", size = 36797102, upload-time = "2026-04-21T10:50:42.417Z" }, + { url = "https://files.pythonhosted.org/packages/34/c7/5904145b0a593a05236c882933d439b5720f0a145381179063722fbfc123/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:fb24ac194bfc5e86839d7dcd52092ee31e5fe6733fe11f5e3b06ef0812b20072", size = 45745118, upload-time = "2026-04-21T10:50:49.324Z" }, + { url = "https://files.pythonhosted.org/packages/13/d3/cca42fe166d1c6e4d5b80e530b7949104d10e17508a90ae202dac205ce2a/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9700ebd9a51f5895ce75ff4ac4b3c47a7d4b42bc618be8e713e5d56bacf5f931", size = 48844765, upload-time = "2026-04-21T10:50:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/942c3b79878ba928324d1e17c274ed84581db8c0a749b24bcf4cbdf15bd3/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d8ddd2768da81d3ee08cfea9b597f4abb4e8e1dc8ae7e204b608d23a0d3ab699", size = 49471890, upload-time = "2026-04-21T10:51:02.439Z" }, + { url = "https://files.pythonhosted.org/packages/76/97/ff71431000a75d84135a1ace5ca4ba11726a231a8007bbb320a4c54075d5/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:61a3d7eaa97a14768b542f3d284dc6400dd2470d9f080708b13cd46b6ae18136", size = 51932250, upload-time = "2026-04-21T10:51:10.576Z" }, + { url = "https://files.pythonhosted.org/packages/51/be/6f79d55816d5c22557cf27533543d5d70dfe692adfbee4b99f2760674f38/pyarrow-24.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c91d00057f23b8d353039520dc3a6c09d8608164c692e9f59a175a42b2ae0c19", size = 28131282, upload-time = "2026-04-21T10:51:16.815Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pycrdt" +version = "0.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/88/e0c1b145f25f02ae0b95ce98cfa653941fc3e13ec95b1c90a62cd717a932/pycrdt-0.13.1.tar.gz", hash = "sha256:3d888fc5dafe17d6f53a1430c5342cd58f0f704cafb6ff3f565e597c50d99934", size = 85504, upload-time = "2026-05-21T12:36:25.545Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/47/61ecc2f5a2d2127a00ffeb3eae5e515f7fc07e203883001cd0c5f8e2c319/pycrdt-0.13.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0269fefddef54f529ef360554ec7ac967d01ba22677c65fc155addbb5c4329d1", size = 1700474, upload-time = "2026-05-21T12:35:00.511Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e5/595d8582952be13060556f2faa29bff2b10b9247011a1a5882240fea6f33/pycrdt-0.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084fd1c3a680764a1717c638d26dd238a953b8a66801ce34d0f4041963c525cf", size = 942672, upload-time = "2026-05-21T12:35:01.979Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0b/429b57dd1e0a1e8eb79ce8bbd97e1ecea8566c1ed7fea08f79bcd54ad0b0/pycrdt-0.13.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8a417723c723764f4621e03df16e7a19e55ed28048b7015afa04cc4e71338", size = 958984, upload-time = "2026-05-21T12:35:03.625Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a8/be64722f870b03cd8b50505567692f5615ebcc40c03b7dc7b1c1efe15547/pycrdt-0.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b69026155572547633af419d7e6da728aa53175b9df95b65a4850365ffc4d79", size = 1134053, upload-time = "2026-05-21T12:35:05.622Z" }, + { url = "https://files.pythonhosted.org/packages/e5/44/b5ba4ed6b2be26ded680a0a2115e749275f779c0db93d8bdc20dcf9f5874/pycrdt-0.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d5a4f4ff430a5ed71c33680ec69f6d914c12a4332ba67f4566c82688357046b", size = 984448, upload-time = "2026-05-21T12:35:07.104Z" }, + { url = "https://files.pythonhosted.org/packages/00/ec/7363504d395d6785f159830430e24ecb1e9d074e2ce364db39fbc104d94f/pycrdt-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:190819bf2eebb9153ae6cf35e62d09a57fd0de15176a5047c2cb27130f57381d", size = 954167, upload-time = "2026-05-21T12:35:08.794Z" }, + { url = "https://files.pythonhosted.org/packages/f8/83/46ab10d688add2a3dce155a3b3062f8cbf8080cd0b87b4e0f04cfeb1170b/pycrdt-0.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:425541aeb3c6809938685a680b21fecb09b352e7fb8a21a97e0742fa27cb8cb6", size = 1052431, upload-time = "2026-05-21T12:35:10.327Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4d/015157ec60a82cedcf9322b55bb8cc0c31fe15bb0582f0644d7655b04d49/pycrdt-0.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ea52a06fc84bebd719f515ce9a590e8bc5fc58f2a6c262db1cd01d727cf253", size = 1118940, upload-time = "2026-05-21T12:35:12.303Z" }, + { url = "https://files.pythonhosted.org/packages/1e/82/c9cab9cfc73cfa87ad97580822274f3a51aba47f9432b8c95795dae84f7a/pycrdt-0.13.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:06066675f65e228c22ebf5e5bb1e79fe463f89832b48899b092259c206256880", size = 1233250, upload-time = "2026-05-21T12:35:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/9d/64/9d9069e7572c8350206c315cf8431d50b03a8c7af8d8b8a4c19338d99fd5/pycrdt-0.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:29e99ae8c2c7eb31363af386f22221fb5b685710b7e665ac90a5f772c0dc3df5", size = 1226052, upload-time = "2026-05-21T12:35:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c6/2f2b36043170c511b0284987ecb346fa7e90709712600c9e298219b58bd3/pycrdt-0.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07692df4f1d493fabe7e337004a4cd671978833486f0d1dd481748f1f91350d2", size = 1167999, upload-time = "2026-05-21T12:35:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/a2/14/d1dc34597666a491683a1fd61439f3350180d0bc53101effb465f56698e9/pycrdt-0.13.1-cp312-cp312-win32.whl", hash = "sha256:b4640674e88978cdd12ad531c6b73ac2d72697b854ca04c968113a36cb98c867", size = 693890, upload-time = "2026-05-21T12:35:19.148Z" }, + { url = "https://files.pythonhosted.org/packages/29/d5/2b84f8e3e6aae2632c6ee7351b73fa74093795ba24751ec582773d881ca3/pycrdt-0.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:6502dc5eae7f9489da534fc847d61c7bedcaf014c65fd46dbb4a30ca298594a7", size = 753915, upload-time = "2026-05-21T12:35:21.208Z" }, + { url = "https://files.pythonhosted.org/packages/28/cd/235cb93a7f433143ac45e763b18151935836df1e84a270af782ad7393099/pycrdt-0.13.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3d75292bf0fbe416fbe6b34f2ced596076be4e1bde6f77faae4853a638feacc5", size = 1699984, upload-time = "2026-05-21T12:35:22.907Z" }, + { url = "https://files.pythonhosted.org/packages/b0/77/7100dde38be0329c2ee8bcc5f9f5082ac94011b5b56f200355dafdbab7b3/pycrdt-0.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ebefba643359c2db3c8f10a3d812d3806f3023c1eecce3e48d3763950a2a41", size = 943162, upload-time = "2026-05-21T12:35:24.683Z" }, + { url = "https://files.pythonhosted.org/packages/79/5e/1c6cb0821dcac685296eb4499ede3f078ba2c7eabfd0773f5eb03e60367a/pycrdt-0.13.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:caad1d5f16d545ace7bb1f859eeb2e1071996d265f6e28ed931822629e076ec8", size = 958569, upload-time = "2026-05-21T12:35:26.978Z" }, + { url = "https://files.pythonhosted.org/packages/be/19/5a6b6173e4cfb5bc729980e5f6cf5015a86830dd99eac8a3fe7a9c6c0b28/pycrdt-0.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea13f07212c0d6d9d6b9e39e709d6ba800e5149ecbf106c40ff07a7650737cc8", size = 1133971, upload-time = "2026-05-21T12:35:28.534Z" }, + { url = "https://files.pythonhosted.org/packages/0a/02/ed3a1f4250a0c70e47b9fd6e48b58f145944d9a7ac042815aca425575098/pycrdt-0.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9768efb933fcba7c2b84eee12b513976008e0ae9c8c969a14fc0dcae4cf3a4ca", size = 984562, upload-time = "2026-05-21T12:35:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/d2/46/871b5192b37f754915e3fe55482971003011bb582acf0f1b899e201538a9/pycrdt-0.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64312583dd395a64b87194513980f1a75b610ced3d53a677ec4b5d0840330ead", size = 953150, upload-time = "2026-05-21T12:35:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9d/c6bb32ee1599a88c94ee81db9f0d47298890d51cfa9ee9aeb58964554f59/pycrdt-0.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df94d22d4c65d8b38a1c8ca846a930f2a8e65df753ea2cd0d0f91a859a0e03d1", size = 1052470, upload-time = "2026-05-21T12:35:33.804Z" }, + { url = "https://files.pythonhosted.org/packages/f4/68/b045e851d2f2a7d63780991758e73e5877e1210f896d10e41fe5c2856e18/pycrdt-0.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cb46c4200dbbc2bbefbe0fe601a798d45f493b0f5b1c42aeb36c0087d3a7df14", size = 1119227, upload-time = "2026-05-21T12:35:35.489Z" }, + { url = "https://files.pythonhosted.org/packages/5f/fb/197db1dd0533cc23491b4ee5147548633e4b841155ae9d8b55310007c1ef/pycrdt-0.13.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2d2b92b6d18f1c0a961ef3f1c62ed98a1adc87b3654f555c665235d710716da8", size = 1233021, upload-time = "2026-05-21T12:35:37.088Z" }, + { url = "https://files.pythonhosted.org/packages/ed/7a/24a9f3a2d5462f5242f00ba14b0240ff146e939153935e0d5ce119a3a818/pycrdt-0.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:822b5bc632c4a35f0c92540230a5adecc56e31fe3c850a6c7c6af224285cfe51", size = 1226052, upload-time = "2026-05-21T12:35:38.771Z" }, + { url = "https://files.pythonhosted.org/packages/8e/64/10a4486f8c81ab795a908e6d4fc4f3e9377a20bff425b9f5088c6a03a9bf/pycrdt-0.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dd5814985f31298f1d0f974ffb596fa3d015238c7941e9f4c906251d7d70e96b", size = 1166791, upload-time = "2026-05-21T12:35:40.487Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8c/34017683d1ca4150935b5dbc06cac170d092e771f56be11f1bda14d8bdc1/pycrdt-0.13.1-cp313-cp313-win32.whl", hash = "sha256:a760b28edd2b7675197a597e7fc45f0ef090fef92f3a9a4940df32f7572b3f64", size = 693601, upload-time = "2026-05-21T12:35:42.021Z" }, + { url = "https://files.pythonhosted.org/packages/54/61/20c5fa63ce7a8dd7d0c561b56b39e61212429972344daeb1b2b066e632c0/pycrdt-0.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1e84e916df28f4e3f013b82513c55c2ddc824aeb0ecfe17b714907612fbbff14", size = 753755, upload-time = "2026-05-21T12:35:43.898Z" }, + { url = "https://files.pythonhosted.org/packages/c4/0c/638c7349e3b7ed7e7fcbf864eb9d52aa0e89e92c6e4fe676eeb89c6ad71f/pycrdt-0.13.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e91363d8d54aadd412800533ad57aa9827a37b40f36d5e7ec221ce48322a991f", size = 1704677, upload-time = "2026-05-21T12:35:45.931Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4b/4f85806ff9facea9eaf79e0000371a18e2dda0de5659f59cf4f4a8d8c5f6/pycrdt-0.13.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e331aad10fe48a28a5c93e73a062c7dee5a4c1f737d8d9571917f2e00e5135", size = 943811, upload-time = "2026-05-21T12:35:47.739Z" }, + { url = "https://files.pythonhosted.org/packages/a9/aa/319708859cd8fa3210842500b1b9ef4294df4a78d4340ac0f7f41a1bd6db/pycrdt-0.13.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b46415a38316c572c6830d1a4dc80d5c154edcdebf66f9a7ad1f85bd60d49024", size = 960229, upload-time = "2026-05-21T12:35:49.395Z" }, + { url = "https://files.pythonhosted.org/packages/3d/80/82c866b5340b4609279865696c368e997593ee11c3dbc1e12bc9164cc8b1/pycrdt-0.13.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f86e27480f2fcee9edbc10e87eb7cec226133e76b7ec5a3bc4ddb1183b25d014", size = 1133027, upload-time = "2026-05-21T12:35:50.998Z" }, + { url = "https://files.pythonhosted.org/packages/44/f8/016775ebf8f195e2fb496d94620113e600674830111b3a5adc7863c11c48/pycrdt-0.13.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:244997d5fe3fa890686dfa5ac65f29a03d50b38558d88dc8f481b8442816bec6", size = 988009, upload-time = "2026-05-21T12:35:53.004Z" }, + { url = "https://files.pythonhosted.org/packages/b8/70/e2ca9207f01aff3cbc73989495e9d75998913a6ffde96d1bff09c81fc024/pycrdt-0.13.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae0665289ab5bbb97549420dfd6b564b8a77af61800d3ccb2466c6cc6499ca0", size = 953916, upload-time = "2026-05-21T12:35:54.61Z" }, + { url = "https://files.pythonhosted.org/packages/03/08/9c56b4b65f75754ec0334fdf250070a4bfe236a1b794e21b9619afe2eae7/pycrdt-0.13.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43feea5a8e609fcc126177ff2d90a4553fca58588cd919c76923ddf409fa2605", size = 1052900, upload-time = "2026-05-21T12:35:56.494Z" }, + { url = "https://files.pythonhosted.org/packages/d4/bb/f6ad4b1461c3b04d86902edee81f31ae6fd975b1d4e9a39dcd3edcbab0c8/pycrdt-0.13.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:575b144fa59e43f78c15a54b7daa711d5c6ed30b7e59ad0fd0287bcfaab3814c", size = 1120428, upload-time = "2026-05-21T12:35:59.076Z" }, + { url = "https://files.pythonhosted.org/packages/2b/30/e0833d7009aca9282762d97bcac5c4c3a62537f21e3017aca3bc66802e39/pycrdt-0.13.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5d0c3253620238c29979cd1c3fb6bd8d19888be8214fb2e56451ed86199a9ebc", size = 1233497, upload-time = "2026-05-21T12:36:01.192Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/ad672adc1d13e173990c35800ee3c33a512e9059d9ee308278b9dc4ac843/pycrdt-0.13.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8211069ab33f0c6b50c00cb11468a48101cbde91c0dc190595e2182260231e93", size = 1227961, upload-time = "2026-05-21T12:36:02.983Z" }, + { url = "https://files.pythonhosted.org/packages/4f/78/ba256784d002ff47f49f9eea6f62fc6e5236d3ccb0efc1584aba440d8af4/pycrdt-0.13.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9125b985e464928174febdffc5f68c17c40008c10c802c054ff5efffaa3d0103", size = 1168790, upload-time = "2026-05-21T12:36:05.12Z" }, + { url = "https://files.pythonhosted.org/packages/0f/5a/e809bef4de5c32a6a17f3fc7b42841ad1fad66c6c36d46510541877ab814/pycrdt-0.13.1-cp314-cp314-win32.whl", hash = "sha256:326da14fd2ef10bb3f5d95a37f755983867d264c77b97f30918f624ab082d4a6", size = 693444, upload-time = "2026-05-21T12:36:06.788Z" }, + { url = "https://files.pythonhosted.org/packages/61/46/ee8f8e333106ce4bf1cf0f2fceb826ca550201e022bcab7aa95d4652ad9c/pycrdt-0.13.1-cp314-cp314-win_amd64.whl", hash = "sha256:2060ab2b67c17577fddb0cd5d9a6bc63c85c30255b8799f62cdbf38f1c5178f9", size = 754408, upload-time = "2026-05-21T12:36:08.555Z" }, +] + +[[package]] +name = "pycrdt-store" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "pycrdt" }, + { name = "sqlite-anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/b8/e621d2a6f763a2c59e00c293feb7ad2e81adc71a1a269431b9c834079aab/pycrdt_store-0.1.4.tar.gz", hash = "sha256:85f1f008fda5ca9140739b608de7d8612f5276fccd80af06689053640d541d77", size = 14835, upload-time = "2026-05-07T07:35:04.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/63/51732165c3a5ed25fd426735d17fcac14f5598b26eb22a6938cb00eaf66d/pycrdt_store-0.1.4-py3-none-any.whl", hash = "sha256:70f09b11de7fcde317079f7c5fc878bcd678f3a2ed0495571a87d0fca7011f22", size = 11840, upload-time = "2026-05-07T07:35:03.449Z" }, +] + +[[package]] +name = "pycrdt-websocket" +version = "0.16.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "pycrdt" }, + { name = "pycrdt-store" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/ad/0c7a542beb2e3bf3b79d517fdbc2bf2b568a16b1c853994d61816b18043e/pycrdt_websocket-0.16.2.tar.gz", hash = "sha256:924333747f504f27784231870ecd39c380d73047698bf4dcc87de07b7b87522d", size = 23790, upload-time = "2026-06-01T15:09:31.052Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/05/6b60e3f15a1fb82fe2830959ecb4aec403ed5817f57f0ce284e5c470d329/pycrdt_websocket-0.16.2-py3-none-any.whl", hash = "sha256:f496e40189a000605bba135dfd84fe95bf20d825bcf89bcf3ea2cf25667b480c", size = 14904, upload-time = "2026-06-01T15:09:29.75Z" }, +] + +[[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/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/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" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, +] + +[[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 = "pyjwt" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "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-json-logger" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/82/c8cd43a6e0719bf5a3b034f6726dd701f75829c08944c83d4b95d02ed0e8/python_multipart-0.0.30.tar.gz", hash = "sha256:0edfe0475c1f46ddd3ff7785a626f6118af32bdcf359bb21260367313bb32118", size = 46316, upload-time = "2026-05-31T19:24:55.198Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/fd/0318007beb234790993d3ec5afd051d1dbceb733e81e3afe2b981ece3f37/python_multipart-0.0.30-py3-none-any.whl", hash = "sha256:830964def8c90607ac5daa00514e3987815865713ade8d20febc9177ac0c3c5b", size = 29730, upload-time = "2026-05-31T19:24:53.814Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "pywinpty" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/54/37c7370ba91f579235049dc26cd2c5e657d2a943e01820844ffc81f32176/pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412", size = 31309, upload-time = "2026-02-04T21:51:09.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/d4/aeb5e1784d2c5bff6e189138a9ca91a090117459cea0c30378e1f2db3d54/pywinpty-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c9081df0e49ffa86d15db4a6ba61530630e48707f987df42c9d3313537e81fc0", size = 2113098, upload-time = "2026-02-04T21:54:37.711Z" }, + { url = "https://files.pythonhosted.org/packages/b9/53/7278223c493ccfe4883239cf06c823c56460a8010e0fc778eef67858dc14/pywinpty-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:15e79d870e18b678fb8a5a6105fd38496b55697c66e6fc0378236026bc4d59e9", size = 234901, upload-time = "2026-02-04T21:53:31.35Z" }, + { url = "https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab", size = 2112686, upload-time = "2026-02-04T21:52:03.035Z" }, + { url = "https://files.pythonhosted.org/packages/fd/50/724ed5c38c504d4e58a88a072776a1e880d970789deaeb2b9f7bd9a5141a/pywinpty-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:fe1f7911805127c94cf51f89ab14096c6f91ffdcacf993d2da6082b2142a2523", size = 234591, upload-time = "2026-02-04T21:52:29.821Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ad/90a110538696b12b39fd8758a06d70ded899308198ad2305ac68e361126e/pywinpty-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:3f07a6cf1c1d470d284e614733c3d0f726d2c85e78508ea10a403140c3c0c18a", size = 2112360, upload-time = "2026-02-04T21:55:33.397Z" }, + { url = "https://files.pythonhosted.org/packages/44/0f/7ffa221757a220402bc79fda44044c3f2cc57338d878ab7d622add6f4581/pywinpty-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:15c7c0b6f8e9d87aabbaff76468dabf6e6121332c40fc1d83548d02a9d6a3759", size = 233107, upload-time = "2026-02-04T21:51:45.455Z" }, + { url = "https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9", size = 2113282, upload-time = "2026-02-04T21:52:08.188Z" }, + { url = "https://files.pythonhosted.org/packages/63/32/40a775343ace542cc43ece3f1d1fce454021521ecac41c4c4573081c2336/pywinpty-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:34789d685fc0d547ce0c8a65e5a70e56f77d732fa6e03c8f74fefb8cbb252019", size = 234207, upload-time = "2026-02-04T21:51:58.687Z" }, + { url = "https://files.pythonhosted.org/packages/8d/54/5d5e52f4cb75028104ca6faf36c10f9692389b1986d34471663b4ebebd6d/pywinpty-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0c37e224a47a971d1a6e08649a1714dac4f63c11920780977829ed5c8cadead1", size = 2112910, upload-time = "2026-02-04T21:52:30.976Z" }, + { url = "https://files.pythonhosted.org/packages/0a/44/dcd184824e21d4620b06c7db9fbb15c3ad0a0f1fa2e6de79969fb82647ec/pywinpty-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c4e9c3dff7d86ba81937438d5819f19f385a39d8f592d4e8af67148ceb4f6ab5", size = 233425, upload-time = "2026-02-04T21:51:56.754Z" }, +] + +[[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/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 = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { 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 = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, +] + +[[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 = "2026.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", hash = "sha256:07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256", size = 64459, upload-time = "2026-05-28T12:02:13.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/e7/a78582dc57caa592dcc7d4fb69b61390561e908eb3d2f5df5928a8e354c0/rpds_py-2026.5.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3abe24a66e57adcfa645d718063a5fa5103ecc71ddbf26d78af8f9368018ff1d", size = 353040, upload-time = "2026-05-28T11:59:12.531Z" }, + { url = "https://files.pythonhosted.org/packages/a3/43/35e3f136343aef451e545ce8c38d36c2f93c0ed88703db8b64ba2b205c68/rpds_py-2026.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b1d94308ddf0b1982f61f2eb54bf92997c9ece8a8093ef014250f4a517906c", size = 345775, upload-time = "2026-05-28T11:59:13.827Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/0f2160c5982d3157734d5cb3ed63d8b2d583a73c9864f77b666449f32cf8/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa92420128dadce7f54bd73ba1825a273e9268fe9e35dbf7e6362890efa4e08", size = 376329, upload-time = "2026-05-28T11:59:15.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/11/ee0ba42aff83bf4effdbc576673c6be64c5e173978c3f6d537e94482f77d/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca653c6546386227cd9800d1bef6a348099acf8db4250341da6d90f663d6dfcb", size = 383539, upload-time = "2026-05-28T11:59:16.665Z" }, + { url = "https://files.pythonhosted.org/packages/11/df/d94aa6a499d4ac40afe2d7620f2c597fd3c0f182e854ad7cf3f596a81cb6/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66c93681c4729e4e3ecba31b8179fae083ff3118841672835140338b4b9867c1", size = 494674, upload-time = "2026-05-28T11:59:17.991Z" }, + { url = "https://files.pythonhosted.org/packages/1f/75/33d30f43bb2f458de11979486a591b1bf6e5651765ed1704c6197c2dc773/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ff257542e04796880e011e15cd4dc21c2599975df2aaa8f2c8495ca574e1a5", size = 389268, upload-time = "2026-05-28T11:59:19.434Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1e/2c9096fc19d5fd084b0184ca2b651e659aa0a37e6fdbecf6ece47f147fe1/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6825cc329b290e93c5f6a9be2393118a763f6ccf6abd83704e0c102ca583644", size = 376280, upload-time = "2026-05-28T11:59:21Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e5/61ec9f8be8211ea7f48448195549e4aaf02004083475493b0e137702ecb2/rpds_py-2026.5.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:de42116e69cb53b911cc34aee5ab98f36c597b822545045d49e938818b99e5e4", size = 387233, upload-time = "2026-05-28T11:59:22.454Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/bcec1005c4f4a234f92a29078631fee49206c7265ccae966f18fd332e80e/rpds_py-2026.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0f920015df2a504bebaba6d4c31ccf3fcf942f92655c086da30b671aad19aa6", size = 405009, upload-time = "2026-05-28T11:59:23.845Z" }, + { url = "https://files.pythonhosted.org/packages/72/e6/4d5718c5cf26c522dc7c9999e238da1e77380b81d0c5d1df11e271ddfeb1/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0408a24e44feb919423dc6d9da677cb5cddb894d2ca9e763967d156d9c60fab4", size = 553113, upload-time = "2026-05-28T11:59:25.184Z" }, + { url = "https://files.pythonhosted.org/packages/d4/25/2ee807bdb3e1f0b7eddf7782acd5665a8b5205a331a7d7244a52c4812fd9/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cea68bcd53467561ae2f96a6bdad1544299ba97b5b0ddcd5ac3d376e5c781c24", size = 618838, upload-time = "2026-05-28T11:59:26.749Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c1/7d4c26f167f8c41501cc073d30ee22082b16ce358cf5b00ec97cbc7804ea/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4be8b1d2a705cc37d08256004e1d07de143fa0075c8e85a3df020b776f62b732", size = 582436, upload-time = "2026-05-28T11:59:28.11Z" }, + { url = "https://files.pythonhosted.org/packages/04/1d/9d12b0a337bab46f4769f8857f4007e3b2d639e14f9a44a0efe157696e64/rpds_py-2026.5.1-cp312-cp312-win32.whl", hash = "sha256:6736718bd4fc49cbcb538ba30516fdbef161522acefb739657d48b97bd864fed", size = 212734, upload-time = "2026-05-28T11:59:29.689Z" }, + { url = "https://files.pythonhosted.org/packages/c5/93/e4116f2de7f56bc7406a76033dc501811ddeb22b7f056b92d632871ebb0c/rpds_py-2026.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:0a7d1eec967df0e9b22614a5e177622e0c89611d03727fa0cb48e45028907870", size = 229045, upload-time = "2026-05-28T11:59:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/53/6c3419d85eb2ec5938a37627c585b42d76a63bb731d6e42ed4b079ebf486/rpds_py-2026.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1841d067089e117142d79b98aa0df2f08b52f2ecc1819dd2700636c0db74a473", size = 223967, upload-time = "2026-05-28T11:59:32.318Z" }, + { url = "https://files.pythonhosted.org/packages/6c/32/14c961ad295f490eb0849ada8b79683e93a59b9de3afdd983eaf55fa6867/rpds_py-2026.5.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:efef4ac29c6ff495531eb17ee705b62841ecaa291b7c7077e848ea03e237164d", size = 352787, upload-time = "2026-05-28T11:59:33.655Z" }, + { url = "https://files.pythonhosted.org/packages/ca/bb/d1b85117967c11191441a7274ae616c65d93901d082c588f89a50a8da5ae/rpds_py-2026.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c39f5b67a8a2e67179ada2a954227d670fe65fa9098457f698f56ddf248709b3", size = 345179, upload-time = "2026-05-28T11:59:35Z" }, + { url = "https://files.pythonhosted.org/packages/7c/46/d84105f062e626a1b233f863907288a4708c2d833b8b4c6fb2764bc080c0/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5c30f3f04eef4fbd362226a6f31d7c8895ca4fbb6e0b790f6890a98d8da8559", size = 376173, upload-time = "2026-05-28T11:59:36.43Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/469d7959ce5b1201e1de135dc735b86db3b35dd0d1734f6a44246d5f061c/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:277f6c82f0580848796c7ecc8a7173aa3bfb928e4ff831261c2f60a81dc270db", size = 383162, upload-time = "2026-05-28T11:59:37.995Z" }, + { url = "https://files.pythonhosted.org/packages/dc/a2/57853d31a1116a561aa072794602ad3f6341e18d70a8523f1bd5b9fc1e5a/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63c2c4c213f1a4e3f3de28ecab029dbdee976324e729c0d7a55211be72576b02", size = 495093, upload-time = "2026-05-28T11:59:39.453Z" }, + { url = "https://files.pythonhosted.org/packages/99/63/3a8eabcad9314b7daf5c65f451d2c33d989235cd8a5762186cf2c3f5a4f8/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3350ec808fb538fe71a1f94dfaa0e29c598dfad805ce49f0caec5ae3183c652b", size = 389829, upload-time = "2026-05-28T11:59:40.896Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/05678d97fc25e2622df14dc530fb82023174ecfff6733991ed0d78f167bd/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b964e3ab599e718dc46c018d104b1ebc007cbc6567d827c94a687fca56d77e", size = 374786, upload-time = "2026-05-28T11:59:42.626Z" }, + { url = "https://files.pythonhosted.org/packages/88/d1/8c90b6431e80a3b91b284a5c7c8c0c4f9c006444d90477a740d6e0f9c694/rpds_py-2026.5.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:19cb09fab7b7fc96b2a6e28f2e34b72a3705ff27b37edb77455316e5d3f3dc9b", size = 386920, upload-time = "2026-05-28T11:59:44.124Z" }, + { url = "https://files.pythonhosted.org/packages/ff/99/4638f672ab356682d633ee0da9255f5b67ce6efd0b85eb94ad3e255e65a5/rpds_py-2026.5.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abe76bcdba31e576cb83eeb8797aa0d882b738fef6dc65d0601fc753806a5b46", size = 405059, upload-time = "2026-05-28T11:59:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/66/3f/3546524b6eb4cc2e1f363a3d638fa52f6c24faae3500c25fb488b02f1740/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bff7073db3899158fff55ebf57b113a67030af26f80a18978f9f0aa60250ddf", size = 553030, upload-time = "2026-05-28T11:59:48.603Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c3/7b3388c796fcf471bd17194242d4dc1a7608567c0fa422bcc1c5e79f9c1e/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8ba264fa49be666cd9cc56bf34ec7002fb3d27a4aee5bcb4d43d0d18feb1bb6f", size = 618975, upload-time = "2026-05-28T11:59:50.314Z" }, + { url = "https://files.pythonhosted.org/packages/61/1e/a3cb07f2795075d1d88efddae2f541359fde5f08c81ee114c29c2949c90a/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4860b603ddda0475a8885499b3729e90229d480105b42651962a5397d995fa89", size = 581178, upload-time = "2026-05-28T11:59:51.673Z" }, + { url = "https://files.pythonhosted.org/packages/a1/74/e758c03a5ef46f04c37f2651a2893db846d569ba8a7bca469d4b58939bcd/rpds_py-2026.5.1-cp313-cp313-win32.whl", hash = "sha256:7944270ae71383f6e2657dd7d5ce4eeb4ac2d0059a6738f0510583d462ab4842", size = 212481, upload-time = "2026-05-28T11:59:53.148Z" }, + { url = "https://files.pythonhosted.org/packages/70/ec/a2aca432db9c7359b40fa393eeeaa0d166c2f70175be956e75fa24197c44/rpds_py-2026.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:88647f43a73c4e01be19b04ceef0c8d3a1958153604d13c773becd8016f2a0cf", size = 228519, upload-time = "2026-05-28T11:59:54.505Z" }, + { url = "https://files.pythonhosted.org/packages/29/60/a73bfdd45b096574556acf303bbd9fa9eed36ca8a818b514e2a5d5fe2b9d/rpds_py-2026.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:453895624ecf7db7063b1004e44037522bbaef9ff6a945e59bc71662d7a03abd", size = 223446, upload-time = "2026-05-28T11:59:56.081Z" }, + { url = "https://files.pythonhosted.org/packages/18/e2/408105fd611823f00882aea810f3989a30d26b1bab8b6beb20f98c724e0e/rpds_py-2026.5.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:b4e4bc98639ec915f512fde3aa7a95e0041d95d9c3cc86eea841fa63cb1e8600", size = 355287, upload-time = "2026-05-28T11:59:57.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/58/5c4a43436843c90d0f6d19f82c200c80e3843ca9fa07b237623327f6d384/rpds_py-2026.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cacedb7a6e167680acba45ad5716e89067d225dc80da0d7040cae8c81d4572fa", size = 347033, upload-time = "2026-05-28T11:59:58.881Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c2/1a71acdacaf4e259b10278fb87b039ded3cf80041bcd89dd8a3ea702ded6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68700371c5d7ae1412862ddfa719090925c93ecf351c566d66f09d04b136ea00", size = 376891, upload-time = "2026-05-28T12:00:00.516Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c8/535f3d9b65addd8e28aa87b83c6e526799c3717a88273db8ea795beeef7a/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:296c799becfa849c779c8725494fe9ed94959ed886787df4364b058465bad7f0", size = 385646, upload-time = "2026-05-28T12:00:02.394Z" }, + { url = "https://files.pythonhosted.org/packages/1c/91/dc033f313345c354ade914dbe73cdb90b615a4409ea02430d5356794f3d8/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3858b908218ee108d0bbfb2095ccc237648053c9bf98affad7cb079acaf1d97", size = 498830, upload-time = "2026-05-28T12:00:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/27/fc/90fcbea459dbb8ddc18a2e0fd1de9412b48bc84ffff2db771cf714bacfd6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4fb8d2e7cb2f850b169806d61d1b991738acec96500a75c30f49caf064ce7cef", size = 392830, upload-time = "2026-05-28T12:00:05.797Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1d/46cd11a228c9750684a798d98f878be6f614aa762438da7378f035e79e35/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b74c10ed6a8f190f4287f53bcfea348b92a84a9c9f70d30183d1e6172d580d", size = 379613, upload-time = "2026-05-28T12:00:07.433Z" }, + { url = "https://files.pythonhosted.org/packages/24/4a/d9b0c6af3a1de03eb93741bbe8be2bdce84d8fda8224f3005451d86df389/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b9a6528956191c48c52294a592dbd4a8386d7048bdb25c0efcb6b966466c6d83", size = 388183, upload-time = "2026-05-28T12:00:09.227Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b4/db7aaabdda6d020afc87d981bcc2f57a434c7dec60ecfc2ab3dd50b20351/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af03e34e860047bc7a352b842856fcf78798fbb81132cc98bd2f907ab4eb9cd2", size = 408578, upload-time = "2026-05-28T12:00:10.779Z" }, + { url = "https://files.pythonhosted.org/packages/08/d6/070f6a41cbb343e2ac4171859bf3f3623e0ab002f72619d6d505313ec2de/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fea6e836d10abbe191d557d33bd58bd5987725fe63aa1eefe557d230209855bd", size = 553573, upload-time = "2026-05-28T12:00:12.443Z" }, + { url = "https://files.pythonhosted.org/packages/75/ab/1a71ea3589c4345dac0a0518f0e6a031cb42689277851b683c46d27463a5/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:fc0c0f878ea770a0a8a462456c5ad36fc9fe6358e6b76fdadc7f17575e0b8bf1", size = 620861, upload-time = "2026-05-28T12:00:14.09Z" }, + { url = "https://files.pythonhosted.org/packages/8a/22/9bf80a56069c0c443fcfefac639a86a744550a2898817a6dfd3e26654924/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e0b360f316d966b048b085857630b3cc51f3db2f07b06f440eac8f695374d1e3", size = 585633, upload-time = "2026-05-28T12:00:15.66Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/3b2c0a75c9e04125696f84ebdbbf304acf5a40b58ba4481cdb98a922c3ba/rpds_py-2026.5.1-cp313-cp313t-win32.whl", hash = "sha256:a2999883eedf72fdfb7520b92c7d4ec2572a71ff40239377aa604cc529eecafc", size = 210074, upload-time = "2026-05-28T12:00:17.291Z" }, + { url = "https://files.pythonhosted.org/packages/e7/8b/609157d5a25d37d4f29f92840ba531f416907c34ae5c5739dd21fc2bef98/rpds_py-2026.5.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e07be2a9d7122bd6e82dea89814ef8dc893feb1aae97fec1630f3263bbb30e55", size = 228635, upload-time = "2026-05-28T12:00:18.73Z" }, + { url = "https://files.pythonhosted.org/packages/d4/6f/19c1918a4b590d8de87e712e4abe4b3875771eff60216fb6153cf6665c68/rpds_py-2026.5.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:1f2c391c3059798093b65df23aca2cac150460ae9c630d99dec83d703d9485b9", size = 349756, upload-time = "2026-05-28T12:00:20.217Z" }, + { url = "https://files.pythonhosted.org/packages/e5/60/a06fe7da34eca79dacbf958a2ba0c6eea85bc2b29de20080bf40f72f66fa/rpds_py-2026.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:413b424f7c4ee65ab5e5be91f5731be0f8b41a1ee2b12dfe810d716312e95a78", size = 343831, upload-time = "2026-05-28T12:00:21.711Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ec/b2333b97b90e2a6ef6ca8ad386ee284968e74bcfe113b3f1a8d9036429a9/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c595a1d9255dce0599e13130d1440ab2506654f2b50294226ee06402f8fef63", size = 375127, upload-time = "2026-05-28T12:00:23.326Z" }, + { url = "https://files.pythonhosted.org/packages/14/7f/e00aae54067f2b488c4637961d5f58204d470795fc791085fa3f15060d2e/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c27c5f6102eac8c03e7595a00827a53b271ba40a53b59ff8709170e0855ea4a", size = 379034, upload-time = "2026-05-28T12:00:24.89Z" }, + { url = "https://files.pythonhosted.org/packages/be/cc/423999bbb8ae8dc93c77fc1d5e984ade5eb89d237d3bb884ccfa72ae2890/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c7fcf61d44cacecaf3aea542b0e053db77972a4573e7ceda16fb2b399161195", size = 490823, upload-time = "2026-05-28T12:00:26.676Z" }, + { url = "https://files.pythonhosted.org/packages/0f/aa/c671bf660f12e68d3c52ff86c7066ed1372df5a0f4f2ff584e419b8207e7/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c817a189d4ee14290420e5ff051e4dd6baa13f3edf84685071dee07a6d538ee", size = 388144, upload-time = "2026-05-28T12:00:28.577Z" }, + { url = "https://files.pythonhosted.org/packages/19/c8/d63bb75b68afe77b229e3021c6031bcaf01da5db5b0e69d0d10f9ba679a7/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21846aac0ed2e0589f38c12dc44e77bb64e494b771eadbcf169cba00566ba7ba", size = 371959, upload-time = "2026-05-28T12:00:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/82/35/c51122014d8274ff37dc606d60049c3db7d83da02b5b282511e5a906a9a6/rpds_py-2026.5.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b317c87a13f769a4e787819bd508aaa5d69aa09b0880de9af6d3a8a54571cdec", size = 383558, upload-time = "2026-05-28T12:00:31.764Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f9/2790cb99c136a5363acdeacf5c27c56f3de0d4118a1f48fca83404c99c89/rpds_py-2026.5.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce87129d9f2c14fa6c4a8601fb80eb4488c80d38a20cd13758ef11123e14995d", size = 402789, upload-time = "2026-05-28T12:00:33.247Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1b/e4fb584f8c75d35c38150ff6a332cda949e6f97acba1f4fd123b14ab56fe/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9cdddb6c1207d284d94fd1530adf57fbd797fe7c4b8704ba85f49414f2557e7d", size = 551405, upload-time = "2026-05-28T12:00:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f7/a6731b4216cb3793ea1af5391da240f5683dacc0d13e034fe5fc3503f240/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4e237e139f94d3c036fd28eb9f564c99055476ff4ff05cd42be55ce349b5aa02", size = 616975, upload-time = "2026-05-28T12:00:36.268Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/2e051a81d95d8e63f4b35a1c463a87e8766bc3d083c067c5dfb6bf220747/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ed0954b524873214369184a9c82b0eaa45a3fbb9a798cd95b17e0d98499e7ea0", size = 578701, upload-time = "2026-05-28T12:00:37.82Z" }, + { url = "https://files.pythonhosted.org/packages/65/56/b5f6fdb2083e32bca8a8993d89e70db114b4756c9e2c38421328126689d2/rpds_py-2026.5.1-cp314-cp314-win32.whl", hash = "sha256:2d88621d6a7d4dfa633d21abe90f280bb205274e16b1d1e61c6ad4640b2453b7", size = 209806, upload-time = "2026-05-28T12:00:39.492Z" }, + { url = "https://files.pythonhosted.org/packages/fb/80/65a5aa96c155e611d1ed844e4e1f57f3e36b021f396d9f8585d756e6b90d/rpds_py-2026.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:cef8ac28d26f4dda3533060c20fbf80a325458fa9fd23ea72a73cdfa8e978838", size = 225985, upload-time = "2026-05-28T12:00:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/27/7c/ad185212e87b05f196daef92bc5f3caf07298eb47c295b5585c3dd3093ac/rpds_py-2026.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:eaaea962c68cdc68d4a533ba985ab8e9484277910bbfaa2ab3ef7732667bfed8", size = 221219, upload-time = "2026-05-28T12:00:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/23/58/e14ae18759020334646b031e708ab4158d653a938822bfb7b95ef2e93aa3/rpds_py-2026.5.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:21942f52dbbd5f8758bf021213d28bd45c39e873e65e2407faf5f1846f5761ad", size = 352148, upload-time = "2026-05-28T12:00:44.638Z" }, + { url = "https://files.pythonhosted.org/packages/31/9b/5f4a1e2f960bca3ac5d052b139dd31eed97b259f9d909173821760d542e8/rpds_py-2026.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f414556f6e3958300ff941e40c9f97e3dc9774ddd1b3434c475d73dd354bbed3", size = 345196, upload-time = "2026-05-28T12:00:46.14Z" }, + { url = "https://files.pythonhosted.org/packages/1a/71/1d9574d6a2fa20ab60eaa55c7467f5aa20cbc770f341a05f09c0876f59e2/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1013a8625c74043210190b246f5b1551e09757c1f356c6e4160ef96c5bc081", size = 374981, upload-time = "2026-05-28T12:00:47.531Z" }, + { url = "https://files.pythonhosted.org/packages/0c/9a/37e99f4915a80aa71670263c1267f7ae0af95f53a3f61e6c3bdc016d4515/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc68e231a77a5f0d774ae278a1f8e55c0456501820847c1e4efb3829f3441df6", size = 379961, upload-time = "2026-05-28T12:00:49.216Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ff/6e73f74b89d2e0715e0fc86b7dde893f9a61ae2f9b256ff3bdfe41ac4e94/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9baffb505aff33acc69b422a19f77806680f3c8632227d79f48de8a810d1c2c5", size = 495965, upload-time = "2026-05-28T12:00:51.111Z" }, + { url = "https://files.pythonhosted.org/packages/ea/e0/425faba25f59d74d4638b267f7c7a80e8649d2ef4db10a19b0c4a71e6e6f/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8d2f912928d426e8cfa396f7f3f8d29a59e6689c86dcca3c420730c1096322b", size = 389526, upload-time = "2026-05-28T12:00:52.77Z" }, + { url = "https://files.pythonhosted.org/packages/c6/76/7a41960e3fddae47fab43a28684d5da981401dffd88253de0944148654cb/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90f628283be835db980c941767d41c9a27b5239e54ba0a9c1335247e82406964", size = 376190, upload-time = "2026-05-28T12:00:54.215Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/5f38dc70824fc6951b51d35377e577a3a3a4c81a6769cc5a2de25ebe0ad1/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:1ebb2f0ab7e16132995a72de805170e0203df0c3dd22e1ef1cd1fdd90bd7a131", size = 383921, upload-time = "2026-05-28T12:00:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/60/1a/d60a38caa1505f4b9483c3fbbde12c94e1079154f4f401a6da96f7e77621/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f3df3d16ded76f1f8c9cdebd0e1ea55fdf4c23b812de189814da7cf229c22a81", size = 404766, upload-time = "2026-05-28T12:00:57.518Z" }, + { url = "https://files.pythonhosted.org/packages/87/ff/602fd3f174d6425f0bce05ad0dfbec0e96b38d0f7d08a79af5aa20083885/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9af8905b8f854990e40d5206aa5ac58d9b0fe0b7f351ff2bb086c20f6c8c6a47", size = 551343, upload-time = "2026-05-28T12:00:58.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c1/1be13327acdbead3eca1fde03b6a34dbb011f1e864e217f0d32cc1779a7f/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:036a36a87fb1cd3b214d11c4b3c4f7d2ddad933625dca1c900b56a057c07740a", size = 618502, upload-time = "2026-05-28T12:01:00.656Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d7/afb49b49d7f2be8b7ba1a9f0977fa5168003437b93086726f066544e8351/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ae3853454fe9ef283a03c96c2d835d39e84b14643a9d62c82ef0fb87d702ca", size = 581916, upload-time = "2026-05-28T12:01:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/dbef8c1f8a10f07beb62b5f054e20099fd9924b3ec001b8f0b6ac7813a85/rpds_py-2026.5.1-cp314-cp314t-win32.whl", hash = "sha256:6c3d771a46ec18b12af06ce36243a9a80b07a5d0515236332d90863ca8bb326a", size = 207855, upload-time = "2026-05-28T12:01:03.821Z" }, + { url = "https://files.pythonhosted.org/packages/2a/72/bfa4e61ab8e7dc1c8adf397e05e6cbdd4239357bd72b248d3de662f23915/rpds_py-2026.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c93c629be4636cf54337bd5f06c104d55e42ced54d681f6fe21ae510a65116f6", size = 225422, upload-time = "2026-05-28T12:01:05.194Z" }, + { url = "https://files.pythonhosted.org/packages/27/3a/7b5da92b640f67b6717ccafc83cdd06bfa7ff2395c3685c68922bb54d703/rpds_py-2026.5.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:3574b55c604b8f75dacb007136508bbc0db406e626301778096a133327e7f2fb", size = 349576, upload-time = "2026-05-28T12:01:06.722Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8a/2aafd7ad355a1bd48ca76e2262b74b15e6432b5a1efe150efd4d779cd55d/rpds_py-2026.5.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:94068eb3ae6d43f5a786b7db96a406a34e6d5c24489feef32fd6e8946ea7b291", size = 343640, upload-time = "2026-05-28T12:01:08.441Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7d/6c9523c1abbe840a1b7fba3c516d48e1d3487cc80fea4366c4071cf56784/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a5b10e8ce894825f380a8f1b6444cf73c294dfea62afbb2d13e3a9e630cec1", size = 375322, upload-time = "2026-05-28T12:01:09.934Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5d/0b7b03fb1dc509321f01de3149784ab773e34c8573022029af8076afcb9c/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc09f82e63d4bcd58149572f857a431bae851dc747e313c3b5bdf7abb907fda8", size = 379066, upload-time = "2026-05-28T12:01:11.48Z" }, + { url = "https://files.pythonhosted.org/packages/d7/e2/8ef6012999ebf1cb1c22f876d9ce5e63d960fd4631d2af3202d3f480aa25/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e10464d17df3b582745c25cec695cb9558bca2cb6ddb631aee1787fc72c767b2", size = 494586, upload-time = "2026-05-28T12:01:13.051Z" }, + { url = "https://files.pythonhosted.org/packages/80/af/1eeb029bec67582c226b7809172207cd005073af4ebd906e65ff494f4983/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba05adbf15d994c38ec0b7ab32e858e5110c21e9009a00a86545fd220f84e038", size = 388415, upload-time = "2026-05-28T12:01:14.631Z" }, + { url = "https://files.pythonhosted.org/packages/18/23/ffbe10711c4d766c1cab0557d6906c074f795814863c67b351355d29354a/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77c004fdc7b891967106f78ddfd7b076bfe6813c6139c6fff6aed3bcaa960b26", size = 372427, upload-time = "2026-05-28T12:01:16.153Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3a/30ba4a6ad457e5b070c18d742a33fb77d8d922b565cc881f8a5313d63bfe/rpds_py-2026.5.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:83bcf894486c9d78dd290d3c0124ff6dd8875d3025e2090a8ec49fcc37c55fdd", size = 383615, upload-time = "2026-05-28T12:01:17.809Z" }, + { url = "https://files.pythonhosted.org/packages/d3/69/62e242b53ce39c0814bd24e1a6e6eba6c92be716277745f317f9540a2e7b/rpds_py-2026.5.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3df104083952a0e0c6f10de33e440eabe98fb6317d23e1a58c68f6df08d01b9", size = 402786, upload-time = "2026-05-28T12:01:19.419Z" }, + { url = "https://files.pythonhosted.org/packages/38/c1/a770b9c186928a1ed0f7e6d7ae50e7f3950ed23e3f9e366dbc8e38cb55de/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:980450826cf22e133c57e0835070bdd0dd3f73b9b708c3ce223def2cb9469e14", size = 551583, upload-time = "2026-05-28T12:01:21.013Z" }, + { url = "https://files.pythonhosted.org/packages/21/7c/68e8579b95375b70d2a963103c42e705856cdb98569258bd807f4423891c/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:205dde846f24332ab0c1188699a043b8d165b79bb84529ce272c45048ff6be01", size = 616941, upload-time = "2026-05-28T12:01:22.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/a1/a6135aed5730ff03ab957182259987ac11e55fb392a28dc6f0592048a280/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3966b82dd563176396df030f3dd52a6e54cb69b718e95e78bd555ed3d1e0185d", size = 578349, upload-time = "2026-05-28T12:01:24.118Z" }, + { url = "https://files.pythonhosted.org/packages/09/6e/f24201a76a84e6c49d0bdfdfcb735210e21701e9b21c5bfc0ba497dd62f6/rpds_py-2026.5.1-cp315-cp315-win32.whl", hash = "sha256:7818f8d0a415be74d2be3590b0a1c1f463a642f4d0217e7d10602dceef5b79aa", size = 209922, upload-time = "2026-05-28T12:01:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e4/966bc240bb0485fc265278f6de44d05834bf0b3618886e0b22e33d54c49a/rpds_py-2026.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:b3cc20c0d800af78fd0fac68086e28c1856cec51ea528bb81ea851aa40d39325", size = 226003, upload-time = "2026-05-28T12:01:27.062Z" }, + { url = "https://files.pythonhosted.org/packages/5c/5c/a15a59269cd5e74472734516c73795c15eccfc841b3d4b0228c3f53f19d0/rpds_py-2026.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:3609e9939a8a76cd904cf98a3f1f13b5dc7e150adeaee89e0ea09652ea213e16", size = 221245, upload-time = "2026-05-28T12:01:28.51Z" }, + { url = "https://files.pythonhosted.org/packages/e0/22/135ce03804e179a71ceb13be095deda4a279bc88f7a6b8fa161c5ad44e12/rpds_py-2026.5.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:5d333a7127d4b307601ac37792bee01bb95c867cbfacf21b6375b804d6bbd723", size = 352015, upload-time = "2026-05-28T12:01:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/f1f6d2652eb9d848f6eb369d8db83a2da6249bb49ad2c2a48f45d54538d3/rpds_py-2026.5.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:b5f077b44a4f7808520f66dae234988d867deb9aed9be5da057ce9ba831b2a41", size = 345016, upload-time = "2026-05-28T12:01:31.656Z" }, + { url = "https://files.pythonhosted.org/packages/88/66/b74182775691ea2290c99e52ac8d5db844e56fbec90ce421f107658c8314/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d8f9b7b78c9538fc9e04e82ec0e888ff0c3cffcfad152c77e57cd09351a98a", size = 374775, upload-time = "2026-05-28T12:01:33.136Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8f/15e5a61d9f0a43902d36561d4f07cae6ae9f4716be825159fd72717f33af/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e3a8ae58895ac107ed934a6bf51e5846f95c53b9b940c2c6d310838fd5846358", size = 380270, upload-time = "2026-05-28T12:01:34.574Z" }, + { url = "https://files.pythonhosted.org/packages/02/c3/f859b12763a80540cdf2af0f15b19904cf756a71d7bdd3f82ff3e5b1bbf9/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0957cf3c2b8632ec7aaebffebea8005b353cc2a237b6e2ae3c2cac0820704cfb", size = 495285, upload-time = "2026-05-28T12:01:36.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c7/ff27c2ac8411d30b03b1829fd88cae8dad1a4d0da48dd25e57c4038042e6/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c396c1304de421050b3681ea70f371874b54d41b0151e96109758144c231e30b", size = 389581, upload-time = "2026-05-28T12:01:37.635Z" }, + { url = "https://files.pythonhosted.org/packages/6e/67/fe92ee32a6cc05c77228a2f8b1762e7124f386ec20ff83d0757b762d58d0/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad1bff7f666b9598e573815affd666aac6a13a585dde336f843e33350c7fadc", size = 376041, upload-time = "2026-05-28T12:01:39.307Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/b4d6685c27aba55bd82f25b278be8237038117d05f9659a6213ad3408130/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:656a042550878f12d45752452d47094b7cfe5ad1e9d7b87b5a22ad3ae5ff8015", size = 383946, upload-time = "2026-05-28T12:01:41.043Z" }, + { url = "https://files.pythonhosted.org/packages/bd/79/2c1d832a53c8e0f8e98fc970ec257b950fecd4f62be2ab7182b500a0cbc8/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c4bd4f70294737b5206a3e8e30ccadbf8a60301831c8ea23eec5dbeea1ecfa", size = 405526, upload-time = "2026-05-28T12:01:43.032Z" }, + { url = "https://files.pythonhosted.org/packages/78/c4/c98117b03c6a8581ab2c2dfccfe9a5ad82bd8128a3c28b46a6ad2d97c393/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:43bca78665423cabae77146f2fe7ce55272b6c8d55d82cca83effd42c7e13972", size = 551165, upload-time = "2026-05-28T12:01:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c1/bc479ca069200af730881b1bd525e3114b2b391a351509fcb1b772f28086/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:42d0f20e85e549c870749d0e247f0c10d318a45b7e9676d575d2dcb04a1b2e66", size = 618778, upload-time = "2026-05-28T12:01:46.337Z" }, + { url = "https://files.pythonhosted.org/packages/77/65/38ab2f90df44c2febfb63cc10ced40763d9b4bc94d173e734528663fe7f5/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b1be5c35683684d5331b93600c210e8367c254683d8a6df6bd21bd2da3a334fb", size = 581839, upload-time = "2026-05-28T12:01:48.109Z" }, + { url = "https://files.pythonhosted.org/packages/15/2d/ce1f605fe036aadd460e5822e578c6c7ec3a860936cca37d6e0f299daa77/rpds_py-2026.5.1-cp315-cp315t-win32.whl", hash = "sha256:75808f6c38ce7749bb68cc2770161aae5045e6c6f6781a9782e74b93304399df", size = 207866, upload-time = "2026-05-28T12:01:49.648Z" }, + { url = "https://files.pythonhosted.org/packages/79/cb/966040123eb102371559746908ef2c9471f4d43e17ec9a645a2258dab64b/rpds_py-2026.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:90bd6630002a1c7f09e7843dd79f0d24f3d2897cc25a753480917865d14f15b3", size = 225441, upload-time = "2026-05-28T12:01:51.408Z" }, +] + +[[package]] +name = "send2trash" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/f0/184b4b5f8d00f2a92cf96eec8967a3d550b52cf94362dad1100df9e48d57/send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459", size = 17255, upload-time = "2026-01-14T06:27:36.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" }, +] + +[[package]] +name = "setuptools" +version = "82.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, +] + +[[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 = "soupsieve" +version = "2.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, +] + +[[package]] +name = "sqlite-anyio" +version = "0.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/a3/7830c95b37f1268dbb47e559d1f1ae027f3a4c36b1f7fc1b2dc5de1c5073/sqlite_anyio-0.2.8.tar.gz", hash = "sha256:d68b51a18c01a7dfa9cedbc319871ce77ab3ed0822518fb32810bb465b52d761", size = 3271, upload-time = "2026-03-02T10:37:43.466Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/aa/182981b92659df83c3eb7d6f8fb0874984d72ad688fa4054cb96bc044bb0/sqlite_anyio-0.2.8-py3-none-any.whl", hash = "sha256:bbdfefb144aed2633d2618ee1508edd3abe67a00389379360949da4671640d86", size = 4041, upload-time = "2026-03-02T10:37:42.246Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/2b/58abc2d1fd397e7dde08e947e05c884d8ef2f78d5e2588c17a12d42d6994/sse_starlette-3.4.4.tar.gz", hash = "sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0", size = 31819, upload-time = "2026-05-12T17:37:17.019Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/67/805710444ea8cc75fbf70b920ed431a560c4bf9c57f7d5a3117213189399/sse_starlette-3.4.4-py3-none-any.whl", hash = "sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973", size = 16514, upload-time = "2026-05-12T17:37:15.601Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "starlette" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/44/ec35f1b6e83094b997da438a02c8c9b0ade2b1e84cfc48bd4656780760a6/starlette-1.2.1.tar.gz", hash = "sha256:9b9b5ebb992e67d6093741e63c2f59e4f6fff986f81163c087867bd7b924b3f6", size = 2701854, upload-time = "2026-05-31T01:07:51.847Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl", hash = "sha256:4de0082d08c8f6764a85a54cf1120d6939507a19905c7768acad2a9f875d2b89", size = 73350, upload-time = "2026-05-31T01:07:50.09Z" }, +] + +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/57/6d7303a77ae439d9189108f76c0c4fd89ee5e2cc8387bffb55232565c4ed/tornado-6.5.6.tar.gz", hash = "sha256:9a365179fe8ff6b8766f602c0f67c185d778193e9bdd828b19f0b6ed7764177d", size = 518139, upload-time = "2026-05-27T15:35:54.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/0d/b4f481e18c5a51864e6d12b9a05ecf72919696680b747c958c3fc1f4fbae/tornado-6.5.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:65fcfaafb079435c2c19dc9e07c0f1cf0fa9051759ed0a7d0a3ba7ea7f64919c", size = 447737, upload-time = "2026-05-27T15:35:38.122Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9c/5430c39fcab1144d35860f457b15e9c08b4bc7ac86764354204e983d6183/tornado-6.5.6-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:38bc01b4acacded2de63ae78023548e41ebe6fbed3ec05a796d7ae3ad893887e", size = 445899, upload-time = "2026-05-27T15:35:40.519Z" }, + { url = "https://files.pythonhosted.org/packages/8b/79/fa7e14a2f939c807a8d30619b4eb604eab219601b78792516ebe22d40cf9/tornado-6.5.6-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b942e6a137fda31ff54bf8e6e2c8d1c37f1f50583f3ed53fb840b53b9601d104", size = 448964, upload-time = "2026-05-27T15:35:42.106Z" }, + { url = "https://files.pythonhosted.org/packages/a7/71/bd67d5f5199f937dafe03a49a37989f60f600ff6fef34c79412a829d97bd/tornado-6.5.6-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8666946e70171b8c3f1fc9b7876fac492e84822c4c7f3746f4e8f8bc9ac92a79", size = 449935, upload-time = "2026-05-27T15:35:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/c24388c9cf5b3c3a513b56a158af9f23092c9a2810d789e294310797df21/tornado-6.5.6-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1c34cfab7ad6d104f052f55de06d39bbafc5885cfeb4da688803308dbcfa90b7", size = 449767, upload-time = "2026-05-27T15:35:45.793Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/6a07ad550c3f7b37244bd0becdf293ec3d3e961783d8b720a97df50de1b2/tornado-6.5.6-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:385f35e4e22fb52551dfcda4cdc8c30c61c2c001aef5ddad99cdfe116952efd3", size = 449174, upload-time = "2026-05-27T15:35:47.485Z" }, + { url = "https://files.pythonhosted.org/packages/bb/84/3469e098dccdb6763130e06aacd786bb4363fca7b590a55c101ddf34ed30/tornado-6.5.6-cp39-abi3-win32.whl", hash = "sha256:db475f1b67b2809b10bb16264829087724ca8d24fe4ed47f7b8675cae453ef86", size = 450230, upload-time = "2026-05-27T15:35:49.322Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3c/273a04e0b9dd9016f1685cca0c1c8795a71ac88a34a8c889a0b443483226/tornado-6.5.6-cp39-abi3-win_amd64.whl", hash = "sha256:6739bf1e8eb09230f1280ddbd3236f0309db70f2c551a8dbc40f62babdf82f79", size = 450667, upload-time = "2026-05-27T15:35:51.194Z" }, + { url = "https://files.pythonhosted.org/packages/02/98/0cffe22a224f60c5fb1e3aa0b76f9da2e1ca78b0e9545e3d077c68ce60a7/tornado-6.5.6-cp39-abi3-win_arm64.whl", hash = "sha256:2543597b24a695d72338a9a77818362d72387c03ae173f1f169eadc5c91466ac", size = 449690, upload-time = "2026-05-27T15:35:52.902Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/a9/a2584b8313b89f94869ddb3c4074617a691de1812a614d2d50e32ca5a7a6/traitlets-5.15.1.tar.gz", hash = "sha256:7b1c07854fe25acb39e009bae49f11b79ff6cbb2f27999104e9110e7a6b53722", size = 163344, upload-time = "2026-06-03T12:26:06.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl", hash = "sha256:770a53705f84b81ac107e83a1b3328ff2dae16094d8fc3cfc004e4b22dfd8e92", size = 85858, upload-time = "2026-06-03T12:26:04.395Z" }, +] + +[[package]] +name = "typer" +version = "0.26.7" +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/5e/ed/ef06584ccdd5c410df0837951ecd7e15d9a6144ea1bd4c73cecab1a89891/typer-0.26.7.tar.gz", hash = "sha256:e314a34c617e419c091b2830dda3ea1f257134ff593061a8f5b9717ab8dddb3a", size = 201709, upload-time = "2026-06-03T07:18:06.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/2201973529af2c954de0bb725323c3aaed6d7f0ceee8f550dec9185df013/typer-0.26.7-py3-none-any.whl", hash = "sha256:5c87cfbc5d34491c5346ebf49c23e18d56ccb863268d3a8d592b26087c2f5e58", size = 122456, upload-time = "2026-06-03T07:18:05.732Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, +] + +[[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 = "uvicorn" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/bf/f6544ba992ddb9a6077343a576f9844f7f8f06ab819aefd00206e9255f18/uvicorn-0.48.0.tar.gz", hash = "sha256:a5504207195d08c2511bf9125ede5ac4a4b71725d519e758d01dcf0bc2d31c37", size = 91074, upload-time = "2026-05-24T12:08:41.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl", hash = "sha256:48097851328b87ec36117d3d575234519eb58c2b22d79666e9bbc6c49a761dad", size = 71410, upload-time = "2026-05-24T12:08:40.258Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +] + +[[package]] +name = "yarl" +version = "1.24.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/12/1e8f37460ea0f7eb59c221fdaf0ed75e7ac43e97f8093b9c6f411df50a78/yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8", size = 210798, upload-time = "2026-05-19T21:31:05.599Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/da/866bcb01076ba49d2b42b309867bed3826421f1c479655eb7a607b44f20b/yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8", size = 129957, upload-time = "2026-05-19T21:28:51.695Z" }, + { url = "https://files.pythonhosted.org/packages/bf/1d/fcefb70922ea2268a8971d8e5874d9a8218644200fb8465f1dcad55e6851/yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2", size = 92164, upload-time = "2026-05-19T21:28:53.242Z" }, + { url = "https://files.pythonhosted.org/packages/29/b6/170e2b8d4e3bc30e6bfdcca53556537f5bf595e938632dfcb059311f3ff6/yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d", size = 91688, upload-time = "2026-05-19T21:28:54.865Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a5/c9f655d5553ea0b99fdac9d6a99ad3f9b3e73b8e5758bb46f58c9831f74c/yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035", size = 102902, upload-time = "2026-05-19T21:28:56.963Z" }, + { url = "https://files.pythonhosted.org/packages/5d/bc/6b9664d815d79af4ee553337f9d606c56bbf269186ada9172de45f1b5f60/yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576", size = 97931, upload-time = "2026-05-19T21:28:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/98/ec/32ba48acae30fecd60928f5791188b80a9d6ee3840507ffda29fecd37b71/yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8", size = 111030, upload-time = "2026-05-19T21:29:00.148Z" }, + { url = "https://files.pythonhosted.org/packages/82/5a/6f4cd081e5f4934d2ae3a8ef4abe3afacc010d26f0035ee91b35cd7d7c37/yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7", size = 110392, upload-time = "2026-05-19T21:29:02.155Z" }, + { url = "https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c", size = 105612, upload-time = "2026-05-19T21:29:04.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/80/264ab684f181e1a876389374519ff05d10248725535ae2ac4e8ac4e563d6/yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d", size = 104487, upload-time = "2026-05-19T21:29:06.491Z" }, + { url = "https://files.pythonhosted.org/packages/41/07/efabe5df87e96d7ad5959760b888344be48cd6884db127b407c6b5503adc/yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db", size = 102333, upload-time = "2026-05-19T21:29:08.267Z" }, + { url = "https://files.pythonhosted.org/packages/44/0c/bcf7c42603e1009295f586d8890f2ba032c8b53310e815adf0a202c73d9f/yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712", size = 99025, upload-time = "2026-05-19T21:29:10.682Z" }, + { url = "https://files.pythonhosted.org/packages/4f/82/84482ab1a57a0f21a08afe6a7004c61d741f8f2ecc3b05c321577c612164/yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996", size = 110507, upload-time = "2026-05-19T21:29:12.954Z" }, + { url = "https://files.pythonhosted.org/packages/c4/8d/a546ba1dfe1b0f290e05fef145cd07614c0f15df1a707195e512d1e39d1d/yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b", size = 103719, upload-time = "2026-05-19T21:29:14.893Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b6/267f2a09213138473adfce6b8a6e17791d7fee70bd4d9003218e4dec58b0/yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c", size = 110438, upload-time = "2026-05-19T21:29:16.485Z" }, + { url = "https://files.pythonhosted.org/packages/48/2d/1c8d89c7c5f9cad9fb2902445d94e2ab1d7aa35de029afbb8ae95c42d00f/yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1", size = 105719, upload-time = "2026-05-19T21:29:18.367Z" }, + { url = "https://files.pythonhosted.org/packages/a7/25/722e3b93bd687009afb2d59a35e13d30ddd8f80571445bb0c4e4ce26ec66/yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad", size = 92901, upload-time = "2026-05-19T21:29:20.014Z" }, + { url = "https://files.pythonhosted.org/packages/39/47/4486ccfb674c04854a1ef8aa77868b6a6f765feaf69633409d7ca4f02cb8/yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30", size = 87229, upload-time = "2026-05-19T21:29:22.1Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/fcf0ce677f17e5c471c06311dd25964be38a4c586993632910d2e75278bc/yarl-1.24.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536", size = 128978, upload-time = "2026-05-19T21:29:23.83Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/8e63299bb71ed61a834121d9d3fe6c9fcf2a6a5d09754ff4f20f2d20baf5/yarl-1.24.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e89418f65eda18f99030386305bd44d7d504e328a7945db1ead514fbe03a0607", size = 91733, upload-time = "2026-05-19T21:29:25.375Z" }, + { url = "https://files.pythonhosted.org/packages/c1/24/16748d5dab6daec8b0ed81ccec639a1cded0f18dcc62a4f696b4fe366c37/yarl-1.24.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1", size = 91113, upload-time = "2026-05-19T21:29:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/b63fff7b71211e866624b21432d5943cbb633eb0c2872d9ee3070648f22c/yarl-1.24.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986", size = 103899, upload-time = "2026-05-19T21:29:28.842Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/ba1974b8533909636f7733fe86cf677e3619527c3c2fa913e0ea89c48757/yarl-1.24.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488", size = 97862, upload-time = "2026-05-19T21:29:31.086Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/123ac993b5c2ba6f554a140305620cb8f150fa543711bbc49be3ec0a65a4/yarl-1.24.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b", size = 111060, upload-time = "2026-05-19T21:29:32.657Z" }, + { url = "https://files.pythonhosted.org/packages/23/37/c472d3af3509688392134a88a825276770a187f1daa4de3f6dc0a327a751/yarl-1.24.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592", size = 110613, upload-time = "2026-05-19T21:29:34.379Z" }, + { url = "https://files.pythonhosted.org/packages/df/88/09c28dad91e662ccfaa1b78f1c57badde74fc9d0b23e74aef644750ecd73/yarl-1.24.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617", size = 107012, upload-time = "2026-05-19T21:29:36.216Z" }, + { url = "https://files.pythonhosted.org/packages/07/ab/9d4f69d571a94f4d112fa7e2e007200f5a54d319f58c82ac7b7baa61f5c6/yarl-1.24.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92", size = 105887, upload-time = "2026-05-19T21:29:38.746Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9a/000b2b66c0d772a499fc531d21dab92dfeb73b640a12eed6ba89f49bb2d0/yarl-1.24.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a", size = 103620, upload-time = "2026-05-19T21:29:40.368Z" }, + { url = "https://files.pythonhosted.org/packages/41/7c/7c1050f73450fbdaa3f0c72017059f00ce5e13366692f3dba25275a1083d/yarl-1.24.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44", size = 100599, upload-time = "2026-05-19T21:29:42.66Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b1/29e5756b3926705f5f6089bd5b9f50a56eaac550da6e260bf713ead44d04/yarl-1.24.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a", size = 110604, upload-time = "2026-05-19T21:29:44.632Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4b/8415bc96e9b150cde942fbac9a8182985e58f40ce5c54c34ed015407d3ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf", size = 105161, upload-time = "2026-05-19T21:29:46.755Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d4/cde059abfa229553b7298a2eadde2752e723d50aeedaef86ce59da2718ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056", size = 110619, upload-time = "2026-05-19T21:29:48.972Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2c/d6a6c9a61549f7b6c7e6dc6937d195bcf069582b47b7200dcd0e7b256acf/yarl-1.24.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992", size = 107362, upload-time = "2026-05-19T21:29:51Z" }, + { url = "https://files.pythonhosted.org/packages/92/dd/3ae5fe417e9d1c353a548553326eb9935e76b6b727161563b424cc296df3/yarl-1.24.2-cp313-cp313-win_amd64.whl", hash = "sha256:7d37fb7c38f2b6edab0f845c4f85148d4c44204f52bc127021bd2bc9fdbf1656", size = 92667, upload-time = "2026-05-19T21:29:52.743Z" }, + { url = "https://files.pythonhosted.org/packages/10/cc/a7beb239f78f27fca1b053c8e8595e4179c02e62249b4687ec218c370c50/yarl-1.24.2-cp313-cp313-win_arm64.whl", hash = "sha256:1e831894be7c2954240e49791fa4b50c05a0dc881de2552cfe3ffd8631c7f461", size = 87069, upload-time = "2026-05-19T21:29:54.442Z" }, + { url = "https://files.pythonhosted.org/packages/40/0e/e08087695fc12789263821c5dc0f8dc52b5b17efd0887cacf419f8a43ba3/yarl-1.24.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f9312b3c02d9b3d23840f67952913c9c8721d7f1b7db305289faefa878f364c2", size = 129670, upload-time = "2026-05-19T21:29:56.631Z" }, + { url = "https://files.pythonhosted.org/packages/3a/98/ab4b5ed1b1b5cd973c8a3eb994c3a6aefb6ce6d399e21bb5f0316c33815c/yarl-1.24.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a4f4d6cd615823bfc7fb7e9b5987c3f41666371d870d51058f77e2680fbe9630", size = 91916, upload-time = "2026-05-19T21:29:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b1/5297bb6a7df4782f7605bffc43b31f5044070935fbbcaa6c705a07e6ac65/yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0c3063e5c0a8e8e62fae6c2596fa01da1561e4cd1da6fec5789f5cf99a8aefd8", size = 91625, upload-time = "2026-05-19T21:30:00.412Z" }, + { url = "https://files.pythonhosted.org/packages/02/a7/45baabfff76829264e623b185cff0c340d7e11bf3e1cd9ea37e7d17934bd/yarl-1.24.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fecd17873a096036c1c87ab3486f1aef7f269ada7f23f7f856f93b1cc7744f14", size = 104574, upload-time = "2026-05-19T21:30:02.544Z" }, + { url = "https://files.pythonhosted.org/packages/f3/40/3a5ab144d3d650ca37d4f4b57e56169be8af3ca34c448793e064b30baaed/yarl-1.24.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a46d1ab4ba4d32e6dc80daf8a28ce0bd83d08df52fbc32f3e288663427734535", size = 97534, upload-time = "2026-05-19T21:30:04.319Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b5/5658fef3681fb5776b4513b052bec750009f47b3a592251c705d75375798/yarl-1.24.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73e68edf6dfd5f73f9ca127d84e2a6f9213c65bdffb736bda19524c0564fcd14", size = 111481, upload-time = "2026-05-19T21:30:05.988Z" }, + { url = "https://files.pythonhosted.org/packages/4c/06/fdcd7dde037f00866dce123ed4ba23dba94beb56fc4cf561668d27be37f2/yarl-1.24.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a296ca617f2d25fbceafb962b88750d627e5984e75732c712154d058ae8d79a3", size = 111529, upload-time = "2026-05-19T21:30:07.738Z" }, + { url = "https://files.pythonhosted.org/packages/c2/53/d81269aaafccea0d33396c03035de997b743f11e648e6e27a0df99c72980/yarl-1.24.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51b2cf5ec89a8b8470177641ed62a3ba22d74e1e898e06ad53aa77972487208", size = 107338, upload-time = "2026-05-19T21:30:09.713Z" }, + { url = "https://files.pythonhosted.org/packages/ae/04/23049463f729bd899df203a7960505a75333edd499cda8aa1d5a82b64df5/yarl-1.24.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:310fc687f7b2044ec54e372c8cbe923bb88f5c37bded0d3079e5791c2fc3cf50", size = 106147, upload-time = "2026-05-19T21:30:11.365Z" }, + { url = "https://files.pythonhosted.org/packages/14/18/04a4b5830b43ed5e4c5015b40e9f6241ad91487d71611061b4e111d6ac80/yarl-1.24.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:297a2fe352ecf858b30a98f87948746ec16f001d279f84aebdbd3bd965e2f1bd", size = 104272, upload-time = "2026-05-19T21:30:12.978Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f7/8cffdf319aee7a7c1dbd07b61d91c3e3fda460c7a93b5f93e445f3806c4c/yarl-1.24.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2a263e76b97bc42bdcd7c5f4953dec1f7cd62a1112fa7f869e57255229390d67", size = 99962, upload-time = "2026-05-19T21:30:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/d7/39/b3cce3b7dbef64ac700ad4cea156a207d01bede0f507587616c364b5468e/yarl-1.24.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:822519b64cf0b474f1a0aaef1dc621438ea46bb77c94df97a5b4d213a7d8a8b1", size = 111063, upload-time = "2026-05-19T21:30:16.683Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ea/100818505e7ebf165c7242ff17fdf7d9fee79e27234aeca871c1082920d7/yarl-1.24.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b6067060d9dc594899ba83e6db6c48c68d1e494a6dab158156ed86977ca7bcb1", size = 105438, upload-time = "2026-05-19T21:30:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d2/e075a0b32aa6625087de9e653087df0759fed5de4a435fef594181102a77/yarl-1.24.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0063adad533e57171b79db3943b229d40dfafeeee579767f96541f106bac5f1b", size = 111458, upload-time = "2026-05-19T21:30:21.024Z" }, + { url = "https://files.pythonhosted.org/packages/e6/5c/ceea7ba98b65c8eb8d947fdc52f9bedfcd43c6a57c9e3c90c17be8f324a3/yarl-1.24.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ee8e3fb34513e8dc082b586ef4910c98335d43a6fab688cd44d4851bacfce3e8", size = 107589, upload-time = "2026-05-19T21:30:23.412Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d9/5582d57e2b2db9b85eb6663a22efdd78e08805f3f5389566e9fcad254d1b/yarl-1.24.2-cp314-cp314-win_amd64.whl", hash = "sha256:afb00d7fd8e0f285ca29a44cc50df2d622ff2f7a6d933fa641577b5f9d5f3db0", size = 94424, upload-time = "2026-05-19T21:30:25.425Z" }, + { url = "https://files.pythonhosted.org/packages/92/10/7dc07a0e22806a9280f42a57361395506e800c64e22737cd7b0886feab42/yarl-1.24.2-cp314-cp314-win_arm64.whl", hash = "sha256:68cf6eacd6028ef1142bc4b48376b81566385ca6f9e7dde3b0fa91be08ffcb57", size = 88690, upload-time = "2026-05-19T21:30:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/9e/13/d5b8e2c8667db955bcb3de233f18798fefe7edf1d7429c2c9d4f9c401114/yarl-1.24.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:221ce1dd921ac4f603957f17d7c18c5cc0797fbb52f156941f92e04605d1d67b", size = 136248, upload-time = "2026-05-19T21:30:29.297Z" }, + { url = "https://files.pythonhosted.org/packages/de/46/a4a97c05c9c9b8fd266bb2a0df12992c7fbd02391eb9640583411b6dab32/yarl-1.24.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5f3224db28173a00d7afacdee07045cc4673dfab2b15492c7ae10deddbece761", size = 95084, upload-time = "2026-05-19T21:30:31.031Z" }, + { url = "https://files.pythonhosted.org/packages/95/b2/845cf2074a015e6fe0d0808cf1a2d9e868386c4220d657ebd8302b199043/yarl-1.24.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c557165320d6244ebe3a02431b2a201a20080e02f41f0cfa0ccc47a183765da8", size = 95272, upload-time = "2026-05-19T21:30:33.062Z" }, + { url = "https://files.pythonhosted.org/packages/fe/16/e69d4aa244aef45235ddfebc0e04036a6829842bc5a6a795aedc6c998d23/yarl-1.24.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:904065e6e85b1fa54d0d87438bd58c14c0bad97aad654ad1077fd9d87e8478ed", size = 101497, upload-time = "2026-05-19T21:30:34.842Z" }, + { url = "https://files.pythonhosted.org/packages/15/94/c07107715d621076863ee88b3ddf183fa5e9d4aba5769623c9979828410a/yarl-1.24.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cec2a38d70edc10e0e856ceda886af5327a017ccbde8e1de1bd44d300357543", size = 94002, upload-time = "2026-05-19T21:30:37.724Z" }, + { url = "https://files.pythonhosted.org/packages/a9/35/fc1bbdd895b5e4010b8fdd037f7ed3aa289d3863e08231b30231ca9a0815/yarl-1.24.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e7484b9361ed222ee1ca5b4337aa4cbdcc4618ce5aff57d9ef1582fd95893fc0", size = 106524, upload-time = "2026-05-19T21:30:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/32b66d0a4ba47c296cf86d03e2c67bff58399fe6d6d84d5205c04c66cc6d/yarl-1.24.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:84f9670b89f34db07f81e53aee83e0b938a3412329d51c8f922488be7fcc4024", size = 106165, upload-time = "2026-05-19T21:30:41.888Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/37cb5ff50c5e825d4d38e81bb04d1b7e96bf960f7ab89f9850b162f3f114/yarl-1.24.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abb2759733d63a28b4956500a5dd57140f26486c92b2caedfb964ab7d9b79dbf", size = 103010, upload-time = "2026-05-19T21:30:43.985Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/4597912315096f7bb359e46e13bf8b60994fcbb2db29b804c0902ef4eff5/yarl-1.24.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:081c2bf54efe03774d0311172bc04fedf9ca01e644d4cd8c805688e527209bdc", size = 101128, upload-time = "2026-05-19T21:30:46.291Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d5/c8e86e120521e646013d02a8e3b8884392e28494be8f392366e50d208efc/yarl-1.24.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:86746bef442aa479107fe28132e1277237f9c24c2f00b0b0cf22b3ee0904f2bb", size = 101382, upload-time = "2026-05-19T21:30:48.085Z" }, + { url = "https://files.pythonhosted.org/packages/fa/98/70b229236118f89dbeb739b76f10225bbf53b5497725502594c9a01d699a/yarl-1.24.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:2d07d21d0bc4b17558e8de0b02fbfdf1e347d3bb3699edd00bb92e7c57925420", size = 95964, upload-time = "2026-05-19T21:30:49.785Z" }, + { url = "https://files.pythonhosted.org/packages/87/f8/56c386981e3c8648d279fdef2397ffec577e8320fd5649745e34d54faeb7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4fb1ac3fc5fecd8ae7453ea237e4d22b49befa70266dfe1629924245c21a0c7f", size = 106204, upload-time = "2026-05-19T21:30:51.862Z" }, + { url = "https://files.pythonhosted.org/packages/1a/1e/765afe97811ca35933e2a7de70ac57b1997ea2e4ee895719ee7a231fb7e5/yarl-1.24.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4da31a5512ed1729ca8d8aacde3f7faeb8843cde3165d6bcf7f88f74f17bb8aa", size = 101510, upload-time = "2026-05-19T21:30:53.62Z" }, + { url = "https://files.pythonhosted.org/packages/ee/78/393913f4b9039e1edd09ae8a9bbb9d539be909a8abf6d8a2084585bed4b7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:533ded4dceb5f1f3da7906244f4e82cf46cfd40d84c69a1faf5ac506aa65ecbe", size = 105584, upload-time = "2026-05-19T21:30:55.962Z" }, + { url = "https://files.pythonhosted.org/packages/78/87/deb17b7049bbe74ea11a713b86f8f27800cc1c8648b0b797243ebb4830ba/yarl-1.24.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7b3a85525f6e7eeabcfdd372862b21ee1915db1b498a04e8bf0e389b607ff0bd", size = 103410, upload-time = "2026-05-19T21:30:57.962Z" }, + { url = "https://files.pythonhosted.org/packages/8f/be/f9f7594e23b5b93affff0318e4593c1920331bcaefda326cabcad94296a1/yarl-1.24.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a7624b1ca46ca5d7b864ef0d2f8efe3091454085ee1855b4e992314529972215", size = 102980, upload-time = "2026-05-19T21:30:59.735Z" }, + { url = "https://files.pythonhosted.org/packages/65/a4/ba80dccd3593ff1f01051a818694d07b58cb8232677ee9a22a5a1f93a9fc/yarl-1.24.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e434a45ce2e7a947f951fc5a8944c8cc080b7e59f9c50ae80fd39107cf88126d", size = 91219, upload-time = "2026-05-19T21:31:01.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576, upload-time = "2026-05-19T21:31:03.909Z" }, +]