python-sse-starlette-3.2.0/0000775000175000017500000000000015132704747015526 5ustar carstencarstenpython-sse-starlette-3.2.0/LICENSE0000664000175000017500000000274715132704747016545 0ustar carstencarstenCopyright © 2020, [sysid](https://sysid.github.io/). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. python-sse-starlette-3.2.0/VERSION0000664000175000017500000000000615132704747016572 0ustar carstencarsten3.2.0 python-sse-starlette-3.2.0/Manifest.in0000664000175000017500000000027515132704747017630 0ustar carstencarsteninclude LICENSE include README.md global-include *.typed graft tests prune tests/experimentation prune tests/integration global-exclude __pycache__ global-exclude *.py[cod] prune .venv python-sse-starlette-3.2.0/README.md0000664000175000017500000002517615132704747017020 0ustar carstencarsten# Server-Sent Events for [Starlette](https://github.com/encode/starlette) and [FastAPI](https://fastapi.tiangolo.com/) [![Downloads](https://static.pepy.tech/badge/sse-starlette/week)](https://pepy.tech/project/sse-starlette) [![PyPI Version][pypi-image]][pypi-url] [![Build Status][build-image]][build-url] > Background: https://sysid.github.io/server-sent-events/ Production ready Server-Sent Events implementation for Starlette and FastAPI following the [W3C SSE specification](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events). ## Installation ```bash pip install sse-starlette uv add sse-starlette # To run the examples and demonstrations uv add sse-starlette[examples] # Recommended ASGI server uv add sse-starlette[uvicorn,granian,daphne] ``` ## Quick Start ```python import asyncio from starlette.applications import Starlette from starlette.routing import Route from sse_starlette import EventSourceResponse async def generate_events(): for i in range(10): yield {"data": f"Event {i}"} await asyncio.sleep(1) async def sse_endpoint(request): return EventSourceResponse(generate_events()) app = Starlette(routes=[Route("/events", sse_endpoint)]) ``` ## Core Features - **Standards Compliant**: Full SSE specification implementation - **Framework Integration**: Native Starlette and FastAPI support - **Async/Await**: Built on modern Python async patterns - **Connection Management**: Automatic client disconnect detection - **Graceful Shutdown**: Proper cleanup on server termination - **Thread Safety**: Context-local event management for multi-threaded applications - **Multi-Loop Support**: Works correctly with multiple asyncio event loops ## Key Components ### EventSourceResponse The main response class that handles SSE streaming: ```python from sse_starlette import EventSourceResponse # Basic usage async def stream_data(): for item in data: yield {"data": item, "event": "update", "id": str(item.id)} return EventSourceResponse(stream_data()) ``` ### ServerSentEvent For structured event creation: ```python from sse_starlette import ServerSentEvent event = ServerSentEvent( data="Custom message", event="notification", id="msg-123", retry=5000 ) ``` ### JSONServerSentEvent For an easy way to send json data as SSE events: ```python from sse_starlette import JSONServerSentEvent event = JSONServerSentEvent( data={"field":"value"}, # Anything serializable with json.dumps ) ``` ## Advanced Usage ### Custom Ping Configuration ```python from sse_starlette import ServerSentEvent def custom_ping(): return ServerSentEvent(comment="Custom ping message") return EventSourceResponse( generate_events(), ping=10, # Ping every 10 seconds ping_message_factory=custom_ping ) ``` ### Multi-Threaded Usage sse-starlette now supports usage in multi-threaded applications and with multiple asyncio event loops: ```python import threading import asyncio from sse_starlette import EventSourceResponse def run_sse_in_thread(): """SSE streaming works correctly in separate threads""" loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) async def thread_events(): for i in range(5): yield {"data": f"Thread event {i}"} await asyncio.sleep(1) # This works without "Event bound to different loop" errors response = EventSourceResponse(thread_events()) loop.close() # Start SSE in multiple threads for i in range(3): thread = threading.Thread(target=run_sse_in_thread) thread.start() ``` ### Database Streaming (Thread-Safe) ```python async def stream_database_results(request): # CORRECT: Create session within generator context async with AsyncSession() as session: results = await session.execute(select(User)) for row in results: if await request.is_disconnected(): break yield {"data": row.name, "id": str(row.id)} return EventSourceResponse(stream_database_results(request)) ``` ### Error Handling and Timeouts ```python async def robust_stream(request): try: for i in range(100): if await request.is_disconnected(): break yield {"data": f"Item {i}"} await asyncio.sleep(0.5) except asyncio.CancelledError: # Client disconnected - perform cleanup raise return EventSourceResponse( robust_stream(request), send_timeout=30, # Timeout hanging sends headers={"Cache-Control": "no-cache"} ) ``` ### Memory Channels Alternative For complex data flows, use memory channels instead of generators: ```python import anyio from functools import partial async def data_producer(send_channel): async with send_channel: for i in range(10): await send_channel.send({"data": f"Item {i}"}) await anyio.sleep(1) async def channel_endpoint(request): send_channel, receive_channel = anyio.create_memory_object_stream(10) return EventSourceResponse( receive_channel, data_sender_callable=partial(data_producer, send_channel) ) ``` ## Configuration Options ### EventSourceResponse Parameters | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `content` | `ContentStream` | Required | Async generator or iterable | | `ping` | `int` | 15 | Ping interval in seconds | | `sep` | `str` | `"\r\n"` | Line separator (`\r\n`, `\r`, `\n`) | | `send_timeout` | `float` | `None` | Send operation timeout | | `headers` | `dict` | `None` | Additional HTTP headers | | `ping_message_factory` | `Callable` | `None` | Custom ping message creator | ### Client Disconnection ```python async def monitored_stream(request): events_sent = 0 try: while events_sent < 100: if await request.is_disconnected(): print(f"Client disconnected after {events_sent} events") break yield {"data": f"Event {events_sent}"} events_sent += 1 await asyncio.sleep(1) except asyncio.CancelledError: print("Stream cancelled") raise ``` ## Testing sse-starlette includes now comprehensive test isolation without manual setup. The library automatically handles event loop contexts, eliminating the need for manual state resets: ```python # this is deprecated and not needed since version 3.0.0 import pytest from sse_starlette import EventSourceResponse @pytest.fixture def reset_sse_app_status(): AppStatus.should_exit_event = None yield AppStatus.should_exit_event = None ``` ## Production Considerations ### Performance Limits - **Memory**: Each connection maintains a buffer. Monitor memory usage. - **Connections**: Limited by system file descriptors and application design. - **Network**: High-frequency events can saturate bandwidth. ### Error Recovery Implement client-side reconnection logic: ```javascript function createEventSource(url) { const eventSource = new EventSource(url); eventSource.onerror = function() { setTimeout(() => { createEventSource(url); // Reconnect after delay }, 5000); }; return eventSource; } ``` ## Learning Resources ### Examples Directory The `examples/` directory contains production-ready patterns: - **`01_basic_sse.py`**: Fundamental SSE concepts - **`02_message_broadcasting.py`**: Multi-client message distribution - **`03_database_streaming.py`**: Thread-safe database integration - **`04_advanced_features.py`**: Custom protocols and error handling ### Demonstrations Directory The `examples/demonstrations/` directory provides educational scenarios: **Basic Patterns** (`basic_patterns/`): - Client disconnect detection and cleanup - Graceful server shutdown behavior **Production Scenarios** (`production_scenarios/`): - Load testing with concurrent clients - Network interruption handling **Advanced Patterns** (`advanced_patterns/`): - Memory channels vs generators - Error recovery and circuit breakers - Custom protocol development Run any demonstration: ```bash python examples/demonstrations/basic_patterns/client_disconnect.py python examples/demonstrations/production_scenarios/load_simulations.py python examples/demonstrations/advanced_patterns/error_recovery.py ``` ## Troubleshooting ### Common Issues **Database session errors with async generators** - Create database sessions inside generators, not as dependencies **Hanging connections after client disconnect** - Always check `await request.is_disconnected()` in loops - Use `send_timeout` parameter to detect dead connections If you are using Postman, please see: https://github.com/sysid/sse-starlette/issues/47#issuecomment-1445953826 ### Performance Optimization ```python # Connection limits class ConnectionLimiter: def __init__(self, max_connections=100): self.semaphore = asyncio.Semaphore(max_connections) async def limited_endpoint(self, request): async with self.semaphore: return EventSourceResponse(generate_events()) ``` ## Network-Level Gotchas Network infrastructure components can buffer SSE streams, breaking real-time delivery. Here are the most common issues and solutions: ### Reverse Proxy Buffering (Nginx/Apache) **Problem**: Nginx buffers responses by default, delaying SSE events until ~16KB accumulates. **Solution**: Add the `X-Accel-Buffering: no` header. **Nginx Configuration** (if you can't modify app headers): ```nginx location /events { proxy_pass http://localhost:8000; proxy_http_version 1.1; proxy_set_header Connection ''; proxy_buffering off; # Disable for this location chunked_transfer_encoding off; } ``` ### CDN Issues **Cloudflare**: Buffers ~100KB before flushing to clients, breaking real-time delivery. **Akamai**: Edge servers buffer by default. ### Load Balancer Problems **HAProxy**: Timeout settings must exceed heartbeat frequency. ```haproxy # Ensure timeouts > ping interval timeout client 60s # If ping every 45s timeout server 60s ``` **F5 Load Balancers**: Buffer responses by default. ## Contributing See examples and demonstrations for implementation patterns. Run tests with: ```bash make test-unit # Unit tests only make test # All tests including integration ``` [pypi-image]: https://badge.fury.io/py/sse-starlette.svg [pypi-url]: https://pypi.org/project/sse-starlette/ [build-image]: https://github.com/sysid/sse-starlette/actions/workflows/build.yml/badge.svg [build-url]: https://github.com/sysid/sse-starlette/actions/workflows/build.yml [coverage-image]: https://codecov.io/gh/sysid/sse-starlette/branch/master/graph/badge.svg python-sse-starlette-3.2.0/.pre-commit-config.yaml0000664000175000017500000000072315132704747022011 0ustar carstencarstenrepos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.8.4 hooks: - id: ruff-format files: ^(sse_starlette|tests)/ - id: ruff args: [--fix] files: ^(sse_starlette|tests)/ - repo: local hooks: - id: mypy name: mypy entry: mypy --config-file pyproject.toml sse_starlette language: system types: [python] files: ^sse_starlette/ pass_filenames: false python-sse-starlette-3.2.0/examples/0000775000175000017500000000000015132704747017344 5ustar carstencarstenpython-sse-starlette-3.2.0/examples/stream_generator_multiple.py0000664000175000017500000000232115132704747025170 0ustar carstencarstenimport asyncio from typing import List from fastapi import Depends, FastAPI from starlette import status from sse_starlette import EventSourceResponse, ServerSentEvent """ This example shows how to use multiple streams. """ class Stream: def __init__(self) -> None: self._queue = None @property def queue(self): if self._queue is None: self._queue = asyncio.Queue[ServerSentEvent]() return self._queue def __aiter__(self) -> "Stream": return self async def __anext__(self) -> ServerSentEvent: return await self.queue.get() async def asend(self, value: ServerSentEvent) -> None: await self.queue.put(value) app = FastAPI() _streams: List[Stream] = [] @app.get("/sse") async def sse() -> EventSourceResponse: stream = Stream() _streams.append(stream) return EventSourceResponse(stream) @app.post("/message", status_code=status.HTTP_201_CREATED) async def send_message(message: str, stream: Stream = Depends()) -> None: for stream in _streams: await stream.asend(ServerSentEvent(data=message)) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000, log_level="trace") python-sse-starlette-3.2.0/examples/03_database_streaming.py0000664000175000017500000002521015132704747024035 0ustar carstencarsten""" Database Streaming Example - Thread-safe SQLAlchemy session management in SSE This example demonstrates: - CORRECT: Create database sessions within generators (thread-safe) - INCORRECT: Reusing sessions across task boundaries (thread-unsafe) - Streaming query results with proper async session management - Clean separation of concerns between endpoint logic and data streaming CRITICAL SESSION RULE: Never reuse database sessions between async tasks. Always create new sessions within generators that will run in task groups. Usage: python 03_database_streaming.py Test with curl: # Stream all tasks curl -N http://localhost:8000/tasks/stream # Stream with filters curl -N http://localhost:8000/tasks/stream?completed=true curl -N http://localhost:8000/tasks/stream?completed=false curl -N http://localhost:8000/tasks/stream?limit=3 # Compare with regular JSON endpoint curl http://localhost:8000/tasks/list """ import asyncio import typing as T from typing import AsyncGenerator, Optional import sqlalchemy as sa import uvicorn from fastapi import Depends, FastAPI, Query from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from starlette.requests import Request from sse_starlette import EventSourceResponse db_bind = create_async_engine("sqlite+aiosqlite:///:memory:") AsyncSessionLocal = async_sessionmaker(bind=db_bind, expire_on_commit=False) # Dependency for regular endpoints (NOT for use in generators) async def async_db_session(): """ Standard dependency for regular endpoints. IMPORTANT: Do NOT use this dependency in SSE generators. The session created here runs in the main request context, but generators run in separate tasks within anyio task groups. """ async with AsyncSessionLocal() as session: yield session AsyncDbSessionDependency = T.Annotated[AsyncSession, Depends(async_db_session)] TODOS_CTE_SQL = """ WITH todo AS (SELECT 1 AS id, 'Implement SSE streaming' AS title, 'Add server-sent events to API' AS description, 0 AS completed UNION ALL SELECT 2, 'Database integration', 'Connect SQLAlchemy with SSE', 1 UNION ALL SELECT 3, 'Add filtering', 'Support query parameters in streams', 0 UNION ALL SELECT 4, 'Write documentation', 'Document best practices', 1 UNION ALL SELECT 5, 'Performance testing', 'Test with large datasets', 0) SELECT * FROM todo """ app = FastAPI() class TaskDatabaseStream: """ Stream that yields database query results as SSE events. Key design decisions: 1. Create dedicated session within the generator (thread-safe) 2. Apply filters inside the database query (efficient) 3. Implement proper async iteration protocol 4. Handle client disconnection gracefully """ def __init__( self, request: Request, completed_filter: Optional[bool] = None, limit: Optional[int] = None, ): self.request = request self.completed_filter = completed_filter self.limit = limit def __aiter__(self) -> "TaskDatabaseStream": return self async def __anext__(self) -> dict: """ Lazy evaluation: Database query happens here, not in __init__. This ensures the query runs within the correct async context and uses a fresh session created specifically for this stream. """ if not hasattr(self, "_results"): await self._execute_query() self._index = 0 if self._index >= len(self._results): raise StopAsyncIteration if await self.request.is_disconnected(): raise StopAsyncIteration result = self._results[self._index] self._index += 1 # Add small delay to demonstrate streaming behavior await asyncio.sleep(0.3) return { "data": { "id": result.id, "title": result.title, "description": result.description, "completed": bool(result.completed), }, "event": "task", "id": str(result.id), } async def _execute_query(self): """ CORRECT PATTERN: Create session within the generator context. This session is created in the same async context where the generator will yield results, ensuring thread safety with anyio task groups used by EventSourceResponse. Always create new sessions within generators, never reuse sessions from dependency injection. """ async with AsyncSessionLocal() as session: # Build query with filters - using sa.text() for raw SQL query = TODOS_CTE_SQL if self.completed_filter is not None: query += " WHERE completed = :completed" query += " ORDER BY id" if self.limit: query += " LIMIT :limit" # Prepare parameters for SQLAlchemy params = {} if self.completed_filter is not None: params["completed"] = int(self.completed_filter) if self.limit: params["limit"] = self.limit # Execute query using async iteration pattern from example result = await session.execute(sa.text(query), params) self._results = result.fetchall() async def correct_task_stream( request: Request, completed: Optional[bool] = None, limit: Optional[int] = None ) -> AsyncGenerator[dict, None]: """ CORRECT: Alternative implementation using async generator function. This demonstrates the same thread-safe pattern using a function instead of a class. The key principle remains: create the session within the generator scope. "Do *NOT* reuse db_session here within the AsyncGenerator, create a new session instead." """ # Session created INSIDE the generator - this is safe async with AsyncSessionLocal() as session: query = TODOS_CTE_SQL params = {} if completed is not None: query += " WHERE completed = :completed" params["completed"] = int(completed) query += " ORDER BY id" if limit: query += " LIMIT :limit" params["limit"] = limit # Execute query and iterate over results result = await session.execute(sa.text(query), params) rows = result.fetchall() for row in rows: if await request.is_disconnected(): break yield { "data": { "id": row.id, "title": row.title, "description": row.description, "completed": bool(row.completed), }, "event": "task", "id": str(row.id), } await asyncio.sleep(0.3) async def incorrect_task_stream_example( session: AsyncSession, request: Request ) -> AsyncGenerator[dict, None]: """ INCORRECT: This pattern will cause issues with anyio task groups. The session parameter comes from the dependency injection system, which runs in the main request context. However, this generator will be consumed by EventSourceResponse within an anyio task group, creating a cross-task session usage that can cause threading issues. DO NOT USE THIS PATTERN - included only for educational purposes. """ # This query would fail because session is from different async context result = await session.execute(sa.text(TODOS_CTE_SQL)) rows = result.fetchall() for row in rows: yield {"data": dict(row._mapping), "event": "task"} @app.get("/tasks/stream") async def stream_tasks_endpoint( request: Request, completed: Optional[bool] = Query(None, description="Filter by completion status"), limit: Optional[int] = Query(None, description="Limit number of results"), ) -> EventSourceResponse: """ SSE endpoint that streams database query results. Notice: We do NOT inject a database session here because the session must be created within the generator context for thread safety. """ stream = TaskDatabaseStream(request, completed, limit) return EventSourceResponse(stream) @app.get("/tasks/stream-function") async def stream_tasks_function_endpoint( request: Request, completed: Optional[bool] = Query(None, description="Filter by completion status"), limit: Optional[int] = Query(None, description="Limit number of results"), ) -> EventSourceResponse: """ Alternative SSE endpoint using generator function instead of class. Both approaches are valid - choose based on complexity of your logic. Classes are better for stateful streaming, functions for simple cases. """ return EventSourceResponse(correct_task_stream(request, completed, limit)) @app.get("/tasks/list") async def list_tasks_endpoint( session: AsyncDbSessionDependency, completed: Optional[bool] = Query(None, description="Filter by completion status"), limit: Optional[int] = Query(None, description="Limit number of results"), ) -> dict: """ Regular JSON endpoint - safe to use dependency injection. This demonstrates the CORRECT use of session dependency for regular endpoints vs the INCORRECT use in SSE generators. """ query = TODOS_CTE_SQL params = {} if completed is not None: query += " WHERE completed = :completed" params["completed"] = int(completed) query += " ORDER BY id" if limit: query += " LIMIT :limit" params["limit"] = limit result = await session.execute(sa.text(query), params) rows = result.fetchall() return { "tasks": [dict(row._mapping) for row in rows], "total": len(rows), "streaming_available": True, } @app.get("/status") async def status_endpoint(): """Simple status endpoint.""" return {"status": "ready", "database": "in-memory", "streaming": "enabled"} if __name__ == "__main__": print("Database Streaming SSE Server") print("Stream all: curl -N http://localhost:8000/tasks/stream") print("Stream filtered: curl -N http://localhost:8000/tasks/stream?completed=true") print("JSON endpoint: curl http://localhost:8000/tasks/list") uvicorn.run(app, host="127.0.0.1", port=8000) python-sse-starlette-3.2.0/examples/01_basic_sse.py0000664000175000017500000000605615132704747022160 0ustar carstencarsten""" Basic Server-Sent Events (SSE) example with both Starlette and FastAPI. This example demonstrates: - Simple number streaming - Both Starlette and FastAPI implementations - Proper client disconnection handling Usage: python 01_basic_sse.py Test with curl: # Basic streaming (will receive numbers 1-10 with 1 second intervals) curl -N http://localhost:8000/starlette/numbers # Endless streaming (press Ctrl+C to stop) curl -N http://localhost:8000/fastapi/endless # Custom range curl -N http://localhost:8000/fastapi/range/5/15 """ import asyncio import logging from typing import AsyncGenerator import uvicorn from fastapi import FastAPI from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Route, Mount from sse_starlette import EventSourceResponse # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def generate_numbers( start: int, end: int, delay: float = 1.0 ) -> AsyncGenerator[dict, None]: """Generate numbered events with configurable range and delay.""" for number in range(start, end + 1): await asyncio.sleep(delay) yield {"data": f"Number: {number}"} async def generate_endless_stream(request: Request) -> AsyncGenerator[dict, None]: """Generate endless numbered events with proper cleanup on client disconnect.""" counter = 0 try: while True: counter += 1 yield {"data": f"Event #{counter}", "id": str(counter)} await asyncio.sleep(0.5) except asyncio.CancelledError: logger.info(f"Client disconnected after receiving {counter} events") raise # Starlette implementation async def starlette_numbers_endpoint(request: Request) -> EventSourceResponse: """Starlette endpoint that streams numbers 1-10.""" return EventSourceResponse(generate_numbers(1, 10)) # FastAPI implementation fastapi_app = FastAPI(title="SSE FastAPI Example") @fastapi_app.get("/endless") async def fastapi_endless_endpoint(request: Request) -> EventSourceResponse: """FastAPI endpoint that streams endless events.""" return EventSourceResponse(generate_endless_stream(request)) @fastapi_app.get("/range/{start}/{end}") async def fastapi_range_endpoint( request: Request, start: int, end: int ) -> EventSourceResponse: """FastAPI endpoint that streams a custom range of numbers.""" return EventSourceResponse(generate_numbers(start, end)) # Main Starlette application starlette_routes = [ Route("/starlette/numbers", endpoint=starlette_numbers_endpoint), Mount("/fastapi", app=fastapi_app), ] app = Starlette(debug=True, routes=starlette_routes) if __name__ == "__main__": print("Starting SSE server...") print("Available endpoints:") print(" - http://localhost:8000/starlette/numbers (numbers 1-10)") print(" - http://localhost:8000/fastapi/endless (endless stream)") print(" - http://localhost:8000/fastapi/range/5/15 (custom range)") uvicorn.run(app, host="0.0.0.0", port=8000, log_level="info") python-sse-starlette-3.2.0/examples/demonstrations/0000775000175000017500000000000015132704747022415 5ustar carstencarstenpython-sse-starlette-3.2.0/examples/demonstrations/README.md0000664000175000017500000000603415132704747023677 0ustar carstencarsten# SSE Educational Demonstrations This directory contains focused, educational demonstrations of SSE patterns and behaviors. Each demonstration shows ONE key concept clearly without unnecessary complexity. ## Philosophy These are **educational scenarios**, not traditional unit tests. They demonstrate: - Real-world SSE patterns and behaviors - Common production challenges and solutions - Best practices through working examples - Edge cases and error conditions ## Directory Structure ### 📁 basic_patterns/ **Purpose**: Core SSE behaviors every developer should understand - **graceful_shutdown.py**: Server shutdown behavior and cleanup patterns - **client_disconnect.py**: Client disconnection detection and resource cleanup **Key Learning**: SSE connection lifecycle, resource management, proper cleanup ### 📁 production_scenarios/ **Purpose**: Real-world deployment patterns and challenges - **load_simulation.py**: Multiple concurrent clients and performance testing - **network_interruption.py**: Handling network failures and reconnection **Key Learning**: Production readiness, scalability, resilience patterns ### 📁 advanced_patterns/ **Purpose**: Sophisticated streaming techniques and architectures - **memory_channels.py**: Using memory channels instead of generators - **error_recovery.py**: Comprehensive error handling and recovery strategies - **custom_protocols.py**: Building domain-specific protocols over SSE **Key Learning**: Advanced architectures, error resilience, protocol design ## Running Demonstrations Each file is self-contained and executable: ```bash # Basic patterns python demonstrations/basic_patterns/graceful_shutdown.py python demonstrations/basic_patterns/client_disconnect.py # Production scenarios python demonstrations/production_scenarios/load_simulation.py test 20 python demonstrations/production_scenarios/network_interruption.py demo # Advanced patterns python demonstrations/advanced_patterns/memory_channels.py python demonstrations/advanced_patterns/error_recovery.py python demonstrations/advanced_patterns/custom_protocols.py ``` ## Contributing New Demonstrations When adding new demonstrations: 1. **Choose the right category** (basic/production/advanced) 2. **Focus on ONE key concept** per file 3. **Add rich educational comments** explaining the WHY 4. **Make it self-contained** and executable 5. **Update this README** with the new demonstration ## Common Questions **Q: Why separate from regular tests?** A: Demonstrations focus on education and real-world patterns, while tests verify correctness. Different purposes, different approaches. **Q: How long should demonstrations take to run?** A: Basic patterns: 10-30 seconds. Production scenarios: 30-60 seconds. Advanced patterns: 30-120 seconds. **Q: Can I use these in production?** A: These are educational examples. Extract patterns and adapt for your specific use case. **Q: How do I know which demonstration to run first?** A: Start with basic_patterns/, then production_scenarios/, then advanced_patterns/. Each builds on the previous level. python-sse-starlette-3.2.0/examples/demonstrations/production_scenarios/0000775000175000017500000000000015132704747026651 5ustar carstencarstenpython-sse-starlette-3.2.0/examples/demonstrations/production_scenarios/network_interruption.py0000664000175000017500000002440715132704747033545 0ustar carstencarsten# demonstrations/production_scenarios/network_interruption.py """ DEMONSTRATION: Network Interruption Handling PURPOSE: Shows how SSE connections behave during network issues like packet loss, temporary disconnections, and connection timeouts. KEY LEARNING: - Network issues cause immediate SSE connection failures - Clients must implement reconnection logic - Server-side timeouts help detect dead connections PATTERN: Simulating network conditions to test SSE resilience. """ import asyncio import time import httpx from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Route from starlette.middleware.base import BaseHTTPMiddleware from sse_starlette import EventSourceResponse class NetworkSimulationMiddleware(BaseHTTPMiddleware): """ Middleware that simulates network conditions. """ def __init__(self, app): super().__init__(app) self.simulate_delay = False self.simulate_failure = False self.delay_duration = 2.0 async def dispatch(self, request, call_next): # Simulate network delay if self.simulate_delay and request.url.path == "/events": print(f"🐌 Simulating {self.delay_duration}s network delay...") await asyncio.sleep(self.delay_duration) # Simulate network failure if self.simulate_failure and request.url.path == "/events": print("💥 Simulating network failure!") from starlette.responses import Response return Response("Network Error", status_code=503) return await call_next(request) # Global middleware instance for control network_middleware = None async def robust_stream(request: Request): """ Stream that's designed to handle network issues gracefully. """ connection_id = id(request) print(f"🔗 Stream {connection_id} started") try: for i in range(1, 30): # Check for client disconnect frequently if await request.is_disconnected(): print(f"🔌 Client {connection_id} disconnected at event {i}") break # Send heartbeat and data yield { "data": f"Event {i} - timestamp: {time.time():.2f}", "id": str(i), "event": "data", } # Regular interval - important for detecting dead connections await asyncio.sleep(1) except Exception as e: print(f"💥 Stream {connection_id} error: {e}") yield {"data": "Stream error occurred", "event": "error"} raise finally: print(f"🧹 Stream {connection_id} cleanup completed") async def sse_endpoint(request: Request): """SSE endpoint with network resilience.""" return EventSourceResponse( robust_stream(request), ping=5, # Send ping every 5 seconds to detect dead connections send_timeout=10.0, # Timeout sends after 10 seconds ) async def control_endpoint(request: Request): """Control endpoint to simulate network conditions.""" from starlette.responses import JSONResponse from urllib.parse import parse_qs query = parse_qs(str(request.query_params)) if "delay" in query: network_middleware.simulate_delay = query["delay"][0].lower() == "true" network_middleware.delay_duration = float(query.get("duration", ["2.0"])[0]) if "failure" in query: network_middleware.simulate_failure = query["failure"][0].lower() == "true" return JSONResponse( { "network_delay": network_middleware.simulate_delay, "delay_duration": network_middleware.delay_duration, "network_failure": network_middleware.simulate_failure, } ) # Create app with network simulation app = Starlette( routes=[Route("/events", sse_endpoint), Route("/control", control_endpoint)] ) # Add network simulation middleware network_middleware = NetworkSimulationMiddleware(app) app = network_middleware class ResilientSSEClient: """ Client with automatic reconnection and error handling. Demonstrates production-ready SSE client patterns. """ def __init__(self, base_url, max_retries=3): self.base_url = base_url self.max_retries = max_retries self.events_received = 0 self.connection_attempts = 0 self.last_event_id = None async def connect_with_retry(self): """Connect with exponential backoff retry logic.""" for attempt in range(self.max_retries + 1): self.connection_attempts += 1 try: print(f"🔄 Connection attempt {attempt + 1}/{self.max_retries + 1}") await self._connect() break # Success except Exception as e: print(f"❌ Attempt {attempt + 1} failed: {type(e).__name__}") if attempt < self.max_retries: # Exponential backoff: 1s, 2s, 4s, 8s... delay = 2**attempt print(f"⏳ Retrying in {delay}s...") await asyncio.sleep(delay) else: print("💀 All retry attempts exhausted") raise async def _connect(self): """Single connection attempt.""" headers = {} # Include Last-Event-ID for resumption if self.last_event_id: headers["Last-Event-ID"] = self.last_event_id print(f"📍 Resuming from event ID: {self.last_event_id}") async with httpx.AsyncClient(timeout=15.0) as client: async with client.stream( "GET", f"{self.base_url}/events", headers=headers ) as response: # Check response status if response.status_code != 200: raise httpx.HTTPStatusError( f"HTTP {response.status_code}", request=None, response=response ) print("✅ Connected successfully") async for line in response.aiter_lines(): if line.strip(): self.events_received += 1 # Parse event ID for resumption if line.startswith("id: "): self.last_event_id = line[4:] print(f"📨 Event {self.events_received}: {line[:50]}...") # Simulate client processing await asyncio.sleep(0.1) async def demonstrate_network_issues(): """ Demonstrates different network failure scenarios. """ print("🌐 Network Interruption Demonstrations\n") client = ResilientSSEClient("http://localhost:8000") async def scenario_1_normal_connection(): """Normal operation baseline.""" print("📡 Scenario 1: Normal Connection") # Reset network conditions async with httpx.AsyncClient() as http_client: await http_client.get( "http://localhost:8000/control?delay=false&failure=false" ) try: # Connect for 5 seconds await asyncio.wait_for(client.connect_with_retry(), timeout=5.0) except asyncio.TimeoutError: print("✅ Normal connection worked for 5 seconds") print(f"📊 Events received: {client.events_received}\n") async def scenario_2_network_delay(): """Connection with network delays.""" print("📡 Scenario 2: Network Delays") # Enable network delay async with httpx.AsyncClient() as http_client: await http_client.get( "http://localhost:8000/control?delay=true&duration=3.0" ) start_time = time.time() try: await asyncio.wait_for(client.connect_with_retry(), timeout=10.0) except asyncio.TimeoutError: duration = time.time() - start_time print(f"⏱️ Connection with delays lasted {duration:.1f}s") print(f"📊 Additional events: {client.events_received}\n") async def scenario_3_connection_failure(): """Connection failures with retry.""" print("📡 Scenario 3: Connection Failures") # Enable network failures async with httpx.AsyncClient() as http_client: await http_client.get("http://localhost:8000/control?failure=true") try: await client.connect_with_retry() except Exception as e: print(f"💀 Expected failure: {type(e).__name__}") # Restore normal operation async with httpx.AsyncClient() as http_client: await http_client.get("http://localhost:8000/control?failure=false") print("🔄 Testing recovery after failure...") try: await asyncio.wait_for(client.connect_with_retry(), timeout=3.0) print("✅ Successfully recovered!") except: print("❌ Recovery failed") # Run scenarios await scenario_1_normal_connection() await scenario_2_network_delay() await scenario_3_connection_failure() print(f"📊 Total events received: {client.events_received}") print(f"🔄 Total connection attempts: {client.connection_attempts}") if __name__ == "__main__": """ DEMONSTRATION STEPS: 1. Start server: python network_interruption.py 2. Run client test: python -c "import asyncio; from network_interruption import demonstrate_network_issues; asyncio.run(demonstrate_network_issues())" 3. Observe how client handles different network conditions PRODUCTION INSIGHTS: - Always implement client-side retry logic - Use Last-Event-ID header for stream resumption - Set appropriate timeouts on both client and server - Monitor connection health with pings - Handle partial message delivery gracefully """ import uvicorn import sys if len(sys.argv) > 1 and sys.argv[1] == "demo": # Run client demonstration asyncio.run(demonstrate_network_issues()) else: # Run server print("🚀 Starting network interruption test server...") print("📋 Run demo with: python network_interruption.py demo") print( "🎛️ Control network: curl 'http://localhost:8000/control?delay=true&duration=5'" ) uvicorn.run(app, host="localhost", port=8000, log_level="error") python-sse-starlette-3.2.0/examples/demonstrations/production_scenarios/load_simulations.py0000664000175000017500000001470615132704747032601 0ustar carstencarsten# demonstrations/production_scenarios/load_simulation.py """ DEMONSTRATION: Load Testing with Multiple Concurrent Clients PURPOSE: Shows how SSE server behaves under load with many concurrent connections. KEY LEARNING: - Resource usage scales with client count - Memory and connection management is critical - Performance characteristics of SSE at scale PATTERN: Controlled load testing to understand SSE performance limits. """ import asyncio import time import httpx from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Route from sse_starlette import EventSourceResponse class LoadTestServer: """ SSE server instrumented for load testing. Tracks connections, memory usage, and performance metrics. """ def __init__(self): self.active_connections = 0 self.total_connections = 0 self.events_sent = 0 self.start_time = time.time() def connection_started(self): self.active_connections += 1 self.total_connections += 1 print(f"📈 Active: {self.active_connections}, Total: {self.total_connections}") def connection_ended(self): self.active_connections -= 1 print(f"📉 Active: {self.active_connections}") def event_sent(self): self.events_sent += 1 @property def stats(self): uptime = time.time() - self.start_time return { "active_connections": self.active_connections, "total_connections": self.total_connections, "events_sent": self.events_sent, "uptime_seconds": uptime, "events_per_second": self.events_sent / uptime if uptime > 0 else 0, } # Global server instance server = LoadTestServer() async def load_test_stream(request: Request): """ Stream optimized for load testing. Minimal processing to focus on connection handling. """ connection_id = id(request) server.connection_started() try: # Send events with minimal delay for load testing for i in range(10): # Limited events per connection if await request.is_disconnected(): break yield {"data": f"Event {i}", "id": str(i)} server.event_sent() await asyncio.sleep(0.1) # Fast events for load testing finally: server.connection_ended() async def sse_endpoint(request: Request): return EventSourceResponse(load_test_stream(request)) async def stats_endpoint(request: Request): from starlette.responses import JSONResponse return JSONResponse(server.stats) # Test application app = Starlette( routes=[Route("/events", sse_endpoint), Route("/stats", stats_endpoint)] ) class LoadTestClient: """ Client that simulates realistic SSE usage patterns. """ def __init__(self, client_id, base_url): self.client_id = client_id self.base_url = base_url self.events_received = 0 self.start_time = None self.end_time = None async def run(self): """Run the client simulation.""" self.start_time = time.time() try: async with httpx.AsyncClient(timeout=30.0) as client: async with client.stream("GET", f"{self.base_url}/events") as response: async for line in response.aiter_lines(): if line.strip(): self.events_received += 1 # Simulate client processing time await asyncio.sleep(0.01) except Exception as e: print(f"❌ Client {self.client_id} error: {type(e).__name__}") finally: self.end_time = time.time() @property def duration(self): if self.start_time and self.end_time: return self.end_time - self.start_time return 0 async def run_load_test(num_clients=10, base_url="http://localhost:8000"): """ Run load test with specified number of concurrent clients. """ print(f"🚀 Starting load test with {num_clients} clients...") # Create client tasks clients = [LoadTestClient(i, base_url) for i in range(num_clients)] client_tasks = [client.run() for client in clients] # Track progress async def progress_monitor(): for _ in range(10): # Monitor for 10 seconds await asyncio.sleep(1) # Get server stats async with httpx.AsyncClient() as http_client: try: response = await http_client.get(f"{base_url}/stats") stats = response.json() print( f"📊 Active: {stats['active_connections']}, " f"Events/sec: {stats['events_per_second']:.1f}" ) except: pass # Run load test start_time = time.time() await asyncio.gather(*client_tasks, progress_monitor(), return_exceptions=True) # Analyze results total_duration = time.time() - start_time successful_clients = [c for c in clients if c.events_received > 0] print("\n📈 Load Test Results:") print(f" Clients: {num_clients}") print(f" Successful: {len(successful_clients)}") print(f" Duration: {total_duration:.1f}s") print(f" Total events: {sum(c.events_received for c in clients)}") print( f" Avg events per client: {sum(c.events_received for c in clients) / len(clients):.1f}" ) if __name__ == "__main__": """ DEMONSTRATION STEPS: 1. Run server: python load_simulation.py (in one terminal) 2. Run clients: python production_scenarios/load_simulations.py test 20 (in another terminal) 3. Monitor resource usage with system tools 4. Experiment with different client counts PERFORMANCE INSIGHTS: - Memory usage scales linearly with connections - CPU usage depends on event frequency - Network becomes bottleneck with many clients - Connection limits are OS and application dependent """ import uvicorn import sys if len(sys.argv) > 1 and sys.argv[1] == "test": # Run as load test client num_clients = int(sys.argv[2]) if len(sys.argv) > 2 else 10 asyncio.run(run_load_test(num_clients)) else: # Run as server print("🚀 Starting SSE load test server...") print("📋 Run load test with: python load_simulation.py test 20") uvicorn.run(app, host="localhost", port=8000, log_level="error") python-sse-starlette-3.2.0/examples/demonstrations/production_scenarios/frozen_client.py0000664000175000017500000000216015132704747032063 0ustar carstencarsten""" https://github.com/sysid/sse-starlette/issues/89 Server Simulation: Run with: uvicorn tests.integration.frozen_client:app Client Simulation: % curl -s -N localhost:8000/events > /dev/null ^Z (suspend process -> no consumption of messages but connection alive) Measure resource consumption: connections: lsof -i :8000 buffers: netstat -m """ import anyio import uvicorn from starlette.applications import Starlette from starlette.routing import Route from sse_starlette import EventSourceResponse async def events(request): async def _event_generator(): try: i = 0 while True: i += 1 if i % 100 == 0: print(i) yield dict(data={i: " " * 4096}) await anyio.sleep(0.001) finally: print("disconnected") return EventSourceResponse(_event_generator(), send_timeout=10) app = Starlette( debug=True, routes=[ Route("/events", events), ], ) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="trace", log_config=None) # type: ignore python-sse-starlette-3.2.0/examples/demonstrations/basic_patterns/0000775000175000017500000000000015132704747025416 5ustar carstencarstenpython-sse-starlette-3.2.0/examples/demonstrations/basic_patterns/main_endless_conditional.py0000664000175000017500000000424115132704747033015 0ustar carstencarsten# main.py import asyncio import logging import uvicorn from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import JSONResponse from starlette.routing import Route from sse_starlette import EventSourceResponse """ example by: justindujardin 4efaffc2365a85f132ab8fc405110120c9c9e36a, https://github.com/sysid/sse-starlette/pull/13 tests proper shutdown in case no messages are yielded: - in a streaming endpoint that reports only on "new" data, it is possible to get into a state where no no yields are expected to happen in the near future. e.g. there are no new chat messages to emit. - add a third task to taskgroup that checks the uvicorn exit status at a regular interval. """ _log = logging.getLogger(__name__) async def endless(req: Request): """Simulates an endless stream but only yields one item In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. (deadlock) """ async def event_publisher(): has_data = True # The event publisher only conditionally emits items try: while True: disconnected = await req.is_disconnected() if disconnected: _log.info(f"Disconnecting client {req.client}") break # Simulate only sending one response if has_data: yield dict(data="u can haz the data") has_data = False await asyncio.sleep(0.9) except asyncio.CancelledError as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) async def healthcheck(req: Request): return JSONResponse({"status": "ok"}) app = Starlette( routes=[ Route("/endless", endpoint=endless), Route("/health", endpoint=healthcheck), ], ) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="trace") python-sse-starlette-3.2.0/examples/demonstrations/basic_patterns/graceful_shutdown.py0000664000175000017500000001032015132704747031507 0ustar carstencarsten# demonstrations/basic_patterns/graceful_shutdown.py """ DEMONSTRATION: Graceful Server Shutdown PURPOSE: Shows what happens to active SSE connections when server shuts down gracefully vs when it's killed forcefully. KEY LEARNING: - Graceful shutdown allows streams to complete current operations - Clients receive proper connection close signals - Cleanup code in generators gets executed PATTERN: Using signal handlers and proper async cleanup ensures data integrity. """ import asyncio import signal import sys from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Route from sse_starlette import EventSourceResponse class ShutdownManager: """ Manages graceful shutdown by coordinating with active streams. """ def __init__(self): self.shutdown_requested = False self.active_streams = set() def register_stream(self, stream_id): """Register a new active stream.""" self.active_streams.add(stream_id) print(f"📡 Stream {stream_id} started. Active: {len(self.active_streams)}") def unregister_stream(self, stream_id): """Unregister a completed stream.""" self.active_streams.discard(stream_id) print(f"📡 Stream {stream_id} ended. Active: {len(self.active_streams)}") def request_shutdown(self): """Request graceful shutdown.""" print(f"🛑 Shutdown requested. {len(self.active_streams)} streams active.") self.shutdown_requested = True # Global shutdown manager shutdown_manager = ShutdownManager() async def long_running_stream(request: Request): """ Stream that demonstrates cleanup during shutdown. """ stream_id = id(request) shutdown_manager.register_stream(stream_id) try: for i in range(1, 20): # Long-running stream # Check for shutdown signal if shutdown_manager.shutdown_requested: yield {"data": "Server shutting down gracefully..."} break # Check for client disconnect if await request.is_disconnected(): print(f"🔌 Client disconnected from stream {stream_id}") break yield {"data": f"Event {i} from stream {stream_id}"} await asyncio.sleep(1) except asyncio.CancelledError: # This happens during graceful shutdown print(f"🧹 Stream {stream_id} cancelled during shutdown") yield {"data": "Stream cancelled due to shutdown"} raise finally: # Cleanup always happens print(f"🧹 Cleaning up stream {stream_id}") shutdown_manager.unregister_stream(stream_id) async def sse_endpoint(request: Request): """SSE endpoint with graceful shutdown support.""" return EventSourceResponse(long_running_stream(request)) # Setup signal handlers for graceful shutdown def signal_handler(signum, frame): """Handle shutdown signals gracefully.""" print(f"\n📢 Received signal {signum}. Initiating graceful shutdown...") shutdown_manager.request_shutdown() # Give streams time to cleanup print("⏳ Waiting for active streams to complete...") time.sleep(2) print("✅ Graceful shutdown complete.") sys.exit(0) # Register signal handlers signal.signal(signal.SIGINT, signal_handler) # Ctrl+C signal.signal(signal.SIGTERM, signal_handler) # Kill command # Test application app = Starlette(routes=[Route("/events", sse_endpoint)]) if __name__ == "__main__": """ DEMONSTRATION STEPS: 1. Run this script 2. Connect with: curl -N http://localhost:8000/events 3. Press Ctrl+C to trigger graceful shutdown 4. Observe how active streams are notified and cleaned up COMPARE WITH: - Send SIGKILL (kill -9) to see forceful termination - Notice the difference in cleanup behavior """ import uvicorn import time print("🚀 Starting graceful shutdown demonstration...") print("📋 Instructions:") print(" 1. Connect with: curl -N http://localhost:8000/events") print(" 2. Press Ctrl+C to see graceful shutdown") print(" 3. Compare with kill -9 for forceful shutdown") print() uvicorn.run(app, host="localhost", port=8000, log_level="info") python-sse-starlette-3.2.0/examples/demonstrations/basic_patterns/client_disconnect.py0000664000175000017500000001250415132704747031461 0ustar carstencarsten# demonstrations/basic_patterns/client_disconnect.py """ DEMONSTRATION: Client Disconnect Detection PURPOSE: Shows how server detects when clients disconnect and properly cleans up resources. KEY LEARNING: - Server can detect client disconnections using request.is_disconnected() - Cleanup code runs when clients disconnect unexpectedly - Resource management is critical for production SSE PATTERN: Regular polling for disconnection combined with proper exception handling. """ import asyncio from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Route from sse_starlette import EventSourceResponse class ConnectionTracker: """ Tracks active connections for demonstration purposes. In production, this might track database connections, file handles, etc. """ def __init__(self): self.connections = {} def add_connection(self, connection_id, info): self.connections[connection_id] = { "start_time": asyncio.get_event_loop().time(), "info": info, "events_sent": 0, } print(f"➕ Connection {connection_id} added. Total: {len(self.connections)}") def update_connection(self, connection_id, events_sent): if connection_id in self.connections: self.connections[connection_id]["events_sent"] = events_sent def remove_connection(self, connection_id, reason="unknown"): if connection_id in self.connections: conn = self.connections.pop(connection_id) duration = asyncio.get_event_loop().time() - conn["start_time"] print(f"➖ Connection {connection_id} removed ({reason})") print(f" Duration: {duration:.1f}s, Events sent: {conn['events_sent']}") print(f" Active connections: {len(self.connections)}") # Global connection tracker tracker = ConnectionTracker() async def monitored_stream(request: Request): """ Stream that actively monitors for client disconnection. """ connection_id = id(request) client_info = ( f"Client from {request.client}" if request.client else "Unknown client" ) # Register this connection tracker.add_connection(connection_id, client_info) try: events_sent = 0 for i in range(1, 100): # Long stream to allow disconnection testing # CRITICAL: Check for disconnection before sending each event if await request.is_disconnected(): tracker.remove_connection(connection_id, "client_disconnected") print( f"🔌 Client {connection_id} disconnected after {events_sent} events" ) break # Send event yield {"data": f"Event {i} - {client_info}", "id": str(i)} events_sent += 1 tracker.update_connection(connection_id, events_sent) # Longer delay to make disconnection testing easier await asyncio.sleep(2) except asyncio.CancelledError: # Client disconnected via cancellation (e.g., Ctrl+C in curl) tracker.remove_connection(connection_id, "stream_cancelled") print(f"❌ Stream {connection_id} cancelled") raise except Exception as e: # Unexpected error tracker.remove_connection(connection_id, f"error: {e}") print(f"💥 Stream {connection_id} failed: {e}") raise finally: # This always runs, ensuring cleanup print(f"🧹 Cleanup completed for connection {connection_id}") async def sse_endpoint(request: Request): """SSE endpoint with connection monitoring.""" return EventSourceResponse(monitored_stream(request)) async def status_endpoint(request: Request): """Show current connection status.""" from starlette.responses import JSONResponse return JSONResponse( { "active_connections": len(tracker.connections), "connections": { str(conn_id): { "duration": asyncio.get_event_loop().time() - conn["start_time"], "events_sent": conn["events_sent"], "info": conn["info"], } for conn_id, conn in tracker.connections.items() }, } ) # Test application app = Starlette( routes=[Route("/events", sse_endpoint), Route("/status", status_endpoint)] ) if __name__ == "__main__": """ DEMONSTRATION STEPS: 1. Run this script 2. Open multiple terminals and connect: curl -N http://localhost:8000/events 3. Check status: curl http://localhost:8000/status 4. Press Ctrl+C in one terminal (client disconnect) 5. Observe server detection and cleanup 6. Check status again to see updated connection count KEY OBSERVATIONS: - Server immediately detects disconnections - Cleanup code runs automatically - Other connections remain unaffected - Resource tracking prevents memory leaks """ import uvicorn print("🚀 Starting client disconnect demonstration...") print() print("📋 Instructions:") print(" 1. Connect: curl -N http://localhost:8000/events") print(" 2. Status: curl http://localhost:8000/status") print(" 3. Disconnect with Ctrl+C and observe cleanup") print() uvicorn.run(app, host="localhost", port=8000, log_level="info") python-sse-starlette-3.2.0/examples/demonstrations/conftest.py0000664000175000017500000001505615132704747024623 0ustar carstencarsten# tests/test_sse.py (UNCHANGED - Keep existing unit tests) # tests/test_event.py (UNCHANGED - Keep existing unit tests) # tests/conftest.py (UNCHANGED - Keep existing fixtures) # Remove these files (move content to demonstrations/): # - tests/integration/test_multiple_consumers.py # - tests/experimentation/test_multiple_consumers_threads.py # - tests/experimentation/test_multiple_consumers_asyncio.py # demonstrations/README.md """ # SSE Educational Demonstrations This directory contains focused, educational demonstrations of SSE patterns and behaviors. Each demonstration shows ONE key concept clearly without unnecessary complexity. ## Philosophy These are **educational scenarios**, not traditional unit tests. They demonstrate: - Real-world SSE patterns and behaviors - Common production challenges and solutions - Best practices through working examples - Edge cases and error conditions ## Directory Structure ### 📁 basic_patterns/ **Purpose**: Core SSE behaviors every developer should understand - **graceful_shutdown.py**: Server shutdown behavior and cleanup patterns - **client_disconnect.py**: Client disconnection detection and resource cleanup **Key Learning**: SSE connection lifecycle, resource management, proper cleanup ### 📁 production_scenarios/ **Purpose**: Real-world deployment patterns and challenges - **load_simulation.py**: Multiple concurrent clients and performance testing - **network_interruption.py**: Handling network failures and reconnection **Key Learning**: Production readiness, scalability, resilience patterns ### 📁 advanced_patterns/ **Purpose**: Sophisticated streaming techniques and architectures - **memory_channels.py**: Using memory channels instead of generators - **error_recovery.py**: Comprehensive error handling and recovery strategies - **custom_protocols.py**: Building domain-specific protocols over SSE **Key Learning**: Advanced architectures, error resilience, protocol design ## Running Demonstrations Each file is self-contained and executable: ```bash # Basic patterns python demonstrations/basic_patterns/multiple_clients.py python demonstrations/basic_patterns/graceful_shutdown.py python demonstrations/basic_patterns/client_disconnect.py # Production scenarios python demonstrations/production_scenarios/load_simulation.py test 20 python demonstrations/production_scenarios/network_interruption.py demo # Advanced patterns python demonstrations/advanced_patterns/memory_channels.py python demonstrations/advanced_patterns/error_recovery.py python demonstrations/advanced_patterns/custom_protocols.py ``` ## Educational Progression ### 🎯 Level 1: Basic Understanding Start with `basic_patterns/` to understand: - How SSE connections work - Client-server lifecycle - Resource cleanup importance ### 🎯 Level 2: Production Readiness Continue with `production_scenarios/` to learn: - Deployment considerations - Performance characteristics - Network resilience ### 🎯 Level 3: Advanced Techniques Explore `advanced_patterns/` for: - Sophisticated architectures - Error handling strategies - Custom protocol design ## Key Learning Outcomes After working through these demonstrations, you'll understand: 1. **SSE Connection Lifecycle** - How connections are established and maintained - What happens during client disconnections - Proper resource cleanup patterns 2. **Production Deployment** - Container-based testing approaches - Performance and scalability considerations - Network failure handling 3. **Advanced Architectures** - When to use memory channels vs generators - Error recovery and circuit breaker patterns - Building custom protocols over SSE ## Design Principles Each demonstration follows these principles: ### ✅ **Focused Learning** - ONE key concept per demonstration - No unnecessary complexity or features - Clear learning objectives stated upfront ### ✅ **Production Relevant** - Patterns used in real applications - Common problems and solutions - Best practices embedded in code ### ✅ **Self-Contained** - Each demo runs independently - No external dependencies beyond the project - Complete working examples ### ✅ **Educational Comments** - Rich comments explaining WHY, not just WHAT - Design decisions explained - Alternative approaches discussed ## Testing vs Demonstrations **Traditional Tests (`tests/`)**: - Verify correctness of implementation - Fast execution, isolated units - Assert specific behaviors - Part of CI/CD pipeline **Educational Demonstrations (`demonstrations/`)**: - Show real-world usage patterns - May be slow, interactive - Demonstrate behaviors visually - Learning and reference tools ## Integration with CI/CD While demonstrations are primarily educational, they can be integrated into CI: ```bash # Run basic smoke tests on demonstrations python -m pytest demonstrations/ -k "test_" --timeout=30 # Or run as integration tests make demo-test ``` ## Contributing New Demonstrations When adding new demonstrations: 1. **Choose the right category** (basic/production/advanced) 2. **Focus on ONE key concept** per file 3. **Add rich educational comments** explaining the WHY 4. **Make it self-contained** and executable 5. **Update this README** with the new demonstration ## Common Questions **Q: Why separate from regular tests?** A: Demonstrations focus on education and real-world patterns, while tests verify correctness. Different purposes, different approaches. **Q: How long should demonstrations take to run?** A: Basic patterns: 10-30 seconds. Production scenarios: 30-60 seconds. Advanced patterns: 30-120 seconds. **Q: Can I use these in production?** A: These are educational examples. Extract patterns and adapt for your specific use case. **Q: How do I know which demonstration to run first?** A: Start with basic_patterns/, then production_scenarios/, then advanced_patterns/. Each builds on the previous level. """ # demonstrations/conftest.py """ Shared fixtures and utilities for demonstrations. Kept minimal to avoid complexity. """ import pytest import asyncio from typing import AsyncGenerator import httpx @pytest.fixture def event_loop(): """Create an instance of the default event loop for the test session.""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest.fixture async def http_client() -> AsyncGenerator[httpx.AsyncClient, None]: """Async HTTP client for demonstration testing.""" async with httpx.AsyncClient(timeout=10.0) as client: yield client @pytest.fixture def demo_server_url() -> str: """Base URL for demonstration servers.""" return "http://localhost:8000" python-sse-starlette-3.2.0/examples/demonstrations/advanced_patterns/0000775000175000017500000000000015132704747026102 5ustar carstencarstenpython-sse-starlette-3.2.0/examples/demonstrations/advanced_patterns/memory_channels.py0000664000175000017500000002006415132704747031641 0ustar carstencarsten# demonstrations/advanced_patterns/memory_channels.py """ DEMONSTRATION: Memory Channels Alternative to Generators PURPOSE: Shows how to use anyio memory channels instead of async generators for SSE streaming, providing better control over data flow. KEY LEARNING: - Memory channels decouple data production from consumption - Better error handling and resource management - More flexible than generators for complex scenarios PATTERN: Producer-consumer pattern using memory channels for SSE. """ import asyncio from functools import partial import anyio from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Route from sse_starlette import EventSourceResponse async def data_producer(send_channel: anyio.abc.ObjectSendStream, producer_id: str): """ Producer that generates data and sends it through a memory channel. This runs independently of the SSE connection. """ async with send_channel: # Ensures channel closes when done try: print(f"🏭 Producer {producer_id} started") for i in range(1, 10): # Simulate data processing await asyncio.sleep(1) # Create event data event_data = { "data": f"Data from producer {producer_id}, item {i}", "id": f"{producer_id}-{i}", "event": "production_data", } # Send through channel (non-blocking) await send_channel.send(event_data) print(f"📤 Producer {producer_id} sent item {i}") # Send completion signal await send_channel.send( { "data": f"Producer {producer_id} completed", "event": "producer_complete", } ) except Exception as e: print(f"💥 Producer {producer_id} error: {e}") # Send error through channel await send_channel.send({"data": f"Producer error: {e}", "event": "error"}) finally: print(f"🧹 Producer {producer_id} cleanup completed") async def memory_channel_endpoint(request: Request): """ SSE endpoint using memory channels instead of generators. """ # Create memory channel for producer-consumer communication send_channel, receive_channel = anyio.create_memory_object_stream( max_buffer_size=10 # Bounded buffer prevents memory issues ) # Create unique producer ID for this connection producer_id = f"prod-{id(request)}" # Create EventSourceResponse with channel and producer return EventSourceResponse( receive_channel, # Consumer side of the channel data_sender_callable=partial(data_producer, send_channel, producer_id), ping=5, ) async def multi_producer_endpoint(request: Request): """ Advanced example: Multiple producers feeding one SSE stream. Demonstrates how memory channels enable complex data flows. """ # Create channel for combined output combined_send, combined_receive = anyio.create_memory_object_stream( max_buffer_size=20 ) async def multi_producer_coordinator(combined_channel): """ Coordinates multiple producers and merges their output. """ async with combined_channel: try: # Create multiple producer channels producer_channels = [] for i in range(3): # 3 producers send_ch, recv_ch = anyio.create_memory_object_stream( max_buffer_size=5 ) producer_channels.append((send_ch, recv_ch, f"multi-{i}")) async with anyio.create_task_group() as tg: # Start all producers for send_ch, _, prod_id in producer_channels: tg.start_soon(data_producer, send_ch, prod_id) # Merge all producer outputs async def merge_outputs(): # Collect all receive channels receive_channels = [ recv_ch for _, recv_ch, _ in producer_channels ] # Use anyio to multiplex channels async with anyio.create_task_group() as merge_tg: for recv_ch in receive_channels: merge_tg.start_soon( forward_channel_data, recv_ch, combined_channel ) tg.start_soon(merge_outputs) except Exception as e: await combined_channel.send( {"data": f"Multi-producer error: {e}", "event": "error"} ) return EventSourceResponse( combined_receive, data_sender_callable=partial(multi_producer_coordinator, combined_send), ping=3, ) async def forward_channel_data(source_channel, target_channel): """ Helper function to forward data from one channel to another. """ async with source_channel: async for item in source_channel: try: await target_channel.send(item) except anyio.BrokenResourceError: # Target channel closed break async def backpressure_demo_endpoint(request: Request): """ Demonstrates backpressure handling with memory channels. Shows what happens when producer is faster than consumer. """ # Small buffer to demonstrate backpressure send_channel, receive_channel = anyio.create_memory_object_stream(max_buffer_size=2) async def fast_producer(channel): """Producer that generates data faster than typical consumption.""" async with channel: try: for i in range(20): event_data = { "data": f"Fast data {i} - buffer may be full!", "id": str(i), "event": "fast_data", } print(f"🚀 Trying to send item {i}") # This will block when buffer is full (backpressure) await channel.send(event_data) print(f"✅ Sent item {i}") # Producer works faster than typical consumer await asyncio.sleep(0.01) except Exception as e: print(f"💥 Fast producer error: {e}") await channel.send({"data": f"Producer error: {e}", "event": "error"}) return EventSourceResponse( receive_channel, data_sender_callable=partial(fast_producer, send_channel), ping=2, ) # Test application app = Starlette( routes=[ Route("/memory-channel", memory_channel_endpoint), Route("/multi-producer", multi_producer_endpoint), Route("/backpressure", backpressure_demo_endpoint), ] ) if __name__ == "__main__": """ DEMONSTRATION STEPS: 1. Run server: python memory_channels.py 2. Test single producer: curl -N http://localhost:8000/memory-channel 3. Test multi-producer: curl -N http://localhost:8000/multi-producer 4. Test backpressure: curl -N http://localhost:8000/sse | pv -q -L 10 MEMORY CHANNEL BENEFITS: - Better separation of concerns (producer vs consumer) - Built-in backpressure handling - Multiple producers can feed one stream - More robust error handling - Easier testing and debugging WHEN TO USE: - Complex data processing pipelines - Multiple data sources - Need for buffering and flow control - Better error isolation required """ import uvicorn print("🚀 Starting memory channels demonstration server...") print("📋 Available endpoints:") print(" /memory-channel - Basic producer-consumer pattern") print(" /multi-producer - Multiple producers, one stream") print(" /backpressure - Backpressure demonstration") uvicorn.run(app, host="localhost", port=8000, log_level="info") python-sse-starlette-3.2.0/examples/demonstrations/advanced_patterns/custom_protocols.py0000664000175000017500000003257315132704747032104 0ustar carstencarsten# demonstrations/advanced_patterns/custom_protocols.py """ DEMONSTRATION: Custom SSE Protocols PURPOSE: Shows how to build custom protocols on top of SSE for specialized use cases. KEY LEARNING: - SSE can be extended with custom event types and data formats - Protocol versioning and negotiation - Building domain-specific streaming APIs PATTERN: Layered protocol design using SSE as transport layer. """ import asyncio import json from dataclasses import dataclass, asdict from enum import Enum from typing import Dict, Any, Optional from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Route from sse_starlette import EventSourceResponse, ServerSentEvent class TaskStatus(Enum): """Task execution states in our custom protocol.""" PENDING = "pending" RUNNING = "running" COMPLETED = "completed" FAILED = "failed" @dataclass class TaskProgressEvent: """ Custom protocol message for task progress updates. This demonstrates structured data over SSE. """ task_id: str status: TaskStatus progress_percent: int message: str timestamp: float metadata: Optional[Dict[str, Any]] = None def to_sse_event(self) -> ServerSentEvent: """Convert to SSE event with custom protocol structure.""" return ServerSentEvent( data=json.dumps(asdict(self)), event="task_progress", id=f"{self.task_id}-{int(self.timestamp)}", ) @dataclass class SystemHealthEvent: """Protocol message for system health monitoring.""" component: str status: str metrics: Dict[str, float] alerts: list[str] timestamp: float def to_sse_event(self) -> ServerSentEvent: return ServerSentEvent( data=json.dumps(asdict(self)), event="health_update", id=f"health-{int(self.timestamp)}", ) class CustomProtocolHandler: """ Handles custom protocol logic and message formatting. Demonstrates how to build domain-specific APIs over SSE. """ def __init__(self, protocol_version: str = "1.0"): self.protocol_version = protocol_version self.active_tasks: Dict[str, TaskStatus] = {} self.client_capabilities: Dict[str, set] = {} def negotiate_protocol(self, request: Request) -> Dict[str, Any]: """ Negotiate protocol capabilities with client. Uses HTTP headers for capability exchange. """ client_version = request.headers.get("X-Protocol-Version", "1.0") client_features = request.headers.get("X-Client-Features", "").split(",") # Store client capabilities client_id = str(id(request)) self.client_capabilities[client_id] = set( f.strip() for f in client_features if f.strip() ) return { "server_version": self.protocol_version, "client_version": client_version, "supported_events": [ "task_progress", "health_update", "system_alert", "protocol_info", ], "features": ["compression", "batching", "filtering"], } def supports_feature(self, client_id: str, feature: str) -> bool: """Check if client supports a specific feature.""" return feature in self.client_capabilities.get(client_id, set()) async def create_protocol_handshake_event( self, request: Request ) -> ServerSentEvent: """ Create initial handshake event with protocol information. This establishes the custom protocol session. """ protocol_info = self.negotiate_protocol(request) return ServerSentEvent( data=json.dumps(protocol_info), event="protocol_handshake", id="handshake-0" ) # Global protocol handler protocol_handler = CustomProtocolHandler() async def task_monitoring_protocol(request: Request): """ Custom protocol for task monitoring and progress tracking. Demonstrates structured, domain-specific SSE communication. """ client_id = str(id(request)) # Send protocol handshake yield protocol_handler.create_protocol_handshake_event(request) # Simulate multiple tasks with different lifecycles tasks = [ {"id": "build-001", "name": "Build Application", "duration": 8}, {"id": "test-001", "name": "Run Tests", "duration": 5}, {"id": "deploy-001", "name": "Deploy to Production", "duration": 3}, ] import time try: for task in tasks: task_id = task["id"] duration = task["duration"] # Task starting start_event = TaskProgressEvent( task_id=task_id, status=TaskStatus.PENDING, progress_percent=0, message=f"Starting {task['name']}", timestamp=time.time(), ) yield start_event.to_sse_event() # Task running with progress updates for progress in range(0, 101, 20): if await request.is_disconnected(): return status = TaskStatus.RUNNING if progress < 100 else TaskStatus.COMPLETED message = f"{task['name']} - {progress}% complete" progress_event = TaskProgressEvent( task_id=task_id, status=status, progress_percent=progress, message=message, timestamp=time.time(), metadata={"phase": "execution", "worker": f"worker-{task_id[-1]}"}, ) yield progress_event.to_sse_event() await asyncio.sleep(duration / 5) # Spread progress over task duration # Brief pause between tasks await asyncio.sleep(0.5) except Exception as e: # Send error in protocol format error_event = TaskProgressEvent( task_id="system", status=TaskStatus.FAILED, progress_percent=0, message=f"Protocol error: {e}", timestamp=time.time(), ) yield error_event.to_sse_event() async def system_monitoring_protocol(request: Request): """ Custom protocol for system health monitoring. Shows how to stream complex structured data. """ import time import random # Send protocol handshake yield protocol_handler.create_protocol_handshake_event(request) components = ["database", "cache", "api", "worker"] try: for cycle in range(20): if await request.is_disconnected(): break # Generate health data for each component for component in components: # Simulate varying health metrics cpu_usage = random.uniform(10, 90) memory_usage = random.uniform(20, 80) response_time = random.uniform(50, 500) # Generate alerts based on thresholds alerts = [] if cpu_usage > 80: alerts.append(f"High CPU usage: {cpu_usage:.1f}%") if memory_usage > 70: alerts.append(f"High memory usage: {memory_usage:.1f}%") if response_time > 300: alerts.append(f"Slow response time: {response_time:.0f}ms") status = ( "healthy" if not alerts else "warning" if len(alerts) < 2 else "critical" ) health_event = SystemHealthEvent( component=component, status=status, metrics={ "cpu_usage_percent": cpu_usage, "memory_usage_percent": memory_usage, "response_time_ms": response_time, "uptime_hours": cycle * 0.1, }, alerts=alerts, timestamp=time.time(), ) yield health_event.to_sse_event() await asyncio.sleep(2) # Health check interval except Exception as e: # Send system error error_event = SystemHealthEvent( component="monitoring", status="failed", metrics={}, alerts=[f"Monitoring system error: {e}"], timestamp=time.time(), ) yield error_event.to_sse_event() async def multi_protocol_endpoint(request: Request): """ Endpoint that supports multiple custom protocols based on request parameters. Demonstrates protocol selection and routing. """ protocol_type = request.query_params.get("protocol", "task") if protocol_type == "task": return EventSourceResponse( task_monitoring_protocol(request), headers={"X-Protocol-Type": "task-monitoring-v1"}, ) elif protocol_type == "health": return EventSourceResponse( system_monitoring_protocol(request), headers={"X-Protocol-Type": "health-monitoring-v1"}, ) else: # Default: Send protocol information async def protocol_info(): yield ServerSentEvent( data=json.dumps( { "error": f"Unknown protocol: {protocol_type}", "available_protocols": ["task", "health"], "usage": "Add ?protocol= to URL", } ), event="protocol_error", ) return EventSourceResponse(protocol_info()) async def compressed_protocol_endpoint(request: Request): """ Demonstrates protocol with data compression and batching. Advanced technique for high-throughput scenarios. """ client_id = str(id(request)) supports_batching = protocol_handler.supports_feature(client_id, "batching") async def compressed_stream(): # Send handshake yield protocol_handler.create_protocol_handshake_event(request) import time batch_buffer = [] # Generate high-frequency data for i in range(100): if await request.is_disconnected(): break event_data = { "sequence": i, "timestamp": time.time(), "data": f"High frequency data point {i}", "metrics": {"value": i * 1.5, "rate": i / 10.0}, } if supports_batching: # Batch events for efficiency batch_buffer.append(event_data) if len(batch_buffer) >= 5: # Batch size yield ServerSentEvent( data=json.dumps({"batch": batch_buffer}), event="data_batch", id=f"batch-{i // 5}", ) batch_buffer = [] else: # Send individual events yield ServerSentEvent( data=json.dumps(event_data), event="data_point", id=str(i) ) await asyncio.sleep(0.1) # Send any remaining batched data if batch_buffer: yield ServerSentEvent( data=json.dumps({"batch": batch_buffer}), event="data_batch", id="final-batch", ) return EventSourceResponse(compressed_stream()) # Test application app = Starlette( routes=[ Route("/protocols", multi_protocol_endpoint), Route("/compressed", compressed_protocol_endpoint), ] ) if __name__ == "__main__": """ DEMONSTRATION STEPS: 1. Run server: python custom_protocols.py 2. Test task monitoring protocol: curl -N -H "X-Protocol-Version: 1.0" -H "X-Client-Features: batching,compression" \ "http://localhost:8000/protocols?protocol=task" 3. Test health monitoring protocol: curl -N "http://localhost:8000/protocols?protocol=health" 4. Test compressed/batched protocol: curl -N -H "X-Client-Features: batching" \ "http://localhost:8000/compressed" CUSTOM PROTOCOL BENEFITS: 1. **Structured Communication**: - Predefined message formats - Type safety and validation - Clear contract between client/server 2. **Protocol Negotiation**: - Version compatibility checking - Feature capability exchange - Graceful degradation 3. **Domain-Specific Optimization**: - Specialized event types - Efficient data encoding - Batch operations for performance 4. **Error Handling**: - Protocol-aware error messages - Structured error information - Recovery mechanisms PRODUCTION PATTERNS: - Define clear message schemas - Implement protocol versioning - Handle capability negotiation - Optimize for specific use cases - Document protocol specifications """ import uvicorn print("🚀 Starting custom protocols demonstration server...") print("📋 Available endpoints:") print(" /protocols?protocol=task - Task monitoring protocol") print(" /protocols?protocol=health - Health monitoring protocol") print(" /compressed - Batching and compression demo") print("💡 Use X-Protocol-Version and X-Client-Features headers") uvicorn.run(app, host="localhost", port=8000, log_level="info") python-sse-starlette-3.2.0/examples/demonstrations/advanced_patterns/error_recovery.py0000664000175000017500000002500515132704747031525 0ustar carstencarsten# demonstrations/advanced_patterns/error_recovery.py """ DEMONSTRATION: Error Recovery in SSE Streams PURPOSE: Shows sophisticated error handling and recovery patterns for production SSE. KEY LEARNING: - Different types of errors require different recovery strategies - Stream state can be preserved across errors - Client-side recovery patterns are essential PATTERN: Multi-layered error handling with graceful degradation. """ import asyncio import random from enum import Enum from dataclasses import dataclass from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Route from sse_starlette import EventSourceResponse class ErrorType(Enum): """Different types of errors that can occur in SSE streams.""" TRANSIENT = "transient" # Temporary issues, can retry RECOVERABLE = "recoverable" # Errors we can work around FATAL = "fatal" # Unrecoverable errors @dataclass class StreamState: """Maintains state across error recovery attempts.""" last_successful_event: int = 0 error_count: int = 0 recovery_attempts: int = 0 start_time: float = 0 def should_abort(self, max_errors: int = 5) -> bool: """Determine if stream should be aborted due to too many errors.""" return self.error_count >= max_errors class ErrorSimulator: """Simulates various error conditions for demonstration.""" def __init__(self): self.error_probability = 0.1 # 10% chance of error self.error_types = list(ErrorType) def should_error_occur(self) -> bool: """Randomly determine if an error should occur.""" return random.random() < self.error_probability def get_random_error(self) -> tuple[ErrorType, Exception]: """Generate a random error for demonstration.""" error_type = random.choice(self.error_types) if error_type == ErrorType.TRANSIENT: return error_type, ConnectionError("Temporary database connection lost") elif error_type == ErrorType.RECOVERABLE: return error_type, ValueError("Invalid data format, using fallback") else: # FATAL return error_type, RuntimeError("Critical system failure") async def resilient_stream_with_recovery(request: Request, stream_state: StreamState): """ Stream that implements comprehensive error recovery. """ error_simulator = ErrorSimulator() try: # Resume from last successful event start_event = stream_state.last_successful_event + 1 for i in range(start_event, start_event + 20): # Check for client disconnect if await request.is_disconnected(): yield {"data": "Client disconnected during recovery", "event": "info"} break try: # Simulate error conditions if error_simulator.should_error_occur(): error_type, error = error_simulator.get_random_error() raise error # Normal event processing event_data = { "data": f"Event {i} - State: errors={stream_state.error_count}, recoveries={stream_state.recovery_attempts}", "id": str(i), "event": "data", } yield event_data stream_state.last_successful_event = i await asyncio.sleep(0.5) except ConnectionError as e: # TRANSIENT error - can retry stream_state.error_count += 1 print(f"🔄 Transient error at event {i}: {e}") yield { "data": f"Temporary connection issue, retrying... (attempt {stream_state.recovery_attempts + 1})", "event": "recovery", } # Wait and retry await asyncio.sleep(1) stream_state.recovery_attempts += 1 continue # Retry this event except ValueError as e: # RECOVERABLE error - use fallback stream_state.error_count += 1 print(f"⚠️ Recoverable error at event {i}: {e}") # Send fallback data fallback_data = { "data": f"Fallback data for event {i} (original data corrupted)", "id": str(i), "event": "fallback", } yield fallback_data stream_state.last_successful_event = i continue # Continue with next event except RuntimeError as e: # FATAL error - cannot recover print(f"💀 Fatal error at event {i}: {e}") yield {"data": f"Fatal error occurred: {e}", "event": "fatal_error"} # Abort stream return except Exception as e: # Unexpected error print(f"💥 Unexpected error in stream: {e}") yield {"data": f"Unexpected stream error: {e}", "event": "stream_error"} finally: # Always send completion info yield { "data": f"Stream completed - Events: {stream_state.last_successful_event}, Errors: {stream_state.error_count}", "event": "completion", } async def error_recovery_endpoint(request: Request): """ SSE endpoint with comprehensive error recovery. """ import time # Create stream state for this connection stream_state = StreamState(start_time=time.time()) # Check if client is requesting resumption last_event_id = request.headers.get("Last-Event-ID") if last_event_id: try: stream_state.last_successful_event = int(last_event_id) print(f"📍 Resuming stream from event {last_event_id}") except ValueError: print(f"⚠️ Invalid Last-Event-ID: {last_event_id}") return EventSourceResponse( resilient_stream_with_recovery(request, stream_state), ping=3, send_timeout=10.0 ) async def circuit_breaker_endpoint(request: Request): """ Demonstrates circuit breaker pattern for SSE. """ class CircuitBreaker: def __init__(self, failure_threshold=3, recovery_timeout=5): self.failure_threshold = failure_threshold self.recovery_timeout = recovery_timeout self.failure_count = 0 self.last_failure_time = 0 self.state = "CLOSED" # CLOSED, OPEN, HALF_OPEN def is_available(self) -> bool: """Check if service is available according to circuit breaker.""" import time current_time = time.time() if self.state == "OPEN": if current_time - self.last_failure_time > self.recovery_timeout: self.state = "HALF_OPEN" return True return False return True def record_success(self): """Record successful operation.""" self.failure_count = 0 self.state = "CLOSED" def record_failure(self): """Record failed operation.""" import time self.failure_count += 1 self.last_failure_time = time.time() if self.failure_count >= self.failure_threshold: self.state = "OPEN" circuit_breaker = CircuitBreaker() async def circuit_breaker_stream(): for i in range(1, 30): try: # Check circuit breaker if not circuit_breaker.is_available(): yield { "data": f"Service unavailable (circuit breaker OPEN) - event {i}", "event": "circuit_open", } await asyncio.sleep(1) continue # Simulate service calls with random failures if random.random() < 0.3: # 30% failure rate circuit_breaker.record_failure() raise ConnectionError("Service call failed") # Success circuit_breaker.record_success() yield { "data": f"Service call {i} successful (circuit breaker: {circuit_breaker.state})", "id": str(i), "event": "success", } except Exception as e: yield { "data": f"Service error: {e} (failures: {circuit_breaker.failure_count})", "event": "service_error", } await asyncio.sleep(0.8) return EventSourceResponse(circuit_breaker_stream(), ping=5) # Test application app = Starlette( routes=[ Route("/error-recovery", error_recovery_endpoint), Route("/circuit-breaker", circuit_breaker_endpoint), ] ) if __name__ == "__main__": """ DEMONSTRATION STEPS: 1. Run server: python error_recovery.py 2. Test error recovery: curl -N http://localhost:8000/error-recovery 3. Test with resumption: curl -N -H "Last-Event-ID: 5" http://localhost:8000/error-recovery 4. Test circuit breaker: curl -N http://localhost:8000/circuit-breaker ERROR RECOVERY PATTERNS: 1. **Transient Errors**: Temporary issues that resolve themselves - Strategy: Retry with backoff - Examples: Network timeouts, temporary service unavailability 2. **Recoverable Errors**: Issues with workarounds available - Strategy: Use fallback data or alternative methods - Examples: Data format issues, missing optional data 3. **Fatal Errors**: Unrecoverable issues requiring stream termination - Strategy: Graceful shutdown with error notification - Examples: Authentication failures, critical system errors 4. **Circuit Breaker**: Prevent cascading failures - Strategy: Temporarily stop calling failing services - Benefits: System stability, faster failure detection PRODUCTION CONSIDERATIONS: - Implement client-side retry logic with exponential backoff - Use Last-Event-ID header for stream resumption - Monitor error rates and patterns - Set appropriate timeout values - Provide meaningful error messages to clients """ import uvicorn print("🚀 Starting error recovery demonstration server...") print("📋 Available endpoints:") print(" /error-recovery - Comprehensive error recovery patterns") print(" /circuit-breaker - Circuit breaker pattern demo") print("💡 Use Last-Event-ID header to test stream resumption") uvicorn.run(app, host="localhost", port=8000, log_level="info") python-sse-starlette-3.2.0/examples/02_message_broadcasting.py0000664000175000017500000001654415132704747024375 0ustar carstencarsten""" - Queue-based message broadcasting to multiple SSE clients - Clean Stream abstraction that implements async iterator protocol - Proper client connection/disconnection handling - REST API for sending messages to all connected clients Usage: python 02_message_broadcasting.py Test with curl: # Terminal 1: Subscribe to events (keep running) curl -N http://localhost:8000/events # Terminal 2: Send messages curl -X POST http://localhost:8000/send \ -H "Content-Type: application/json" \ -d '{"message": "Hello World"}' curl -X POST http://localhost:8000/send \ -H "Content-Type: application/json" \ -d '{"message": "Alert!", "event": "alert"}' # Multiple clients can subscribe for i in {1..3}; do curl -N http://localhost:8000/events & done """ import asyncio from typing import List, Optional from fastapi import FastAPI from pydantic import BaseModel from starlette.requests import Request from sse_starlette import EventSourceResponse, ServerSentEvent class BroadcastStream: """ Stream that connects a client to a broadcaster for receiving SSE events. This class implements the async iterator protocol (__aiter__/__anext__) which allows EventSourceResponse to consume it directly. """ def __init__(self, request: Request, broadcaster: "MessageBroadcaster"): self.request = request self.broadcaster = broadcaster self.queue: Optional[asyncio.Queue] = None self._registered = False def __aiter__(self) -> "BroadcastStream": """ Initialize the stream when EventSourceResponse starts consuming it. This is called once when the SSE connection begins. We register with the broadcaster here rather than in __init__ to ensure we only create the queue when actually needed. """ if not self._registered: self.queue = self.broadcaster.add_client() self._registered = True return self async def __anext__(self) -> ServerSentEvent: """ Get the next SSE event for this client. EventSourceResponse calls this repeatedly to get the stream of events. We check for client disconnection and clean up properly when needed. """ try: if await self.request.is_disconnected(): await self._cleanup() raise StopAsyncIteration # Wait for next message from broadcaster # This blocks until a message is broadcast to all clients message = await self.queue.get() return message except Exception: await self._cleanup() raise async def _cleanup(self): """ Explicit cleanup method to remove this client from broadcaster. """ if self._registered and self.queue: self.broadcaster.remove_client(self.queue) self._registered = False class MessageBroadcaster: """ Manages broadcasting messages to multiple connected SSE clients. Architecture: Each client gets their own asyncio.Queue. When broadcasting, we put the same message into all queues simultaneously. This provides: - Isolation: slow clients don't affect others - Simplicity: no complex pub/sub mechanism needed - Backpressure: individual queues can be managed independently """ def __init__(self): self._clients: List[asyncio.Queue] = [] def add_client(self) -> asyncio.Queue: """ Register a new client and return their dedicated message queue. """ client_queue = asyncio.Queue() self._clients.append(client_queue) return client_queue def remove_client(self, client_queue: asyncio.Queue) -> None: """ Remove a disconnected client's queue. Called when client disconnects or stream ends. This prevents memory leaks and ensures we don't try to send to dead connections. """ if client_queue in self._clients: self._clients.remove(client_queue) async def broadcast(self, message: str, event: Optional[str] = None) -> None: """ Send a message to ALL connected clients simultaneously. This creates one ServerSentEvent and puts it into every client's queue. Each client's BroadcastStream will then yield this event independently. Design choice: We use put_nowait() to avoid blocking if a client's queue is full. In production, you might want to handle QueueFull exceptions by either dropping the message or disconnecting slow clients. """ if not self._clients: return sse_event = ServerSentEvent(data=message, event=event) disconnected_clients = [] for client_queue in self._clients: try: client_queue.put_nowait(sse_event) except asyncio.QueueFull: # Mark client for removal if queue is full # This prevents slow clients from accumulating messages disconnected_clients.append(client_queue) for client_queue in disconnected_clients: self.remove_client(client_queue) def create_stream(self, request: Request) -> BroadcastStream: """ Factory method to create a new stream for a client. This provides a clean interface and ensures proper initialization of the stream with references to both the request and broadcaster. """ return BroadcastStream(request, self) @property def client_count(self) -> int: """Get number of currently connected clients.""" return len(self._clients) class MessageRequest(BaseModel): """Request body for the broadcast endpoint.""" message: str event: Optional[str] = None # Global broadcaster instance - shared across all requests # Design decision: Single global instance allows all clients to receive # the same messages. In a multi-instance deployment, you'd use Redis or # similar for message coordination. broadcaster = MessageBroadcaster() app = FastAPI() @app.get("/events") async def sse_endpoint(request: Request) -> EventSourceResponse: """ SSE endpoint where clients connect to receive broadcasted messages. The stream implements async iteration, so EventSourceResponse can consume it directly without additional wrapper logic. """ stream = broadcaster.create_stream(request) return EventSourceResponse(stream) @app.post("/send") async def send_message(message_request: MessageRequest): """ REST endpoint to broadcast a message to all connected SSE clients. """ await broadcaster.broadcast( message=message_request.message, event=message_request.event ) return { "status": "sent", "clients": broadcaster.client_count, "message": message_request.message, } @app.get("/status") async def get_status(): """Get current broadcaster status.""" return {"connected_clients": broadcaster.client_count} if __name__ == "__main__": import uvicorn print("SSE Broadcasting Server") print("Connect: curl -N http://localhost:8000/events") print( "Send msg: curl -X POST http://localhost:8000/send -H 'Content-Type: application/json' -d '{\"message\": \"Hello\"}'" ) print("Status: curl http://localhost:8000/status") uvicorn.run(app, host="127.0.0.1", port=8000) python-sse-starlette-3.2.0/examples/stream_generator.py0000664000175000017500000000440515132704747023262 0ustar carstencarstenimport asyncio from typing import Optional from fastapi import Depends, FastAPI from starlette import status from sse_starlette import EventSourceResponse, ServerSentEvent """ This example shows how to use a stream to push messages to a single client Remark: Lazy initialization of the queue for safe handling of initializing asyncio.Queue() outside of an async context (it calls asyncio.get_event_loop() internally). This is not an issue for python > 3.9 any more. Example Client Usage: # This command will stay connected and display all incoming messages curl -N http://127.0.0.1:8000/sse # In a separate terminal, send a message curl -X POST "http://127.0.0.1:8000/message?message=Hello%20World" -H "accept: application/json" # Send a message with quotes and spaces curl -X POST "http://127.0.0.1:8000/message?message=This%20is%20a%20test%20message" -H "accept: application/json" # Send a message with special characters curl -X POST "http://127.0.0.1:8000/message?message=Special%20chars:%20%21%40%23%24%25%5E%26%2A%28%29" -H "accept: application/json" # Send multiple messages in quick succession for i in {1..5}; do curl -X POST "http://127.0.0.1:8000/message?message=Message%20number%20$i" -H "accept: application/json" sleep 0.5 done """ class Stream: def __init__(self) -> None: self._queue: Optional[asyncio.Queue[ServerSentEvent]] = None @property def queue(self) -> asyncio.Queue[ServerSentEvent]: if self._queue is None: self._queue = asyncio.Queue[ServerSentEvent]() return self._queue def __aiter__(self) -> "Stream": return self async def __anext__(self) -> ServerSentEvent: return await self.queue.get() async def asend(self, value: ServerSentEvent) -> None: await self.queue.put(value) app = FastAPI() _stream = Stream() @app.get("/sse") async def sse(stream: Stream = Depends(lambda: _stream)) -> EventSourceResponse: return EventSourceResponse(stream) @app.post("/message", status_code=status.HTTP_201_CREATED) async def send_message(message: str, stream: Stream = Depends(lambda: _stream)) -> None: await stream.asend(ServerSentEvent(data=message)) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000, log_level="trace") python-sse-starlette-3.2.0/examples/demo_client.html0000664000175000017500000003036315132704747022521 0ustar carstencarsten SSE Client Example

Server-Sent Events (SSE) Client Example

Connection Control

Disconnected
0
Messages
0
Errors
0s
Connected Time

Send Message (for broadcasting examples)

Messages

python-sse-starlette-3.2.0/examples/issues/0000775000175000017500000000000015132704747020657 5ustar carstencarstenpython-sse-starlette-3.2.0/examples/issues/no_async_generators.py0000664000175000017500000000557215132704747025304 0ustar carstencarstenimport logging from functools import partial import anyio import trio import uvicorn from anyio.streams.memory import MemoryObjectSendStream from fastapi import FastAPI from starlette.requests import Request from sse_starlette.sse import EventSourceResponse _log = logging.getLogger(__name__) log_fmt = r"%(asctime)-15s %(levelname)s %(name)s %(funcName)s:%(lineno)d %(message)s" datefmt = "%Y-%m-%d %H:%M:%S" logging.basicConfig(format=log_fmt, level=logging.DEBUG, datefmt=datefmt) app = FastAPI() @app.get("/endless") async def endless(req: Request): """Simulates an endless stream In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. """ send_chan, recv_chan = anyio.create_memory_object_stream(10) async def event_publisher(inner_send_chan: MemoryObjectSendStream): async with inner_send_chan: try: i = 0 while True: i += 1 await inner_send_chan.send(dict(data=i)) await anyio.sleep(1.0) except anyio.get_cancelled_exc_class() as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") with anyio.move_on_after(1, shield=True): await inner_send_chan.send(dict(closing=True)) raise e return EventSourceResponse( recv_chan, data_sender_callable=partial(event_publisher, send_chan) ) @app.get("/endless-trio") async def endless_trio(req: Request): """Simulates an endless stream In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. """ raise Exception( "Trio is not compatible with uvicorn, this code is for example purposes" ) send_chan, recv_chan = trio.open_memory_channel(10) async def event_publisher(inner_send_chan: trio.MemorySendChannel): async with inner_send_chan: try: i = 0 while True: i += 1 await inner_send_chan.send(dict(data=i)) await trio.sleep(1.0) except trio.Cancelled as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") with anyio.move_on_after(1, shield=True): # This may not make it await inner_send_chan.send(dict(closing=True)) raise e return EventSourceResponse( recv_chan, data_sender_callable=partial(event_publisher, send_chan) ) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8080, log_level="trace", log_config=None) # type: ignore python-sse-starlette-3.2.0/examples/issues/issue152.py0000664000175000017500000000147715132704747022622 0ustar carstencarstenimport asyncio """ https://github.com/sysid/sse-starlette/issues/152 python examples/issues/issue152.py """ async def test_leak(): from sse_starlette.sse import _ensure_watcher_started_on_this_loop, AppStatus def count_watchers(): return sum( 1 for t in asyncio.all_tasks() if t.get_coro() and '_shutdown_watcher' in t.get_coro().__qualname__ ) print(f"Before: {count_watchers()} watchers") # Simulate 10 SSE connections async def trigger(): _ensure_watcher_started_on_this_loop() await asyncio.gather(*[asyncio.create_task(trigger()) for _ in range(10)]) await asyncio.sleep(0.5) print(f"After: {count_watchers()} watchers (expected: 1)") # Cleanup AppStatus.should_exit = True await asyncio.sleep(1) asyncio.run(test_leak()) python-sse-starlette-3.2.0/examples/issues/issue132.py0000664000175000017500000000265715132704747022621 0ustar carstencarstenimport asyncio import itertools from fastapi import FastAPI from fastapi.responses import HTMLResponse from sse_starlette.sse import EventSourceResponse """ https://github.com/sysid/sse-starlette/issues/132 # Run uvicorn $ uvicorn issue132:app # Open the app in a browser INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: 127.0.0.1:49184 - "GET /events HTTP/1.1" 200 OK # Press CTRL+C to stop the server ^CINFO: Shutting down INFO: Waiting for connections to close. (CTRL+C to force quit) """ app = FastAPI() @app.get("/") async def index() -> HTMLResponse: return HTMLResponse( """ SSE ASGI tests 0 """ ) @app.get("/events") async def event_source() -> EventSourceResponse: async def event_generator(): for x in itertools.count(): yield x await asyncio.sleep(1) return EventSourceResponse(event_generator(), media_type="text/event-stream") if __name__ == "__main__": import uvicorn uvicorn.main() # uvicorn.run(app, host="0.0.0.0", port=8000, log_level="info") python-sse-starlette-3.2.0/examples/issues/issue77.py0000664000175000017500000000312715132704747022542 0ustar carstencarsten################################################################################ # Load test # e.g. test for lock contention: https://github.com/sysid/sse-starlette/issues/77 # # to run it: # PYTHONPATH=. uvicorn examples.issue77:app # curl http://localhost:8000/stream | pv --line-mode --average-rate > /dev/null ################################################################################ import json import uvicorn from fastapi import FastAPI, Request from sse_starlette.sse import EventSourceResponse position = ( json.dumps( { "position_timestamp": "2023-09-19T11:25:35.286Z", "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0, # some more fields } ) + "\n" ) positions = [position] * 500 sse_clients = 0 app = FastAPI() @app.get("/stream") async def message_stream(request: Request): async def event_generator(): global sse_clients sse_clients += 1 print(f"{sse_clients} sse clients connected", flush=True) while True: # If client closes connection, stop sending events if await request.is_disconnected(): break for p in positions: # fixes socket.send() raised exception, but makes it very slow!! if await request.is_disconnected(): break yield p return EventSourceResponse(event_generator()) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="error", log_config=None) # type: ignore python-sse-starlette-3.2.0/examples/issues/issue132_fix.py0000664000175000017500000006030515132704747023461 0ustar carstencarsten#!/usr/bin/env python3 """ Comprehensive test application demonstrating the fix for issue #132. This application proves that the enhanced AppStatus implementation correctly handles shutdown signals with uvicorn 0.34+, replacing the broken monkey-patching approach with direct signal handler registration. Run with: python issue132_fix_demo.py Test with: Open http://localhost:8080 and press Ctrl+C to see graceful shutdown """ import asyncio import logging import signal import time from datetime import datetime from typing import AsyncGenerator, Dict, Any import uvicorn from fastapi import FastAPI from fastapi.responses import HTMLResponse from pydantic import BaseModel from starlette.middleware.cors import CORSMiddleware from starlette.requests import Request from sse_starlette import EventSourceResponse from sse_starlette.appstatus import AppStatus # Configure comprehensive logging logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)8s] %(name)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) logger = logging.getLogger("issue132_demo") # Global state for demonstration class DemoState: """Track demo state to show proper cleanup.""" active_streams: int = 0 total_events_sent: int = 0 startup_time: float = time.time() shutdown_initiated: bool = False cleanup_completed: bool = False demo_state = DemoState() class StreamStats(BaseModel): """Response model for stream statistics.""" active_streams: int total_events_sent: int uptime_seconds: float shutdown_initiated: bool def create_shutdown_callbacks() -> None: """Register shutdown callbacks to demonstrate the fix.""" def log_shutdown_initiation(): logger.info("🛑 Shutdown callback #1: Shutdown initiated") demo_state.shutdown_initiated = True def cleanup_resources(): logger.info("🧹 Shutdown callback #2: Cleaning up resources") # Simulate resource cleanup time.sleep(0.1) demo_state.cleanup_completed = True def final_shutdown_log(): logger.info("✅ Shutdown callback #3: Final cleanup complete") logger.info( f"📊 Final stats: {demo_state.active_streams} streams, " f"{demo_state.total_events_sent} events sent" ) # Register callbacks in order AppStatus.add_shutdown_callback(log_shutdown_initiation) AppStatus.add_shutdown_callback(cleanup_resources) AppStatus.add_shutdown_callback(final_shutdown_log) logger.info("📝 Registered 3 shutdown callbacks") async def demonstrate_signal_handling() -> AsyncGenerator[Dict, None]: """ Stream that demonstrates proper signal handling. This will terminate gracefully when SIGINT/SIGTERM is received. """ demo_state.active_streams += 1 event_count = 0 try: logger.info( f"🚀 Starting demo stream (active streams: {demo_state.active_streams})" ) while not AppStatus.should_exit: event_count += 1 demo_state.total_events_sent += 1 # Generate different types of events to show variety if event_count % 10 == 0: event_type = "milestone" message = f"Milestone reached: {event_count} events sent" elif event_count % 5 == 0: event_type = "status" message = f"Status update: {demo_state.active_streams} active streams" else: event_type = "data" message = ( f"Event #{event_count} at {datetime.now().strftime('%H:%M:%S')}" ) yield { "event": event_type, "data": { "message": message, "event_id": event_count, "timestamp": time.time(), "uptime": time.time() - demo_state.startup_time, "should_exit": AppStatus.should_exit, }, "id": str(event_count), } # Check for shutdown more frequently than sleep interval for _ in range(10): # Check 10 times per second if AppStatus.should_exit: logger.info( f"🔄 Stream {id(asyncio.current_task())} received shutdown signal" ) break await asyncio.sleep(0.1) except asyncio.CancelledError: logger.info(f"❌ Stream cancelled after {event_count} events") raise except Exception as e: logger.error(f"💥 Stream error after {event_count} events: {e}") raise finally: demo_state.active_streams -= 1 logger.info( f"🏁 Stream ended. Sent {event_count} events. " f"Active streams: {demo_state.active_streams}" ) async def health_monitoring_stream() -> AsyncGenerator[Dict, None]: """ Health monitoring stream to show multiple concurrent SSE endpoints. """ demo_state.active_streams += 1 check_count = 0 try: logger.info("🏥 Starting health monitoring stream") while not AppStatus.should_exit: check_count += 1 yield { "event": "health_check", "data": { "status": "healthy" if not AppStatus.should_exit else "shutting_down", "check_number": check_count, "active_streams": demo_state.active_streams, "total_events": demo_state.total_events_sent, "uptime": time.time() - demo_state.startup_time, "memory_info": "simulated_memory_stats", "app_status": { "should_exit": AppStatus.should_exit, "initialized": AppStatus._initialized, "callbacks_registered": len(AppStatus._shutdown_callbacks), }, }, "id": f"health_{check_count}", } # Health checks every 3 seconds, but check shutdown more frequently for _ in range(30): # 0.1s * 30 = 3s total, but responsive to shutdown if AppStatus.should_exit: break await asyncio.sleep(0.1) except asyncio.CancelledError: logger.info(f"🏥 Health monitoring cancelled after {check_count} checks") raise finally: demo_state.active_streams -= 1 logger.info(f"🏁 Health monitoring ended after {check_count} checks") # FastAPI Application Setup app = FastAPI( title="Issue #132 Fix Demonstration", description="Demonstrates the enhanced AppStatus signal handling fix", version="1.0.0", ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/", response_class=HTMLResponse) async def homepage() -> str: """Serve the test page.""" return """ Issue #132 Fix Demonstration

🔧 Issue #132 Fix Demonstration

Enhanced AppStatus with Direct Signal Handler Registration

uvicorn 0.34+ Compatible - No more monkey-patching!

🧪 How to Test the Fix

  1. Start Streams: Click the buttons below to start SSE streams
  2. Monitor Activity: Watch the real-time events and statistics
  3. Test Shutdown: Press Ctrl+C in the terminal
  4. Observe Cleanup: Notice graceful shutdown in terminal logs
  5. Verify Fix: No hanging processes or zombie connections

🎛️ Stream Controls

0
Active Streams
0
Total Events
0s
Uptime
Normal
Status

📡 Live Event Streams

Main Stream: Disconnected
Health Stream: Disconnected
""" @app.get("/events") async def main_event_stream(request: Request) -> EventSourceResponse: """Main SSE endpoint demonstrating the signal handling fix.""" logger.info(f"🔌 New main stream connection from {request.client}") return EventSourceResponse( demonstrate_signal_handling(), headers={ "X-Demo-Purpose": "issue-132-fix", "X-Connection-ID": str(id(request)), }, ping=15, # Ping every 15 seconds ) @app.get("/health") async def health_stream(request: Request) -> EventSourceResponse: """Health monitoring SSE endpoint.""" logger.info(f"🏥 New health monitoring connection from {request.client}") return EventSourceResponse( health_monitoring_stream(), headers={ "X-Stream-Type": "health-monitoring", "X-Connection-ID": str(id(request)), }, ping=30, # Less frequent pings for health monitoring ) @app.get("/stats") async def get_statistics() -> StreamStats: """Get current statistics to show in the UI.""" return StreamStats( active_streams=demo_state.active_streams, total_events_sent=demo_state.total_events_sent, uptime_seconds=time.time() - demo_state.startup_time, shutdown_initiated=demo_state.shutdown_initiated, ) @app.get("/test-signal") async def test_signal_handling() -> Dict[str, Any]: """ Test endpoint to programmatically trigger shutdown handling. This allows testing without sending actual signals. """ logger.info("🧪 Testing signal handling programmatically") # Simulate signal handling AppStatus.handle_exit(signal.SIGTERM, None) return { "message": "Signal handling test triggered", "should_exit": AppStatus.should_exit, "shutdown_callbacks_count": len(AppStatus._shutdown_callbacks), "app_status_initialized": AppStatus._initialized, } @app.on_event("startup") async def startup_event(): """Application startup handler.""" logger.info("🚀 Application startup") logger.info(f"📋 AppStatus initialized: {AppStatus._initialized}") logger.info(f"🔧 Signal handlers registered: {len(AppStatus._original_handlers)}") # Register our demonstration callbacks create_shutdown_callbacks() # Log the fix details logger.info("✅ Issue #132 Fix Active:") logger.info(" - Direct signal handler registration (no monkey-patching)") logger.info(" - Thread-safe shutdown handling") logger.info(" - Graceful SSE stream termination") logger.info(" - Compatible with uvicorn 0.34+") @app.on_event("shutdown") async def shutdown_event(): """Application shutdown handler.""" logger.info("🛑 Application shutdown initiated") if demo_state.cleanup_completed: logger.info("✅ Cleanup completed successfully") else: logger.warning("⚠️ Cleanup may not have completed") def main(): """Main entry point with comprehensive logging.""" print("=" * 80) print("🔧 ISSUE #132 FIX DEMONSTRATION") print("=" * 80) print() print("This application demonstrates the enhanced AppStatus implementation") print("that fixes the signal handling issue with uvicorn 0.34+") print() print("Key improvements:") print(" ✅ Direct signal handler registration (no monkey-patching)") print(" ✅ Thread-safe shutdown handling") print(" ✅ Graceful SSE stream termination") print(" ✅ Backward compatibility maintained") print() print("🧪 Test Instructions:") print(" 1. Open http://localhost:8080 in your browser") print(" 2. Start some SSE streams using the web interface") print(" 3. Press Ctrl+C in this terminal to test graceful shutdown") print(" 4. Observe clean termination and proper cleanup in logs") print() print("📊 Monitor the logs below for detailed shutdown behavior...") print("=" * 80) print() # Configure uvicorn for optimal demonstration config = uvicorn.Config( app=app, host="0.0.0.0", port=8080, log_level="info", access_log=True, reload=False, # Disable reload to see clean shutdown behavior workers=1, # Single worker for clear demonstration ) server = uvicorn.Server(config) try: server.run() except KeyboardInterrupt: logger.info("🛑 KeyboardInterrupt received - testing graceful shutdown") except Exception as e: logger.error(f"💥 Unexpected error: {e}") finally: # Verify fix worked if demo_state.shutdown_initiated and demo_state.cleanup_completed: print("\n" + "=" * 80) print("✅ SUCCESS: Issue #132 fix verified!") print(" - Shutdown callbacks executed") print(" - Resources cleaned up properly") print(" - No hanging processes") print("=" * 80) else: print("\n" + "=" * 80) print("❌ Issue #132 fix may have problems") print(f" - Shutdown initiated: {demo_state.shutdown_initiated}") print(f" - Cleanup completed: {demo_state.cleanup_completed}") print("=" * 80) if __name__ == "__main__": main() python-sse-starlette-3.2.0/examples/04_advanced_features.py0000664000175000017500000001462715132704747023676 0ustar carstencarsten""" Advanced SSE features example showing custom ping, error handling, and timeouts. This example demonstrates: - Custom ping messages and intervals - Error handling within streams - Send timeouts for hanging connections - Different line separators - Background tasks - Cache control headers for proxies Usage: python 04_advanced_features.py Test with curl: # Stream with custom ping (every 3 seconds) curl -N http://localhost:8000/custom-ping # Stream with error simulation curl -N http://localhost:8000/error-demo # Stream with send timeout protection curl -N http://localhost:8000/timeout-protected # Stream with custom separators (notice different line endings) curl -N http://localhost:8000/custom-separator # Stream with proxy-friendly caching headers curl -N http://localhost:8000/proxy-friendly """ import asyncio import logging from datetime import datetime, timezone from typing import AsyncGenerator import uvicorn from fastapi import FastAPI from starlette.background import BackgroundTask from starlette.middleware.cors import CORSMiddleware from starlette.requests import Request from sse_starlette import EventSourceResponse, ServerSentEvent logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = FastAPI(title="SSE Advanced Features") app.add_middleware( CORSMiddleware, allow_origins=["*"], # In production, specify actual origins allow_credentials=True, allow_methods=["GET", "POST", "OPTIONS"], allow_headers=["*"], ) def create_custom_ping() -> ServerSentEvent: """Create a custom ping message that's invisible to the client. Because it is sent as a comment. """ timestamp = datetime.now(timezone.utc).isoformat() return ServerSentEvent(comment=f"invisible ping at\r\n{timestamp}") async def stream_with_custom_ping() -> AsyncGenerator[dict, None]: """Stream data with custom ping configuration.""" for i in range(1, 11): yield { "data": f"Message {i} with custom (invisible) ping", "id": str(i), "event": "custom", } await asyncio.sleep(2) async def stream_with_error_handling(request: Request) -> AsyncGenerator[dict, None]: """Stream that demonstrates error handling within the generator. The error message can be processed on the client-side to handle the error gracefully. Note the use of return after yielding the error message. This will stop the generator from continuing after an error occurs. """ for i in range(1, 21): try: # Simulate random errors if i == 3: raise ValueError("Simulated processing error") elif i == 6: raise ConnectionError("Simulated connection issue") yield { "data": f"Successfully processed item {i}", "id": str(i), "event": "success", } await asyncio.sleep(0.8) except ValueError as e: logger.warning(f"Processing error: {e}") yield { "data": f"Error: {str(e)}. Continuing with next items...", "event": "error", } except ConnectionError as e: logger.error(f"Connection error: {e}") yield { "data": "Connection error occurred. Stream ending.", "event": "fatal_error", } return except Exception as e: # raise e logger.error(f"Unexpected error: {e}") yield {"data": "Unexpected error. Stream ending.", "event": "fatal_error"} async def stream_with_custom_separator() -> AsyncGenerator[dict, None]: """Stream demonstrating custom line separators.""" messages = [ "First line\nwith newlines\ninside", "Second message", "Third line\r\nwith CRLF", "Final message", ] for i, message in enumerate(messages, 1): yield {"data": message, "id": str(i), "event": "multiline"} await asyncio.sleep(1) def background_cleanup_task(): """Background task that runs after SSE stream completes.""" logger.info("Background cleanup task executed") @app.get("/custom-ping") async def custom_ping_endpoint() -> EventSourceResponse: """Endpoint with custom ping message and interval. This examples demonstrates how to use a comment as a ping instead of sending a dedicated event type 'ping'. """ return EventSourceResponse( stream_with_custom_ping(), ping=3, # Ping every 3 seconds ping_message_factory=create_custom_ping, ) @app.get("/error-demo") async def error_demo_endpoint(request: Request) -> EventSourceResponse: """Endpoint demonstrating error handling.""" return EventSourceResponse(stream_with_error_handling(request), ping=5) @app.get("/custom-separator") async def custom_separator_endpoint() -> EventSourceResponse: """Endpoint using custom line separators.""" return EventSourceResponse( stream_with_custom_separator(), sep="\n", # Use LF instead of CRLF ping=5, ) @app.get("/proxy-friendly") async def proxy_friendly_endpoint() -> EventSourceResponse: """Endpoint with headers optimized for proxy caching.""" return EventSourceResponse( stream_with_custom_ping(), headers={ "Cache-Control": "public, max-age=29", # Allow proxy caching "X-Custom-Header": "proxy-optimized", }, background=BackgroundTask(background_cleanup_task), ping=5, ) @app.get("/health") async def health_check() -> dict: """Health check endpoint.""" return { "status": "healthy", "timestamp": datetime.now(timezone.utc).isoformat(), "features": [ "custom_ping", "error_handling", "custom_separators", "proxy_friendly", ], } if __name__ == "__main__": print("Starting SSE advanced features server...") print("Available endpoints:") print(" - GET http://localhost:8000/custom-ping (custom ping every 3s)") print(" - GET http://localhost:8000/error-demo (error handling demo)") print(" - GET http://localhost:8000/custom-separator (custom line separators)") print(" - GET http://localhost:8000/proxy-friendly (proxy-optimized headers)") print(" - GET http://localhost:8000/health (health check)") uvicorn.run(app, host="0.0.0.0", port=8000, log_level="info") python-sse-starlette-3.2.0/examples/example.py0000664000175000017500000001315715132704747021360 0ustar carstencarsten""" Minimal Server-Sent Events (SSE) example demonstrating core concepts. This example shows the essential SSE patterns: - Simple event streaming with automatic termination - Endless event streaming with proper cleanup - HTML client with JavaScript EventSource - Both finite and infinite stream patterns For more advanced features, see the examples/ directory. Usage: python example.py Then visit: http://localhost:8000 """ import asyncio import uvicorn from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import HTMLResponse from starlette.routing import Route from sse_starlette import EventSourceResponse HTML_CLIENT = """ SSE Example

Server-Sent Events Example

Finite Stream (numbers 1-5)

Click start to begin...

Endless Stream

Click start to begin...
""" async def finite_number_stream(): """ Demonstrates finite SSE stream that automatically terminates. This is the simplest SSE pattern - stream a fixed set of data and let the connection close naturally when the generator ends. """ for number in range(1, 6): # Numbers 1 through 5 # Each yield sends one SSE event to the client # The dict format automatically creates: data: {number} yield {"data": number} await asyncio.sleep(1) # 1 second between events async def endless_counter_stream(request: Request): """ Demonstrates endless SSE stream with proper cleanup. Key concepts: - Infinite loop for continuous streaming - Client disconnect detection via request.is_disconnected() - Exception handling for graceful cleanup - asyncio.CancelledError for proper resource cleanup """ counter = 0 try: while True: counter += 1 yield {"data": counter} await asyncio.sleep(0.5) # 500ms between events except asyncio.CancelledError: # This exception is raised when: # 1. Client closes the browser/tab # 2. Client calls eventSource.close() # 3. Server is shutting down # # Always re-raise CancelledError to ensure proper cleanup raise # Starlette route handlers async def home_page(request: Request) -> HTMLResponse: """Serve the HTML demo page.""" return HTMLResponse(HTML_CLIENT) async def numbers_endpoint(request: Request) -> EventSourceResponse: """SSE endpoint for finite number stream.""" return EventSourceResponse(finite_number_stream()) async def endless_endpoint(request: Request) -> EventSourceResponse: """SSE endpoint for endless counter stream.""" return EventSourceResponse(endless_counter_stream(request)) # Application setup app = Starlette( routes=[ Route("/", endpoint=home_page), Route("/numbers", endpoint=numbers_endpoint), Route("/endless", endpoint=endless_endpoint), ] ) if __name__ == "__main__": print("Starting SSE example server...") print("Visit: http://localhost:8000") print("\nEndpoints:") print(" / - Demo page with JavaScript client") print(" /numbers - Finite stream (1-5)") print(" /endless - Infinite counter stream") uvicorn.run(app, host="0.0.0.0", port=8000) python-sse-starlette-3.2.0/examples/example.db0000664000175000017500000003000015132704747021277 0ustar carstencarstenSQLite format 3@ .zp  : P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)CetabletaskstasksCREATE TABLE tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, description TEXT, completed BOOLEAN DEFAULT FALSE ) g723A Monitor performanceSet up logging and metrics.57Deploy to productionSet up CI/CD pipeline/#KWrite testsAdd comprehensive test coverage7'W Build SSE appCreate server-sent events application-'CLearn FastAPIStudy FastAPI documentation  taskspython-sse-starlette-3.2.0/pyproject.toml0000664000175000017500000000751115132704747020446 0ustar carstencarsten[project] name = "sse-starlette" version = "3.2.0" description = "SSE plugin for Starlette" readme = "README.md" license = "BSD-3-Clause" requires-python = ">=3.9" authors = [ { name = "sysid", email = "sysid@gmx.de" }, ] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Internet :: WWW/HTTP", ] dependencies = [ "starlette>=0.49.1", "anyio>=4.7.0", ] [project.optional-dependencies] examples = [ "uvicorn>=0.34.0", "fastapi>=0.115.12", "sqlalchemy[asyncio]>=2.0.41", "aiosqlite>=0.21.0", ] uvicorn = [ "uvicorn>=0.34.0", ] granian = [ "granian>=2.3.1", ] daphne = [ "daphne>=4.2.0", ] [dependency-groups] # new standard, included by default dev = [ "asgi-lifespan>=2.1.0", "async-timeout>=5.0.1", "httpx>=0.28.1", "mypy>=1.14.0", "portend>=3.2.0", "psutil>=6.1.1", "pytest>=8.3.4", "pytest-asyncio>=0.25.0", "pytest-cov>=6.0.0", "ruff>=0.8.4", "starlette>=0.49.1", "tenacity>=9.0.0", "testcontainers>=4.9.0", "uvicorn>=0.34.0", "build>=1.2.2.post1", "pre-commit>=4.0.0", ] [project.urls] Source = "https://github.com/sysid/sse-starlette" [build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] include = ["sse_starlette*"] [tool.bumpversion] current_version = "3.2.0" commit = true tag = false message = "Bump version to {new_version}" [tool.bumpversion.file_patterns] "sse_starlette/__init__.py" = [ {search = "__version__ = '{current_version}'", replace = "__version__ = '{new_version}'"}, ] "VERSION" = [ {search = "{current_version}", replace = "{new_version}"}, ] "pyproject.toml" = [ {search = "version = {current_version}", replace = "version = {new_version}"}, ] [[tool.bumpversion.files]] filename = "VERSION" [[tool.bumpversion.files]] filename = "pyproject.toml" [[tool.bumpversion.files]] filename = "sse_starlette/__init__.py" [tool.pytest.ini_options] markers = [ "integration: marks tests as integration tests", "experimentation: marks tests as experimental tests, not to be run in CICD" ] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" filterwarnings = [ # testcontainers internal deprecation warning (triggered at import time by their own code) "ignore:The @wait_container_is_ready decorator is deprecated:DeprecationWarning", ] #addopts = "--cov=my_package --cov-report=term-missing" [tool.mypy] ignore_missing_imports = false namespace_packages = true [tool.coverage.run] source = ["sse_starlette"] omit = [ "tests/*", "**/__main__.py", "**/.venv/*", "**/site-packages/*", ] branch = true [tool.coverage.report] show_missing = true skip_covered = true fail_under = 85 [tool.ruff] exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".ipynb_checkpoints", ".mypy_cache", ".nox", ".pants.d", ".pyenv", ".pytest_cache", ".pytype", ".ruff_cache", ".svn", ".venv", ".vscode", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "site-packages", "venv", ] line-length = 88 indent-width = 4 target-version = "py312" [tool.ruff.lint] select = ["E4", "E7", "E9", "F"] ignore = [] fixable = ["ALL"] unfixable = [] dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" python-sse-starlette-3.2.0/scripts/0000775000175000017500000000000015132704747017215 5ustar carstencarstenpython-sse-starlette-3.2.0/scripts/lint0000775000175000017500000000043615132704747020114 0ustar carstencarsten#!/bin/sh -e export PACKAGE=sentry_asgi export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi set -x ${PREFIX}black $PACKAGE tests ${PREFIX}isort --multi-line=3 --trailing-comma --force-grid-wrap=0 --combine-as --line-width 88 --recursive --apply $PACKAGE tests python-sse-starlette-3.2.0/scripts/publish0000775000175000017500000000125615132704747020615 0ustar carstencarsten#!/bin/sh -e export VERSION=`cat sse_starlette/__init__.py | grep __version__ | sed "s/__version__ = //" | sed "s/'//g"` export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi if ! command -v "${PREFIX}twine" &>/dev/null ; then echo "Unable to find the 'twine' command." echo "Install from PyPI, using '${PREFIX}pip install twine'." exit 1 fi find sse_starlette -type f -name "*.py[co]" -delete find sse_starlette -type d -name __pycache__ -delete ${PREFIX}python setup.py sdist ${PREFIX}twine upload dist/* echo "You probably want to also tag the version now:" echo "git tag -a ${VERSION} -m 'version ${VERSION}'" echo "git push --tags" rm -r dist python-sse-starlette-3.2.0/scripts/README.md0000664000175000017500000000041215132704747020471 0ustar carstencarsten# Development Scripts * `scripts/test` - Run the test suite. * `scripts/lint` - Run the code linting. * `scripts/publish` - Publish the latest version to PyPI. Styled after GitHub's ["Scripts to Rule Them All"](https://github.com/github/scripts-to-rule-them-all). python-sse-starlette-3.2.0/scripts/test0000775000175000017500000000060715132704747020125 0ustar carstencarsten#!/bin/sh -e export PACKAGE="sse_starlette" export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi set -x PYTHONPATH=. ${PREFIX}pytest --ignore venv --cov=$PACKAGE --cov=tests --cov-report=term-missing ${@} ${PREFIX}black $PACKAGE tests --check ${PREFIX}isort --multi-line=3 --trailing-comma --force-grid-wrap=0 --combine-as --line-width 88 --check-only $PACKAGE tests python-sse-starlette-3.2.0/.run/0000775000175000017500000000000015132704747016410 5ustar carstencarstenpython-sse-starlette-3.2.0/.run/example.run.xml0000664000175000017500000000216115132704747021370 0ustar carstencarsten python-sse-starlette-3.2.0/.run/example_fastapi.run.xml0000664000175000017500000000220115132704747023072 0ustar carstencarsten python-sse-starlette-3.2.0/Makefile0000664000175000017500000001320515132704747017167 0ustar carstencarsten.DEFAULT_GOAL := help # You can set these variables from the command line, and also from the environment for the first two. SOURCEDIR = source BUILDDIR = build MAKE = make VERSION = $(shell cat VERSION) PACKAGE_NAME = sse-starlette app_root := $(if $(PROJ_DIR),$(PROJ_DIR),$(CURDIR)) pkg_src = $(app_root)/sse_starlette tests_src = $(app_root)/tests .PHONY: all all: clean build publish ## Build and publish @echo "--------------------------------------------------------------------------------" @echo "-M- building and distributing" @echo "--------------------------------------------------------------------------------" ################################################################################ # Development \ DEVELOP: ## ############################################################ build-docker: ## build docker image @echo "building docker image" docker build --platform linux/amd64 --progress=plain -t sse_starlette . #docker tag $(IMAGE_NAME) 339712820866.dkr.ecr.eu-central-1.amazonaws.com/sse-starlette/sse-starlette:latest ################################################################################ # Building, Deploying \ BUILDING: ## ############################################################ .PHONY: build build: clean format ## format and build @echo "building" python -m build .PHONY: publish publish: ## publish @echo "upload to Pypi" twine upload --verbose dist/* .PHONY: bump-major bump-major: check-github-token ## bump-major, tag and push bump-my-version bump --commit --tag major git push git push --tags @$(MAKE) create-release .PHONY: bump-minor bump-minor: check-github-token ## bump-minor, tag and push bump-my-version bump --commit --tag minor git push git push --tags @$(MAKE) create-release .PHONY: bump-patch bump-patch: check-github-token ## bump-patch, tag and push bump-my-version bump --commit --tag patch git push git push --tags @$(MAKE) create-release .PHONY: create-release create-release: check-github-token ## create a release on GitHub via the gh cli @if ! command -v gh &>/dev/null; then \ echo "You do not have the GitHub CLI (gh) installed. Please create the release manually."; \ exit 1; \ else \ echo "Creating GitHub release for v$(VERSION)"; \ gh release create "v$(VERSION)" --generate-notes; \ fi .PHONY: check-github-token check-github-token: ## Check if GITHUB_TOKEN is set @if [ -z "$$GITHUB_TOKEN" ]; then \ echo "GITHUB_TOKEN is not set. Please export your GitHub token before running this command."; \ exit 1; \ fi @echo "GITHUB_TOKEN is set" ################################################################################ # Testing \ TESTING: ## ############################################################ .PHONY: test test: test-unit test-docker ## run tests #python -m pytest -ra --junitxml=report.xml --cov-config=pyproject.toml --cov-report=xml --cov-report term --cov=$(pkg_src) tests/ #RUN_ENV=local python -m pytest -m "not (experimentation)" --cov-config=pyproject.toml --cov-report=html --cov-report=term --cov=$(pkg_src) tests : .PHONY: test-unit test-unit: ## run all tests except "integration" marked RUN_ENV=local python -m pytest -m "not (integration or experimentation)" --cov-config=pyproject.toml --cov-report=html --cov-report=term --cov=$(pkg_src) tests .PHONY: test-docker test-docker: ## test-docker (docker desktop: advanced settings) @if [ -S /var/run/docker.sock > /dev/null 2>&1 ]; then \ echo "Running docker tests because /var/run/docker.docker exists..."; \ RUN_ENV=local python -m pytest -m "integration" tests; \ else \ echo "Skipping tests: /var/run/docker.sock does not exist."; \ fi ################################################################################ # Code Quality \ QUALITY: ## ############################################################ .PHONY: format format: ## perform ruff formatting @ruff format $(pkg_src) $(tests_src) .PHONY: format-check format-check: ## perform black formatting @ruff format --check $(pkg_src) $(tests_src) .PHONY: style style: format ## perform code style format .PHONY: lint lint: ## check style with ruff ruff check $(pkg_src) $(tests_src) .PHONY: mypy mypy: ## check type hint annotations @mypy --config-file pyproject.toml --install-types --non-interactive $(pkg_src) .PHONY: pre-commit-install pre-commit-install: ## install pre-commit hooks pre-commit install ################################################################################ # Clean \ CLEAN: ## ############################################################ .PHONY: clean clean: clean-build clean-pyc ## remove all build, test, coverage and Python artifacts .PHONY: clean-build clean-build: ## remove build artifacts rm -fr build/ rm -fr dist/ rm -fr .eggs/ find . \( -path ./env -o -path ./venv -o -path ./.env -o -path ./.venv \) -prune -o -name '*.egg-info' -exec rm -fr {} + find . \( -path ./env -o -path ./venv -o -path ./.env -o -path ./.venv \) -prune -o -name '*.egg' -exec rm -f {} + .PHONY: clean-pyc clean-pyc: ## remove Python file artifacts find . -name '*.pyc' -exec rm -f {} + find . -name '*.pyo' -exec rm -f {} + find . -name '*~' -exec rm -f {} + find . -name '__pycache__' -exec rm -fr {} + ################################################################################ # Misc \ MISC: ## ############################################################ define PRINT_HELP_PYSCRIPT import re, sys for line in sys.stdin: match = re.match(r'^([a-zA-Z0-9_-]+):.*?## (.*)$$', line) if match: target, help = match.groups() print("\033[36m%-20s\033[0m %s" % (target, help)) endef export PRINT_HELP_PYSCRIPT .PHONY: help help: @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) python-sse-starlette-3.2.0/sse_starlette/0000775000175000017500000000000015132704747020407 5ustar carstencarstenpython-sse-starlette-3.2.0/sse_starlette/__init__.py0000664000175000017500000000033215132704747022516 0ustar carstencarstenfrom sse_starlette.event import ServerSentEvent, JSONServerSentEvent from sse_starlette.sse import EventSourceResponse __all__ = ["EventSourceResponse", "ServerSentEvent", "JSONServerSentEvent"] __version__ = "3.2.0" python-sse-starlette-3.2.0/sse_starlette/py.typed0000664000175000017500000000000015132704747022074 0ustar carstencarstenpython-sse-starlette-3.2.0/sse_starlette/event.py0000664000175000017500000000533415132704747022107 0ustar carstencarstenimport io import re import json from typing import Optional, Any, Union class ServerSentEvent: """ Helper class to format data for Server-Sent Events (SSE). """ _LINE_SEP_EXPR = re.compile(r"\r\n|\r|\n") DEFAULT_SEPARATOR = "\r\n" def __init__( self, data: Optional[Any] = None, *, event: Optional[str] = None, id: Optional[str] = None, retry: Optional[int] = None, comment: Optional[str] = None, sep: Optional[str] = None, ) -> None: self.data = data self.event = event self.id = id self.retry = retry self.comment = comment self._sep = sep if sep is not None else self.DEFAULT_SEPARATOR def encode(self) -> bytes: buffer = io.StringIO() if self.comment is not None: for chunk in self._LINE_SEP_EXPR.split(str(self.comment)): buffer.write(f": {chunk}{self._sep}") if self.id is not None: # Clean newlines in the event id buffer.write("id: " + self._LINE_SEP_EXPR.sub("", self.id) + self._sep) if self.event is not None: # Clean newlines in the event name buffer.write( "event: " + self._LINE_SEP_EXPR.sub("", self.event) + self._sep ) if self.data is not None: # Break multi-line data into multiple data: lines for chunk in self._LINE_SEP_EXPR.split(str(self.data)): buffer.write(f"data: {chunk}{self._sep}") if self.retry is not None: if not isinstance(self.retry, int): raise TypeError("retry argument must be int") buffer.write(f"retry: {self.retry}{self._sep}") buffer.write(self._sep) return buffer.getvalue().encode("utf-8") class JSONServerSentEvent(ServerSentEvent): """ Helper class to format JSON data for Server-Sent Events (SSE). """ def __init__( self, data: Optional[Any] = None, *args, **kwargs, ) -> None: super().__init__( json.dumps( data, ensure_ascii=False, allow_nan=False, indent=None, separators=(",", ":"), ) if data is not None else None, *args, **kwargs, ) def ensure_bytes(data: Union[bytes, dict, ServerSentEvent, Any], sep: str) -> bytes: if isinstance(data, bytes): return data if isinstance(data, ServerSentEvent): return data.encode() if isinstance(data, dict): data["sep"] = sep return ServerSentEvent(**data).encode() return ServerSentEvent(str(data), sep=sep).encode() python-sse-starlette-3.2.0/sse_starlette/sse.py0000664000175000017500000003230715132704747021560 0ustar carstencarstenimport asyncio import logging import signal import threading from dataclasses import dataclass, field from datetime import datetime, timezone from typing import ( Any, AsyncIterable, Awaitable, Callable, Coroutine, Iterator, Mapping, Optional, Set, Union, ) import anyio from starlette.background import BackgroundTask from starlette.concurrency import iterate_in_threadpool from starlette.datastructures import MutableHeaders from starlette.responses import Response from starlette.types import Receive, Scope, Send, Message from sse_starlette.event import ServerSentEvent, ensure_bytes logger = logging.getLogger(__name__) @dataclass class _ShutdownState: """Per-thread state for shutdown coordination. Issue #152 fix: Uses threading.local() instead of ContextVar to ensure one watcher per thread rather than one per async context. """ events: Set[anyio.Event] = field(default_factory=set) watcher_started: bool = False # Each thread gets its own shutdown state (one event loop per thread typically) _thread_state = threading.local() def _get_shutdown_state() -> _ShutdownState: """Get or create shutdown state for the current thread.""" state = getattr(_thread_state, "shutdown_state", None) if state is None: state = _ShutdownState() _thread_state.shutdown_state = state return state def _get_uvicorn_server(): """ Try to get uvicorn Server instance via signal handler introspection. When uvicorn registers signal handlers, they're bound methods on the Server instance. We can retrieve the Server from the handler's __self__ attribute. Returns None if: - Not running under uvicorn - Signal handler isn't a bound method - Any introspection fails """ try: handler = signal.getsignal(signal.SIGTERM) if hasattr(handler, "__self__"): server = handler.__self__ if hasattr(server, "should_exit"): return server except Exception: pass return None async def _shutdown_watcher() -> None: """ Poll for shutdown and broadcast to all events in this context. One watcher runs per thread (event loop). Checks two shutdown sources: 1. AppStatus.should_exit - set when our monkey-patch works 2. uvicorn Server.should_exit - via signal handler introspection (Issue #132 fix) When either becomes True, signals all registered events. """ state = _get_shutdown_state() uvicorn_server = _get_uvicorn_server() try: while True: # Check our flag (monkey-patch worked or manually set) if AppStatus.should_exit: break # Check uvicorn's flag directly (monkey-patch failed - Issue #132) if ( AppStatus.enable_automatic_graceful_drain and uvicorn_server is not None and uvicorn_server.should_exit ): AppStatus.should_exit = True # Sync state for consistency break await anyio.sleep(0.5) # Shutdown detected - broadcast to all waiting events for event in list(state.events): event.set() finally: # Allow watcher to be restarted if loop is reused state.watcher_started = False def _ensure_watcher_started_on_this_loop() -> None: """Ensure the shutdown watcher is running for this thread (event loop).""" state = _get_shutdown_state() if not state.watcher_started: state.watcher_started = True try: loop = asyncio.get_running_loop() loop.create_task(_shutdown_watcher()) except RuntimeError: # No running loop - shouldn't happen in normal use state.watcher_started = False class SendTimeoutError(TimeoutError): pass class AppStatus: """Helper to capture a shutdown signal from Uvicorn so we can gracefully terminate SSE streams.""" should_exit = False enable_automatic_graceful_drain = True original_handler: Optional[Callable] = None @staticmethod def disable_automatic_graceful_drain(): """ Prevent automatic SSE stream termination on server shutdown. WARNING: When disabled, you MUST set AppStatus.should_exit = True at some point during shutdown, or streams will never close and the server will hang indefinitely (or until uvicorn's graceful shutdown timeout expires). """ AppStatus.enable_automatic_graceful_drain = False @staticmethod def enable_automatic_graceful_drain_mode(): """ Re-enable automatic SSE stream termination on server shutdown. This restores the default behavior where SIGTERM triggers immediate stream draining. Call this to undo a previous call to disable_automatic_graceful_drain(). """ AppStatus.enable_automatic_graceful_drain = True @staticmethod def handle_exit(*args, **kwargs): if AppStatus.enable_automatic_graceful_drain: AppStatus.should_exit = True if AppStatus.original_handler is not None: AppStatus.original_handler(*args, **kwargs) try: from uvicorn.main import Server AppStatus.original_handler = Server.handle_exit Server.handle_exit = AppStatus.handle_exit # type: ignore except ImportError: logger.debug( "Uvicorn not installed. Graceful shutdown on server termination disabled." ) Content = Union[str, bytes, dict, ServerSentEvent, Any] SyncContentStream = Iterator[Content] AsyncContentStream = AsyncIterable[Content] ContentStream = Union[AsyncContentStream, SyncContentStream] class EventSourceResponse(Response): """ Streaming response that sends data conforming to the SSE (Server-Sent Events) specification. """ DEFAULT_PING_INTERVAL = 15 DEFAULT_SEPARATOR = "\r\n" def __init__( self, content: ContentStream, status_code: int = 200, headers: Optional[Mapping[str, str]] = None, media_type: str = "text/event-stream", background: Optional[BackgroundTask] = None, ping: Optional[int] = None, sep: Optional[str] = None, ping_message_factory: Optional[Callable[[], ServerSentEvent]] = None, data_sender_callable: Optional[ Callable[[], Coroutine[None, None, None]] ] = None, send_timeout: Optional[float] = None, client_close_handler_callable: Optional[ Callable[[Message], Awaitable[None]] ] = None, ) -> None: # Validate separator if sep not in (None, "\r\n", "\r", "\n"): raise ValueError(f"sep must be one of: \\r\\n, \\r, \\n, got: {sep}") self.sep = sep or self.DEFAULT_SEPARATOR # If content is sync, wrap it for async iteration if isinstance(content, AsyncIterable): self.body_iterator = content else: self.body_iterator = iterate_in_threadpool(content) self.status_code = status_code self.media_type = self.media_type if media_type is None else media_type self.background = background self.data_sender_callable = data_sender_callable self.send_timeout = send_timeout # Build SSE-specific headers. _headers = MutableHeaders() if headers is not None: # pragma: no cover _headers.update(headers) # "The no-store response directive indicates that any caches of any kind (private or shared) # should not store this response." # -- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control # allow cache control header to be set by user to support fan out proxies # https://www.fastly.com/blog/server-sent-events-fastly _headers.setdefault("Cache-Control", "no-store") # mandatory for servers-sent events headers _headers["Connection"] = "keep-alive" _headers["X-Accel-Buffering"] = "no" self.init_headers(_headers) self.ping_interval = self.DEFAULT_PING_INTERVAL if ping is None else ping self.ping_message_factory = ping_message_factory self.client_close_handler_callable = client_close_handler_callable self.active = True # https://github.com/sysid/sse-starlette/pull/55#issuecomment-1732374113 self._send_lock = anyio.Lock() @property def ping_interval(self) -> Union[int, float]: return self._ping_interval @ping_interval.setter def ping_interval(self, value: Union[int, float]) -> None: if not isinstance(value, (int, float)): raise TypeError("ping interval must be int") if value < 0: raise ValueError("ping interval must be greater than 0") self._ping_interval = value def enable_compression(self, force: bool = False) -> None: raise NotImplementedError("Compression is not supported for SSE streams.") async def _stream_response(self, send: Send) -> None: """Send out SSE data to the client as it becomes available in the iterator.""" await send( { "type": "http.response.start", "status": self.status_code, "headers": self.raw_headers, } ) async for data in self.body_iterator: chunk = ensure_bytes(data, self.sep) logger.debug("chunk: %s", chunk) with anyio.move_on_after(self.send_timeout) as cancel_scope: await send( {"type": "http.response.body", "body": chunk, "more_body": True} ) if cancel_scope and cancel_scope.cancel_called: if hasattr(self.body_iterator, "aclose"): await self.body_iterator.aclose() raise SendTimeoutError() async with self._send_lock: self.active = False await send({"type": "http.response.body", "body": b"", "more_body": False}) async def _listen_for_disconnect(self, receive: Receive) -> None: """Watch for a disconnect message from the client.""" while self.active: message = await receive() if message["type"] == "http.disconnect": self.active = False logger.debug("Got event: http.disconnect. Stop streaming.") if self.client_close_handler_callable: await self.client_close_handler_callable(message) break @staticmethod async def _listen_for_exit_signal() -> None: """Wait for shutdown signal via the shared watcher.""" if AppStatus.should_exit: return _ensure_watcher_started_on_this_loop() state = _get_shutdown_state() event = anyio.Event() state.events.add(event) try: # Double-check after registration if AppStatus.should_exit: return await event.wait() finally: state.events.discard(event) async def _ping(self, send: Send) -> None: """Periodically send ping messages to keep the connection alive on proxies. - frequenccy ca every 15 seconds. - Alternatively one can send periodically a comment line (one starting with a ':' character) """ while self.active: await anyio.sleep(self._ping_interval) sse_ping = ( self.ping_message_factory() if self.ping_message_factory else ServerSentEvent( comment=f"ping - {datetime.now(timezone.utc)}", sep=self.sep ) ) ping_bytes = ensure_bytes(sse_ping, self.sep) logger.debug("ping: %s", ping_bytes) async with self._send_lock: if self.active: await send( { "type": "http.response.body", "body": ping_bytes, "more_body": True, } ) async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: """Entrypoint for Starlette's ASGI contract. We spin up tasks: - _stream_response to push events - _ping to keep the connection alive - _listen_for_exit_signal to respond to server shutdown - _listen_for_disconnect to respond to client disconnect """ async with anyio.create_task_group() as task_group: # https://trio.readthedocs.io/en/latest/reference-core.html#custom-supervisors async def cancel_on_finish(coro: Callable[[], Awaitable[None]]): await coro() task_group.cancel_scope.cancel() task_group.start_soon(cancel_on_finish, lambda: self._stream_response(send)) task_group.start_soon(cancel_on_finish, lambda: self._ping(send)) task_group.start_soon(cancel_on_finish, self._listen_for_exit_signal) if self.data_sender_callable: task_group.start_soon(self.data_sender_callable) # Wait for the client to disconnect last task_group.start_soon( cancel_on_finish, lambda: self._listen_for_disconnect(receive) ) if self.background is not None: await self.background() python-sse-starlette-3.2.0/Dockerfile0000664000175000017500000000166715132704747017532 0ustar carstencarsten# Use Python 3.12 slim as base image FROM python:3.12-slim # Set working directory WORKDIR /app # Install build dependencies and cleanup in one layer to keep image size down RUN apt-get update && apt-get install -y \ build-essential \ && rm -rf /var/lib/apt/lists/* # Copy only pyproject.toml and other build files first COPY pyproject.toml ./ COPY README.md ./ COPY sse_starlette ./sse_starlette # Install package with all dependencies RUN pip install --no-cache-dir -e . # Install additional test dependencies if needed # You can also add these to pyproject.toml in [project.optional-dependencies] RUN pip install --no-cache-dir pytest pytest-asyncio httpx uvicorn # Copy test files COPY tests ./tests # Expose port EXPOSE 8000 # Set Python path ENV PYTHONPATH=/app # Default command - this can be overridden by testcontainers CMD ["uvicorn", "tests.integration.main_endless_conditional:app", "--host", "0.0.0.0", "--port", "8000"] python-sse-starlette-3.2.0/readme_uvicorn.md0000664000175000017500000000011415132704747021046 0ustar carstencarsten# Fix Breaking: https://github.com/encode/uvicorn/compare/0.28.1...0.29.0 python-sse-starlette-3.2.0/uv.lock0000664000175000017500000216106215132704747017042 0ustar carstencarstenversion = 1 revision = 2 requires-python = ">=3.9" resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] [[package]] name = "aiosqlite" version = "0.22.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3a/0d/449c024bdabd0678ae07d804e60ed3b9786facd3add66f51eee67a0fccea/aiosqlite-0.22.0.tar.gz", hash = "sha256:7e9e52d72b319fcdeac727668975056c49720c995176dc57370935e5ba162bb9", size = 14707, upload_time = "2025-12-13T18:32:45.762Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ef/39/b2181148075272edfbbd6d87e6cd78cc71dca243446fa3b381fd4116950b/aiosqlite-0.22.0-py3-none-any.whl", hash = "sha256:96007fac2ce70eda3ca1bba7a3008c435258a592b8fbf2ee3eeaa36d33971a09", size = 17263, upload_time = "2025-12-13T18:32:44.619Z" }, ] [[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.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0", size = 228266, upload_time = "2025-11-28T23:37:38.911Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb", size = 113362, upload_time = "2025-11-28T23:36:57.897Z" }, ] [[package]] name = "asgi-lifespan" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sniffio" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6a/da/e7908b54e0f8043725a990bf625f2041ecf6bfe8eb7b19407f1c00b630f7/asgi-lifespan-2.1.0.tar.gz", hash = "sha256:5e2effaf0bfe39829cf2d64e7ecc47c7d86d676a6599f7afba378c31f5e3a308", size = 15627, upload_time = "2023-03-28T17:35:49.126Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2f/f5/c36551e93acba41a59939ae6a0fb77ddb3f2e8e8caa716410c65f7341f72/asgi_lifespan-2.1.0-py3-none-any.whl", hash = "sha256:ed840706680e28428c01e14afb3875d7d76d3206f3d5b2f2294e059b5c23804f", size = 10895, upload_time = "2023-03-28T17:35:47.772Z" }, ] [[package]] name = "asgiref" version = "3.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", hash = "sha256:13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4", size = 37969, upload_time = "2025-11-19T15:32:20.106Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", hash = "sha256:1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d", size = 24096, upload_time = "2025-11-19T15:32:19.004Z" }, ] [[package]] name = "async-timeout" version = "5.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload_time = "2024-11-06T16:41:39.6Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload_time = "2024-11-06T16:41:37.9Z" }, ] [[package]] name = "attrs" version = "25.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload_time = "2025-10-06T13:54:44.725Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload_time = "2025-10-06T13:54:43.17Z" }, ] [[package]] name = "autobahn" version = "24.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version == '3.10.*'", "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] dependencies = [ { name = "cryptography", marker = "python_full_version < '3.11'" }, { name = "hyperlink", marker = "python_full_version < '3.11'" }, { name = "setuptools", marker = "python_full_version < '3.11'" }, { name = "txaio", version = "23.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "txaio", version = "25.9.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/f2/8dffb3b709383ba5b47628b0cc4e43e8d12d59eecbddb62cfccac2e7cf6a/autobahn-24.4.2.tar.gz", hash = "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9", size = 482700, upload_time = "2024-08-02T09:26:48.241Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/13/ee/a6475f39ef6c6f41c33da6b193e0ffd2c6048f52e1698be6253c59301b72/autobahn-24.4.2-py2.py3-none-any.whl", hash = "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81", size = 666965, upload_time = "2024-08-02T09:26:44.274Z" }, ] [[package]] name = "autobahn" version = "25.12.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", ] dependencies = [ { name = "cbor2", marker = "python_full_version >= '3.11'" }, { name = "cffi", marker = "python_full_version >= '3.11'" }, { name = "cryptography", marker = "python_full_version >= '3.11'" }, { name = "hyperlink", marker = "python_full_version >= '3.11'" }, { name = "msgpack", marker = "python_full_version >= '3.11' and platform_python_implementation == 'CPython'" }, { name = "py-ubjson", marker = "python_full_version >= '3.11'" }, { name = "txaio", version = "25.12.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "u-msgpack-python", marker = "python_full_version >= '3.11' and platform_python_implementation != 'CPython'" }, { name = "ujson", marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e2/1a/ac15ba19cb6a5d2a3371fec8d5ffa7a92104973aeb60d65ca85c69a17c29/autobahn-25.12.1.tar.gz", hash = "sha256:a13e49f762e97a291136bb1c4e39e6b026c4275593fb1d9ef9b73e7ef22e559d", size = 13851285, upload_time = "2025-12-10T02:43:46.543Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/15/7a/0708aeb7c3b9c269af50f23bd5febe71560cdee6e637a111221138fcbfe6/autobahn-25.12.1-cp311-cp311-manylinux1_x86_64.manylinux_2_34_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f9accd135d7fd69dac90b85a66a301d1c8384f9d0be6db1843f000dcb520988d", size = 629896, upload_time = "2025-12-10T02:43:21.554Z" }, { url = "https://files.pythonhosted.org/packages/bc/73/22079eb61125dd787e9d51f28041e517e841ea05928bee0435e70fb408a8/autobahn-25.12.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5300e024ad223cbd5a57643eb0c36074bfa2b8d120da4fbacaa33eb482e871bd", size = 605669, upload_time = "2025-12-10T02:43:23.877Z" }, { url = "https://files.pythonhosted.org/packages/af/3f/19971b213b7d4df95446d60eed35bf070976acb3ccf5f001ffb04e0cdc87/autobahn-25.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:f176bb582b593aa5513a6818fa5156aaf08e37d8ae07e3ba044bb11e773c95aa", size = 694319, upload_time = "2025-12-10T02:43:25.56Z" }, { url = "https://files.pythonhosted.org/packages/f6/1a/5c63c0ea2f227d813a0edf6f623d957415da5dae548eccd0ca533818f408/autobahn-25.12.1-cp312-cp312-manylinux1_x86_64.manylinux_2_34_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:72f8f108f7a63199196105e91c7711e11d916533bc1ee5ab02cbc670a0967e84", size = 630537, upload_time = "2025-12-10T02:43:26.801Z" }, { url = "https://files.pythonhosted.org/packages/2a/bb/df4c1b33aca882c7329ad52be831099484cfb48b9fce475a9ea86e6eed54/autobahn-25.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:133712e97ff0122b0e2eb4675ef889702fbd0f6fb06ecfd9e5a99512d1886d38", size = 692163, upload_time = "2025-12-10T02:43:27.981Z" }, { url = "https://files.pythonhosted.org/packages/a2/a8/3a889c8481d7ee51ec1edf9592c370613999e6399f0e23e3993cdfca2aa7/autobahn-25.12.1-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:9daf8e3ae2eafcd9763e56405822274528df3ea08ed34fd8ef00d42b68c23027", size = 577108, upload_time = "2025-12-10T02:43:29.555Z" }, { url = "https://files.pythonhosted.org/packages/fd/1c/5332e2a9b40273aadf04bbdbde7f3cd5317fc481e76d6f9a8cbab65c8858/autobahn-25.12.1-cp313-cp313-manylinux1_x86_64.manylinux_2_34_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c546454801b61db36728675f933e9f333d8015a278ff451f60c4dd7a124eddf9", size = 630516, upload_time = "2025-12-10T02:43:31.025Z" }, { url = "https://files.pythonhosted.org/packages/0a/ac/5c7dce7f48d4a980a6ae57ad1f1c1316f374a0ceea7581548f027d5cbf30/autobahn-25.12.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0f3f723e1aa44acef323a7c011b65add6226ead2faa283926680a2315e40655", size = 606210, upload_time = "2025-12-10T02:43:32.408Z" }, { url = "https://files.pythonhosted.org/packages/65/fb/2b7703fbf5c19ff58a1209dcced9ec0c5fccac7a714942de8f33d681e7ed/autobahn-25.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:de2fe7e19914b4133c67b12b4fae8010ae9c2db91ffcea7390f0af7a875b3f63", size = 687043, upload_time = "2025-12-10T02:43:33.728Z" }, { url = "https://files.pythonhosted.org/packages/60/c9/5e3e8f893eb11415dfa9ecbf0d26ff032aa874c729f01a213f1b87f1637c/autobahn-25.12.1-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:872f569272e569fa65f3d27c0c54291dc1607b9da590588f9ef234f2d5031735", size = 577123, upload_time = "2025-12-10T02:43:34.775Z" }, { url = "https://files.pythonhosted.org/packages/e8/66/9ad1fd3c9baa1c16a268bfc358462182c04e05434db00e2bf5c34f0b378b/autobahn-25.12.1-cp314-cp314-manylinux1_x86_64.manylinux_2_34_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:76cee7e4d818bf7428bb740698a7debba4a0f56f88ce2695786b05a4ac55aa6b", size = 630753, upload_time = "2025-12-10T02:43:37.253Z" }, { url = "https://files.pythonhosted.org/packages/f5/a0/9abc505dc73dee8ccbd0b34ad57589f31a1a16e660d74e3164b545f935f0/autobahn-25.12.1-cp314-cp314-win_amd64.whl", hash = "sha256:fdf5660e5287e33bea64fd1fa62e2c3355bd2a3681ae4a751b6925e6342f03dd", size = 686646, upload_time = "2025-12-10T02:43:39.077Z" }, { url = "https://files.pythonhosted.org/packages/c3/ab/7676716b524ccd4f83ea076b06d2f83407bc27af35720c6d084c79944f20/autobahn-25.12.1-pp311-pypy311_pp73-macosx_15_0_arm64.whl", hash = "sha256:55e6b57834a2a1136f05a4572c5bc037a565d562945f253cffcaad08b44eaeff", size = 572015, upload_time = "2025-12-10T02:43:40.348Z" }, { url = "https://files.pythonhosted.org/packages/8d/19/eb6f9f2e43b6932c0a3b9360de383865796f9d12838a497570dc9d83518c/autobahn-25.12.1-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_34_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1a74a2aa3ec5e354a54266360c8f9a24710667a38f75f50cbaa6ae754feb156c", size = 584047, upload_time = "2025-12-10T02:43:41.756Z" }, { url = "https://files.pythonhosted.org/packages/3b/85/ca9b5f5419157aa31cfca0f86d53742707b183b83e07fd51fb2a1f530624/autobahn-25.12.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:877e9f4004716fb7eba1a21b266abe51ad6b5a8705810e7c7a49c18f85387af9", size = 578491, upload_time = "2025-12-10T02:43:43.819Z" }, { url = "https://files.pythonhosted.org/packages/79/77/8123c136e66dbf55fd502be7e5507a56343db81ecef9d8532a6638ad68b6/autobahn-25.12.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a91f855768b2f786b1eb141a724722bf430ff3532342a4f129df0385bc24ad9a", size = 692860, upload_time = "2025-12-10T02:43:45.157Z" }, ] [[package]] name = "automat" version = "25.4.16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e3/0f/d40bbe294bbf004d436a8bcbcfaadca8b5140d39ad0ad3d73d1a8ba15f14/automat-25.4.16.tar.gz", hash = "sha256:0017591a5477066e90d26b0e696ddc143baafd87b588cfac8100bc6be9634de0", size = 129977, upload_time = "2025-04-16T20:12:16.002Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/02/ff/1175b0b7371e46244032d43a56862d0af455823b5280a50c63d99cc50f18/automat-25.4.16-py3-none-any.whl", hash = "sha256:04e9bce696a8d5671ee698005af6e5a9fa15354140a87f4870744604dcdd3ba1", size = 42842, upload_time = "2025-04-16T20:12:14.447Z" }, ] [[package]] name = "backports-asyncio-runner" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload_time = "2025-07-02T02:27:15.685Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload_time = "2025-07-02T02:27:14.263Z" }, ] [[package]] name = "build" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "os_name == 'nt'" }, { name = "importlib-metadata", marker = "python_full_version < '3.10.2'" }, { name = "packaging" }, { name = "pyproject-hooks" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/1c/23e33405a7c9eac261dff640926b8b5adaed6a6eb3e1767d441ed611d0c0/build-1.3.0.tar.gz", hash = "sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397", size = 48544, upload_time = "2025-08-01T21:27:09.268Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4", size = 23382, upload_time = "2025-08-01T21:27:07.844Z" }, ] [[package]] name = "cbor2" version = "5.7.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/b8/c0f6a7d46f816cb18b1fda61a2fe648abe16039f1ff93ea720a6e9fb3cee/cbor2-5.7.1.tar.gz", hash = "sha256:7a405a1d7c8230ee9acf240aad48ae947ef584e8af05f169f3c1bde8f01f8b71", size = 102467, upload_time = "2025-10-24T09:23:06.569Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c7/08/a9b3e777ace829d9d782f0a80877085af24708d73bd1c41c296aeba4ebac/cbor2-5.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a0fc6cc50e0aa04e54792e7824e65bf66c691ae2948d7c012153df2bab1ee314", size = 67914, upload_time = "2025-10-24T09:22:05.395Z" }, { url = "https://files.pythonhosted.org/packages/5d/b5/1c23af80b279d5ec336c57e41a53bf8158e2ec3610b415cbc74887145d5d/cbor2-5.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c2fe69c1473d18d102f1e20982edab5bfa543fa1cda9888bdecc49f8b2f3d720", size = 68445, upload_time = "2025-10-24T09:22:06.93Z" }, { url = "https://files.pythonhosted.org/packages/f6/76/4d14dce9acd92333a249c676579e4879c492efda142c91c242044a70816d/cbor2-5.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34cbbe4fcf82080412a641984a0be43dfe66eac50a8f45596da63fde36189450", size = 254506, upload_time = "2025-10-24T09:22:08.264Z" }, { url = "https://files.pythonhosted.org/packages/b0/70/d835e91d53bc9df4d77764262489b6de505cfa400799a6625e9368391ea7/cbor2-5.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fc3d3f00aed397a1e4634b8e1780f347aad191a2e1e7768a233baadd4f87561", size = 247760, upload_time = "2025-10-24T09:22:09.497Z" }, { url = "https://files.pythonhosted.org/packages/29/c7/7fe1c82b5ddb00a407f016ca0de0560e47b3f6c15228478911b3b9ffb0e2/cbor2-5.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99e1666887a868e619096e9b5953734efd034f577e078f4efc5abd23dc1bcd32", size = 250188, upload_time = "2025-10-24T09:22:10.803Z" }, { url = "https://files.pythonhosted.org/packages/49/fd/40887b1aee3270284d2e9ac6740566a554cb6fd7ca9f251d7e1ee86ba1c3/cbor2-5.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:59b78c90a5e682e7d004586fb662be6e451ec06f32fc3a738bbfb9576c72ecc9", size = 244190, upload_time = "2025-10-24T09:22:12.294Z" }, { url = "https://files.pythonhosted.org/packages/81/ba/9a91f4046c9a101fc68c23913c916d1fbcb6fae11d6a6f574f91c26ed31a/cbor2-5.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:6300e0322e52f831892054f1ccf25e67fa8040664963d358db090f29d8976ae4", size = 68150, upload_time = "2025-10-24T09:22:13.394Z" }, { url = "https://files.pythonhosted.org/packages/12/1e/aad24a2fe0b54353e19aaad06f7d7eb2d835dc4f5bbf5882f98be20e8744/cbor2-5.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:7badbde0d89eb7c8b9f7ef8e4f2395c02cfb24b514815656fef8e23276a7cd36", size = 64123, upload_time = "2025-10-24T09:22:14.669Z" }, { url = "https://files.pythonhosted.org/packages/52/67/319baac9c51de0053f58fa74a9548f93f3629aa3adeebd7d2c99d1379370/cbor2-5.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b1efbe6e82721be44b9faf47d0fd97b0150213eb6a4ba554f4947442bc4e13f", size = 67894, upload_time = "2025-10-24T09:22:16.081Z" }, { url = "https://files.pythonhosted.org/packages/2c/53/d23d0a234a4a098b019ac1cadd33631c973142fc947a68c4a38ca47aa5dc/cbor2-5.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb94bab27e00283bdd8f160e125e17dbabec4c9e6ffc8da91c36547ec1eb707f", size = 68444, upload_time = "2025-10-24T09:22:17.136Z" }, { url = "https://files.pythonhosted.org/packages/3a/a2/a6fa59e1c23b0bc77628d64153eb9fc69ac8dde5f8ed41a7d5316fcd0bcd/cbor2-5.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29f22266b5e08e0e4152e87ba185e04d3a84a4fd545b99ae3ebe42c658c66a53", size = 261600, upload_time = "2025-10-24T09:22:18.293Z" }, { url = "https://files.pythonhosted.org/packages/3d/cb/e0fa066aa7a09b15b8f56bafef6b2be19d9db31310310b0a5601af5c0128/cbor2-5.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25d4c7554d6627da781c9bd1d0dd0709456eecb71f605829f98961bb98487dda", size = 254904, upload_time = "2025-10-24T09:22:19.645Z" }, { url = "https://files.pythonhosted.org/packages/2c/d5/b1fb4a3828c440e100a4b2658dd2e8f422faf08f4fcc8e2c92b240656b44/cbor2-5.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1e15c3a08008cf13ce1dfc64d17c960df5d66d935788d28ec7df54bf0ffb0ef", size = 257388, upload_time = "2025-10-24T09:22:20.805Z" }, { url = "https://files.pythonhosted.org/packages/34/d5/252657bc5af964fc5f19c0e0e82031b4c32eba5d3ed4098e963e0e8c47a6/cbor2-5.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9f6cdf7eb604ea0e7ef34e3f0b5447da0029ecd3ab7b2dc70e43fa5f7bcfca89", size = 251494, upload_time = "2025-10-24T09:22:21.986Z" }, { url = "https://files.pythonhosted.org/packages/8a/3a/503ea4c2977411858ca287808d077fdb4bb1fafdb4b39177b8ce3d5619ac/cbor2-5.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:dd25cbef8e8e6dbf69f0de95311aecaca7217230cda83ae99fdc37cd20d99250", size = 68147, upload_time = "2025-10-24T09:22:23.136Z" }, { url = "https://files.pythonhosted.org/packages/49/9e/fe4c9703fd444da193f892787110c5da2a85c16d26917fcb2584f5d00077/cbor2-5.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:40cc9c67242a7abac5a4e062bc4d1d2376979878c0565a4b2f08fd9ed9212945", size = 64126, upload_time = "2025-10-24T09:22:24.197Z" }, { url = "https://files.pythonhosted.org/packages/56/54/48426472f0c051982c647331441aed09b271a0500356ae0b7054c813d174/cbor2-5.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bd5ca44891c06f6b85d440836c967187dc1d30b15f86f315d55c675d3a841078", size = 69031, upload_time = "2025-10-24T09:22:25.438Z" }, { url = "https://files.pythonhosted.org/packages/d3/68/1dd58c7706e9752188358223db58c83f3c48e07f728aa84221ffd244652f/cbor2-5.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:537d73ef930ccc1a7b6a2e8d2cbf81407d270deb18e40cda5eb511bd70f71078", size = 68825, upload_time = "2025-10-24T09:22:26.497Z" }, { url = "https://files.pythonhosted.org/packages/09/4e/380562fe9f9995a1875fb5ec26fd041e19d61f4630cb690a98c5195945fc/cbor2-5.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:edbf814dd7763b6eda27a5770199f6ccd55bd78be8f4367092460261bfbf19d0", size = 286222, upload_time = "2025-10-24T09:22:27.546Z" }, { url = "https://files.pythonhosted.org/packages/7c/bb/9eccdc1ea3c4d5c7cdb2e49b9de49534039616be5455ce69bd64c0b2efe2/cbor2-5.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fc81da8c0e09beb42923e455e477b36ff14a03b9ca18a8a2e9b462de9a953e8", size = 285688, upload_time = "2025-10-24T09:22:28.651Z" }, { url = "https://files.pythonhosted.org/packages/59/8c/4696d82f5bd04b3d45d9a64ec037fa242630c134e3218d6c252b4f59b909/cbor2-5.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e4a7d660d428911a3aadb7105e94438d7671ab977356fdf647a91aab751033bd", size = 277063, upload_time = "2025-10-24T09:22:29.775Z" }, { url = "https://files.pythonhosted.org/packages/95/50/6538e44ca970caaad2fa376b81701d073d84bf597aac07a59d0a253b1a7f/cbor2-5.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:228e0af9c0a9ddf6375b6ae010eaa1942a1901d403f134ac9ee6a76a322483f9", size = 278334, upload_time = "2025-10-24T09:22:30.904Z" }, { url = "https://files.pythonhosted.org/packages/64/a9/156ccd2207fb26b5b61d23728b4dbdc595d1600125aa79683a4a8ddc9313/cbor2-5.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:2d08a6c0d9ed778448e185508d870f4160ba74f59bb17a966abd0d14d0ff4dd3", size = 68404, upload_time = "2025-10-24T09:22:32.108Z" }, { url = "https://files.pythonhosted.org/packages/4f/49/adc53615e9dd32c4421f6935dfa2235013532c6e6b28ee515bbdd92618be/cbor2-5.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:752506cfe72da0f4014b468b30191470ee8919a64a0772bd3b36a4fccf5fcefc", size = 64047, upload_time = "2025-10-24T09:22:33.147Z" }, { url = "https://files.pythonhosted.org/packages/16/b1/51fb868fe38d893c570bb90b38d365ff0f00421402c1ae8f63b31b25d665/cbor2-5.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:59d5da59fffe89692d5bd1530eef4d26e4eb7aa794aaa1f4e192614786409009", size = 69068, upload_time = "2025-10-24T09:22:34.464Z" }, { url = "https://files.pythonhosted.org/packages/b9/db/5abc62ec456f552f617aac3359a5d7114b23be9c4d886169592cd5f074b9/cbor2-5.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:533117918d518e01348f8cd0331271c207e7224b9a1ed492a0ff00847f28edc8", size = 68927, upload_time = "2025-10-24T09:22:35.458Z" }, { url = "https://files.pythonhosted.org/packages/9a/c2/58d787395c99874d2a2395b3a22c9d48a3cfc5a7dcd5817bf74764998b75/cbor2-5.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8d6d9436ff3c3323ea5863ecf7ae1139590991685b44b9eb6b7bb1734a594af6", size = 285185, upload_time = "2025-10-24T09:22:36.867Z" }, { url = "https://files.pythonhosted.org/packages/d0/9c/b680b264a8f4b9aa59c95e166c816275a13138cbee92dd2917f58bca47b9/cbor2-5.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:661b871ca754a619fcd98c13a38b4696b2b57dab8b24235c00b0ba322c040d24", size = 284440, upload_time = "2025-10-24T09:22:38.08Z" }, { url = "https://files.pythonhosted.org/packages/1f/59/68183c655d6226d0eee10027f52516882837802a8d5746317a88362ed686/cbor2-5.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8065aa90d715fd9bb28727b2d774ee16e695a0e1627ae76e54bf19f9d99d63f", size = 276876, upload_time = "2025-10-24T09:22:39.561Z" }, { url = "https://files.pythonhosted.org/packages/ee/a2/1964e0a569d2b81e8f4862753fee7701ae5773c22e45492a26f92f62e75a/cbor2-5.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cb1b7047d73590cfe8e373e2c804fa99be47e55b1b6186602d0f86f384cecec1", size = 278216, upload_time = "2025-10-24T09:22:41.132Z" }, { url = "https://files.pythonhosted.org/packages/00/78/9b566d68cb88bb1ecebe354765625161c9d6060a16e55008006d6359f776/cbor2-5.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:31d511df7ebd6624fdb4cecdafb4ffb9a205f9ff8c8d98edd1bef0d27f944d74", size = 68451, upload_time = "2025-10-24T09:22:42.227Z" }, { url = "https://files.pythonhosted.org/packages/db/85/7a6a922d147d027fd5d8fd5224b39e8eaf152a42e8cf16351458096d3d62/cbor2-5.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:f5d37f7b0f84394d2995bd8722cb01c86a885c4821a864a34b7b4d9950c5e26e", size = 64111, upload_time = "2025-10-24T09:22:43.213Z" }, { url = "https://files.pythonhosted.org/packages/5f/f0/f220222a57371e33434ba7bdc25de31d611cbc0ade2a868e03c3553305e7/cbor2-5.7.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e5826e4fa4c33661960073f99cf67c82783895524fb66f3ebdd635c19b5a7d68", size = 69002, upload_time = "2025-10-24T09:22:44.316Z" }, { url = "https://files.pythonhosted.org/packages/c7/3c/34b62ba5173541659f248f005d13373530f02fb997b78fde00bf01ede4f4/cbor2-5.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f19a00d6ac9a77cb611073250b06bf4494b41ba78a1716704f7008e0927d9366", size = 69177, upload_time = "2025-10-24T09:22:45.711Z" }, { url = "https://files.pythonhosted.org/packages/77/fd/2400d820d9733df00a5c18aa74201e51d710fb91588687eb594f4a7688ea/cbor2-5.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2113aea044cd172f199da3520bc4401af69eae96c5180ca7eb660941928cb89", size = 284259, upload_time = "2025-10-24T09:22:46.749Z" }, { url = "https://files.pythonhosted.org/packages/42/65/280488ef196c1d71ba123cd406ea47727bb3a0e057767a733d9793fcc428/cbor2-5.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f17eacea2d28fecf28ac413c1d7927cde0a11957487d2630655d6b5c9c46a0b", size = 281958, upload_time = "2025-10-24T09:22:48.876Z" }, { url = "https://files.pythonhosted.org/packages/42/82/bcdd3fdc73bd5f4194fdb08c808112010add9530bae1dcfdb1e2b2ceae19/cbor2-5.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d65deea39cae533a629561e7da672402c46731122b6129ed7c8eaa1efe04efce", size = 276025, upload_time = "2025-10-24T09:22:50.147Z" }, { url = "https://files.pythonhosted.org/packages/ae/a8/a6065dd6a157b877d7d8f3fe96f410fb191a2db1e6588f4d20b5f9a507c2/cbor2-5.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:57d8cc29ec1fd20500748e0e767ff88c13afcee839081ba4478c41fcda6ee18b", size = 275978, upload_time = "2025-10-24T09:22:51.873Z" }, { url = "https://files.pythonhosted.org/packages/62/f4/37934045174af9e4253a340b43f07197af54002070cb80fae82d878f1f14/cbor2-5.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:94fb939d0946f80c49ba45105ca3a3e13e598fc9abd63efc6661b02d4b4d2c50", size = 70269, upload_time = "2025-10-24T09:22:53.275Z" }, { url = "https://files.pythonhosted.org/packages/0b/fd/933416643e7f5540ae818691fb23fa4189010c6efa39a12c4f59d825da28/cbor2-5.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4fd7225ac820bbb9f03bd16bc1a7efb6c4d1c451f22c0a153ff4ec46495c59c5", size = 66182, upload_time = "2025-10-24T09:22:54.697Z" }, { url = "https://files.pythonhosted.org/packages/6c/75/fdcf3c3db0bfd197d96d3d22dcf98535219ca0ac8d000df04d6e9cf60c6a/cbor2-5.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0a94c265d92ecc25b11072f5f41685a881c8d95fa64d6691db79cea6eac8c94a", size = 67917, upload_time = "2025-10-24T09:22:56.194Z" }, { url = "https://files.pythonhosted.org/packages/b2/f5/6706a10fc0323210a1ad2f96dcf9e552951096e316b1af66864e6728cddf/cbor2-5.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a56a92bd6070c98513eacdd3e0efbe07c373a5a1637acef94b18f141e71079e", size = 68444, upload_time = "2025-10-24T09:22:57.18Z" }, { url = "https://files.pythonhosted.org/packages/f1/3b/3b097d6513f1282f09360f16a28696d61d54f084a53966a16f4fe0887577/cbor2-5.7.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4682973d385020786ff0c8c6d9694e2428f1bb4cd82a8a0f172eaa9cd674c814", size = 253203, upload_time = "2025-10-24T09:22:58.243Z" }, { url = "https://files.pythonhosted.org/packages/88/e0/095c9a572c0bdac16edab8168473a9dcd5c4e8777e5d59eb41be580afb47/cbor2-5.7.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2f2e226066b801d1015c632a8309e3b322e5f1488a4472ffc8310bbf1386d84", size = 246437, upload_time = "2025-10-24T09:22:59.428Z" }, { url = "https://files.pythonhosted.org/packages/c7/4a/e31a13c3bde2c5c2e414fb666d500a8660d3af577511e46590df28c48487/cbor2-5.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f6f342a3a745f8aecc0a6253ea45952dbaf9ffdfeb641490298b3b92074365c7", size = 248993, upload_time = "2025-10-24T09:23:00.711Z" }, { url = "https://files.pythonhosted.org/packages/6a/44/fd0c605f16b7ac50092f16450d7bda8cb83cd76cec184a2fbaad99e257cc/cbor2-5.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:45e6a01c028b3588028995b4016009d6525b82981ab095ffaaef78798be35583", size = 242928, upload_time = "2025-10-24T09:23:01.966Z" }, { url = "https://files.pythonhosted.org/packages/16/e2/be43186c98ab9386e42b012c296e956c09bea8441f14d96b0c33d2a00187/cbor2-5.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd044d65dc026f710104515359350014101eb5be86925314328ebe6221312a1c", size = 68258, upload_time = "2025-10-24T09:23:03.132Z" }, { url = "https://files.pythonhosted.org/packages/08/23/417cad8242789b018bc0f5ae87a4949d08a721fb27700bb94d95c79c3691/cbor2-5.7.1-cp39-cp39-win_arm64.whl", hash = "sha256:d7e2d2a116108d7e4e9cda46385beed4102f8dca599a84e78bffdc5b07ebed89", size = 64108, upload_time = "2025-10-24T09:23:04.539Z" }, { url = "https://files.pythonhosted.org/packages/d5/7d/383bafeabb54c17fe5b6d5aca4e863e6b7df10bcc833b34aa169e9dfce1a/cbor2-5.7.1-py3-none-any.whl", hash = "sha256:68834e4eff2f56629ce6422b0634bc3f74c5a4269de5363f5265fe452c706ba7", size = 23829, upload_time = "2025-10-24T09:23:05.54Z" }, ] [[package]] name = "certifi" version = "2025.11.12" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload_time = "2025-11-12T02:54:51.517Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload_time = "2025-11-12T02:54:49.735Z" }, ] [[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/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload_time = "2025-09-08T23:22:08.01Z" }, { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload_time = "2025-09-08T23:22:10.637Z" }, { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload_time = "2025-09-08T23:22:12.267Z" }, { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload_time = "2025-09-08T23:22:13.455Z" }, { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload_time = "2025-09-08T23:22:14.596Z" }, { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload_time = "2025-09-08T23:22:15.769Z" }, { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload_time = "2025-09-08T23:22:17.427Z" }, { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload_time = "2025-09-08T23:22:19.069Z" }, { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload_time = "2025-09-08T23:22:20.588Z" }, { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload_time = "2025-09-08T23:22:22.143Z" }, { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload_time = "2025-09-08T23:22:23.328Z" }, { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload_time = "2025-09-08T23:22:24.752Z" }, { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload_time = "2025-09-08T23:22:26.456Z" }, { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload_time = "2025-09-08T23:22:28.197Z" }, { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload_time = "2025-09-08T23:22:29.475Z" }, { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload_time = "2025-09-08T23:22:31.063Z" }, { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload_time = "2025-09-08T23:22:32.507Z" }, { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload_time = "2025-09-08T23:22:34.132Z" }, { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload_time = "2025-09-08T23:22:35.443Z" }, { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload_time = "2025-09-08T23:22:36.805Z" }, { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload_time = "2025-09-08T23:22:38.436Z" }, { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload_time = "2025-09-08T23:22:39.776Z" }, { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload_time = "2025-09-08T23:22:40.95Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload_time = "2025-09-08T23:22:42.463Z" }, { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload_time = "2025-09-08T23:22:43.623Z" }, { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload_time = "2025-09-08T23:22:44.795Z" }, { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload_time = "2025-09-08T23:22:45.938Z" }, { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload_time = "2025-09-08T23:22:47.349Z" }, { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload_time = "2025-09-08T23:22:48.677Z" }, { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload_time = "2025-09-08T23:22:50.06Z" }, { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload_time = "2025-09-08T23:22:51.364Z" }, { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload_time = "2025-09-08T23:22:52.902Z" }, { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload_time = "2025-09-08T23:22:54.518Z" }, { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload_time = "2025-09-08T23:22:55.867Z" }, { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload_time = "2025-09-08T23:22:57.188Z" }, { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload_time = "2025-09-08T23:22:58.351Z" }, { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload_time = "2025-09-08T23:22:59.668Z" }, { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload_time = "2025-09-08T23:23:00.879Z" }, { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload_time = "2025-09-08T23:23:02.231Z" }, { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload_time = "2025-09-08T23:23:03.472Z" }, { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload_time = "2025-09-08T23:23:04.792Z" }, { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload_time = "2025-09-08T23:23:06.127Z" }, { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload_time = "2025-09-08T23:23:07.753Z" }, { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload_time = "2025-09-08T23:23:09.648Z" }, { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload_time = "2025-09-08T23:23:10.928Z" }, { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload_time = "2025-09-08T23:23:12.42Z" }, { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload_time = "2025-09-08T23:23:14.32Z" }, { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload_time = "2025-09-08T23:23:15.535Z" }, { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload_time = "2025-09-08T23:23:16.761Z" }, { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload_time = "2025-09-08T23:23:18.087Z" }, { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload_time = "2025-09-08T23:23:19.622Z" }, { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload_time = "2025-09-08T23:23:20.853Z" }, { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload_time = "2025-09-08T23:23:22.08Z" }, { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload_time = "2025-09-08T23:23:23.314Z" }, { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload_time = "2025-09-08T23:23:24.541Z" }, { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload_time = "2025-09-08T23:23:26.143Z" }, { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload_time = "2025-09-08T23:23:27.873Z" }, { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload_time = "2025-09-08T23:23:44.61Z" }, { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload_time = "2025-09-08T23:23:45.848Z" }, { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload_time = "2025-09-08T23:23:47.105Z" }, { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload_time = "2025-09-08T23:23:29.347Z" }, { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload_time = "2025-09-08T23:23:30.63Z" }, { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload_time = "2025-09-08T23:23:31.91Z" }, { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload_time = "2025-09-08T23:23:33.214Z" }, { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload_time = "2025-09-08T23:23:34.495Z" }, { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload_time = "2025-09-08T23:23:36.096Z" }, { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload_time = "2025-09-08T23:23:37.328Z" }, { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload_time = "2025-09-08T23:23:38.945Z" }, { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload_time = "2025-09-08T23:23:40.423Z" }, { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload_time = "2025-09-08T23:23:41.742Z" }, { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload_time = "2025-09-08T23:23:43.004Z" }, { url = "https://files.pythonhosted.org/packages/c0/cc/08ed5a43f2996a16b462f64a7055c6e962803534924b9b2f1371d8c00b7b/cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf", size = 184288, upload_time = "2025-09-08T23:23:48.404Z" }, { url = "https://files.pythonhosted.org/packages/3d/de/38d9726324e127f727b4ecc376bc85e505bfe61ef130eaf3f290c6847dd4/cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7", size = 180509, upload_time = "2025-09-08T23:23:49.73Z" }, { url = "https://files.pythonhosted.org/packages/9b/13/c92e36358fbcc39cf0962e83223c9522154ee8630e1df7c0b3a39a8124e2/cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", size = 208813, upload_time = "2025-09-08T23:23:51.263Z" }, { url = "https://files.pythonhosted.org/packages/15/12/a7a79bd0df4c3bff744b2d7e52cc1b68d5e7e427b384252c42366dc1ecbc/cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", size = 216498, upload_time = "2025-09-08T23:23:52.494Z" }, { url = "https://files.pythonhosted.org/packages/a3/ad/5c51c1c7600bdd7ed9a24a203ec255dccdd0ebf4527f7b922a0bde2fb6ed/cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534", size = 203243, upload_time = "2025-09-08T23:23:53.836Z" }, { url = "https://files.pythonhosted.org/packages/32/f2/81b63e288295928739d715d00952c8c6034cb6c6a516b17d37e0c8be5600/cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f", size = 203158, upload_time = "2025-09-08T23:23:55.169Z" }, { url = "https://files.pythonhosted.org/packages/1f/74/cc4096ce66f5939042ae094e2e96f53426a979864aa1f96a621ad128be27/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", size = 216548, upload_time = "2025-09-08T23:23:56.506Z" }, { url = "https://files.pythonhosted.org/packages/e8/be/f6424d1dc46b1091ffcc8964fa7c0ab0cd36839dd2761b49c90481a6ba1b/cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", size = 218897, upload_time = "2025-09-08T23:23:57.825Z" }, { url = "https://files.pythonhosted.org/packages/f7/e0/dda537c2309817edf60109e39265f24f24aa7f050767e22c98c53fe7f48b/cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", size = 211249, upload_time = "2025-09-08T23:23:59.139Z" }, { url = "https://files.pythonhosted.org/packages/2b/e7/7c769804eb75e4c4b35e658dba01de1640a351a9653c3d49ca89d16ccc91/cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", size = 218041, upload_time = "2025-09-08T23:24:00.496Z" }, { url = "https://files.pythonhosted.org/packages/aa/d9/6218d78f920dcd7507fc16a766b5ef8f3b913cc7aa938e7fc80b9978d089/cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a", size = 172138, upload_time = "2025-09-08T23:24:01.7Z" }, { url = "https://files.pythonhosted.org/packages/54/8f/a1e836f82d8e32a97e6b29cc8f641779181ac7363734f12df27db803ebda/cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9", size = 182794, upload_time = "2025-09-08T23:24:02.943Z" }, ] [[package]] name = "cfgv" version = "3.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload_time = "2023-08-12T20:38:17.776Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload_time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "cfgv" version = "3.5.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload_time = "2025-11-19T20:55:51.612Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload_time = "2025-11-19T20:55:50.744Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload_time = "2025-10-14T04:42:32.879Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload_time = "2025-10-14T04:40:11.385Z" }, { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload_time = "2025-10-14T04:40:13.135Z" }, { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload_time = "2025-10-14T04:40:14.728Z" }, { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload_time = "2025-10-14T04:40:16.14Z" }, { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload_time = "2025-10-14T04:40:17.567Z" }, { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload_time = "2025-10-14T04:40:19.08Z" }, { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload_time = "2025-10-14T04:40:20.607Z" }, { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload_time = "2025-10-14T04:40:21.719Z" }, { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload_time = "2025-10-14T04:40:23.069Z" }, { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload_time = "2025-10-14T04:40:24.17Z" }, { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload_time = "2025-10-14T04:40:25.368Z" }, { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload_time = "2025-10-14T04:40:26.806Z" }, { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload_time = "2025-10-14T04:40:28.284Z" }, { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload_time = "2025-10-14T04:40:29.613Z" }, { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload_time = "2025-10-14T04:40:30.644Z" }, { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload_time = "2025-10-14T04:40:32.108Z" }, { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload_time = "2025-10-14T04:40:33.79Z" }, { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload_time = "2025-10-14T04:40:34.961Z" }, { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload_time = "2025-10-14T04:40:36.105Z" }, { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload_time = "2025-10-14T04:40:37.188Z" }, { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload_time = "2025-10-14T04:40:38.435Z" }, { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload_time = "2025-10-14T04:40:40.053Z" }, { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload_time = "2025-10-14T04:40:41.163Z" }, { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload_time = "2025-10-14T04:40:42.276Z" }, { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload_time = "2025-10-14T04:40:43.439Z" }, { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload_time = "2025-10-14T04:40:44.547Z" }, { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload_time = "2025-10-14T04:40:46.018Z" }, { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload_time = "2025-10-14T04:40:47.081Z" }, { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload_time = "2025-10-14T04:40:48.246Z" }, { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload_time = "2025-10-14T04:40:49.376Z" }, { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload_time = "2025-10-14T04:40:50.844Z" }, { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload_time = "2025-10-14T04:40:52.272Z" }, { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload_time = "2025-10-14T04:40:53.353Z" }, { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload_time = "2025-10-14T04:40:54.558Z" }, { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload_time = "2025-10-14T04:40:55.677Z" }, { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload_time = "2025-10-14T04:40:57.217Z" }, { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload_time = "2025-10-14T04:40:58.358Z" }, { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload_time = "2025-10-14T04:40:59.468Z" }, { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload_time = "2025-10-14T04:41:00.623Z" }, { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload_time = "2025-10-14T04:41:01.754Z" }, { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload_time = "2025-10-14T04:41:03.231Z" }, { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload_time = "2025-10-14T04:41:04.715Z" }, { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload_time = "2025-10-14T04:41:05.827Z" }, { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload_time = "2025-10-14T04:41:06.938Z" }, { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload_time = "2025-10-14T04:41:08.101Z" }, { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload_time = "2025-10-14T04:41:09.23Z" }, { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload_time = "2025-10-14T04:41:10.467Z" }, { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload_time = "2025-10-14T04:41:11.915Z" }, { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload_time = "2025-10-14T04:41:13.346Z" }, { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload_time = "2025-10-14T04:41:14.461Z" }, { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload_time = "2025-10-14T04:41:15.588Z" }, { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload_time = "2025-10-14T04:41:16.738Z" }, { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload_time = "2025-10-14T04:41:17.923Z" }, { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload_time = "2025-10-14T04:41:19.106Z" }, { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload_time = "2025-10-14T04:41:20.245Z" }, { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload_time = "2025-10-14T04:41:21.398Z" }, { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload_time = "2025-10-14T04:41:22.583Z" }, { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload_time = "2025-10-14T04:41:23.754Z" }, { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload_time = "2025-10-14T04:41:25.27Z" }, { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload_time = "2025-10-14T04:41:26.725Z" }, { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload_time = "2025-10-14T04:41:28.322Z" }, { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload_time = "2025-10-14T04:41:29.95Z" }, { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload_time = "2025-10-14T04:41:31.188Z" }, { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload_time = "2025-10-14T04:41:32.624Z" }, { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload_time = "2025-10-14T04:41:33.773Z" }, { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload_time = "2025-10-14T04:41:34.897Z" }, { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload_time = "2025-10-14T04:41:36.116Z" }, { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload_time = "2025-10-14T04:41:37.229Z" }, { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload_time = "2025-10-14T04:41:38.368Z" }, { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload_time = "2025-10-14T04:41:39.862Z" }, { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload_time = "2025-10-14T04:41:41.319Z" }, { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload_time = "2025-10-14T04:41:42.539Z" }, { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload_time = "2025-10-14T04:41:43.661Z" }, { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload_time = "2025-10-14T04:41:44.821Z" }, { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload_time = "2025-10-14T04:41:46.442Z" }, { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload_time = "2025-10-14T04:41:47.631Z" }, { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload_time = "2025-10-14T04:41:48.81Z" }, { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload_time = "2025-10-14T04:41:49.946Z" }, { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload_time = "2025-10-14T04:41:51.051Z" }, { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload_time = "2025-10-14T04:41:52.122Z" }, { url = "https://files.pythonhosted.org/packages/46/7c/0c4760bccf082737ca7ab84a4c2034fcc06b1f21cf3032ea98bd6feb1725/charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", size = 209609, upload_time = "2025-10-14T04:42:10.922Z" }, { url = "https://files.pythonhosted.org/packages/bb/a4/69719daef2f3d7f1819de60c9a6be981b8eeead7542d5ec4440f3c80e111/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", size = 149029, upload_time = "2025-10-14T04:42:12.38Z" }, { url = "https://files.pythonhosted.org/packages/e6/21/8d4e1d6c1e6070d3672908b8e4533a71b5b53e71d16828cc24d0efec564c/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608", size = 144580, upload_time = "2025-10-14T04:42:13.549Z" }, { url = "https://files.pythonhosted.org/packages/a7/0a/a616d001b3f25647a9068e0b9199f697ce507ec898cacb06a0d5a1617c99/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", size = 162340, upload_time = "2025-10-14T04:42:14.892Z" }, { url = "https://files.pythonhosted.org/packages/85/93/060b52deb249a5450460e0585c88a904a83aec474ab8e7aba787f45e79f2/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", size = 159619, upload_time = "2025-10-14T04:42:16.676Z" }, { url = "https://files.pythonhosted.org/packages/dd/21/0274deb1cc0632cd587a9a0ec6b4674d9108e461cb4cd40d457adaeb0564/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", size = 153980, upload_time = "2025-10-14T04:42:17.917Z" }, { url = "https://files.pythonhosted.org/packages/28/2b/e3d7d982858dccc11b31906976323d790dded2017a0572f093ff982d692f/charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", size = 152174, upload_time = "2025-10-14T04:42:19.018Z" }, { url = "https://files.pythonhosted.org/packages/6e/ff/4a269f8e35f1e58b2df52c131a1fa019acb7ef3f8697b7d464b07e9b492d/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", size = 151666, upload_time = "2025-10-14T04:42:20.171Z" }, { url = "https://files.pythonhosted.org/packages/da/c9/ec39870f0b330d58486001dd8e532c6b9a905f5765f58a6f8204926b4a93/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", size = 145550, upload_time = "2025-10-14T04:42:21.324Z" }, { url = "https://files.pythonhosted.org/packages/75/8f/d186ab99e40e0ed9f82f033d6e49001701c81244d01905dd4a6924191a30/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", size = 163721, upload_time = "2025-10-14T04:42:22.46Z" }, { url = "https://files.pythonhosted.org/packages/96/b1/6047663b9744df26a7e479ac1e77af7134b1fcf9026243bb48ee2d18810f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", size = 152127, upload_time = "2025-10-14T04:42:23.712Z" }, { url = "https://files.pythonhosted.org/packages/59/78/e5a6eac9179f24f704d1be67d08704c3c6ab9f00963963524be27c18ed87/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", size = 161175, upload_time = "2025-10-14T04:42:24.87Z" }, { url = "https://files.pythonhosted.org/packages/e5/43/0e626e42d54dd2f8dd6fc5e1c5ff00f05fbca17cb699bedead2cae69c62f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", size = 155375, upload_time = "2025-10-14T04:42:27.246Z" }, { url = "https://files.pythonhosted.org/packages/e9/91/d9615bf2e06f35e4997616ff31248c3657ed649c5ab9d35ea12fce54e380/charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", size = 99692, upload_time = "2025-10-14T04:42:28.425Z" }, { url = "https://files.pythonhosted.org/packages/d1/a9/6c040053909d9d1ef4fcab45fddec083aedc9052c10078339b47c8573ea8/charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", size = 107192, upload_time = "2025-10-14T04:42:29.482Z" }, { url = "https://files.pythonhosted.org/packages/f0/c6/4fa536b2c0cd3edfb7ccf8469fa0f363ea67b7213a842b90909ca33dd851/charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", size = 100220, upload_time = "2025-10-14T04:42:30.632Z" }, { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload_time = "2025-10-14T04:42:31.76Z" }, ] [[package]] name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload_time = "2024-12-21T18:38:44.339Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload_time = "2024-12-21T18:38:41.666Z" }, ] [[package]] name = "click" version = "8.3.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload_time = "2025-11-15T20:45:42.706Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload_time = "2025-11-15T20:45:41.139Z" }, ] [[package]] name = "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 = "constantly" version = "23.10.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/4d/6f/cb2a94494ff74aa9528a36c5b1422756330a75a8367bf20bd63171fc324d/constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd", size = 13300, upload_time = "2023-10-28T23:18:24.316Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b8/40/c199d095151addf69efdb4b9ca3a4f20f70e20508d6222bffb9b76f58573/constantly-23.10.4-py3-none-any.whl", hash = "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9", size = 13547, upload_time = "2023-10-28T23:18:23.038Z" }, ] [[package]] name = "coverage" version = "7.10.7" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload_time = "2025-09-21T20:03:56.815Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e5/6c/3a3f7a46888e69d18abe3ccc6fe4cb16cccb1e6a2f99698931dafca489e6/coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a", size = 217987, upload_time = "2025-09-21T20:00:57.218Z" }, { url = "https://files.pythonhosted.org/packages/03/94/952d30f180b1a916c11a56f5c22d3535e943aa22430e9e3322447e520e1c/coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5", size = 218388, upload_time = "2025-09-21T20:01:00.081Z" }, { url = "https://files.pythonhosted.org/packages/50/2b/9e0cf8ded1e114bcd8b2fd42792b57f1c4e9e4ea1824cde2af93a67305be/coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17", size = 245148, upload_time = "2025-09-21T20:01:01.768Z" }, { url = "https://files.pythonhosted.org/packages/19/20/d0384ac06a6f908783d9b6aa6135e41b093971499ec488e47279f5b846e6/coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b", size = 246958, upload_time = "2025-09-21T20:01:03.355Z" }, { url = "https://files.pythonhosted.org/packages/60/83/5c283cff3d41285f8eab897651585db908a909c572bdc014bcfaf8a8b6ae/coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87", size = 248819, upload_time = "2025-09-21T20:01:04.968Z" }, { url = "https://files.pythonhosted.org/packages/60/22/02eb98fdc5ff79f423e990d877693e5310ae1eab6cb20ae0b0b9ac45b23b/coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e", size = 245754, upload_time = "2025-09-21T20:01:06.321Z" }, { url = "https://files.pythonhosted.org/packages/b4/bc/25c83bcf3ad141b32cd7dc45485ef3c01a776ca3aa8ef0a93e77e8b5bc43/coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e", size = 246860, upload_time = "2025-09-21T20:01:07.605Z" }, { url = "https://files.pythonhosted.org/packages/3c/b7/95574702888b58c0928a6e982038c596f9c34d52c5e5107f1eef729399b5/coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df", size = 244877, upload_time = "2025-09-21T20:01:08.829Z" }, { url = "https://files.pythonhosted.org/packages/47/b6/40095c185f235e085df0e0b158f6bd68cc6e1d80ba6c7721dc81d97ec318/coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0", size = 245108, upload_time = "2025-09-21T20:01:10.527Z" }, { url = "https://files.pythonhosted.org/packages/c8/50/4aea0556da7a4b93ec9168420d170b55e2eb50ae21b25062513d020c6861/coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13", size = 245752, upload_time = "2025-09-21T20:01:11.857Z" }, { url = "https://files.pythonhosted.org/packages/6a/28/ea1a84a60828177ae3b100cb6723838523369a44ec5742313ed7db3da160/coverage-7.10.7-cp310-cp310-win32.whl", hash = "sha256:b51dcd060f18c19290d9b8a9dd1e0181538df2ce0717f562fff6cf74d9fc0b5b", size = 220497, upload_time = "2025-09-21T20:01:13.459Z" }, { url = "https://files.pythonhosted.org/packages/fc/1a/a81d46bbeb3c3fd97b9602ebaa411e076219a150489bcc2c025f151bd52d/coverage-7.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:3a622ac801b17198020f09af3eaf45666b344a0d69fc2a6ffe2ea83aeef1d807", size = 221392, upload_time = "2025-09-21T20:01:14.722Z" }, { url = "https://files.pythonhosted.org/packages/d2/5d/c1a17867b0456f2e9ce2d8d4708a4c3a089947d0bec9c66cdf60c9e7739f/coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59", size = 218102, upload_time = "2025-09-21T20:01:16.089Z" }, { url = "https://files.pythonhosted.org/packages/54/f0/514dcf4b4e3698b9a9077f084429681bf3aad2b4a72578f89d7f643eb506/coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a", size = 218505, upload_time = "2025-09-21T20:01:17.788Z" }, { url = "https://files.pythonhosted.org/packages/20/f6/9626b81d17e2a4b25c63ac1b425ff307ecdeef03d67c9a147673ae40dc36/coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699", size = 248898, upload_time = "2025-09-21T20:01:19.488Z" }, { url = "https://files.pythonhosted.org/packages/b0/ef/bd8e719c2f7417ba03239052e099b76ea1130ac0cbb183ee1fcaa58aaff3/coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d", size = 250831, upload_time = "2025-09-21T20:01:20.817Z" }, { url = "https://files.pythonhosted.org/packages/a5/b6/bf054de41ec948b151ae2b79a55c107f5760979538f5fb80c195f2517718/coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e", size = 252937, upload_time = "2025-09-21T20:01:22.171Z" }, { url = "https://files.pythonhosted.org/packages/0f/e5/3860756aa6f9318227443c6ce4ed7bf9e70bb7f1447a0353f45ac5c7974b/coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23", size = 249021, upload_time = "2025-09-21T20:01:23.907Z" }, { url = "https://files.pythonhosted.org/packages/26/0f/bd08bd042854f7fd07b45808927ebcce99a7ed0f2f412d11629883517ac2/coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab", size = 250626, upload_time = "2025-09-21T20:01:25.721Z" }, { url = "https://files.pythonhosted.org/packages/8e/a7/4777b14de4abcc2e80c6b1d430f5d51eb18ed1d75fca56cbce5f2db9b36e/coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82", size = 248682, upload_time = "2025-09-21T20:01:27.105Z" }, { url = "https://files.pythonhosted.org/packages/34/72/17d082b00b53cd45679bad682fac058b87f011fd8b9fe31d77f5f8d3a4e4/coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2", size = 248402, upload_time = "2025-09-21T20:01:28.629Z" }, { url = "https://files.pythonhosted.org/packages/81/7a/92367572eb5bdd6a84bfa278cc7e97db192f9f45b28c94a9ca1a921c3577/coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61", size = 249320, upload_time = "2025-09-21T20:01:30.004Z" }, { url = "https://files.pythonhosted.org/packages/2f/88/a23cc185f6a805dfc4fdf14a94016835eeb85e22ac3a0e66d5e89acd6462/coverage-7.10.7-cp311-cp311-win32.whl", hash = "sha256:972b9e3a4094b053a4e46832b4bc829fc8a8d347160eb39d03f1690316a99c14", size = 220536, upload_time = "2025-09-21T20:01:32.184Z" }, { url = "https://files.pythonhosted.org/packages/fe/ef/0b510a399dfca17cec7bc2f05ad8bd78cf55f15c8bc9a73ab20c5c913c2e/coverage-7.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:a7b55a944a7f43892e28ad4bc0561dfd5f0d73e605d1aa5c3c976b52aea121d2", size = 221425, upload_time = "2025-09-21T20:01:33.557Z" }, { url = "https://files.pythonhosted.org/packages/51/7f/023657f301a276e4ba1850f82749bc136f5a7e8768060c2e5d9744a22951/coverage-7.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:736f227fb490f03c6488f9b6d45855f8e0fd749c007f9303ad30efab0e73c05a", size = 220103, upload_time = "2025-09-21T20:01:34.929Z" }, { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload_time = "2025-09-21T20:01:36.455Z" }, { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload_time = "2025-09-21T20:01:37.982Z" }, { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload_time = "2025-09-21T20:01:39.617Z" }, { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload_time = "2025-09-21T20:01:41.341Z" }, { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload_time = "2025-09-21T20:01:43.042Z" }, { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload_time = "2025-09-21T20:01:44.469Z" }, { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload_time = "2025-09-21T20:01:45.915Z" }, { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload_time = "2025-09-21T20:01:47.296Z" }, { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload_time = "2025-09-21T20:01:48.73Z" }, { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload_time = "2025-09-21T20:01:50.529Z" }, { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload_time = "2025-09-21T20:01:51.941Z" }, { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload_time = "2025-09-21T20:01:53.481Z" }, { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload_time = "2025-09-21T20:01:55.2Z" }, { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload_time = "2025-09-21T20:01:56.629Z" }, { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload_time = "2025-09-21T20:01:58.203Z" }, { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload_time = "2025-09-21T20:01:59.748Z" }, { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload_time = "2025-09-21T20:02:01.192Z" }, { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload_time = "2025-09-21T20:02:02.701Z" }, { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload_time = "2025-09-21T20:02:04.185Z" }, { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload_time = "2025-09-21T20:02:06.034Z" }, { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload_time = "2025-09-21T20:02:07.619Z" }, { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload_time = "2025-09-21T20:02:10.34Z" }, { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload_time = "2025-09-21T20:02:12.122Z" }, { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload_time = "2025-09-21T20:02:13.919Z" }, { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload_time = "2025-09-21T20:02:15.57Z" }, { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload_time = "2025-09-21T20:02:17.395Z" }, { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload_time = "2025-09-21T20:02:18.936Z" }, { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload_time = "2025-09-21T20:02:20.44Z" }, { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload_time = "2025-09-21T20:02:22.313Z" }, { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload_time = "2025-09-21T20:02:24.287Z" }, { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload_time = "2025-09-21T20:02:26.133Z" }, { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload_time = "2025-09-21T20:02:27.716Z" }, { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload_time = "2025-09-21T20:02:29.216Z" }, { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload_time = "2025-09-21T20:02:31.226Z" }, { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload_time = "2025-09-21T20:02:32.823Z" }, { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload_time = "2025-09-21T20:02:34.86Z" }, { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload_time = "2025-09-21T20:02:37.034Z" }, { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload_time = "2025-09-21T20:02:39.011Z" }, { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload_time = "2025-09-21T20:02:40.939Z" }, { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload_time = "2025-09-21T20:02:42.527Z" }, { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload_time = "2025-09-21T20:02:44.468Z" }, { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload_time = "2025-09-21T20:02:46.503Z" }, { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload_time = "2025-09-21T20:02:48.689Z" }, { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload_time = "2025-09-21T20:02:50.31Z" }, { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload_time = "2025-09-21T20:02:51.971Z" }, { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload_time = "2025-09-21T20:02:53.858Z" }, { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload_time = "2025-09-21T20:02:55.807Z" }, { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload_time = "2025-09-21T20:02:57.784Z" }, { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload_time = "2025-09-21T20:02:59.431Z" }, { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload_time = "2025-09-21T20:03:01.324Z" }, { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload_time = "2025-09-21T20:03:03.4Z" }, { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload_time = "2025-09-21T20:03:05.111Z" }, { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload_time = "2025-09-21T20:03:06.795Z" }, { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload_time = "2025-09-21T20:03:08.495Z" }, { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload_time = "2025-09-21T20:03:10.172Z" }, { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload_time = "2025-09-21T20:03:11.861Z" }, { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload_time = "2025-09-21T20:03:13.539Z" }, { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload_time = "2025-09-21T20:03:15.584Z" }, { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload_time = "2025-09-21T20:03:17.673Z" }, { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload_time = "2025-09-21T20:03:19.36Z" }, { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload_time = "2025-09-21T20:03:21.007Z" }, { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload_time = "2025-09-21T20:03:23.12Z" }, { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload_time = "2025-09-21T20:03:24.769Z" }, { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload_time = "2025-09-21T20:03:26.93Z" }, { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload_time = "2025-09-21T20:03:28.672Z" }, { url = "https://files.pythonhosted.org/packages/a3/ad/d1c25053764b4c42eb294aae92ab617d2e4f803397f9c7c8295caa77a260/coverage-7.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3", size = 217978, upload_time = "2025-09-21T20:03:30.362Z" }, { url = "https://files.pythonhosted.org/packages/52/2f/b9f9daa39b80ece0b9548bbb723381e29bc664822d9a12c2135f8922c22b/coverage-7.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc91b314cef27742da486d6839b677b3f2793dfe52b51bbbb7cf736d5c29281c", size = 218370, upload_time = "2025-09-21T20:03:32.147Z" }, { url = "https://files.pythonhosted.org/packages/dd/6e/30d006c3b469e58449650642383dddf1c8fb63d44fdf92994bfd46570695/coverage-7.10.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:567f5c155eda8df1d3d439d40a45a6a5f029b429b06648235f1e7e51b522b396", size = 244802, upload_time = "2025-09-21T20:03:33.919Z" }, { url = "https://files.pythonhosted.org/packages/b0/49/8a070782ce7e6b94ff6a0b6d7c65ba6bc3091d92a92cef4cd4eb0767965c/coverage-7.10.7-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af88deffcc8a4d5974cf2d502251bc3b2db8461f0b66d80a449c33757aa9f40", size = 246625, upload_time = "2025-09-21T20:03:36.09Z" }, { url = "https://files.pythonhosted.org/packages/6a/92/1c1c5a9e8677ce56d42b97bdaca337b2d4d9ebe703d8c174ede52dbabd5f/coverage-7.10.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7315339eae3b24c2d2fa1ed7d7a38654cba34a13ef19fbcb9425da46d3dc594", size = 248399, upload_time = "2025-09-21T20:03:38.342Z" }, { url = "https://files.pythonhosted.org/packages/c0/54/b140edee7257e815de7426d5d9846b58505dffc29795fff2dfb7f8a1c5a0/coverage-7.10.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:912e6ebc7a6e4adfdbb1aec371ad04c68854cd3bf3608b3514e7ff9062931d8a", size = 245142, upload_time = "2025-09-21T20:03:40.591Z" }, { url = "https://files.pythonhosted.org/packages/e4/9e/6d6b8295940b118e8b7083b29226c71f6154f7ff41e9ca431f03de2eac0d/coverage-7.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f49a05acd3dfe1ce9715b657e28d138578bc40126760efb962322c56e9ca344b", size = 246284, upload_time = "2025-09-21T20:03:42.355Z" }, { url = "https://files.pythonhosted.org/packages/db/e5/5e957ca747d43dbe4d9714358375c7546cb3cb533007b6813fc20fce37ad/coverage-7.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cce2109b6219f22ece99db7644b9622f54a4e915dad65660ec435e89a3ea7cc3", size = 244353, upload_time = "2025-09-21T20:03:44.218Z" }, { url = "https://files.pythonhosted.org/packages/9a/45/540fc5cc92536a1b783b7ef99450bd55a4b3af234aae35a18a339973ce30/coverage-7.10.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:f3c887f96407cea3916294046fc7dab611c2552beadbed4ea901cbc6a40cc7a0", size = 244430, upload_time = "2025-09-21T20:03:46.065Z" }, { url = "https://files.pythonhosted.org/packages/75/0b/8287b2e5b38c8fe15d7e3398849bb58d382aedc0864ea0fa1820e8630491/coverage-7.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:635adb9a4507c9fd2ed65f39693fa31c9a3ee3a8e6dc64df033e8fdf52a7003f", size = 245311, upload_time = "2025-09-21T20:03:48.19Z" }, { url = "https://files.pythonhosted.org/packages/0c/1d/29724999984740f0c86d03e6420b942439bf5bd7f54d4382cae386a9d1e9/coverage-7.10.7-cp39-cp39-win32.whl", hash = "sha256:5a02d5a850e2979b0a014c412573953995174743a3f7fa4ea5a6e9a3c5617431", size = 220500, upload_time = "2025-09-21T20:03:50.024Z" }, { url = "https://files.pythonhosted.org/packages/43/11/4b1e6b129943f905ca54c339f343877b55b365ae2558806c1be4f7476ed5/coverage-7.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:c134869d5ffe34547d14e174c866fd8fe2254918cc0a95e99052903bc1543e07", size = 221408, upload_time = "2025-09-21T20:03:51.803Z" }, { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload_time = "2025-09-21T20:03:53.918Z" }, ] [package.optional-dependencies] toml = [ { name = "tomli", marker = "python_full_version < '3.10'" }, ] [[package]] name = "coverage" version = "7.13.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/b6/45/2c665ca77ec32ad67e25c77daf1cee28ee4558f3bc571cdbaf88a00b9f23/coverage-7.13.0.tar.gz", hash = "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936", size = 820905, upload_time = "2025-12-08T13:14:38.055Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/db/08/bdd7ccca14096f7eb01412b87ac11e5d16e4cb54b6e328afc9dee8bdaec1/coverage-7.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070", size = 217979, upload_time = "2025-12-08T13:12:14.505Z" }, { url = "https://files.pythonhosted.org/packages/fa/f0/d1302e3416298a28b5663ae1117546a745d9d19fde7e28402b2c5c3e2109/coverage-7.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98", size = 218496, upload_time = "2025-12-08T13:12:16.237Z" }, { url = "https://files.pythonhosted.org/packages/07/26/d36c354c8b2a320819afcea6bffe72839efd004b98d1d166b90801d49d57/coverage-7.13.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5", size = 245237, upload_time = "2025-12-08T13:12:17.858Z" }, { url = "https://files.pythonhosted.org/packages/91/52/be5e85631e0eec547873d8b08dd67a5f6b111ecfe89a86e40b89b0c1c61c/coverage-7.13.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e", size = 247061, upload_time = "2025-12-08T13:12:19.132Z" }, { url = "https://files.pythonhosted.org/packages/0f/45/a5e8fa0caf05fbd8fa0402470377bff09cc1f026d21c05c71e01295e55ab/coverage-7.13.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33", size = 248928, upload_time = "2025-12-08T13:12:20.702Z" }, { url = "https://files.pythonhosted.org/packages/f5/42/ffb5069b6fd1b95fae482e02f3fecf380d437dd5a39bae09f16d2e2e7e01/coverage-7.13.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791", size = 245931, upload_time = "2025-12-08T13:12:22.243Z" }, { url = "https://files.pythonhosted.org/packages/95/6e/73e809b882c2858f13e55c0c36e94e09ce07e6165d5644588f9517efe333/coverage-7.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032", size = 246968, upload_time = "2025-12-08T13:12:23.52Z" }, { url = "https://files.pythonhosted.org/packages/87/08/64ebd9e64b6adb8b4a4662133d706fbaccecab972e0b3ccc23f64e2678ad/coverage-7.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9", size = 244972, upload_time = "2025-12-08T13:12:24.781Z" }, { url = "https://files.pythonhosted.org/packages/12/97/f4d27c6fe0cb375a5eced4aabcaef22de74766fb80a3d5d2015139e54b22/coverage-7.13.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f", size = 245241, upload_time = "2025-12-08T13:12:28.041Z" }, { url = "https://files.pythonhosted.org/packages/0c/94/42f8ae7f633bf4c118bf1038d80472f9dade88961a466f290b81250f7ab7/coverage-7.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8", size = 245847, upload_time = "2025-12-08T13:12:29.337Z" }, { url = "https://files.pythonhosted.org/packages/a8/2f/6369ca22b6b6d933f4f4d27765d313d8914cc4cce84f82a16436b1a233db/coverage-7.13.0-cp310-cp310-win32.whl", hash = "sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f", size = 220573, upload_time = "2025-12-08T13:12:30.905Z" }, { url = "https://files.pythonhosted.org/packages/f1/dc/a6a741e519acceaeccc70a7f4cfe5d030efc4b222595f0677e101af6f1f3/coverage-7.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303", size = 221509, upload_time = "2025-12-08T13:12:32.09Z" }, { url = "https://files.pythonhosted.org/packages/f1/dc/888bf90d8b1c3d0b4020a40e52b9f80957d75785931ec66c7dfaccc11c7d/coverage-7.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820", size = 218104, upload_time = "2025-12-08T13:12:33.333Z" }, { url = "https://files.pythonhosted.org/packages/8d/ea/069d51372ad9c380214e86717e40d1a743713a2af191cfba30a0911b0a4a/coverage-7.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f", size = 218606, upload_time = "2025-12-08T13:12:34.498Z" }, { url = "https://files.pythonhosted.org/packages/68/09/77b1c3a66c2aa91141b6c4471af98e5b1ed9b9e6d17255da5eb7992299e3/coverage-7.13.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96", size = 248999, upload_time = "2025-12-08T13:12:36.02Z" }, { url = "https://files.pythonhosted.org/packages/0a/32/2e2f96e9d5691eaf1181d9040f850b8b7ce165ea10810fd8e2afa534cef7/coverage-7.13.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259", size = 250925, upload_time = "2025-12-08T13:12:37.221Z" }, { url = "https://files.pythonhosted.org/packages/7b/45/b88ddac1d7978859b9a39a8a50ab323186148f1d64bc068f86fc77706321/coverage-7.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb", size = 253032, upload_time = "2025-12-08T13:12:38.763Z" }, { url = "https://files.pythonhosted.org/packages/71/cb/e15513f94c69d4820a34b6bf3d2b1f9f8755fa6021be97c7065442d7d653/coverage-7.13.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9", size = 249134, upload_time = "2025-12-08T13:12:40.382Z" }, { url = "https://files.pythonhosted.org/packages/09/61/d960ff7dc9e902af3310ce632a875aaa7860f36d2bc8fc8b37ee7c1b82a5/coverage-7.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030", size = 250731, upload_time = "2025-12-08T13:12:41.992Z" }, { url = "https://files.pythonhosted.org/packages/98/34/c7c72821794afc7c7c2da1db8f00c2c98353078aa7fb6b5ff36aac834b52/coverage-7.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833", size = 248795, upload_time = "2025-12-08T13:12:43.331Z" }, { url = "https://files.pythonhosted.org/packages/0a/5b/e0f07107987a43b2def9aa041c614ddb38064cbf294a71ef8c67d43a0cdd/coverage-7.13.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8", size = 248514, upload_time = "2025-12-08T13:12:44.546Z" }, { url = "https://files.pythonhosted.org/packages/71/c2/c949c5d3b5e9fc6dd79e1b73cdb86a59ef14f3709b1d72bf7668ae12e000/coverage-7.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753", size = 249424, upload_time = "2025-12-08T13:12:45.759Z" }, { url = "https://files.pythonhosted.org/packages/11/f1/bbc009abd6537cec0dffb2cc08c17a7f03de74c970e6302db4342a6e05af/coverage-7.13.0-cp311-cp311-win32.whl", hash = "sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b", size = 220597, upload_time = "2025-12-08T13:12:47.378Z" }, { url = "https://files.pythonhosted.org/packages/c4/f6/d9977f2fb51c10fbaed0718ce3d0a8541185290b981f73b1d27276c12d91/coverage-7.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe", size = 221536, upload_time = "2025-12-08T13:12:48.7Z" }, { url = "https://files.pythonhosted.org/packages/be/ad/3fcf43fd96fb43e337a3073dea63ff148dcc5c41ba7a14d4c7d34efb2216/coverage-7.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7", size = 220206, upload_time = "2025-12-08T13:12:50.365Z" }, { url = "https://files.pythonhosted.org/packages/9b/f1/2619559f17f31ba00fc40908efd1fbf1d0a5536eb75dc8341e7d660a08de/coverage-7.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf", size = 218274, upload_time = "2025-12-08T13:12:52.095Z" }, { url = "https://files.pythonhosted.org/packages/2b/11/30d71ae5d6e949ff93b2a79a2c1b4822e00423116c5c6edfaeef37301396/coverage-7.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f", size = 218638, upload_time = "2025-12-08T13:12:53.418Z" }, { url = "https://files.pythonhosted.org/packages/79/c2/fce80fc6ded8d77e53207489d6065d0fed75db8951457f9213776615e0f5/coverage-7.13.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb", size = 250129, upload_time = "2025-12-08T13:12:54.744Z" }, { url = "https://files.pythonhosted.org/packages/5b/b6/51b5d1eb6fcbb9a1d5d6984e26cbe09018475c2922d554fd724dd0f056ee/coverage-7.13.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621", size = 252885, upload_time = "2025-12-08T13:12:56.401Z" }, { url = "https://files.pythonhosted.org/packages/0d/f8/972a5affea41de798691ab15d023d3530f9f56a72e12e243f35031846ff7/coverage-7.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74", size = 253974, upload_time = "2025-12-08T13:12:57.718Z" }, { url = "https://files.pythonhosted.org/packages/8a/56/116513aee860b2c7968aa3506b0f59b22a959261d1dbf3aea7b4450a7520/coverage-7.13.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57", size = 250538, upload_time = "2025-12-08T13:12:59.254Z" }, { url = "https://files.pythonhosted.org/packages/d6/75/074476d64248fbadf16dfafbf93fdcede389ec821f74ca858d7c87d2a98c/coverage-7.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8", size = 251912, upload_time = "2025-12-08T13:13:00.604Z" }, { url = "https://files.pythonhosted.org/packages/f2/d2/aa4f8acd1f7c06024705c12609d8698c51b27e4d635d717cd1934c9668e2/coverage-7.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d", size = 250054, upload_time = "2025-12-08T13:13:01.892Z" }, { url = "https://files.pythonhosted.org/packages/19/98/8df9e1af6a493b03694a1e8070e024e7d2cdc77adedc225a35e616d505de/coverage-7.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b", size = 249619, upload_time = "2025-12-08T13:13:03.236Z" }, { url = "https://files.pythonhosted.org/packages/d8/71/f8679231f3353018ca66ef647fa6fe7b77e6bff7845be54ab84f86233363/coverage-7.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd", size = 251496, upload_time = "2025-12-08T13:13:04.511Z" }, { url = "https://files.pythonhosted.org/packages/04/86/9cb406388034eaf3c606c22094edbbb82eea1fa9d20c0e9efadff20d0733/coverage-7.13.0-cp312-cp312-win32.whl", hash = "sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef", size = 220808, upload_time = "2025-12-08T13:13:06.422Z" }, { url = "https://files.pythonhosted.org/packages/1c/59/af483673df6455795daf5f447c2f81a3d2fcfc893a22b8ace983791f6f34/coverage-7.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae", size = 221616, upload_time = "2025-12-08T13:13:07.95Z" }, { url = "https://files.pythonhosted.org/packages/64/b0/959d582572b30a6830398c60dd419c1965ca4b5fb38ac6b7093a0d50ca8d/coverage-7.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080", size = 220261, upload_time = "2025-12-08T13:13:09.581Z" }, { url = "https://files.pythonhosted.org/packages/7c/cc/bce226595eb3bf7d13ccffe154c3c487a22222d87ff018525ab4dd2e9542/coverage-7.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf", size = 218297, upload_time = "2025-12-08T13:13:10.977Z" }, { url = "https://files.pythonhosted.org/packages/3b/9f/73c4d34600aae03447dff3d7ad1d0ac649856bfb87d1ca7d681cfc913f9e/coverage-7.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a", size = 218673, upload_time = "2025-12-08T13:13:12.562Z" }, { url = "https://files.pythonhosted.org/packages/63/ab/8fa097db361a1e8586535ae5073559e6229596b3489ec3ef2f5b38df8cb2/coverage-7.13.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74", size = 249652, upload_time = "2025-12-08T13:13:13.909Z" }, { url = "https://files.pythonhosted.org/packages/90/3a/9bfd4de2ff191feb37ef9465855ca56a6f2f30a3bca172e474130731ac3d/coverage-7.13.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6", size = 252251, upload_time = "2025-12-08T13:13:15.553Z" }, { url = "https://files.pythonhosted.org/packages/df/61/b5d8105f016e1b5874af0d7c67542da780ccd4a5f2244a433d3e20ceb1ad/coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b", size = 253492, upload_time = "2025-12-08T13:13:16.849Z" }, { url = "https://files.pythonhosted.org/packages/f3/b8/0fad449981803cc47a4694768b99823fb23632150743f9c83af329bb6090/coverage-7.13.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232", size = 249850, upload_time = "2025-12-08T13:13:18.142Z" }, { url = "https://files.pythonhosted.org/packages/9a/e9/8d68337c3125014d918cf4327d5257553a710a2995a6a6de2ac77e5aa429/coverage-7.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971", size = 251633, upload_time = "2025-12-08T13:13:19.56Z" }, { url = "https://files.pythonhosted.org/packages/55/14/d4112ab26b3a1bc4b3c1295d8452dcf399ed25be4cf649002fb3e64b2d93/coverage-7.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d", size = 249586, upload_time = "2025-12-08T13:13:20.883Z" }, { url = "https://files.pythonhosted.org/packages/2c/a9/22b0000186db663b0d82f86c2f1028099ae9ac202491685051e2a11a5218/coverage-7.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137", size = 249412, upload_time = "2025-12-08T13:13:22.22Z" }, { url = "https://files.pythonhosted.org/packages/a1/2e/42d8e0d9e7527fba439acdc6ed24a2b97613b1dc85849b1dd935c2cffef0/coverage-7.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511", size = 251191, upload_time = "2025-12-08T13:13:23.899Z" }, { url = "https://files.pythonhosted.org/packages/a4/af/8c7af92b1377fd8860536aadd58745119252aaaa71a5213e5a8e8007a9f5/coverage-7.13.0-cp313-cp313-win32.whl", hash = "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1", size = 220829, upload_time = "2025-12-08T13:13:25.182Z" }, { url = "https://files.pythonhosted.org/packages/58/f9/725e8bf16f343d33cbe076c75dc8370262e194ff10072c0608b8e5cf33a3/coverage-7.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a", size = 221640, upload_time = "2025-12-08T13:13:26.836Z" }, { url = "https://files.pythonhosted.org/packages/8a/ff/e98311000aa6933cc79274e2b6b94a2fe0fe3434fca778eba82003675496/coverage-7.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6", size = 220269, upload_time = "2025-12-08T13:13:28.116Z" }, { url = "https://files.pythonhosted.org/packages/cf/cf/bbaa2e1275b300343ea865f7d424cc0a2e2a1df6925a070b2b2d5d765330/coverage-7.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a", size = 218990, upload_time = "2025-12-08T13:13:29.463Z" }, { url = "https://files.pythonhosted.org/packages/21/1d/82f0b3323b3d149d7672e7744c116e9c170f4957e0c42572f0366dbb4477/coverage-7.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8", size = 219340, upload_time = "2025-12-08T13:13:31.524Z" }, { url = "https://files.pythonhosted.org/packages/fb/e3/fe3fd4702a3832a255f4d43013eacb0ef5fc155a5960ea9269d8696db28b/coverage-7.13.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053", size = 260638, upload_time = "2025-12-08T13:13:32.965Z" }, { url = "https://files.pythonhosted.org/packages/ad/01/63186cb000307f2b4da463f72af9b85d380236965574c78e7e27680a2593/coverage-7.13.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071", size = 262705, upload_time = "2025-12-08T13:13:34.378Z" }, { url = "https://files.pythonhosted.org/packages/7c/a1/c0dacef0cc865f2455d59eed3548573ce47ed603205ffd0735d1d78b5906/coverage-7.13.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e", size = 265125, upload_time = "2025-12-08T13:13:35.73Z" }, { url = "https://files.pythonhosted.org/packages/ef/92/82b99223628b61300bd382c205795533bed021505eab6dd86e11fb5d7925/coverage-7.13.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493", size = 259844, upload_time = "2025-12-08T13:13:37.69Z" }, { url = "https://files.pythonhosted.org/packages/cf/2c/89b0291ae4e6cd59ef042708e1c438e2290f8c31959a20055d8768349ee2/coverage-7.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0", size = 262700, upload_time = "2025-12-08T13:13:39.525Z" }, { url = "https://files.pythonhosted.org/packages/bf/f9/a5f992efae1996245e796bae34ceb942b05db275e4b34222a9a40b9fbd3b/coverage-7.13.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e", size = 260321, upload_time = "2025-12-08T13:13:41.172Z" }, { url = "https://files.pythonhosted.org/packages/4c/89/a29f5d98c64fedbe32e2ac3c227fbf78edc01cc7572eee17d61024d89889/coverage-7.13.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c", size = 259222, upload_time = "2025-12-08T13:13:43.282Z" }, { url = "https://files.pythonhosted.org/packages/b3/c3/940fe447aae302a6701ee51e53af7e08b86ff6eed7631e5740c157ee22b9/coverage-7.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e", size = 261411, upload_time = "2025-12-08T13:13:44.72Z" }, { url = "https://files.pythonhosted.org/packages/eb/31/12a4aec689cb942a89129587860ed4d0fd522d5fda81237147fde554b8ae/coverage-7.13.0-cp313-cp313t-win32.whl", hash = "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46", size = 221505, upload_time = "2025-12-08T13:13:46.332Z" }, { url = "https://files.pythonhosted.org/packages/65/8c/3b5fe3259d863572d2b0827642c50c3855d26b3aefe80bdc9eba1f0af3b0/coverage-7.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39", size = 222569, upload_time = "2025-12-08T13:13:47.79Z" }, { url = "https://files.pythonhosted.org/packages/b0/39/f71fa8316a96ac72fc3908839df651e8eccee650001a17f2c78cdb355624/coverage-7.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e", size = 220841, upload_time = "2025-12-08T13:13:49.243Z" }, { url = "https://files.pythonhosted.org/packages/f8/4b/9b54bedda55421449811dcd5263a2798a63f48896c24dfb92b0f1b0845bd/coverage-7.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256", size = 218343, upload_time = "2025-12-08T13:13:50.811Z" }, { url = "https://files.pythonhosted.org/packages/59/df/c3a1f34d4bba2e592c8979f924da4d3d4598b0df2392fbddb7761258e3dc/coverage-7.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a", size = 218672, upload_time = "2025-12-08T13:13:52.284Z" }, { url = "https://files.pythonhosted.org/packages/07/62/eec0659e47857698645ff4e6ad02e30186eb8afd65214fd43f02a76537cb/coverage-7.13.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9", size = 249715, upload_time = "2025-12-08T13:13:53.791Z" }, { url = "https://files.pythonhosted.org/packages/23/2d/3c7ff8b2e0e634c1f58d095f071f52ed3c23ff25be524b0ccae8b71f99f8/coverage-7.13.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19", size = 252225, upload_time = "2025-12-08T13:13:55.274Z" }, { url = "https://files.pythonhosted.org/packages/aa/ac/fb03b469d20e9c9a81093575003f959cf91a4a517b783aab090e4538764b/coverage-7.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be", size = 253559, upload_time = "2025-12-08T13:13:57.161Z" }, { url = "https://files.pythonhosted.org/packages/29/62/14afa9e792383c66cc0a3b872a06ded6e4ed1079c7d35de274f11d27064e/coverage-7.13.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb", size = 249724, upload_time = "2025-12-08T13:13:58.692Z" }, { url = "https://files.pythonhosted.org/packages/31/b7/333f3dab2939070613696ab3ee91738950f0467778c6e5a5052e840646b7/coverage-7.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8", size = 251582, upload_time = "2025-12-08T13:14:00.642Z" }, { url = "https://files.pythonhosted.org/packages/81/cb/69162bda9381f39b2287265d7e29ee770f7c27c19f470164350a38318764/coverage-7.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b", size = 249538, upload_time = "2025-12-08T13:14:02.556Z" }, { url = "https://files.pythonhosted.org/packages/e0/76/350387b56a30f4970abe32b90b2a434f87d29f8b7d4ae40d2e8a85aacfb3/coverage-7.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9", size = 249349, upload_time = "2025-12-08T13:14:04.015Z" }, { url = "https://files.pythonhosted.org/packages/86/0d/7f6c42b8d59f4c7e43ea3059f573c0dcfed98ba46eb43c68c69e52ae095c/coverage-7.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927", size = 251011, upload_time = "2025-12-08T13:14:05.505Z" }, { url = "https://files.pythonhosted.org/packages/d7/f1/4bb2dff379721bb0b5c649d5c5eaf438462cad824acf32eb1b7ca0c7078e/coverage-7.13.0-cp314-cp314-win32.whl", hash = "sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f", size = 221091, upload_time = "2025-12-08T13:14:07.127Z" }, { url = "https://files.pythonhosted.org/packages/ba/44/c239da52f373ce379c194b0ee3bcc121020e397242b85f99e0afc8615066/coverage-7.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc", size = 221904, upload_time = "2025-12-08T13:14:08.542Z" }, { url = "https://files.pythonhosted.org/packages/89/1f/b9f04016d2a29c2e4a0307baefefad1a4ec5724946a2b3e482690486cade/coverage-7.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b", size = 220480, upload_time = "2025-12-08T13:14:10.958Z" }, { url = "https://files.pythonhosted.org/packages/16/d4/364a1439766c8e8647860584171c36010ca3226e6e45b1753b1b249c5161/coverage-7.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28", size = 219074, upload_time = "2025-12-08T13:14:13.345Z" }, { url = "https://files.pythonhosted.org/packages/ce/f4/71ba8be63351e099911051b2089662c03d5671437a0ec2171823c8e03bec/coverage-7.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe", size = 219342, upload_time = "2025-12-08T13:14:15.02Z" }, { url = "https://files.pythonhosted.org/packages/5e/25/127d8ed03d7711a387d96f132589057213e3aef7475afdaa303412463f22/coverage-7.13.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657", size = 260713, upload_time = "2025-12-08T13:14:16.907Z" }, { url = "https://files.pythonhosted.org/packages/fd/db/559fbb6def07d25b2243663b46ba9eb5a3c6586c0c6f4e62980a68f0ee1c/coverage-7.13.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff", size = 262825, upload_time = "2025-12-08T13:14:18.68Z" }, { url = "https://files.pythonhosted.org/packages/37/99/6ee5bf7eff884766edb43bd8736b5e1c5144d0fe47498c3779326fe75a35/coverage-7.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3", size = 265233, upload_time = "2025-12-08T13:14:20.55Z" }, { url = "https://files.pythonhosted.org/packages/d8/90/92f18fe0356ea69e1f98f688ed80cec39f44e9f09a1f26a1bbf017cc67f2/coverage-7.13.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b", size = 259779, upload_time = "2025-12-08T13:14:22.367Z" }, { url = "https://files.pythonhosted.org/packages/90/5d/b312a8b45b37a42ea7d27d7d3ff98ade3a6c892dd48d1d503e773503373f/coverage-7.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d", size = 262700, upload_time = "2025-12-08T13:14:24.309Z" }, { url = "https://files.pythonhosted.org/packages/63/f8/b1d0de5c39351eb71c366f872376d09386640840a2e09b0d03973d791e20/coverage-7.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e", size = 260302, upload_time = "2025-12-08T13:14:26.068Z" }, { url = "https://files.pythonhosted.org/packages/aa/7c/d42f4435bc40c55558b3109a39e2d456cddcec37434f62a1f1230991667a/coverage-7.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940", size = 259136, upload_time = "2025-12-08T13:14:27.604Z" }, { url = "https://files.pythonhosted.org/packages/b8/d3/23413241dc04d47cfe19b9a65b32a2edd67ecd0b817400c2843ebc58c847/coverage-7.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2", size = 261467, upload_time = "2025-12-08T13:14:29.09Z" }, { url = "https://files.pythonhosted.org/packages/13/e6/6e063174500eee216b96272c0d1847bf215926786f85c2bd024cf4d02d2f/coverage-7.13.0-cp314-cp314t-win32.whl", hash = "sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7", size = 221875, upload_time = "2025-12-08T13:14:31.106Z" }, { url = "https://files.pythonhosted.org/packages/3b/46/f4fb293e4cbe3620e3ac2a3e8fd566ed33affb5861a9b20e3dd6c1896cbc/coverage-7.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc", size = 222982, upload_time = "2025-12-08T13:14:33.1Z" }, { url = "https://files.pythonhosted.org/packages/68/62/5b3b9018215ed9733fbd1ae3b2ed75c5de62c3b55377a52cae732e1b7805/coverage-7.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a", size = 221016, upload_time = "2025-12-08T13:14:34.601Z" }, { url = "https://files.pythonhosted.org/packages/8d/4c/1968f32fb9a2604645827e11ff84a31e59d532e01995f904723b4f5328b3/coverage-7.13.0-py3-none-any.whl", hash = "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904", size = 210068, upload_time = "2025-12-08T13:14:36.236Z" }, ] [package.optional-dependencies] toml = [ { name = "tomli", marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, ] [[package]] name = "cryptography" version = "46.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload_time = "2025-10-15T23:18:31.74Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload_time = "2025-10-15T23:16:52.239Z" }, { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload_time = "2025-10-15T23:16:54.369Z" }, { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload_time = "2025-10-15T23:16:56.414Z" }, { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload_time = "2025-10-15T23:16:58.442Z" }, { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload_time = "2025-10-15T23:17:00.378Z" }, { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload_time = "2025-10-15T23:17:01.98Z" }, { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload_time = "2025-10-15T23:17:04.078Z" }, { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload_time = "2025-10-15T23:17:05.483Z" }, { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload_time = "2025-10-15T23:17:07.425Z" }, { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload_time = "2025-10-15T23:17:09.343Z" }, { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload_time = "2025-10-15T23:17:11.22Z" }, { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload_time = "2025-10-15T23:17:12.829Z" }, { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload_time = "2025-10-15T23:17:14.65Z" }, { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload_time = "2025-10-15T23:17:16.142Z" }, { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload_time = "2025-10-15T23:17:18.04Z" }, { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload_time = "2025-10-15T23:17:19.982Z" }, { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload_time = "2025-10-15T23:17:21.527Z" }, { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload_time = "2025-10-15T23:17:23.042Z" }, { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload_time = "2025-10-15T23:17:24.885Z" }, { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload_time = "2025-10-15T23:17:26.449Z" }, { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload_time = "2025-10-15T23:17:28.06Z" }, { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload_time = "2025-10-15T23:17:29.665Z" }, { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload_time = "2025-10-15T23:17:31.686Z" }, { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload_time = "2025-10-15T23:17:33.478Z" }, { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload_time = "2025-10-15T23:17:35.158Z" }, { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload_time = "2025-10-15T23:17:37.188Z" }, { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload_time = "2025-10-15T23:17:39.236Z" }, { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload_time = "2025-10-15T23:17:40.888Z" }, { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload_time = "2025-10-15T23:17:42.769Z" }, { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload_time = "2025-10-15T23:17:44.468Z" }, { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload_time = "2025-10-15T23:17:46.294Z" }, { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload_time = "2025-10-15T23:17:48.269Z" }, { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload_time = "2025-10-15T23:17:49.837Z" }, { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload_time = "2025-10-15T23:17:51.357Z" }, { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload_time = "2025-10-15T23:17:52.964Z" }, { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload_time = "2025-10-15T23:17:54.965Z" }, { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload_time = "2025-10-15T23:17:56.754Z" }, { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload_time = "2025-10-15T23:17:58.588Z" }, { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload_time = "2025-10-15T23:18:00.897Z" }, { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload_time = "2025-10-15T23:18:02.749Z" }, { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload_time = "2025-10-15T23:18:04.85Z" }, { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload_time = "2025-10-15T23:18:06.908Z" }, { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload_time = "2025-10-15T23:18:08.672Z" }, { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload_time = "2025-10-15T23:18:10.632Z" }, { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload_time = "2025-10-15T23:18:12.277Z" }, { url = "https://files.pythonhosted.org/packages/d9/cd/1a8633802d766a0fa46f382a77e096d7e209e0817892929655fe0586ae32/cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32", size = 3689163, upload_time = "2025-10-15T23:18:13.821Z" }, { url = "https://files.pythonhosted.org/packages/4c/59/6b26512964ace6480c3e54681a9859c974172fb141c38df11eadd8416947/cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c", size = 3429474, upload_time = "2025-10-15T23:18:15.477Z" }, { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload_time = "2025-10-15T23:18:17.056Z" }, { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload_time = "2025-10-15T23:18:18.695Z" }, { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload_time = "2025-10-15T23:18:20.597Z" }, { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload_time = "2025-10-15T23:18:22.18Z" }, { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload_time = "2025-10-15T23:18:24.209Z" }, { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload_time = "2025-10-15T23:18:26.227Z" }, ] [[package]] name = "daphne" version = "4.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref" }, { name = "autobahn", version = "24.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "autobahn", version = "25.12.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "twisted", extra = ["tls"] }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/9d/322b605fdc03b963cf2d33943321c8f4405e8d82e698bf49d1eed1ca40c4/daphne-4.2.1.tar.gz", hash = "sha256:5f898e700a1fda7addf1541d7c328606415e96a7bd768405f0463c312fcb31b3", size = 45600, upload_time = "2025-07-02T12:57:04.935Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/01/34/6171ab34715ed210bcd6c2b38839cc792993cff4fe2493f50bc92b0086a0/daphne-4.2.1-py3-none-any.whl", hash = "sha256:881e96b387b95b35ad85acd855f229d7f5b79073d6649089c8a33f661885e055", size = 29015, upload_time = "2025-07-02T12:57:03.793Z" }, ] [[package]] name = "distlib" version = "0.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload_time = "2025-07-17T16:52:00.465Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload_time = "2025-07-17T16:51:58.613Z" }, ] [[package]] name = "docker" version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "requests" }, { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload_time = "2024-05-23T11:13:57.216Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload_time = "2024-05-23T11:13:55.01Z" }, ] [[package]] name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload_time = "2025-11-21T23:01:54.787Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload_time = "2025-11-21T23:01:53.443Z" }, ] [[package]] name = "fastapi" version = "0.124.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, { name = "pydantic" }, { name = "starlette", version = "0.49.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "starlette", version = "0.50.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/21/ade3ff6745a82ea8ad88552b4139d27941549e4f19125879f848ac8f3c3d/fastapi-0.124.4.tar.gz", hash = "sha256:0e9422e8d6b797515f33f500309f6e1c98ee4e85563ba0f2debb282df6343763", size = 378460, upload_time = "2025-12-12T15:00:43.891Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3e/57/aa70121b5008f44031be645a61a7c4abc24e0e888ad3fc8fda916f4d188e/fastapi-0.124.4-py3-none-any.whl", hash = "sha256:6d1e703698443ccb89e50abe4893f3c84d9d6689c0cf1ca4fad6d3c15cf69f15", size = 113281, upload_time = "2025-12-12T15:00:42.44Z" }, ] [[package]] name = "filelock" version = "3.19.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload_time = "2025-08-14T16:56:03.016Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload_time = "2025-08-14T16:56:01.633Z" }, ] [[package]] name = "filelock" version = "3.20.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/a7/23/ce7a1126827cedeb958fc043d61745754464eb56c5937c35bbf2b8e26f34/filelock-3.20.1.tar.gz", hash = "sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c", size = 19476, upload_time = "2025-12-15T23:54:28.027Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl", hash = "sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a", size = 16666, upload_time = "2025-12-15T23:54:26.874Z" }, ] [[package]] name = "granian" version = "2.5.7" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] dependencies = [ { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/db/b1/100c5add0409559ddbbecca5835c17217b7a2e026eff999bfa359a630686/granian-2.5.7.tar.gz", hash = "sha256:4702a7bcc736454803426bd2c4e7a374739ae1e4b11d27bcdc49b691d316fa0c", size = 112206, upload_time = "2025-11-05T12:18:29.258Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e1/6f/7719fc97aa081915024939f0d35fdae57dfd3d7214f7ef4a7fa664abbbc3/granian-2.5.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7d84a254e9c88da874ba349f7892278a871acc391ab6af21cc32f58d27cd50a9", size = 2854526, upload_time = "2025-11-05T12:15:29.721Z" }, { url = "https://files.pythonhosted.org/packages/9f/cd/af33b780602f962c282ba3341131f7ee3b224a6c856a9fb11a017750a48f/granian-2.5.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8857d5a6ed94ea64d6b92d1d5fa8f7c1676bbecd71e6ca3d71fcd7118448af1d", size = 2537151, upload_time = "2025-11-05T12:15:31.659Z" }, { url = "https://files.pythonhosted.org/packages/6d/58/1a0d529d3d3ddc11b2b292b8f2a7566812d8691de7b1fc8ea5c8f36fd81a/granian-2.5.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9914dfc93f04a53a92d8cfdb059c11d620ff83e9326a99880491a9c5bc5940ef", size = 3017277, upload_time = "2025-11-05T12:15:33.42Z" }, { url = "https://files.pythonhosted.org/packages/a4/78/2a3c198ee379392d9998e4ff0cfd9ffa95b2d2c683bd15a7266a09325d43/granian-2.5.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24c972fe009ca3a08fd7fb182e07fcb16bffe49c87b1c3489a6986c9e9248dc1", size = 2859098, upload_time = "2025-11-05T12:15:35.15Z" }, { url = "https://files.pythonhosted.org/packages/6e/44/7b9fba226083170e9ba221b23ab29d7ffcb761b1ef2b6ed6dac2081bc7fe/granian-2.5.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:034df207e62f104d39db479b693e03072c7eb8e202493cdf58948ff83e753cca", size = 3119567, upload_time = "2025-11-05T12:15:36.674Z" }, { url = "https://files.pythonhosted.org/packages/ff/76/f1e348991c031a50d30d3ab0625fec3b7e811092cdb0d1e996885abf1605/granian-2.5.7-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0719052a27caca73bf4000ccdb0339a9d6705e7a4b6613b9fa88ba27c72ba659", size = 2901389, upload_time = "2025-11-05T12:15:39.557Z" }, { url = "https://files.pythonhosted.org/packages/f0/69/71b3d7d90d56fda5617fd98838ac481756ad64f76c1fc1b5e21c43a51f15/granian-2.5.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:be5b9224ec2583ea3b6ca90788b7f59253b6e07fcf817d14c205e6611faaf2be", size = 2989856, upload_time = "2025-11-05T12:15:41.001Z" }, { url = "https://files.pythonhosted.org/packages/74/42/603db3d0ede778adc979c6acc1eaafa5c670c795f5e0e14feb07772ed197/granian-2.5.7-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:ff246af31840369a1d06030f4d291c6a93841f68ee1f836036bce6625ae73b30", size = 3147378, upload_time = "2025-11-05T12:15:42.432Z" }, { url = "https://files.pythonhosted.org/packages/35/b5/cc557e30ba23c2934c33935768dd0233ef7a10b1e8c81dbbc63d5e2562b5/granian-2.5.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf79375e37a63217f9c1dc4ad15200bc5a89860b321ca30d8a5086a6ea1202e4", size = 3210930, upload_time = "2025-11-05T12:15:45.263Z" }, { url = "https://files.pythonhosted.org/packages/c3/67/ba90520cafcd13b5c76d147d713556b9eef877ca001f9ccf44d5443738b6/granian-2.5.7-cp310-cp310-win_amd64.whl", hash = "sha256:b4269a390054c0f71d9ce9d7c75ce2da0c59e78cb522016eb2f5a506c3eb6573", size = 2176887, upload_time = "2025-11-05T12:15:46.615Z" }, { url = "https://files.pythonhosted.org/packages/61/21/da3ade91b49ae99146daac6426701cc25b2c5f1413b6c8cb1cc048877036/granian-2.5.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7aa90dcda1fbf03604e229465380138954d9c000eca2947a94dcfbd765414d32", size = 2854652, upload_time = "2025-11-05T12:15:48.342Z" }, { url = "https://files.pythonhosted.org/packages/76/67/a6fa402ca5ebddebec5d46dacf646ce073872e5251915a725f6abf2a23bb/granian-2.5.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:da4f27323be1188f9e325711016ee108840e14a5971bb4b4d15b65b2d1b00a2d", size = 2537539, upload_time = "2025-11-05T12:15:50.136Z" }, { url = "https://files.pythonhosted.org/packages/f9/70/accb5afd83ef785bd9e32067a13547c51cb0139076a8f2857d6d436773df/granian-2.5.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ca5b7028b6ebafce30419ddb6ee7fbfb236fdd0da89427811324ddd38c7d314", size = 3017554, upload_time = "2025-11-05T12:15:52.962Z" }, { url = "https://files.pythonhosted.org/packages/74/45/98356af5f36af2b6b47a91fef0d326c275e508bf4bcf0c08bd35ed314db8/granian-2.5.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b83e95b18be5dfa92296bc8acfeb353488123399c90cc5f0eccf451e88bc4caf", size = 2859127, upload_time = "2025-11-05T12:15:54.49Z" }, { url = "https://files.pythonhosted.org/packages/27/7a/04d3ec13b197509c40340ec80414fbbc2b0913f6e1a18c3987cc608c8571/granian-2.5.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9aad9e920441232a7b8ad33bef7f04aae986e0e386ab7f13312477c3ea2c85df", size = 3119494, upload_time = "2025-11-05T12:15:56.324Z" }, { url = "https://files.pythonhosted.org/packages/b9/5d/1a82a596725824f6e76b8f7b853ceb464cd0334b2b8143c278aa46f23b6d/granian-2.5.7-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:777d35961d5139d203cf54d872ad5979b171e6496a471a5bcb8032f4471bdec6", size = 2901511, upload_time = "2025-11-05T12:15:58.7Z" }, { url = "https://files.pythonhosted.org/packages/94/45/b53d6d7df5cd35c3b8bb329f5ee1c7b31ead7a61a6f2046f6562028d7e1b/granian-2.5.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ae72c7ba1e8f35d3021dafb2ba6c4ef89f93f877218f8c6ed1cb672145cd81ad", size = 2989828, upload_time = "2025-11-05T12:16:00.341Z" }, { url = "https://files.pythonhosted.org/packages/7f/80/bb57b0fa24fcd518cd64442249459bd214ab1ec5f32590fd30389944261c/granian-2.5.7-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3764d87edd3fddaf557dce32be396a2a56dfc5b9ad2989b1f98952983ae4a21c", size = 3147694, upload_time = "2025-11-05T12:16:01.826Z" }, { url = "https://files.pythonhosted.org/packages/7f/00/f8747aaf8dcd488e4462db89f7273dd9ae702fd17a58d72193b48eff0470/granian-2.5.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5e21bbf1daebb0219253576cac4e5edc8fa8356ad85d66577c4f3ea2d5c6e3c", size = 3211169, upload_time = "2025-11-05T12:16:03.308Z" }, { url = "https://files.pythonhosted.org/packages/1f/69/8593d539898a870692cad447d22c2c4cc34566ad9070040ca216db6ac184/granian-2.5.7-cp311-cp311-win_amd64.whl", hash = "sha256:d210dd98852825c8a49036a6ec23cdfaa7689d1cb12ddc651c6466b412047349", size = 2176921, upload_time = "2025-11-05T12:16:04.63Z" }, { url = "https://files.pythonhosted.org/packages/b5/cf/f76d05e950f76924ffb6c5212561be4dd93fa569518869cc1233a0c77613/granian-2.5.7-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:41e3a293ac23c76d18628d1bd8376ce3230fb3afe3cf71126b8885e8da4e40c4", size = 2850787, upload_time = "2025-11-05T12:16:06.028Z" }, { url = "https://files.pythonhosted.org/packages/3f/d7/6972aa8c38d26b4cf9f35bcc9b7d3a26a3aa930e612d5913d8f4181331a1/granian-2.5.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8b345b539bcbe6dedf8a9323b0c960530cb1fb2cfb887139e6ae9513b6c04d8c", size = 2529552, upload_time = "2025-11-05T12:16:07.389Z" }, { url = "https://files.pythonhosted.org/packages/56/b4/cd5958b6af674a32296a0fef73fb499c2bf2874025062323f5dbc838f4fc/granian-2.5.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12e4d7ba8e3223e2bf974860a59c29b06fa805a98ad4304be4e77180d3a28f55", size = 3009131, upload_time = "2025-11-05T12:16:08.759Z" }, { url = "https://files.pythonhosted.org/packages/7a/69/f3828de736c2802fd7fcac0bb1a0387b3332d432f0eeacb8116094926f06/granian-2.5.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e727d3518f038b64cb0352b34f43b387aafe5eb12b6c4b57ef598b811e40d4ed", size = 2852544, upload_time = "2025-11-05T12:16:10.22Z" }, { url = "https://files.pythonhosted.org/packages/6f/c3/b8c65cf86d473b6e99e6d985c678cb192c9b9776a966a2f4b009696bb650/granian-2.5.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59fe2b352a828a2b04bcfd105e623d66786f217759d2d6245651a7b81e4ac294", size = 3131904, upload_time = "2025-11-05T12:16:13.249Z" }, { url = "https://files.pythonhosted.org/packages/df/7e/b60421bddf187ab2a46682423e4a94b2b22a6ddff6842bf9ca2194e62ac2/granian-2.5.7-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ec5fb593c2d436a323e711010e79718e6d5d1491d0d660fb7c9d97f7e5900830", size = 2908851, upload_time = "2025-11-05T12:16:15.305Z" }, { url = "https://files.pythonhosted.org/packages/2f/cf/3f2426e19dc955a74dc94a5a47c4170e68acb060c541ac080f71a9d55d5d/granian-2.5.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:48fbc25f3717d01e11547afe0e9cdf9d7c41c9f316b9623a40c22ea6b2128d36", size = 2993270, upload_time = "2025-11-05T12:16:17.133Z" }, { url = "https://files.pythonhosted.org/packages/40/2e/67e1e05ee0d503cc6e9fe53b03f69eb2f267a589d7b40873d120c417385f/granian-2.5.7-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:770935fec3374b814d21c01508c0697842d7c3750731a8ea129738b537ac594c", size = 3134662, upload_time = "2025-11-05T12:16:18.598Z" }, { url = "https://files.pythonhosted.org/packages/17/d5/9d3242bbd911434c4f3d4f14c48e73774a8ddb591e0f975eaeeaef1d5081/granian-2.5.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5db2600c92f74da74f624d2fdb01afe9e9365b50bd4e695a78e54961dc132f1b", size = 3220446, upload_time = "2025-11-05T12:16:20.598Z" }, { url = "https://files.pythonhosted.org/packages/10/27/b2baa0443a42d8eb59f3dfbe8186e8c80a090655584af4611f22f1592d7a/granian-2.5.7-cp312-cp312-win_amd64.whl", hash = "sha256:bc368bdeb21646a965adf9f43dd2f4a770647e50318ba1b7cf387d4916ed7e69", size = 2179465, upload_time = "2025-11-05T12:16:22.031Z" }, { url = "https://files.pythonhosted.org/packages/54/ec/bf1b7eefe824630d1d3ae9a8af397d823f2339d3adec71e9ee49d667409c/granian-2.5.7-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:fafb9c17def635bb0a5e20e145601598a6767b879bc2501663dbb45a57d1bc2e", size = 2850581, upload_time = "2025-11-05T12:16:23.516Z" }, { url = "https://files.pythonhosted.org/packages/28/f7/5172daf1968c3a2337c51c50f4a3013aaab564d012d3a79e8390cc66403b/granian-2.5.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9616a197eba637d59242661be8a46127c3f79f7c9bbfa44c0ea8c8c790a11d5e", size = 2529452, upload_time = "2025-11-05T12:16:25.088Z" }, { url = "https://files.pythonhosted.org/packages/92/10/4344ccacc3f8dea973d630306491de43fbd4a0248e3f7cc9ff09ed5cc524/granian-2.5.7-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cfd7a09d5eb00a271ec79e3e0bbf069aa62ce376b64825bdeacb668d2b2a4041", size = 3008798, upload_time = "2025-11-05T12:16:26.584Z" }, { url = "https://files.pythonhosted.org/packages/5e/33/638cf8c7f23ab905d3f6a371b5f87d03fd611678424223a0f1d0f7766cc7/granian-2.5.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1438a82264690fce6e82de66a95c77f5b0a5c33b93269eb85fc69ce0112c12d5", size = 2852309, upload_time = "2025-11-05T12:16:28.064Z" }, { url = "https://files.pythonhosted.org/packages/18/42/6ec25d37ffc1f08679e6b325e9f9ac199ba5def948904c9205cd34fbfe6b/granian-2.5.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3573121da77aac1af64cf90a88f29b2daecbf92458beec187421a382039f366", size = 3131335, upload_time = "2025-11-05T12:16:29.588Z" }, { url = "https://files.pythonhosted.org/packages/b0/1e/db85dac58d84d3e50e427fe5b60b4f8e8a561d9784971fa3b2879198ad88/granian-2.5.7-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:34cdb82024efbcc9de01c7505213be17e4ba5e7a3acabe74ecd93ba31de7673e", size = 2908705, upload_time = "2025-11-05T12:16:31.049Z" }, { url = "https://files.pythonhosted.org/packages/d9/25/a38fd12e1661bbd8535203a8b61240feac7b6b96726bff4de23b0078ab9f/granian-2.5.7-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:572451e94de69df228e4314cb91a50dee1565c4a53d33ffac5936c6ec9c5aba2", size = 2993118, upload_time = "2025-11-05T12:16:32.767Z" }, { url = "https://files.pythonhosted.org/packages/d3/cd/852913a0fc30efc24495453c0f973dd74ef13aa0561afb352afa4b6ecbc2/granian-2.5.7-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6e1679a4b102511b483774397134d244108851ae7a1e8bef09a8ef927ab4d370", size = 3134260, upload_time = "2025-11-05T12:16:34.552Z" }, { url = "https://files.pythonhosted.org/packages/60/64/0dff100ce1e43c700918b39656cc000b1163c144eac3a12563a5f692dcd1/granian-2.5.7-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:285be70dcf3c70121afec03e691596db94bd786f9bebc229e9e0319686857d82", size = 3219987, upload_time = "2025-11-05T12:16:36.43Z" }, { url = "https://files.pythonhosted.org/packages/19/ab/e66cf9bf57800dd7c2a2a4b8f23124603fce561a65a176f4cf3794a85b92/granian-2.5.7-cp313-cp313-win_amd64.whl", hash = "sha256:1273c9b1d38d19bcdd550a9a846d07112e541cfa1f99be04fbb926f2a003df3d", size = 2179201, upload_time = "2025-11-05T12:16:37.869Z" }, { url = "https://files.pythonhosted.org/packages/da/0e/feca4a20e7b9e7de0e58103278c6581ebf3d5c1b972ed1c2dcfd25741f15/granian-2.5.7-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:75b9798bc13baa76e35165e5a778cd58a7258d5a2112ed6ef84ef84874244856", size = 2776744, upload_time = "2025-11-05T12:16:41.969Z" }, { url = "https://files.pythonhosted.org/packages/f7/fe/65ca38ba9b9f4805495d96ed7b774dfd300f7c944f088db39c676c16501e/granian-2.5.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4cb8247728680ca308b7dc41a6d27582b78e15e902377e89000711f1126524dd", size = 2465942, upload_time = "2025-11-05T12:16:43.762Z" }, { url = "https://files.pythonhosted.org/packages/75/d1/b9dea32fbafabe5c7b049fb0209149a37c6b8468c698d066448cbe88dc85/granian-2.5.7-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64348b83f1ad2f7a29df7932dc518ad669cb61a08a9cde02ca8ede8e9b110506", size = 3015413, upload_time = "2025-11-05T12:16:45.265Z" }, { url = "https://files.pythonhosted.org/packages/cb/9e/d29485ab18896e4d911e33b006af7a9b7098316a78938d6b7455c523fea5/granian-2.5.7-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:e2292d4a4661c79d471fa0ff6fe640018c923b6a6dd1bb5383b368b3d5ec2a0c", size = 2783371, upload_time = "2025-11-05T12:16:46.762Z" }, { url = "https://files.pythonhosted.org/packages/41/cd/58c67dc191caeecbbb15ee39d433136dd064c13778b4551661bd902b5a78/granian-2.5.7-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:45903d2f2f88a9cd4a7d0b8ec329db1fb2d9e15bf38153087a3b217b9cdb0046", size = 2979946, upload_time = "2025-11-05T12:16:48.255Z" }, { url = "https://files.pythonhosted.org/packages/16/0b/04e4977df3ef7607a8b6625caed7cac107a049120d2452c33392d4544875/granian-2.5.7-cp313-cp313t-musllinux_1_1_armv7l.whl", hash = "sha256:106e8988e42e527c18b763be5faae7e8f602caac6cb93657793638fc9ab41c98", size = 3123177, upload_time = "2025-11-05T12:16:49.724Z" }, { url = "https://files.pythonhosted.org/packages/c7/89/4e10e18fc107e5929143a06d9257646963cf5621c928b3d2774e5a85652a/granian-2.5.7-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:711632e602c4ea08b827bf6095c2c6fbe6005c7a05f142ae2b4d9e1d45cefbd9", size = 3211773, upload_time = "2025-11-05T12:16:51.438Z" }, { url = "https://files.pythonhosted.org/packages/57/81/94e416056d8b4b1cd09cc8065a1e240b0af99f21301c209571530cd83dd0/granian-2.5.7-cp313-cp313t-win_amd64.whl", hash = "sha256:1c571733aa0fdb6755be9ffb3cd728ef965ae565ba896e407d6019bad929d7bb", size = 2174154, upload_time = "2025-11-05T12:16:53.411Z" }, { url = "https://files.pythonhosted.org/packages/63/89/207ebcbd084ed992ecb3739376fd292e6a5bf6ae80b35f06e4f382e1f193/granian-2.5.7-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:74ad35feeafc12efdc27d59a393f8b95235095c4e46c8b8dd6d50ee9e928118d", size = 2834664, upload_time = "2025-11-05T12:16:54.921Z" }, { url = "https://files.pythonhosted.org/packages/8a/4b/f941c645d5e3ab495f0cb056abebdb16fb761f713c35a830521f4531674b/granian-2.5.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:875f5cc36b960039bfc99a37af32ad98b3abe753a6de92a9f91268c16bfeb192", size = 2510662, upload_time = "2025-11-05T12:16:56.366Z" }, { url = "https://files.pythonhosted.org/packages/de/14/af9bbf26389f6d0cbdd7445cc969da50965363b2c9635acdae08eb4f2d9b/granian-2.5.7-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:478123ee817f742a6f67050ae4de46bc807c874e397a379cf9fb9ed68b66d7ad", size = 3003249, upload_time = "2025-11-05T12:16:58.015Z" }, { url = "https://files.pythonhosted.org/packages/08/0e/4fa5d4317ff88eab5d061cb45339fdf09a044ae9c7b2496b81c2de5bc2c6/granian-2.5.7-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d0d0530960250ac9b78494999f2687c627ac5060013e4c63856afb493c2518", size = 2844121, upload_time = "2025-11-05T12:16:59.679Z" }, { url = "https://files.pythonhosted.org/packages/0c/05/977fcfe66c9ecd72da47e5185bcd78150efcb5d3bca1ba77860fe8f7bad7/granian-2.5.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cf8cb02253bfc42ee1bb6c5912507f83bea0a39c3d8a09988939407e08787b", size = 3125524, upload_time = "2025-11-05T12:17:02.244Z" }, { url = "https://files.pythonhosted.org/packages/01/c0/fd4d0b455d34c493cfbc6f450e0005206ab41a68f65f16f89e9ae84669ed/granian-2.5.7-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:78015fcb4d055e0eb2454d07f167ca2aa9f48609f90484750b99ca9b719701c4", size = 2902047, upload_time = "2025-11-05T12:17:04.162Z" }, { url = "https://files.pythonhosted.org/packages/ce/55/13d53add16a349b5c9384afac14b519a54b7fa4bf73540338296f0963ee7/granian-2.5.7-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bd254e68cc8471b725aa6610b68a5e004aa92b8db53c0d01c408bef8bc9cdcb4", size = 2988366, upload_time = "2025-11-05T12:17:05.806Z" }, { url = "https://files.pythonhosted.org/packages/24/b3/addad51cef2472105b664b608a2b8eccc5691d08c532862cd21b52023661/granian-2.5.7-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:028480ddef683df00064664e7bf58358650722dfa40c2a6dcbf50b3d1996dbb0", size = 3128826, upload_time = "2025-11-05T12:17:07.346Z" }, { url = "https://files.pythonhosted.org/packages/d3/2c/ceab57671c7ade9305ed9e86471507b7721e92435509bb3ecab7e1c28fa8/granian-2.5.7-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b42a254b2884b3060dcafc49dee477f3f6e8c63c567f179dbec7853d6739f124", size = 3212960, upload_time = "2025-11-05T12:17:09.045Z" }, { url = "https://files.pythonhosted.org/packages/a7/5b/5458d995ed5a1fe4a7aa1e2587f550c00ec80d373531e270080e4d5e1ca5/granian-2.5.7-cp314-cp314-win_amd64.whl", hash = "sha256:8f6466077c76d92f8926885280166e6874640bbab11ce10c4a3b04c0ee182ac6", size = 2168248, upload_time = "2025-11-05T12:17:10.47Z" }, { url = "https://files.pythonhosted.org/packages/e2/6d/3c6fdf84e9de25e0023302d5efd98d70fd6147cae98453591a317539bba6/granian-2.5.7-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:6fc06ac1c147e2f01639aa5c7c0f9553f8c6b283665d13d5527a051e917db150", size = 2763007, upload_time = "2025-11-05T12:17:12Z" }, { url = "https://files.pythonhosted.org/packages/23/92/3fc35058908d1ecb3cb556de729e6f5853e888ac7022a141885f6a3079a5/granian-2.5.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dec92e09f512aaf532bb75de69b858958113efe52b16a9c5ef19d64063b4956c", size = 2448084, upload_time = "2025-11-05T12:17:13.74Z" }, { url = "https://files.pythonhosted.org/packages/76/82/3fc67aa247dcac09c948ae8a3dc02568d4eb8135f9938594ee5d2ba25a4f/granian-2.5.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e18c9c63b89370e42d65bc4eccec349d0b676ee69ccbcbbf9bedf606ded129", size = 3008404, upload_time = "2025-11-05T12:17:15.227Z" }, { url = "https://files.pythonhosted.org/packages/97/4c/11f293a60892df7cfdcbb1648ddc31e9d4471b52843e4e838a2a58773fff/granian-2.5.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:035e3b145827a12fb25de5b5122a11d9dad93a943e2251d83ee593b28b0397dc", size = 2781744, upload_time = "2025-11-05T12:17:17.875Z" }, { url = "https://files.pythonhosted.org/packages/42/a0/d4f0063938431201fc7884c7e7bfc5488e3de09957cce37090af9131b7f4/granian-2.5.7-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:21278e2862d7e52996b03260a2a65288c731474c71a6d8311ef78025696b883d", size = 2977678, upload_time = "2025-11-05T12:17:19.706Z" }, { url = "https://files.pythonhosted.org/packages/e6/85/327e15e9e96eb35fcca3fbd9848df6bc180f7fb04c9116e22d3c10ada98e/granian-2.5.7-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:fd6a7645117034753ec91e667316e93f3d0325f79462979af3e2e316278ae235", size = 3116889, upload_time = "2025-11-05T12:17:21.906Z" }, { url = "https://files.pythonhosted.org/packages/78/5c/67224ee8fa71ee3748d931c34cf6f85e30c77b2a3ac0b1ca70c640b37d10/granian-2.5.7-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:133d3453d29c5a22648c879d078d097a4ea74b8f84c530084c32debdfdd9d5fd", size = 3203908, upload_time = "2025-11-05T12:17:23.537Z" }, { url = "https://files.pythonhosted.org/packages/45/e0/df08a75311c8d9505dc4f381a4a21bbfeed58b8c8f6d7c3a34b049ad9c34/granian-2.5.7-cp314-cp314t-win_amd64.whl", hash = "sha256:ab8f0f4f22d2efcce194f5b1d66beef2ba3d4bcd18f9afd6b749afa48fdb9a7d", size = 2161670, upload_time = "2025-11-05T12:17:25.504Z" }, { url = "https://files.pythonhosted.org/packages/7f/4e/ba913bf2a59eb1abcac20fb0d66b2c8bf5a308164390aa5faa90fd3dc72d/granian-2.5.7-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b08380ee9f56b675a3941c8b5ae736ccb4d203eb8f31ed0e9952916356bc892e", size = 2841746, upload_time = "2025-11-05T12:17:27.002Z" }, { url = "https://files.pythonhosted.org/packages/0f/30/539fd99d2765cc4ece3a44638d03b3e9b6e9821570779cb33401223f28cf/granian-2.5.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ba5bb24e9dca6bfb5debe663b02832ef5bd51324c540de0c93d4ee8ceb81943", size = 2538242, upload_time = "2025-11-05T12:17:29.644Z" }, { url = "https://files.pythonhosted.org/packages/4f/57/593b0de66873caf7ebedefb6216beba63dbbef04f61ae21373050b6c2842/granian-2.5.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e1bde6312b7ab7b5a7d35b27fc00e5d1cee4c43ab050fe858e142de27644cd30", size = 3015078, upload_time = "2025-11-05T12:17:31.336Z" }, { url = "https://files.pythonhosted.org/packages/6a/81/551fa6ef3638a7d538cb74e9977a5a12774b880a2a610f794153d601fbbf/granian-2.5.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12192aba3f6d3735d31e93095a120eb8228a403df34261c313f70b40a345a887", size = 2856343, upload_time = "2025-11-05T12:17:33.695Z" }, { url = "https://files.pythonhosted.org/packages/93/9d/eab7f01f37776580dcd440a059b75be4e3a4821c4f58addb038def1e1699/granian-2.5.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4af19315a5e082e4ee3105f44bfc5823e51f9c8b7bdfa51e6edd69c9dd7447a", size = 3119633, upload_time = "2025-11-05T12:17:35.339Z" }, { url = "https://files.pythonhosted.org/packages/fd/dd/c9538a618024d82d9f31c88aed37f8bb627accaf0f5114d757ba4e0b1a1c/granian-2.5.7-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2b010a47f58e82f5813add96f268bdbc8edeca2c6873df4dc4da71f323c3732e", size = 2907212, upload_time = "2025-11-05T12:17:36.934Z" }, { url = "https://files.pythonhosted.org/packages/35/eb/e4e6eaa6481a1254987d9c56e3b9378830ec58b53838af66c9b286105997/granian-2.5.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e5d6041a5ec1e0ff38078a0c2e56286783d473ff6b6f9317c1f86eb312221615", size = 2994547, upload_time = "2025-11-05T12:17:38.738Z" }, { url = "https://files.pythonhosted.org/packages/ff/3e/fb01b9a156addfc1e446c73f0a57cc6d93acdced8e96002d048d202d0533/granian-2.5.7-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4756e13842e380a285be130cb830f1c85b150c534b1924c641419f8a895bbf68", size = 3164801, upload_time = "2025-11-05T12:17:40.749Z" }, { url = "https://files.pythonhosted.org/packages/f5/38/a5dcf87fe0c583baa521bbf467f5ddf86932e151ed5b94921525f9767010/granian-2.5.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95698c8fb268a3561e3032bd12b576ff19431930c5d59238a580e8d7cf1e8599", size = 3204656, upload_time = "2025-11-05T12:17:42.526Z" }, { url = "https://files.pythonhosted.org/packages/8c/70/953fd6d198090597a6805299620acd563a7741e1677abc4f730a1c21c478/granian-2.5.7-cp39-cp39-win_amd64.whl", hash = "sha256:7f35782a1134928efeb3b249698b92b0b6693901f512bb39c2d10b43edd51de9", size = 2175617, upload_time = "2025-11-05T12:17:44.226Z" }, { url = "https://files.pythonhosted.org/packages/0e/25/2a4112983df5ce0ec8407121ad72c17d27ebfad57085749b8e4164d69e63/granian-2.5.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdae1c86357bfe895ffd0065c0403913bc008f752e2f77ab363d4e3b4276009b", size = 2838744, upload_time = "2025-11-05T12:17:45.904Z" }, { url = "https://files.pythonhosted.org/packages/d7/0a/eb0c5b71355e8f99b89dc335f16cd5108763c554e96a2aae5e7162ef4997/granian-2.5.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:bc1d8aaf5bfc5fc9f8f590a42e9f88a43d19ad71f670c6969fa791b52ce1f5ec", size = 2538706, upload_time = "2025-11-05T12:17:47.471Z" }, { url = "https://files.pythonhosted.org/packages/f2/9c/4c592c5a813a921033a37a0f003278b1f772a6c9abd16f821bcb119151f0/granian-2.5.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:288b62c19aea5b162d27e229469b6307a78cb272aa8fcc296dbfca9fbbda4d8f", size = 3117369, upload_time = "2025-11-05T12:17:49.172Z" }, { url = "https://files.pythonhosted.org/packages/f1/35/96af9f0995a7c45f0cd31261ab6284e5d6028afa17c6fcfe757cccb0afb5/granian-2.5.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:66c3d2619dc5e845d658cf3ed4f7370f83d5323a85ff8338e7c7a27d9a333841", size = 2904972, upload_time = "2025-11-05T12:17:50.863Z" }, { url = "https://files.pythonhosted.org/packages/fc/93/45c253983c2001f534ba2c7bc1e53718fc8cecf196b1e1a0469d5874ae54/granian-2.5.7-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:323e35d5d5054d2568fc824798471e7d33314f47aebd556c4fbf4894e539347d", size = 2991986, upload_time = "2025-11-05T12:17:52.602Z" }, { url = "https://files.pythonhosted.org/packages/25/77/c03e60c7bed386ab16cf15b317dea7f95dde5095af6e17cbd657cd82c21b/granian-2.5.7-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:026ef2588a2b991b250768bf47538fd5fd864549535f885239b6908b214299c4", size = 3163649, upload_time = "2025-11-05T12:17:54.402Z" }, { url = "https://files.pythonhosted.org/packages/5e/c9/2bce3db4e3da8d3a697c363c8f699b71f05b7f7a0458e1ba345eaea53fcd/granian-2.5.7-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4717a62c0a1b79372c495b99ade18bfc3c4a365242bf75770c96a4767a9bcf66", size = 3201886, upload_time = "2025-11-05T12:17:56.553Z" }, { url = "https://files.pythonhosted.org/packages/78/66/997ebfd8cc4a0640befb970bc846a76437d1f0b55dff179e69f29fa4615b/granian-2.5.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4b57ae0a2e1dbc7a248e3c08440b490b3f247e7e4f997faa72e82f5a89d0ea4c", size = 2175219, upload_time = "2025-11-05T12:17:58.126Z" }, { url = "https://files.pythonhosted.org/packages/16/0f/da2588ac78254a4d0be90a6f733d0bb7dd1edb78a10d9e59fa9837687e94/granian-2.5.7-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bee545c9b9e38eabcdd675e3fec1a2112b8193dc864739952b9de8131433a31c", size = 2838886, upload_time = "2025-11-05T12:17:59.809Z" }, { url = "https://files.pythonhosted.org/packages/7d/34/75def8343534e9d48362c43c3cbd06242a2d7804fbfbc824c8aa9fb75a30/granian-2.5.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:73c76c0f1ee46506224e92df193b4d271ea89f0d82cd69301784ca85bc1db515", size = 2538597, upload_time = "2025-11-05T12:18:01.496Z" }, { url = "https://files.pythonhosted.org/packages/c3/5d/d828d97aad050cfc5b18a0163b532c289a35ad214e31f5a129695b2b4cae/granian-2.5.7-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68879c27aed972f647a8e8ef37f9046f71d7507dc9b3ceffa97d2fbffe6a16c8", size = 3117570, upload_time = "2025-11-05T12:18:03.818Z" }, { url = "https://files.pythonhosted.org/packages/2d/57/b8380f3d6b6dcdcd454d720cf11dbecb0e2071a870f44eb834011f14b573/granian-2.5.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ea9cbdfbd750813866dcc9c020018e5f20a57a4e3a83bd049ccc1f6da0559b75", size = 2905089, upload_time = "2025-11-05T12:18:05.567Z" }, { url = "https://files.pythonhosted.org/packages/0b/e9/04a7c3b83650afc4a4ad82b67e6306d99f80ac1a6aacb3a8ba182f7359d6/granian-2.5.7-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d142ff5ee6027515370e56f95d179ec3e81bd265d5b4958de2b19adcdf34887d", size = 2991867, upload_time = "2025-11-05T12:18:07.223Z" }, { url = "https://files.pythonhosted.org/packages/2b/bf/a1cdbff73cbac4fddf817d06c13ce6cdc75c22d6da1b257e3563fea4c3c5/granian-2.5.7-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:222f0fb1688a62ca23cb3da974cefa69e7fdc40fd548d1ae87a953225e1d1cbb", size = 3164141, upload_time = "2025-11-05T12:18:09.267Z" }, { url = "https://files.pythonhosted.org/packages/c8/cc/35c6a55ac2c211e86a9f0c728eb81b6ad19f05a3055d79c6f11a1b71f5d5/granian-2.5.7-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:40494c6cda1ad881ae07efbb2dc4a1ca8f12d5c6cf28d1ab8b0f2db13826617b", size = 3201599, upload_time = "2025-11-05T12:18:10.962Z" }, { url = "https://files.pythonhosted.org/packages/f3/0a/5a95a3889532bc5a5f652cdc78dae8ffa16d4228b4d35256a98be89e33ef/granian-2.5.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c3942d08af2c8b67d0ef569b6c567284433ebf09b4af3ea68388abb7caccad2b", size = 2175240, upload_time = "2025-11-05T12:18:12.956Z" }, { url = "https://files.pythonhosted.org/packages/04/f0/0c53f44d4a548ab65c61eb5c31cffed9473c3333063e153e78023fa70338/granian-2.5.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a7ced7d2faa4e95f220db8777708c232b8cf2adb278e359c5402f64a27f9abb0", size = 2839022, upload_time = "2025-11-05T12:18:14.648Z" }, { url = "https://files.pythonhosted.org/packages/0f/69/d55a9bd332e3924a8ceb5dd4ae1a3e0dadd4386292d6c15e70665e2cc8f6/granian-2.5.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:89abe4a991becae8ab9ae998a09f95ad2efe9abbe162033f2db5a7603076e89a", size = 2538540, upload_time = "2025-11-05T12:18:16.431Z" }, { url = "https://files.pythonhosted.org/packages/24/fd/2de703a8f6496ae550ae95512a981905599c2b179322df2746611404933c/granian-2.5.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:767b6f366c9ddced6f98039a6e24825da17d8e1d44cd940666c942ea9ea70536", size = 3117770, upload_time = "2025-11-05T12:18:18.634Z" }, { url = "https://files.pythonhosted.org/packages/76/31/36a2ed2972f24acbf3f67c32d39ddf2ca67794a09bc70c70a4770fb09962/granian-2.5.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0855af6f9115881460574b2b2923f9c4002190b85a35387fbada6318ea0268e5", size = 2905214, upload_time = "2025-11-05T12:18:20.35Z" }, { url = "https://files.pythonhosted.org/packages/18/17/57fa61d68c2768250cad14de67ab5124fe97ab94bf432f6d135e01764a0d/granian-2.5.7-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:21698b0ddb5746eefc82e27baa0dd592b659e9797a08f64ffd4386e26be33b5b", size = 2992187, upload_time = "2025-11-05T12:18:22.133Z" }, { url = "https://files.pythonhosted.org/packages/4e/fe/c22c7705988e5772761c561647cfb2c6f0b9c0c2ff93708b00e3b10b7a29/granian-2.5.7-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:fce84342d3d9a1d90b31e6c5b72b46cb78aee57cb912b34cdb7c2d23a9c385e5", size = 3164493, upload_time = "2025-11-05T12:18:24.231Z" }, { url = "https://files.pythonhosted.org/packages/47/7f/7bd8312ab11c454e666ba0eca353dcc658753edf423e6c05341d3e8a5ffa/granian-2.5.7-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1d70e033dfb79bc7650db9e9decf3066e4b5de606bc64fe8a65b2e8c66dc1294", size = 3201768, upload_time = "2025-11-05T12:18:26.117Z" }, { url = "https://files.pythonhosted.org/packages/e2/47/4c0aa762526daee4544bd9962550f1d6b2e1363707d4ca19340d844e3862/granian-2.5.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a17b8d5056f66e62bb40958c0f4df6a40697009ec035a23efe3262f18e89f992", size = 2175544, upload_time = "2025-11-05T12:18:27.801Z" }, ] [[package]] name = "granian" version = "2.6.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] dependencies = [ { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ea/1e/0a33c4b68b054b9d5f7963371dd06978da5f4f58f58ddcb77854018abfdb/granian-2.6.0.tar.gz", hash = "sha256:d9b773633e411c7bf51590704e608e757dab09cd452fb18971a50a7d7c439677", size = 115955, upload_time = "2025-11-16T16:07:27.082Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/76/71/e543f91d1a01515ff7211a19e18ee7dcf843dc25655d6cc18039901e2fb1/granian-2.6.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:759e8be4481c5aede0080e3c20a9e1bc7c00258cd4810f88ebcfb6bdac298f03", size = 3078973, upload_time = "2025-11-16T16:05:30.886Z" }, { url = "https://files.pythonhosted.org/packages/ce/ae/ef87e76e5ade5633c11e892b663b922f8fda5ef804576373516a445d244f/granian-2.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6af5d9a088536798ee3188f1cbcffc5690ed38a53851825e4125c3bf3c9cfef3", size = 2810530, upload_time = "2025-11-16T16:05:32.703Z" }, { url = "https://files.pythonhosted.org/packages/cf/9c/16a3ee4dad81e0dd446f391dad9ced17e7e685d97cce28188adb2e846004/granian-2.6.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50c1cad7b2b0fb7c66169a12ab069e2f76f4d2a7390638e5b327504372976518", size = 3331648, upload_time = "2025-11-16T16:05:34.15Z" }, { url = "https://files.pythonhosted.org/packages/8b/27/c9325343522ed89ac6f885995178c95f90052a5894fc681ec84df24a3ba6/granian-2.6.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a811d0b80099fe1da945e6d137d64dfe8e1dd07d3bf20e2e1eeae6f2c83adbb9", size = 3151584, upload_time = "2025-11-16T16:05:35.584Z" }, { url = "https://files.pythonhosted.org/packages/4f/73/376f08e3de394e50888bd9f8fa27be5dd60e1fd6cbbec3683f780ddaf5fc/granian-2.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61c7b04e5520ec3d749e53da414ba0ccc7773d7b24e8049539d47a4171aa922a", size = 3375838, upload_time = "2025-11-16T16:05:37.425Z" }, { url = "https://files.pythonhosted.org/packages/5b/9c/f2e32c826fc7fe0c65a6cf0ff0b4c459f71adc78f2721083ff50fa60c29a/granian-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d1bbe669228ba475adfdbebbae962f958be3002c742370000b7f5d06f895cacb", size = 3234478, upload_time = "2025-11-16T16:05:38.664Z" }, { url = "https://files.pythonhosted.org/packages/dc/09/70bb969fcd4b35a357c93490efc7cf97185b521c90fcf21c2483de49cce8/granian-2.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bdef48aab0846fd5c215acd1779328d067708859bbf44c4e9363daa51b8c98bd", size = 3300577, upload_time = "2025-11-16T16:05:39.792Z" }, { url = "https://files.pythonhosted.org/packages/c7/94/1722f6bf1a64475e390595c0b7a1b0dff40a4279fc215cb3695be7fd5168/granian-2.6.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:8459a8b2335689ecb04b2ccba63cbcdf030c242a64ae77be68fb6e263984a150", size = 3475443, upload_time = "2025-11-16T16:05:41.374Z" }, { url = "https://files.pythonhosted.org/packages/64/92/8a353cdb800b0c390b3c6d3bc0ab5a815221319bec65419a86a959e64acd/granian-2.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dcde0783cb546304f0e20a1f99feb1a8795adfb0540c9278e5f9ef583edffb36", size = 3467863, upload_time = "2025-11-16T16:05:42.82Z" }, { url = "https://files.pythonhosted.org/packages/1c/3f/87a42611f2c6aa4d74746036b8d18b5cd57a23ef7043501cc24b0dd250b1/granian-2.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:908a2dc5d2af1f275300827e5f8ec499206be995d777a86f850e7cc6fa722002", size = 2343382, upload_time = "2025-11-16T16:05:44.087Z" }, { url = "https://files.pythonhosted.org/packages/3c/56/efb12bda35ce3d6ac89ec8a5b02036d17dfaec6bb2cab16f142dc9ee389f/granian-2.6.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:38029b6c25ac5a9f8a6975b65846eee23d9fa7b91089a3ff6d11770d089020f3", size = 3078748, upload_time = "2025-11-16T16:05:45.593Z" }, { url = "https://files.pythonhosted.org/packages/5e/84/6d640c3439d532792a7668d66089df53d74ffb06455075b9db2a25fbb02d/granian-2.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:efd9c92bc5d245f10d6924847c25d7f20046c976a4817a87fd8476c22c222b16", size = 2810326, upload_time = "2025-11-16T16:05:47.085Z" }, { url = "https://files.pythonhosted.org/packages/92/60/909057f8f21e2d6f196f8c9380a755d5453a493cd071afa7f04c9de83725/granian-2.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43e6a25d995206ba0a2fef65fea2789f36dde1006932ea2dcd9a096937c1afdd", size = 3331727, upload_time = "2025-11-16T16:05:48.245Z" }, { url = "https://files.pythonhosted.org/packages/64/07/27701a5b9aa27873ce92730e80e5c0ad3e7fe80674ba1660996c1463c53a/granian-2.6.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d7ac1be5c65fef4e04fb9860ca7c985b9c305f8468d03c8527f006c23100c83", size = 3151437, upload_time = "2025-11-16T16:05:49.413Z" }, { url = "https://files.pythonhosted.org/packages/b6/1b/dfc6782dad69b02ab6d50a320b54b2e28c573954e0697a3f24a68f7aa3c9/granian-2.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318a7db03e771e2611a976a8c4ecc7ae39e43e2ebffd20a4c2371a71cdc5659c", size = 3375815, upload_time = "2025-11-16T16:05:50.497Z" }, { url = "https://files.pythonhosted.org/packages/ad/ab/de57fcf406a9da5b28f83af71bd7b8e2fc944b786f95b01188b4f8c1c049/granian-2.6.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:cdb1ab7a0cedfa834c6e8e7c9e2530d80d6fd6f04076c2f6998629688f8ecb00", size = 3234158, upload_time = "2025-11-16T16:05:51.664Z" }, { url = "https://files.pythonhosted.org/packages/a7/d0/a2d3a14bfce05f62f3ec10cb1c1609fcfe983e6ae929b1656bff8784812c/granian-2.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fd11a9275ad01c2d99a322c1d0c8af0ad162c541515ad1d55ef585fd321cd2b9", size = 3300040, upload_time = "2025-11-16T16:05:53.233Z" }, { url = "https://files.pythonhosted.org/packages/db/e3/d9b58bacf40da8f937a8a04f2fbc61424f551d0589f3bd6eb0755b57c3be/granian-2.6.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:489b1e24b4360ecdaf08d404e13549d4377e77756d1911454abed9e0b559345a", size = 3475356, upload_time = "2025-11-16T16:05:54.459Z" }, { url = "https://files.pythonhosted.org/packages/df/50/b45f53dea5ec3d9a94f720f4a0b3a7c2043a298151b52ac389db14025b61/granian-2.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17ba9fb67931852cf9d8eee23d1adb78c0e3106bd4ad440cf3b37ce124b4380c", size = 3467883, upload_time = "2025-11-16T16:05:56.017Z" }, { url = "https://files.pythonhosted.org/packages/94/6d/1e8aebf735308ae424bebec7497300a559eebfe53a4db0430ee3409a3642/granian-2.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:93c2734364081e34a87b6f494e8057b5f25ba6baed4b609dbca33b3471d843ec", size = 2343370, upload_time = "2025-11-16T16:05:57.152Z" }, { url = "https://files.pythonhosted.org/packages/ef/db/c7d10c2b61dd40014346af3274500b72654710cdfe400f37358c63481f28/granian-2.6.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b05b4fc5ce5855eb64a02b6e2c70b0d7e24632ee0d1193badfc0dace56688c11", size = 3076177, upload_time = "2025-11-16T16:05:58.824Z" }, { url = "https://files.pythonhosted.org/packages/9c/54/095eb0cea6976f3aeaab434f9009521b4d50aa37f9efda54a70da5b465ec/granian-2.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b6aad6e7ded7a0a916119cd3ee28aa989e619074a6ca1ba3dc19cf5ad608832c", size = 2801793, upload_time = "2025-11-16T16:06:00.396Z" }, { url = "https://files.pythonhosted.org/packages/6d/f5/4177070ec6942b0467c0da59b53cf83ac5b939cfcdf687daeaebaef31299/granian-2.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e77509ad3a5654da1268db9d78d49357bf91ac2d3dcb1c58a00cda162d922a7", size = 3325958, upload_time = "2025-11-16T16:06:01.906Z" }, { url = "https://files.pythonhosted.org/packages/ad/5a/973e77414882df01ef75801d4c7e51bc2796475c0e7d72356d4a8f7701a5/granian-2.6.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3a7cc82cdc5d0c7371d805f00866f51ece71bb0cb2e1f192b84834cf1a6844b", size = 3146873, upload_time = "2025-11-16T16:06:03.183Z" }, { url = "https://files.pythonhosted.org/packages/d6/97/410127ee96129c8f0746935b7be6703ad6f31232e0c33edec30496596d26/granian-2.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dbbce087a055eb64896b809a9a1f88161751815b112de4aa02ee4348f49cb73", size = 3387122, upload_time = "2025-11-16T16:06:05.194Z" }, { url = "https://files.pythonhosted.org/packages/cf/37/36e74876d324fe6326af32a01607afc3f0f0fcb9e674092755da4146c40c/granian-2.6.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a7fa2728d32dfaf3b1b2bf5b0b7c6d23bb75eaf62bd08b71b61797d292381970", size = 3234994, upload_time = "2025-11-16T16:06:06.978Z" }, { url = "https://files.pythonhosted.org/packages/bc/6e/5da9af1fdf7eeff9c7568f35171a0cdd63d73ab87a3deea560393b746d71/granian-2.6.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:70b3867c33e5c95d6eb722a5c8b847c36c670fc189821bf7aef9934e943c2574", size = 3303337, upload_time = "2025-11-16T16:06:08.263Z" }, { url = "https://files.pythonhosted.org/packages/e2/ab/d133ed75e9940abc9bed56cb096709b8c4a1dfe6221e61d43bd23939afad/granian-2.6.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:7fb0448a292f2dda9c4130e394ac09ef1164713d873882fd3106ca6949ff0897", size = 3472100, upload_time = "2025-11-16T16:06:09.494Z" }, { url = "https://files.pythonhosted.org/packages/0d/25/064406ade99fa7153e1a2b129f69af56cc1e50176a2fbec25911d9a121a9/granian-2.6.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a5bd3c59fe3a7acb22e434749ff2258606a93bc5848fa96332a6ed4c752f4dc8", size = 3480023, upload_time = "2025-11-16T16:06:10.718Z" }, { url = "https://files.pythonhosted.org/packages/05/ff/da5b8e81ca728f081a3c29d302bb9e3b9c601c511a8f894ecd03da9f7cc6/granian-2.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:95ddf79727d7cda8e005c8bc1e09d57d907662eacfd918d774b7ffb3290dc6b9", size = 2346557, upload_time = "2025-11-16T16:06:11.907Z" }, { url = "https://files.pythonhosted.org/packages/4b/b0/a7be659186bf9de644a5214c31ce337342170de71c5cb1e3ea61e1feeebe/granian-2.6.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:74f579e7295945119394dc05dd1565be1ac700f6f26c8271d8327dfabc95ec34", size = 3075590, upload_time = "2025-11-16T16:06:13.662Z" }, { url = "https://files.pythonhosted.org/packages/5a/d8/eb55f3657d7c104f96f2d20bd459908842a954f4d95c5769c46bf485d656/granian-2.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4e0e925d016e3dc43ae5950021c9ea0e9ee2ef1334a76ba7fbb80cc9e17c044", size = 2801601, upload_time = "2025-11-16T16:06:14.908Z" }, { url = "https://files.pythonhosted.org/packages/2a/a3/45c79b3b2388a066e05ae3af171cde13540467efb0ec6404a52c12fcc449/granian-2.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b568459abe4813e4968310312e26add3dab80c3ce5044b537ebfe464601fe9a", size = 3325246, upload_time = "2025-11-16T16:06:16.9Z" }, { url = "https://files.pythonhosted.org/packages/2f/2c/570df011d8c53a59d945db1b8b6adedf04f43d92bfd72f4149ee60c3aeaf/granian-2.6.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0041ba59e4b89818db1772ea677bb619f5e3030060dcb6c57e8a17d72dc6210b", size = 3146313, upload_time = "2025-11-16T16:06:18.339Z" }, { url = "https://files.pythonhosted.org/packages/a9/cd/8e9b183db4190fac1401eeab62669ebe35d962ba9b490c6deca421e3daa4/granian-2.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c032dca04171e4fbd54e587fe03aeef1825739d02ff3e3c49d578a8b5cc752c", size = 3386170, upload_time = "2025-11-16T16:06:19.946Z" }, { url = "https://files.pythonhosted.org/packages/df/c5/9ccc0d04c1cefdb4bb42f671a0c27df4f68ba872a61edc7fc3bae6077ea9/granian-2.6.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:d5686da7358fede8e9a1e1344310c6e3cb2c4d02a1aca52c31c990fe6b7d6281", size = 3235277, upload_time = "2025-11-16T16:06:21.754Z" }, { url = "https://files.pythonhosted.org/packages/96/7d/a082bec08c1d54ce73dd237d6da0f35633cd5f2bfd1aec2f0a2590e6782a/granian-2.6.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:62c69bb23efe26a33ac39e4b6ca0237d84ed6d3bf47a5bb817e00a46c27369f2", size = 3302908, upload_time = "2025-11-16T16:06:22.988Z" }, { url = "https://files.pythonhosted.org/packages/b1/2e/c8a53c92f0e98c4b36a24c03a4243b53410804f78f1876ca3ea497831381/granian-2.6.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:2ee5087e4b876f29dd1a11e9c2dd8d864ecb207278767a33bba60975260f225d", size = 3470938, upload_time = "2025-11-16T16:06:24.666Z" }, { url = "https://files.pythonhosted.org/packages/7a/c7/0615d97cc666c6b5c1af24abbb08c6fd536a5f3c055fd09a3cd6b178283e/granian-2.6.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3627b69f391a769acfad4ae26bbfce03b50c31eb5fbea18ec0a44f37c89cf0fd", size = 3479291, upload_time = "2025-11-16T16:06:25.984Z" }, { url = "https://files.pythonhosted.org/packages/68/cc/a590cbe311fdccd7ddd02086735ed6ceb10c0e00cdf499aafde03fd47128/granian-2.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:5a2e3bf928c47b02b31c4f2aa12aa99ef3e9fc9c969fd2e26284fa2f1f91eb86", size = 2346221, upload_time = "2025-11-16T16:06:27.252Z" }, { url = "https://files.pythonhosted.org/packages/08/2c/8256710307e32cc4aff58d730f3db9e87471121725adc92d700fa0190136/granian-2.6.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:c66877f2b2a1ad6046a228ee228ed4faa43dd4949fbe07f61d5c38ad57506e02", size = 3027712, upload_time = "2025-11-16T16:06:28.819Z" }, { url = "https://files.pythonhosted.org/packages/63/88/bb3dc2a67f146d03ffd1b3d912c92795ecf52aa2b7ea1375735c522a5e6c/granian-2.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:919ccfe3273c6325c82ecb2e62b5af4d1b57fdc9858ce725b8223af2e1d6e2cd", size = 2753501, upload_time = "2025-11-16T16:06:30.267Z" }, { url = "https://files.pythonhosted.org/packages/0d/6e/86cea4a4cd0c9adbae74d865468f298083fcefd4d9f8f8f21910078b069a/granian-2.6.0-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7d6368281f9f1bfde53a71f67570b70df773e01329f7a113b248de453e5991c1", size = 2966948, upload_time = "2025-11-16T16:06:31.932Z" }, { url = "https://files.pythonhosted.org/packages/e0/01/092337f9aae6cb6fb66516894a3a39d723de9ab263d3a144511d07d2ccef/granian-2.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3d0b7dd32a630336120c9a12e7ba7ca4e415bebd22d9735b19df593e01ffa40", size = 3317466, upload_time = "2025-11-16T16:06:33.222Z" }, { url = "https://files.pythonhosted.org/packages/b7/60/0d3635ef8f1f73789cb1779574493668a76675ef18115826a4a2dcb415d7/granian-2.6.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acb18fca86ff560ea5a3bf9dc342245e388409844c257d1125ff9a988c81080b", size = 3273204, upload_time = "2025-11-16T16:06:34.513Z" }, { url = "https://files.pythonhosted.org/packages/f3/26/09bc5016ae7faac0af40a07934d4d4d41f9e5bd7e97560aac957f7aa9605/granian-2.6.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:3606f13ba2fd9afde1d879ef556afcccd17b55c57a9f6be8487626867fe94a20", size = 3107339, upload_time = "2025-11-16T16:06:36.121Z" }, { url = "https://files.pythonhosted.org/packages/c6/cb/91a13e42965a3e20a4c7398c63843cac9ca1a1c36925bd3ff69e6c17775f/granian-2.6.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:ca8188119daba0a343d2736dd4ed4d8d71ca5c0ca016a3f93599710906aa036f", size = 3298057, upload_time = "2025-11-16T16:06:37.567Z" }, { url = "https://files.pythonhosted.org/packages/23/8b/19bb0f679b74ddb58e1c6de2e4c85ba986b2040d7446fd7e5a498e5a67cf/granian-2.6.0-cp313-cp313t-musllinux_1_1_armv7l.whl", hash = "sha256:6ac9d479d4795ab9c7222829d220636250ee034d266ad89a9657b64fb6770b93", size = 3465623, upload_time = "2025-11-16T16:06:39.144Z" }, { url = "https://files.pythonhosted.org/packages/41/25/4af1f3e0cfea237912d04d57e97193d350b06f93255bde16040780e75589/granian-2.6.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:b8cc3635676639c1c6fc336571e7cdd4d4f0be6e05c33ae06721a570b346ce21", size = 3476874, upload_time = "2025-11-16T16:06:40.868Z" }, { url = "https://files.pythonhosted.org/packages/bc/39/0163fbc335bbe3531b4151a6a8b80174375fdfbf3e2cb69da00e0bba1c9f/granian-2.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:91fb08e02598a0059cd1cc1f807c085f2bc386c0deb370f216edadf75adee8b8", size = 2345083, upload_time = "2025-11-16T16:06:42.19Z" }, { url = "https://files.pythonhosted.org/packages/bb/53/9ed1a1f710a78eaad2897b9264bb6ae1190dc251af463b87be41f1963dfe/granian-2.6.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cba1d4ac5b101c41fa916fb1ca5d5c359892b63d1470a9587055605c68850df8", size = 3072924, upload_time = "2025-11-16T16:06:43.949Z" }, { url = "https://files.pythonhosted.org/packages/b1/58/8fa09896c88937a95b92185a1377b09f7cd1b8ac1e0f06a251e02ce96164/granian-2.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2c829ece96a49d431c01553e0c020a675624798659c74e3d800867a415376fef", size = 2800675, upload_time = "2025-11-16T16:06:45.831Z" }, { url = "https://files.pythonhosted.org/packages/4f/53/779e15fb6372cf00d2c66f392d754e0816bf0597e8346459c22bde9de219/granian-2.6.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:637153b653a85e1bb0cba2e10e321e2cbb1af1e9abab0feafd34eb612fe3fcdd", size = 3323029, upload_time = "2025-11-16T16:06:47.682Z" }, { url = "https://files.pythonhosted.org/packages/32/ad/3af7388f51b4df3a781ecfc6f1ec18331ec74ea413fb2c62fe24c65e7935/granian-2.6.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6c09792ca3807059ef8e58a7c7bc5620586414f03ebd4bb2e6cd044044f0165", size = 3142617, upload_time = "2025-11-16T16:06:48.964Z" }, { url = "https://files.pythonhosted.org/packages/4c/4d/6a7766fd9fe09f3f887c2168d5607cc2eb2ee9fe5c9364a877942c05de41/granian-2.6.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79e2f68d99f454d1c51aacc86bed346693c074f27c51fb19b8afe5dc375e1b70", size = 3383669, upload_time = "2025-11-16T16:06:50.363Z" }, { url = "https://files.pythonhosted.org/packages/b8/1c/b4bbdcd6bbe9c3290a2ac76eac3ae8916fdb38269f9f981e5b933ff02664/granian-2.6.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:995f7b496b16484c97e8da9f44ead66307d6f532135a9890b0d27c88b8232df3", size = 3233040, upload_time = "2025-11-16T16:06:52.787Z" }, { url = "https://files.pythonhosted.org/packages/75/26/ca7afabab2b31101eabc78df26772bd679e0a2bc879c58e8fcbb9732d57e/granian-2.6.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:6d5db194527d52183b2dc17be9d68c59647bc66459c01a960407d446aa686c98", size = 3302090, upload_time = "2025-11-16T16:06:54.112Z" }, { url = "https://files.pythonhosted.org/packages/e8/3b/3e6992ac60f8d2e7f6eb5ae7845ba8f77d9373379e7d8ec7dbdfac89c00b/granian-2.6.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:c9fd40f3db242eece303ab4e9da4c7c398c865d628d58ff747680c54775ea9e4", size = 3469619, upload_time = "2025-11-16T16:06:55.488Z" }, { url = "https://files.pythonhosted.org/packages/5d/96/8e78858630d7ca51751502c323f22841a56847db827a73d946a9303108c1/granian-2.6.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:99dfa23b29e6a4f8cc2ec9b55946746f94ce305e474defef5c3c0e496471821e", size = 3479330, upload_time = "2025-11-16T16:06:56.989Z" }, { url = "https://files.pythonhosted.org/packages/41/c1/2ea5fa5e28a9b400549494ce091dfb1a6122893b318c3fbc4cf7693cc398/granian-2.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:22138a906503cb62cc25e26baa6d9e424ae26f9b46d7f852126d0a92fd9b3194", size = 2345011, upload_time = "2025-11-16T16:06:58.745Z" }, { url = "https://files.pythonhosted.org/packages/5a/5c/5770f1270c2e59b7d27e25792ed62f3164b8b962ccf19b4a351429fd34fe/granian-2.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:a8b356e8d96481c0fa67c2646a516b1f8985171995c0a40c5548352b75cae513", size = 3026090, upload_time = "2025-11-16T16:07:00.105Z" }, { url = "https://files.pythonhosted.org/packages/28/89/85b40c55ddd270a31e047b368b4d82f32c0f6388511a0affcf6c8459821b/granian-2.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f026d7a2f1395b02cba2b59613edfd463d9ef43aae33b3c5e41f2ac8d0752507", size = 2752890, upload_time = "2025-11-16T16:07:01.507Z" }, { url = "https://files.pythonhosted.org/packages/bf/4e/369700caefaad0526fc36d43510e9274f430a5bdeea54b97f907e2dd387d/granian-2.6.0-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:15c888605406c9b29b7da8e3afa0ce31dabad7d446cf42a2033d1f184e280ef3", size = 2965483, upload_time = "2025-11-16T16:07:02.836Z" }, { url = "https://files.pythonhosted.org/packages/75/47/d6d95615b94a8bac94efca7a634cb3160fb7cd3235039e4d1708e0399453/granian-2.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d9ce9ff8d4d9da73eb2e90c72eae986f823ab46b2c8c7ee091ec06e3c835a94e", size = 3313071, upload_time = "2025-11-16T16:07:04.128Z" }, { url = "https://files.pythonhosted.org/packages/6a/76/f9098765797adfc142d503ee8a18fe137324558a028db6322753d88305d9/granian-2.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:681f44fa950b50721250536477b068315322c447f60b6a7018a9d61385202d67", size = 3271503, upload_time = "2025-11-16T16:07:05.482Z" }, { url = "https://files.pythonhosted.org/packages/7f/f9/55be32f079af772054284aa917eb7bd77f1f8ba840f0773db9ac47279149/granian-2.6.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:cf23f25826e7c87c2cd9d984a358c14106d589febcd71af0f5392bb65fafb07a", size = 3106398, upload_time = "2025-11-16T16:07:07.396Z" }, { url = "https://files.pythonhosted.org/packages/79/ab/e63f54a8432b2b877d83c5f2921a54791a420685002854dc7005bbd48817/granian-2.6.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:559985641cc1f0497f2c35d75126214f9cf9286ec6cea083fb1d0324712dbc47", size = 3296156, upload_time = "2025-11-16T16:07:08.858Z" }, { url = "https://files.pythonhosted.org/packages/ef/3c/a37c038be10441a27cfde65a64c4406556ee64ab5deba4a782eaaa5ce7cf/granian-2.6.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:98718c08713d4afdf0e444f6236eeac6d01fdf08d0587f3c15da37fd12ee03f6", size = 3460301, upload_time = "2025-11-16T16:07:10.476Z" }, { url = "https://files.pythonhosted.org/packages/44/05/bcc03661028df91808440f24ae9923cda4fc53938c6bb85a87e3d47540a5/granian-2.6.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:c115726904be2186b1e621a2b4a292f8d0ccc4b0f41ac89dcbe4b50cbaa67414", size = 3474889, upload_time = "2025-11-16T16:07:11.873Z" }, { url = "https://files.pythonhosted.org/packages/fa/e2/69a3263a7415993c46561521de93213d2c7e04f2675b627a14c6dd69334c/granian-2.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5bf42d8b4240f95a0edd227175161c0c93d465d6b8bb23abd65c2b82c37cfc44", size = 2344006, upload_time = "2025-11-16T16:07:13.314Z" }, { url = "https://files.pythonhosted.org/packages/d5/ee/88767d70d21e6c35e44b40176abd25e1adb8f93103b0abc6035c580a52aa/granian-2.6.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:323c096c7ebac19a16306708b4ed6abc9e57be572f0b9ff5dc65532be76f5d59", size = 3089586, upload_time = "2025-11-16T16:07:14.65Z" }, { url = "https://files.pythonhosted.org/packages/5c/22/2405b36c01b5c32fc4bbc622f7c30b89a4ec9162cc3408a38c41d03e1c27/granian-2.6.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b9736ab48a1b3d70152e495374d4c5b61e90ea2a79f1fc19889f8bba6c68b3b5", size = 2805061, upload_time = "2025-11-16T16:07:16.582Z" }, { url = "https://files.pythonhosted.org/packages/33/38/79e13366729f0f2561b33abef7deb326860443abbbb1d2247679feaeebdc/granian-2.6.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee4b1f5f7ec7096bdffc98171b559cb703c0be68e1c49ff59c208b90870c6bba", size = 3381989, upload_time = "2025-11-16T16:07:17.906Z" }, { url = "https://files.pythonhosted.org/packages/90/9f/fcff1978ca3cbf138291a29fe09f2af5d939cab9e5f77acc49510092c0d8/granian-2.6.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e1e27e9527cdcd8e767c52e091e69ade0082c9868107164e32331a9bf9ead621", size = 3237042, upload_time = "2025-11-16T16:07:19.381Z" }, { url = "https://files.pythonhosted.org/packages/a1/9d/06dc6b5f411cac8d6a6ef4824dc102b1818173027ab4293e4ae57c620cfe/granian-2.6.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f9f9c5384f9370179d849c876c35da82f0ebd7389d04a3923c094a9e4e80afc5", size = 3316073, upload_time = "2025-11-16T16:07:20.95Z" }, { url = "https://files.pythonhosted.org/packages/1c/e1/45e9861df695c743b57738d9b8c15b3c98ebd34ba16a79884372b2006b32/granian-2.6.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:561a3b86523a0b0e5d636229e3f0dcd80118ace2b1d2d061ecddeba0044ae8ac", size = 3483622, upload_time = "2025-11-16T16:07:22.567Z" }, { url = "https://files.pythonhosted.org/packages/5f/14/cfe0648b2e1779ed2a2215a97de9acc74f94941bb60c6f2c9fb7061ae4bb/granian-2.6.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:8e12a70bdb3b5845f62dc2013527d5b150b6a4bc484f2dec555e6d27f4852e59", size = 3460175, upload_time = "2025-11-16T16:07:24.327Z" }, { url = "https://files.pythonhosted.org/packages/13/ad/44bbbb97adc507af6fa47dec53cecee1abc2e802bcf3762a82249f0a127d/granian-2.6.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2ce02a92e938a44ea942ea1be44056fd41861ce957cf4498f0258fb15b04210a", size = 2338041, upload_time = "2025-11-16T16:07:25.796Z" }, ] [[package]] name = "greenlet" version = "3.2.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload_time = "2025-08-07T13:24:33.51Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7d/ed/6bfa4109fcb23a58819600392564fea69cdc6551ffd5e69ccf1d52a40cbc/greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c", size = 271061, upload_time = "2025-08-07T13:17:15.373Z" }, { url = "https://files.pythonhosted.org/packages/2a/fc/102ec1a2fc015b3a7652abab7acf3541d58c04d3d17a8d3d6a44adae1eb1/greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590", size = 629475, upload_time = "2025-08-07T13:42:54.009Z" }, { url = "https://files.pythonhosted.org/packages/c5/26/80383131d55a4ac0fb08d71660fd77e7660b9db6bdb4e8884f46d9f2cc04/greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c", size = 640802, upload_time = "2025-08-07T13:45:25.52Z" }, { url = "https://files.pythonhosted.org/packages/9f/7c/e7833dbcd8f376f3326bd728c845d31dcde4c84268d3921afcae77d90d08/greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b", size = 636703, upload_time = "2025-08-07T13:53:12.622Z" }, { url = "https://files.pythonhosted.org/packages/e9/49/547b93b7c0428ede7b3f309bc965986874759f7d89e4e04aeddbc9699acb/greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31", size = 635417, upload_time = "2025-08-07T13:18:25.189Z" }, { url = "https://files.pythonhosted.org/packages/7f/91/ae2eb6b7979e2f9b035a9f612cf70f1bf54aad4e1d125129bef1eae96f19/greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d", size = 584358, upload_time = "2025-08-07T13:18:23.708Z" }, { url = "https://files.pythonhosted.org/packages/f7/85/433de0c9c0252b22b16d413c9407e6cb3b41df7389afc366ca204dbc1393/greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5", size = 1113550, upload_time = "2025-08-07T13:42:37.467Z" }, { url = "https://files.pythonhosted.org/packages/a1/8d/88f3ebd2bc96bf7747093696f4335a0a8a4c5acfcf1b757717c0d2474ba3/greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f", size = 1137126, upload_time = "2025-08-07T13:18:20.239Z" }, { url = "https://files.pythonhosted.org/packages/f1/29/74242b7d72385e29bcc5563fba67dad94943d7cd03552bac320d597f29b2/greenlet-3.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f47617f698838ba98f4ff4189aef02e7343952df3a615f847bb575c3feb177a7", size = 1544904, upload_time = "2025-11-04T12:42:04.763Z" }, { url = "https://files.pythonhosted.org/packages/c8/e2/1572b8eeab0f77df5f6729d6ab6b141e4a84ee8eb9bc8c1e7918f94eda6d/greenlet-3.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af41be48a4f60429d5cad9d22175217805098a9ef7c40bfef44f7669fb9d74d8", size = 1611228, upload_time = "2025-11-04T12:42:08.423Z" }, { url = "https://files.pythonhosted.org/packages/d6/6f/b60b0291d9623c496638c582297ead61f43c4b72eef5e9c926ef4565ec13/greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c", size = 298654, upload_time = "2025-08-07T13:50:00.469Z" }, { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload_time = "2025-08-07T13:15:41.288Z" }, { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload_time = "2025-08-07T13:42:55.044Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload_time = "2025-08-07T13:45:26.523Z" }, { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload_time = "2025-08-07T13:53:13.928Z" }, { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload_time = "2025-08-07T13:18:27.146Z" }, { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload_time = "2025-08-07T13:18:25.164Z" }, { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload_time = "2025-08-07T13:42:38.655Z" }, { url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073, upload_time = "2025-08-07T13:18:21.737Z" }, { url = "https://files.pythonhosted.org/packages/67/24/28a5b2fa42d12b3d7e5614145f0bd89714c34c08be6aabe39c14dd52db34/greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c", size = 1548385, upload_time = "2025-11-04T12:42:11.067Z" }, { url = "https://files.pythonhosted.org/packages/6a/05/03f2f0bdd0b0ff9a4f7b99333d57b53a7709c27723ec8123056b084e69cd/greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5", size = 1613329, upload_time = "2025-11-04T12:42:12.928Z" }, { url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100, upload_time = "2025-08-07T13:44:12.287Z" }, { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload_time = "2025-08-07T13:15:45.033Z" }, { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload_time = "2025-08-07T13:42:56.234Z" }, { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload_time = "2025-08-07T13:45:27.624Z" }, { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload_time = "2025-08-07T13:53:15.251Z" }, { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload_time = "2025-08-07T13:18:30.281Z" }, { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload_time = "2025-08-07T13:18:28.544Z" }, { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload_time = "2025-08-07T13:42:39.858Z" }, { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload_time = "2025-08-07T13:18:22.981Z" }, { url = "https://files.pythonhosted.org/packages/27/45/80935968b53cfd3f33cf99ea5f08227f2646e044568c9b1555b58ffd61c2/greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0", size = 1564846, upload_time = "2025-11-04T12:42:15.191Z" }, { url = "https://files.pythonhosted.org/packages/69/02/b7c30e5e04752cb4db6202a3858b149c0710e5453b71a3b2aec5d78a1aab/greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d", size = 1633814, upload_time = "2025-11-04T12:42:17.175Z" }, { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload_time = "2025-08-07T13:38:53.448Z" }, { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload_time = "2025-08-07T13:15:50.011Z" }, { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload_time = "2025-08-07T13:42:57.23Z" }, { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload_time = "2025-08-07T13:45:29.752Z" }, { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload_time = "2025-08-07T13:53:16.314Z" }, { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload_time = "2025-08-07T13:18:32.861Z" }, { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload_time = "2025-08-07T13:18:31.636Z" }, { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload_time = "2025-08-07T13:42:41.117Z" }, { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload_time = "2025-08-07T13:18:24.072Z" }, { url = "https://files.pythonhosted.org/packages/1c/53/f9c440463b3057485b8594d7a638bed53ba531165ef0ca0e6c364b5cc807/greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b", size = 1564759, upload_time = "2025-11-04T12:42:19.395Z" }, { url = "https://files.pythonhosted.org/packages/47/e4/3bb4240abdd0a8d23f4f88adec746a3099f0d86bfedb623f063b2e3b4df0/greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929", size = 1634288, upload_time = "2025-11-04T12:42:21.174Z" }, { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload_time = "2025-08-07T13:24:38.824Z" }, { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload_time = "2025-08-07T13:16:08.004Z" }, { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload_time = "2025-08-07T13:42:59.944Z" }, { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload_time = "2025-08-07T13:45:30.969Z" }, { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload_time = "2025-08-07T13:53:17.759Z" }, { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload_time = "2025-08-07T13:18:34.517Z" }, { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload_time = "2025-08-07T13:18:33.969Z" }, { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload_time = "2025-11-04T12:42:23.427Z" }, { url = "https://files.pythonhosted.org/packages/0d/da/343cd760ab2f92bac1845ca07ee3faea9fe52bee65f7bcb19f16ad7de08b/greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681", size = 1680760, upload_time = "2025-11-04T12:42:25.341Z" }, { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload_time = "2025-08-07T13:32:27.59Z" }, { url = "https://files.pythonhosted.org/packages/f7/c0/93885c4106d2626bf51fdec377d6aef740dfa5c4877461889a7cf8e565cc/greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c", size = 269859, upload_time = "2025-08-07T13:16:16.003Z" }, { url = "https://files.pythonhosted.org/packages/4d/f5/33f05dc3ba10a02dedb1485870cf81c109227d3d3aa280f0e48486cac248/greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d", size = 627610, upload_time = "2025-08-07T13:43:01.345Z" }, { url = "https://files.pythonhosted.org/packages/b2/a7/9476decef51a0844195f99ed5dc611d212e9b3515512ecdf7321543a7225/greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58", size = 639417, upload_time = "2025-08-07T13:45:32.094Z" }, { url = "https://files.pythonhosted.org/packages/bd/e0/849b9159cbb176f8c0af5caaff1faffdece7a8417fcc6fe1869770e33e21/greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4", size = 634751, upload_time = "2025-08-07T13:53:18.848Z" }, { url = "https://files.pythonhosted.org/packages/5f/d3/844e714a9bbd39034144dca8b658dcd01839b72bb0ec7d8014e33e3705f0/greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433", size = 634020, upload_time = "2025-08-07T13:18:36.841Z" }, { url = "https://files.pythonhosted.org/packages/6b/4c/f3de2a8de0e840ecb0253ad0dc7e2bb3747348e798ec7e397d783a3cb380/greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df", size = 582817, upload_time = "2025-08-07T13:18:35.48Z" }, { url = "https://files.pythonhosted.org/packages/89/80/7332915adc766035c8980b161c2e5d50b2f941f453af232c164cff5e0aeb/greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594", size = 1111985, upload_time = "2025-08-07T13:42:42.425Z" }, { url = "https://files.pythonhosted.org/packages/66/71/1928e2c80197353bcb9b50aa19c4d8e26ee6d7a900c564907665cf4b9a41/greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98", size = 1136137, upload_time = "2025-08-07T13:18:26.168Z" }, { url = "https://files.pythonhosted.org/packages/4b/bf/7bd33643e48ed45dcc0e22572f650767832bd4e1287f97434943cc402148/greenlet-3.2.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28a3c6b7cd72a96f61b0e4b2a36f681025b60ae4779cc73c1535eb5f29560b10", size = 1542941, upload_time = "2025-11-04T12:42:27.427Z" }, { url = "https://files.pythonhosted.org/packages/9b/74/4bc433f91d0d09a1c22954a371f9df928cb85e72640870158853a83415e5/greenlet-3.2.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:52206cd642670b0b320a1fd1cbfd95bca0e043179c1d8a045f2c6109dfe973be", size = 1609685, upload_time = "2025-11-04T12:42:29.242Z" }, { url = "https://files.pythonhosted.org/packages/89/48/a5dc74dde38aeb2b15d418cec76ed50e1dd3d620ccda84d8199703248968/greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b", size = 281400, upload_time = "2025-08-07T14:02:20.263Z" }, { url = "https://files.pythonhosted.org/packages/e5/44/342c4591db50db1076b8bda86ed0ad59240e3e1da17806a4cf10a6d0e447/greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb", size = 298533, upload_time = "2025-08-07T13:56:34.168Z" }, ] [[package]] name = "greenlet" version = "3.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/c7/e5/40dbda2736893e3e53d25838e0f19a2b417dfc122b9989c91918db30b5d3/greenlet-3.3.0.tar.gz", hash = "sha256:a82bb225a4e9e4d653dd2fb7b8b2d36e4fb25bc0165422a11e48b88e9e6f78fb", size = 190651, upload_time = "2025-12-04T14:49:44.05Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/32/6a/33d1702184d94106d3cdd7bfb788e19723206fce152e303473ca3b946c7b/greenlet-3.3.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:6f8496d434d5cb2dce025773ba5597f71f5410ae499d5dd9533e0653258cdb3d", size = 273658, upload_time = "2025-12-04T14:23:37.494Z" }, { url = "https://files.pythonhosted.org/packages/d6/b7/2b5805bbf1907c26e434f4e448cd8b696a0b71725204fa21a211ff0c04a7/greenlet-3.3.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b96dc7eef78fd404e022e165ec55327f935b9b52ff355b067eb4a0267fc1cffb", size = 574810, upload_time = "2025-12-04T14:50:04.154Z" }, { url = "https://files.pythonhosted.org/packages/94/38/343242ec12eddf3d8458c73f555c084359883d4ddc674240d9e61ec51fd6/greenlet-3.3.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73631cd5cccbcfe63e3f9492aaa664d278fda0ce5c3d43aeda8e77317e38efbd", size = 586248, upload_time = "2025-12-04T14:57:39.35Z" }, { url = "https://files.pythonhosted.org/packages/f0/d0/0ae86792fb212e4384041e0ef8e7bc66f59a54912ce407d26a966ed2914d/greenlet-3.3.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b299a0cb979f5d7197442dccc3aee67fce53500cd88951b7e6c35575701c980b", size = 597403, upload_time = "2025-12-04T15:07:10.831Z" }, { url = "https://files.pythonhosted.org/packages/b6/a8/15d0aa26c0036a15d2659175af00954aaaa5d0d66ba538345bd88013b4d7/greenlet-3.3.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7dee147740789a4632cace364816046e43310b59ff8fb79833ab043aefa72fd5", size = 586910, upload_time = "2025-12-04T14:25:59.705Z" }, { url = "https://files.pythonhosted.org/packages/e1/9b/68d5e3b7ccaba3907e5532cf8b9bf16f9ef5056a008f195a367db0ff32db/greenlet-3.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:39b28e339fc3c348427560494e28d8a6f3561c8d2bcf7d706e1c624ed8d822b9", size = 1547206, upload_time = "2025-12-04T15:04:21.027Z" }, { url = "https://files.pythonhosted.org/packages/66/bd/e3086ccedc61e49f91e2cfb5ffad9d8d62e5dc85e512a6200f096875b60c/greenlet-3.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b3c374782c2935cc63b2a27ba8708471de4ad1abaa862ffdb1ef45a643ddbb7d", size = 1613359, upload_time = "2025-12-04T14:27:26.548Z" }, { url = "https://files.pythonhosted.org/packages/f4/6b/d4e73f5dfa888364bbf02efa85616c6714ae7c631c201349782e5b428925/greenlet-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:b49e7ed51876b459bd645d83db257f0180e345d3f768a35a85437a24d5a49082", size = 300740, upload_time = "2025-12-04T14:47:52.773Z" }, { url = "https://files.pythonhosted.org/packages/1f/cb/48e964c452ca2b92175a9b2dca037a553036cb053ba69e284650ce755f13/greenlet-3.3.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e29f3018580e8412d6aaf5641bb7745d38c85228dacf51a73bd4e26ddf2a6a8e", size = 274908, upload_time = "2025-12-04T14:23:26.435Z" }, { url = "https://files.pythonhosted.org/packages/28/da/38d7bff4d0277b594ec557f479d65272a893f1f2a716cad91efeb8680953/greenlet-3.3.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a687205fb22794e838f947e2194c0566d3812966b41c78709554aa883183fb62", size = 577113, upload_time = "2025-12-04T14:50:05.493Z" }, { url = "https://files.pythonhosted.org/packages/3c/f2/89c5eb0faddc3ff014f1c04467d67dee0d1d334ab81fadbf3744847f8a8a/greenlet-3.3.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4243050a88ba61842186cb9e63c7dfa677ec146160b0efd73b855a3d9c7fcf32", size = 590338, upload_time = "2025-12-04T14:57:41.136Z" }, { url = "https://files.pythonhosted.org/packages/80/d7/db0a5085035d05134f8c089643da2b44cc9b80647c39e93129c5ef170d8f/greenlet-3.3.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:670d0f94cd302d81796e37299bcd04b95d62403883b24225c6b5271466612f45", size = 601098, upload_time = "2025-12-04T15:07:11.898Z" }, { url = "https://files.pythonhosted.org/packages/dc/a6/e959a127b630a58e23529972dbc868c107f9d583b5a9f878fb858c46bc1a/greenlet-3.3.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb3a8ec3db4a3b0eb8a3c25436c2d49e3505821802074969db017b87bc6a948", size = 590206, upload_time = "2025-12-04T14:26:01.254Z" }, { url = "https://files.pythonhosted.org/packages/48/60/29035719feb91798693023608447283b266b12efc576ed013dd9442364bb/greenlet-3.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2de5a0b09eab81fc6a382791b995b1ccf2b172a9fec934747a7a23d2ff291794", size = 1550668, upload_time = "2025-12-04T15:04:22.439Z" }, { url = "https://files.pythonhosted.org/packages/0a/5f/783a23754b691bfa86bd72c3033aa107490deac9b2ef190837b860996c9f/greenlet-3.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4449a736606bd30f27f8e1ff4678ee193bc47f6ca810d705981cfffd6ce0d8c5", size = 1615483, upload_time = "2025-12-04T14:27:28.083Z" }, { url = "https://files.pythonhosted.org/packages/1d/d5/c339b3b4bc8198b7caa4f2bd9fd685ac9f29795816d8db112da3d04175bb/greenlet-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:7652ee180d16d447a683c04e4c5f6441bae7ba7b17ffd9f6b3aff4605e9e6f71", size = 301164, upload_time = "2025-12-04T14:42:51.577Z" }, { url = "https://files.pythonhosted.org/packages/f8/0a/a3871375c7b9727edaeeea994bfff7c63ff7804c9829c19309ba2e058807/greenlet-3.3.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:b01548f6e0b9e9784a2c99c5651e5dc89ffcbe870bc5fb2e5ef864e9cc6b5dcb", size = 276379, upload_time = "2025-12-04T14:23:30.498Z" }, { url = "https://files.pythonhosted.org/packages/43/ab/7ebfe34dce8b87be0d11dae91acbf76f7b8246bf9d6b319c741f99fa59c6/greenlet-3.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349345b770dc88f81506c6861d22a6ccd422207829d2c854ae2af8025af303e3", size = 597294, upload_time = "2025-12-04T14:50:06.847Z" }, { url = "https://files.pythonhosted.org/packages/a4/39/f1c8da50024feecd0793dbd5e08f526809b8ab5609224a2da40aad3a7641/greenlet-3.3.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8e18ed6995e9e2c0b4ed264d2cf89260ab3ac7e13555b8032b25a74c6d18655", size = 607742, upload_time = "2025-12-04T14:57:42.349Z" }, { url = "https://files.pythonhosted.org/packages/77/cb/43692bcd5f7a0da6ec0ec6d58ee7cddb606d055ce94a62ac9b1aa481e969/greenlet-3.3.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c024b1e5696626890038e34f76140ed1daf858e37496d33f2af57f06189e70d7", size = 622297, upload_time = "2025-12-04T15:07:13.552Z" }, { url = "https://files.pythonhosted.org/packages/75/b0/6bde0b1011a60782108c01de5913c588cf51a839174538d266de15e4bf4d/greenlet-3.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:047ab3df20ede6a57c35c14bf5200fcf04039d50f908270d3f9a7a82064f543b", size = 609885, upload_time = "2025-12-04T14:26:02.368Z" }, { url = "https://files.pythonhosted.org/packages/49/0e/49b46ac39f931f59f987b7cd9f34bfec8ef81d2a1e6e00682f55be5de9f4/greenlet-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d9ad37fc657b1102ec880e637cccf20191581f75c64087a549e66c57e1ceb53", size = 1567424, upload_time = "2025-12-04T15:04:23.757Z" }, { url = "https://files.pythonhosted.org/packages/05/f5/49a9ac2dff7f10091935def9165c90236d8f175afb27cbed38fb1d61ab6b/greenlet-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83cd0e36932e0e7f36a64b732a6f60c2fc2df28c351bae79fbaf4f8092fe7614", size = 1636017, upload_time = "2025-12-04T14:27:29.688Z" }, { url = "https://files.pythonhosted.org/packages/6c/79/3912a94cf27ec503e51ba493692d6db1e3cd8ac7ac52b0b47c8e33d7f4f9/greenlet-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7a34b13d43a6b78abf828a6d0e87d3385680eaf830cd60d20d52f249faabf39", size = 301964, upload_time = "2025-12-04T14:36:58.316Z" }, { url = "https://files.pythonhosted.org/packages/02/2f/28592176381b9ab2cafa12829ba7b472d177f3acc35d8fbcf3673d966fff/greenlet-3.3.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:a1e41a81c7e2825822f4e068c48cb2196002362619e2d70b148f20a831c00739", size = 275140, upload_time = "2025-12-04T14:23:01.282Z" }, { url = "https://files.pythonhosted.org/packages/2c/80/fbe937bf81e9fca98c981fe499e59a3f45df2a04da0baa5c2be0dca0d329/greenlet-3.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f515a47d02da4d30caaa85b69474cec77b7929b2e936ff7fb853d42f4bf8808", size = 599219, upload_time = "2025-12-04T14:50:08.309Z" }, { url = "https://files.pythonhosted.org/packages/c2/ff/7c985128f0514271b8268476af89aee6866df5eec04ac17dcfbc676213df/greenlet-3.3.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d2d9fd66bfadf230b385fdc90426fcd6eb64db54b40c495b72ac0feb5766c54", size = 610211, upload_time = "2025-12-04T14:57:43.968Z" }, { url = "https://files.pythonhosted.org/packages/79/07/c47a82d881319ec18a4510bb30463ed6891f2ad2c1901ed5ec23d3de351f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30a6e28487a790417d036088b3bcb3f3ac7d8babaa7d0139edbaddebf3af9492", size = 624311, upload_time = "2025-12-04T15:07:14.697Z" }, { url = "https://files.pythonhosted.org/packages/fd/8e/424b8c6e78bd9837d14ff7df01a9829fc883ba2ab4ea787d4f848435f23f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:087ea5e004437321508a8d6f20efc4cfec5e3c30118e1417ea96ed1d93950527", size = 612833, upload_time = "2025-12-04T14:26:03.669Z" }, { url = "https://files.pythonhosted.org/packages/b5/ba/56699ff9b7c76ca12f1cdc27a886d0f81f2189c3455ff9f65246780f713d/greenlet-3.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab97cf74045343f6c60a39913fa59710e4bd26a536ce7ab2397adf8b27e67c39", size = 1567256, upload_time = "2025-12-04T15:04:25.276Z" }, { url = "https://files.pythonhosted.org/packages/1e/37/f31136132967982d698c71a281a8901daf1a8fbab935dce7c0cf15f942cc/greenlet-3.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5375d2e23184629112ca1ea89a53389dddbffcf417dad40125713d88eb5f96e8", size = 1636483, upload_time = "2025-12-04T14:27:30.804Z" }, { url = "https://files.pythonhosted.org/packages/7e/71/ba21c3fb8c5dce83b8c01f458a42e99ffdb1963aeec08fff5a18588d8fd7/greenlet-3.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:9ee1942ea19550094033c35d25d20726e4f1c40d59545815e1128ac58d416d38", size = 301833, upload_time = "2025-12-04T14:32:23.929Z" }, { url = "https://files.pythonhosted.org/packages/d7/7c/f0a6d0ede2c7bf092d00bc83ad5bafb7e6ec9b4aab2fbdfa6f134dc73327/greenlet-3.3.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:60c2ef0f578afb3c8d92ea07ad327f9a062547137afe91f38408f08aacab667f", size = 275671, upload_time = "2025-12-04T14:23:05.267Z" }, { url = "https://files.pythonhosted.org/packages/44/06/dac639ae1a50f5969d82d2e3dd9767d30d6dbdbab0e1a54010c8fe90263c/greenlet-3.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5d554d0712ba1de0a6c94c640f7aeba3f85b3a6e1f2899c11c2c0428da9365", size = 646360, upload_time = "2025-12-04T14:50:10.026Z" }, { url = "https://files.pythonhosted.org/packages/e0/94/0fb76fe6c5369fba9bf98529ada6f4c3a1adf19e406a47332245ef0eb357/greenlet-3.3.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3a898b1e9c5f7307ebbde4102908e6cbfcb9ea16284a3abe15cab996bee8b9b3", size = 658160, upload_time = "2025-12-04T14:57:45.41Z" }, { url = "https://files.pythonhosted.org/packages/93/79/d2c70cae6e823fac36c3bbc9077962105052b7ef81db2f01ec3b9bf17e2b/greenlet-3.3.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dcd2bdbd444ff340e8d6bdf54d2f206ccddbb3ccfdcd3c25bf4afaa7b8f0cf45", size = 671388, upload_time = "2025-12-04T15:07:15.789Z" }, { url = "https://files.pythonhosted.org/packages/b8/14/bab308fc2c1b5228c3224ec2bf928ce2e4d21d8046c161e44a2012b5203e/greenlet-3.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5773edda4dc00e173820722711d043799d3adb4f01731f40619e07ea2750b955", size = 660166, upload_time = "2025-12-04T14:26:05.099Z" }, { url = "https://files.pythonhosted.org/packages/4b/d2/91465d39164eaa0085177f61983d80ffe746c5a1860f009811d498e7259c/greenlet-3.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac0549373982b36d5fd5d30beb8a7a33ee541ff98d2b502714a09f1169f31b55", size = 1615193, upload_time = "2025-12-04T15:04:27.041Z" }, { url = "https://files.pythonhosted.org/packages/42/1b/83d110a37044b92423084d52d5d5a3b3a73cafb51b547e6d7366ff62eff1/greenlet-3.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d198d2d977460358c3b3a4dc844f875d1adb33817f0613f663a656f463764ccc", size = 1683653, upload_time = "2025-12-04T14:27:32.366Z" }, { url = "https://files.pythonhosted.org/packages/7c/9a/9030e6f9aa8fd7808e9c31ba4c38f87c4f8ec324ee67431d181fe396d705/greenlet-3.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:73f51dd0e0bdb596fb0417e475fa3c5e32d4c83638296e560086b8d7da7c4170", size = 305387, upload_time = "2025-12-04T14:26:51.063Z" }, { url = "https://files.pythonhosted.org/packages/a0/66/bd6317bc5932accf351fc19f177ffba53712a202f9df10587da8df257c7e/greenlet-3.3.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d6ed6f85fae6cdfdb9ce04c9bf7a08d666cfcfb914e7d006f44f840b46741931", size = 282638, upload_time = "2025-12-04T14:25:20.941Z" }, { url = "https://files.pythonhosted.org/packages/30/cf/cc81cb030b40e738d6e69502ccbd0dd1bced0588e958f9e757945de24404/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9125050fcf24554e69c4cacb086b87b3b55dc395a8b3ebe6487b045b2614388", size = 651145, upload_time = "2025-12-04T14:50:11.039Z" }, { url = "https://files.pythonhosted.org/packages/9c/ea/1020037b5ecfe95ca7df8d8549959baceb8186031da83d5ecceff8b08cd2/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:87e63ccfa13c0a0f6234ed0add552af24cc67dd886731f2261e46e241608bee3", size = 654236, upload_time = "2025-12-04T14:57:47.007Z" }, { url = "https://files.pythonhosted.org/packages/69/cc/1e4bae2e45ca2fa55299f4e85854606a78ecc37fead20d69322f96000504/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2662433acbca297c9153a4023fe2161c8dcfdcc91f10433171cf7e7d94ba2221", size = 662506, upload_time = "2025-12-04T15:07:16.906Z" }, { url = "https://files.pythonhosted.org/packages/57/b9/f8025d71a6085c441a7eaff0fd928bbb275a6633773667023d19179fe815/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3c6e9b9c1527a78520357de498b0e709fb9e2f49c3a513afd5a249007261911b", size = 653783, upload_time = "2025-12-04T14:26:06.225Z" }, { url = "https://files.pythonhosted.org/packages/f6/c7/876a8c7a7485d5d6b5c6821201d542ef28be645aa024cfe1145b35c120c1/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:286d093f95ec98fdd92fcb955003b8a3d054b4e2cab3e2707a5039e7b50520fd", size = 1614857, upload_time = "2025-12-04T15:04:28.484Z" }, { url = "https://files.pythonhosted.org/packages/4f/dc/041be1dff9f23dac5f48a43323cd0789cb798342011c19a248d9c9335536/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c10513330af5b8ae16f023e8ddbfb486ab355d04467c4679c5cfe4659975dd9", size = 1676034, upload_time = "2025-12-04T14:27:33.531Z" }, ] [[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 = "hyperlink" version = "21.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3a/51/1947bd81d75af87e3bb9e34593a4cf118115a8feb451ce7a69044ef1412e/hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b", size = 140743, upload_time = "2021-01-08T05:51:20.972Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4", size = 74638, upload_time = "2021-01-08T05:51:22.906Z" }, ] [[package]] name = "identify" version = "2.6.15" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload_time = "2025-10-02T17:43:40.631Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload_time = "2025-10-02T17:43:39.137Z" }, ] [[package]] name = "idna" version = "3.11" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload_time = "2025-10-12T14:55:20.501Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload_time = "2025-10-12T14:55:18.883Z" }, ] [[package]] name = "importlib-metadata" version = "8.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload_time = "2025-04-27T15:29:01.736Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload_time = "2025-04-27T15:29:00.214Z" }, ] [[package]] name = "incremental" version = "24.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/3c/82e84109e02c492f382c711c58a3dd91badda6d746def81a1465f74dc9f5/incremental-24.11.0.tar.gz", hash = "sha256:87d3480dbb083c1d736222511a8cf380012a8176c2456d01ef483242abbbcf8c", size = 24000, upload_time = "2025-11-28T02:30:17.861Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1d/55/0f4df2a44053867ea9cbea73fc588b03c55605cd695cee0a3d86f0029cb2/incremental-24.11.0-py3-none-any.whl", hash = "sha256:a34450716b1c4341fe6676a0598e88a39e04189f4dce5dc96f656e040baa10b3", size = 21109, upload_time = "2025-11-28T02:30:16.442Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, ] [[package]] name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload_time = "2025-10-18T21:55:43.219Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload_time = "2025-10-18T21:55:41.639Z" }, ] [[package]] name = "jaraco-functools" version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f7/ed/1aa2d585304ec07262e1a83a9889880701079dde796ac7b1d1826f40c63d/jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294", size = 19755, upload_time = "2025-08-18T20:05:09.91Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b4/09/726f168acad366b11e420df31bf1c702a54d373a83f968d94141a8c3fde0/jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8", size = 10408, upload_time = "2025-08-18T20:05:08.69Z" }, ] [[package]] name = "librt" version = "0.7.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b3/d9/6f3d3fcf5e5543ed8a60cc70fa7d50508ed60b8a10e9af6d2058159ab54e/librt-0.7.3.tar.gz", hash = "sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798", size = 144549, upload_time = "2025-12-06T19:04:45.553Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/4d/66/79a14e672256ef58144a24eb49adb338ec02de67ff4b45320af6504682ab/librt-0.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a", size = 54707, upload_time = "2025-12-06T19:03:10.881Z" }, { url = "https://files.pythonhosted.org/packages/58/fa/b709c65a9d5eab85f7bcfe0414504d9775aaad6e78727a0327e175474caa/librt-0.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec", size = 56670, upload_time = "2025-12-06T19:03:12.107Z" }, { url = "https://files.pythonhosted.org/packages/3a/56/0685a0772ec89ddad4c00e6b584603274c3d818f9a68e2c43c4eb7b39ee9/librt-0.7.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a", size = 161045, upload_time = "2025-12-06T19:03:13.444Z" }, { url = "https://files.pythonhosted.org/packages/4e/d9/863ada0c5ce48aefb89df1555e392b2209fcb6daee4c153c031339b9a89b/librt-0.7.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7", size = 169532, upload_time = "2025-12-06T19:03:14.699Z" }, { url = "https://files.pythonhosted.org/packages/68/a0/71da6c8724fd16c31749905ef1c9e11de206d9301b5be984bf2682b4efb3/librt-0.7.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51", size = 183277, upload_time = "2025-12-06T19:03:16.446Z" }, { url = "https://files.pythonhosted.org/packages/8c/bf/9c97bf2f8338ba1914de233ea312bba2bbd7c59f43f807b3e119796bab18/librt-0.7.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b", size = 179045, upload_time = "2025-12-06T19:03:17.838Z" }, { url = "https://files.pythonhosted.org/packages/b3/b1/ceea067f489e904cb4ddcca3c9b06ba20229bc3fa7458711e24a5811f162/librt-0.7.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90", size = 173521, upload_time = "2025-12-06T19:03:19.17Z" }, { url = "https://files.pythonhosted.org/packages/7a/41/6cb18f5da9c89ed087417abb0127a445a50ad4eaf1282ba5b52588187f47/librt-0.7.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71", size = 193592, upload_time = "2025-12-06T19:03:20.637Z" }, { url = "https://files.pythonhosted.org/packages/4c/3c/fcef208746584e7c78584b7aedc617130c4a4742cb8273361bbda8b183b5/librt-0.7.3-cp310-cp310-win32.whl", hash = "sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c", size = 47201, upload_time = "2025-12-06T19:03:21.764Z" }, { url = "https://files.pythonhosted.org/packages/c4/bf/d8a6c35d1b2b789a4df9b3ddb1c8f535ea373fde2089698965a8f0d62138/librt-0.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806", size = 54371, upload_time = "2025-12-06T19:03:23.231Z" }, { url = "https://files.pythonhosted.org/packages/21/e6/f6391f5c6f158d31ed9af6bd1b1bcd3ffafdea1d816bc4219d0d90175a7f/librt-0.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af", size = 54711, upload_time = "2025-12-06T19:03:24.6Z" }, { url = "https://files.pythonhosted.org/packages/ab/1b/53c208188c178987c081560a0fcf36f5ca500d5e21769596c845ef2f40d4/librt-0.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5", size = 56664, upload_time = "2025-12-06T19:03:25.969Z" }, { url = "https://files.pythonhosted.org/packages/cb/5c/d9da832b9a1e5f8366e8a044ec80217945385b26cb89fd6f94bfdc7d80b0/librt-0.7.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7", size = 161701, upload_time = "2025-12-06T19:03:27.035Z" }, { url = "https://files.pythonhosted.org/packages/20/aa/1e0a7aba15e78529dd21f233076b876ee58c8b8711b1793315bdd3b263b0/librt-0.7.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445", size = 171040, upload_time = "2025-12-06T19:03:28.482Z" }, { url = "https://files.pythonhosted.org/packages/69/46/3cfa325c1c2bc25775ec6ec1718cfbec9cff4ac767d37d2d3a2d1cc6f02c/librt-0.7.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7", size = 184720, upload_time = "2025-12-06T19:03:29.599Z" }, { url = "https://files.pythonhosted.org/packages/99/bb/e4553433d7ac47f4c75d0a7e59b13aee0e08e88ceadbee356527a9629b0a/librt-0.7.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b", size = 180731, upload_time = "2025-12-06T19:03:31.201Z" }, { url = "https://files.pythonhosted.org/packages/35/89/51cd73006232981a3106d4081fbaa584ac4e27b49bc02266468d3919db03/librt-0.7.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720", size = 174565, upload_time = "2025-12-06T19:03:32.818Z" }, { url = "https://files.pythonhosted.org/packages/42/54/0578a78b587e5aa22486af34239a052c6366835b55fc307bc64380229e3f/librt-0.7.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a", size = 195247, upload_time = "2025-12-06T19:03:34.434Z" }, { url = "https://files.pythonhosted.org/packages/b5/0a/ee747cd999753dd9447e50b98fc36ee433b6c841a42dbf6d47b64b32a56e/librt-0.7.3-cp311-cp311-win32.whl", hash = "sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2", size = 47514, upload_time = "2025-12-06T19:03:35.959Z" }, { url = "https://files.pythonhosted.org/packages/ec/af/8b13845178dec488e752878f8e290f8f89e7e34ae1528b70277aa1a6dd1e/librt-0.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e", size = 54695, upload_time = "2025-12-06T19:03:36.956Z" }, { url = "https://files.pythonhosted.org/packages/02/7a/ae59578501b1a25850266778f59279f4f3e726acc5c44255bfcb07b4bc57/librt-0.7.3-cp311-cp311-win_arm64.whl", hash = "sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0", size = 48142, upload_time = "2025-12-06T19:03:38.263Z" }, { url = "https://files.pythonhosted.org/packages/29/90/ed8595fa4e35b6020317b5ea8d226a782dcbac7a997c19ae89fb07a41c66/librt-0.7.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3", size = 55687, upload_time = "2025-12-06T19:03:39.245Z" }, { url = "https://files.pythonhosted.org/packages/dd/f6/6a20702a07b41006cb001a759440cb6b5362530920978f64a2b2ae2bf729/librt-0.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18", size = 57127, upload_time = "2025-12-06T19:03:40.3Z" }, { url = "https://files.pythonhosted.org/packages/79/f3/b0c4703d5ffe9359b67bb2ccb86c42d4e930a363cfc72262ac3ba53cff3e/librt-0.7.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60", size = 165336, upload_time = "2025-12-06T19:03:41.369Z" }, { url = "https://files.pythonhosted.org/packages/02/69/3ba05b73ab29ccbe003856232cea4049769be5942d799e628d1470ed1694/librt-0.7.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed", size = 174237, upload_time = "2025-12-06T19:03:42.44Z" }, { url = "https://files.pythonhosted.org/packages/22/ad/d7c2671e7bf6c285ef408aa435e9cd3fdc06fd994601e1f2b242df12034f/librt-0.7.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e", size = 189017, upload_time = "2025-12-06T19:03:44.01Z" }, { url = "https://files.pythonhosted.org/packages/f4/94/d13f57193148004592b618555f296b41d2d79b1dc814ff8b3273a0bf1546/librt-0.7.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b", size = 183983, upload_time = "2025-12-06T19:03:45.834Z" }, { url = "https://files.pythonhosted.org/packages/02/10/b612a9944ebd39fa143c7e2e2d33f2cb790205e025ddd903fb509a3a3bb3/librt-0.7.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f", size = 177602, upload_time = "2025-12-06T19:03:46.944Z" }, { url = "https://files.pythonhosted.org/packages/1f/48/77bc05c4cc232efae6c5592c0095034390992edbd5bae8d6cf1263bb7157/librt-0.7.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c", size = 199282, upload_time = "2025-12-06T19:03:48.069Z" }, { url = "https://files.pythonhosted.org/packages/12/aa/05916ccd864227db1ffec2a303ae34f385c6b22d4e7ce9f07054dbcf083c/librt-0.7.3-cp312-cp312-win32.whl", hash = "sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b", size = 47879, upload_time = "2025-12-06T19:03:49.289Z" }, { url = "https://files.pythonhosted.org/packages/50/92/7f41c42d31ea818b3c4b9cc1562e9714bac3c676dd18f6d5dd3d0f2aa179/librt-0.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a", size = 54972, upload_time = "2025-12-06T19:03:50.335Z" }, { url = "https://files.pythonhosted.org/packages/3f/dc/53582bbfb422311afcbc92adb75711f04e989cec052f08ec0152fbc36c9c/librt-0.7.3-cp312-cp312-win_arm64.whl", hash = "sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc", size = 48338, upload_time = "2025-12-06T19:03:51.431Z" }, { url = "https://files.pythonhosted.org/packages/93/7d/e0ce1837dfb452427db556e6d4c5301ba3b22fe8de318379fbd0593759b9/librt-0.7.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed", size = 55742, upload_time = "2025-12-06T19:03:52.459Z" }, { url = "https://files.pythonhosted.org/packages/be/c0/3564262301e507e1d5cf31c7d84cb12addf0d35e05ba53312494a2eba9a4/librt-0.7.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc", size = 57163, upload_time = "2025-12-06T19:03:53.516Z" }, { url = "https://files.pythonhosted.org/packages/be/ac/245e72b7e443d24a562f6047563c7f59833384053073ef9410476f68505b/librt-0.7.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e", size = 165840, upload_time = "2025-12-06T19:03:54.918Z" }, { url = "https://files.pythonhosted.org/packages/98/af/587e4491f40adba066ba39a450c66bad794c8d92094f936a201bfc7c2b5f/librt-0.7.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5", size = 174827, upload_time = "2025-12-06T19:03:56.082Z" }, { url = "https://files.pythonhosted.org/packages/78/21/5b8c60ea208bc83dd00421022a3874330685d7e856404128dc3728d5d1af/librt-0.7.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055", size = 189612, upload_time = "2025-12-06T19:03:57.507Z" }, { url = "https://files.pythonhosted.org/packages/da/2f/8b819169ef696421fb81cd04c6cdf225f6e96f197366001e9d45180d7e9e/librt-0.7.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292", size = 184584, upload_time = "2025-12-06T19:03:58.686Z" }, { url = "https://files.pythonhosted.org/packages/6c/fc/af9d225a9395b77bd7678362cb055d0b8139c2018c37665de110ca388022/librt-0.7.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910", size = 178269, upload_time = "2025-12-06T19:03:59.769Z" }, { url = "https://files.pythonhosted.org/packages/6c/d8/7b4fa1683b772966749d5683aa3fd605813defffe157833a8fa69cc89207/librt-0.7.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093", size = 199852, upload_time = "2025-12-06T19:04:00.901Z" }, { url = "https://files.pythonhosted.org/packages/77/e8/4598413aece46ca38d9260ef6c51534bd5f34b5c21474fcf210ce3a02123/librt-0.7.3-cp313-cp313-win32.whl", hash = "sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe", size = 47936, upload_time = "2025-12-06T19:04:02.054Z" }, { url = "https://files.pythonhosted.org/packages/af/80/ac0e92d5ef8c6791b3e2c62373863827a279265e0935acdf807901353b0e/librt-0.7.3-cp313-cp313-win_amd64.whl", hash = "sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0", size = 54965, upload_time = "2025-12-06T19:04:03.224Z" }, { url = "https://files.pythonhosted.org/packages/f1/fd/042f823fcbff25c1449bb4203a29919891ca74141b68d3a5f6612c4ce283/librt-0.7.3-cp313-cp313-win_arm64.whl", hash = "sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a", size = 48350, upload_time = "2025-12-06T19:04:04.234Z" }, { url = "https://files.pythonhosted.org/packages/3e/ae/c6ecc7bb97134a71b5241e8855d39964c0e5f4d96558f0d60593892806d2/librt-0.7.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93", size = 55175, upload_time = "2025-12-06T19:04:05.308Z" }, { url = "https://files.pythonhosted.org/packages/cf/bc/2cc0cb0ab787b39aa5c7645cd792433c875982bdf12dccca558b89624594/librt-0.7.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e", size = 56881, upload_time = "2025-12-06T19:04:06.674Z" }, { url = "https://files.pythonhosted.org/packages/8e/87/397417a386190b70f5bf26fcedbaa1515f19dce33366e2684c6b7ee83086/librt-0.7.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207", size = 163710, upload_time = "2025-12-06T19:04:08.437Z" }, { url = "https://files.pythonhosted.org/packages/c9/37/7338f85b80e8a17525d941211451199845093ca242b32efbf01df8531e72/librt-0.7.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f", size = 172471, upload_time = "2025-12-06T19:04:10.124Z" }, { url = "https://files.pythonhosted.org/packages/3b/e0/741704edabbfae2c852fedc1b40d9ed5a783c70ed3ed8e4fe98f84b25d13/librt-0.7.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678", size = 186804, upload_time = "2025-12-06T19:04:11.586Z" }, { url = "https://files.pythonhosted.org/packages/f4/d1/0a82129d6ba242f3be9af34815be089f35051bc79619f5c27d2c449ecef6/librt-0.7.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218", size = 181817, upload_time = "2025-12-06T19:04:12.802Z" }, { url = "https://files.pythonhosted.org/packages/4f/32/704f80bcf9979c68d4357c46f2af788fbf9d5edda9e7de5786ed2255e911/librt-0.7.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620", size = 175602, upload_time = "2025-12-06T19:04:14.004Z" }, { url = "https://files.pythonhosted.org/packages/f7/6d/4355cfa0fae0c062ba72f541d13db5bc575770125a7ad3d4f46f4109d305/librt-0.7.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e", size = 196497, upload_time = "2025-12-06T19:04:15.487Z" }, { url = "https://files.pythonhosted.org/packages/2e/eb/ac6d8517d44209e5a712fde46f26d0055e3e8969f24d715f70bd36056230/librt-0.7.3-cp314-cp314-win32.whl", hash = "sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3", size = 44678, upload_time = "2025-12-06T19:04:16.688Z" }, { url = "https://files.pythonhosted.org/packages/e9/93/238f026d141faf9958da588c761a0812a1a21c98cc54a76f3608454e4e59/librt-0.7.3-cp314-cp314-win_amd64.whl", hash = "sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010", size = 51689, upload_time = "2025-12-06T19:04:17.726Z" }, { url = "https://files.pythonhosted.org/packages/52/44/43f462ad9dcf9ed7d3172fe2e30d77b980956250bd90e9889a9cca93df2a/librt-0.7.3-cp314-cp314-win_arm64.whl", hash = "sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e", size = 44662, upload_time = "2025-12-06T19:04:18.771Z" }, { url = "https://files.pythonhosted.org/packages/1d/35/fed6348915f96b7323241de97f26e2af481e95183b34991df12fd5ce31b1/librt-0.7.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a", size = 57347, upload_time = "2025-12-06T19:04:19.812Z" }, { url = "https://files.pythonhosted.org/packages/9a/f2/045383ccc83e3fea4fba1b761796584bc26817b6b2efb6b8a6731431d16f/librt-0.7.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a", size = 59223, upload_time = "2025-12-06T19:04:20.862Z" }, { url = "https://files.pythonhosted.org/packages/77/3f/c081f8455ab1d7f4a10dbe58463ff97119272ff32494f21839c3b9029c2c/librt-0.7.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f", size = 183861, upload_time = "2025-12-06T19:04:21.963Z" }, { url = "https://files.pythonhosted.org/packages/1d/f5/73c5093c22c31fbeaebc25168837f05ebfd8bf26ce00855ef97a5308f36f/librt-0.7.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e", size = 194594, upload_time = "2025-12-06T19:04:23.14Z" }, { url = "https://files.pythonhosted.org/packages/78/b8/d5f17d4afe16612a4a94abfded94c16c5a033f183074fb130dfe56fc1a42/librt-0.7.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e", size = 206759, upload_time = "2025-12-06T19:04:24.328Z" }, { url = "https://files.pythonhosted.org/packages/36/2e/021765c1be85ee23ffd5b5b968bb4cba7526a4db2a0fc27dcafbdfc32da7/librt-0.7.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70", size = 203210, upload_time = "2025-12-06T19:04:25.544Z" }, { url = "https://files.pythonhosted.org/packages/77/f0/9923656e42da4fd18c594bd08cf6d7e152d4158f8b808e210d967f0dcceb/librt-0.7.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712", size = 196708, upload_time = "2025-12-06T19:04:26.725Z" }, { url = "https://files.pythonhosted.org/packages/fc/0b/0708b886ac760e64d6fbe7e16024e4be3ad1a3629d19489a97e9cf4c3431/librt-0.7.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42", size = 217212, upload_time = "2025-12-06T19:04:27.892Z" }, { url = "https://files.pythonhosted.org/packages/5d/7f/12a73ff17bca4351e73d585dd9ebf46723c4a8622c4af7fe11a2e2d011ff/librt-0.7.3-cp314-cp314t-win32.whl", hash = "sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd", size = 45586, upload_time = "2025-12-06T19:04:29.116Z" }, { url = "https://files.pythonhosted.org/packages/e2/df/8decd032ac9b995e4f5606cde783711a71094128d88d97a52e397daf2c89/librt-0.7.3-cp314-cp314t-win_amd64.whl", hash = "sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f", size = 53002, upload_time = "2025-12-06T19:04:30.173Z" }, { url = "https://files.pythonhosted.org/packages/de/0c/6605b6199de8178afe7efc77ca1d8e6db00453bc1d3349d27605c0f42104/librt-0.7.3-cp314-cp314t-win_arm64.whl", hash = "sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b", size = 45647, upload_time = "2025-12-06T19:04:31.302Z" }, { url = "https://files.pythonhosted.org/packages/e1/70/b3f19e3bb34f44e218c8271dc0b2b14eb6b183fbccbececf94c71e2b5e69/librt-0.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0", size = 54850, upload_time = "2025-12-06T19:04:32.742Z" }, { url = "https://files.pythonhosted.org/packages/a0/97/6599ed7726aaa9b5bacea206d5861b94e76866240e2f394a59594bf3db46/librt-0.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea", size = 56797, upload_time = "2025-12-06T19:04:34.193Z" }, { url = "https://files.pythonhosted.org/packages/33/83/216db13224a6f688787f456909bbc50f9d951c0f4bea8ba38a2eb931d581/librt-0.7.3-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65", size = 159681, upload_time = "2025-12-06T19:04:35.554Z" }, { url = "https://files.pythonhosted.org/packages/83/23/0a490c8ba3bc90090647ac7b9b3c63c16af7378bcabe3ff4c7d7890d66e5/librt-0.7.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a", size = 168505, upload_time = "2025-12-06T19:04:36.748Z" }, { url = "https://files.pythonhosted.org/packages/5e/16/b47c60805285caa06728d61d933fdd6db5b7321f375ce496cb7fdbeb1a44/librt-0.7.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809", size = 182234, upload_time = "2025-12-06T19:04:37.889Z" }, { url = "https://files.pythonhosted.org/packages/2d/2f/bef211d7f0d55fa2484d2c644b2cdae8c9c5eec050754b0516e6582ad452/librt-0.7.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b", size = 178276, upload_time = "2025-12-06T19:04:39.408Z" }, { url = "https://files.pythonhosted.org/packages/3d/dd/5a3e7762b086b62fabb31fd4deaaf3ba888cfdd3b8f2e3247f076c18a6ff/librt-0.7.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135", size = 172602, upload_time = "2025-12-06T19:04:40.619Z" }, { url = "https://files.pythonhosted.org/packages/fe/d8/533d5bfd5b377eb03ed54101814b530fc1f9bbe0e79971c641a3f15bfb33/librt-0.7.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258", size = 192741, upload_time = "2025-12-06T19:04:41.738Z" }, { url = "https://files.pythonhosted.org/packages/9f/69/0b87ce8e95f65ebc864f390f1139b8fe9fac6fb64b797307447b1719610c/librt-0.7.3-cp39-cp39-win32.whl", hash = "sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec", size = 47154, upload_time = "2025-12-06T19:04:42.96Z" }, { url = "https://files.pythonhosted.org/packages/c0/1c/070dee0add2d6e742be4d8b965d5a37c24562b43e8ef7deba8ed5b5d3c0f/librt-0.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d", size = 54339, upload_time = "2025-12-06T19:04:44.415Z" }, ] [[package]] name = "more-itertools" version = "10.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload_time = "2025-09-02T15:23:11.018Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload_time = "2025-09-02T15:23:09.635Z" }, ] [[package]] name = "msgpack" version = "1.1.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload_time = "2025-10-08T09:15:56.596Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload_time = "2025-10-08T09:14:38.722Z" }, { url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload_time = "2025-10-08T09:14:40.082Z" }, { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload_time = "2025-10-08T09:14:41.151Z" }, { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload_time = "2025-10-08T09:14:42.821Z" }, { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload_time = "2025-10-08T09:14:44.38Z" }, { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload_time = "2025-10-08T09:14:45.56Z" }, { url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload_time = "2025-10-08T09:14:47.334Z" }, { url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload_time = "2025-10-08T09:14:48.665Z" }, { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload_time = "2025-10-08T09:14:49.967Z" }, { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload_time = "2025-10-08T09:14:50.958Z" }, { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload_time = "2025-10-08T09:14:51.997Z" }, { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload_time = "2025-10-08T09:14:53.477Z" }, { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload_time = "2025-10-08T09:14:54.648Z" }, { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload_time = "2025-10-08T09:14:56.328Z" }, { url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload_time = "2025-10-08T09:14:57.882Z" }, { url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload_time = "2025-10-08T09:14:59.177Z" }, { url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload_time = "2025-10-08T09:15:00.48Z" }, { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload_time = "2025-10-08T09:15:01.472Z" }, { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload_time = "2025-10-08T09:15:03.764Z" }, { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload_time = "2025-10-08T09:15:05.136Z" }, { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload_time = "2025-10-08T09:15:06.837Z" }, { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload_time = "2025-10-08T09:15:08.179Z" }, { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload_time = "2025-10-08T09:15:09.83Z" }, { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload_time = "2025-10-08T09:15:11.11Z" }, { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload_time = "2025-10-08T09:15:12.554Z" }, { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload_time = "2025-10-08T09:15:13.589Z" }, { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload_time = "2025-10-08T09:15:14.552Z" }, { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload_time = "2025-10-08T09:15:15.543Z" }, { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload_time = "2025-10-08T09:15:16.567Z" }, { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload_time = "2025-10-08T09:15:17.825Z" }, { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload_time = "2025-10-08T09:15:19.003Z" }, { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload_time = "2025-10-08T09:15:20.183Z" }, { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload_time = "2025-10-08T09:15:21.416Z" }, { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload_time = "2025-10-08T09:15:22.431Z" }, { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload_time = "2025-10-08T09:15:23.402Z" }, { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload_time = "2025-10-08T09:15:24.408Z" }, { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload_time = "2025-10-08T09:15:25.812Z" }, { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload_time = "2025-10-08T09:15:27.22Z" }, { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload_time = "2025-10-08T09:15:28.4Z" }, { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload_time = "2025-10-08T09:15:29.764Z" }, { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload_time = "2025-10-08T09:15:31.022Z" }, { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload_time = "2025-10-08T09:15:32.265Z" }, { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload_time = "2025-10-08T09:15:33.219Z" }, { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload_time = "2025-10-08T09:15:34.225Z" }, { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload_time = "2025-10-08T09:15:35.61Z" }, { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload_time = "2025-10-08T09:15:36.619Z" }, { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload_time = "2025-10-08T09:15:37.647Z" }, { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload_time = "2025-10-08T09:15:38.794Z" }, { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload_time = "2025-10-08T09:15:40.238Z" }, { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload_time = "2025-10-08T09:15:41.505Z" }, { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload_time = "2025-10-08T09:15:42.954Z" }, { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload_time = "2025-10-08T09:15:43.954Z" }, { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload_time = "2025-10-08T09:15:44.959Z" }, { url = "https://files.pythonhosted.org/packages/46/73/85469b4aa71d25e5949fee50d3c2cf46f69cea619fe97cfe309058080f75/msgpack-1.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ea5405c46e690122a76531ab97a079e184c0daf491e588592d6a23d3e32af99e", size = 81529, upload_time = "2025-10-08T09:15:46.069Z" }, { url = "https://files.pythonhosted.org/packages/6c/3a/7d4077e8ae720b29d2b299a9591969f0d105146960681ea6f4121e6d0f8d/msgpack-1.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fba231af7a933400238cb357ecccf8ab5d51535ea95d94fc35b7806218ff844", size = 84106, upload_time = "2025-10-08T09:15:47.064Z" }, { url = "https://files.pythonhosted.org/packages/df/c0/da451c74746ed9388dca1b4ec647c82945f4e2f8ce242c25fb7c0e12181f/msgpack-1.1.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a8f6e7d30253714751aa0b0c84ae28948e852ee7fb0524082e6716769124bc23", size = 396656, upload_time = "2025-10-08T09:15:48.118Z" }, { url = "https://files.pythonhosted.org/packages/e5/a1/20486c29a31ec9f0f88377fdf7eb7a67f30bcb5e0f89b7550f6f16d9373b/msgpack-1.1.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94fd7dc7d8cb0a54432f296f2246bc39474e017204ca6f4ff345941d4ed285a7", size = 404722, upload_time = "2025-10-08T09:15:49.328Z" }, { url = "https://files.pythonhosted.org/packages/ad/ae/e613b0a526d54ce85447d9665c2ff8c3210a784378d50573321d43d324b8/msgpack-1.1.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:350ad5353a467d9e3b126d8d1b90fe05ad081e2e1cef5753f8c345217c37e7b8", size = 391838, upload_time = "2025-10-08T09:15:50.517Z" }, { url = "https://files.pythonhosted.org/packages/49/6a/07f3e10ed4503045b882ef7bf8512d01d8a9e25056950a977bd5f50df1c2/msgpack-1.1.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6bde749afe671dc44893f8d08e83bf475a1a14570d67c4bb5cec5573463c8833", size = 397516, upload_time = "2025-10-08T09:15:51.646Z" }, { url = "https://files.pythonhosted.org/packages/76/9b/a86828e75986c12a3809c1e5062f5eba8e0cae3dfa2bf724ed2b1bb72b4c/msgpack-1.1.2-cp39-cp39-win32.whl", hash = "sha256:ad09b984828d6b7bb52d1d1d0c9be68ad781fa004ca39216c8a1e63c0f34ba3c", size = 64863, upload_time = "2025-10-08T09:15:53.118Z" }, { url = "https://files.pythonhosted.org/packages/14/a7/b1992b4fb3da3b413f5fb78a63bad42f256c3be2352eb69273c3789c2c96/msgpack-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:67016ae8c8965124fdede9d3769528ad8284f14d635337ffa6a713a580f6c030", size = 71540, upload_time = "2025-10-08T09:15:55.573Z" }, ] [[package]] name = "mypy" version = "1.19.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "librt" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f9/b5/b58cdc25fadd424552804bf410855d52324183112aa004f0732c5f6324cf/mypy-1.19.0.tar.gz", hash = "sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528", size = 3579025, upload_time = "2025-11-28T15:49:01.26Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/98/8f/55fb488c2b7dabd76e3f30c10f7ab0f6190c1fcbc3e97b1e588ec625bbe2/mypy-1.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8", size = 13093239, upload_time = "2025-11-28T15:45:11.342Z" }, { url = "https://files.pythonhosted.org/packages/72/1b/278beea978456c56b3262266274f335c3ba5ff2c8108b3b31bec1ffa4c1d/mypy-1.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39", size = 12156128, upload_time = "2025-11-28T15:46:02.566Z" }, { url = "https://files.pythonhosted.org/packages/21/f8/e06f951902e136ff74fd7a4dc4ef9d884faeb2f8eb9c49461235714f079f/mypy-1.19.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab", size = 12753508, upload_time = "2025-11-28T15:44:47.538Z" }, { url = "https://files.pythonhosted.org/packages/67/5a/d035c534ad86e09cee274d53cf0fd769c0b29ca6ed5b32e205be3c06878c/mypy-1.19.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e", size = 13507553, upload_time = "2025-11-28T15:44:39.26Z" }, { url = "https://files.pythonhosted.org/packages/6a/17/c4a5498e00071ef29e483a01558b285d086825b61cf1fb2629fbdd019d94/mypy-1.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3", size = 13792898, upload_time = "2025-11-28T15:44:31.102Z" }, { url = "https://files.pythonhosted.org/packages/67/f6/bb542422b3ee4399ae1cdc463300d2d91515ab834c6233f2fd1d52fa21e0/mypy-1.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134", size = 10048835, upload_time = "2025-11-28T15:48:15.744Z" }, { url = "https://files.pythonhosted.org/packages/0f/d2/010fb171ae5ac4a01cc34fbacd7544531e5ace95c35ca166dd8fd1b901d0/mypy-1.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106", size = 13010563, upload_time = "2025-11-28T15:48:23.975Z" }, { url = "https://files.pythonhosted.org/packages/41/6b/63f095c9f1ce584fdeb595d663d49e0980c735a1d2004720ccec252c5d47/mypy-1.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7", size = 12077037, upload_time = "2025-11-28T15:47:51.582Z" }, { url = "https://files.pythonhosted.org/packages/d7/83/6cb93d289038d809023ec20eb0b48bbb1d80af40511fa077da78af6ff7c7/mypy-1.19.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7", size = 12680255, upload_time = "2025-11-28T15:46:57.628Z" }, { url = "https://files.pythonhosted.org/packages/99/db/d217815705987d2cbace2edd9100926196d6f85bcb9b5af05058d6e3c8ad/mypy-1.19.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b", size = 13421472, upload_time = "2025-11-28T15:47:59.655Z" }, { url = "https://files.pythonhosted.org/packages/4e/51/d2beaca7c497944b07594f3f8aad8d2f0e8fc53677059848ae5d6f4d193e/mypy-1.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7", size = 13651823, upload_time = "2025-11-28T15:45:29.318Z" }, { url = "https://files.pythonhosted.org/packages/aa/d1/7883dcf7644db3b69490f37b51029e0870aac4a7ad34d09ceae709a3df44/mypy-1.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e", size = 10049077, upload_time = "2025-11-28T15:45:39.818Z" }, { url = "https://files.pythonhosted.org/packages/11/7e/1afa8fb188b876abeaa14460dc4983f909aaacaa4bf5718c00b2c7e0b3d5/mypy-1.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d", size = 13207728, upload_time = "2025-11-28T15:46:26.463Z" }, { url = "https://files.pythonhosted.org/packages/b2/13/f103d04962bcbefb1644f5ccb235998b32c337d6c13145ea390b9da47f3e/mypy-1.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760", size = 12202945, upload_time = "2025-11-28T15:48:49.143Z" }, { url = "https://files.pythonhosted.org/packages/e4/93/a86a5608f74a22284a8ccea8592f6e270b61f95b8588951110ad797c2ddd/mypy-1.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6", size = 12718673, upload_time = "2025-11-28T15:47:37.193Z" }, { url = "https://files.pythonhosted.org/packages/3d/58/cf08fff9ced0423b858f2a7495001fda28dc058136818ee9dffc31534ea9/mypy-1.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2", size = 13608336, upload_time = "2025-11-28T15:48:32.625Z" }, { url = "https://files.pythonhosted.org/packages/64/ed/9c509105c5a6d4b73bb08733102a3ea62c25bc02c51bca85e3134bf912d3/mypy-1.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431", size = 13833174, upload_time = "2025-11-28T15:45:48.091Z" }, { url = "https://files.pythonhosted.org/packages/cd/71/01939b66e35c6f8cb3e6fdf0b657f0fd24de2f8ba5e523625c8e72328208/mypy-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018", size = 10112208, upload_time = "2025-11-28T15:46:41.702Z" }, { url = "https://files.pythonhosted.org/packages/cb/0d/a1357e6bb49e37ce26fcf7e3cc55679ce9f4ebee0cd8b6ee3a0e301a9210/mypy-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e", size = 13191993, upload_time = "2025-11-28T15:47:22.336Z" }, { url = "https://files.pythonhosted.org/packages/5d/75/8e5d492a879ec4490e6ba664b5154e48c46c85b5ac9785792a5ec6a4d58f/mypy-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d", size = 12174411, upload_time = "2025-11-28T15:44:55.492Z" }, { url = "https://files.pythonhosted.org/packages/71/31/ad5dcee9bfe226e8eaba777e9d9d251c292650130f0450a280aec3485370/mypy-1.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba", size = 12727751, upload_time = "2025-11-28T15:44:14.169Z" }, { url = "https://files.pythonhosted.org/packages/77/06/b6b8994ce07405f6039701f4b66e9d23f499d0b41c6dd46ec28f96d57ec3/mypy-1.19.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364", size = 13593323, upload_time = "2025-11-28T15:46:34.699Z" }, { url = "https://files.pythonhosted.org/packages/68/b1/126e274484cccdf099a8e328d4fda1c7bdb98a5e888fa6010b00e1bbf330/mypy-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee", size = 13818032, upload_time = "2025-11-28T15:46:18.286Z" }, { url = "https://files.pythonhosted.org/packages/f8/56/53a8f70f562dfc466c766469133a8a4909f6c0012d83993143f2a9d48d2d/mypy-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53", size = 10120644, upload_time = "2025-11-28T15:47:43.99Z" }, { url = "https://files.pythonhosted.org/packages/b0/f4/7751f32f56916f7f8c229fe902cbdba3e4dd3f3ea9e8b872be97e7fc546d/mypy-1.19.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d", size = 13185236, upload_time = "2025-11-28T15:45:20.696Z" }, { url = "https://files.pythonhosted.org/packages/35/31/871a9531f09e78e8d145032355890384f8a5b38c95a2c7732d226b93242e/mypy-1.19.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18", size = 12213902, upload_time = "2025-11-28T15:46:10.117Z" }, { url = "https://files.pythonhosted.org/packages/58/b8/af221910dd40eeefa2077a59107e611550167b9994693fc5926a0b0f87c0/mypy-1.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7", size = 12738600, upload_time = "2025-11-28T15:44:22.521Z" }, { url = "https://files.pythonhosted.org/packages/11/9f/c39e89a3e319c1d9c734dedec1183b2cc3aefbab066ec611619002abb932/mypy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f", size = 13592639, upload_time = "2025-11-28T15:48:08.55Z" }, { url = "https://files.pythonhosted.org/packages/97/6d/ffaf5f01f5e284d9033de1267e6c1b8f3783f2cf784465378a86122e884b/mypy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835", size = 13799132, upload_time = "2025-11-28T15:47:06.032Z" }, { url = "https://files.pythonhosted.org/packages/fe/b0/c33921e73aaa0106224e5a34822411bea38046188eb781637f5a5b07e269/mypy-1.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1", size = 10269832, upload_time = "2025-11-28T15:47:29.392Z" }, { url = "https://files.pythonhosted.org/packages/b4/59/a7748ef43446163a93159d82bb270c6c4f3d94c1fcbdd2a29a7e439e74d7/mypy-1.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495", size = 13094255, upload_time = "2025-11-28T15:47:14.282Z" }, { url = "https://files.pythonhosted.org/packages/f5/0b/92ebf5abc83f559a35dcba3bd9227726b04b04178f1e521f38e647b930eb/mypy-1.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299", size = 12161414, upload_time = "2025-11-28T15:45:03.302Z" }, { url = "https://files.pythonhosted.org/packages/aa/03/19412f0a786722055a52c01b4c5d71e5b5443a89f6bbcdd445408240e217/mypy-1.19.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c", size = 12756782, upload_time = "2025-11-28T15:46:49.522Z" }, { url = "https://files.pythonhosted.org/packages/cb/85/395d53c9098b251414b0448cdadcd3277523ff36f5abda6d26ff945dbdb3/mypy-1.19.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5", size = 13503492, upload_time = "2025-11-28T15:48:57.339Z" }, { url = "https://files.pythonhosted.org/packages/dd/33/1ab1113e3778617ae7aba66b4b537f90512bd279ff65b6c984fb91fbb2d3/mypy-1.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c", size = 13787703, upload_time = "2025-11-28T15:48:41.286Z" }, { url = "https://files.pythonhosted.org/packages/4f/2d/8b0821b3e0d538de1ad96c86502256c7326274d5cb74e0b373efaada273f/mypy-1.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6", size = 10049225, upload_time = "2025-11-28T15:45:55.089Z" }, { url = "https://files.pythonhosted.org/packages/09/0e/fe228ed5aeab470c6f4eb82481837fadb642a5aa95cc8215fd2214822c10/mypy-1.19.0-py3-none-any.whl", hash = "sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9", size = 2469714, upload_time = "2025-11-28T15:45:33.22Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload_time = "2025-04-22T14:54:24.164Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload_time = "2025-04-22T14:54:22.983Z" }, ] [[package]] name = "nodeenv" version = "1.10.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload_time = "2025-12-20T14:08:54.006Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload_time = "2025-12-20T14:08:52.782Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, ] [[package]] name = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload_time = "2023-12-10T22:30:45Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, ] [[package]] name = "platformdirs" version = "4.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload_time = "2025-08-26T14:32:04.268Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload_time = "2025-08-26T14:32:02.735Z" }, ] [[package]] name = "platformdirs" version = "4.5.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload_time = "2025-12-05T13:52:58.638Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload_time = "2025-12-05T13:52:56.823Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, ] [[package]] name = "portend" version = "3.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tempora" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b7/57/be90f42996fc4f57d5742ef2c95f7f7bb8e9183af2cc11bff8e7df338888/portend-3.2.1.tar.gz", hash = "sha256:aa9d40ab1f9e14bdb7d401f42210df35d017c9b97991baeb18568cedfb8c6489", size = 12243, upload_time = "2025-05-29T20:27:45.091Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/49/11/b0b19077f80cb8972b44c96af983e8cfcdb1506090bacef137ed8b448af8/portend-3.2.1-py3-none-any.whl", hash = "sha256:bd2bb1cd8585e32f1f986c1b8eae2950c8622c648db163b711a2fc2ef8d8d492", size = 5653, upload_time = "2025-05-29T20:27:43.75Z" }, ] [[package]] name = "pre-commit" version = "4.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] dependencies = [ { name = "cfgv", version = "3.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "identify", marker = "python_full_version < '3.10'" }, { name = "nodeenv", marker = "python_full_version < '3.10'" }, { name = "pyyaml", marker = "python_full_version < '3.10'" }, { name = "virtualenv", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload_time = "2025-08-09T18:56:14.651Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload_time = "2025-08-09T18:56:13.192Z" }, ] [[package]] name = "pre-commit" version = "4.5.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] dependencies = [ { name = "cfgv", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "identify", marker = "python_full_version >= '3.10'" }, { name = "nodeenv", marker = "python_full_version >= '3.10'" }, { name = "pyyaml", marker = "python_full_version >= '3.10'" }, { name = "virtualenv", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload_time = "2025-12-16T21:14:33.552Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload_time = "2025-12-16T21:14:32.409Z" }, ] [[package]] name = "psutil" version = "7.1.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload_time = "2025-11-02T12:25:54.619Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751, upload_time = "2025-11-02T12:25:58.161Z" }, { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368, upload_time = "2025-11-02T12:26:00.491Z" }, { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134, upload_time = "2025-11-02T12:26:02.613Z" }, { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904, upload_time = "2025-11-02T12:26:05.207Z" }, { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642, upload_time = "2025-11-02T12:26:07.447Z" }, { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518, upload_time = "2025-11-02T12:26:09.719Z" }, { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843, upload_time = "2025-11-02T12:26:11.968Z" }, { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369, upload_time = "2025-11-02T12:26:14.358Z" }, { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210, upload_time = "2025-11-02T12:26:16.699Z" }, { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182, upload_time = "2025-11-02T12:26:18.848Z" }, { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466, upload_time = "2025-11-02T12:26:21.183Z" }, { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756, upload_time = "2025-11-02T12:26:23.148Z" }, { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload_time = "2025-11-02T12:26:25.284Z" }, { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload_time = "2025-11-02T12:26:27.23Z" }, { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload_time = "2025-11-02T12:26:29.48Z" }, { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload_time = "2025-11-02T12:26:31.74Z" }, { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload_time = "2025-11-02T12:26:33.887Z" }, { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload_time = "2025-11-02T12:26:36.136Z" }, ] [[package]] name = "py-ubjson" version = "0.16.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1d/c7/28220d37e041fe1df03e857fe48f768dcd30cd151480bf6f00da8713214a/py-ubjson-0.16.1.tar.gz", hash = "sha256:b9bfb8695a1c7e3632e800fb83c943bf67ed45ddd87cd0344851610c69a5a482", size = 50316, upload_time = "2020-04-18T15:05:57.698Z" } [[package]] name = "pyasn1" version = "0.6.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload_time = "2024-09-10T22:41:42.55Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload_time = "2024-09-11T16:00:36.122Z" }, ] [[package]] name = "pyasn1-modules" version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload_time = "2025-03-28T02:41:22.17Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload_time = "2025-03-28T02:41:19.028Z" }, ] [[package]] name = "pycparser" version = "2.23" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload_time = "2025-09-09T13:23:47.91Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload_time = "2025-09-09T13:23:46.651Z" }, ] [[package]] name = "pydantic" version = "2.12.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, { name = "typing-inspection" }, ] sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload_time = "2025-11-26T15:11:46.471Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload_time = "2025-11-26T15:11:44.605Z" }, ] [[package]] name = "pydantic-core" version = "2.41.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload_time = "2025-11-04T13:43:49.098Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload_time = "2025-11-04T13:39:04.116Z" }, { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload_time = "2025-11-04T13:39:06.055Z" }, { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload_time = "2025-11-04T13:39:10.41Z" }, { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload_time = "2025-11-04T13:39:12.244Z" }, { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload_time = "2025-11-04T13:39:13.962Z" }, { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload_time = "2025-11-04T13:39:15.889Z" }, { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload_time = "2025-11-04T13:39:17.403Z" }, { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload_time = "2025-11-04T13:39:19.351Z" }, { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload_time = "2025-11-04T13:39:21Z" }, { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload_time = "2025-11-04T13:39:22.606Z" }, { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload_time = "2025-11-04T13:39:25.843Z" }, { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload_time = "2025-11-04T13:39:27.92Z" }, { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload_time = "2025-11-04T13:39:29.848Z" }, { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload_time = "2025-11-04T13:39:31.373Z" }, { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload_time = "2025-11-04T13:39:32.897Z" }, { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload_time = "2025-11-04T13:39:34.469Z" }, { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload_time = "2025-11-04T13:39:36.053Z" }, { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload_time = "2025-11-04T13:39:37.753Z" }, { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload_time = "2025-11-04T13:39:40.94Z" }, { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload_time = "2025-11-04T13:39:42.523Z" }, { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload_time = "2025-11-04T13:39:44.553Z" }, { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload_time = "2025-11-04T13:39:46.238Z" }, { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload_time = "2025-11-04T13:39:48.002Z" }, { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload_time = "2025-11-04T13:39:49.705Z" }, { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload_time = "2025-11-04T13:39:51.842Z" }, { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload_time = "2025-11-04T13:39:53.485Z" }, { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload_time = "2025-11-04T13:39:56.488Z" }, { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload_time = "2025-11-04T13:39:58.079Z" }, { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload_time = "2025-11-04T13:39:59.956Z" }, { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload_time = "2025-11-04T13:40:02.241Z" }, { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload_time = "2025-11-04T13:40:04.401Z" }, { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload_time = "2025-11-04T13:40:06.072Z" }, { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload_time = "2025-11-04T13:40:07.835Z" }, { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload_time = "2025-11-04T13:40:09.804Z" }, { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload_time = "2025-11-04T13:40:12.004Z" }, { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload_time = "2025-11-04T13:40:13.868Z" }, { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload_time = "2025-11-04T13:40:15.672Z" }, { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload_time = "2025-11-04T13:40:17.532Z" }, { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload_time = "2025-11-04T13:40:19.309Z" }, { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload_time = "2025-11-04T13:40:21.548Z" }, { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload_time = "2025-11-04T13:40:23.393Z" }, { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload_time = "2025-11-04T13:40:25.248Z" }, { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload_time = "2025-11-04T13:40:27.099Z" }, { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload_time = "2025-11-04T13:40:29.806Z" }, { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload_time = "2025-11-04T13:40:33.544Z" }, { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload_time = "2025-11-04T13:40:35.479Z" }, { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload_time = "2025-11-04T13:40:37.436Z" }, { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload_time = "2025-11-04T13:40:40.289Z" }, { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload_time = "2025-11-04T13:40:42.809Z" }, { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload_time = "2025-11-04T13:40:44.752Z" }, { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload_time = "2025-11-04T13:40:46.66Z" }, { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload_time = "2025-11-04T13:40:48.575Z" }, { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload_time = "2025-11-04T13:40:50.619Z" }, { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload_time = "2025-11-04T13:40:52.631Z" }, { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload_time = "2025-11-04T13:40:54.734Z" }, { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload_time = "2025-11-04T13:40:56.68Z" }, { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload_time = "2025-11-04T13:40:58.807Z" }, { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload_time = "2025-11-04T13:41:00.853Z" }, { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload_time = "2025-11-04T13:41:03.504Z" }, { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload_time = "2025-11-04T13:41:05.804Z" }, { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload_time = "2025-11-04T13:41:07.809Z" }, { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload_time = "2025-11-04T13:41:09.827Z" }, { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload_time = "2025-11-04T13:41:12.379Z" }, { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload_time = "2025-11-04T13:41:14.627Z" }, { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload_time = "2025-11-04T13:41:16.868Z" }, { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload_time = "2025-11-04T13:41:18.934Z" }, { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload_time = "2025-11-04T13:41:21.418Z" }, { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload_time = "2025-11-04T13:41:24.076Z" }, { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload_time = "2025-11-04T13:41:26.33Z" }, { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload_time = "2025-11-04T13:41:28.569Z" }, { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload_time = "2025-11-04T13:41:31.055Z" }, { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload_time = "2025-11-04T13:41:33.21Z" }, { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload_time = "2025-11-04T13:41:35.508Z" }, { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload_time = "2025-11-04T13:41:37.732Z" }, { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload_time = "2025-11-04T13:41:40Z" }, { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload_time = "2025-11-04T13:41:42.323Z" }, { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload_time = "2025-11-04T13:41:45.221Z" }, { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload_time = "2025-11-04T13:41:47.474Z" }, { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload_time = "2025-11-04T13:41:49.992Z" }, { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload_time = "2025-11-04T13:41:54.079Z" }, { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload_time = "2025-11-04T13:41:56.606Z" }, { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload_time = "2025-11-04T13:41:58.889Z" }, { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload_time = "2025-11-04T13:42:01.186Z" }, { url = "https://files.pythonhosted.org/packages/54/db/160dffb57ed9a3705c4cbcbff0ac03bdae45f1ca7d58ab74645550df3fbd/pydantic_core-2.41.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf", size = 2107999, upload_time = "2025-11-04T13:42:03.885Z" }, { url = "https://files.pythonhosted.org/packages/a3/7d/88e7de946f60d9263cc84819f32513520b85c0f8322f9b8f6e4afc938383/pydantic_core-2.41.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5", size = 1929745, upload_time = "2025-11-04T13:42:06.075Z" }, { url = "https://files.pythonhosted.org/packages/d5/c2/aef51e5b283780e85e99ff19db0f05842d2d4a8a8cd15e63b0280029b08f/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d", size = 1920220, upload_time = "2025-11-04T13:42:08.457Z" }, { url = "https://files.pythonhosted.org/packages/c7/97/492ab10f9ac8695cd76b2fdb24e9e61f394051df71594e9bcc891c9f586e/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60", size = 2067296, upload_time = "2025-11-04T13:42:10.817Z" }, { url = "https://files.pythonhosted.org/packages/ec/23/984149650e5269c59a2a4c41d234a9570adc68ab29981825cfaf4cfad8f4/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82", size = 2231548, upload_time = "2025-11-04T13:42:13.843Z" }, { url = "https://files.pythonhosted.org/packages/71/0c/85bcbb885b9732c28bec67a222dbed5ed2d77baee1f8bba2002e8cd00c5c/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5", size = 2362571, upload_time = "2025-11-04T13:42:16.208Z" }, { url = "https://files.pythonhosted.org/packages/c0/4a/412d2048be12c334003e9b823a3fa3d038e46cc2d64dd8aab50b31b65499/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3", size = 2068175, upload_time = "2025-11-04T13:42:18.911Z" }, { url = "https://files.pythonhosted.org/packages/73/f4/c58b6a776b502d0a5540ad02e232514285513572060f0d78f7832ca3c98b/pydantic_core-2.41.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425", size = 2177203, upload_time = "2025-11-04T13:42:22.578Z" }, { url = "https://files.pythonhosted.org/packages/ed/ae/f06ea4c7e7a9eead3d165e7623cd2ea0cb788e277e4f935af63fc98fa4e6/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504", size = 2148191, upload_time = "2025-11-04T13:42:24.89Z" }, { url = "https://files.pythonhosted.org/packages/c1/57/25a11dcdc656bf5f8b05902c3c2934ac3ea296257cc4a3f79a6319e61856/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5", size = 2343907, upload_time = "2025-11-04T13:42:27.683Z" }, { url = "https://files.pythonhosted.org/packages/96/82/e33d5f4933d7a03327c0c43c65d575e5919d4974ffc026bc917a5f7b9f61/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3", size = 2322174, upload_time = "2025-11-04T13:42:30.776Z" }, { url = "https://files.pythonhosted.org/packages/81/45/4091be67ce9f469e81656f880f3506f6a5624121ec5eb3eab37d7581897d/pydantic_core-2.41.5-cp39-cp39-win32.whl", hash = "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460", size = 1990353, upload_time = "2025-11-04T13:42:33.111Z" }, { url = "https://files.pythonhosted.org/packages/44/8a/a98aede18db6e9cd5d66bcacd8a409fcf8134204cdede2e7de35c5a2c5ef/pydantic_core-2.41.5-cp39-cp39-win_amd64.whl", hash = "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b", size = 2015698, upload_time = "2025-11-04T13:42:35.484Z" }, { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload_time = "2025-11-04T13:42:39.557Z" }, { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload_time = "2025-11-04T13:42:42.169Z" }, { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload_time = "2025-11-04T13:42:44.564Z" }, { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload_time = "2025-11-04T13:42:47.156Z" }, { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload_time = "2025-11-04T13:42:49.689Z" }, { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload_time = "2025-11-04T13:42:52.215Z" }, { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload_time = "2025-11-04T13:42:56.483Z" }, { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload_time = "2025-11-04T13:42:59.471Z" }, { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload_time = "2025-11-04T13:43:02.058Z" }, { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload_time = "2025-11-04T13:43:05.159Z" }, { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload_time = "2025-11-04T13:43:08.116Z" }, { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload_time = "2025-11-04T13:43:12.49Z" }, { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload_time = "2025-11-04T13:43:15.431Z" }, { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload_time = "2025-11-04T13:43:18.062Z" }, { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload_time = "2025-11-04T13:43:20.679Z" }, { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload_time = "2025-11-04T13:43:23.286Z" }, { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload_time = "2025-11-04T13:43:25.97Z" }, { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload_time = "2025-11-04T13:43:28.763Z" }, { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload_time = "2025-11-04T13:43:31.71Z" }, { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload_time = "2025-11-04T13:43:34.744Z" }, { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload_time = "2025-11-04T13:43:37.701Z" }, { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload_time = "2025-11-04T13:43:40.406Z" }, { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload_time = "2025-11-04T13:43:43.602Z" }, { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload_time = "2025-11-04T13:43:46.64Z" }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload_time = "2025-06-21T13:39:12.283Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload_time = "2025-06-21T13:39:07.939Z" }, ] [[package]] name = "pyopenssl" version = "25.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/be/97b83a464498a79103036bc74d1038df4a7ef0e402cfaf4d5e113fb14759/pyopenssl-25.3.0.tar.gz", hash = "sha256:c981cb0a3fd84e8602d7afc209522773b94c1c2446a3c710a75b06fe1beae329", size = 184073, upload_time = "2025-09-17T00:32:21.037Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/81/ef2b1dfd1862567d573a4fdbc9f969067621764fbb74338496840a1d2977/pyopenssl-25.3.0-py3-none-any.whl", hash = "sha256:1fda6fc034d5e3d179d39e59c1895c9faeaf40a79de5fc4cbbfbe0d36f4a77b6", size = 57268, upload_time = "2025-09-17T00:32:19.474Z" }, ] [[package]] name = "pyproject-hooks" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload_time = "2024-09-29T09:24:13.293Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload_time = "2024-09-29T09:24:11.978Z" }, ] [[package]] name = "pytest" version = "8.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, { name = "exceptiongroup", marker = "python_full_version < '3.10'" }, { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "packaging", marker = "python_full_version < '3.10'" }, { name = "pluggy", marker = "python_full_version < '3.10'" }, { name = "pygments", marker = "python_full_version < '3.10'" }, { name = "tomli", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload_time = "2025-09-04T14:34:22.711Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload_time = "2025-09-04T14:34:20.226Z" }, ] [[package]] name = "pytest" version = "9.0.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "packaging", marker = "python_full_version >= '3.10'" }, { name = "pluggy", marker = "python_full_version >= '3.10'" }, { name = "pygments", marker = "python_full_version >= '3.10'" }, { name = "tomli", marker = "python_full_version == '3.10.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload_time = "2025-12-06T21:30:51.014Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload_time = "2025-12-06T21:30:49.154Z" }, ] [[package]] name = "pytest-asyncio" version = "1.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] dependencies = [ { name = "backports-asyncio-runner", marker = "python_full_version < '3.10'" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/86/9e3c5f48f7b7b638b216e4b9e645f54d199d7abbbab7a64a13b4e12ba10f/pytest_asyncio-1.2.0.tar.gz", hash = "sha256:c609a64a2a8768462d0c99811ddb8bd2583c33fd33cf7f21af1c142e824ffb57", size = 50119, upload_time = "2025-09-12T07:33:53.816Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/04/93/2fa34714b7a4ae72f2f8dad66ba17dd9a2c793220719e736dda28b7aec27/pytest_asyncio-1.2.0-py3-none-any.whl", hash = "sha256:8e17ae5e46d8e7efe51ab6494dd2010f4ca8dae51652aa3c8d55acf50bfb2e99", size = 15095, upload_time = "2025-09-12T07:33:52.639Z" }, ] [[package]] name = "pytest-asyncio" version = "1.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] dependencies = [ { name = "backports-asyncio-runner", marker = "python_full_version == '3.10.*'" }, { name = "pytest", version = "9.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload_time = "2025-11-10T16:07:47.256Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload_time = "2025-11-10T16:07:45.537Z" }, ] [[package]] name = "pytest-cov" version = "7.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.10'" }, { name = "coverage", version = "7.13.0", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.10'" }, { name = "pluggy" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "pytest", version = "9.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload_time = "2025-09-09T10:57:02.113Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload_time = "2025-09-09T10:57:00.695Z" }, ] [[package]] name = "python-dateutil" version = "2.9.0.post0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "python-dotenv" version = "1.2.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload_time = "2025-10-26T15:12:10.434Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload_time = "2025-10-26T15:12:09.109Z" }, ] [[package]] name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload_time = "2025-07-14T20:13:05.9Z" }, { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload_time = "2025-07-14T20:13:07.698Z" }, { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload_time = "2025-07-14T20:13:11.11Z" }, { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload_time = "2025-07-14T20:13:13.266Z" }, { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload_time = "2025-07-14T20:13:15.147Z" }, { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload_time = "2025-07-14T20:13:16.945Z" }, { 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" }, { url = "https://files.pythonhosted.org/packages/59/42/b86689aac0cdaee7ae1c58d464b0ff04ca909c19bb6502d4973cdd9f9544/pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b", size = 8760837, upload_time = "2025-07-14T20:12:59.59Z" }, { url = "https://files.pythonhosted.org/packages/9f/8a/1403d0353f8c5a2f0829d2b1c4becbf9da2f0a4d040886404fc4a5431e4d/pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91", size = 9590187, upload_time = "2025-07-14T20:13:01.419Z" }, { url = "https://files.pythonhosted.org/packages/60/22/e0e8d802f124772cec9c75430b01a212f86f9de7546bda715e54140d5aeb/pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d", size = 8778162, upload_time = "2025-07-14T20:13:03.544Z" }, ] [[package]] name = "pyyaml" version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload_time = "2025-09-25T21:33:16.546Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload_time = "2025-09-25T21:31:46.04Z" }, { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload_time = "2025-09-25T21:31:47.706Z" }, { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload_time = "2025-09-25T21:31:49.21Z" }, { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload_time = "2025-09-25T21:31:50.735Z" }, { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload_time = "2025-09-25T21:31:51.828Z" }, { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload_time = "2025-09-25T21:31:53.282Z" }, { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload_time = "2025-09-25T21:31:54.807Z" }, { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload_time = "2025-09-25T21:31:55.885Z" }, { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload_time = "2025-09-25T21:31:57.406Z" }, { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload_time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload_time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload_time = "2025-09-25T21:32:01.31Z" }, { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload_time = "2025-09-25T21:32:03.376Z" }, { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload_time = "2025-09-25T21:32:04.553Z" }, { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload_time = "2025-09-25T21:32:06.152Z" }, { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload_time = "2025-09-25T21:32:07.367Z" }, { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload_time = "2025-09-25T21:32:08.95Z" }, { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload_time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload_time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload_time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload_time = "2025-09-25T21:32:13.652Z" }, { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload_time = "2025-09-25T21:32:15.21Z" }, { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload_time = "2025-09-25T21:32:16.431Z" }, { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload_time = "2025-09-25T21:32:17.56Z" }, { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload_time = "2025-09-25T21:32:18.834Z" }, { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload_time = "2025-09-25T21:32:20.209Z" }, { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload_time = "2025-09-25T21:32:21.167Z" }, { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload_time = "2025-09-25T21:32:22.617Z" }, { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload_time = "2025-09-25T21:32:23.673Z" }, { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload_time = "2025-09-25T21:32:25.149Z" }, { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload_time = "2025-09-25T21:32:26.575Z" }, { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload_time = "2025-09-25T21:32:27.727Z" }, { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload_time = "2025-09-25T21:32:28.878Z" }, { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload_time = "2025-09-25T21:32:30.178Z" }, { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload_time = "2025-09-25T21:32:31.353Z" }, { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload_time = "2025-09-25T21:32:32.58Z" }, { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload_time = "2025-09-25T21:32:33.659Z" }, { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload_time = "2025-09-25T21:32:34.663Z" }, { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload_time = "2025-09-25T21:32:35.712Z" }, { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload_time = "2025-09-25T21:32:36.789Z" }, { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload_time = "2025-09-25T21:32:37.966Z" }, { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload_time = "2025-09-25T21:32:39.178Z" }, { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload_time = "2025-09-25T21:32:40.865Z" }, { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload_time = "2025-09-25T21:32:42.084Z" }, { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload_time = "2025-09-25T21:32:43.362Z" }, { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload_time = "2025-09-25T21:32:57.844Z" }, { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload_time = "2025-09-25T21:32:59.247Z" }, { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload_time = "2025-09-25T21:32:44.377Z" }, { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload_time = "2025-09-25T21:32:45.407Z" }, { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload_time = "2025-09-25T21:32:48.83Z" }, { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload_time = "2025-09-25T21:32:50.149Z" }, { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload_time = "2025-09-25T21:32:51.808Z" }, { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload_time = "2025-09-25T21:32:52.941Z" }, { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload_time = "2025-09-25T21:32:54.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload_time = "2025-09-25T21:32:55.767Z" }, { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload_time = "2025-09-25T21:32:56.828Z" }, { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload_time = "2025-09-25T21:33:00.618Z" }, { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload_time = "2025-09-25T21:33:02.086Z" }, { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload_time = "2025-09-25T21:33:03.25Z" }, { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload_time = "2025-09-25T21:33:05.014Z" }, { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload_time = "2025-09-25T21:33:06.398Z" }, { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload_time = "2025-09-25T21:33:08.708Z" }, { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload_time = "2025-09-25T21:33:09.876Z" }, { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload_time = "2025-09-25T21:33:10.983Z" }, { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload_time = "2025-09-25T21:33:15.55Z" }, ] [[package]] name = "requests" version = "2.32.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload_time = "2025-08-18T20:46:02.573Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload_time = "2025-08-18T20:46:00.542Z" }, ] [[package]] name = "ruff" version = "0.14.9" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f6/1b/ab712a9d5044435be8e9a2beb17cbfa4c241aa9b5e4413febac2a8b79ef2/ruff-0.14.9.tar.gz", hash = "sha256:35f85b25dd586381c0cc053f48826109384c81c00ad7ef1bd977bfcc28119d5b", size = 5809165, upload_time = "2025-12-11T21:39:47.381Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b8/1c/d1b1bba22cffec02351c78ab9ed4f7d7391876e12720298448b29b7229c1/ruff-0.14.9-py3-none-linux_armv6l.whl", hash = "sha256:f1ec5de1ce150ca6e43691f4a9ef5c04574ad9ca35c8b3b0e18877314aba7e75", size = 13576541, upload_time = "2025-12-11T21:39:14.806Z" }, { url = "https://files.pythonhosted.org/packages/94/ab/ffe580e6ea1fca67f6337b0af59fc7e683344a43642d2d55d251ff83ceae/ruff-0.14.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ed9d7417a299fc6030b4f26333bf1117ed82a61ea91238558c0268c14e00d0c2", size = 13779363, upload_time = "2025-12-11T21:39:20.29Z" }, { url = "https://files.pythonhosted.org/packages/7d/f8/2be49047f929d6965401855461e697ab185e1a6a683d914c5c19c7962d9e/ruff-0.14.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d5dc3473c3f0e4a1008d0ef1d75cee24a48e254c8bed3a7afdd2b4392657ed2c", size = 12925292, upload_time = "2025-12-11T21:39:38.757Z" }, { url = "https://files.pythonhosted.org/packages/9e/e9/08840ff5127916bb989c86f18924fd568938b06f58b60e206176f327c0fe/ruff-0.14.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84bf7c698fc8f3cb8278830fb6b5a47f9bcc1ed8cb4f689b9dd02698fa840697", size = 13362894, upload_time = "2025-12-11T21:39:02.524Z" }, { url = "https://files.pythonhosted.org/packages/31/1c/5b4e8e7750613ef43390bb58658eaf1d862c0cc3352d139cd718a2cea164/ruff-0.14.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa733093d1f9d88a5d98988d8834ef5d6f9828d03743bf5e338bf980a19fce27", size = 13311482, upload_time = "2025-12-11T21:39:17.51Z" }, { url = "https://files.pythonhosted.org/packages/5b/3a/459dce7a8cb35ba1ea3e9c88f19077667a7977234f3b5ab197fad240b404/ruff-0.14.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a1cfb04eda979b20c8c19550c8b5f498df64ff8da151283311ce3199e8b3648", size = 14016100, upload_time = "2025-12-11T21:39:41.948Z" }, { url = "https://files.pythonhosted.org/packages/a6/31/f064f4ec32524f9956a0890fc6a944e5cf06c63c554e39957d208c0ffc45/ruff-0.14.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1e5cb521e5ccf0008bd74d5595a4580313844a42b9103b7388eca5a12c970743", size = 15477729, upload_time = "2025-12-11T21:39:23.279Z" }, { url = "https://files.pythonhosted.org/packages/7a/6d/f364252aad36ccd443494bc5f02e41bf677f964b58902a17c0b16c53d890/ruff-0.14.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd429a8926be6bba4befa8cdcf3f4dd2591c413ea5066b1e99155ed245ae42bb", size = 15122386, upload_time = "2025-12-11T21:39:33.125Z" }, { url = "https://files.pythonhosted.org/packages/20/02/e848787912d16209aba2799a4d5a1775660b6a3d0ab3944a4ccc13e64a02/ruff-0.14.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab208c1b7a492e37caeaf290b1378148f75e13c2225af5d44628b95fd7834273", size = 14497124, upload_time = "2025-12-11T21:38:59.33Z" }, { url = "https://files.pythonhosted.org/packages/f3/51/0489a6a5595b7760b5dbac0dd82852b510326e7d88d51dbffcd2e07e3ff3/ruff-0.14.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72034534e5b11e8a593f517b2f2f2b273eb68a30978c6a2d40473ad0aaa4cb4a", size = 14195343, upload_time = "2025-12-11T21:39:44.866Z" }, { url = "https://files.pythonhosted.org/packages/f6/53/3bb8d2fa73e4c2f80acc65213ee0830fa0c49c6479313f7a68a00f39e208/ruff-0.14.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:712ff04f44663f1b90a1195f51525836e3413c8a773574a7b7775554269c30ed", size = 14346425, upload_time = "2025-12-11T21:39:05.927Z" }, { url = "https://files.pythonhosted.org/packages/ad/04/bdb1d0ab876372da3e983896481760867fc84f969c5c09d428e8f01b557f/ruff-0.14.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a111fee1db6f1d5d5810245295527cda1d367c5aa8f42e0fca9a78ede9b4498b", size = 13258768, upload_time = "2025-12-11T21:39:08.691Z" }, { url = "https://files.pythonhosted.org/packages/40/d9/8bf8e1e41a311afd2abc8ad12be1b6c6c8b925506d9069b67bb5e9a04af3/ruff-0.14.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8769efc71558fecc25eb295ddec7d1030d41a51e9dcf127cbd63ec517f22d567", size = 13326939, upload_time = "2025-12-11T21:39:53.842Z" }, { url = "https://files.pythonhosted.org/packages/f4/56/a213fa9edb6dd849f1cfbc236206ead10913693c72a67fb7ddc1833bf95d/ruff-0.14.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:347e3bf16197e8a2de17940cd75fd6491e25c0aa7edf7d61aa03f146a1aa885a", size = 13578888, upload_time = "2025-12-11T21:39:35.988Z" }, { url = "https://files.pythonhosted.org/packages/33/09/6a4a67ffa4abae6bf44c972a4521337ffce9cbc7808faadede754ef7a79c/ruff-0.14.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7715d14e5bccf5b660f54516558aa94781d3eb0838f8e706fb60e3ff6eff03a8", size = 14314473, upload_time = "2025-12-11T21:39:50.78Z" }, { url = "https://files.pythonhosted.org/packages/12/0d/15cc82da5d83f27a3c6b04f3a232d61bc8c50d38a6cd8da79228e5f8b8d6/ruff-0.14.9-py3-none-win32.whl", hash = "sha256:df0937f30aaabe83da172adaf8937003ff28172f59ca9f17883b4213783df197", size = 13202651, upload_time = "2025-12-11T21:39:26.628Z" }, { url = "https://files.pythonhosted.org/packages/32/f7/c78b060388eefe0304d9d42e68fab8cffd049128ec466456cef9b8d4f06f/ruff-0.14.9-py3-none-win_amd64.whl", hash = "sha256:c0b53a10e61df15a42ed711ec0bda0c582039cf6c754c49c020084c55b5b0bc2", size = 14702079, upload_time = "2025-12-11T21:39:11.954Z" }, { url = "https://files.pythonhosted.org/packages/26/09/7a9520315decd2334afa65ed258fed438f070e31f05a2e43dd480a5e5911/ruff-0.14.9-py3-none-win_arm64.whl", hash = "sha256:8e821c366517a074046d92f0e9213ed1c13dbc5b37a7fc20b07f79b64d62cc84", size = 13744730, upload_time = "2025-12-11T21:39:29.659Z" }, ] [[package]] name = "service-identity" version = "24.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "cryptography" }, { name = "pyasn1" }, { name = "pyasn1-modules" }, ] sdist = { url = "https://files.pythonhosted.org/packages/07/a5/dfc752b979067947261dbbf2543470c58efe735c3c1301dd870ef27830ee/service_identity-24.2.0.tar.gz", hash = "sha256:b8683ba13f0d39c6cd5d625d2c5f65421d6d707b013b375c355751557cbe8e09", size = 39245, upload_time = "2024-10-26T07:21:57.736Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/08/2c/ca6dd598b384bc1ce581e24aaae0f2bed4ccac57749d5c3befbb5e742081/service_identity-24.2.0-py3-none-any.whl", hash = "sha256:6b047fbd8a84fd0bb0d55ebce4031e400562b9196e1e0d3e0fe2b8a59f6d4a85", size = 11364, upload_time = "2024-10-26T07:21:56.302Z" }, ] [[package]] name = "setuptools" version = "80.9.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload_time = "2025-05-27T00:56:51.443Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload_time = "2025-05-27T00:56:49.664Z" }, ] [[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 = "sniffio" version = "1.3.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload_time = "2024-02-25T23:20:04.057Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload_time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "sqlalchemy" version = "2.0.45" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "greenlet", version = "3.2.4", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.10' and platform_machine == 'AMD64') or (python_full_version < '3.10' and platform_machine == 'WIN32') or (python_full_version < '3.10' and platform_machine == 'aarch64') or (python_full_version < '3.10' and platform_machine == 'amd64') or (python_full_version < '3.10' and platform_machine == 'ppc64le') or (python_full_version < '3.10' and platform_machine == 'win32') or (python_full_version < '3.10' and platform_machine == 'x86_64')" }, { name = "greenlet", version = "3.3.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.10' and platform_machine == 'AMD64') or (python_full_version >= '3.10' and platform_machine == 'WIN32') or (python_full_version >= '3.10' and platform_machine == 'aarch64') or (python_full_version >= '3.10' and platform_machine == 'amd64') or (python_full_version >= '3.10' and platform_machine == 'ppc64le') or (python_full_version >= '3.10' and platform_machine == 'win32') or (python_full_version >= '3.10' and platform_machine == 'x86_64')" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/be/f9/5e4491e5ccf42f5d9cfc663741d261b3e6e1683ae7812114e7636409fcc6/sqlalchemy-2.0.45.tar.gz", hash = "sha256:1632a4bda8d2d25703fdad6363058d882541bdaaee0e5e3ddfa0cd3229efce88", size = 9869912, upload_time = "2025-12-09T21:05:16.737Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fe/70/75b1387d72e2847220441166c5eb4e9846dd753895208c13e6d66523b2d9/sqlalchemy-2.0.45-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85", size = 2154148, upload_time = "2025-12-10T20:03:21.023Z" }, { url = "https://files.pythonhosted.org/packages/d8/a4/7805e02323c49cb9d1ae5cd4913b28c97103079765f520043f914fca4cb3/sqlalchemy-2.0.45-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7ae64ebf7657395824a19bca98ab10eb9a3ecb026bf09524014f1bb81cb598d4", size = 3233051, upload_time = "2025-12-09T22:06:04.768Z" }, { url = "https://files.pythonhosted.org/packages/d7/ec/32ae09139f61bef3de3142e85c47abdee8db9a55af2bb438da54a4549263/sqlalchemy-2.0.45-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f02325709d1b1a1489f23a39b318e175a171497374149eae74d612634b234c0", size = 3232781, upload_time = "2025-12-09T22:09:54.435Z" }, { url = "https://files.pythonhosted.org/packages/ad/bd/bf7b869b6f5585eac34222e1cf4405f4ba8c3b85dd6b1af5d4ce8bca695f/sqlalchemy-2.0.45-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0", size = 3182096, upload_time = "2025-12-09T22:06:06.169Z" }, { url = "https://files.pythonhosted.org/packages/21/6a/c219720a241bb8f35c88815ccc27761f5af7fdef04b987b0e8a2c1a6dcaa/sqlalchemy-2.0.45-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040f6f0545b3b7da6b9317fc3e922c9a98fc7243b2a1b39f78390fc0942f7826", size = 3205109, upload_time = "2025-12-09T22:09:55.969Z" }, { url = "https://files.pythonhosted.org/packages/bd/c4/6ccf31b2bc925d5d95fab403ffd50d20d7c82b858cf1a4855664ca054dce/sqlalchemy-2.0.45-cp310-cp310-win32.whl", hash = "sha256:830d434d609fe7bfa47c425c445a8b37929f140a7a44cdaf77f6d34df3a7296a", size = 2114240, upload_time = "2025-12-09T21:29:54.007Z" }, { url = "https://files.pythonhosted.org/packages/de/29/a27a31fca07316def418db6f7c70ab14010506616a2decef1906050a0587/sqlalchemy-2.0.45-cp310-cp310-win_amd64.whl", hash = "sha256:0209d9753671b0da74da2cfbb9ecf9c02f72a759e4b018b3ab35f244c91842c7", size = 2137615, upload_time = "2025-12-09T21:29:55.85Z" }, { url = "https://files.pythonhosted.org/packages/a2/1c/769552a9d840065137272ebe86ffbb0bc92b0f1e0a68ee5266a225f8cd7b/sqlalchemy-2.0.45-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56", size = 2153860, upload_time = "2025-12-10T20:03:23.843Z" }, { url = "https://files.pythonhosted.org/packages/f3/f8/9be54ff620e5b796ca7b44670ef58bc678095d51b0e89d6e3102ea468216/sqlalchemy-2.0.45-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b", size = 3309379, upload_time = "2025-12-09T22:06:07.461Z" }, { url = "https://files.pythonhosted.org/packages/f6/2b/60ce3ee7a5ae172bfcd419ce23259bb874d2cddd44f67c5df3760a1e22f9/sqlalchemy-2.0.45-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12c694ed6468333a090d2f60950e4250b928f457e4962389553d6ba5fe9951ac", size = 3309948, upload_time = "2025-12-09T22:09:57.643Z" }, { url = "https://files.pythonhosted.org/packages/a3/42/bac8d393f5db550e4e466d03d16daaafd2bad1f74e48c12673fb499a7fc1/sqlalchemy-2.0.45-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f7d27a1d977a1cfef38a0e2e1ca86f09c4212666ce34e6ae542f3ed0a33bc606", size = 3261239, upload_time = "2025-12-09T22:06:08.879Z" }, { url = "https://files.pythonhosted.org/packages/6f/12/43dc70a0528c59842b04ea1c1ed176f072a9b383190eb015384dd102fb19/sqlalchemy-2.0.45-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c", size = 3284065, upload_time = "2025-12-09T22:09:59.454Z" }, { url = "https://files.pythonhosted.org/packages/cf/9c/563049cf761d9a2ec7bc489f7879e9d94e7b590496bea5bbee9ed7b4cc32/sqlalchemy-2.0.45-cp311-cp311-win32.whl", hash = "sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177", size = 2113480, upload_time = "2025-12-09T21:29:57.03Z" }, { url = "https://files.pythonhosted.org/packages/bc/fa/09d0a11fe9f15c7fa5c7f0dd26be3d235b0c0cbf2f9544f43bc42efc8a24/sqlalchemy-2.0.45-cp311-cp311-win_amd64.whl", hash = "sha256:a15b98adb7f277316f2c276c090259129ee4afca783495e212048daf846654b2", size = 2138407, upload_time = "2025-12-09T21:29:58.556Z" }, { url = "https://files.pythonhosted.org/packages/2d/c7/1900b56ce19bff1c26f39a4ce427faec7716c81ac792bfac8b6a9f3dca93/sqlalchemy-2.0.45-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3ee2aac15169fb0d45822983631466d60b762085bc4535cd39e66bea362df5f", size = 3333760, upload_time = "2025-12-09T22:11:02.66Z" }, { url = "https://files.pythonhosted.org/packages/0a/93/3be94d96bb442d0d9a60e55a6bb6e0958dd3457751c6f8502e56ef95fed0/sqlalchemy-2.0.45-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d", size = 3348268, upload_time = "2025-12-09T22:13:49.054Z" }, { url = "https://files.pythonhosted.org/packages/48/4b/f88ded696e61513595e4a9778f9d3f2bf7332cce4eb0c7cedaabddd6687b/sqlalchemy-2.0.45-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4", size = 3278144, upload_time = "2025-12-09T22:11:04.14Z" }, { url = "https://files.pythonhosted.org/packages/ed/6a/310ecb5657221f3e1bd5288ed83aa554923fb5da48d760a9f7622afeb065/sqlalchemy-2.0.45-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:107029bf4f43d076d4011f1afb74f7c3e2ea029ec82eb23d8527d5e909e97aa6", size = 3313907, upload_time = "2025-12-09T22:13:50.598Z" }, { url = "https://files.pythonhosted.org/packages/5c/39/69c0b4051079addd57c84a5bfb34920d87456dd4c90cf7ee0df6efafc8ff/sqlalchemy-2.0.45-cp312-cp312-win32.whl", hash = "sha256:0c9f6ada57b58420a2c0277ff853abe40b9e9449f8d7d231763c6bc30f5c4953", size = 2112182, upload_time = "2025-12-09T21:39:30.824Z" }, { url = "https://files.pythonhosted.org/packages/f7/4e/510db49dd89fc3a6e994bee51848c94c48c4a00dc905e8d0133c251f41a7/sqlalchemy-2.0.45-cp312-cp312-win_amd64.whl", hash = "sha256:8defe5737c6d2179c7997242d6473587c3beb52e557f5ef0187277009f73e5e1", size = 2139200, upload_time = "2025-12-09T21:39:32.321Z" }, { url = "https://files.pythonhosted.org/packages/6a/c8/7cc5221b47a54edc72a0140a1efa56e0a2730eefa4058d7ed0b4c4357ff8/sqlalchemy-2.0.45-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe187fc31a54d7fd90352f34e8c008cf3ad5d064d08fedd3de2e8df83eb4a1cf", size = 3277082, upload_time = "2025-12-09T22:11:06.167Z" }, { url = "https://files.pythonhosted.org/packages/0e/50/80a8d080ac7d3d321e5e5d420c9a522b0aa770ec7013ea91f9a8b7d36e4a/sqlalchemy-2.0.45-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e", size = 3293131, upload_time = "2025-12-09T22:13:52.626Z" }, { url = "https://files.pythonhosted.org/packages/da/4c/13dab31266fc9904f7609a5dc308a2432a066141d65b857760c3bef97e69/sqlalchemy-2.0.45-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b", size = 3225389, upload_time = "2025-12-09T22:11:08.093Z" }, { url = "https://files.pythonhosted.org/packages/74/04/891b5c2e9f83589de202e7abaf24cd4e4fa59e1837d64d528829ad6cc107/sqlalchemy-2.0.45-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9c6378449e0940476577047150fd09e242529b761dc887c9808a9a937fe990c8", size = 3266054, upload_time = "2025-12-09T22:13:54.262Z" }, { url = "https://files.pythonhosted.org/packages/f1/24/fc59e7f71b0948cdd4cff7a286210e86b0443ef1d18a23b0d83b87e4b1f7/sqlalchemy-2.0.45-cp313-cp313-win32.whl", hash = "sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a", size = 2110299, upload_time = "2025-12-09T21:39:33.486Z" }, { url = "https://files.pythonhosted.org/packages/c0/c5/d17113020b2d43073412aeca09b60d2009442420372123b8d49cc253f8b8/sqlalchemy-2.0.45-cp313-cp313-win_amd64.whl", hash = "sha256:afbf47dc4de31fa38fd491f3705cac5307d21d4bb828a4f020ee59af412744ee", size = 2136264, upload_time = "2025-12-09T21:39:36.801Z" }, { url = "https://files.pythonhosted.org/packages/3d/8d/bb40a5d10e7a5f2195f235c0b2f2c79b0bf6e8f00c0c223130a4fbd2db09/sqlalchemy-2.0.45-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83d7009f40ce619d483d26ac1b757dfe3167b39921379a8bd1b596cf02dab4a6", size = 3521998, upload_time = "2025-12-09T22:13:28.622Z" }, { url = "https://files.pythonhosted.org/packages/75/a5/346128b0464886f036c039ea287b7332a410aa2d3fb0bb5d404cb8861635/sqlalchemy-2.0.45-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a", size = 3473434, upload_time = "2025-12-09T22:13:30.188Z" }, { url = "https://files.pythonhosted.org/packages/cc/64/4e1913772646b060b025d3fc52ce91a58967fe58957df32b455de5a12b4f/sqlalchemy-2.0.45-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f46ec744e7f51275582e6a24326e10c49fbdd3fc99103e01376841213028774", size = 3272404, upload_time = "2025-12-09T22:11:09.662Z" }, { url = "https://files.pythonhosted.org/packages/b3/27/caf606ee924282fe4747ee4fd454b335a72a6e018f97eab5ff7f28199e16/sqlalchemy-2.0.45-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:883c600c345123c033c2f6caca18def08f1f7f4c3ebeb591a63b6fceffc95cce", size = 3277057, upload_time = "2025-12-09T22:13:56.213Z" }, { url = "https://files.pythonhosted.org/packages/85/d0/3d64218c9724e91f3d1574d12eb7ff8f19f937643815d8daf792046d88ab/sqlalchemy-2.0.45-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33", size = 3222279, upload_time = "2025-12-09T22:11:11.1Z" }, { url = "https://files.pythonhosted.org/packages/24/10/dd7688a81c5bc7690c2a3764d55a238c524cd1a5a19487928844cb247695/sqlalchemy-2.0.45-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8a420169cef179d4c9064365f42d779f1e5895ad26ca0c8b4c0233920973db74", size = 3244508, upload_time = "2025-12-09T22:13:57.932Z" }, { url = "https://files.pythonhosted.org/packages/aa/41/db75756ca49f777e029968d9c9fee338c7907c563267740c6d310a8e3f60/sqlalchemy-2.0.45-cp314-cp314-win32.whl", hash = "sha256:e50dcb81a5dfe4b7b4a4aa8f338116d127cb209559124f3694c70d6cd072b68f", size = 2113204, upload_time = "2025-12-09T21:39:38.365Z" }, { url = "https://files.pythonhosted.org/packages/89/a2/0e1590e9adb292b1d576dbcf67ff7df8cf55e56e78d2c927686d01080f4b/sqlalchemy-2.0.45-cp314-cp314-win_amd64.whl", hash = "sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177", size = 2138785, upload_time = "2025-12-09T21:39:39.503Z" }, { url = "https://files.pythonhosted.org/packages/42/39/f05f0ed54d451156bbed0e23eb0516bcad7cbb9f18b3bf219c786371b3f0/sqlalchemy-2.0.45-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b", size = 3522029, upload_time = "2025-12-09T22:13:32.09Z" }, { url = "https://files.pythonhosted.org/packages/54/0f/d15398b98b65c2bce288d5ee3f7d0a81f77ab89d9456994d5c7cc8b2a9db/sqlalchemy-2.0.45-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9a62b446b7d86a3909abbcd1cd3cc550a832f99c2bc37c5b22e1925438b9367b", size = 3475142, upload_time = "2025-12-09T22:13:33.739Z" }, { url = "https://files.pythonhosted.org/packages/53/01/a01b9829d146ba59972e6dfc88138142f5ffa4110e492c83326e7d765a17/sqlalchemy-2.0.45-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d29b2b99d527dbc66dd87c3c3248a5dd789d974a507f4653c969999fc7c1191b", size = 2157179, upload_time = "2025-12-10T20:05:13.998Z" }, { url = "https://files.pythonhosted.org/packages/1f/78/ed43ed8ac27844f129adfc45a8735bab5dcad3e5211f4dc1bd7e676bc3ed/sqlalchemy-2.0.45-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:59a8b8bd9c6bedf81ad07c8bd5543eedca55fe9b8780b2b628d495ba55f8db1e", size = 3233038, upload_time = "2025-12-09T22:06:55.42Z" }, { url = "https://files.pythonhosted.org/packages/24/1c/721ec797f21431c905ad98cbce66430d72a340935e3b7e3232cf05e015cc/sqlalchemy-2.0.45-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd93c6f5d65f254ceabe97548c709e073d6da9883343adaa51bf1a913ce93f8e", size = 3233117, upload_time = "2025-12-09T22:10:03.143Z" }, { url = "https://files.pythonhosted.org/packages/52/33/dcfb8dffb2ccd7c6803d63454dc1917ef5ec5b5e281fecbbc0ed1de1f125/sqlalchemy-2.0.45-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d0beadc2535157070c9c17ecf25ecec31e13c229a8f69196d7590bde8082bf1", size = 3182306, upload_time = "2025-12-09T22:06:56.894Z" }, { url = "https://files.pythonhosted.org/packages/53/76/7cf8ce9e6dcac1d37125425aadec406d8a839dffc1b8763f6e7a56b0bf33/sqlalchemy-2.0.45-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e057f928ffe9c9b246a55b469c133b98a426297e1772ad24ce9f0c47d123bd5b", size = 3205587, upload_time = "2025-12-09T22:10:04.812Z" }, { url = "https://files.pythonhosted.org/packages/d2/ac/5cd0d14f7830981c06f468507237b0a8205691d626492b5551a67535eb30/sqlalchemy-2.0.45-cp39-cp39-win32.whl", hash = "sha256:c1c2091b1489435ff85728fafeb990f073e64f6f5e81d5cd53059773e8521eb6", size = 2115932, upload_time = "2025-12-09T22:09:17.012Z" }, { url = "https://files.pythonhosted.org/packages/b9/eb/76f6db8828c6e0cfac89820a07a40a2bab25e82e69827177b942a9bff42a/sqlalchemy-2.0.45-cp39-cp39-win_amd64.whl", hash = "sha256:56ead1f8dfb91a54a28cd1d072c74b3d635bcffbd25e50786533b822d4f2cde2", size = 2139570, upload_time = "2025-12-09T22:09:18.545Z" }, { url = "https://files.pythonhosted.org/packages/bf/e1/3ccb13c643399d22289c6a9786c1a91e3dcbb68bce4beb44926ac2c557bf/sqlalchemy-2.0.45-py3-none-any.whl", hash = "sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0", size = 1936672, upload_time = "2025-12-09T21:54:52.608Z" }, ] [package.optional-dependencies] asyncio = [ { name = "greenlet", version = "3.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "greenlet", version = "3.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] [[package]] name = "sse-starlette" version = "3.1.2" source = { editable = "." } dependencies = [ { name = "anyio" }, { name = "starlette", version = "0.49.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "starlette", version = "0.50.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] [package.optional-dependencies] daphne = [ { name = "daphne" }, ] examples = [ { name = "aiosqlite" }, { name = "fastapi" }, { name = "sqlalchemy", extra = ["asyncio"] }, { name = "uvicorn" }, ] granian = [ { name = "granian", version = "2.5.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "granian", version = "2.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] uvicorn = [ { name = "uvicorn" }, ] [package.dev-dependencies] dev = [ { name = "asgi-lifespan" }, { name = "async-timeout" }, { name = "build" }, { name = "httpx" }, { name = "mypy" }, { name = "portend" }, { name = "pre-commit", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "pre-commit", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "psutil" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "pytest", version = "9.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pytest-asyncio", version = "1.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "pytest-asyncio", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pytest-cov" }, { name = "ruff" }, { name = "starlette", version = "0.49.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "starlette", version = "0.50.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "tenacity" }, { name = "testcontainers", version = "4.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9.2'" }, { name = "testcontainers", version = "4.13.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9.2'" }, { name = "uvicorn" }, ] [package.metadata] requires-dist = [ { name = "aiosqlite", marker = "extra == 'examples'", specifier = ">=0.21.0" }, { name = "anyio", specifier = ">=4.7.0" }, { name = "daphne", marker = "extra == 'daphne'", specifier = ">=4.2.0" }, { name = "fastapi", marker = "extra == 'examples'", specifier = ">=0.115.12" }, { name = "granian", marker = "extra == 'granian'", specifier = ">=2.3.1" }, { name = "sqlalchemy", extras = ["asyncio"], marker = "extra == 'examples'", specifier = ">=2.0.41" }, { name = "starlette", specifier = ">=0.49.1" }, { name = "uvicorn", marker = "extra == 'examples'", specifier = ">=0.34.0" }, { name = "uvicorn", marker = "extra == 'uvicorn'", specifier = ">=0.34.0" }, ] provides-extras = ["examples", "uvicorn", "granian", "daphne"] [package.metadata.requires-dev] dev = [ { name = "asgi-lifespan", specifier = ">=2.1.0" }, { name = "async-timeout", specifier = ">=5.0.1" }, { name = "build", specifier = ">=1.2.2.post1" }, { name = "httpx", specifier = ">=0.28.1" }, { name = "mypy", specifier = ">=1.14.0" }, { name = "portend", specifier = ">=3.2.0" }, { name = "pre-commit", specifier = ">=4.0.0" }, { name = "psutil", specifier = ">=6.1.1" }, { name = "pytest", specifier = ">=8.3.4" }, { name = "pytest-asyncio", specifier = ">=0.25.0" }, { name = "pytest-cov", specifier = ">=6.0.0" }, { name = "ruff", specifier = ">=0.8.4" }, { name = "starlette", specifier = ">=0.49.1" }, { name = "tenacity", specifier = ">=9.0.0" }, { name = "testcontainers", specifier = ">=4.9.0" }, { name = "uvicorn", specifier = ">=0.34.0" }, ] [[package]] name = "starlette" version = "0.49.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] dependencies = [ { name = "anyio", marker = "python_full_version < '3.10'" }, { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/de/1a/608df0b10b53b0beb96a37854ee05864d182ddd4b1156a22f1ad3860425a/starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284", size = 2655031, upload_time = "2025-11-01T15:12:26.13Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a3/e0/021c772d6a662f43b63044ab481dc6ac7592447605b5b35a957785363122/starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f", size = 74340, upload_time = "2025-11-01T15:12:24.387Z" }, ] [[package]] name = "starlette" version = "0.50.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] dependencies = [ { name = "anyio", marker = "python_full_version >= '3.10'" }, { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload_time = "2025-11-01T15:25:27.516Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload_time = "2025-11-01T15:25:25.461Z" }, ] [[package]] name = "tempora" version = "5.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jaraco-functools" }, { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/24/64/a255efe5edd367d12b770b3514194efdc1c97e5ed6ce6e8105d834750dfc/tempora-5.8.1.tar.gz", hash = "sha256:abb5d9ec790cc5e4f9431778029ba3e3d9ba9bd50cb306dad824824b2b362dcd", size = 23072, upload_time = "2025-06-21T17:04:14.349Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ff/ec/3d106a107646945b65a55a228b871589ee9206e833f5b1cde4a57204c2f8/tempora-5.8.1-py3-none-any.whl", hash = "sha256:6945ec409ca930e5040490931dc0d8f516f2cd9798eb175dc3b3c6a0fc481ea2", size = 14427, upload_time = "2025-06-21T17:04:12.319Z" }, ] [[package]] name = "tenacity" version = "9.1.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, ] [[package]] name = "testcontainers" version = "4.13.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.9.2'", ] dependencies = [ { name = "docker", marker = "python_full_version < '3.9.2'" }, { name = "python-dotenv", marker = "python_full_version < '3.9.2'" }, { name = "typing-extensions", marker = "python_full_version < '3.9.2'" }, { name = "urllib3", marker = "python_full_version < '3.9.2'" }, { name = "wrapt", marker = "python_full_version < '3.9.2'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d7/e5/807161552b8bf7072d63a21d5fd3c7df54e29420e325d50b9001571fcbb6/testcontainers-4.13.0.tar.gz", hash = "sha256:ee2bc39324eeeeb710be779208ae070c8373fa9058861859203f536844b0f412", size = 77824, upload_time = "2025-09-09T13:23:49.976Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/12/a2/ec749772b9d0fcc659b1722858f463a9cbfc7e29aca374123fb87e87fc1d/testcontainers-4.13.0-py3-none-any.whl", hash = "sha256:784292e0a3f3a4588fbbf5d6649adda81fea5fd61ad3dc73f50a7a903904aade", size = 123838, upload_time = "2025-09-09T13:23:48.375Z" }, ] [[package]] name = "testcontainers" version = "4.13.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", "python_full_version >= '3.9.2' and python_full_version < '3.10'", ] dependencies = [ { name = "docker", marker = "python_full_version >= '3.9.2'" }, { name = "python-dotenv", marker = "python_full_version >= '3.9.2'" }, { name = "typing-extensions", marker = "python_full_version >= '3.9.2'" }, { name = "urllib3", marker = "python_full_version >= '3.9.2'" }, { name = "wrapt", marker = "python_full_version >= '3.9.2'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/b3/c272537f3ea2f312555efeb86398cc382cd07b740d5f3c730918c36e64e1/testcontainers-4.13.3.tar.gz", hash = "sha256:9d82a7052c9a53c58b69e1dc31da8e7a715e8b3ec1c4df5027561b47e2efe646", size = 79064, upload_time = "2025-11-14T05:08:47.584Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/73/27/c2f24b19dafa197c514abe70eda69bc031c5152c6b1f1e5b20099e2ceedd/testcontainers-4.13.3-py3-none-any.whl", hash = "sha256:063278c4805ffa6dd85e56648a9da3036939e6c0ac1001e851c9276b19b05970", size = 124784, upload_time = "2025-11-14T05:08:46.053Z" }, ] [[package]] name = "tomli" version = "2.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload_time = "2025-10-08T22:01:47.119Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload_time = "2025-10-08T22:01:00.137Z" }, { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload_time = "2025-10-08T22:01:01.63Z" }, { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload_time = "2025-10-08T22:01:02.543Z" }, { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload_time = "2025-10-08T22:01:03.836Z" }, { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload_time = "2025-10-08T22:01:04.834Z" }, { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload_time = "2025-10-08T22:01:05.84Z" }, { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload_time = "2025-10-08T22:01:06.896Z" }, { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload_time = "2025-10-08T22:01:08.107Z" }, { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload_time = "2025-10-08T22:01:09.082Z" }, { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload_time = "2025-10-08T22:01:10.266Z" }, { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload_time = "2025-10-08T22:01:11.332Z" }, { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload_time = "2025-10-08T22:01:12.498Z" }, { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload_time = "2025-10-08T22:01:13.551Z" }, { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload_time = "2025-10-08T22:01:14.614Z" }, { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload_time = "2025-10-08T22:01:15.629Z" }, { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload_time = "2025-10-08T22:01:16.51Z" }, { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload_time = "2025-10-08T22:01:17.964Z" }, { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload_time = "2025-10-08T22:01:18.959Z" }, { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload_time = "2025-10-08T22:01:20.106Z" }, { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload_time = "2025-10-08T22:01:21.164Z" }, { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload_time = "2025-10-08T22:01:22.417Z" }, { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload_time = "2025-10-08T22:01:23.859Z" }, { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload_time = "2025-10-08T22:01:24.893Z" }, { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload_time = "2025-10-08T22:01:26.153Z" }, { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload_time = "2025-10-08T22:01:27.06Z" }, { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload_time = "2025-10-08T22:01:28.059Z" }, { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload_time = "2025-10-08T22:01:29.066Z" }, { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload_time = "2025-10-08T22:01:31.98Z" }, { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload_time = "2025-10-08T22:01:32.989Z" }, { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload_time = "2025-10-08T22:01:34.052Z" }, { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload_time = "2025-10-08T22:01:35.082Z" }, { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload_time = "2025-10-08T22:01:36.057Z" }, { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload_time = "2025-10-08T22:01:37.27Z" }, { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload_time = "2025-10-08T22:01:38.235Z" }, { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload_time = "2025-10-08T22:01:39.712Z" }, { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload_time = "2025-10-08T22:01:40.773Z" }, { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload_time = "2025-10-08T22:01:41.824Z" }, { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload_time = "2025-10-08T22:01:43.177Z" }, { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload_time = "2025-10-08T22:01:44.233Z" }, { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload_time = "2025-10-08T22:01:45.234Z" }, { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload_time = "2025-10-08T22:01:46.04Z" }, ] [[package]] name = "twisted" version = "25.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "automat" }, { name = "constantly" }, { name = "hyperlink" }, { name = "incremental" }, { name = "typing-extensions" }, { name = "zope-interface", version = "8.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "zope-interface", version = "8.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/13/0f/82716ed849bf7ea4984c21385597c949944f0f9b428b5710f79d0afc084d/twisted-25.5.0.tar.gz", hash = "sha256:1deb272358cb6be1e3e8fc6f9c8b36f78eb0fa7c2233d2dbe11ec6fee04ea316", size = 3545725, upload_time = "2025-06-07T09:52:24.858Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/eb/66/ab7efd8941f0bc7b2bd555b0f0471bff77df4c88e0cc31120c82737fec77/twisted-25.5.0-py3-none-any.whl", hash = "sha256:8559f654d01a54a8c3efe66d533d43f383531ebf8d81d9f9ab4769d91ca15df7", size = 3204767, upload_time = "2025-06-07T09:52:21.428Z" }, ] [package.optional-dependencies] tls = [ { name = "idna" }, { name = "pyopenssl" }, { name = "service-identity" }, ] [[package]] name = "txaio" version = "23.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] sdist = { url = "https://files.pythonhosted.org/packages/89/82/2e6ddbf65591a37a68e2b0d09324fd9ba90f763b707b31df24847b07af5c/txaio-23.6.1.tar.gz", hash = "sha256:2e040bc849cb57a0abd2ec3dec78d540c474bcf6de0634e788764741c04aab93", size = 58613, upload_time = "2025-06-25T21:34:02.16Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/15/88/0d000ddcebd54469ffd84688b578578e3d180b23fa91114d22ec205b9e5d/txaio-23.6.1-py2.py3-none-any.whl", hash = "sha256:ed993341154a20e38787fce8fcbd0297c2efd3ff90942e06475a299f354c40b6", size = 31233, upload_time = "2025-06-25T21:34:00.643Z" }, ] [[package]] name = "txaio" version = "25.9.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version == '3.10.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/2b/20/2e7ccea9ab2dd824d0bd421d9364424afde3bb33863afb80cd9180335019/txaio-25.9.2.tar.gz", hash = "sha256:e42004a077c02eb5819ff004a4989e49db113836708430d59cb13d31bd309099", size = 50008, upload_time = "2025-09-25T22:21:07.958Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7e/2c/e276b80f73fc0411cefa1c1eeae6bc17955197a9c3e2b41b41f957322549/txaio-25.9.2-py3-none-any.whl", hash = "sha256:a23ce6e627d130e9b795cbdd46c9eaf8abd35e42d2401bb3fea63d38beda0991", size = 31293, upload_time = "2025-09-25T22:21:06.394Z" }, ] [[package]] name = "txaio" version = "25.12.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", ] sdist = { url = "https://files.pythonhosted.org/packages/7f/67/ea9c9ddbaa3e0b4d53c91f8778a33e42045be352dc7200ed2b9aaa7dc229/txaio-25.12.2.tar.gz", hash = "sha256:9f232c21e12aa1ff52690e365b5a0ecfd42cc27a6ec86e1b92ece88f763f4b78", size = 117393, upload_time = "2025-12-09T15:03:26.527Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/50/05/bdb6318120cac9bf97779674f49035e0595d894b42d4c43b60637bafdb1f/txaio-25.12.2-py3-none-any.whl", hash = "sha256:5f6cd6c6b397fc3305790d15efd46a2d5b91cdbefa96543b4f8666aeb56ba026", size = 31208, upload_time = "2025-12-09T04:30:27.811Z" }, ] [[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 = "u-msgpack-python" version = "2.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/36/9d/a40411a475e7d4838994b7f6bcc6bfca9acc5b119ce3a7503608c4428b49/u-msgpack-python-2.8.0.tar.gz", hash = "sha256:b801a83d6ed75e6df41e44518b4f2a9c221dc2da4bcd5380e3a0feda520bc61a", size = 18167, upload_time = "2023-05-18T09:28:12.187Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b1/5e/512aeb40fd819f4660d00f96f5c7371ee36fc8c6b605128c5ee59e0b28c6/u_msgpack_python-2.8.0-py2.py3-none-any.whl", hash = "sha256:1d853d33e78b72c4228a2025b4db28cda81214076e5b0422ed0ae1b1b2bb586a", size = 10590, upload_time = "2023-05-18T09:28:10.323Z" }, ] [[package]] name = "ujson" version = "5.11.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/43/d9/3f17e3c5773fb4941c68d9a37a47b1a79c9649d6c56aefbed87cc409d18a/ujson-5.11.0.tar.gz", hash = "sha256:e204ae6f909f099ba6b6b942131cee359ddda2b6e4ea39c12eb8b991fe2010e0", size = 7156583, upload_time = "2025-08-20T11:57:02.452Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/86/0c/8bf7a4fabfd01c7eed92d9b290930ce6d14910dec708e73538baa38885d1/ujson-5.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:446e8c11c06048611c9d29ef1237065de0af07cabdd97e6b5b527b957692ec25", size = 55248, upload_time = "2025-08-20T11:55:02.368Z" }, { url = "https://files.pythonhosted.org/packages/7b/2e/eeab0b8b641817031ede4f790db4c4942df44a12f44d72b3954f39c6a115/ujson-5.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16ccb973b7ada0455201808ff11d48fe9c3f034a6ab5bd93b944443c88299f89", size = 53157, upload_time = "2025-08-20T11:55:04.012Z" }, { url = "https://files.pythonhosted.org/packages/21/1b/a4e7a41870797633423ea79618526747353fd7be9191f3acfbdee0bf264b/ujson-5.11.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3134b783ab314d2298d58cda7e47e7a0f7f71fc6ade6ac86d5dbeaf4b9770fa6", size = 57657, upload_time = "2025-08-20T11:55:05.169Z" }, { url = "https://files.pythonhosted.org/packages/94/ae/4e0d91b8f6db7c9b76423b3649612189506d5a06ddd3b6334b6d37f77a01/ujson-5.11.0-cp310-cp310-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:185f93ebccffebc8baf8302c869fac70dd5dd78694f3b875d03a31b03b062cdb", size = 59780, upload_time = "2025-08-20T11:55:06.325Z" }, { url = "https://files.pythonhosted.org/packages/b3/cc/46b124c2697ca2da7c65c4931ed3cb670646978157aa57a7a60f741c530f/ujson-5.11.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d06e87eded62ff0e5f5178c916337d2262fdbc03b31688142a3433eabb6511db", size = 57307, upload_time = "2025-08-20T11:55:07.493Z" }, { url = "https://files.pythonhosted.org/packages/39/eb/20dd1282bc85dede2f1c62c45b4040bc4c389c80a05983515ab99771bca7/ujson-5.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:181fb5b15703a8b9370b25345d2a1fd1359f0f18776b3643d24e13ed9c036d4c", size = 1036369, upload_time = "2025-08-20T11:55:09.192Z" }, { url = "https://files.pythonhosted.org/packages/64/a2/80072439065d493e3a4b1fbeec991724419a1b4c232e2d1147d257cac193/ujson-5.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4df61a6df0a4a8eb5b9b1ffd673429811f50b235539dac586bb7e9e91994138", size = 1195738, upload_time = "2025-08-20T11:55:11.402Z" }, { url = "https://files.pythonhosted.org/packages/5d/7e/d77f9e9c039d58299c350c978e086a804d1fceae4fd4a1cc6e8d0133f838/ujson-5.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6eff24e1abd79e0ec6d7eae651dd675ddbc41f9e43e29ef81e16b421da896915", size = 1088718, upload_time = "2025-08-20T11:55:13.297Z" }, { url = "https://files.pythonhosted.org/packages/ab/f1/697559d45acc849cada6b3571d53522951b1a64027400507aabc6a710178/ujson-5.11.0-cp310-cp310-win32.whl", hash = "sha256:30f607c70091483550fbd669a0b37471e5165b317d6c16e75dba2aa967608723", size = 39653, upload_time = "2025-08-20T11:55:14.869Z" }, { url = "https://files.pythonhosted.org/packages/86/a2/70b73a0f55abe0e6b8046d365d74230c20c5691373e6902a599b2dc79ba1/ujson-5.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:3d2720e9785f84312b8e2cb0c2b87f1a0b1c53aaab3b2af3ab817d54409012e0", size = 43720, upload_time = "2025-08-20T11:55:15.897Z" }, { url = "https://files.pythonhosted.org/packages/1c/5f/b19104afa455630b43efcad3a24495b9c635d92aa8f2da4f30e375deb1a2/ujson-5.11.0-cp310-cp310-win_arm64.whl", hash = "sha256:85e6796631165f719084a9af00c79195d3ebf108151452fefdcb1c8bb50f0105", size = 38410, upload_time = "2025-08-20T11:55:17.556Z" }, { url = "https://files.pythonhosted.org/packages/da/ea/80346b826349d60ca4d612a47cdf3533694e49b45e9d1c07071bb867a184/ujson-5.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d7c46cb0fe5e7056b9acb748a4c35aa1b428025853032540bb7e41f46767321f", size = 55248, upload_time = "2025-08-20T11:55:19.033Z" }, { url = "https://files.pythonhosted.org/packages/57/df/b53e747562c89515e18156513cc7c8ced2e5e3fd6c654acaa8752ffd7cd9/ujson-5.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8951bb7a505ab2a700e26f691bdfacf395bc7e3111e3416d325b513eea03a58", size = 53156, upload_time = "2025-08-20T11:55:20.174Z" }, { url = "https://files.pythonhosted.org/packages/41/b8/ab67ec8c01b8a3721fd13e5cb9d85ab2a6066a3a5e9148d661a6870d6293/ujson-5.11.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952c0be400229940248c0f5356514123d428cba1946af6fa2bbd7503395fef26", size = 57657, upload_time = "2025-08-20T11:55:21.296Z" }, { url = "https://files.pythonhosted.org/packages/7b/c7/fb84f27cd80a2c7e2d3c6012367aecade0da936790429801803fa8d4bffc/ujson-5.11.0-cp311-cp311-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:94fcae844f1e302f6f8095c5d1c45a2f0bfb928cccf9f1b99e3ace634b980a2a", size = 59779, upload_time = "2025-08-20T11:55:22.772Z" }, { url = "https://files.pythonhosted.org/packages/5d/7c/48706f7c1e917ecb97ddcfb7b1d756040b86ed38290e28579d63bd3fcc48/ujson-5.11.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e0ec1646db172beb8d3df4c32a9d78015e671d2000af548252769e33079d9a6", size = 57284, upload_time = "2025-08-20T11:55:24.01Z" }, { url = "https://files.pythonhosted.org/packages/ec/ce/48877c6eb4afddfd6bd1db6be34456538c07ca2d6ed233d3f6c6efc2efe8/ujson-5.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:da473b23e3a54448b008d33f742bcd6d5fb2a897e42d1fc6e7bf306ea5d18b1b", size = 1036395, upload_time = "2025-08-20T11:55:25.725Z" }, { url = "https://files.pythonhosted.org/packages/8b/7a/2c20dc97ad70cd7c31ad0596ba8e2cf8794d77191ba4d1e0bded69865477/ujson-5.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:aa6b3d4f1c0d3f82930f4cbd7fe46d905a4a9205a7c13279789c1263faf06dba", size = 1195731, upload_time = "2025-08-20T11:55:27.915Z" }, { url = "https://files.pythonhosted.org/packages/15/f5/ca454f2f6a2c840394b6f162fff2801450803f4ff56c7af8ce37640b8a2a/ujson-5.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4843f3ab4fe1cc596bb7e02228ef4c25d35b4bb0809d6a260852a4bfcab37ba3", size = 1088710, upload_time = "2025-08-20T11:55:29.426Z" }, { url = "https://files.pythonhosted.org/packages/fe/d3/9ba310e07969bc9906eb7548731e33a0f448b122ad9705fed699c9b29345/ujson-5.11.0-cp311-cp311-win32.whl", hash = "sha256:e979fbc469a7f77f04ec2f4e853ba00c441bf2b06720aa259f0f720561335e34", size = 39648, upload_time = "2025-08-20T11:55:31.194Z" }, { url = "https://files.pythonhosted.org/packages/57/f7/da05b4a8819f1360be9e71fb20182f0bb3ec611a36c3f213f4d20709e099/ujson-5.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:683f57f0dd3acdd7d9aff1de0528d603aafcb0e6d126e3dc7ce8b020a28f5d01", size = 43717, upload_time = "2025-08-20T11:55:32.241Z" }, { url = "https://files.pythonhosted.org/packages/9a/cc/f3f9ac0f24f00a623a48d97dc3814df5c2dc368cfb00031aa4141527a24b/ujson-5.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:7855ccea3f8dad5e66d8445d754fc1cf80265a4272b5f8059ebc7ec29b8d0835", size = 38402, upload_time = "2025-08-20T11:55:33.641Z" }, { url = "https://files.pythonhosted.org/packages/b9/ef/a9cb1fce38f699123ff012161599fb9f2ff3f8d482b4b18c43a2dc35073f/ujson-5.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7895f0d2d53bd6aea11743bd56e3cb82d729980636cd0ed9b89418bf66591702", size = 55434, upload_time = "2025-08-20T11:55:34.987Z" }, { url = "https://files.pythonhosted.org/packages/b1/05/dba51a00eb30bd947791b173766cbed3492269c150a7771d2750000c965f/ujson-5.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12b5e7e22a1fe01058000d1b317d3b65cc3daf61bd2ea7a2b76721fe160fa74d", size = 53190, upload_time = "2025-08-20T11:55:36.384Z" }, { url = "https://files.pythonhosted.org/packages/03/3c/fd11a224f73fbffa299fb9644e425f38b38b30231f7923a088dd513aabb4/ujson-5.11.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80", size = 57600, upload_time = "2025-08-20T11:55:37.692Z" }, { url = "https://files.pythonhosted.org/packages/55/b9/405103cae24899df688a3431c776e00528bd4799e7d68820e7ebcf824f92/ujson-5.11.0-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc", size = 59791, upload_time = "2025-08-20T11:55:38.877Z" }, { url = "https://files.pythonhosted.org/packages/17/7b/2dcbc2bbfdbf68f2368fb21ab0f6735e872290bb604c75f6e06b81edcb3f/ujson-5.11.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8254e858437c00f17cb72e7a644fc42dad0ebb21ea981b71df6e84b1072aaa7c", size = 57356, upload_time = "2025-08-20T11:55:40.036Z" }, { url = "https://files.pythonhosted.org/packages/d1/71/fea2ca18986a366c750767b694430d5ded6b20b6985fddca72f74af38a4c/ujson-5.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1aa8a2ab482f09f6c10fba37112af5f957689a79ea598399c85009f2f29898b5", size = 1036313, upload_time = "2025-08-20T11:55:41.408Z" }, { url = "https://files.pythonhosted.org/packages/a3/bb/d4220bd7532eac6288d8115db51710fa2d7d271250797b0bfba9f1e755af/ujson-5.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a638425d3c6eed0318df663df44480f4a40dc87cc7c6da44d221418312f6413b", size = 1195782, upload_time = "2025-08-20T11:55:43.357Z" }, { url = "https://files.pythonhosted.org/packages/80/47/226e540aa38878ce1194454385701d82df538ccb5ff8db2cf1641dde849a/ujson-5.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e3cff632c1d78023b15f7e3a81c3745cd3f94c044d1e8fa8efbd6b161997bbc", size = 1088817, upload_time = "2025-08-20T11:55:45.262Z" }, { url = "https://files.pythonhosted.org/packages/7e/81/546042f0b23c9040d61d46ea5ca76f0cc5e0d399180ddfb2ae976ebff5b5/ujson-5.11.0-cp312-cp312-win32.whl", hash = "sha256:be6b0eaf92cae8cdee4d4c9e074bde43ef1c590ed5ba037ea26c9632fb479c88", size = 39757, upload_time = "2025-08-20T11:55:46.522Z" }, { url = "https://files.pythonhosted.org/packages/44/1b/27c05dc8c9728f44875d74b5bfa948ce91f6c33349232619279f35c6e817/ujson-5.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b7b136cc6abc7619124fd897ef75f8e63105298b5ca9bdf43ebd0e1fa0ee105f", size = 43859, upload_time = "2025-08-20T11:55:47.987Z" }, { url = "https://files.pythonhosted.org/packages/22/2d/37b6557c97c3409c202c838aa9c960ca3896843b4295c4b7bb2bbd260664/ujson-5.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:6cd2df62f24c506a0ba322d5e4fe4466d47a9467b57e881ee15a31f7ecf68ff6", size = 38361, upload_time = "2025-08-20T11:55:49.122Z" }, { url = "https://files.pythonhosted.org/packages/1c/ec/2de9dd371d52c377abc05d2b725645326c4562fc87296a8907c7bcdf2db7/ujson-5.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:109f59885041b14ee9569bf0bb3f98579c3fa0652317b355669939e5fc5ede53", size = 55435, upload_time = "2025-08-20T11:55:50.243Z" }, { url = "https://files.pythonhosted.org/packages/5b/a4/f611f816eac3a581d8a4372f6967c3ed41eddbae4008d1d77f223f1a4e0a/ujson-5.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a31c6b8004438e8c20fc55ac1c0e07dad42941db24176fe9acf2815971f8e752", size = 53193, upload_time = "2025-08-20T11:55:51.373Z" }, { url = "https://files.pythonhosted.org/packages/e9/c5/c161940967184de96f5cbbbcce45b562a4bf851d60f4c677704b1770136d/ujson-5.11.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78c684fb21255b9b90320ba7e199780f653e03f6c2528663768965f4126a5b50", size = 57603, upload_time = "2025-08-20T11:55:52.583Z" }, { url = "https://files.pythonhosted.org/packages/2b/d6/c7b2444238f5b2e2d0e3dab300b9ddc3606e4b1f0e4bed5a48157cebc792/ujson-5.11.0-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:4c9f5d6a27d035dd90a146f7761c2272cf7103de5127c9ab9c4cd39ea61e878a", size = 59794, upload_time = "2025-08-20T11:55:53.69Z" }, { url = "https://files.pythonhosted.org/packages/fe/a3/292551f936d3d02d9af148f53e1bc04306b00a7cf1fcbb86fa0d1c887242/ujson-5.11.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:837da4d27fed5fdc1b630bd18f519744b23a0b5ada1bbde1a36ba463f2900c03", size = 57363, upload_time = "2025-08-20T11:55:54.843Z" }, { url = "https://files.pythonhosted.org/packages/90/a6/82cfa70448831b1a9e73f882225980b5c689bf539ec6400b31656a60ea46/ujson-5.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:787aff4a84da301b7f3bac09bc696e2e5670df829c6f8ecf39916b4e7e24e701", size = 1036311, upload_time = "2025-08-20T11:55:56.197Z" }, { url = "https://files.pythonhosted.org/packages/84/5c/96e2266be50f21e9b27acaee8ca8f23ea0b85cb998c33d4f53147687839b/ujson-5.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6dd703c3e86dc6f7044c5ac0b3ae079ed96bf297974598116aa5fb7f655c3a60", size = 1195783, upload_time = "2025-08-20T11:55:58.081Z" }, { url = "https://files.pythonhosted.org/packages/8d/20/78abe3d808cf3bb3e76f71fca46cd208317bf461c905d79f0d26b9df20f1/ujson-5.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3772e4fe6b0c1e025ba3c50841a0ca4786825a4894c8411bf8d3afe3a8061328", size = 1088822, upload_time = "2025-08-20T11:55:59.469Z" }, { url = "https://files.pythonhosted.org/packages/d8/50/8856e24bec5e2fc7f775d867aeb7a3f137359356200ac44658f1f2c834b2/ujson-5.11.0-cp313-cp313-win32.whl", hash = "sha256:8fa2af7c1459204b7a42e98263b069bd535ea0cd978b4d6982f35af5a04a4241", size = 39753, upload_time = "2025-08-20T11:56:01.345Z" }, { url = "https://files.pythonhosted.org/packages/5b/d8/1baee0f4179a4d0f5ce086832147b6cc9b7731c24ca08e14a3fdb8d39c32/ujson-5.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:34032aeca4510a7c7102bd5933f59a37f63891f30a0706fb46487ab6f0edf8f0", size = 43866, upload_time = "2025-08-20T11:56:02.552Z" }, { url = "https://files.pythonhosted.org/packages/a9/8c/6d85ef5be82c6d66adced3ec5ef23353ed710a11f70b0b6a836878396334/ujson-5.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:ce076f2df2e1aa62b685086fbad67f2b1d3048369664b4cdccc50707325401f9", size = 38363, upload_time = "2025-08-20T11:56:03.688Z" }, { url = "https://files.pythonhosted.org/packages/28/08/4518146f4984d112764b1dfa6fb7bad691c44a401adadaa5e23ccd930053/ujson-5.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:65724738c73645db88f70ba1f2e6fb678f913281804d5da2fd02c8c5839af302", size = 55462, upload_time = "2025-08-20T11:56:04.873Z" }, { url = "https://files.pythonhosted.org/packages/29/37/2107b9a62168867a692654d8766b81bd2fd1e1ba13e2ec90555861e02b0c/ujson-5.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29113c003ca33ab71b1b480bde952fbab2a0b6b03a4ee4c3d71687cdcbd1a29d", size = 53246, upload_time = "2025-08-20T11:56:06.054Z" }, { url = "https://files.pythonhosted.org/packages/9b/f8/25583c70f83788edbe3ca62ce6c1b79eff465d78dec5eb2b2b56b3e98b33/ujson-5.11.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c44c703842024d796b4c78542a6fcd5c3cb948b9fc2a73ee65b9c86a22ee3638", size = 57631, upload_time = "2025-08-20T11:56:07.374Z" }, { url = "https://files.pythonhosted.org/packages/ed/ca/19b3a632933a09d696f10dc1b0dfa1d692e65ad507d12340116ce4f67967/ujson-5.11.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:e750c436fb90edf85585f5c62a35b35082502383840962c6983403d1bd96a02c", size = 59877, upload_time = "2025-08-20T11:56:08.534Z" }, { url = "https://files.pythonhosted.org/packages/55/7a/4572af5324ad4b2bfdd2321e898a527050290147b4ea337a79a0e4e87ec7/ujson-5.11.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f278b31a7c52eb0947b2db55a5133fbc46b6f0ef49972cd1a80843b72e135aba", size = 57363, upload_time = "2025-08-20T11:56:09.758Z" }, { url = "https://files.pythonhosted.org/packages/7b/71/a2b8c19cf4e1efe53cf439cdf7198ac60ae15471d2f1040b490c1f0f831f/ujson-5.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ab2cb8351d976e788669c8281465d44d4e94413718af497b4e7342d7b2f78018", size = 1036394, upload_time = "2025-08-20T11:56:11.168Z" }, { url = "https://files.pythonhosted.org/packages/7a/3e/7b98668cba3bb3735929c31b999b374ebc02c19dfa98dfebaeeb5c8597ca/ujson-5.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:090b4d11b380ae25453100b722d0609d5051ffe98f80ec52853ccf8249dfd840", size = 1195837, upload_time = "2025-08-20T11:56:12.6Z" }, { url = "https://files.pythonhosted.org/packages/a1/ea/8870f208c20b43571a5c409ebb2fe9b9dba5f494e9e60f9314ac01ea8f78/ujson-5.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:80017e870d882d5517d28995b62e4e518a894f932f1e242cbc802a2fd64d365c", size = 1088837, upload_time = "2025-08-20T11:56:14.15Z" }, { url = "https://files.pythonhosted.org/packages/63/b6/c0e6607e37fa47929920a685a968c6b990a802dec65e9c5181e97845985d/ujson-5.11.0-cp314-cp314-win32.whl", hash = "sha256:1d663b96eb34c93392e9caae19c099ec4133ba21654b081956613327f0e973ac", size = 41022, upload_time = "2025-08-20T11:56:15.509Z" }, { url = "https://files.pythonhosted.org/packages/4e/56/f4fe86b4c9000affd63e9219e59b222dc48b01c534533093e798bf617a7e/ujson-5.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:849e65b696f0d242833f1df4182096cedc50d414215d1371fca85c541fbff629", size = 45111, upload_time = "2025-08-20T11:56:16.597Z" }, { url = "https://files.pythonhosted.org/packages/0a/f3/669437f0280308db4783b12a6d88c00730b394327d8334cc7a32ef218e64/ujson-5.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:e73df8648c9470af2b6a6bf5250d4744ad2cf3d774dcf8c6e31f018bdd04d764", size = 39682, upload_time = "2025-08-20T11:56:17.763Z" }, { url = "https://files.pythonhosted.org/packages/6e/cd/e9809b064a89fe5c4184649adeb13c1b98652db3f8518980b04227358574/ujson-5.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:de6e88f62796372fba1de973c11138f197d3e0e1d80bcb2b8aae1e826096d433", size = 55759, upload_time = "2025-08-20T11:56:18.882Z" }, { url = "https://files.pythonhosted.org/packages/1b/be/ae26a6321179ebbb3a2e2685b9007c71bcda41ad7a77bbbe164005e956fc/ujson-5.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e56ef8066f11b80d620985ae36869a3ff7e4b74c3b6129182ec5d1df0255f3", size = 53634, upload_time = "2025-08-20T11:56:20.012Z" }, { url = "https://files.pythonhosted.org/packages/ae/e9/fb4a220ee6939db099f4cfeeae796ecb91e7584ad4d445d4ca7f994a9135/ujson-5.11.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a325fd2c3a056cf6c8e023f74a0c478dd282a93141356ae7f16d5309f5ff823", size = 58547, upload_time = "2025-08-20T11:56:21.175Z" }, { url = "https://files.pythonhosted.org/packages/bd/f8/fc4b952b8f5fea09ea3397a0bd0ad019e474b204cabcb947cead5d4d1ffc/ujson-5.11.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:a0af6574fc1d9d53f4ff371f58c96673e6d988ed2b5bf666a6143c782fa007e9", size = 60489, upload_time = "2025-08-20T11:56:22.342Z" }, { url = "https://files.pythonhosted.org/packages/2e/e5/af5491dfda4f8b77e24cf3da68ee0d1552f99a13e5c622f4cef1380925c3/ujson-5.11.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10f29e71ecf4ecd93a6610bd8efa8e7b6467454a363c3d6416db65de883eb076", size = 58035, upload_time = "2025-08-20T11:56:23.92Z" }, { url = "https://files.pythonhosted.org/packages/c4/09/0945349dd41f25cc8c38d78ace49f14c5052c5bbb7257d2f466fa7bdb533/ujson-5.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1a0a9b76a89827a592656fe12e000cf4f12da9692f51a841a4a07aa4c7ecc41c", size = 1037212, upload_time = "2025-08-20T11:56:25.274Z" }, { url = "https://files.pythonhosted.org/packages/49/44/8e04496acb3d5a1cbee3a54828d9652f67a37523efa3d3b18a347339680a/ujson-5.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b16930f6a0753cdc7d637b33b4e8f10d5e351e1fb83872ba6375f1e87be39746", size = 1196500, upload_time = "2025-08-20T11:56:27.517Z" }, { url = "https://files.pythonhosted.org/packages/64/ae/4bc825860d679a0f208a19af2f39206dfd804ace2403330fdc3170334a2f/ujson-5.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:04c41afc195fd477a59db3a84d5b83a871bd648ef371cf8c6f43072d89144eef", size = 1089487, upload_time = "2025-08-20T11:56:29.07Z" }, { url = "https://files.pythonhosted.org/packages/30/ed/5a057199fb0a5deabe0957073a1c1c1c02a3e99476cd03daee98ea21fa57/ujson-5.11.0-cp314-cp314t-win32.whl", hash = "sha256:aa6d7a5e09217ff93234e050e3e380da62b084e26b9f2e277d2606406a2fc2e5", size = 41859, upload_time = "2025-08-20T11:56:30.495Z" }, { url = "https://files.pythonhosted.org/packages/aa/03/b19c6176bdf1dc13ed84b886e99677a52764861b6cc023d5e7b6ebda249d/ujson-5.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:48055e1061c1bb1f79e75b4ac39e821f3f35a9b82de17fce92c3140149009bec", size = 46183, upload_time = "2025-08-20T11:56:31.574Z" }, { url = "https://files.pythonhosted.org/packages/5d/ca/a0413a3874b2dc1708b8796ca895bf363292f9c70b2e8ca482b7dbc0259d/ujson-5.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1194b943e951092db611011cb8dbdb6cf94a3b816ed07906e14d3bc6ce0e90ab", size = 40264, upload_time = "2025-08-20T11:56:32.773Z" }, { url = "https://files.pythonhosted.org/packages/39/bf/c6f59cdf74ce70bd937b97c31c42fd04a5ed1a9222d0197e77e4bd899841/ujson-5.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:65f3c279f4ed4bf9131b11972040200c66ae040368abdbb21596bf1564899694", size = 55283, upload_time = "2025-08-20T11:56:33.947Z" }, { url = "https://files.pythonhosted.org/packages/8d/c1/a52d55638c0c644b8a63059f95ad5ffcb4ad8f60d8bc3e8680f78e77cc75/ujson-5.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:99c49400572cd77050894e16864a335225191fd72a818ea6423ae1a06467beac", size = 53168, upload_time = "2025-08-20T11:56:35.141Z" }, { url = "https://files.pythonhosted.org/packages/75/6c/e64e19a01d59c8187d01ffc752ee3792a09f5edaaac2a0402de004459dd7/ujson-5.11.0-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0654a2691fc252c3c525e3d034bb27b8a7546c9d3eb33cd29ce6c9feda361a6a", size = 57809, upload_time = "2025-08-20T11:56:36.293Z" }, { url = "https://files.pythonhosted.org/packages/9f/36/910117b7a8a1c188396f6194ca7bc8fd75e376d8f7e3cf5eb6219fc8b09d/ujson-5.11.0-cp39-cp39-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:6b6ec7e7321d7fc19abdda3ad809baef935f49673951a8bab486aea975007e02", size = 59797, upload_time = "2025-08-20T11:56:37.746Z" }, { url = "https://files.pythonhosted.org/packages/c7/17/bcc85d282ee2f4cdef5f577e0a43533eedcae29cc6405edf8c62a7a50368/ujson-5.11.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f62b9976fabbcde3ab6e413f4ec2ff017749819a0786d84d7510171109f2d53c", size = 57378, upload_time = "2025-08-20T11:56:39.123Z" }, { url = "https://files.pythonhosted.org/packages/ef/39/120bb76441bf835f3c3f42db9c206f31ba875711637a52a8209949ab04b0/ujson-5.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f1a27ab91083b4770e160d17f61b407f587548f2c2b5fbf19f94794c495594a", size = 1036515, upload_time = "2025-08-20T11:56:40.848Z" }, { url = "https://files.pythonhosted.org/packages/b6/ae/fe1b4ff6388f681f6710e9494656957725b1e73ae50421ec04567df9fb75/ujson-5.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ecd6ff8a3b5a90c292c2396c2d63c687fd0ecdf17de390d852524393cd9ed052", size = 1195753, upload_time = "2025-08-20T11:56:42.341Z" }, { url = "https://files.pythonhosted.org/packages/92/20/005b93f2cf846ae50b46812fcf24bbdd127521197e5f1e1a82e3b3e730a1/ujson-5.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9aacbeb23fdbc4b256a7d12e0beb9063a1ba5d9e0dbb2cfe16357c98b4334596", size = 1088844, upload_time = "2025-08-20T11:56:43.777Z" }, { url = "https://files.pythonhosted.org/packages/41/9e/3142023c30008e2b24d7368a389b26d28d62fcd3f596d3d898a72dd09173/ujson-5.11.0-cp39-cp39-win32.whl", hash = "sha256:674f306e3e6089f92b126eb2fe41bcb65e42a15432c143365c729fdb50518547", size = 39652, upload_time = "2025-08-20T11:56:45.034Z" }, { url = "https://files.pythonhosted.org/packages/ca/89/f4de0a3c485d0163f85f552886251876645fb62cbbe24fcdc0874b9fae03/ujson-5.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c6618f480f7c9ded05e78a1938873fde68baf96cdd74e6d23c7e0a8441175c4b", size = 43783, upload_time = "2025-08-20T11:56:46.156Z" }, { url = "https://files.pythonhosted.org/packages/48/b1/2d50987a7b7cccb5c1fbe9ae7b184211106237b32c7039118c41d79632ea/ujson-5.11.0-cp39-cp39-win_arm64.whl", hash = "sha256:5600202a731af24a25e2d7b6eb3f648e4ecd4bb67c4d5cf12f8fab31677469c9", size = 38430, upload_time = "2025-08-20T11:56:47.653Z" }, { url = "https://files.pythonhosted.org/packages/50/17/30275aa2933430d8c0c4ead951cc4fdb922f575a349aa0b48a6f35449e97/ujson-5.11.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:abae0fb58cc820092a0e9e8ba0051ac4583958495bfa5262a12f628249e3b362", size = 51206, upload_time = "2025-08-20T11:56:48.797Z" }, { url = "https://files.pythonhosted.org/packages/c3/15/42b3924258eac2551f8f33fa4e35da20a06a53857ccf3d4deb5e5d7c0b6c/ujson-5.11.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39", size = 48907, upload_time = "2025-08-20T11:56:50.136Z" }, { url = "https://files.pythonhosted.org/packages/94/7e/0519ff7955aba581d1fe1fb1ca0e452471250455d182f686db5ac9e46119/ujson-5.11.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b42c115c7c6012506e8168315150d1e3f76e7ba0f4f95616f4ee599a1372bbc", size = 50319, upload_time = "2025-08-20T11:56:51.63Z" }, { url = "https://files.pythonhosted.org/packages/74/cf/209d90506b7d6c5873f82c5a226d7aad1a1da153364e9ebf61eff0740c33/ujson-5.11.0-pp311-pypy311_pp73-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:86baf341d90b566d61a394869ce77188cc8668f76d7bb2c311d77a00f4bdf844", size = 56584, upload_time = "2025-08-20T11:56:52.89Z" }, { url = "https://files.pythonhosted.org/packages/e9/97/bd939bb76943cb0e1d2b692d7e68629f51c711ef60425fa5bb6968037ecd/ujson-5.11.0-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4598bf3965fc1a936bd84034312bcbe00ba87880ef1ee33e33c1e88f2c398b49", size = 51588, upload_time = "2025-08-20T11:56:54.054Z" }, { url = "https://files.pythonhosted.org/packages/52/5b/8c5e33228f7f83f05719964db59f3f9f276d272dc43752fa3bbf0df53e7b/ujson-5.11.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:416389ec19ef5f2013592f791486bef712ebce0cd59299bf9df1ba40bb2f6e04", size = 43835, upload_time = "2025-08-20T11:56:55.237Z" }, ] [[package]] name = "urllib3" version = "2.6.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload_time = "2025-12-11T15:56:40.252Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload_time = "2025-12-11T15:56:38.584Z" }, ] [[package]] name = "uvicorn" version = "0.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/f06b84e2697fef4688ca63bdb2fdf113ca0a3be33f94488f2cadb690b0cf/uvicorn-0.38.0.tar.gz", hash = "sha256:fd97093bdd120a2609fc0d3afe931d4d4ad688b6e75f0f929fde1bc36fe0e91d", size = 80605, upload_time = "2025-10-18T13:46:44.63Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ee/d9/d88e73ca598f4f6ff671fb5fde8a32925c2e08a637303a1d12883c7305fa/uvicorn-0.38.0-py3-none-any.whl", hash = "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02", size = 68109, upload_time = "2025-10-18T13:46:42.958Z" }, ] [[package]] name = "virtualenv" version = "20.35.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock", version = "3.19.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "filelock", version = "3.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/20/28/e6f1a6f655d620846bd9df527390ecc26b3805a0c5989048c210e22c5ca9/virtualenv-20.35.4.tar.gz", hash = "sha256:643d3914d73d3eeb0c552cbb12d7e82adf0e504dbf86a3182f8771a153a1971c", size = 6028799, upload_time = "2025-10-29T06:57:40.511Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl", hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b", size = 6005095, upload_time = "2025-10-29T06:57:37.598Z" }, ] [[package]] name = "wrapt" version = "2.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload_time = "2025-11-07T00:45:33.312Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/61/0d/12d8c803ed2ce4e5e7d5b9f5f602721f9dfef82c95959f3ce97fa584bb5c/wrapt-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64b103acdaa53b7caf409e8d45d39a8442fe6dcfec6ba3f3d141e0cc2b5b4dbd", size = 77481, upload_time = "2025-11-07T00:43:11.103Z" }, { url = "https://files.pythonhosted.org/packages/05/3e/4364ebe221ebf2a44d9fc8695a19324692f7dd2795e64bd59090856ebf12/wrapt-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91bcc576260a274b169c3098e9a3519fb01f2989f6d3d386ef9cbf8653de1374", size = 60692, upload_time = "2025-11-07T00:43:13.697Z" }, { url = "https://files.pythonhosted.org/packages/1f/ff/ae2a210022b521f86a8ddcdd6058d137c051003812b0388a5e9a03d3fe10/wrapt-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab594f346517010050126fcd822697b25a7031d815bb4fbc238ccbe568216489", size = 61574, upload_time = "2025-11-07T00:43:14.967Z" }, { url = "https://files.pythonhosted.org/packages/c6/93/5cf92edd99617095592af919cb81d4bff61c5dbbb70d3c92099425a8ec34/wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31", size = 113688, upload_time = "2025-11-07T00:43:18.275Z" }, { url = "https://files.pythonhosted.org/packages/a0/0a/e38fc0cee1f146c9fb266d8ef96ca39fb14a9eef165383004019aa53f88a/wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef", size = 115698, upload_time = "2025-11-07T00:43:19.407Z" }, { url = "https://files.pythonhosted.org/packages/b0/85/bef44ea018b3925fb0bcbe9112715f665e4d5309bd945191da814c314fd1/wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013", size = 112096, upload_time = "2025-11-07T00:43:16.5Z" }, { url = "https://files.pythonhosted.org/packages/7c/0b/733a2376e413117e497aa1a5b1b78e8f3a28c0e9537d26569f67d724c7c5/wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38", size = 114878, upload_time = "2025-11-07T00:43:20.81Z" }, { url = "https://files.pythonhosted.org/packages/da/03/d81dcb21bbf678fcda656495792b059f9d56677d119ca022169a12542bd0/wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1", size = 111298, upload_time = "2025-11-07T00:43:22.229Z" }, { url = "https://files.pythonhosted.org/packages/c9/d5/5e623040e8056e1108b787020d56b9be93dbbf083bf2324d42cde80f3a19/wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25", size = 113361, upload_time = "2025-11-07T00:43:24.301Z" }, { url = "https://files.pythonhosted.org/packages/a1/f3/de535ccecede6960e28c7b722e5744846258111d6c9f071aa7578ea37ad3/wrapt-2.0.1-cp310-cp310-win32.whl", hash = "sha256:8330b42d769965e96e01fa14034b28a2a7600fbf7e8f0cc90ebb36d492c993e4", size = 58035, upload_time = "2025-11-07T00:43:28.96Z" }, { url = "https://files.pythonhosted.org/packages/21/15/39d3ca5428a70032c2ec8b1f1c9d24c32e497e7ed81aed887a4998905fcc/wrapt-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:1218573502a8235bb8a7ecaed12736213b22dcde9feab115fa2989d42b5ded45", size = 60383, upload_time = "2025-11-07T00:43:25.804Z" }, { url = "https://files.pythonhosted.org/packages/43/c2/dfd23754b7f7a4dce07e08f4309c4e10a40046a83e9ae1800f2e6b18d7c1/wrapt-2.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:eda8e4ecd662d48c28bb86be9e837c13e45c58b8300e43ba3c9b4fa9900302f7", size = 58894, upload_time = "2025-11-07T00:43:27.074Z" }, { url = "https://files.pythonhosted.org/packages/98/60/553997acf3939079dab022e37b67b1904b5b0cc235503226898ba573b10c/wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590", size = 77480, upload_time = "2025-11-07T00:43:30.573Z" }, { url = "https://files.pythonhosted.org/packages/2d/50/e5b3d30895d77c52105c6d5cbf94d5b38e2a3dd4a53d22d246670da98f7c/wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6", size = 60690, upload_time = "2025-11-07T00:43:31.594Z" }, { url = "https://files.pythonhosted.org/packages/f0/40/660b2898703e5cbbb43db10cdefcc294274458c3ca4c68637c2b99371507/wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7", size = 61578, upload_time = "2025-11-07T00:43:32.918Z" }, { url = "https://files.pythonhosted.org/packages/5b/36/825b44c8a10556957bc0c1d84c7b29a40e05fcf1873b6c40aa9dbe0bd972/wrapt-2.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df0b6d3b95932809c5b3fecc18fda0f1e07452d05e2662a0b35548985f256e28", size = 114115, upload_time = "2025-11-07T00:43:35.605Z" }, { url = "https://files.pythonhosted.org/packages/83/73/0a5d14bb1599677304d3c613a55457d34c344e9b60eda8a737c2ead7619e/wrapt-2.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da7384b0e5d4cae05c97cd6f94faaf78cc8b0f791fc63af43436d98c4ab37bb", size = 116157, upload_time = "2025-11-07T00:43:37.058Z" }, { url = "https://files.pythonhosted.org/packages/01/22/1c158fe763dbf0a119f985d945711d288994fe5514c0646ebe0eb18b016d/wrapt-2.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ec65a78fbd9d6f083a15d7613b2800d5663dbb6bb96003899c834beaa68b242c", size = 112535, upload_time = "2025-11-07T00:43:34.138Z" }, { url = "https://files.pythonhosted.org/packages/5c/28/4f16861af67d6de4eae9927799b559c20ebdd4fe432e89ea7fe6fcd9d709/wrapt-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7de3cc939be0e1174969f943f3b44e0d79b6f9a82198133a5b7fc6cc92882f16", size = 115404, upload_time = "2025-11-07T00:43:39.214Z" }, { url = "https://files.pythonhosted.org/packages/a0/8b/7960122e625fad908f189b59c4aae2d50916eb4098b0fb2819c5a177414f/wrapt-2.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fb1a5b72cbd751813adc02ef01ada0b0d05d3dcbc32976ce189a1279d80ad4a2", size = 111802, upload_time = "2025-11-07T00:43:40.476Z" }, { url = "https://files.pythonhosted.org/packages/3e/73/7881eee5ac31132a713ab19a22c9e5f1f7365c8b1df50abba5d45b781312/wrapt-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3fa272ca34332581e00bf7773e993d4f632594eb2d1b0b162a9038df0fd971dd", size = 113837, upload_time = "2025-11-07T00:43:42.921Z" }, { url = "https://files.pythonhosted.org/packages/45/00/9499a3d14e636d1f7089339f96c4409bbc7544d0889f12264efa25502ae8/wrapt-2.0.1-cp311-cp311-win32.whl", hash = "sha256:fc007fdf480c77301ab1afdbb6ab22a5deee8885f3b1ed7afcb7e5e84a0e27be", size = 58028, upload_time = "2025-11-07T00:43:47.369Z" }, { url = "https://files.pythonhosted.org/packages/70/5d/8f3d7eea52f22638748f74b102e38fdf88cb57d08ddeb7827c476a20b01b/wrapt-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:47434236c396d04875180171ee1f3815ca1eada05e24a1ee99546320d54d1d1b", size = 60385, upload_time = "2025-11-07T00:43:44.34Z" }, { url = "https://files.pythonhosted.org/packages/14/e2/32195e57a8209003587bbbad44d5922f13e0ced2a493bb46ca882c5b123d/wrapt-2.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:837e31620e06b16030b1d126ed78e9383815cbac914693f54926d816d35d8edf", size = 58893, upload_time = "2025-11-07T00:43:46.161Z" }, { url = "https://files.pythonhosted.org/packages/cb/73/8cb252858dc8254baa0ce58ce382858e3a1cf616acebc497cb13374c95c6/wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c", size = 78129, upload_time = "2025-11-07T00:43:48.852Z" }, { url = "https://files.pythonhosted.org/packages/19/42/44a0db2108526ee6e17a5ab72478061158f34b08b793df251d9fbb9a7eb4/wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841", size = 61205, upload_time = "2025-11-07T00:43:50.402Z" }, { url = "https://files.pythonhosted.org/packages/4d/8a/5b4b1e44b791c22046e90d9b175f9a7581a8cc7a0debbb930f81e6ae8e25/wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62", size = 61692, upload_time = "2025-11-07T00:43:51.678Z" }, { url = "https://files.pythonhosted.org/packages/11/53/3e794346c39f462bcf1f58ac0487ff9bdad02f9b6d5ee2dc84c72e0243b2/wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf", size = 121492, upload_time = "2025-11-07T00:43:55.017Z" }, { url = "https://files.pythonhosted.org/packages/c6/7e/10b7b0e8841e684c8ca76b462a9091c45d62e8f2de9c4b1390b690eadf16/wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9", size = 123064, upload_time = "2025-11-07T00:43:56.323Z" }, { url = "https://files.pythonhosted.org/packages/0e/d1/3c1e4321fc2f5ee7fd866b2d822aa89b84495f28676fd976c47327c5b6aa/wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b", size = 117403, upload_time = "2025-11-07T00:43:53.258Z" }, { url = "https://files.pythonhosted.org/packages/a4/b0/d2f0a413cf201c8c2466de08414a15420a25aa83f53e647b7255cc2fab5d/wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba", size = 121500, upload_time = "2025-11-07T00:43:57.468Z" }, { url = "https://files.pythonhosted.org/packages/bd/45/bddb11d28ca39970a41ed48a26d210505120f925918592283369219f83cc/wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684", size = 116299, upload_time = "2025-11-07T00:43:58.877Z" }, { url = "https://files.pythonhosted.org/packages/81/af/34ba6dd570ef7a534e7eec0c25e2615c355602c52aba59413411c025a0cb/wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb", size = 120622, upload_time = "2025-11-07T00:43:59.962Z" }, { url = "https://files.pythonhosted.org/packages/e2/3e/693a13b4146646fb03254636f8bafd20c621955d27d65b15de07ab886187/wrapt-2.0.1-cp312-cp312-win32.whl", hash = "sha256:3e271346f01e9c8b1130a6a3b0e11908049fe5be2d365a5f402778049147e7e9", size = 58246, upload_time = "2025-11-07T00:44:03.169Z" }, { url = "https://files.pythonhosted.org/packages/a7/36/715ec5076f925a6be95f37917b66ebbeaa1372d1862c2ccd7a751574b068/wrapt-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:2da620b31a90cdefa9cd0c2b661882329e2e19d1d7b9b920189956b76c564d75", size = 60492, upload_time = "2025-11-07T00:44:01.027Z" }, { url = "https://files.pythonhosted.org/packages/ef/3e/62451cd7d80f65cc125f2b426b25fbb6c514bf6f7011a0c3904fc8c8df90/wrapt-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:aea9c7224c302bc8bfc892b908537f56c430802560e827b75ecbde81b604598b", size = 58987, upload_time = "2025-11-07T00:44:02.095Z" }, { url = "https://files.pythonhosted.org/packages/ad/fe/41af4c46b5e498c90fc87981ab2972fbd9f0bccda597adb99d3d3441b94b/wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9", size = 78132, upload_time = "2025-11-07T00:44:04.628Z" }, { url = "https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f", size = 61211, upload_time = "2025-11-07T00:44:05.626Z" }, { url = "https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218", size = 61689, upload_time = "2025-11-07T00:44:06.719Z" }, { url = "https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9", size = 121502, upload_time = "2025-11-07T00:44:09.557Z" }, { url = "https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c", size = 123110, upload_time = "2025-11-07T00:44:10.64Z" }, { url = "https://files.pythonhosted.org/packages/e5/08/cdbb965fbe4c02c5233d185d070cabed2ecc1f1e47662854f95d77613f57/wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db", size = 117434, upload_time = "2025-11-07T00:44:08.138Z" }, { url = "https://files.pythonhosted.org/packages/2d/d1/6aae2ce39db4cb5216302fa2e9577ad74424dfbe315bd6669725569e048c/wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233", size = 121533, upload_time = "2025-11-07T00:44:12.142Z" }, { url = "https://files.pythonhosted.org/packages/79/35/565abf57559fbe0a9155c29879ff43ce8bd28d2ca61033a3a3dd67b70794/wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2", size = 116324, upload_time = "2025-11-07T00:44:13.28Z" }, { url = "https://files.pythonhosted.org/packages/e1/e0/53ff5e76587822ee33e560ad55876d858e384158272cd9947abdd4ad42ca/wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b", size = 120627, upload_time = "2025-11-07T00:44:14.431Z" }, { url = "https://files.pythonhosted.org/packages/7c/7b/38df30fd629fbd7612c407643c63e80e1c60bcc982e30ceeae163a9800e7/wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7", size = 58252, upload_time = "2025-11-07T00:44:17.814Z" }, { url = "https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3", size = 60500, upload_time = "2025-11-07T00:44:15.561Z" }, { url = "https://files.pythonhosted.org/packages/89/4e/3c8b99ac93527cfab7f116089db120fef16aac96e5f6cdb724ddf286086d/wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8", size = 58993, upload_time = "2025-11-07T00:44:16.65Z" }, { url = "https://files.pythonhosted.org/packages/f9/f4/eff2b7d711cae20d220780b9300faa05558660afb93f2ff5db61fe725b9a/wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3", size = 82028, upload_time = "2025-11-07T00:44:18.944Z" }, { url = "https://files.pythonhosted.org/packages/0c/67/cb945563f66fd0f61a999339460d950f4735c69f18f0a87ca586319b1778/wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1", size = 62949, upload_time = "2025-11-07T00:44:20.074Z" }, { url = "https://files.pythonhosted.org/packages/ec/ca/f63e177f0bbe1e5cf5e8d9b74a286537cd709724384ff20860f8f6065904/wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d", size = 63681, upload_time = "2025-11-07T00:44:21.345Z" }, { url = "https://files.pythonhosted.org/packages/39/a1/1b88fcd21fd835dca48b556daef750952e917a2794fa20c025489e2e1f0f/wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7", size = 152696, upload_time = "2025-11-07T00:44:24.318Z" }, { url = "https://files.pythonhosted.org/packages/62/1c/d9185500c1960d9f5f77b9c0b890b7fc62282b53af7ad1b6bd779157f714/wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3", size = 158859, upload_time = "2025-11-07T00:44:25.494Z" }, { url = "https://files.pythonhosted.org/packages/91/60/5d796ed0f481ec003220c7878a1d6894652efe089853a208ea0838c13086/wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b", size = 146068, upload_time = "2025-11-07T00:44:22.81Z" }, { url = "https://files.pythonhosted.org/packages/04/f8/75282dd72f102ddbfba137e1e15ecba47b40acff32c08ae97edbf53f469e/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10", size = 155724, upload_time = "2025-11-07T00:44:26.634Z" }, { url = "https://files.pythonhosted.org/packages/5a/27/fe39c51d1b344caebb4a6a9372157bdb8d25b194b3561b52c8ffc40ac7d1/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf", size = 144413, upload_time = "2025-11-07T00:44:27.939Z" }, { url = "https://files.pythonhosted.org/packages/83/2b/9f6b643fe39d4505c7bf926d7c2595b7cb4b607c8c6b500e56c6b36ac238/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e", size = 150325, upload_time = "2025-11-07T00:44:29.29Z" }, { url = "https://files.pythonhosted.org/packages/bb/b6/20ffcf2558596a7f58a2e69c89597128781f0b88e124bf5a4cadc05b8139/wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c", size = 59943, upload_time = "2025-11-07T00:44:33.211Z" }, { url = "https://files.pythonhosted.org/packages/87/6a/0e56111cbb3320151eed5d3821ee1373be13e05b376ea0870711f18810c3/wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92", size = 63240, upload_time = "2025-11-07T00:44:30.935Z" }, { url = "https://files.pythonhosted.org/packages/1d/54/5ab4c53ea1f7f7e5c3e7c1095db92932cc32fd62359d285486d00c2884c3/wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f", size = 60416, upload_time = "2025-11-07T00:44:32.002Z" }, { url = "https://files.pythonhosted.org/packages/73/81/d08d83c102709258e7730d3cd25befd114c60e43ef3891d7e6877971c514/wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1", size = 78290, upload_time = "2025-11-07T00:44:34.691Z" }, { url = "https://files.pythonhosted.org/packages/f6/14/393afba2abb65677f313aa680ff0981e829626fed39b6a7e3ec807487790/wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55", size = 61255, upload_time = "2025-11-07T00:44:35.762Z" }, { url = "https://files.pythonhosted.org/packages/c4/10/a4a1f2fba205a9462e36e708ba37e5ac95f4987a0f1f8fd23f0bf1fc3b0f/wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0", size = 61797, upload_time = "2025-11-07T00:44:37.22Z" }, { url = "https://files.pythonhosted.org/packages/12/db/99ba5c37cf1c4fad35349174f1e38bd8d992340afc1ff27f526729b98986/wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509", size = 120470, upload_time = "2025-11-07T00:44:39.425Z" }, { url = "https://files.pythonhosted.org/packages/30/3f/a1c8d2411eb826d695fc3395a431757331582907a0ec59afce8fe8712473/wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1", size = 122851, upload_time = "2025-11-07T00:44:40.582Z" }, { url = "https://files.pythonhosted.org/packages/b3/8d/72c74a63f201768d6a04a8845c7976f86be6f5ff4d74996c272cefc8dafc/wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970", size = 117433, upload_time = "2025-11-07T00:44:38.313Z" }, { url = "https://files.pythonhosted.org/packages/c7/5a/df37cf4042cb13b08256f8e27023e2f9b3d471d553376616591bb99bcb31/wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c", size = 121280, upload_time = "2025-11-07T00:44:41.69Z" }, { url = "https://files.pythonhosted.org/packages/54/34/40d6bc89349f9931e1186ceb3e5fbd61d307fef814f09fbbac98ada6a0c8/wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41", size = 116343, upload_time = "2025-11-07T00:44:43.013Z" }, { url = "https://files.pythonhosted.org/packages/70/66/81c3461adece09d20781dee17c2366fdf0cb8754738b521d221ca056d596/wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed", size = 119650, upload_time = "2025-11-07T00:44:44.523Z" }, { url = "https://files.pythonhosted.org/packages/46/3a/d0146db8be8761a9e388cc9cc1c312b36d583950ec91696f19bbbb44af5a/wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0", size = 58701, upload_time = "2025-11-07T00:44:48.277Z" }, { url = "https://files.pythonhosted.org/packages/1a/38/5359da9af7d64554be63e9046164bd4d8ff289a2dd365677d25ba3342c08/wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c", size = 60947, upload_time = "2025-11-07T00:44:46.086Z" }, { url = "https://files.pythonhosted.org/packages/aa/3f/96db0619276a833842bf36343685fa04f987dd6e3037f314531a1e00492b/wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e", size = 59359, upload_time = "2025-11-07T00:44:47.164Z" }, { url = "https://files.pythonhosted.org/packages/71/49/5f5d1e867bf2064bf3933bc6cf36ade23505f3902390e175e392173d36a2/wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b", size = 82031, upload_time = "2025-11-07T00:44:49.4Z" }, { url = "https://files.pythonhosted.org/packages/2b/89/0009a218d88db66ceb83921e5685e820e2c61b59bbbb1324ba65342668bc/wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec", size = 62952, upload_time = "2025-11-07T00:44:50.74Z" }, { url = "https://files.pythonhosted.org/packages/ae/18/9b968e920dd05d6e44bcc918a046d02afea0fb31b2f1c80ee4020f377cbe/wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa", size = 63688, upload_time = "2025-11-07T00:44:52.248Z" }, { url = "https://files.pythonhosted.org/packages/a6/7d/78bdcb75826725885d9ea26c49a03071b10c4c92da93edda612910f150e4/wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815", size = 152706, upload_time = "2025-11-07T00:44:54.613Z" }, { url = "https://files.pythonhosted.org/packages/dd/77/cac1d46f47d32084a703df0d2d29d47e7eb2a7d19fa5cbca0e529ef57659/wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa", size = 158866, upload_time = "2025-11-07T00:44:55.79Z" }, { url = "https://files.pythonhosted.org/packages/8a/11/b521406daa2421508903bf8d5e8b929216ec2af04839db31c0a2c525eee0/wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef", size = 146148, upload_time = "2025-11-07T00:44:53.388Z" }, { url = "https://files.pythonhosted.org/packages/0c/c0/340b272bed297baa7c9ce0c98ef7017d9c035a17a6a71dce3184b8382da2/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747", size = 155737, upload_time = "2025-11-07T00:44:56.971Z" }, { url = "https://files.pythonhosted.org/packages/f3/93/bfcb1fb2bdf186e9c2883a4d1ab45ab099c79cbf8f4e70ea453811fa3ea7/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f", size = 144451, upload_time = "2025-11-07T00:44:58.515Z" }, { url = "https://files.pythonhosted.org/packages/d2/6b/dca504fb18d971139d232652656180e3bd57120e1193d9a5899c3c0b7cdd/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349", size = 150353, upload_time = "2025-11-07T00:44:59.753Z" }, { url = "https://files.pythonhosted.org/packages/1d/f6/a1de4bd3653afdf91d250ca5c721ee51195df2b61a4603d4b373aa804d1d/wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c", size = 60609, upload_time = "2025-11-07T00:45:03.315Z" }, { url = "https://files.pythonhosted.org/packages/01/3a/07cd60a9d26fe73efead61c7830af975dfdba8537632d410462672e4432b/wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395", size = 64038, upload_time = "2025-11-07T00:45:00.948Z" }, { url = "https://files.pythonhosted.org/packages/41/99/8a06b8e17dddbf321325ae4eb12465804120f699cd1b8a355718300c62da/wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad", size = 60634, upload_time = "2025-11-07T00:45:02.087Z" }, { url = "https://files.pythonhosted.org/packages/c6/1f/5af0ae22368ec69067a577f9e07a0dd2619a1f63aabc2851263679942667/wrapt-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:68424221a2dc00d634b54f92441914929c5ffb1c30b3b837343978343a3512a3", size = 77478, upload_time = "2025-11-07T00:45:16.65Z" }, { url = "https://files.pythonhosted.org/packages/8c/b7/fd6b563aada859baabc55db6aa71b8afb4a3ceb8bc33d1053e4c7b5e0109/wrapt-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bd1a18f5a797fe740cb3d7a0e853a8ce6461cc62023b630caec80171a6b8097", size = 60687, upload_time = "2025-11-07T00:45:17.896Z" }, { url = "https://files.pythonhosted.org/packages/0f/8c/9ededfff478af396bcd081076986904bdca336d9664d247094150c877dcb/wrapt-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb3a86e703868561c5cad155a15c36c716e1ab513b7065bd2ac8ed353c503333", size = 61563, upload_time = "2025-11-07T00:45:19.109Z" }, { url = "https://files.pythonhosted.org/packages/ab/a7/d795a1aa2b6ab20ca21157fe03cbfc6aa7e870a88ac3b4ea189e2f6c79f0/wrapt-2.0.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5dc1b852337c6792aa111ca8becff5bacf576bf4a0255b0f05eb749da6a1643e", size = 113395, upload_time = "2025-11-07T00:45:21.551Z" }, { url = "https://files.pythonhosted.org/packages/61/32/56cde2bbf95f2d5698a1850a765520aa86bc7ae0f95b8ec80b6f2e2049bb/wrapt-2.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c046781d422f0830de6329fa4b16796096f28a92c8aef3850674442cdcb87b7f", size = 115362, upload_time = "2025-11-07T00:45:22.809Z" }, { url = "https://files.pythonhosted.org/packages/cf/53/8d3cc433847c219212c133a3e8305bd087b386ef44442ff39189e8fa62ac/wrapt-2.0.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f73f9f7a0ebd0db139253d27e5fc8d2866ceaeef19c30ab5d69dcbe35e1a6981", size = 111766, upload_time = "2025-11-07T00:45:20.294Z" }, { url = "https://files.pythonhosted.org/packages/b8/d3/14b50c2d0463c0dcef8f388cb1527ed7bbdf0972b9fd9976905f36c77ebf/wrapt-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b667189cf8efe008f55bbda321890bef628a67ab4147ebf90d182f2dadc78790", size = 114560, upload_time = "2025-11-07T00:45:24.054Z" }, { url = "https://files.pythonhosted.org/packages/3a/b8/4f731ff178f77ae55385586de9ff4b4261e872cf2ced4875e6c976fbcb8b/wrapt-2.0.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:a9a83618c4f0757557c077ef71d708ddd9847ed66b7cc63416632af70d3e2308", size = 110999, upload_time = "2025-11-07T00:45:25.596Z" }, { url = "https://files.pythonhosted.org/packages/fe/bb/5f1bb0f9ae9d12e19f1d71993d052082062603e83fe3e978377f918f054d/wrapt-2.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e9b121e9aeb15df416c2c960b8255a49d44b4038016ee17af03975992d03931", size = 113164, upload_time = "2025-11-07T00:45:26.8Z" }, { url = "https://files.pythonhosted.org/packages/ad/f6/f3a3c623d3065c7bf292ee0b73566236b562d5ed894891bd8e435762b618/wrapt-2.0.1-cp39-cp39-win32.whl", hash = "sha256:1f186e26ea0a55f809f232e92cc8556a0977e00183c3ebda039a807a42be1494", size = 58028, upload_time = "2025-11-07T00:45:30.943Z" }, { url = "https://files.pythonhosted.org/packages/24/78/647c609dfa18063a7fcd5c23f762dd006be401cc9206314d29c9b0b12078/wrapt-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bf4cb76f36be5de950ce13e22e7fdf462b35b04665a12b64f3ac5c1bbbcf3728", size = 60380, upload_time = "2025-11-07T00:45:28.341Z" }, { url = "https://files.pythonhosted.org/packages/07/90/0c14b241d18d80ddf4c847a5f52071e126e8a6a9e5a8a7952add8ef0d766/wrapt-2.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:d6cc985b9c8b235bd933990cdbf0f891f8e010b65a3911f7a55179cd7b0fc57b", size = 58895, upload_time = "2025-11-07T00:45:29.527Z" }, { url = "https://files.pythonhosted.org/packages/15/d1/b51471c11592ff9c012bd3e2f7334a6ff2f42a7aed2caffcf0bdddc9cb89/wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca", size = 44046, upload_time = "2025-11-07T00:45:32.116Z" }, ] [[package]] name = "zipp" version = "3.23.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload_time = "2025-06-08T17:06:39.4Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload_time = "2025-06-08T17:06:38.034Z" }, ] [[package]] name = "zope-interface" version = "8.0.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] sdist = { url = "https://files.pythonhosted.org/packages/88/3a/7fcf02178b8fad0a51e67e32765cd039ae505d054d744d76b8c2bbcba5ba/zope_interface-8.0.1.tar.gz", hash = "sha256:eba5610d042c3704a48222f7f7c6ab5b243ed26f917e2bc69379456b115e02d1", size = 253746, upload_time = "2025-09-25T05:55:51.285Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/75/e5/ffef169d17b92c6236b3b18b890c0ce73502f3cbd5b6532ff20d412d94a3/zope_interface-8.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fd7195081b8637eeed8d73e4d183b07199a1dc738fb28b3de6666b1b55662570", size = 207364, upload_time = "2025-09-25T05:58:50.262Z" }, { url = "https://files.pythonhosted.org/packages/35/b6/87aca626c09af829d3a32011599d6e18864bc8daa0ad3a7e258f3d7f8bcf/zope_interface-8.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f7c4bc4021108847bce763673ce70d0716b08dfc2ba9889e7bad46ac2b3bb924", size = 207901, upload_time = "2025-09-25T05:58:51.74Z" }, { url = "https://files.pythonhosted.org/packages/d8/c1/eec33cc9f847ebeb0bc6234d7d45fe3fc0a6fe8fc5b5e6be0442bd2c684d/zope_interface-8.0.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:758803806b962f32c87b31bb18c298b022965ba34fe532163831cc39118c24ab", size = 249358, upload_time = "2025-09-25T05:58:16.979Z" }, { url = "https://files.pythonhosted.org/packages/58/7d/1e3476a1ef0175559bd8492dc7bb921ad0df5b73861d764b1f824ad5484a/zope_interface-8.0.1-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f8e88f35f86bbe8243cad4b2972deef0fdfca0a0723455abbebdc83bbab96b69", size = 254475, upload_time = "2025-09-25T05:58:10.032Z" }, { url = "https://files.pythonhosted.org/packages/bc/67/ba5ea98ff23f723c5cbe7db7409f2e43c9fe2df1ced67881443c01e64478/zope_interface-8.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7844765695937d9b0d83211220b72e2cf6ac81a08608ad2b58f2c094af498d83", size = 254913, upload_time = "2025-09-25T06:26:22.263Z" }, { url = "https://files.pythonhosted.org/packages/2b/a7/b1b8b6c13fba955c043cdee409953ee85f652b106493e2e931a84f95c1aa/zope_interface-8.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:64fa7b206dd9669f29d5c1241a768bebe8ab1e8a4b63ee16491f041e058c09d0", size = 211753, upload_time = "2025-09-25T05:59:00.561Z" }, { url = "https://files.pythonhosted.org/packages/f2/2f/c10c739bcb9b072090c97c2e08533777497190daa19d190d72b4cce9c7cb/zope_interface-8.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4bd01022d2e1bce4a4a4ed9549edb25393c92e607d7daa6deff843f1f68b479d", size = 207903, upload_time = "2025-09-25T05:58:21.671Z" }, { url = "https://files.pythonhosted.org/packages/b5/e1/9845ac3697f108d9a1af6912170c59a23732090bbfb35955fe77e5544955/zope_interface-8.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:29be8db8b712d94f1c05e24ea230a879271d787205ba1c9a6100d1d81f06c69a", size = 208345, upload_time = "2025-09-25T05:58:24.217Z" }, { url = "https://files.pythonhosted.org/packages/f2/49/6573bc8b841cfab18e80c8e8259f1abdbbf716140011370de30231be79ad/zope_interface-8.0.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:51ae1b856565b30455b7879fdf0a56a88763b401d3f814fa9f9542d7410dbd7e", size = 255027, upload_time = "2025-09-25T05:58:19.975Z" }, { url = "https://files.pythonhosted.org/packages/e2/fd/908b0fd4b1ab6e412dfac9bd2b606f2893ef9ba3dd36d643f5e5b94c57b3/zope_interface-8.0.1-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d2e7596149cb1acd1d4d41b9f8fe2ffc0e9e29e2e91d026311814181d0d9efaf", size = 259800, upload_time = "2025-09-25T05:58:11.487Z" }, { url = "https://files.pythonhosted.org/packages/dc/78/8419a2b4e88410520ed4b7f93bbd25a6d4ae66c4e2b131320f2b90f43077/zope_interface-8.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2737c11c34fb9128816759864752d007ec4f987b571c934c30723ed881a7a4f", size = 260978, upload_time = "2025-09-25T06:26:24.483Z" }, { url = "https://files.pythonhosted.org/packages/e5/90/caf68152c292f1810e2bd3acd2177badf08a740aa8a348714617d6c9ad0b/zope_interface-8.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:cf66e4bf731aa7e0ced855bb3670e8cda772f6515a475c6a107bad5cb6604103", size = 212155, upload_time = "2025-09-25T05:59:40.318Z" }, { url = "https://files.pythonhosted.org/packages/dc/a6/0f08713ddda834c428ebf97b2a7fd8dea50c0100065a8955924dbd94dae8/zope_interface-8.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:115f27c1cc95ce7a517d960ef381beedb0a7ce9489645e80b9ab3cbf8a78799c", size = 208609, upload_time = "2025-09-25T05:58:53.698Z" }, { url = "https://files.pythonhosted.org/packages/e9/5e/d423045f54dc81e0991ec655041e7a0eccf6b2642535839dd364b35f4d7f/zope_interface-8.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af655c573b84e3cb6a4f6fd3fbe04e4dc91c63c6b6f99019b3713ef964e589bc", size = 208797, upload_time = "2025-09-25T05:58:56.258Z" }, { url = "https://files.pythonhosted.org/packages/c6/43/39d4bb3f7a80ebd261446792493cfa4e198badd47107224f5b6fe1997ad9/zope_interface-8.0.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:23f82ef9b2d5370750cc1bf883c3b94c33d098ce08557922a3fbc7ff3b63dfe1", size = 259242, upload_time = "2025-09-25T05:58:21.602Z" }, { url = "https://files.pythonhosted.org/packages/da/29/49effcff64ef30731e35520a152a9dfcafec86cf114b4c2aff942e8264ba/zope_interface-8.0.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35a1565d5244997f2e629c5c68715b3d9d9036e8df23c4068b08d9316dcb2822", size = 264696, upload_time = "2025-09-25T05:58:13.351Z" }, { url = "https://files.pythonhosted.org/packages/c7/39/b947673ec9a258eeaa20208dd2f6127d9fbb3e5071272a674ebe02063a78/zope_interface-8.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:029ea1db7e855a475bf88d9910baab4e94d007a054810e9007ac037a91c67c6f", size = 264229, upload_time = "2025-09-25T06:26:26.226Z" }, { url = "https://files.pythonhosted.org/packages/8f/ee/eed6efd1fc3788d1bef7a814e0592d8173b7fe601c699b935009df035fc2/zope_interface-8.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0beb3e7f7dc153944076fcaf717a935f68d39efa9fce96ec97bafcc0c2ea6cab", size = 212270, upload_time = "2025-09-25T05:58:53.584Z" }, { url = "https://files.pythonhosted.org/packages/5f/dc/3c12fca01c910c793d636ffe9c0984e0646abaf804e44552070228ed0ede/zope_interface-8.0.1-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:c7cc027fc5c61c5d69e5080c30b66382f454f43dc379c463a38e78a9c6bab71a", size = 208992, upload_time = "2025-09-25T05:58:40.712Z" }, { url = "https://files.pythonhosted.org/packages/46/71/6127b7282a3e380ca927ab2b40778a9c97935a4a57a2656dadc312db5f30/zope_interface-8.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcf9097ff3003b7662299f1c25145e15260ec2a27f9a9e69461a585d79ca8552", size = 209051, upload_time = "2025-09-25T05:58:42.182Z" }, { url = "https://files.pythonhosted.org/packages/56/86/4387a9f951ee18b0e41fda77da77d59c33e59f04660578e2bad688703e64/zope_interface-8.0.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6d965347dd1fb9e9a53aa852d4ded46b41ca670d517fd54e733a6b6a4d0561c2", size = 259223, upload_time = "2025-09-25T05:58:23.191Z" }, { url = "https://files.pythonhosted.org/packages/61/08/ce60a114466abc067c68ed41e2550c655f551468ae17b4b17ea360090146/zope_interface-8.0.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9a3b8bb77a4b89427a87d1e9eb969ab05e38e6b4a338a9de10f6df23c33ec3c2", size = 264690, upload_time = "2025-09-25T05:58:15.052Z" }, { url = "https://files.pythonhosted.org/packages/36/9a/62a9ba3a919594605a07c34eee3068659bbd648e2fa0c4a86d876810b674/zope_interface-8.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:87e6b089002c43231fb9afec89268391bcc7a3b66e76e269ffde19a8112fb8d5", size = 264201, upload_time = "2025-09-25T06:26:27.797Z" }, { url = "https://files.pythonhosted.org/packages/da/06/8fe88bd7edef60566d21ef5caca1034e10f6b87441ea85de4bbf9ea74768/zope_interface-8.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:64a43f5280aa770cbafd0307cb3d1ff430e2a1001774e8ceb40787abe4bb6658", size = 212273, upload_time = "2025-09-25T06:00:25.398Z" }, { url = "https://files.pythonhosted.org/packages/e5/24/d5c5e7936e014276b7a98a076de4f5dc2587100fea95779c1e36650b8770/zope_interface-8.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84464a9fcf801289fa8b15bfc0829e7855d47fb4a8059555effc6f2d1d9a613", size = 207443, upload_time = "2025-09-25T05:59:34.299Z" }, { url = "https://files.pythonhosted.org/packages/8a/76/565cf6db478ba344b27cfd6828f17da2888cf1beb521bce31142b3041fb5/zope_interface-8.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7b915cf7e747b5356d741be79a153aa9107e8923bc93bcd65fc873caf0fb5c50", size = 207928, upload_time = "2025-09-25T05:59:35.524Z" }, { url = "https://files.pythonhosted.org/packages/65/03/9780355205c3b3f55e9ce700e52846b40d0bab99c078e102c0d7e2f3e022/zope_interface-8.0.1-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:110c73ddf974b369ef3c6e7b0d87d44673cf4914eba3fe8a33bfb21c6c606ad8", size = 248605, upload_time = "2025-09-25T05:58:25.586Z" }, { url = "https://files.pythonhosted.org/packages/44/09/b10eda92f1373cd8e4e9dd376559414d1759a8b54e98eeef0d81844f0638/zope_interface-8.0.1-cp39-cp39-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9e9bdca901c1bcc34e438001718512c65b3b8924aabcd732b6e7a7f0cd715f17", size = 253793, upload_time = "2025-09-25T05:58:16.92Z" }, { url = "https://files.pythonhosted.org/packages/62/37/3529065a2b6b7dc8f287ff3c8d1e8b7d8c4681c069e520bd3c4ac995a95c/zope_interface-8.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bbd22d4801ad3e8ec704ba9e3e6a4ac2e875e4d77e363051ccb76153d24c5519", size = 254263, upload_time = "2025-09-25T06:26:29.371Z" }, { url = "https://files.pythonhosted.org/packages/c3/31/42588bea7ddad3abd2d4987ec3b767bd09394cc091a4918b1cf7b9de07ae/zope_interface-8.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:a0016ca85f93b938824e2f9a43534446e95134a2945b084944786e1ace2020bc", size = 211780, upload_time = "2025-09-25T05:59:50.015Z" }, ] [[package]] name = "zope-interface" version = "8.1.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", "python_full_version == '3.10.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/71/c9/5ec8679a04d37c797d343f650c51ad67d178f0001c363e44b6ac5f97a9da/zope_interface-8.1.1.tar.gz", hash = "sha256:51b10e6e8e238d719636a401f44f1e366146912407b58453936b781a19be19ec", size = 254748, upload_time = "2025-11-15T08:32:52.404Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d8/ca/77df8f9bcbd8a5e29913c7fef14ff0aadac9448e78dc2606a85d7a23ec6c/zope_interface-8.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c6b12b656c7d7e3d79cad8e2afc4a37eae6b6076e2c209a33345143148e435e", size = 207415, upload_time = "2025-11-15T08:36:36.508Z" }, { url = "https://files.pythonhosted.org/packages/e1/1f/f1c7828ba3d9b34e65c7e498216fc37ca6e69f1ff1918cca37cd1d895682/zope_interface-8.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:557c0f1363c300db406e9eeaae8ab6d1ba429d4fed60d8ab7dadab5ca66ccd35", size = 207951, upload_time = "2025-11-15T08:36:38.468Z" }, { url = "https://files.pythonhosted.org/packages/bd/9e/e079035812f06fe1feede1bef753f537fb33d5480d05107f65a51d94e7b3/zope_interface-8.1.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:127b0e4c873752b777721543cf8525b3db5e76b88bd33bab807f03c568e9003f", size = 249409, upload_time = "2025-11-15T08:36:40.148Z" }, { url = "https://files.pythonhosted.org/packages/c2/09/b7f5a33bd3a17efb31e9e14496e600ab550ab0e38829dcda8a73f017fbfe/zope_interface-8.1.1-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0892c9d2dd47b45f62d1861bcae8b427fcc49b4a04fff67f12c5c55e56654d7", size = 254527, upload_time = "2025-11-15T08:36:41.552Z" }, { url = "https://files.pythonhosted.org/packages/2a/90/0eecd1eab6b62d296dff8445f051e4aa6bd91b67d71cfe9ff9d270b64dbe/zope_interface-8.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff8a92dc8c8a2c605074e464984e25b9b5a8ac9b2a0238dd73a0f374df59a77e", size = 254963, upload_time = "2025-11-15T08:36:42.708Z" }, { url = "https://files.pythonhosted.org/packages/fd/ff/2fe84fadd13e8adb7b2fb542311c27bad15881be26e37f403df3d0279c74/zope_interface-8.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:54627ddf6034aab1f506ba750dd093f67d353be6249467d720e9f278a578efe5", size = 211809, upload_time = "2025-11-15T08:36:44.43Z" }, { url = "https://files.pythonhosted.org/packages/77/fc/d84bac27332bdefe8c03f7289d932aeb13a5fd6aeedba72b0aa5b18276ff/zope_interface-8.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e8a0fdd5048c1bb733e4693eae9bc4145a19419ea6a1c95299318a93fe9f3d72", size = 207955, upload_time = "2025-11-15T08:36:45.902Z" }, { url = "https://files.pythonhosted.org/packages/52/02/e1234eb08b10b5cf39e68372586acc7f7bbcd18176f6046433a8f6b8b263/zope_interface-8.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4cb0ea75a26b606f5bc8524fbce7b7d8628161b6da002c80e6417ce5ec757c0", size = 208398, upload_time = "2025-11-15T08:36:47.016Z" }, { url = "https://files.pythonhosted.org/packages/3c/be/aabda44d4bc490f9966c2b77fa7822b0407d852cb909b723f2d9e05d2427/zope_interface-8.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:c267b00b5a49a12743f5e1d3b4beef45479d696dab090f11fe3faded078a5133", size = 255079, upload_time = "2025-11-15T08:36:48.157Z" }, { url = "https://files.pythonhosted.org/packages/d8/7f/4fbc7c2d7cb310e5a91b55db3d98e98d12b262014c1fcad9714fe33c2adc/zope_interface-8.1.1-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e25d3e2b9299e7ec54b626573673bdf0d740cf628c22aef0a3afef85b438aa54", size = 259850, upload_time = "2025-11-15T08:36:49.544Z" }, { url = "https://files.pythonhosted.org/packages/fe/2c/dc573fffe59cdbe8bbbdd2814709bdc71c4870893e7226700bc6a08c5e0c/zope_interface-8.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:63db1241804417aff95ac229c13376c8c12752b83cc06964d62581b493e6551b", size = 261033, upload_time = "2025-11-15T08:36:51.061Z" }, { url = "https://files.pythonhosted.org/packages/0e/51/1ac50e5ee933d9e3902f3400bda399c128a5c46f9f209d16affe3d4facc5/zope_interface-8.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:9639bf4ed07b5277fb231e54109117c30d608254685e48a7104a34618bcbfc83", size = 212215, upload_time = "2025-11-15T08:36:52.553Z" }, { url = "https://files.pythonhosted.org/packages/08/3d/f5b8dd2512f33bfab4faba71f66f6873603d625212206dd36f12403ae4ca/zope_interface-8.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a16715808408db7252b8c1597ed9008bdad7bf378ed48eb9b0595fad4170e49d", size = 208660, upload_time = "2025-11-15T08:36:53.579Z" }, { url = "https://files.pythonhosted.org/packages/e5/41/c331adea9b11e05ff9ac4eb7d3032b24c36a3654ae9f2bf4ef2997048211/zope_interface-8.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce6b58752acc3352c4aa0b55bbeae2a941d61537e6afdad2467a624219025aae", size = 208851, upload_time = "2025-11-15T08:36:54.854Z" }, { url = "https://files.pythonhosted.org/packages/25/00/7a8019c3bb8b119c5f50f0a4869183a4b699ca004a7f87ce98382e6b364c/zope_interface-8.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:807778883d07177713136479de7fd566f9056a13aef63b686f0ab4807c6be259", size = 259292, upload_time = "2025-11-15T08:36:56.409Z" }, { url = "https://files.pythonhosted.org/packages/1a/fc/b70e963bf89345edffdd5d16b61e789fdc09365972b603e13785360fea6f/zope_interface-8.1.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50e5eb3b504a7d63dc25211b9298071d5b10a3eb754d6bf2f8ef06cb49f807ab", size = 264741, upload_time = "2025-11-15T08:36:57.675Z" }, { url = "https://files.pythonhosted.org/packages/96/fe/7d0b5c0692b283901b34847f2b2f50d805bfff4b31de4021ac9dfb516d2a/zope_interface-8.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eee6f93b2512ec9466cf30c37548fd3ed7bc4436ab29cd5943d7a0b561f14f0f", size = 264281, upload_time = "2025-11-15T08:36:58.968Z" }, { url = "https://files.pythonhosted.org/packages/2b/2c/a7cebede1cf2757be158bcb151fe533fa951038cfc5007c7597f9f86804b/zope_interface-8.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:80edee6116d569883c58ff8efcecac3b737733d646802036dc337aa839a5f06b", size = 212327, upload_time = "2025-11-15T08:37:00.4Z" }, { url = "https://files.pythonhosted.org/packages/85/81/3c3b5386ce4fba4612fd82ffb8a90d76bcfea33ca2b6399f21e94d38484f/zope_interface-8.1.1-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:84f9be6d959640de9da5d14ac1f6a89148b16da766e88db37ed17e936160b0b1", size = 209046, upload_time = "2025-11-15T08:37:01.473Z" }, { url = "https://files.pythonhosted.org/packages/4a/e3/32b7cb950c4c4326b3760a8e28e5d6f70ad15f852bfd8f9364b58634f74b/zope_interface-8.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:531fba91dcb97538f70cf4642a19d6574269460274e3f6004bba6fe684449c51", size = 209104, upload_time = "2025-11-15T08:37:02.887Z" }, { url = "https://files.pythonhosted.org/packages/a3/3d/c4c68e1752a5f5effa2c1f5eaa4fea4399433c9b058fb7000a34bfb1c447/zope_interface-8.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:fc65f5633d5a9583ee8d88d1f5de6b46cd42c62e47757cfe86be36fb7c8c4c9b", size = 259277, upload_time = "2025-11-15T08:37:04.389Z" }, { url = "https://files.pythonhosted.org/packages/fd/5b/cf4437b174af7591ee29bbad728f620cab5f47bd6e9c02f87d59f31a0dda/zope_interface-8.1.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efef80ddec4d7d99618ef71bc93b88859248075ca2e1ae1c78636654d3d55533", size = 264742, upload_time = "2025-11-15T08:37:05.613Z" }, { url = "https://files.pythonhosted.org/packages/0b/0e/0cf77356862852d3d3e62db9aadae5419a1a7d89bf963b219745283ab5ca/zope_interface-8.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49aad83525eca3b4747ef51117d302e891f0042b06f32aa1c7023c62642f962b", size = 264252, upload_time = "2025-11-15T08:37:07.035Z" }, { url = "https://files.pythonhosted.org/packages/8a/10/2af54aa88b2fa172d12364116cc40d325fedbb1877c3bb031b0da6052855/zope_interface-8.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:71cf329a21f98cb2bd9077340a589e316ac8a415cac900575a32544b3dffcb98", size = 212330, upload_time = "2025-11-15T08:37:08.14Z" }, { url = "https://files.pythonhosted.org/packages/b9/f5/44efbd98ba06cb937fce7a69fcd7a78c4ac7aa4e1ad2125536801376d2d0/zope_interface-8.1.1-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:da311e9d253991ca327601f47c4644d72359bac6950fbb22f971b24cd7850f8c", size = 209099, upload_time = "2025-11-15T08:37:09.395Z" }, { url = "https://files.pythonhosted.org/packages/fd/36/a19866c09c8485c36a4c6908e1dd3f8820b41c1ee333c291157cf4cf09e7/zope_interface-8.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3fb25fca0442c7fb93c4ee40b42e3e033fef2f648730c4b7ae6d43222a3e8946", size = 209240, upload_time = "2025-11-15T08:37:10.687Z" }, { url = "https://files.pythonhosted.org/packages/c1/28/0dbf40db772d779a4ac8d006a57ad60936d42ad4769a3d5410dcfb98f6f9/zope_interface-8.1.1-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:bac588d0742b4e35efb7c7df1dacc0397b51ed37a17d4169a38019a1cebacf0a", size = 260919, upload_time = "2025-11-15T08:37:11.838Z" }, { url = "https://files.pythonhosted.org/packages/72/ae/650cd4c01dd1b32c26c800b2c4d852f044552c34a56fbb74d41f569cee31/zope_interface-8.1.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d1f053d2d5e2b393e619bce1e55954885c2e63969159aa521839e719442db49", size = 264102, upload_time = "2025-11-15T08:37:13.241Z" }, { url = "https://files.pythonhosted.org/packages/46/f0/f534a2c34c006aa090c593cd70eaf94e259fd0786f934698d81f0534d907/zope_interface-8.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:64a1ad7f4cb17d948c6bdc525a1d60c0e567b2526feb4fa38b38f249961306b8", size = 264276, upload_time = "2025-11-15T08:37:14.369Z" }, { url = "https://files.pythonhosted.org/packages/5b/a8/d7e9cf03067b767e23908dbab5f6be7735d70cb4818311a248a8c4bb23cc/zope_interface-8.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:169214da1b82b7695d1a36f92d70b11166d66b6b09d03df35d150cc62ac52276", size = 212492, upload_time = "2025-11-15T08:37:15.538Z" }, ] python-sse-starlette-3.2.0/tests/0000775000175000017500000000000015132704747016670 5ustar carstencarstenpython-sse-starlette-3.2.0/tests/test_multi_loop.py0000664000175000017500000002267015132704747022473 0ustar carstencarsten""" Tests for multi-loop and thread safety scenarios. - Issue #140: Multi-loop safety (thread isolation) - Issue #149: handle_exit cannot signal context-local events (FIXED via watcher) - Issue #152: Watcher task leak (FIXED by using threading.local instead of ContextVar) Setup/teardown handled by conftest.reset_shutdown_state fixture. """ import asyncio import threading from typing import List import pytest from sse_starlette.sse import ( AppStatus, EventSourceResponse, _get_shutdown_state, ) class TestMultiLoopSafety: """Test suite for multi-loop and thread safety.""" def test_same_thread_shares_state(self): """Test that same thread shares shutdown state (Issue #152 fix). With threading.local, all code in the same thread shares state, preventing multiple watchers from being spawned. """ async def get_state(): return _get_shutdown_state() # Run in different asyncio event loops (still same thread) loop1 = asyncio.new_event_loop() asyncio.set_event_loop(loop1) try: state_a = loop1.run_until_complete(get_state()) finally: loop1.close() loop2 = asyncio.new_event_loop() asyncio.set_event_loop(loop2) try: state_b = loop2.run_until_complete(get_state()) finally: loop2.close() # With threading.local, same thread = same state assert state_a is state_b, "Same thread should share state (Issue #152 fix)" def test_thread_isolation(self): """Test that shutdown state is isolated between different threads.""" states: List = [] errors: List = [] def get_state_in_thread(): """Get state in a new thread with its own event loop.""" try: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) async def get_state(): return _get_shutdown_state() state = loop.run_until_complete(get_state()) states.append(state) loop.close() except Exception as e: errors.append(e) # Get state in multiple threads threads = [] for _ in range(3): thread = threading.Thread(target=get_state_in_thread) threads.append(thread) thread.start() for thread in threads: thread.join() assert not errors, f"Errors occurred: {errors}" assert len(states) == 3 assert ( len(set(id(s) for s in states)) == 3 ), "States should be unique per thread" class TestIssue149HandleExitSignaling: """ Tests for Issue #149: handle_exit cannot signal context-local events. Fixed by watcher pattern: a single watcher polls should_exit and broadcasts to all registered events in the same thread. """ @pytest.mark.asyncio async def test_handle_exit_wakes_waiting_task(self): """ Test that handle_exit() wakes a task waiting on _listen_for_exit_signal. The watcher polls should_exit every 0.5s, so we need to wait for that. """ task_exited = asyncio.Event() async def wait_for_exit(): await EventSourceResponse._listen_for_exit_signal() task_exited.set() task = asyncio.create_task(wait_for_exit()) await asyncio.sleep(0.1) # Let task start waiting original = AppStatus.original_handler AppStatus.original_handler = None # prevent calling Uvicorn handler if existent try: # Simulate shutdown signal AppStatus.handle_exit() finally: AppStatus.original_handler = original # Wait for watcher to poll and broadcast (max 0.5s + margin) try: await asyncio.wait_for(task_exited.wait(), timeout=1.0) except asyncio.TimeoutError: task.cancel() try: await task except asyncio.CancelledError: pass pytest.fail("handle_exit() failed to wake waiting task within timeout.") @pytest.mark.asyncio async def test_handle_exit_wakes_multiple_waiting_tasks(self): """Test that handle_exit() wakes ALL waiting tasks.""" num_tasks = 3 exited = [] async def wait_for_exit(task_id: int): await EventSourceResponse._listen_for_exit_signal() exited.append(task_id) tasks = [asyncio.create_task(wait_for_exit(i)) for i in range(num_tasks)] await asyncio.sleep(0.1) # Let all tasks start waiting original = AppStatus.original_handler AppStatus.original_handler = None try: AppStatus.handle_exit() finally: AppStatus.original_handler = original # Wait for watcher to broadcast done, pending = await asyncio.wait(tasks, timeout=1.0) for t in pending: t.cancel() try: await t except asyncio.CancelledError: pass assert ( len(exited) == num_tasks ), f"Only {len(exited)}/{num_tasks} tasks woke up." @pytest.mark.asyncio async def test_manual_shutdown_ignores_signal(self): """Test that manually setting should_exit wakes waiting tasks.""" task_exited = asyncio.Event() async def wait_for_exit(): await EventSourceResponse._listen_for_exit_signal() task_exited.set() task = asyncio.create_task(wait_for_exit()) await asyncio.sleep(0.1) # Let task start original_drain = AppStatus.enable_automatic_graceful_drain original_handler = AppStatus.original_handler try: AppStatus.disable_automatic_graceful_drain() AppStatus.original_handler = None AppStatus.handle_exit() await asyncio.sleep(1.0) assert ( not task_exited.is_set() ), "Task woke up despite automatic signaling being disabled." AppStatus.should_exit = True # Manually signal shutdown await asyncio.wait([task], timeout=1.0) assert ( task_exited.is_set() ), "Task did not wake up after manual shutdown signal." finally: AppStatus.enable_automatic_graceful_drain = original_drain AppStatus.original_handler = original_handler @pytest.mark.asyncio async def test_all_tasks_share_same_shutdown_state(self): """ Verify that all tasks created with asyncio.create_task() in the same thread share the same _ShutdownState. """ state_ids = [] async def get_state_in_task(task_id: int): state = _get_shutdown_state() state_ids.append((task_id, id(state))) # Create multiple tasks tasks = [asyncio.create_task(get_state_in_task(i)) for i in range(3)] await asyncio.gather(*tasks) # Verify all tasks got the same state instance unique_ids = set(state_id for _, state_id in state_ids) assert len(unique_ids) == 1, ( f"Expected all tasks to share one state, but found {len(unique_ids)} unique states. " f"This indicates threading.local is not working as expected." ) class TestUvicornIntrospection: """Tests for uvicorn server introspection bypass when auto-drain is disabled.""" @pytest.mark.asyncio async def test_uvicorn_should_exit_ignored_when_disabled(self): """ Test that uvicorn's should_exit flag is ignored when automatic draining is disabled. The _shutdown_watcher checks uvicorn_server.should_exit as a fallback (Issue #132 fix), but this check should be bypassed when the user has disabled automatic draining. """ from unittest.mock import MagicMock, patch # Create a mock uvicorn server with should_exit=True mock_server = MagicMock() mock_server.should_exit = True # IMPORTANT: Disable automatic draining BEFORE starting the watcher # In production, users call this at app startup, before any SSE connections AppStatus.disable_automatic_graceful_drain() # Mock _get_uvicorn_server to return our mock with patch("sse_starlette.sse._get_uvicorn_server", return_value=mock_server): task_exited = asyncio.Event() async def wait_for_exit(): await EventSourceResponse._listen_for_exit_signal() task_exited.set() task = asyncio.create_task(wait_for_exit()) await asyncio.sleep(0.1) # Let task start and watcher begin # Wait beyond the watcher poll interval (0.5s) # If the uvicorn check weren't bypassed, task would wake up await asyncio.sleep(1.0) assert not task_exited.is_set(), "Task woke up from uvicorn.should_exit despite auto-drain being disabled." # Now manually signal shutdown AppStatus.should_exit = True # Wait for watcher to pick up manual signal try: await asyncio.wait_for(task_exited.wait(), timeout=1.0) except asyncio.TimeoutError: task.cancel() try: await task except asyncio.CancelledError: pass pytest.fail( "Task did not wake up after manual AppStatus.should_exit = True" ) python-sse-starlette-3.2.0/tests/__init__.py0000664000175000017500000000002015132704747020771 0ustar carstencarsten# Tests package python-sse-starlette-3.2.0/tests/test_sse.py0000664000175000017500000002671015132704747021101 0ustar carstencarstenimport asyncio import logging import math from functools import partial import anyio import anyio.lowlevel import pytest from starlette.background import BackgroundTask from starlette.testclient import TestClient from sse_starlette.sse import EventSourceResponse from sse_starlette.sse import SendTimeoutError from tests.anyio_compat import collapse_excgroups _log = logging.getLogger(__name__) # Test fixtures and helpers @pytest.fixture def mock_generator(): async def numbers(minimum, maximum): for i in range(minimum, maximum + 1): await asyncio.sleep(0.1) yield i return numbers @pytest.fixture def mock_memory_channels(): async def setup(): send_chan, recv_chan = anyio.create_memory_object_stream(math.inf) return send_chan, recv_chan return setup class TestEventSourceResponse: @pytest.mark.parametrize( "input_type,separator,expected_output", [ ("integer", "\r\n", b"data: 1\r\n\r\n"), ("dict_simple", "\r\n", b"data: 1\r\n\r\n"), ("dict_with_event", "\r\n", b"event: message\r\ndata: 1\r\n\r\n"), ("dict_with_event", "\r", b"event: message\rdata: 1\r\r"), ], ) async def test_response_send_whenValidInput_thenGeneratesExpectedOutput( self, mock_generator, input_type, separator, expected_output, ): # Arrange async def app(scope, receive, send): async def format_output(value): if input_type == "integer": return value elif input_type == "dict_simple": return dict(data=value) else: return dict(data=value, event="message") async def generate(): generator = mock_generator(1, 5) async for value in generator: yield await format_output(value) response = EventSourceResponse(generate(), ping=0.2, sep=separator) await response(scope, receive, send) # Act client = TestClient(app) response = client.get("/") # Assert assert expected_output in response.content assert response.content.decode().count("ping") == 2 @pytest.mark.parametrize( "producer_output,expected_sse_response", [ # Test raw integers being converted to SSE format ("raw_integer", b"data: 1\r\n\r\n"), # Test dict with just data field ("simple_dict", b"data: 1\r\n\r\n"), # Test dict with both event and data fields ("event_dict", b"event: message\r\ndata: 1\r\n\r\n"), ], ) def test_eventSourceResponse_whenUsingMemoryChannel_thenHandlesAsyncQueueCorrectly( self, producer_output, expected_sse_response ): """Tests that EventSourceResponse can properly consume data from an async memory channel. This test verifies the producer-consumer pattern where: 1. Producer (stream_numbers) puts data into a memory channel 2. Consumer (EventSourceResponse) reads from that channel and formats as SSE This differs from direct generator tests by: - Using separate producer/consumer components - Testing async queue-based communication - Verifying SSE works with buffered async data sources """ # Arrange async def app(scope, receive, send): # Create bounded memory channel for producer-consumer communication send_chan, recv_chan = anyio.create_memory_object_stream( max_buffer_size=math.inf ) # Producer function that writes to the channel async def stream_numbers(producer_channel, start, end): async with producer_channel: for i in range(start, end + 1): await anyio.sleep(0.1) # Simulate async data production # Format data based on test case if producer_output == "raw_integer": data = i elif producer_output == "simple_dict": data = dict(data=i) else: # event_dict data = dict(data=i, event="message") # Send to channel for consumption await producer_channel.send(data) # Create SSE response that consumes from channel response = EventSourceResponse( recv_chan, # Consumer reads from receive channel data_sender_callable=partial( stream_numbers, send_chan, 1, 5 ), # Producer writes to send channel ping=0.2, ) await response(scope, receive, send) # Act client = TestClient(app) response = client.get("/") # Assert assert response.content.decode().count("ping") == 2 assert expected_sse_response in response.content @pytest.mark.anyio async def test_disconnect_whenClientDisconnects_thenHandlesGracefully( self, httpx_client, caplog ): # Arrange caplog.set_level(logging.DEBUG) # Act & Assert with pytest.raises(TimeoutError): with anyio.fail_after(1) as scope: try: async with anyio.create_task_group() as tg: # https://www.python-httpx.org/async/#streaming-responses tg.start_soon(httpx_client.get, "/endless") finally: assert scope.cancel_called is True assert "chunk: b'data: 4\\r\\n\\r\\n'" in caplog.text assert "Disconnected from client" in caplog.text @pytest.mark.anyio async def test_send_whenTimeoutOccurs_thenRaisesSendTimeoutError(self): # Arrange # Send timeout is set to 0.5s, but `send` will take 1s. Expect SendTimeoutError. cleanup_executed = False async def event_publisher(): try: yield {"event": "test", "data": "data"} pytest.fail("Should not reach this point") finally: nonlocal cleanup_executed cleanup_executed = True async def mock_send(*args, **kwargs): await anyio.sleep(1.0) async def mock_receive(): await anyio.lowlevel.checkpoint() return {"type": "message"} response = EventSourceResponse(event_publisher(), send_timeout=0.5) # Act & Assert with pytest.raises(SendTimeoutError): with collapse_excgroups(): await response({}, mock_receive, mock_send) assert cleanup_executed, "Cleanup should be executed on timeout" def test_headers_whenCustomHeadersProvided_thenMergesCorrectly(self): # Arrange custom_headers = { "cache-control": "no-cache", "x-accel-buffering": "yes", # Should not override "connection": "close", # Should not override "x-custom-header": "custom-value", } # Act response = EventSourceResponse(range(1, 5), headers=custom_headers, ping=0.2) headers = dict((h.decode(), v.decode()) for h, v in response.raw_headers) # Assert assert headers["cache-control"] == "no-cache" assert headers["x-accel-buffering"] == "no" # Should keep default assert headers["connection"] == "keep-alive" # Should keep default assert headers["x-custom-header"] == "custom-value" assert headers["content-type"] == "text/event-stream; charset=utf-8" def test_headers_whenCreated_thenHasCorrectCharset(self, mock_generator): # Arrange generator = mock_generator(1, 5) # Act response = EventSourceResponse(generator, ping=0.2) content_type_headers = [ (h.decode(), v.decode()) for h, v in response.raw_headers if h.decode() == "content-type" ] # Assert assert len(content_type_headers) == 1 header_name, header_value = content_type_headers[0] assert header_value == "text/event-stream; charset=utf-8" @pytest.mark.anyio async def test_ping_whenConcurrentWithEvents_thenRespectsLocking(self): # Sequencing here is as follows to reproduce race condition: # t=0.5s - event_publisher sends the first response item, # claiming the lock and going to sleep for 1 second so until t=1.5s. # t=1.0s - ping task wakes up and tries to call send while we know # that event_publisher is still blocked inside it and holding the lock # Arrange lock = anyio.Lock() async def event_publisher(): for i in range(2): await anyio.sleep(0.5) yield i async def send(*args, **kwargs): # Raises WouldBlock if called while someone else already holds the lock lock.acquire_nowait() await anyio.sleep(1.0) lock.release() async def receive(): await anyio.lowlevel.checkpoint() return {"type": "message"} response = EventSourceResponse(event_publisher(), ping=1) # Act & Assert with pytest.raises(anyio.WouldBlock): with collapse_excgroups(): await response({}, receive, send) def test_pingInterval_whenCreated_thenUsesDefaultValue(self): # Arrange & Act response = EventSourceResponse(0) # Assert assert response.ping_interval == response.DEFAULT_PING_INTERVAL def test_pingInterval_whenValidValueSet_thenUpdatesInterval(self): # Arrange response = EventSourceResponse(0) new_interval = 25 # Act response.ping_interval = new_interval # Assert assert response.ping_interval == new_interval def test_pingInterval_whenStringProvided_thenRaisesTypeError(self): # Arrange response = EventSourceResponse(0) invalid_interval = "ten" # Act & Assert with pytest.raises(TypeError, match="ping interval must be int"): response.ping_interval = invalid_interval def test_pingInterval_whenNegativeValue_thenRaisesValueError(self): # Arrange response = EventSourceResponse(0) negative_interval = -42 # Act & Assert with pytest.raises(ValueError, match="ping interval must be greater than 0"): response.ping_interval = negative_interval def test_compression_whenEnabled_thenRaisesNotImplemented(self): # Arrange response = EventSourceResponse(range(1, 5)) # Act & Assert with pytest.raises(NotImplementedError): response.enable_compression() @pytest.mark.anyio async def test_backgroundTask_whenProvided_thenExecutesAfterResponse(self): # Arrange task_executed = False async def background_task(): nonlocal task_executed task_executed = True async def mock_send(*args, **kwargs): pass async def mock_receive(): await anyio.lowlevel.checkpoint() return {"type": "http.disconnect"} response = EventSourceResponse([], background=BackgroundTask(background_task)) # Act await response({}, mock_receive, mock_send) # Assert assert task_executed, "Background task should be executed" python-sse-starlette-3.2.0/tests/experimentation/0000775000175000017500000000000015132704747022103 5ustar carstencarstenpython-sse-starlette-3.2.0/tests/experimentation/test_multiple_consumers_asyncio.py0000664000175000017500000001675315132704747031206 0ustar carstencarstenimport asyncio import logging from contextlib import asynccontextmanager from typing import AsyncIterator, List import pytest import httpx import uvicorn from async_timeout import timeout import portend from tenacity import retry, stop_after_attempt, wait_exponential logger = logging.getLogger(__name__) class ServerManager: """Manages the lifecycle of a test server instance""" def __init__(self, app_path: str, host: str = "localhost", port: int = None): self.app_path = app_path self.host = host self.port = port or portend.find_available_local_port() self.server = None self._startup_complete = asyncio.Event() self._shutdown_complete = asyncio.Event() async def startup(self) -> None: """Start the server in a separate task""" config = uvicorn.Config( app=self.app_path, host=self.host, port=self.port, log_level="error", loop="asyncio", ) self.server = uvicorn.Server(config=config) # Store the original startup handler original_startup = self.server.startup # Create a wrapper that preserves the original signature async def startup_wrapper(*args, **kwargs): await original_startup(*args, **kwargs) self._startup_complete.set() self.server.startup = startup_wrapper # Start the server self._server_task = asyncio.create_task(self.server.serve()) try: async with timeout(10): # 10 second timeout for startup await self._startup_complete.wait() # Additional health check retry_count = 0 while retry_count < 5: # Try 5 times with exponential backoff if await self.health_check(): break retry_count += 1 await asyncio.sleep(0.2 * (2**retry_count)) else: raise RuntimeError("Server health check failed after retries") except Exception as e: # If startup fails, ensure we clean up await self.shutdown() if isinstance(e, asyncio.TimeoutError): raise RuntimeError("Server failed to start within timeout") from e raise async def shutdown(self) -> None: """Shutdown the server gracefully""" if self.server and not self._shutdown_complete.is_set(): try: self.server.should_exit = True if hasattr(self, "_server_task"): try: async with timeout(5): # 5 second timeout for shutdown await self._server_task except asyncio.TimeoutError: # Force cancel if graceful shutdown fails self._server_task.cancel() try: await self._server_task except asyncio.CancelledError: pass finally: self._shutdown_complete.set() self.server = None self._startup_complete.clear() @property def url(self) -> str: return f"http://{self.host}:{self.port}" async def health_check(self) -> bool: """Check if server is responding""" try: async with httpx.AsyncClient() as client: async with timeout(1): # 1 second timeout for health check response = await client.get(f"{self.url}/health") return response.status_code == 200 except Exception: return False @asynccontextmanager async def server_context(app_path: str) -> AsyncIterator[ServerManager]: """Context manager for server lifecycle""" server = ServerManager(app_path) try: await server.startup() yield server finally: await server.shutdown() class SSEClient: """Client for consuming SSE streams""" def __init__(self, url: str, expected_lines: int): self.url = url self.expected_lines = expected_lines self.received_lines = 0 self.errors: List[Exception] = [] @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10) ) async def connect_and_consume(self) -> None: """Connect to SSE stream and consume messages""" try: async with httpx.AsyncClient() as client: async with timeout(20): # 20 second timeout for stream consumption async with client.stream("GET", self.url) as response: async for line in response.aiter_lines(): if line.strip(): # Only count non-empty lines self.received_lines += 1 if self.received_lines >= self.expected_lines: break except Exception as e: self.errors.append(e) raise @pytest.mark.asyncio @pytest.mark.experimentation @pytest.mark.parametrize( "app_path,expected_lines", [ ("tests.integration.main_endless:app", 14), ("tests.integration.main_endless_conditional:app", 2), ], ) async def test_sse_multiple_consumers( app_path: str, expected_lines: int, num_consumers: int = 3 ): """Test multiple consumers connecting to SSE endpoint""" async with server_context(app_path) as server: # Create and start consumers clients = [ SSEClient(f"{server.url}/endless", expected_lines) for _ in range(num_consumers) ] # Run consumers concurrently with timeout async with timeout(30): # 30 second timeout for entire test try: # Create tasks for all consumers consumer_tasks = [ asyncio.create_task(client.connect_and_consume()) for client in clients ] # Wait for all consumers or first error done, pending = await asyncio.wait( consumer_tasks, return_when=asyncio.FIRST_EXCEPTION ) # Cancel any pending tasks for task in pending: task.cancel() try: await task except asyncio.CancelledError: pass # Check results and gather errors errors = [] for task in done: try: await task except Exception as e: errors.append(e) # Verify expectations for i, client in enumerate(clients): assert ( client.received_lines == expected_lines ), f"Client {i} received {client.received_lines} lines, expected {expected_lines}" assert not errors, f"Consumers encountered errors: {errors}" except asyncio.TimeoutError: raise RuntimeError("Test timed out waiting for consumers") finally: # Ensure all tasks are properly cleaned up for task in consumer_tasks: if not task.done(): task.cancel() try: await task except asyncio.CancelledError: pass python-sse-starlette-3.2.0/tests/experimentation/test_multiple_consumers_threads.py0000664000175000017500000001555015132704747031165 0ustar carstencarstenimport asyncio import logging import os import subprocess import threading import time from functools import partial from pathlib import Path import httpcore import httpx import psutil import pytest import requests _log = logging.getLogger(__name__) ROOT_PATH = Path(__file__).parent.parent.parent URL = "http://localhost" PORT = 8001 LOG_LEVEL = "info" SERVER_READY_TIMEOUT = 5 # Max seconds to wait for the server to be ready server_process = None # Global variable to hold the server process server_ready_event = threading.Event() # Event to signal when the server is ready def check_server_is_ready(port: int): """Check if the server is ready by making a GET request to the URL.""" for _ in range(SERVER_READY_TIMEOUT): try: response = requests.get(f"{URL}:{port}/health") if response.status_code == 200: _log.info("Server is ready.") return True except requests.ConnectionError: _log.debug("Server not ready yet...") time.sleep(1) return False def get_available_port() -> int: import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(("", 0)) return s.getsockname()[1] def run_server(server_command: str, port: int): global server_process env = os.environ.copy() env["PYTHONPATH"] = str(ROOT_PATH) # Set PYTHONPATH to include the project root server_process = subprocess.Popen( server_command, shell=True, cwd=ROOT_PATH, env=env ) if check_server_is_ready(port): server_ready_event.set() # Signal that the server is ready else: _log.debug("Server did not become ready in time, terminating server process.") terminate_server() server_ready_event.set() # allow pytest to fail after passing the Event barrier raise Exception("Server did not become ready in time.") def terminate_server(): if server_process: try: _log.debug("Attempting to terminate the server process.") assert isinstance(server_process, subprocess.Popen) # please mypy parent = psutil.Process(server_process.pid) for child in parent.children(recursive=True): child.terminate() parent.terminate() try: # fix uvicorn breaking change: https://github.com/encode/uvicorn/compare/0.28.1...0.29.0 parent.wait(timeout=1) except psutil.TimeoutExpired: _log.info( "Server process did not terminate after 1 second, killing it." ) parent.kill() parent.wait() server_process.wait() _log.debug("Server process terminated.") except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): _log.warning("Server process could not be terminated.") except subprocess.TimeoutExpired: _log.warning( "Timeout waiting for server process to terminate. Forcing kill." ) server_process.kill() # Force kill if not terminated after timeout server_process.wait() # Wait for the kill to take effect finally: server_ready_event.clear() async def make_arequest(url, expected_lines=2): """Simulate Client: Stream the SSE endpoint, and count the number of lines received. """ _log.info(f"{threading.current_thread().ident}: Starting making requests to {url=}") i = 0 async with httpx.AsyncClient() as client: try: # stream client for line-by-line output async with client.stream("GET", url) as response: async for line in response.aiter_lines(): print( f"{threading.current_thread().ident}: Streaming response {i=}, {line=}" ) i += 1 except httpx.RemoteProtocolError as e: _log.error(e) except httpcore.RemoteProtocolError as e: _log.error(e) finally: assert ( i == expected_lines ), ( f"Expected {expected_lines} lines" ) # not part of test runner, failure is not reported _log.info( f"{threading.current_thread().ident}: Stopping making requests to {url=}, finished after {i=} responses." ) # expected output lines: # i=0, line='data: 1' # i=1, line='' # ... assert ( i == expected_lines ), ( f"Expected {expected_lines} lines" ) # not part of test runner, failure is not reported @pytest.mark.skipif(os.name == "nt", reason="Skip on Windows") @pytest.mark.experimentation @pytest.mark.parametrize( ("server_command", "expected_lines"), [ ( "uvicorn tests.integration.main_endless:app --host localhost --port {port} --log-level {log_level}", 14, ), ( "uvicorn tests.integration.main_endless_conditional:app --host localhost --port {port} --log-level {log_level}", 2, ), ], ) def test_stop_server_with_many_consumers(caplog, server_command, expected_lines): # Given caplog.set_level(logging.DEBUG) N_CONSUMER = 3 port = get_available_port() # Start server server_command = server_command.format(port=port, log_level=LOG_LEVEL) _log.info(f"Starting server with command: {server_command}") server_to_run = partial(run_server, server_command, port) server_thread = threading.Thread(target=server_to_run) server_thread.start() server_ready_event.wait() # Wait for the server to become ready if server_process is None or server_process.poll() is not None: pytest.fail("Server did not start.") # Initialize threads threads = [] for _ in range(N_CONSUMER): thread = threading.Thread( target=lambda: asyncio.run( make_arequest(f"{URL}:{port}/endless", expected_lines=expected_lines) ) ) threads.append(thread) for thread in threads: thread.start() # Wait and then stop server time.sleep(1) # Simulate some operation time # When: the server is stopped unexpectedly terminate_server() # Wait for all threads to finish for thread in threads: thread.join() server_thread.join() # Ensure server thread is cleaned up # Then: Consumers report errors time.sleep(0.5) errors = [r.message for r in caplog.records if r.levelname == "ERROR"] assert len(errors) == N_CONSUMER, f"Expected {N_CONSUMER} errors, got {len(errors)}" # consumers: 'peer closed connection without sending complete message body (incomplete chunked read)' assert ( "peer closed connection without sending complete message body (incomplete chunked read)" in errors ) time.sleep(0.2) python-sse-starlette-3.2.0/tests/experimentation/container.py0000664000175000017500000000257715132704747024452 0ustar carstencarstenfrom time import sleep from testcontainers.core.container import DockerContainer from testcontainers.core.wait_strategies import LogMessageWaitStrategy # Define a simple container class BasicContainer(DockerContainer): def __init__(self): # super().__init__("python:3.12-slim") super().__init__("sse_starlette:latest") self.app_path = "tests.integration.main_endless:app" self.with_volume_mapping( host="/Users/Q187392/dev/s/public/sse-starlette", container="/app" ) self.with_name("sse_starlette") self.with_exposed_ports(8000) # Set a basic command to keep the container running # self.with_command("tail -f /dev/null") self.with_command( f"uvicorn {self.app_path} --host 0.0.0.0 --port 8000 --log-level debug" ) # Wait for server to be ready (applied during start()) self.waiting_for(LogMessageWaitStrategy("Application startup complete")) if __name__ == "__main__": # Start the container container = BasicContainer() with container: print(f"Container is running. ID: {container._container.id}") print( f"Exec into the container using: docker exec -it {container._container.id} sh" ) print(f"http://localhost:{container.get_exposed_port(8000)}/endless") sleep(100000) # Keep the container running python-sse-starlette-3.2.0/tests/test_event.py0000664000175000017500000000741415132704747021430 0ustar carstencarstenimport pytest from sse_starlette.event import ServerSentEvent, JSONServerSentEvent, ensure_bytes @pytest.mark.parametrize( "input, expected", [ ("foo", b"data: foo\r\n\r\n"), (dict(data="foo", event="bar"), b"event: bar\r\ndata: foo\r\n\r\n"), ( dict(data="foo", event="bar", id="xyz"), b"id: xyz\r\nevent: bar\r\ndata: foo\r\n\r\n", ), ( dict(data="foo", event="bar", id="xyz", retry=1), b"id: xyz\r\nevent: bar\r\ndata: foo\r\nretry: 1\r\n\r\n", ), ( dict(data="foo", event="bar", id="xyz", retry=1, sep="\n"), b"id: xyz\nevent: bar\ndata: foo\nretry: 1\n\n", ), ( dict(comment="a comment"), b": a comment\r\n\r\n", ), ( dict(data="foo", comment="a comment"), b": a comment\r\ndata: foo\r\n\r\n", ), ], ) def test_server_sent_event(input, expected): print(input, expected) if isinstance(input, str): assert ServerSentEvent(input).encode() == expected else: assert ServerSentEvent(**input).encode() == expected @pytest.mark.parametrize( "input, expected", [ (dict(data={"foo": "bar"}), b'data: {"foo":"bar"}\r\n\r\n'), ( dict(data={"foo": "bar"}, event="baz"), b'event: baz\r\ndata: {"foo":"bar"}\r\n\r\n', ), ( dict(data={"foo": "bar"}, event="baz", id="xyz"), b'id: xyz\r\nevent: baz\r\ndata: {"foo":"bar"}\r\n\r\n', ), ( dict(data={"foo": "bar"}, event="baz", id="xyz", retry=1), b'id: xyz\r\nevent: baz\r\ndata: {"foo":"bar"}\r\nretry: 1\r\n\r\n', ), ( dict(comment="a comment"), b": a comment\r\n\r\n", ), ( dict(data={"foo": "bar"}, comment="a comment"), b': a comment\r\ndata: {"foo":"bar"}\r\n\r\n', ), ], ) def test_json_server_sent_event(input, expected): assert JSONServerSentEvent(**input).encode() == expected @pytest.mark.parametrize( "input, expected", [ (b"data: foo\r\n\r\n", b"data: foo\r\n\r\n"), ("foo", b"data: foo\n\n"), (dict(data="foo", event="bar"), b"event: bar\ndata: foo\n\n"), ], ) def test_ensure_bytes(input, expected): assert ensure_bytes(input, sep="\n") == expected @pytest.mark.parametrize( "stream_sep,line_sep", [ ("\n", "\n"), ("\n", "\r"), ("\n", "\r\n"), ("\r", "\n"), ("\r", "\r"), ("\r", "\r\n"), ("\r\n", "\n"), ("\r\n", "\r"), ("\r\n", "\r\n"), ], ids=( "stream-LF:line-LF", "stream-LF:line-CR", "stream-LF:line-CR+LF", "stream-CR:line-LF", "stream-CR:line-CR", "stream-CR:line-CR+LF", "stream-CR+LF:line-LF", "stream-CR+LF:line-CR", "stream-CR+LF:line-CR+LF", ), ) def test_multiline_data(stream_sep, line_sep): lines = line_sep.join(["foo", "bar", "xyz"]) result = ServerSentEvent(lines, event="event", sep=stream_sep).encode() assert ( result == "event: event{0}data: foo{0}data: bar{0}data: xyz{0}{0}".format( stream_sep ).encode() ) @pytest.mark.parametrize("sep", ["\n", "\r", "\r\n"], ids=("LF", "CR", "CR+LF")) def test_custom_sep(sep): result = ServerSentEvent("foo", event="event", sep=sep).encode() assert result == "event: event{0}data: foo{0}{0}".format(sep).encode() def test_retry_is_int(): response = ServerSentEvent(0, retry=1) assert response.retry == 1 with pytest.raises(TypeError) as ctx: _ = ServerSentEvent(0, retry="ten").encode() # type: ignore assert str(ctx.value) == "retry argument must be int" python-sse-starlette-3.2.0/tests/integration/0000775000175000017500000000000015132704747021213 5ustar carstencarstenpython-sse-starlette-3.2.0/tests/integration/main_endless.py0000664000175000017500000000243415132704747024231 0ustar carstencarsten# main.py import asyncio import logging from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import JSONResponse from starlette.routing import Route from sse_starlette import EventSourceResponse _log = logging.getLogger(__name__) async def endless(req: Request): """Simulates an endless stream, events sent every 0.3 seconds""" async def event_publisher(): i = 0 try: while True: # i <= 20: # yield dict(id=..., event=..., data=...) i += 1 # print(f"Sending {i}") yield dict(data=i) await asyncio.sleep(0.3) except asyncio.CancelledError as e: _log.info( f"Disconnected from client (via refresh/close) {req.client} after {i} events" ) # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) async def healthcheck(req: Request): return JSONResponse({"status": "ok"}) app = Starlette( routes=[ Route("/endless", endpoint=endless), Route("/health", endpoint=healthcheck), ], ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8001, log_level="trace") python-sse-starlette-3.2.0/tests/integration/README.md0000664000175000017500000000162015132704747022471 0ustar carstencarsten# Todo: rework this file, it is not up to date # Smoke and Integration tests ## Test for lost client connection: 1. start example.py with log_level='trace' 2. curl http://localhost:8000/endless 3. kill curl ### expected outcome: all streaming stops, including pings (log output) ## Test for uvicorn shutdown (Ctrl-C) with long running task and multiple clients: - see also: `test_multiple_consumers.py` 1. start example.py with log_level='trace' 2. curl http://localhost:8000/endless from multiple clients/terminals 3. CTRL-C: stop server ### expected outcome: 1. server shut down gracefully, no pending tasks 2. all clients stop (transfer closed with outstanding read data remaining) ## Test for stream_generator.py 1. start stream_generator.py with log_level='trace' 2. Run http calls in integration_testing.http ### expected outcome: 1. every post from one client should be seen on consuming client python-sse-starlette-3.2.0/tests/integration/main_endless_conditional.py0000664000175000017500000000424115132704747026612 0ustar carstencarsten# main.py import asyncio import logging import uvicorn from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import JSONResponse from starlette.routing import Route from sse_starlette import EventSourceResponse """ example by: justindujardin 4efaffc2365a85f132ab8fc405110120c9c9e36a, https://github.com/sysid/sse-starlette/pull/13 tests proper shutdown in case no messages are yielded: - in a streaming endpoint that reports only on "new" data, it is possible to get into a state where no no yields are expected to happen in the near future. e.g. there are no new chat messages to emit. - add a third task to taskgroup that checks the uvicorn exit status at a regular interval. """ _log = logging.getLogger(__name__) async def endless(req: Request): """Simulates an endless stream but only yields one item In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. (deadlock) """ async def event_publisher(): has_data = True # The event publisher only conditionally emits items try: while True: disconnected = await req.is_disconnected() if disconnected: _log.info(f"Disconnecting client {req.client}") break # Simulate only sending one response if has_data: yield dict(data="u can haz the data") has_data = False await asyncio.sleep(0.9) except asyncio.CancelledError as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) async def healthcheck(req: Request): return JSONResponse({"status": "ok"}) app = Starlette( routes=[ Route("/endless", endpoint=endless), Route("/health", endpoint=healthcheck), ], ) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="trace") python-sse-starlette-3.2.0/tests/integration/test_multiple_consumers.py0000664000175000017500000000740615132704747026564 0ustar carstencarstenimport asyncio import logging import httpx import pytest from testcontainers.core.container import DockerContainer from testcontainers.core.wait_strategies import LogMessageWaitStrategy _log = logging.getLogger(__name__) class SSEServerContainer(DockerContainer): def __init__(self, app_path: str): super().__init__("sse_starlette:latest") self.app_path = app_path # Specify platform for amd64 image on arm64 hosts self.with_kwargs(platform="linux/amd64") # Mount the current directory into the container import os project_root = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) self.with_volume_mapping(host=project_root, container="/app") self.with_name("sse_starlette_test") self.with_command( f"uvicorn {self.app_path} --host 0.0.0.0 --port 8000 --log-level info" ) # Expose the port self.with_exposed_ports(8000) # Wait for server to be ready (applied during start()) self.waiting_for(LogMessageWaitStrategy("Application startup complete")) async def consume_events(url: str, expected_lines: int = 2): """Simulate Client: Stream the SSE endpoint and count received lines.""" i = 0 async with httpx.AsyncClient() as client: try: async with client.stream("GET", url) as response: async for line in response.aiter_lines(): if line.strip(): _log.info(f"Received line: {line}") i += 1 except (httpx.RemoteProtocolError, httpx.ReadError) as e: _log.error(f"Error during streaming: {str(e)}") return i, str(e) return i, None @pytest.mark.integration @pytest.mark.parametrize( ("app_path", "expected_lines"), [ ("tests.integration.main_endless:app", 14), ("tests.integration.main_endless_conditional:app", 2), ], ) async def test_sse_server_termination(caplog, app_path, expected_lines): caplog.set_level(logging.DEBUG) N_CONSUMERS = 3 # Start server in container container = SSEServerContainer(app_path) container.start() try: port = container.get_exposed_port(8000) url = f"http://localhost:{port}/endless" # Create background tasks for consumers tasks = [ asyncio.create_task(consume_events(url, expected_lines)) for _ in range(N_CONSUMERS) ] # Wait a bit then kill the server await asyncio.sleep(1) container.stop(force=True) # Now wait for all tasks to complete results = await asyncio.gather(*tasks) # Check error count: one connection error per client error_count = sum(1 for _, error in results if error is not None) assert ( error_count == N_CONSUMERS ), f"Expected {N_CONSUMERS} errors, got {error_count}" # Verify error messages for _, error in results: assert ( error and "peer closed connection without sending complete message body (incomplete chunked read)" in error.lower() ), "Expected peer closed connection error" # Check message counts message_counts = [count for count, _ in results] _log.info(f"Message counts received: {message_counts}") # Since we're killing the server early, we expect incomplete message counts assert all( count < expected_lines for count in message_counts ), f"Expected all counts to be less than {expected_lines}, got {message_counts}" finally: # Cleanup container if it's still around try: container.stop(force=True) except Exception as e: _log.debug(f"Error during cleanup: {e}") python-sse-starlette-3.2.0/tests/test_issue152.py0000664000175000017500000001631115132704747021663 0ustar carstencarsten""" Regression tests for Issue #152: Watcher Task Leak. Bug: ContextVar creates isolated state per async context, so each SSE connection (running in fresh ASGI context) spawns its own _shutdown_watcher. N connections = N watchers = CPU exhaustion over time. Fix: Use threading.local() for per-thread state, so all connections in the same thread share one watcher. See: thoughts/issue152-watcher-leak-analysis.md """ import asyncio import anyio import pytest # Watcher polls every 0.5s, so we need >0.5s for it to detect shutdown. # Add margin for test system load variance. WATCHER_POLL_INTERVAL = 0.5 WATCHER_DETECT_TIMEOUT = WATCHER_POLL_INTERVAL + 0.2 # 0.7s class TestIssue152WatcherLeak: """Regression tests for Issue #152: only one watcher per thread.""" @pytest.mark.asyncio async def test_single_watcher_per_thread(self): """ Issue #152 regression: Only one watcher should be started per thread. In real ASGI apps: - Each request runs in the SAME thread (threading.local is shared) - Each request runs in a NEW async context (ContextVar is isolated) With threading.local (fixed): state persists → 1 watcher per thread With ContextVar (bug): state isolated per context → N watchers """ import sse_starlette.sse as sse_module from sse_starlette.sse import _ensure_watcher_started_on_this_loop watcher_starts = [] original_watcher = sse_module._shutdown_watcher async def tracking_watcher(): """Track when watcher is started, exit immediately.""" watcher_starts.append(True) # Don't run the actual polling loop sse_module._shutdown_watcher = tracking_watcher try: num_connections = 10 # Simulate 10 SSE connections in the same thread # With threading.local: state persists, so only 1 watcher # DON'T reset between calls - this simulates real ASGI behavior for _ in range(num_connections): _ensure_watcher_started_on_this_loop() await asyncio.sleep(0.1) assert len(watcher_starts) == 1, ( f"Issue #152: {len(watcher_starts)} watchers started for " f"{num_connections} connections. Expected 1 shared watcher." ) finally: sse_module._shutdown_watcher = original_watcher @pytest.mark.asyncio async def test_watcher_broadcasts_to_all_events(self): """Verify that one watcher can signal multiple events. This test also serves as coverage for test_issue132.py's broadcast test. """ import sse_starlette.sse as sse_module from sse_starlette.sse import ( _ensure_watcher_started_on_this_loop, _get_shutdown_state, ) # Start watcher (state reset by conftest fixture) _ensure_watcher_started_on_this_loop() # Create multiple events (simulating multiple SSE connections) state = _get_shutdown_state() events = [anyio.Event() for _ in range(5)] for event in events: state.events.add(event) try: # Trigger shutdown sse_module.AppStatus.should_exit = True # Wait for watcher to broadcast await asyncio.sleep(WATCHER_DETECT_TIMEOUT) # All events should be set for i, event in enumerate(events): assert event.is_set(), f"Event {i} was not signaled by watcher" finally: for event in events: state.events.discard(event) @pytest.mark.asyncio async def test_rapid_ensure_calls_spawn_single_watcher(self): """Multiple rapid calls to _ensure_watcher_started don't spawn multiple watchers.""" import sse_starlette.sse as sse_module from sse_starlette.sse import _ensure_watcher_started_on_this_loop watcher_starts = [] original_watcher = sse_module._shutdown_watcher async def tracking_watcher(): watcher_starts.append(True) sse_module._shutdown_watcher = tracking_watcher try: # Rapid-fire 100 calls for _ in range(100): _ensure_watcher_started_on_this_loop() await asyncio.sleep(0.1) assert ( len(watcher_starts) == 1 ), f"Rapid calls spawned {len(watcher_starts)} watchers, expected 1" finally: sse_module._shutdown_watcher = original_watcher @pytest.mark.asyncio async def test_event_removal_during_broadcast_is_safe(self): """Removing an event from the set during broadcast doesn't crash. The watcher iterates over list(state.events) to avoid mutation issues. """ import sse_starlette.sse as sse_module from sse_starlette.sse import ( _ensure_watcher_started_on_this_loop, _get_shutdown_state, ) _ensure_watcher_started_on_this_loop() state = _get_shutdown_state() events = [anyio.Event() for _ in range(3)] for event in events: state.events.add(event) # Remove one event before shutdown triggers broadcast state.events.discard(events[1]) # Trigger shutdown - should not crash even though set was modified sse_module.AppStatus.should_exit = True await asyncio.sleep(WATCHER_DETECT_TIMEOUT) # Remaining events should be signaled assert events[0].is_set(), "Event 0 should be set" assert events[2].is_set(), "Event 2 should be set" @pytest.mark.asyncio async def test_watcher_cleanup_allows_restart(self): """After watcher exits, a new connection can start a new watcher. The watcher's finally block resets watcher_started=False. """ import sse_starlette.sse as sse_module from sse_starlette.sse import ( _ensure_watcher_started_on_this_loop, _get_shutdown_state, ) watcher_starts = [] original_watcher = sse_module._shutdown_watcher async def tracking_watcher(): watcher_starts.append(True) state = _get_shutdown_state() try: while not sse_module.AppStatus.should_exit: await asyncio.sleep(0.1) finally: state.watcher_started = False sse_module._shutdown_watcher = tracking_watcher try: # First watcher _ensure_watcher_started_on_this_loop() await asyncio.sleep(0.05) assert len(watcher_starts) == 1 # Trigger shutdown to exit first watcher sse_module.AppStatus.should_exit = True await asyncio.sleep(0.15) # Wait for watcher to exit # Reset for second round sse_module.AppStatus.should_exit = False # Second watcher should be allowed to start _ensure_watcher_started_on_this_loop() await asyncio.sleep(0.05) assert len(watcher_starts) == 2, ( f"Expected watcher to restart after cleanup (2 sequential spawns), " f"got {len(watcher_starts)}" ) finally: sse_module._shutdown_watcher = original_watcher python-sse-starlette-3.2.0/tests/conftest.py0000664000175000017500000000630415132704747021072 0ustar carstencarstenimport asyncio import logging from contextlib import asynccontextmanager import httpx import pytest from asgi_lifespan import LifespanManager from httpx import ASGITransport from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import PlainTextResponse from starlette.routing import Route from starlette.testclient import TestClient from sse_starlette import EventSourceResponse _log = logging.getLogger(__name__) log_fmt = r"%(asctime)-15s %(levelname)s %(name)s %(funcName)s:%(lineno)d %(message)s" datefmt = "%Y-%m-%d %H:%M:%S" logging.basicConfig(format=log_fmt, level=logging.DEBUG, datefmt=datefmt) logging.getLogger("httpx").setLevel(logging.INFO) logging.getLogger("httpcore").setLevel(logging.INFO) logging.getLogger("urllib3").setLevel(logging.INFO) logging.getLogger("docker").setLevel(logging.INFO) @pytest.fixture(autouse=True) def reset_shutdown_state(): """Reset shutdown state before/after each test. It ensures clean state for tests involving AppStatus and _shutdown_watcher. """ from sse_starlette.sse import AppStatus, _thread_state # Setup: clean state AppStatus.should_exit = False AppStatus.enable_automatic_graceful_drain = True if hasattr(_thread_state, "shutdown_state"): del _thread_state.shutdown_state yield # Teardown: signal shutdown to kill any running watchers, then clean up AppStatus.should_exit = True AppStatus.enable_automatic_graceful_drain = True if hasattr(_thread_state, "shutdown_state"): del _thread_state.shutdown_state @pytest.fixture def anyio_backend(): """Exclude trio from tests""" return "asyncio" @pytest.fixture async def app(): @asynccontextmanager async def lifespan(app): # Startup _log.debug("Starting up") yield # Shutdown _log.debug("Shutting down") async def home(): return PlainTextResponse("Hello, world!") async def endless(req: Request): async def event_publisher(): i = 0 try: while True: # i <= 20: # yield dict(id=..., event=..., data=...) i += 1 print(f"Sending {i}") yield dict(data=i) await asyncio.sleep(0.3) except asyncio.CancelledError as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) app = Starlette( routes=[Route("/", home), Route("/endless", endpoint=endless)], lifespan=lifespan, ) async with LifespanManager(app): _log.info("We're in!") yield app _log.info("We're out!") @pytest.fixture async def httpx_client(app): transport = ASGITransport(app=app) async with httpx.AsyncClient( transport=transport, base_url="http://localhost:8000" ) as client: _log.info("Yielding Client") yield client @pytest.fixture def client(app): with TestClient(app=app, base_url="http://localhost:8000") as client: print("Yielding Client") yield client python-sse-starlette-3.2.0/tests/anyio_compat.py0000664000175000017500000000174015132704747021726 0ustar carstencarstenimport sys from contextlib import contextmanager from typing import Generator # AnyIO v4 introduces a breaking change that groups all exceptions in a task # group into an exception group. # This file allows to be compatible with AnyIO <4 and >=4 by unwrapping groups # if they only contain a single exception. It also supports python <3.11 (before # exception groups support) and >=3.11. # Solution as proposed in https://anyio.readthedocs.io/en/stable/migration.html has_exceptiongroups = True if sys.version_info < (3, 11): try: from exceptiongroup import BaseExceptionGroup except ImportError: has_exceptiongroups = False @contextmanager def collapse_excgroups() -> Generator[None, None, None]: try: yield except BaseException as exc: if has_exceptiongroups: while isinstance(exc, BaseExceptionGroup) and len(exc.exceptions) == 1: exc = exc.exceptions[0] raise exc __all__ = ["collapse_excgroups"] python-sse-starlette-3.2.0/tests/test_issue132.py0000664000175000017500000001333715132704747021666 0ustar carstencarsten""" Tests for Issue #132: Graceful shutdown when monkey-patch fails. Issue #132: The monkey-patch of Server.handle_exit doesn't work with `uvicorn app:app` because uvicorn registers signal handlers BEFORE importing the app (uvicorn 0.29+). The fix: _shutdown_watcher() now checks both AppStatus.should_exit (monkey-patch worked) and uvicorn's Server.should_exit via signal handler introspection (monkey-patch failed). Manual Test: # Terminal 1 uvicorn examples.example:app # Terminal 2 curl http://localhost:8000/sse # Terminal 1 Ctrl+C # Should exit gracefully now """ import signal from unittest.mock import MagicMock, patch import anyio import pytest from sse_starlette.sse import ( AppStatus, _get_shutdown_state, _get_uvicorn_server, _shutdown_watcher, ) class TestUvicornServerIntrospection: """Test _get_uvicorn_server() signal handler introspection.""" def test_returns_server_when_handler_is_bound_method(self): """Should extract Server from bound method handler.""" mock_server = MagicMock() mock_server.should_exit = False with patch("sse_starlette.sse.signal.getsignal") as mock_getsignal: mock_handler = MagicMock() mock_handler.__self__ = mock_server mock_getsignal.return_value = mock_handler result = _get_uvicorn_server() assert result is mock_server def test_returns_none_when_handler_is_sig_dfl(self): """Should return None for SIG_DFL (default handler).""" with patch("sse_starlette.sse.signal.getsignal") as mock_getsignal: mock_getsignal.return_value = signal.SIG_DFL result = _get_uvicorn_server() assert result is None def test_returns_none_when_handler_is_sig_ign(self): """Should return None for SIG_IGN (ignored signal).""" with patch("sse_starlette.sse.signal.getsignal") as mock_getsignal: mock_getsignal.return_value = signal.SIG_IGN result = _get_uvicorn_server() assert result is None def test_returns_none_when_handler_lacks_self(self): """Should return None when handler is a function (not bound method).""" with patch("sse_starlette.sse.signal.getsignal") as mock_getsignal: mock_getsignal.return_value = lambda sig, frame: None result = _get_uvicorn_server() assert result is None def test_returns_none_when_self_lacks_should_exit(self): """Should return None when __self__ doesn't have should_exit attribute.""" mock_obj = MagicMock(spec=[]) # No attributes with patch("sse_starlette.sse.signal.getsignal") as mock_getsignal: mock_handler = MagicMock() mock_handler.__self__ = mock_obj mock_getsignal.return_value = mock_handler result = _get_uvicorn_server() assert result is None def test_returns_none_on_exception(self): """Should return None if introspection fails with any exception.""" with patch( "sse_starlette.sse.signal.getsignal", side_effect=Exception("test error") ): result = _get_uvicorn_server() assert result is None class TestShutdownWatcherDualSource: """Test _shutdown_watcher() detects shutdown from both sources.""" @pytest.mark.asyncio async def test_detects_appstatus_should_exit(self): """Should detect when AppStatus.should_exit is set (monkey-patch worked).""" state = _get_shutdown_state() event = anyio.Event() state.events.add(event) async def set_should_exit(): await anyio.sleep(0.1) AppStatus.should_exit = True async with anyio.create_task_group() as tg: tg.start_soon(_shutdown_watcher) tg.start_soon(set_should_exit) # Wait for event to be signaled (with timeout) with anyio.fail_after(2): await event.wait() assert AppStatus.should_exit is True @pytest.mark.asyncio async def test_detects_uvicorn_server_should_exit(self): """Should detect when uvicorn Server.should_exit is set (Issue #132).""" # Create a mock uvicorn server mock_server = MagicMock() mock_server.should_exit = False state = _get_shutdown_state() event = anyio.Event() state.events.add(event) async def set_server_should_exit(): await anyio.sleep(0.1) mock_server.should_exit = True # Patch _get_uvicorn_server to return our mock with patch("sse_starlette.sse._get_uvicorn_server", return_value=mock_server): async with anyio.create_task_group() as tg: tg.start_soon(_shutdown_watcher) tg.start_soon(set_server_should_exit) # Wait for event to be signaled (with timeout) with anyio.fail_after(2): await event.wait() # AppStatus.should_exit should be synced assert AppStatus.should_exit is True @pytest.mark.asyncio async def test_fallback_when_no_uvicorn_server(self): """Should work when _get_uvicorn_server returns None.""" state = _get_shutdown_state() event = anyio.Event() state.events.add(event) async def set_should_exit(): await anyio.sleep(0.1) AppStatus.should_exit = True # Ensure no uvicorn server is found with patch("sse_starlette.sse._get_uvicorn_server", return_value=None): async with anyio.create_task_group() as tg: tg.start_soon(_shutdown_watcher) tg.start_soon(set_should_exit) with anyio.fail_after(2): await event.wait() assert event.is_set() python-sse-starlette-3.2.0/output.png0000664000175000017500000010741615132704747017605 0ustar carstencarstenPNG  IHDRDGWBgAMA a cHRMz&u0`:pQ<bKGDIDATx}wE=)P(ذa((6EUE齗Z %~1[s sٳ;;3;wO=«9N=6 z9A@IRx `f|ɑ~ [G#s%_ɀ}CPŚoMDᐹASLMc6 C]qI]wDE]$"Skn#c-Fƌ5qGZ)%!H4t-M/%?ˆt*a)2Iu>No5#4/d `[p{~hvtğ}c^xl{'P$nrLkpmPӳXe 'rGCh.x 8#~2}1Qph"d7Nكyjް| hdEy -3&"&\IM~QΠ7azW &j((: 0OL f\i?Go[΋;M&%~yywׄ&-E70%R_-|7L?KL$8)l}zDL֍ 0MWq=MdFچ[_9Zϭ:P2O"El$oh7^MYț/zLhM)|p o(5QP#-jt3HHhdԈKu8Cj"b[(37,AɉѬ88U{Jkknp%N@^oJO~WoFDHu?us>FgV|Vg-6pj] Ѥ]}Ne‘ߢ1F.tG !6kh-C 6uSJڢf˘Yazy?"?ڡZ'I_S1 !ș 4Pp6N 6Cq(ٯAz}ic?(dގ"oGMM|6mx$پ aE:8E+[dߌ[h\c;HտtƺA (USHxF"+Z9*-˲,KZea !eBf.1uوP[LPFoM?Yq9b'Ey&?et8ƏC?pσ6&t^'D؁F֡iw)J)U(B%AJhH*69#O,kGXf" ZGdC]_!=: '!r_%R38`J7`"" Rk=dyx WkSJ;D%dVG5~z#PD$deٶ-? bBy400.rɏ>u:D)ip?nÏ,Zk ƴSV#F^G9%5+Ӥ ZZ%G63L3,Y?rfui{P!["y3c"Rd2Y)$3;yfd^eEjJemmw;%v~Nz lYYK)]2!r9cgRek溗odH=BA$H0eYlx=1 #Y6mMuJ)!8ZyIR+I"tl+;F1-4dPTACςOW]uϿ": 4@BH+"Uy}[ l&i ²$-ˏ"`pid"^tx:QDR@ȐA#'<?RHFΧ$cÊ;+^V{g&[F'dGs]q ,|פ&L܏|#RQkח| _pjH(| m]?)ϝ90X72/GلRZH>Ϯ^ڲ &O>O~=xm$f(fufB4 NmzHuТd]"6:mcYv@uZ@B_:=ߦf#J 5O5,>D g]dJ%4zCd} {ҝǂkO^̧jHDüXɳ ׮] ~C>*B2d04K*֭[7vض6峚>B@[+ !Pk[Ss_O?t_Ҫ,YZZ};CmpQW+WI)/SKk֬?>=a7 R#}wq!D6I$0>xe\r̘1)S.\`#Ftt 7UvRkIT1oxAC]uUdL"m*6"@x" b&0 gTO0 F3f &Cq]J"`&߉Xw9)bc7&O!hs8͛6?OOk~~:e*3{"aZ5n&F|AHK^tE .6mgGB:[O5H@CIX/ᵙ9˧}f-)gBUbRyηN9oaҖ'p>'bCPC%wWΗ+}wqNyk&F뷗ܽjceY}o^L=tHE ;_Guج60.]?o>z<LV2@jTjP2J)ׯ[gҤI_>---u$Ԝչ PHBttt瞹lZ>Cj56 .@ Y,ki>7miB^1cSN9e=p]W+O/(F?IZi˲.䒅 N8;uqǏ_p᥿TJ{SDu|>k͖mST&") ̘1_mo|k_B >ɓJE !p4ztx|ms$%  XZ\@tUY*Y*el U;iAr͒@a%.k- &@: i6XDppzu !dYAe,\DBb x3BAk=w~_~u<'lʕۄ#%윯A_}}qy* TзWg>^=?5"c[>o~\Wћ]Hr6_:>ybunꪅb_Ǭ{>@_ҍ]3>sؘW{6۪RxӟDf&xK܌^Xlz(, ="F)F袋VY=i⤳:q@^?(*(U@DwJ5ޏ=Xww==, CgJrA>foת5)eVOO"!oߙLK.yOoƍ}?#駟NR(/ ^Ll[v{Kh:sQGQKKi) 'p?z衇: )>E%ZeG'Gv-zl;A,-Z]uȝwQo%WT۷.Z?/]zM\vŃƣ[5gק;dY{~|6}h է/=N>屮Z7]3O/_~xjYEFeD."H 䝧{W<?|l%ap{3_MKz/Y`jWf/_=tVgOW?wR0I?oziS<=jW+oLyo?냟?c/W;p |^xaAG}c{@bqOf<?GO*oŽt3=Q}7?gS7ۖa[l:h`־uUV?\nݔS8B+Y+MD%RLƲ,jBd̥Rɼq]R8NKKw0aBwWc=8ΰaä<ѳ=[*?p)e૯34BJYT)訏-$R̮RK/}vi9hRo{ƌ>/Z~rÂ/ 4tD+̙358?9Q9rČ3{9\5Gb,@B[sAeKzP"* 5Kuk/.LQ;=Vk:߶aӿcZz>L{Q_ʗ?Cf,?I88n7^y+]r˧'}TKjV5Y%- \ צO.|}?߶,'zX,"LMkX uZ.X4(,"S~ŭy `lvҲRZx*c7!JE$ BP.VYۖu?CLkokXj5#1k~a0N?t$Y1?ҥK<@˲!o !.B U̘1[o,[)% ͐ZjX~GMMNUOo_:nNV[rm/[`վZI*j%PYnm%RAZ[`w1rŵr-9KC L !4rK+r h3q>{رʹ[,ʥr;@)eҏiPV'h֌vu'|g{챇mJ)#$Jߧ)^ F{{QkBT/G4Q` PLe/ dR|>EHi$74N{AU.7xG1{ŋW*`rbOOʕ+weR Ѩg#5&")v93W_kP5-K?edūDkQP3EɐȘŮQ.qؽW9r_.36[yoS-Z5r w.$\שeIe,J*+5 vjs' ucF:qø}[߉s FϜ>kstWPS :[rr,]'ʛKy&L>Hڅ{ϜX{af.wA<ỏl\\%i´I-/&+y0eáѩE֚% d@Z;e܈˝nl O|m99fQûV.ϼ@?u0nݫWV{I"呻e;Vo[֒QHbz]Bd=iӦ[G?6"G(RtgZY '[㼆wj~ {x8A Yۺ'޿s??;zE?q#>CV9O|s?Coe> [ײ?8_?w-_ߛ'~tE?Ww#wk|6z[zqLTŜCʽz>>LzcC?|t󋮼>1e,%v~ew_#]/,}ڡCgF+z`oz̺… _[ꉅ wYu88"(V"ROg*@|n&,k T-|w;qZ ?pTu33d>я:s5踴'|)䟯sbj^\.ƞKC#/˜1cN:uc=V)Z,`;BD@f](G /DhsrYdܯ}m`)1| i}7o}ݷx뮻uvx7o޼cz5)[D"7:2`IP9 akm\2'4"LH$I뾂 $4|t(RhۥgCQ:~Ȁ}g` %oO$2/4Hz31k+u]wo` o|"4Jrs$x;$C -&ҝ]=8/="&r:)q5!Aٚd|Sh !VJmyɀ2)"F)e8DȐsz`ѳJ!ddͯǩ|!)A,K&ؼeU~)&H~AM0G^0!}eY o'k^$v]&KFeS` au4L$.>4ˮa `cmiurH$m JALyW]u?q?Z2B!5JȌ4 e+kET$í\HK%dD'p,`*"oGBi(V6R  Š#4CkE1_`fB ߖ_߁A@fRk&fm̨Qn֖_ǣ"$=k Q}:Ph|3;^[BԊb[[u53dBT.l 6CJ9J)<՝7%@ Qcna,MF8h2Q}`*- _!4&yCy34L?"sh-ջ*du)dVooO`/tHd&}nXEF)΋yl_tgSU&ڢ3W= އ%AJVj%l Y]݈!kޯg WcaԞy몱x9!Q"Z4 <<đ$2Jf%٥xN8NMϲOx8q&-Hn7$Q5uf)n^ (WecC[yM@:4'\sX&rOXQ_0Ų]MRcϷ&c RP3;>į7lL-^_1c(=Ѡl{lR}$Ruxm!gJ)fmY|ݨw8yEt݊`sR3A:s_9hI)WE/⋶"&] !I{D {:{DΊԋqabUeMe8mb0AL**D~ v]oKYPC%!b{3RA޻h8n d=WBrl6Y &9b)Ԛ)mߏېuU^S ]vM|Dѻ2B'F*L`5<>uP&NzrQYGj%Mǖ AS"o })1JDn(E7)ga1oqi)!^7+-9_a(C҅v(3.:C&mu m7MtO>P"_q+fІz}[3wo@,Ȗdki]Ud+a|1N߽ \.80ޱ\rf)X _J=_K1̈"2tI\iC~Mt{#zzcJv̎ЊOE Ҭ̈́yV/-AW3!M. ωO&)&{$v{`S<0$? ^F;'?$=KGÛ9?A+$jD^"A9p2s}$h jxY;@78qVR}¤ AR haU[`Xf`p7pQ檩-Yp[zW469OHejjޏ6 'bs)[_ĸ!7;xBW3!q>+.f)֘2qĿR4σ.+2\#1,c)SC̤4zAD$8`'L#H ŰFGC0#M-R/>Khply#W)C jH7š Mk"O,(HEl 1'ZQC 4<2 ^0dH$5uD$X7Y&C$G #nDϒqaPGf/ӣW pD0gSL;_36yZP=OHX%2e m_ (]WGh3 "BJH%uD0A";̏@1d/l(3J$ACl&Etk6Hؘ8ZVRI ʁrhfb'`0~2`4:NX+f"$H̊|wZrKuIh = OKQZ4("x!F?Pe;nqr{'rheGkX}%o4X 2)t%0H $Z=`[#mmmRSIP(O/ 2>BܬfUDt=3 -h*!)`ҧj|>_sj#A:U @3N4& LMQâZ0~>0mq4f0* Hhx!E2JS+ [ E|:KP~?:Q-/XQ)S}7L:`+, v@#Rחb3Jdb&GnW>BAI̷^>4`bv ^oZQ)v]vdSEi`A@MPGNLQ9t$?/b"}RH!/MDY+EW_`ϭ--R9SL&ZhѢE xvu< msv Ԅ@7hcT@/01l#V QdyO;<@ϨoP(K67Ot]wӦM~ۅ?=fd`vK:ЬBЄD7Oݛ&=ՍaA mb}}}O<uvv>S| #4"4$ϘB`ŰKµkT@IMWڿċ{FbZ;O9&1J$mAx!8eN.0H1xM Yu,>J&M8i5 -ZVd78%tLggyH tڒF`Ҧ$5G yzIl6dɒ%K[Bf"y☮\gJ-ƶ5Q;kZɹ(3zO0eq|un=3Ϳ^~Nq;9sJ^ԓOuvuU*Oy6o^s7nlimy{:=bg@5Φ2(c0ڟ{ GX,^{O=TwwLru]˖/^{wq#F׿{S*>{;|y_֭dЇ>1qDZl;6`4xZ@7:^{H&smmm3f( Zmܸq?e˖=l/#~>j:b9f e[ouu\'|rZ`u]v\.wGvay%zr\aú+Joo_ovXG=zB!_rlRif%.aaȐSysՒFNfWEaho+.kʭ.xI3eUWD_ > `ɐvW{窥r>M RetV'^BBmldc_s?,+ݻYkm։ k#z@Z+!N4*H$X C<Ґ=r8ktV:6%Z!h }dwKlذ:s.]:w\s櫯r'=༳:{vXxѣOԧc=v~[q5k=kr1h ~$/c*zoJR|>̧RJk̢gFqI'jWՑGywww4iAf M)+rZ)Û[K/}ꩧ[]lۮT*LX 7q% pÍ(/?6^c[Rjww=ܓfg̜aÆ_|GϘ1~on o+8C?._xa;ޱf͚|gN>ZyS / b@gXvg-uU(_x~;|Z=Ɣɓֆ}m jm]p`[oݞS|!R]wK-,^ŷtшrk-"x5DD3eԨk=&vN^d b- "]ՌZV ]k_FlO$HĞZ81zJL.99wt;r:LG +;Ǟsȓy[ih0#Qs(1ZXXL` eOjt{{7ݴ{ cnw}9s,V+=f̬Y2̼y_FL1bĬYwt^6l+~rOz{{+{1c ۶IPZ Dޘ⠰2[h\ 3k8RV7 Zk4m&Le.RJ]||绌\hсhŚi_Mf&JJnM>|V3%js\\ꪫ>?Os93\qIch>`=Jq΋zN3,ZoIqcȨiTk*7xAN}ݻ{zڹsf2[n TJj֖\6nZ-K3gJ)1p]bCky3֛)B7_vSf3r9|#E)ܓE=YhcGm]¸K5_1HEhg|#yCxuh)XjKٛnLuIZ@ֺ%el&ta4ln-F4ݩGm/HA!#GM@p&Ut'ƕe5Q-&iyڬQ=|K"LDw=S.,\BE 3k"Od4cqi}+W<{~G]8Prܼy֬YcZk)e6-Zv^sj{?3<㺮RJם ;ܽ(u*2WŪZka Adͮ1BjZM1f̘޶6o\Z "ɓ'>?O_mV11U*_~9c;ݱ_kmglTͩEMuCB7Kx#+?{w/˝wIZk\|򾾾+ZZL>}K˳׮];|4'kϽ._/"*ՊOz@1)͚p]5miwLd͌h_g7gΜ&OZ]dl1 YBv,Q#scн1֑-va`RjxN 4 f2,ZOY`uRKJVz[[{[[;Y(mԆ\ʽKf(*P@VFa^#zo|yIJk@2ϵ?m7:V])I  xoEhS 6XBS|6X)F|]H?l{33z%eKM>te7*+I4t"B-7ߜfpyJ5H{,˒ F>BGJj=9r9um>_^x7}ߧNL=xdG 'C@w *,/L^* 5+FpR 3 o|_+c,Xf}{{QO? iMۮmK.\xgXaÆ{|Μ9v~WjZkkkt3W2enSlQ!] R㒠w=qƗR~eٹ\Z*eFggO>1gJk֞D.Ї9bĜ9s85pl6@D3"Ic/=j2RJu_xr\Tz/-g֖\.rʗ/?nm{]vyᇖ/_>ͺ{a|Ǎ1bK+VKeqss̩Um۶mYVD%j5/.1T*mv|~ѢE|ae; a#9;C 3)-%ٓXջ',R*nJ6nN7)jNxDco֛oC3gN,z ^M[0^=z2ȑ#~??fiӦ} _?>3wqoiӦvamvm'L/|a=e":cX5\SV:5Jo6oh1DBJYY 6Z /&N: ;kYt1, 6cW Zl'Dn?g5Nn䀞/3wm i[6n=L6(m#>Qzܘ  !۪ݕu#U|.ŗ=QmYjpERhRlQVTdm8{< 3Ta:KGU;[X[]}+u[+݊keYI,98 Ĩ$>q#vwwQ^M[i}RS(Y7FsGR&t=|ψqj]td38ejZ0bNLFi5lذsqc~_omk+9Oiu.{r|PVۋRZ*nNDhB>ȣx"1Wg$M8裎 #`o|żK{z{䲹R<\.3z{{GY.2LXlkkfrqc;oiieÇkiiϏ73"9BQnrbhgl?ښʕ1۶*mZ~Sҗמ{T*e27gf#11Ę3ή뮻cimm5)xRknL\ѷ7ֵ*YJXmsWg=.`5לl4e8a=%.mWה@MURSyY7rp fײmZvr.ňowL&3[Gr[fM]R@!Z6I(!3j;uSfEmq B122 _s7,3~`KWGGt\s8l6X"z9Vt@kc?#'x/<`.H$u5[@Cx UTz ,Hʀy!;8ea,H$֬YpUV=z{̙343(\ADB` 5*"%pّhԏ0v"Q!MDmZiwV> XvfBvHTXT =a[L$ 43xn -O.&[ l:Eu+A |˒b d3jnR9tś-JDC"ﰈ&MXI@t7' "6]Ri o&=ؔ'ΩO`,P8 @ýhl5Dtfxc=~밅 _H 7gAZ; &/ku6P;p_D"pUZK-XDּIٟufցG9B !_!Mj45fc"d/Lhx]RXl%EO2#t&*ZǺQjOAEЧY6lxH\ܢD<_b^0b:4$kw&24%7Yx?8Pĵ ʹ3"^L-(J__#c<""Hb6R+ AS6#؃ύK D !( |#p'F:SPuAվِoOA]AD6 `j#,hu4ߺaxBh`?Ie!h?6!:\upǔL@4S fTꍀ%MwCP1=@xSOM8 @ešz  7s'S0ؾ-$KwicGoXy}$֟V6O#j#k2 ,"GjaP=dv [ *|$I҄(xow ,hwQ\ĪS4aĵ*>J(d)63PE{(ԯO>i\HY`p,#uLn;-3ľoR^PH}iŠӿM;ar`ǧQn1Si{ME䥑 6DR0k63CG|9FfW{ԡ?Pk)ol<72ǎDhT 8ӰF~JX JGqkxBZd#uW}9um^(jx&ңa !IOFB6-$ɭ4֒G{]tjOLК]2+H~OS?Q>ɳdv2ǯoQ%3HnJcly[OX/MD eob/݈v<յNLfƱ߅cS5(CVS7N Kz[%%@=^jNE48$Vώ8nxIHp@_sR'yGCedDGCE*JD8^qCE`&&h+%40x.\ACXꍰVXi>M>-A1q"V}C]c7u3 QEo~ycc6*{Sj-*zf %5 9&0s]VwӁ'pyUpt0,?٣ R;H@ B;41-©c10yMhrVZO~駛w9Fwa #*8{(x ?m_f7뜷x ꀸˬ޼B]9/hzPq!;زAr٤DQ% FM"+a`)R63qܷyJF٠'%ņ3P>3VO"EPLcN2F]8j FDȯ['MAݎRV*Eu:&Fd4CRCiyԄxRHuÊ.M$ 4/])%XM,/ƃwm`j泡9c0HNf$uu8%Hmk_*b `פKMb0C{2\Pm1$:R`)^H$F# b=l"̱ZoP;ר(g (EQb4!&A_ V $`Xx{NJgDk)Re( )n$$8uYѭdo. (6 &,l cf4XKO, q$HFDȩ:ZZd[dӘ"E7dF3\P0j[;L.'6̣9{<ߊH12x~l d<)5'y)bؾϜF|tj L"śdbDRhS~nTvPNj֘jUyT-8ղFTz @? D #nF%%eD"[9Gn2C^)RlhF ;N9drv>5E?=oڈq~yC'S{Wro~;{:gz;M2mK^Fy;;KpǓ+pMw!;:5_hW 8'UH#1S(-i>^YK&{{O4@߱kW{M\|v:'+-Y?@ j{yon.;keמYkYP m"i,':M`(Em͈4k|d/~[F7e ;O5SỞ]]km#G9+Ќd51sW+|k]N񚃁QڅMP$EnխU1Jb@ӣGjl]@0qKW=Ktߖ+ Y $j\U '_q—W婣2~)^E1H`ecHٶX0צ)E|5XA0+LW DET~^XxW~{EEY^&)Uc89gէf+:.SRX @0$@+3CAkaۖ vU.[=)RxML;ҟhbeM}{J'.##Ț{a+kp]E-gyXNv3o4H"@Ѐ.G_q!{ǯ?^W|Y};~%g2 DctG9Qvs Ҩ;9 Ði lɕ)RxbQDfr-EQH)RlH&FAjYI2 (P6it(W7Kiv`S '4 d J es]4֮ ^G{~.ZE%Ә"E7dbPpɎ?=_mm,^> FO5`g/yo?sg|9wig~ys4eZF-݂g^<&J2Z8ǧ+8g8w\@eSL$ g-QZ~玺wK_yť|R w9]ٷv?>~"Е^~{0K-W kR?Ůu}~*I6{VhYasSb0[ӣvusVu~ԧ|v5.H Ap*J.Uo~+O<ﱗVv-^%vr6# P 0)&وEQ?wpO?vH91"@BN~Y;[_FU믿M]UA]ffZh,{Q{?R\Fgswf;y3V_A$Jw|mf4Pد5Kb}9qٿFjTw"Ŷ:1͏,#WÕ3\O=W +?m;gڕRCWYg9|eK0:>~Wz&]L_g?'9~QFMc5 WFa.U% VxS.^|LĂ>)R!ŦyHC)VRX4q[Z}ڪ@V5E&T'pp{%5¶*9VU$ ڠt!w=ňF^-B[Vk匝Qr艙RHvD1pY b , 0i ׂKPF&fqg`K0fQ 1xZ2[ `|g2EoI A@B1 O(^}%<U% O&7bhx,L@LAR&?ߣI[ޣgS$?VCm?vf}b[$@4J?EmuՑOD Ɏ<6 #EDoфSpjJR1 ф1SW,'OfD(nt7N)Q8uFM!2̆Gb魣,RG\Óߨ^LDJR?12\j'JL̏xCPx94Dm}y,lSB"! I,k&8O32[)Rl݈ˉ_2d:5;:)Ҵ)Rlh T~8< ( r)M ?Jf1KYs20BDRHuH Kxu!IG ҤR,`|i:gr IsRV1g4`%u#2aR)ʼQg~ϑ`Hm"57KG)3@b/_5i}l*io&"E11lph{e;fRIxf ļ8 [;,ifU bT])4BW\DфE&.DC Q[-D[ 'eJ-Em M^#t!kRX;R?FjD$EH"RG:Akh^^ X[=)RxhB5$!Lgw;c$ȗ|7A!uwfh0 *GZ5S=uIVEtUP%haY(EH3f].B}VC2P na(xQ\~=Grr >ŚMC~HCq@(aNL֊f(EQI,nT,ډV2(ovBIHȓDYC[p* ebfi!}u@?H D?")LuEɍ]7pE+$,9(H-C3 F\^qg5rA_eMQi#+Oϛ6b܄)cf_ўC?N<3g{|秇ܔӷ \&Q w}gם#B@ذS]{9S[[[o?vDo[=)Rxu:wc鷭y{udǟzk*f\=?n%hg5/w̺f-/T7?gsu/6?Oioe2]0]QkeY3k؜~YK7])R'FfY1+f\ZwڻzSQch`S㊣t")3r܅g671+ӦR캊+SZGuS.kV]fGR\!%rVj撻yo梣NJRѐv`WZ{˰ V 'v.}/VDJmd`KrR~*!O^WSo7Q,%A~1"l#ƀ/\ /;F<{;")Rl}_( Tҙ_Ԇu2B*?p/xWJ 3wN^~uNѣdΚݷXdhf 35m_p2b?{. 87._ڷr;خBFxBW萭 Vk_qS/w„=y. Mb@rG he6Sq9&Ѫ`I@c LJ Nmw)WU\8S#۪ QZulڙ)uw 03  B?Z)s|T.eȿs"E7*2 Wp% CDF#3fhf"s_+?I4ಶ@b6ḊD&̝M? M 0'7 zsSH6Hk0#F95ʌ Z a{fID11C ~ x4)?^Ȉ(09LR9-EXLPZ Efm eLHКUC!ibrUm|:3k2kSJ"6(BT ѐҜ>+1N] U#!8L Q iCCЖܲ[DM4ѿ)RxŻJaBO} m MqJtR6oP" \6֓Mn/E0HL"["C л2L)Rl m$a2`ڙF6CD<+RH"L")1J")1J")1J")1J")1J")1J" ´CQU )"µ@Z Y+ AAW@8/ۑL6)RlæW\WDƂaM=L% FC#HjdH F(SHEv#/CL}Ab 5 fLң$F!Mcf3O\lh6J@<~'2Eo H7Q¾zk Ĺ2JI I&@4 C@MġQ4"II H E)RlH&F).P19^[D'6YLG"fbէu7 f0qh)b V A ~_í$i WjS* GTG5GtRYHpзeZւu UMȬ @.V EP Ā0:#zy +IM{&2RVЌ55\Օ9Q'K- O͟0q)#=zyg͜Agߩu>g~?|w?[k -(}.;yc!0`GkOUǶZ (To4H⍢C k#K~̽;_vKfWh{{5K> ~{@W߭\=tŒ˟|YS 8#}q x2[{NJIDATdVF(f*RꑜvV"T#W,Pe&OH3ץe$ruaD$**i ƙV+YrUۻ+)څK m|l֤BpD[H@nzӔK}w^Go.òj YdL"Cs;m=ۭ2Z[Uy|vɚ5//J "P *]4T NK yWV\KS\ƒ`h> cFYo]W/sO_z1Eob=IW민nS,!vvާ~G۵咀Y=&߷ṕBYh7:z2;17ϛz{Ӂ D(}vsS@Z"C̔ FGJ+|UpU!Ә"E7d1M̊wsՙzVawm)}>7֑هϘ۹rI:l\5b/~~O|FO5mfP5 C7`.D" mfb)9P[Ȧ)bӂO Z4q۲ U ډbږ' JE)24Tm Z/t k[SO"`a@4o)R ,{$[{R4GMŪA S~'E3G_Ox yc )RlkhBXCFDc}:='~XN2e)R[0iGlqCFeDpgol7nT7t$E[=o 2)f[ Lb^MO"ŶF15Ъ(Y Ǐ74SJRVX6c @r#}%(HaHHL}5E $1KS[;ĴWM,$B=Ӗ;J"֏!9x´4ʎqGCgRHD1J 'hS3@!]QbdWd!a^CxA*)RhMKzhZmSӟnhIS걝"ŶD1-C:0r$tTE& 4SFuH )gSF0fHk.lYFb $Z#  oZ@JRؖ,6" Vd舀Kpp7p!- ,˨S6iIG`H2tCF @i(r.\E)z$#P<@\`X YSVZ+UheĆH.?^#O&R $aC43C P:P+5OBK3j 6Zm[Y1)?5Z#J"ֆdbDR0u:ݨlUDU+"4ʝR11 $ PvIbh N`(kR4@@/!Eh(X9B]ߓنvɋrom!RHF3bAZ (C&gG3n[SZ|7q/ogy'0{K׷}k߻A>kuwi\ni;ˆv$Z{wv]~DDC_DD lB o$H#1S(-i>^YK&{{O4@߱kȳ?>ww奋9e:'+-Y?@ j{yonx!!Xtuxel" e"ي|յ%˪?:eƔ{~O,Z 8 eV+OfK9ŚX츚]"3t"唙Y3vMf֚bQ\2ksS.kv44\v֬k\-0Z+W^=^O:q)RڑKrC.SVZOC_OͥVɫ_oɎڄ,Pۂ\AfPr?qw/|yU=fI%AulrY{"O8WԎz&NbG3կ+<vYsȵ ]~(}nS^;pr :O:WWt.}߽ɱLC01xYjnZemqU2Ti"68IX#o6*Y9'ϑ}=2Bg ]Yh`fg]ofsk_t\@jwᬧJg@)s_o_aS}ѣ$4y1Eob$}?񔃯6cwiqו#EםvN7%g:{vb1yNHM?Ow#>'yGN7sfvsظ|iʵJC6 iJ\Oy}73*j;Jb+Gryk PM*N-g[]m 4VcD1*@@f T6J]pZ![V<tm8@VLjHMlAC * `Aw*@fhPRHE21ȑv$ F=mafxT`,CPP mDOD(>w#^GE.AE]l)RlhPDD%d QLhkB"/>A+C?V@P_ iOCv6 ,!u+BIRF0@ E!ifW>Za\ȒuJP tFEO" '5c6.˟/*Sړ"6@SJ"Ŷ&(ө#8[Dx25?R)q4׽!!D)RlH⌨/bRKH0HC 7I*7KCj(EG01 R54 ӐK"ŶZGүy/](Ŧ0p7S*Ei])R-)R-)R-)R-)R-)R-)R-O=RئrF)Rx[ %F)Rx[ %F)Rx[ %F)Rx[@@i)R%Yѡ|%tEXtdate:create2020-02-21T15:09:03+01:00e%tEXtdate:modify2020-02-21T15:09:03+01:00@ݾIENDB`python-sse-starlette-3.2.0/.github/0000775000175000017500000000000015132704747017066 5ustar carstencarstenpython-sse-starlette-3.2.0/.github/dependabot.yml0000664000175000017500000000077515132704747021727 0ustar carstencarsten# Configuration: https://dependabot.com/docs/config-file/ # Docs: https://docs.github.com/en/github/administering-a-repository/keeping-your-dependencies-updated-automatically version: 2 updates: - package-ecosystem: "pip" directory: "/" schedule: interval: "daily" allow: - dependency-type: "all" commit-message: prefix: ":arrow_up:" open-pull-requests-limit: 5 - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" python-sse-starlette-3.2.0/.github/workflows/0000775000175000017500000000000015132704747021123 5ustar carstencarstenpython-sse-starlette-3.2.0/.github/workflows/build.yml0000664000175000017500000000213315132704747022744 0ustar carstencarsten--- # https://github.com/nalgeon/podsearch-py/tree/main/.github/workflows name: build on: push: branches: [main] pull_request: branches: [main] workflow_dispatch: jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ['3.9', '3.10', '3.11', '3.12', '3.13'] env: USING_COVERAGE: '3.10' steps: - name: Checkout sources uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install pytest \ pytest-cov \ pytest-asyncio \ coverage \ ruff \ requests \ httpx \ asgi_lifespan \ psutil \ uvicorn \ starlette \ fastapi \ tenacity \ portend \ testcontainers \ async-timeout - name: Run tests run: | make test-unit python-sse-starlette-3.2.0/.gitignore0000664000175000017500000000026115132704747017515 0ustar carstencarsten.workmux.yaml thoughts .tox/ report.xml coverage.xml dist/ tags .idea/ *.pyc .coverage .pytest_cache/ .mypy_cache/ *.egg-info/ __pycache__/ venv Pipfile.lock .envrc .pdm-python python-sse-starlette-3.2.0/AUTHORS0000664000175000017500000000061315132704747016576 0ustar carstencarstensysid synodriver Skyler Lewis Margret `Pax` Williams nekonoshiri justindujardin Håvard Thom <34199185+havardthom@users.noreply.github.com> Vaibhav Mule issmirnov Cyprien python-sse-starlette-3.2.0/example.png0000664000175000017500000161627415132704747017710 0ustar carstencarstenPNG  IHDRڕYgAMA a cHRMz&u0`:pQ<bKGDIDATxwő8\=EP$E@䜓g396ۀ|$I"AEP/nޙ = BHtWWWwWn5P h@>~o@m1vY"""΍383LXt^ 7ί3:Kt7%bX*ɤB6d4#" `wON?\.9g)[{kNWԖ)3H=k[(|O RXf5ُAG(* u77Q0k)^N}vWSP*/F6\k֢RɷA>ԟ+66 >^3l]T /f`bZ+ h@APAc1FRJIRJ"h{! 5f RJccѥhq{#K'T6Q:a(AQ;CuWڍ#/E)Z?|4V1bX_!tSDD3\ !s"=^bѶQt )n3^> C}=LՃfu6f$ s$a|'n ?_b*X.>O'N2xvВ )4r<P] !ߛ |ЗG:9XׇFk4 P#)I$h=CWuFn@0cc7O*É*YA-Sϣ@(w<t !jeBV.BQ}/!x2RjR<ߧ1ݹW7*> )zX͐_02\1W$y5G0}6vt oeaK6$RGu*!DOg W=iC>Sf)&&и{o|)0LVA^>F55s>'(jOJa1+6Ikqf7 .6pR2#ҨOЀ+ԊRdDk'^k!I=LW^D4㹑ByMHh"6ס_PXY@$}6SM6Zxr.m"DԯF fl _heDg$`fkf* Gw!F;}]xx6ԣ(#:{MD 8 )2NqUz6w+ B _?OSm<(Q(m2}28LT4ỔF<9"|S<ݠ#9,-ik h@PHN]۽N'hR CBWrܙ>S(p@&E"眤$"DU-Cx_oUBԛT>c+ AԃSPpI mĭf_1o:&Q^z"QAF@y":7 h&q :L]oi ەA t*IPڤbcGMտ|J "!28R0 c y~_o^Ч h@Ѐ4Pmq, ۶ RrPJQz`u`ZBAZN00Dw:rwic 뀕džoF}UPD 9>"DXzhX%:kL3> ]--TT 978q>^ZqΪ7d܂FceaUZ?5,)SzZ3PЀ-;tOU\ B297Y<gʥrE*>gv³W90x) ?Vk(-\YO#h/U ;AШ"}Y=]J LEvsC#8*)i*_|6yDE>SLd(7"BP"US_٩n# q87LܟD0TFDx<^oGAU4#G7 !ȊCj_aO,8W*k" xo|18y=@X69K I@Mq0yF 4 ›XQu \6a:VA ;"(cX,KR1 gMPtڳ_KӬ2\Gp]o>Ds;B+1 *܀6[0Ijj 3d )1dLݔhC9R5+E~w' UVB2z2Du*[e˲-۶ma0 Pd1 CKH\*[/SF&%2WUo ?"~g6B Kٛ/MͫD; IJd22)$J[4@Mn>b ""㜈@JP,p]u" naps`Z/ )ԙ9+ T+%yֽyE;Sk^{XwTOu_wԴ(Z 1ȹw UFڸnaG;toX€!aѻ h@>*s8[F: [B ]ZJ97 n$pƐ QRJsD@R=WZGC˯Nဗ $I',$9iQ${JnM"siRrdș[*^ 0\+UBDPHI\l˲m۶.R- -KH$ܶ-V?z2#BJ* ADe(*ǴCdAf\q9T_;]yʈ.*InM-9J}:HK ~QLn10lGtCFJ2Q*8a0u-R@B,c\80O@ `7:"l'Jx<2WA+CBE*__(xDZ$F٭CM"8ЀuZ4 +"BUۜOG`fQ7+i#"ղRHiH촥_P>T*U.x<&B(]Q*LWEL ˆ"a賣@Z}qHJe7f~eXdzYṼCzT+X!֘*zZpOFRrS\%ǎm> qWQugAD -9D5߄/TR%Ro[F |LayeF +_v"[T>i UU9Hȍ﩯B?}Xt̢퍡W܀w2چ ۀ4 h@y,˲ 0Mʤ?0L,JQ3z:QS~ΎN/JI"XS3 0 }@KRXH s9/JDR*nU[V˲%o  Aye͖-̝J&Kc1\=-ʝ#U*]vԩZZ+X -3IlY[nݳgm#F1­y.(J喖&@$艼}3~02p[6tLZ (N?([.,YrYE;5RJI2of.?la--|NI!Thw>jW~6:eԼcg{ysÛ^SSӠO饗){?|DƸ 784믿go+d\-'Fұ {Qh^Gd,FUKgڹskiӦwy'O2eɋ-J&~fw~%:,7:H8$I*(y,N"TG$ $9 sW蚭* C@!Rl)92[ "~>JWD; @ @"Ȥ` I}K BI$=o!I`34$`|& $S9# %tm ]@WlVQgn@Ѐ4ף~6M7(|p@ N$Rk"/ݽBdX*bkkFRp2X*! IǏ%Dt|LkC$mݲēNJH$wd6c'J)ն-minA8'IRyo7`Ŋ8e4|.k!)G'saO6+-˲㒤e,R;~IJŶnݲ~34cϯT*Ad$+~-,d3N߅_D2DJ "dN!e[gРAB9u{*I [RLDk^Y3g*3ʼn>(XbDf/ߞe-Jҽ=BaǎW_gyg1ΤÑO:qDX,v 7~yq s> mIo;!cBP<M6%fDRh͚5wrԩK,1 cO>s=wr!MRœ8j&`hT@-}k~#;N^iRg$W;POnQ90 $WPI){*` "R Tm!@-P)(2cI% `HBɸ0^iBE,JP+M]`ʆEeSi 1Ł$% s(- `sϑ(!a_4 h@Ѐ4P)%l>j۶3GEJ$%rGJ(0L3JX,[M={L0iͽ$H`)/cEb 0t*,l'xbX|wf͞=]Jѱ᭷ |X4|Etxy1۶MOz߶l˶v5p@ιkf ӝ Ƹbh;wbq5] |w tfeeabٗ(6U{{::Iէ :3WQ!sTCHI֯>` ]G" 8455͟?|_7o^KKKPT@`-+V|͙l%G|C iiiy뭷V\r!gsYB=(?lRH4o^xa谡77_~n+8p79`e +̥jE~x'q`X,^wu<@kkq㚛e+޲c^h;SO_¾&gdx1ōwyW/7'"1pTHO#`yAآN>ϽI?x`m]O<)}/3$-dO?}3[$w_KF|r'glltxO??HvUJ_>ՒmO7?5aJr(R,5|ѧ^~hpi緮n),h*Td34\ h@Ѐ4Bz@}D"o(I  ,KXvъ^ WYD2wttܹsʔ)\v붭L6LJ)MיBG~ `eVٲma箼rÆM_גdGǞA?_e}v[ rRO<ڶobXP(˛>tAرi2؉SF5ͤE˲lvK#cܶE>_mۭpD^.m۱X%_?tN$? 0駟"hv<8)WvwϞ=;=1bؼ͘Y(VZۋn~\< "۶{zzN!ėW\y1cd\0a'?)Spfv+!CS3a&tjq?C ~Ncf?#{oQ In.^OBB4.(r>|?|_ʪ7v<@R,Mh!,y3+dbO` Iy X؞p[ $AR]$ $P~ "0`PiIJs`mqÿ]T/G_8>s.&18k/ʶo^1_x| 'B _|=e]?}v3ɒ3˾W÷߃;1>l)P .]wۋϺ_/hzˮoC9zy#v'.8ѥgon ,ѳmo! :rL9ݾⷿz33h1Qx +-)ڵk{zz4k,*Q;%ɝXǽ^KQJ!m8yL[ҪR/tA---|&^έjKcez3 ,8C i!ĚzX\F5{58b1H׿Zjȑ#rcx/g?[f 7pW(3Mv5FLf?SR/<555U_oZjѢEe:f~ΝK8Ār`pUf]xcɘ%s7|{ymYġdw|{߼3cO~r`,?]|Y@>OwÇ~M{16^&no>&|}r[6/U' ܾ=ٳlxD-H!f7է?W}ϯۃ}oLI1g~w郒">? E @` ۇWܑqտyWwN7 @fK=?+JJٍ{vg~}4Kٶ8flE:w_w{q>GOZ|q3٩͇'/?r߅G7gf/?Kj#fK_\2_UZPЀ4 h?*rt:sΞt:믿rJ*{ 4qD%Ï5vSڊ ґSHint/ 2dm#Fx,ٙnj*^v'^#*RY$XVrAq)L4iɒ%rݻm[Rz8U1l.J3|۶m#G4c1)I0`myOO_L[[)CV[-%H+7缥eС~gmmm^機̶x"SJ??O;4uQHпЩLF՜q.vmWWנAΛH5]R/ ) p^X(y^T.+swLӤX_期p *#Z!bfmˎts YHp /Z5|}{JgVaÇ}s>y)3^%pj!ׯ_?z趶6뮻λΝK/uf 2瓖\2oWώףD?uu0̿#y῝:mm'\cd>R$pSwfO^a&uVpkGp]2?[vܯ=!2C8vf*ĠiŨ9]Şpe眆Rjhwweݏs7tlKuy͞/xdmy H&۠>d|p096&y#X,ceo=a18-<b9v,\ĩ;w{{{q`dw':J6|΀f{;sVz6o l?6L[e%9(Ty MOnۛqch&4?ݻJooaSE+eO[fXCUn@Ѐ4 ~{nO6775JE7G4rO|*o1n@Xˀt0A c677+FfN9,=ݝuB[o'LR;@6ӌ755[M>,"~_V#b`ᲚP.mۦ<B|+_a'?>9r䫯Zٓ[y `IhJw?<;iΘ\|y#O? o?~cF@#>rp$!DXg\8ph=Chb B\ELF"ޘ}) }w5maV_a0+Lфoo*6vgg S `fi\Ě*t"<eYTSKB`Lv֕qH7gS@iGo?ؾ{L%083ö]b>c 9!t/X5.u!sB$MЀ4 h?|3s'.^X}nY'?Iزe˞y\veT)ϣP5U N&Ç|d2HpABgWgKRGGGww 7lxS+n,qRݛP(,^SO]f3{9) r *;V]Sem"@TwSooѣ&Mf%I0DPN5ҩqS.m;N>Fbe[r׉AwUBu;\lqwy1{p87֯vҩ4I9/JPUW)-!3MP,@qK[ZBsJfōDXTT+J͜s!%`K"p$gLid2x,x3n ;H-1SuϝZ{;;>6nX,ɤ4lY$ekk+Lw߭[fx X#*O9Y.#dVܖeHr/%ftƟ?KY#,ak1~>m@GLoxݩ}1" qU @69أ~2'vV{>(7|%r+vȾYjL@`0$EE@"`IatlroDLDrF2d X}*x_U}#rdJw5MsSOKMMJg>Z.2"|>o۶^, >(fe)[&M%m B0J咺ڲ,0fKLPG.E ۶pLӖeuvv.*>|pι;LƙZU sV?xgfo⯠,*:!߉~k[[۶m۾v͚l67M\ɥTZO];\- dx۶^~d2y衇& ,Fͦ#̜1\.?e1T27o~7}=-Fz870եj # Fƣt:韺 8>ƾW1cF%J'$I=Xr@bPk7)Awgw96|K0VmW @*:Đ4tK~٣־I[C<cl`AYB0lOb#uq ^ޒhЁ#G 0z$ 6.9ܽc42w{cjp7|wcM_̶Now" ?:}6JVՍZcG{>x6bw}97`}@ ٕkH@ IY+4b0+laKYr{[ ɡc0hpeHArsrШaػk>j:1j7 h@Ѐc *xРA---xwݲeK<Ozpe.|§[[,Y3,[L)Jy.[ea+VXfφ*ĉpF:"rB$i15Rڲ;R)1vyme U\瞦&/*ggo ,۶X:mbsGM;iw!o?^}{7 p8Xm}۱jzHX֎^]چ6nn9 j?1ŭkWy7K ӏS]m{[E6m`7sH6$M N[Н\[{u|S(KfV^F>M`JG]pɛVSELbex-a~k>y7yO9`=#N,5f=Oߴ-{{ʥL5,]gvi8q?ɲyce'LdO~p3irڷ|xoTSk|c ܶj'JY z|{Q'7^c93 z_>ֶ-՝O>{,k  h@Ѐ}_q-]oAܹӓk92Uk=SJ~[B/˶[{3r7^Ud,677)/R)0TYi"RN怚■`1ښH$vY,8 J\.L&eۜT:dPu0 TJΝ;׭[꟫z/Y|~˖-;wTzR$PH.a?h3jqʸb!jժR+̛7όZkT13+7 8Kj1""! Ӱm{ݺu=fw㨽E( 0sιm۶yԑ&N*Kgygm?ڊf3M1kp^mΘ7c 4#IeD(JxvD"q'}7p_L=`u]q+2NWHK"BXa|~g631h\r|n~\ѓc95]^O]/Wl87rۖ?tggdt'083_8۞~2-M=S d~[uzL21zd駞{wͫ5~(0,@I&@OiwYu#ETgq$DhKǶCN՗OifȌvnLw\<8aT ؎R-9N#g}-7WO񫧵Rt(viʤO}˙k_EgIrA$iɻZ \|c2sy-׿2 Νa1/秞t |İ .:gy4 7 ?Y&zi3mbUZl@Ѐ4 GjAr[R 2ƞy[,U\zQum:U]Q=d@g!CWn"W)z_IDcRʃ>K_Ҹ=_I5:۶=ˊt͒(˦ҩb߱Í1lYw2 M3zW؍6MDDZH􋗽zjLT*%I˲E]%+2>`\g}&N6lH)?OM:Uҩ^,ScaPX{O'RY&+T1ۙ0!R  $bHJLH@)iL'ȧxJ-mD`X]P"+f,򸓆SXP$r[ =Z})cIQmH6S!^zP ^(乙6@ʤXIS6,E8Y(I f e)/ d `{F @z!^8B9f90rr:#d.e Y)@VBstMp(dm{ƍv۾dɒ#F0:::|wy窫6lׂUP$ɑ`M\V< ڲeim9i۷ 6lǎlvĉ|>f{:d9!ZBL2 @rlh!ԚBJɀ6 #` !pgnWX\`{n>%dX\Q^tzSN95}D.(H#)yp apI@6 QFc -E0$H "8B\vWڽ % .XB85/ h b\pnxI@&nHι;` Ӕ $:wVЀ4 h@O%ض+iӦy !86lrSuf"),˶mKKtfιRJm63srY*JE0U&nL&kpP>|x\Vٞ8mݺm~V[i 眳^}!x  B0z3~eLI:Ne\UG@@Oamڴi Txֽ*ry4 ؾ}[oEK@J!lo0a„#G{DhnnRsQݜcs{guYj ; >uft M9ox: \gVMMMl64!&s}]#$l7ϵ4b]38sj'2 q\*ɤU=@tU9*ky뗈.\x%qEC"ncά0RX7 *GMZAr*aRD DۓLHR5U'զ7F *?!.ses.\ UUB!ˏ; @AZMB8U8 I$H d8rId@ % Ua`j,N7 5H0&%I"dʝS^1I(WA+($1JɓJI"tVQΠxn@Ѐ4CBzmimm F( ʛE+骞N]{zWPW`1)cJmooUc߼Cn7fɉ(&L˖Fh=K) YbX,rlUHy<WᷱX̌Ťjz.h5qgͪ(EʼnȲ,uRWggWW3tSSS:=h y&1 #Jq-޶>QC5vwL:НbB(e _gvOFׂ|\^%^:wݯ| 5wZ;IUjwx nDz: C$aE)bCZ6{CDB{u /w:4k꟒WKJ%c% 49YQšZI  iAGo$bΨ([`:s3UOʲSѽ hB:? 4$]d$M RBptAm|4M4H]aFՎ#Aa:-ʛuíJ_>eVyU wj 5;}aU!fK PЀ4 h?0D:jk:u1$B^):V`U MyȝA D-G !? kJ/_\WotB> =RE㌗UfN,oP`QᣪkHɉ$#"2һ)DJ"Q-G{V+g~+ݟэNFO! jw:W6 _s/s=5H]n-`Th٫ jVhMVȻ^?'Z}`?FϨ9FGW5:>;: ଧui"7 h@Ѐb(ś5岔B+W0zZs p "R"2@v0Dd.{@ڕ}(^ɳtcZI'b1x,fZVLEk|l4M3ux>d7 } ŋV֬(^Y wڋ(Ji2BK<`3*QwVlaQԏ{ZA+F9%@:U!Ѐ4 h@oI"iY"v[w:|n34Y%ӓ[htTi=pe#/ 9A URh=? DR4 4M/.1W* "eAY./]o]0`{V:Z ♚Q Pvڽs;@~grUD'"(i+|G4R3¦N#5ŐE_|QqH}^S&&V׳kwS%HOaFR5ܑEEW#t+Lh4e7HЀ4 h?3l'ޔRT&rk;8?p{h֯;+(=+W﨡\Tk2yכ jõ܂QdUY9T+*Oծk쨿ɟ7nSX NL@Iz)Z="ԶTQ #sa*9WHހ/\H yC)V6*`'L?'}R$:kHQc^UЀ4 h@){<ʶ Ķmۚ`SH9}ɖ`!7қjF3k;\<)HV}kl|Ps.jNSJD xlu4ri~X^V# Q[Tё v{2׾}ǟ–90GJ}Vs: W7ڀea(r8o507sYh{( }[ nl FtЦ\-RoԵZ]{>~CWkqamzq_=^_>B: joN#}xn/:{BMߋHk_N?.Ρzً[_9riG7I6$>T#{³ꎪ6F}q4D&?1P:v>..Ɓ%W#{dlv0]HީS]Ozr^: DX^{w3Y|@JZ뼗_RV8tc~Gm=@*P"BRm >35FM*k@Qw2ls׾uc@}$|Q>t}ǃmUST0TRXnWB;zFXܫ#1 >: A53^5StFڨ~ ZUُq~BxĤs.ὠ$\溦 j<_H#p}vWoy?R_o (x T/xK-2BReQu[ո_.b#m<r7ٝ蚑/(BqĊo uѥw tx 4ť~DI%F=n'NMoOޫw >U 9#` mUMVar!=MKz"R{,{^wGN+^L@Sg7a?3XNj Kiލo7z1jYu$"nŏ.*ہ:8JgB|N'O0Uo@IɃN^g?~YTWo=Jw|=/+:@Z99#C{L#Gp\sE = 5+){a9X,+1+>0w]zV]ՖPU8H[4_vȿ4jCG;sT6(O w@ǟJR{?M ÊQ.byﱈp;K΢*(]{zL\k/CZG!%P( o=RE#_=8PZ(G]pJYy"):봂>8p:m5WWxiNJɴ6#[?K4o8(XZiUI\1ԛwgO\xaQCTxKԓ}ҁ@gvj㊄zŚ\8;~&r_-`# Cn`\4zs#'S<$UrfDVшԴa XEՠm0m؁#uA{=ZpUhT]9 jQERX"4Ǒ@)ܓ/ En<TfתC%ϏZԩ#<,ʇH} zé1G#6~, (T6ޝрD>HA|hO7|7+*^/_HD#__l٢}X_CI}g5[!&/OJI>BٗN59߽ϣ_])D=ܗ\uJnkIM#on:QvF^5FKx~!RD/3.^C)TVcqՅ'gr]T^c BMU_-;G!⽊rlqE@s鬉a2x."c1v纎GV!Dh E"j-a=~}\!m3;*YkU]Q?1҆۷5FY% #.wx,*TsJ-m .} 'Tm u6/FTlG$n q 5 ҎİPEy9X4U`[(+}JbyUYr^ f\1jjUAu^ҿ>kxI7tQp'XBwƽ^9[q:VBhHF%wPuLj"`Pua_(rOY,43ԓ V.!=бoo(F}Yjˡ5Y (n'{gyO'?f׾>`m?I]We51{Ie3C%0\kQh59H \GlDPcW*25vAW?WAeogh6ݰWGo1[h4ψR *`bHY7U{ ilM>X*bUP(_2B'=ihTN5Ruh}x)JN}!͉oy0v*Ui9!Iд?& m!n U3Prr{mjFV`@OGY tpjGr%uMf[(pcN݇8< c,j|ˍ SGϙHckc5Crq6AI'4Z6@\5倂P ٥G umk?tjQrUUqUhRl3ưIzF88!B-9ԗ<]DV`RL-Pl%?UhoR%%a̷QVfWN<#~㨯ZHQ9{T_ >}KaY$ntN|*!rc#*UL&$UJߎ=>hIc۷GՓ9߆4U($e5$!!h|ّj6-η J~#O֯:Ht4!D-Hϩm}W)@p/?9et@ЩI*.e)vUsEM; U#rXz:Owђ$(k\W+Lzysa0lHpMxl1?4ϑzE~8O:4F6Xcz56amGIQ`*:C &)}Q2V]U[>Z6)A;JShbȼOH&W芷k,HIISGt}aIhK+vSeߎ3dªxgzؙ`:3pP뢧Rł L>^੪0/~l-9jTR(cB*Nū$쵹"VX@%YHAm;)+FѢ3PdP I@,IĐ$JH;m#HS&\ݠʨ4faGgv^w'g V-8Z}=BBWxp#jA `>ȣm,W#+YB!x>V{KU$*lb:*z ҵD_O J D_D1sQJ)L!t?wi]e׮X>ǡsh z0a=<`ܽ gC*s]z]x@)HN-v1Ñ1_v$1\gT*qqUae{o_Exn넔V:&y5ŕ:껕G_ nDX7!cHni# DʤL5T,GK^+7/!2dK3c ĮRި`#OGryY\z~mn-]4ͅ5MqtAП8fIgN6:H7R'u蠒.((JY(TF+sI(#p!<mD1H q9Tr~ wm\.Y,2 8TJ51֝U )sIRT~s@OGtM{&hs_ByOZUssy#ImK)`A1*}pY'DJ B ÐBڶS>Ms-ΌqQJY(fb&"˥$pq dF(/`RܺɶIJ0 ?׺eO L<"O9\$B$Z}#%[HWgz; `%; 5)Hj::bINj?4C SAmֵN1u-px(HJT*S;'"£S!4P.M4l>@ߟS#:I@eB,Hͣ3 MIos?3ߩJ=I䰨s$'2w&0r}fekI4+XܙY RMU=.> D9j ɖP;@x<nGwTl"B>o TX,b|!֗&D&{הOOYSyqq1RCund8S˓/童qcdj{ga* | Z$ii}BVY5=I; pJsuH*+|X]MJm _wjSA7'#MVҩjx[|fAy3PH$$ve d'Y؏<ď>6m?=iZ&0N ׋$,1d1oaȼOvqX!0>O~D{;8I)dq sBn tA:<`?C,Y|!cjmsl)^IjS0 T2 1dq 4!0.IBFȘ6s*ף$sF Ϟݒя{tKƤ'IJb,rEF*G:n7xq_=={ 9g@%xmx≶m;cṈMH*]K 1 ! ;2 B=1^$y&E`I"&<$To4xQGV(㜹Ru2 "̻5@7ZϳQ򨔒1 δ΃?j}="CWReQ}&R Cۓ[DD$BxG"*] }'sVT]%X88p GVPPg>Cd-$bxnٲ%Qkk!Cb1"=JS68*^dd e_xTĩi$m gB"a=*F^\0`ۥ{[^}-HڗZ[[|%Wx+"iWu&ܝ !jpH#Hg[+ί|>Ay!F=*)b~Eud$+w!mSww/\(=XAF)R~xR!sd_tDfWJӷv<(gNCJ@pO%0%qRJ1.Z+$ ݕJR2y)]$Gc!wSW$DcK!/e0;;!I'd g Fwx*7.GCw/Ɂkd#c 6Eֳd'$!JDD$wօ+b[Hu L 8ND!{D"lٲd2y!s)2BuuK5ɯlc+F 89D-S;~pM "rƽu$`#C Iu%C&8G:,&!IG$IHqD)}1 [npq6[J!#Z L>jp`I<+ 1I,ܕcjWc Y׹Cn Z5YrRƄ7%H0F !'$@0P<7)W!iJ%I;}8veͽ_YsoL&N)J3w 7*xu^,cw$J RhוzZ LrhM\BDtчGڷmĒ%K [S-M]NASPs3:+[$"\nm-̓TS[*D>uO1 CR4N,Yd@n\TҌA=yC=JoƒBcd2wnjn}iN[nŊj^Իӧpa U1e< .p—w: 9rgT09&KMG|qF0&Mr*\K%۬3H!~[ ;R*_}%pWX7a0|V&GLc'@$I8ʆ#HͽeSw@72@D:DDs"2 Ϸ<裓'O>Ca7K.UJj椔W]uՌ3/"!%R5l!TX(th=NӂAt1Kިݸq6ydaՎ /7|yOGpLp"LurҌf\z*NP0gs,e gq$I ^4 APܶm[kk됡C")R;RWYze)S3]2uang#")"J'BI H$12$Fɤ UOW~xd!2d׷>ZfȀy IRٕU B-sS3\f0`cY19" zC*:sh*g-j&i_'t4vPAP,ziT%E5N}gd9"R(XZN@o %8c<K0WP*ՁVNCsZN#bbLQTLR[^:Bcz*bcmme%I)UU($;{nm39LEǨЍS cVQ )p֠.Z8nx/!X9jh.""|O/vFgGݩoA[vK}S65nV,#W,p|6@ݶ~GqgЋA yR*vjKDDsnp!$ >,z8D:m{`geR=fԣA]q+͟~ 1b<'J"a~@44\.GD֯;TEٲҩTPcB1HBT,&I)e<MRif3bX([Z |KKKWWW,Su+;-|C$*tS8gB~rE-(eRX,V.`WZZZZZZT*)JD2Q,xTJR UN%S\Y!aUH5eNփ3锊衇IO}lob1 ! P~W۶ P^;۶9r,13`RT*U*Jr</ȘU*s3 C)@T,D,+|lP<" NŘ+»}OU6'Q'XwAԧr\7{߽:ԟm"Iu@&ӓfDWWFBiJ)iDwOwKss>ojjmT*%ɲUS%j@D*Z|f͚uy{%-X`ܹs+8 1ͦi0r\kkkXfE---\Ό B<O&=jVJ$jtDX(j"Aкuyfw=:zX̿{?鴢\>C9ѩ>$ˏ>sϵmwk:lutt̟7#޽[1~rSLmkimkʗf??4 C1UL.( /vuu%_|q޼ya&HQ-SF3XU*~bxu :Tqw]sL$͝(enNH idax2NL5vh)8׼O!m5_$7xU/Q"Vhx6n/EfsHL&oC9)U"N_yeͫ-"NV$mj0 Bzx7֖xD3 .]tGd2U.JL$RsCT*BLTS45eκH$Jv%L7rR=YX*ZJriMMM\.ͦՂƠv^iY;*5vg}sc E` !0,}Xq8֮V6MhPHCtI?tA@DdÚ5k:::hq'rf(cC=K/uvv )'Lpᄅt_-[4#<餓ѳL{3U sfL)dss/ֿh"!l?j?`['x?ޟd8GuYg3dDo'#Gܽ{ Hz˭k_}3>,Zhʕ7={e] T֑Ů[؎ά[X !gM$^}uE^z3vѢE/Zo')S\ūв~i⢋.:K3ܜ9s91]! ι3'k1vڬ3{_|ŻkذatЙg_vmgW'vizm޶~R4|s9JWeq#:pӌI)m)d"x-Z(pǥUyTjS[СCooܸqx#{裏N$Ry^{{{&BL06opK,9SJR"DSO=UJ?c]]]cƎ9gϞ_~ywܞg͚}9|~{vvtAts=W\@UH<Ͳa(bΞlD|Ԟ{]#"IW_}q.D"q?\..s=cR~^zT.#FyY3 n/X˗r뭿q}K9s҉'~\=SfΜnJq/Ν;c~h'韮M0{1cr~g1W^ye[JΑy.RYHREYc>i{>r Z2-m?$ 3=5oxkC>;#ꪷ~{ƌ|>˭_~ذa\pAX|饗~~K_:CryժUg>{+VG?ڿ3r7x1|_>c$ NPv QBŤnkPMɾSM{Wy{1eӦx8SA `vOw?O|\>ԥTh,[Ƚ.=rɒ}ۯ\*M8sʙ  զZJrЍPH\NGmii>Și`ҥK?-Y~x?}h#/>`t!o۝;wX}מtIsP΁8G6XrLJ>|sy7v忺W\sCƏ~6Jmܸ{?~A^{Ç_xRiqRyÆ |>bŊ_W&M2th!3P1xuqvj!z":U2rdI&)Ivww0p|;LyfYG,ٱ}{XDa:7<ꨣ_>=? '@ĉŶЬ0N׮]{7vttڶeFPlkkf|}KMMM===Çg&KfܐZfl!ml'[sky[7oKz׋,V6tTAs !@˶9L&N ~6ewݔNK)?pS}kt)A~")騣Zr\67jԨd2lٲn/:uʕ+_uU.Xd/[dɒs9wWyUW0pO"r_^c>ST>7c1,yN}{OK@N޾|ÆV\Q(Tc>ts;gq˖-Yf=cBAxw 2rHI;c:(VIJG馛.)S\?U_‚ ҥK-_%sի~[ߜ4/%iGp4Rqc 7 t,U1D1c=_ꢋ.0/ tpTZzA>{O>W_կ|ulG}+/0ddrvaM0M{}ᇏ'__|%3ف#Z% )EE3E1WUp ~~_'MZnpRiÆ F,ˌy=#{~|%WH #`4˲o'9z!8q"gZz}^p/_~s!C1ϟp Dw޹w7b  & Fy<]T*!+/k9%́k)a@{+`zEgoy9-fk2fFb-[>ƎlٲoՏ3.0`;o}]wM<BG]%K.;w=T*y/Xy@{srͪ=- t|F ds gt=d6W`WasIĜ ip׏=f??WϚ5'رcѣsƍ'M$G}QGeY[ /;ne~__}|W vrѣG3έr9,՚|_jI\}x'Lx'z{{?ώ;nŊ̕W\J*ZA~MuJQаlJ $zb]dwkOn#I-I63DUU#OR3fxGL54#ö3fxW3gdR'3a}9CyӧM0MsƌǏObQNl@q6`BN e~>_7lذaÆ |}\~ٲegyO&3g|wF3fT*ZZ[LbpX,p .l0`Μ9֭۰aifYjݕLKsrQ@`}()4t}gIB_׋.joo9s~m/ޏyvhWim'JO>mTJe zeҤ$a=… /21IMT\s}·UK 9F'J`U\*?_zPEs Pd m۶,kٲe-'.Ӧwwus=ӦM#)yd١zE]*d0aB",9mUv 2TR;X?EcwE7i}u7X,uݗ\rŋpʔ)^xW^9#Ǎ_,Mw}xjni挵ժ7M}ڴiOfk/Z Z=2T&Vdo=wSO韊;osB?g 8W_}u…/mۿoۺYSSԩS|MdV3{voooy;gmHO хL&;y/| ?u]]]$(n$I :8qe[ * Catww8/iYI&};IR^{/8vvt7SwV"!CAfujXlc]FBL Ehf y F$z<1? x&^w iZIR_{/7 酺uX<G4 ˌ$essQsΥ-=O9شuwu{sS.Gqą^(>}=3::;9pDX *WU[Գς{rpJp\"P3N?ŋlذ!QT{=ܣ:&MtY樣jnnyO:bjժ Z%Ir[[[ZN;ScӦM^tyO<{oWv-K[!IJU cSDZWQ5PT*s=zI'96mZOw}K9c&7t:=hР O8wswÐp'Lc|A9{zzۧO^,s m[L>K_}}KO;O> 'OgxY3fg6>}ܡß ڶO~7XvE`yG,Y@rHggC9Dyխ#_+i+J8 &$|E#ր߆wДn"3fѝwu%\'O_y#8b1F&)LaÆ_|x衇z^rGO6P,zףbĨ0HQ7ɑI,kn,:2w u*h"^MasRIRյFlnnVO6ϟWs=3gΜ5kVssU mܸqy13FD---FR{x/_x1 L2 /\vͱKDmmmfRce#w̮% bs_UxKO?5\s5<}5+ `ԍ$,*`0:Nن \٠twK=5Fw lGqId vP,475oݺ_tP8㮿Ύ!0rJe2LΜ9o'q͙37͌3/^*̈́AX~]j{@k[p0 k.Ֆ {RŶذC>\E-Zhԩ(sWggoOYsw5y?OhTM 33v_ BX|oX,vQG9RuV&MFe3fzm$䞎=tQc9bĈC=ڟda-\PQïVsOY6vs LITLƶtmۖe۶nM%VZ|m۲,|{)ToinI&{tX>N]6SLKX,[n4ͣ>ZfŎ?ᄥݷ{ 0ƒԮ -g}V^sN۶?gٯ|+]]BI&yݐL`}߸7o D"ɶ֯|cFfdBRJ0;;.bl:>O<.tq۷o9snEW2^e5-R3HJ`LkX[<2ea"7OZ.Y1Ƿ?_{4Z*ZZV{~lh)8PjR ''^~e}3fwc_g߉^hUGdo"* sVDgϾ;vc[ĉ6H$Nz]wyW)˄ Ν__3g\hь3JY>7kSOXRgJ^]njI¶U?1՝~?8wqg0OktI{lڴi޼yGnQ}V97ٳ㎮=w[5q$ӧvmcBgKdZ;P%jU:RparM92k,.fΜywVe1LC J&gϚ} ̙ͬ-^_ϟի=؎Ύ[gMз|Pp pԢ.»iߺ-^ֆ/^bœn8k֬7x㬳F|>oM[os.M6#:N6{-[A^b@Tz+%}54͑#Gr!^ ;찅NШ͑{DJy)~MD!sq2I)_rR%m޼%Lҋ.:x Dd2s}j *|fhG[{Ơ+՜e !M0  js Q%T*u~eqѱyO3ad %ItM7r뭪Tb-^0-tBPvf0[ 8P 1HH)-˒Rz6zwu\^3@`2l\Lt-°a%+ؓ4sg@7ζl6]]Ii3YfyM&B'c׾59LB /r),G7(`xaTz JwofOk-ZtWeǽM,T߮=Lj 큧vC=\jˌRdYҭ@@` NemqUZ1&Lӻv"IaV.8i Ţf~0>c"6 ( `V<d2B"S;8:"H|]pazK,bLc۶MaV0s554Pd8?DNղB <0B߾n۶m{w]2!3b\*(I)[K?2N_yŕ-8졇~pG\z̽*.¯ Am(Swg,ؖ~fߩ*?;蠃κlD[^_] $Ķl"J&¶Օ9(eu֌VsMWY_RVgZǧLR*ӷmOs1RL6;zX,v?ׯg>NSdW䜹snwygǎ&MrÇ#cj  -I׾"X*E2JSKHQ\nz3wqǠ;lqOĥ7xGc0T5T[&JbMKn3Me,cf̈)$XG/e^v`[agcFt"\1ㆺ͙ "f8+hݦ$QIcQQюaÆ]r%>U%c\*kdj^IUYerFv Y]̚؄RIKk"zΐP\$*ITB *It:htpM6:NW\Ѫu+Y%Yei`ů!k+ k6P~ ;z嗿nݺ]s5/E:w<)VP#+$rUr4G$q*PR*ץ^WKT, u`@T n9_/_r{Ͻ߆:vaÐe9!/Ҵix<0U@ڠa*QQn^{gxC3lhl0ɺABs!Pڳw"{M4iѢE:=nӆq?ʊB(,>-01n=&Зgˑi7na0)!Ĵq".^$*iZ~u&.ED"!dsNrYg5Qՠ!Z V4= 0ֹ ;GU.qbR(cmӒek0TYQiJ|~_"}TJ$EQZhl͑Hc֭ߠ$ɭ[&\JĢ RJu'N:z-g}_~L&5]a+޵{7!%T$2Cd2պuH$۪֟֫e6oּmRǷo߾iӦ@)< aM0N5d;7ˏ`Gbae":ijn  d:NӁL$Ts}6SNW>/Zx)++۰a…  $оW^_?ܡC4/ʲ bJQuJ@Iv-ˊ7+aF0,6n$r1]f "WTE״YfR M3vy%TQ^% Pe (4@XS Jb" V4#jD0fs_B&ZH`\v DX4n?JWY%)J͜9SK۴n8A9lsz}GOqqC+Nk^PP0JaӦM7H$-[dLEɮ]QF>*4RTJeIk<ŋ:t(b9u|K1E01ZjǟY$)@yM%JW^ZխWq>tҠAo_1BXX(ܿoD%N۷kO\2 R)ܴiSD-6oD(5l@QM%EH:Vdr:P= ֭[#kתJdY޲eKƍ#H2|yU,F%It˖- WK2x5׌;} FtJ$$c-t]駟¡rΘ~ Hܮ]HuT՗L& J4B%IRUӴN:eZ HSb_dD"n':~GDOL׷nڤIQ}Ȑ!͛7;w?пp`>x6%J[5Ar.߿i?ڵ٫׊+aC݄]UV~`떭 4l׮]MKJJ1KS[lW~8bp5:[@TUU״D<ީS[o8{RɔiChne, sawڝ|PZ[6jԨueeM6-.*ޱs'"}:vhڤIIq8c-Z ?AUt*- 犢\W9E9<NI7 0'Y]$~ͧHeEf D|cq?ܴIMBP}ŹذaCc, ?p@Q#DTEݲeKZjUZiӦŲ$B8P DB{Q dA#gٳg](w8p7\\\,I#`wFN}zo 9r@Th#߻pozJLF5OQ vQ}SOE"JbH@\.  jڴeC.]?u 7l8gMXᄑiMHDgzUU5k^\VVrʕ+V^uU~76oޜsw^YgY3FObq/ k?OgXtЦMh[QQ?_YpbaY2MhVa-_|??(Jݑ{5e@wy TF+UE%xE%| XKٳ,`nuExW3JA1***oߞֵ?Mtb8d2SU\UO8!Lp ؛竬dfi'pևOi$VpΏ?֭Z7nX^9sf k>2qbjKE-ʡwK? Mr%bO(R4 t xYHȔD9P3NϤ:f27FiD >qI$* k8c~Y3gBSfs;TT._\lXעe 6.ZHώ;y3gά[eVk֬Ydɴi|>?"^|/Y;wbŊk^"ӾNU+W8ఢnܰ曲\TT$ #:MdG&&@rHεO8l}=&<-6'6ixٲ/:bc|Сs̩Up VYs*晧SgIe_$zue?@Q /Ν;wק2jԨ9s.]ҡ#O)Cnݺ5?w!nU8%ۏ9:1~QF;+** vt$uN<ljEk9lOQB4a9?S̙v}njӤqcD| *Jyy,"zs;vLP(Թs:|wZ B`sN(;,[RL3bOSJeI[F+[]vcQC",Yn7^lo馩PX4]ׇWUU](Jƍ~X~YQo߾'|s~n]7f#ɔs! m›O{T %X݊x{ǺK&f.m5m'F5pc)c83"Qd#@JQ&ҀH@ GN .mԫW%wh_RR_n՚P*Q:^oo~`KJJ>}{֭[wҤI#Gb۶m[IIIznh4 #G91d:>!AAUz`*?~JiYݺW\q̙3YHU`08pРȡƍWZZ.ZHu6l0hX,VUUQRk+DRәJ}͢{!4J O<Y.(+"Ln@VT:cXlرx믿~D:%Hd۶mΚ%nl޼'#"LX,JUU .( G>9s֩3b.]BOaTHz]1]TS3"]p#PE.]\5eʰaCNyO={w 7|)?p֬-Z|M]tԪh9 ΝZ&MEP(_g͚%mѢUW]E)F\=sNkH$;Kw$ QBH0;v3O\u^ JKKnjݨQ+<{Wu{İ` r#O"p8\ې!"D2 x:Ik`0Ҫ:9BĢ͛7u]pRکsL>lXR`>WTT4m /úGQQ<#)*ʰ{QFZn={laCNEaQr0eߺuk(;fرc~yM>espQ@:a„W_}5 VTT٫gϞ›Gg~0hܸqbf\r3 @ H*Mƨ {8G]Ѫ"̉_~Hc 7ek]@"`j:`L&LxW`eeE^z)"fϞ3ؑ8i`ER9BH<b pPR 3yխ[d"te!f=zǩ .xg-Xks!̟?_͟:ujn]:S͜5E7rK13fƌ|Ʌ\(;1݀ %'n NH$i޼y_|E:7xcϞ=B"OWZV6I#F|޼۷שSnݺzk4 B\0~=o6r<:u4j(I>Y>l޼ٵ^ۥKǏ?R2os-..馛ڶm+"4#GyK)!Jcs"A˖- ȭ[g;P XUX`|=DLN!QjeEuP: /ϟ_T\Ttэ7}Ieeeݻ?? ͟?ѢET&#Fܹw[o1O:N;f̚d2|A"t(JkALFR)!#GVVD,Xs"H-|>רQ/O~}zp$R4xO?T@yyE^󙧟 cF޽E_T:cƌF {Mjцn%:t6fꪲߗC+YUƈBdGJZ r"C޻pFQoIWe4e# :y(M @tKSi3*0 v[m&M$8}c!{E^z)PJ$T;wƘtJkE֯_9VӘjƌ#R<D%Ag\֬g\5~gX,sgV;2+JX˕+Wھ>dV)=Iڴisg*J߲UU"rlS7n;@ \tnu1c$#ҲSRJ +W$wِM)Ͷ^G %q&7;qLUCI$QIי~/Hk]Ļ'N)}:mH LdSJT#‡(2w[hP\!bR݆be:$N]-I$hJo"E@%k9p0pX|GikX9mrѢE`n8/bEi߾>&+2 @3q[)˲Ȍqn$IF :ōbD2cBKoE5vi'Rt3:b 3f4xRu9Λ'0E9sLg"Wh4H&>?j(,s.Mta"'@LuE:M lgKJX3 0ڎ &N̟Gaɒs>}r,..VF㉸O]xcƌ}^f8V9E4˷tmȐ!ƭh ,<}> :),˲:Su:=|1F(9%&gCھ}ѣh<GEc%Gl~,s#j&s5]5MV|LSeYVf ts$6wrYĈ|ɖ-[D#P2"nݺ :b]bDYMi˰(]wռys#QVP3$0G|bs7bOaڕ$Y͝zqyBʲ,87EQΝyfM, &on݆ b7ym۶duǸƴ{a')I};&ٽ{!CP[lj!* \r9C3֒?_JBF{!Ku!)0yCԈSO%*] zK83$IT9\SrڝLYKWݻ 5hqˠ6 (,˖bv4hGψsu0a3ν.6ǐio[3Ƹm/#X4!f3f%8ixoݻτK.1)8DutYVDwٲex5ss t'*dAQ.'m` [q`f<-lrlӤ{ԺLlcX2 5%4hkX1̌.JW\pJWU4F?ץuRÿNcoOlkM:\,ι_IVF. RΖmvY>b ֋1<ϖ+>UHiP]x7t( ذXnuә Ƞ9V[*agV-ZK&TVV3fD<){mM[4OǞZIhe4(K8ъv޿YG>

n3!н[wVsjϩS*Z8lCD⸠π?VU}u+$ϚS'W`(TYY {v8`$b/nLrRB SJdوWtN#RnP%0| x~{!Gdž)?(cAtM(uDEX2 +A_tۂ !Trkgՙn THY:æA2304r Dm6ጡ7:Ygb̘ÇZθu!'L =9xСCdrѷD1˛J lȒR<ş&!6(]K$Py džme;7<@("2; CK>#hZ: UVVZ('3Bȼ?߶ .A"jϼ[Gs0UɃhn&4;6ے[@{v+g"/N7"EB4Nq$ȡ iJīa-6`ǭ t"2f9 kzBTp]6k|l>GW07},5.&ii: đo!v9ahZ5G-5h+BAiԲ4T; uSaB 7,zBoNtES[C!8+pS]h*q,&̹sLXo0t6k àH-~ωi0$5-[-[N6M(,ӲiB$ָ %L`0(.p2ο BfUsQʠh!h- 6Ѝ<ݦ`^`c-jL sF uG#jT]hZ: :qŒ d vT1<v6V1>om3WvX#u0  DkcL~!$^,"EiӦ rFÉSs%峥:ABPѴ}LT\NSJ=T!CgFڇKM=ݧ/rHs^RR>U`\id3iuciԄs !ZO I)Td笂921/$!!Eo6,<7mpY+M"%JE-Iku0;wB1ڴA--$Hk3,tZD +ךqU@ ⒞-hH/HDr*E"Ƨ: f5G˲D,Ix F21SMq"y]EoHy"",33$'A{@L޺s9cMe$喗yqªjɇMݤ$Jӻw΍8Ab #n0 $pŒ5GFLeBڦ8 yLÝLEBdb7vԸgQUULXfkN`\У{n. Eufj"DC6o;D≄D% hCd@ qifO7ˊ8 9j4l98q(>@"E p@BtBP@P%(CPӄ^ 侎H$"JڂkA)%ZZ Bx\='kr̖,'V|'va0[9"-aʇPF>;*U4#e|,dwXNcԙmsU=3'2tf(/ɸ~!즃s[g  ɔO&6.G5vClI4+lc1qFENs0zS8`kql똏{H6$Ϲ0 0c~U)zsf3}#5 Pqr9G38MInjWVmM6l9Dna\@ƁIX,K8PIsb)3l,oٖ m!b%紟-jϩeDOIѱ ȹp"yUXo;.۪mG6Uce׻ sꂆ sM1,\Bzyq.ab8LٴW: (]:؉tDM"|c = 3.s8Kpm_Zѹ3V3SƷa2 i:1D.dUUdNѡCTUr͜Hڈ %V;Opp/ac/rsr! 3C>UuQjt9|yw u ]G s*)d#[5әx,KxWs bEΦ4#|G eH$raor':"e]sG3lS`v7:dEUбrYН%f" PHAGDlX SqΤ/+2MQd2(k8JXs(&T~'5^!rO36?\uXi ^\Q?N JL9:̱ *7q`*ĆI(k _jh&G٫#&~Z c*qu]<'!F\Lዡ u) 'UsI}GasN'ܞRX\`ҥ;rm}Ft P}5_ŠiqWsİt4\/8#6'"! VUEѼP|J5M$ɸXva̓tZ]ϵXoLy {7mp #? lPjxM ̐Yڂ|ʉ' QкDk:"U?$"[:s:׶Vj[mBn-kmնVj|#߀ZPG\p#N`Vj[mmնVj[mm\g]%rdD?f],׶V7#AjIhmmնVj(c';VABNg첔!%A@3;nqufV0׶Vo6 !sQĖLS<dc5jGz]K?V y"#+ R_՚ź>q-A?y$Y&g CY y?i$$lĜzȿm|aͩvY9RbX/)a$V=(q U{rx3(U'k$Qҥ$7wcQmm3)% WVCRhLzάVp>bzi VW8C$nz\kt꨹gIA2磼blbk.lDC7oS6<&0<;2a[$jQ RH@sŵh{&}t%wߞK^'M3S6@!pO'3qj[!.uX~+ /=9&I lGM؛v=1RUQEEY9V%r5fY\j[m?Ӓd8t:-˒$`޴WcYFDx9zD5,W$8{7̏}NXl7JIFaϿ:< Txz-W/xQ"RԦbo0ܫیM̾_]9ǭ)LjvRP6s%W&d練U%*Ӏ$oWus$^\V5CgJ&eұ^̳co11^d(PF^rB&974ko9b!toWykc ]3wzz_HεlU$."yAc&˔ib`NQ j??z@!%mB^ܨQsy~e%wg`c@Kc! &F8r[e!VGCg,+gteQ >+9e0n[ mn5xGbAW[TucԨcϿV}#sD u肛d4倡zȅ9˦&RBpG#VmC 'd0, 2Mkl0tvT9aܟSx7sΈ?Y8:TseSʑze e@5ڤںBn))0E]@ntE,V-<;"u V̍I3Ymjy Egҍ$۷|@tke,éBKnt+`paCShB$$ȂEv$+ 8l-xcَzC*B$*pdjF-d࡛Ca̋ycSJ .#!&^:,(NpիUO4]E?otVJ'tʕ+uuY55bτsnM16z{5%qNyeoo O95!gڂw2BY>78"WϪ[ 8Y6{B+ySqcibP&Hh+CD$,Di(F-4D `U7SX2=7RBp@8p%WY/AEHv=3ΑSkfzY _^AoIq9ǛSS8¾KsIrsn qGf_0N9'IAs׈2I3\>D=r,8tsB J)cszˑŪ{rMDXuK1Qdž3qOCXuZ " = DVGXqNz%9BuG Dgu;C+T!A]vؾ qX]Yijw?xݰȅDB!"wY !d=z4_JJsi$I1Y@*2 β D) yɘe%DXOPJȵsN[HETal" A2 Ibڸr~Grhj[me7<#2 J jfRU}H 2 W,_ȣ0ƄSHf13*QInvaⴴ&7]`PX׾i֒8e}ΑsF$IθWhn]A7Cm)g߫g2Z"&9\ $!8%6݉6b8"cy7cݜa~'K3fD.vPJA*rUu. S&yl[@2|NB3K)y'\RBdX|<$=-saf'Dk([˖ULԛ`Ȑ#Ht);΅˨rX/)F &G(di`X bn//T #A2t4b^]d2&cCRB%I3dp6baYfZDh[,Oēsa@,Mɣ1# 4%FÐMy5C@XDayv>Є-srι}RRh v+!L!Bq'rx≊ Nn0.+da%$W!LX")1 =3hDBB(A"TJ1K6K6#v,vLC@ĩdz{TrI\:('Sɀ?`/kd%! &d3d])qR2K%] ( AU o[Ƭz6G>zfƭ~NB #YAHH$A7{ !pcpiMΉX K7mT7pti,}F!@HdYc~0 C@In,m"H:~qEݽ{L}>(Ys6{K$_~9'|!C8g0zp߄C᪪P8BrDJ*`x gip'Z.ٳo(ԔyMAoAlb㘹c>+맶`2bID_6,N. cwy#hvuIEg$#rJ%$ 0 $|W`svD 9u3æ) Ӏ9T+RRRr9Ee=T`>eRr+#`a2mŎgNbY"1v5<Ӳ8d(,Mok"X+3&G+vҎb֬OCNN%2aj,PQ庮v%FMR-"Yx93N?Ou֔HAҹ[phį8;D1"%Dh³v$>+W|뭷!{/& RlClǭz dY;"q'͌:unt\6'.&HBq!p?#^,= uUTVL6瞳hI+إ S1YӺ2&UId#y9g3HþTqLn jȹu/&JK>3gǎ]zX{ͷ|Meee"Ş&>:fi SN'm91*%[!q1g5/A4 H sD"Φmݺ?qΌ fޣիB1cм}&a6~¯ʊx!Cnen1 ٲe˧|:vq䚦i֛o|-]]5Y̖Œownpn&i}sLc[1r<5 )\6TPꇩ:i/d,!̬̚dhl澴h)HC2[CkeQ ǯZ:3LNT* W"/')ƘBYg,jUl_h"MļÑ#<"KB"ϒЊbL99` ̈)[Idƍ9=cЎ p&N͡1߀3^f֬kV xꩧ&IJ yBM KoKXS$" -Y~lKB@ 駟~@ߪUѣ4iIމ#< }q3VdFL> 1!q ,:\|`欙N;/RUUƙH@3vkݺuFrINJqhǢJ9!T1ƙYh)`-e.\"9Wg:~/D2QRR'ܸqH$[H%z~R' 8p옱ᨱN!= E%*Fw5 י?+H3`ShnVdʪotΝB?jժW^yEؕqVʳmA~΅GJlysrYbYG,ibʗ_~G B3?ܨƱ1wPZjժ%KKp`,kCE{maÇ!⧟~ Neg?37NΌO p&@I^|-[D޽{3: BaA[ZA'mYTdO>#<ŋ۶mӨQcJ ڸmpR(Ik q8~78? #@2J?*ˊ2D(EDI6<#eIԹXX?`싁{# u881 DPdC1s75k>dȐp8SOlbaEEʼnDܢ5ן,D;B~+W$e˖"UUɤ[jJmݻwz]%#F,YݐC$%ឪ7o[n׿5~x]ᰮ?͛wŗꜛkrB)p[ dWkg6u&97:qn S9Bamo@=dS9&mXxV,Z>b/Y]]5^+ؿXx~dknAţ\2^T cLe|8猃 @). ˗eYﺛ#/++iM踱bؐl:ۯyQ,}0a49g"T̛P‘7;S 3E(r9dyG87nݻj"<25@&v>sN:u߾}/bqqQϞ= 'Dr oXoʂ3IҜsa;fKR~O81Lٳ_lԨQ߾}eYq~hGD $zΝ;Lw@h-|;3]&2i5h1j!' 8 >.9cR#R1n5eysv߾}7neI(3ˍ';zIS])d۷o+c@0L}ޡC#i9S}F:z(#5l%@γ_˺q_x[6?&N8\~7سwOz Əm[ ~ /j2QӮfSA< Kqwyٽc-c!NB'ɂlxmS `{IMڻck@ \ 2(J]ze]:wΜ9%K$I;f)x饗vѺu뮽V$YP(N۹s?8< O عsG^J駟knIԊ{=M:w|e!?g} (_|p{ڴie˖NF3fΝ;_tEp>oRzŕWl*}G} 8S &+ Y5|$@$t嫅 GӴiDuH{n ۵k-7=Ç'L_=>X/++֟5k6ywyǟ~JRU.J-_wq? ۵k7qĒ/bѢE$M⊖-Z(Z`ytwqqQ}> /ִFdM>]wVZZHZaa;[tK`[n}@ PQYY/1|:*!{KFhfFY3΄R C^wF.\{C{ho6_~i۶e]&Q1;9 ,GW=}NVyQ1S lбl0dmUS˃b}]v饣F:.|9G>k֬[zϽlٲeժUl^f+,ڽxK1{ Ahevt]Ç?`ٲe[nyn9yfJi ؼy}7a„3fB+VlݺgΜYQY3O|gtC,Ii/O2w޹z?7-."zUVTg矯Y8W^!IҾ}}ݫ{I~(u !:cTJQBIEeE =w9>ӥe#_Ղ+糺[n>|Hr2cې1֤i38G-**(xHQ䣏>:{1cLmZ]_}VZC_~lٲoee֭eee79s֭[_z'|r̙|3 CNF(<tzԩt%Ѡɰ6@ rboZl{~c=ֻwW^~YQR t7p g}vpW\cUUU͚9+R{&L$i]gqC{Z^z)S<Û6mZ|}z~'oqq'|}o|>ٳ?PNoiӦ[nÆ t۶m{=Lӧ۷Ouƙbٳg:ֿ<[YFgKXլYFq6jo["$_ ݻ`M9O Bwl?yڵk׮[ӏ=^ϖ͞=h9R>/N3wS},Kwo֭.Çwmɒ%6аaH8" 42e.&wB!d"SB+?kT-[N{y@6pW׿&N@`}w?ߋcۿ\{2>!r.N=  ?q{g՝={6|ٲeWy睵VVT"q0dgnrkY*3ѫr 5'N8鏓&O?XȲdɒs=G8p Z Zjبa ڵoשSu떕nIӿ˘ѣ)#Fطw_ZKWŪ ڬYeuC}R HTb:SdEw_1yrϞ="JFzd6Kk-5ܹSUU!> Oxo5jTJO9WR)D<餓$Iݧwr׮][vmMK 7n\*w^Q@Ug+޸I:uJtR@FhۜrT17YD?&|74wߩVqοClѲN駟rhU mKBQhPx 4ҥicǎmۦm(Zd 'P\\ܦu-[nܴFUUU{G‘@,B[cٜ9c}ٜYf!fL_xф ĉlٲ{]oƍkӦM=7nاO3gΥN|͚5;3d2!ʙgYT$ κukP((8VxMĦv#P׮];iҤS{Db^x$I ܷo_EE 7m4 vN{^Vl׮]&P$)JZjuJopg>YMֶm[YvZYYiPl3SH~M?xEݺu[b$I$;VU՞={ر]5 ڽHӔ<$dg}/L6ުUC~=hР͛?͛Zf͚vѝ16v-ZPBzSdIUfg4 c^=q,XvdD+Vݻխ;`UUlZlٲezE@Q`EeicOek˵w>yPxicW\FED)A>d*YQQq.謳~QKJ۴iӪU6& 3v:ٮ5a'@9 4H& !RUU%Q\HV|nKK){(4VH$Ҳ$LE%@ZKSt0tGHI'{  .'[l,''XxJ%隢(p(N)@ģԬ!{V.|[@@N@\eJKM[2kԲ5gc~|YsHng :T:bΜi!t@jЅ9#)xFz5 rQVsՇĚkl2nܸ{Q0.r)9Tdq"Krj!=z^z٥b\do;}~ߵ\2ZJ@*Ҩ*OVdM(۷СC~폄#$Y Bi--xHVT |W|b*ՊffqZuDM4c~u)J:بQx<.Q`#Y$-QJUڻwCk 4SN(++SEDX<ׯ[?y~?L Eh̪B̋<(b@0СC.]WϞ=_k:ԩs'ahРCeI6/2scX8$)k&˲_uMO&3fx~2ջ!CO?'p'8-;Xm v"DE1`Pk뮻u&Zn*ĉc,麞L&J_~_}]tiݺW_}uaÆ`UUN:x\D&X˜Hy Bi gCEDz^zM44];\~X)WOe39OXUU,$ٳgϞt𗔔߷qJ$YRT≸*PQPdd*I)..޻gO>yaJBO&H'$YE8hUÆ UQ߽[wD7aũtҫW/q<WWŢJ v۴RԒKN_ݺu@$1.$Q NA]:Ӆ"s2dc8ݧw^=:4sg~[onw ^dJ֫W9*"+aC8 9ˊ fĖ PҴnݦu*:|5Lbk M49UKBQ8uݻ֫JTUtRJJJ@<d) k&.d?`Pg,B4C͛5g1խwAqf p 7|gcF |cM$={|ʛP07X7ߘ|CΟ?O4_~ 7ps%1ǹ'l3Ζ-_6yHcM4a:s`ڵkt(9>=y=N >߷mۖP܈X/09T@T:Jxmk_~9X& +әmFHDD,O)c:Pp,H2p4 O=WBQᾫ#kEc <.j`Y[s7| ]vrso;^ZS٥:\kU@Ҹm9h{_fձ{l-xv'g|`ŽଙZ#bmW| Gg"Pm۶HD\{u`0K]Y4{ 趮M5HOlSnYU3TE$矋F@PWmܸPB% 9Dh ?أ¡D"|~PC͖N~ʮW^~eW 9x,)8d^k9"`qImD>sEbɒ% KJJӬYX,FK+;9 (?q|ʮ]{ƍׯW~`:x2lР$:cƎ9b%h~$BWT#JNI'^~D" >!d]P8 ii gxB$D%T^z֭}T*K۷uֈx۷o/R{=`Ç?C-Z4oذ﷔,dhТd@p8ԣG>}zˉD"+(\UU 5]۽{k3߳ggyFӴB^zGP(TQQF={ʪEv$B|C=tm)e'u5F%rm]r#xD)>l4 tN:N+x#'߷ĪbuJXV$I14K:7h=#7Nu֛7o~:vLcLL, ݷ{Xl~q12 9ywLH.:JiΝe/[+rIqI]&Oɤ篨@@YtJh:C`yFo>v:w\Y֭9rvdҝ֯[ZZ@fӏ:tRT0L&Ch4*Iי?l0I && y*JҔ{nnҴe$lF&°>\TTJhiR]j茇uTګwy4f]uU^zcƌ9D}DŊۺuk뺮J,Ŵ8".EXeY;d'͛ 5wvRٱ8!DX7nd1,ˆ ֪&I*t8hƋQI\[R\0m KEzm"WRBx<^z>9s?E"\|IvmTUp8 \ܓXH3^ӵ+V[]tСC7|K.9餓8f-rB5S6Xj G{4n o.d'3X|q9)Lo;G%T@HBf̘m۶Z~'zs=3.B (  1.AЯ~I)D2((!2JY6{<1wr3zQ}lmq5f=M d0mF 6"@7Ǐ<럛XSNM/U^* i!|[G'&cr(f} 919̷m%}pt-K,I9&IGB2nݺZ%I*.)2xF78slyܒJ#`$Oֵ2̚Dڴi;(m{Rb(6߂]TTԼE3gJ~w}1L&EM D%ǒoO˲,|k"=y px0"zk֬/,XСC8͛C͟?W^U;Gd-_Jkp$(ڷ۾}U+q%%%BguA{x]vI˖-ѬǓc@,15NEeE2\paqq2d7|sh4駟<(ZmҴɚ5kc;۹}X,F+@vvرi&UU~2wW pa|IUUiCϟ?c Ji0,**5]UUbhN0+MJL(h47xU+~_:jذA^~X=,I@@tx"/.).*=ztiu 1cOi}Ob;˗o۾MVgثW/q,GEZ;x5v8F֭jKUf:|h>lee,Xpx<_[N5γLa0`ٳ5n԰QC4^б֭[׭[J~Ͽ<2ń:$ v_r%~GEEu-Ĩݺu[jU鴑V-ٷ(7zӧ?sÆ [t7o`Et"K2Ɩ.]oMʲ,D{^pC|>߫vhUT$Im۶qF94MV4h޼g}Jvر~>}:f4, jz5s欙;w#HݺuhѢ;wB 6tuΝׯWO?Y`m۶֭u}ܹEEET.g((u%E9rz\ZqQļJg:!I&\dI*ZhɘQu# 9///D0` w?쳁&ɦ͚[N_fiOcYbU~|^,KSâ4yEL,c,?ӄ  9_/[DoU'Tm6vc?Ӭ\f?S<:`1@@0nﱵuf0eW#E2>}vl/.--|rK7l[oARv;fNsZ_zޏ1( 8~dTrO2womxvOx?@dIb1!)xy͚5K&\pHf:tsH$w/>SW_}ȑ#~hѢŐ!C=NZEy )DƆ N<>xWZn}) 4(L0 Lu]pw} ˪z*b5_Rȑ#toW_}^5-jj̘1>-ZڵK,@Sb*YH$&M;s=s饗f͚s9?c;v<)'p+r 7hѢYf¿!Zpp /({9 'Jn@ 0lذ`08~^{+..ճW|>_24r O̲]^p>JTJ&( G"S\O*ִ JEQt*Ig=x_Ѩ֥K-ZH8|YgݷIt] & DV pa딖tM=X~TE5~C0~G3KB(CiKf"2e85Æ t͵S7o~Yg+z aO$,cUUU`0qt/~gq᪪8HDLJ(}7y-Zus}'t]ڵk~č_57JIbȾ>鴢(񲲲+O?}."BWTUUT*$ZQQѸq;㥗^>}zv?| "K$PO>Z޽UU;bg|!;w֭"dfذaOm۶v#<2dСCs{o:u:u$,J͛77/0B.첏?o 'Onذ Ԋߏ93mtk%.ĉgΜ)5ognzر=(͚5޽{8馛{>}2zw}w޼y$IX "&NSJ oR!Cg:u_#lHVXde &k~cǎsϗJ#42 ?^{/rIIkҤySOq;tpg b=w~wF"{WU{H\vN>}ԩEEE#F(..\e]TC~6.2a9JRw9N~ڙ&޽+**z~u։J вem۶թSUV~_X5=dr…K.= dj#F ĉ'Db~SO95 ǫhRDLP@p[#:M:C H@®lYrM @d;qqETBMΞ5JDm#.,T2tP9FGP(cȹ.ITlo6w9r@TBBdp CkE,|캆DD0" L -l$zbȫʨs$@r%o3]$chN)p]zsܕ[ϽIgQ.Dr*Yuj~8en hL'TB{0A*K>Q]*#{O 8Ygd#R+[8GYQsɴ˘i6SIU'#3$r` (D83U]@8'I$+NЦu]%üD$ 2 SiU]uNnM(8_~2YVdY~/QTeɒ%|m/vܹ={<3]ytG>WB??VdfnڴcǎBlM%ɸ1:ĥb E[azxҒP-sS<[zT^lZ$IB1"HZ#ߌ1qg9,H4ψ~cl@~zR<,uő; Yei5 nOYEqFk-9sY=X9=-FIN<$K̘LXFj!@8""WUQ]5]7NJJ %Mէ2T9{V9rI%Y[Sهh]@lg`b1[ ǬEVL|0=FYwΐK'p~k ;1݉0o֪YII`Q',`JikQ)Mx{^9hx4j 0uKOns=סC#F*<7tM7Tn] 88an}8`gb[Z^&E>:Ϋ4JkׄS<;.lكVԕiNr#`+vRiӦ={4-nGknNNdXq@!'Bpѡu<}wmea&QKr\`;'s\g=/ϋ~G!udM=cwyx+v뭷|>?m4 a:qRٸ;i37̖ (PFx905F7r/>nIhKxfLO DԽHCyrGJ[C24jbpBuxExH&$K2x(ujwtu}ˀH,wӝjU(;6nڗ0," ~\=І1*8]zQJ21" :DD{Y6gEF!Fip3KAw@׼ H@r(`P+D M\*zKsX'! Qr^lEjX&7@k4~+؋)"~weeF38S}>ߚ5k.ns(c]A- :\Ik)Ѩk*GѺM!)zGHִ=Ҫ%B6y${)^9eKqaNEh`8"#@ٹ#Y 4s\0q)5aTfDA7 Z]8(8G̅.]R)u.,;w֩;ϑg߳epwkԜ+02'e$՚2nuRlM# 5lذy֩@ O$Ç_tq(;Lg42D[K#{~EI+$)PT {k΀Nds!\@B7@Ą1GԸ~VX ǯg  ͛=\d lǛ P.dh9xHFr )@@JB`phW?a%MEI攕!dw޽{v)dEEEu]~\fgÌH V縡 9s Ĵx]$qr)N{os-.e.9+Ϊ*8=9 ĩux-뿖\]|lק716v-wZG.τI]ãlBD55H=nWIu%SvW9g΄r(ILVQj 4E,J~;adl"rpNk5&;3ΐe0fi ·69v}'6 m-u2uWG,{);5 ']43zfKtSOi&f=LT;UgSY{֡3<7k mc,d-9)L|lg,뀈ZO=T*+E@g-^"BTUӧ}9ܹرc4 xT#fz8=Of撧ene.{WwX-0IF8K[7bpΣW^7F|SO=uԨQh+]LE8dL0üAET()E 敻w3=@B$ `JO2R5JZEx*Q$Rd:9G*J5(HZ'@0|qT A@4Rd.0;P8/4PגH%@˲U@9 @PŸC2aQ$VPQsB5 t*(4U!$&A =24IQH|#׮ *k(@ Xң%A J@Y'\mB Hs y}Et>P)KeAPW"\>z ~8L@!E$?K$$H*@H3ʉdVR@ sdN !ZJZZ }iS@a+Ep @cRNRcBJ*"#@ia4ܵRZظ΃JR^@@?#!9%@$`K ; 44LT)%zʠ1EQ~@ _g`h>rbH0@H: 1B:U8s ]g< Ռ,%Ra{",yFA|+!*~VL[i "r2ѣ1ceSDKDVK vvhM2A3z߲ L#X qp)Q##TB?7D]Q'Rj\C#Ftl}$5S_m|$/zσ6 _/ :Nݼ,P5 oʳl[Bf}OpdTԆ4 J,J굼 :S2)*kլif%EQO赻'н^PIV}t(*, 70::;y4oQ/@~˖}UoRN0zstnZeB97=F$_qet*SR'? ~w'mS8r޿Nn]L!ZN&@qH"B%'GSUU M*goװ̧׺s|uQ\xǻ )r{ ?#Z4z?jA_9kx`ٰ+ՀpԈV=Vpb>wPK'W@DQx3;t7?UVV~ŊE<}Ӷ#D1kMR\ 99.ej;<<;~ZKmFeKMxt2BFdbĀ8Cb crEG8xmsy1WV$p ÛM!*{99d~[V5B<8dRb3ߕϬGw:7[:sfy:hD.~4Mz.j |><=] sѬj{+dk Ą{+bL:. b1Q'B/W3wuYY?%Wsg)̖ڜk, 4gfm̘yt\Y28q\H** h?V@q w85  ww?wHR’_|Su ӾZvwʩ'ML#}/v7|ts_[Vao5glN_:uT+%]>hu/??v{*ssBii`|ϢLrDs7} NiTk}%|wDJ+S,Yӆzm&IW947\R.3:p#ė7-z]@ġG7-\ضbٟŒN*A?cŧw7J_ޗG 0ϢaI[SM?^q @yb w{/?]3V2D*tmDP>k @W?7 (QM۝kV (@F@^Ot?o5}#Wyg6QkJybgsgu{ /~쏦tU/ZˏÖ_i?C_q q {/O43ӯ]:BV\Nzg5\Ƈi觠%Wܓiehnc9kK~ǡyӿy*e_嵹r @⦹l_8'i}n]rHοn)/j Rw\W1N9 [mնk׶j`Xj01 ZS\'8],?e ib0)yҟr 8⎜FyXoL/f_Ctٙ^?ϸN:f.g3k+y\,z:( zk!>Z?N?ƘY'3\?d|#N,AyL5]{v{uadžHyE9"ʒ 0l10Z:|tJAnݴH €8ϙ}o#}0*rhٞtb^azOj;ͯS:?θf=M\@YbKg[s|<|y匉-ddLݯ  )Д_^ρ[-ñ/Ǚ <%Bjշ8NvcqJU^sKkI,:Lj *¡lzG r m73tR1OzwT[M?<Э? 'qi !h(i5݇<gƉD3L>ѯ+~~17$ /v|݋{kCx̿69 EWrkWD]O nqwpP0~Ddۇ7^tۢ z٤8g} *-RwǻR s';ȝo^b U}k€ 'Ti-rja)oozM}(ns[@B&Bg켙c`4H,GSK~~uT 4InƸbRZ_֬9|KIY+>[)tvҬkHLi \zثr(y Wn?"YW'HMoX3TRO{g>:sAmݺu-["IP-Hsd8I= vfx^WWA)9{qkљ&& DRMk&CtEhA:АCv,ʉ!kIEeZ @Drn3ysw+qCѱMJH ;{|!=˭@!p8TKUzo0sG0}A )|Ve|&m?bK\RhQyF]ҐYʺ s}4κf$5 Z})FhP&]>{`">~U_ٌrbՃwϋS}\34u٧zhNA(uo- uΝzO_B B Q )-! ԫuviLs| ԿC8$Af'R*P coCUiH%=|n9 JA@;ntW|lNL$] (Up6hԚ~z@+.=uҗ(€.ox鮗w H4tzPv=w8@{M36E0Ү(#]umJeu8,?j]q_#>oOϪ$Q\=uϟpR$#~sOڳ5ࠬ}oMyf$8c͠9urA1&Ӟk{ǂo12xgqvE[Y&r )_8+ ۲.+x KF\%N;kƯtJO>딦>7r@ػ@+3op. TP֧bwb]<T P|؅p콾?̜9q wL{onhdrd ÷Qr-FVkt舑''Ή O~q&L=V>|Xǿ+O$_/l`Ȅ.y' .G hr8?چ!׷e ƙ&dWb%6lhք[?d pgCh EqNBGMEjW.xz\鲑J!){#|J U>-̢Fx5*ǫOڍd{T]["(׹'󒛝–Wgی2gY5\(x&BB -Q{z#d"0b\9IflҒ"9,d(j?qj#B῜vp8f3c|-κToh=ј9n5/)Qbi@(eηF=GG";:V=@*`av2o٦Q @h`߳Ԡ>`K_mFc @۞-I7)`%Cˊů-vk7XG8Bc(Ff1Bp3$]"F)M!@F4 lvCw_ϣL0 2W.A t}t_P$Z;5 mt"$X< zꌳH& sftd bדN&),cf-}`I%´_J>3EQ+Qw"jں̯u$3.vSZ"U. /^h'<c5Bzd~e~є֤c| tg_ļ ^z9w^үH÷ߗeBU{@?C ͯ&{5oz굃$tS(W~㺅H]۷bVиk )f쇕[ 4Idd0hco]wrVwxLRJ. k7@Pṱ!IPɠ8^wJ- aݺueٙlQjNt~H9ll$VXUE唜ѢZi)VF$:uoHXG5~E a)mPej?TSZGZI&B"Hs`y4XbYdڅ{FHgܱvzC2C2g<].K[om"VsjjPpBuj|޳f~'1sڳc:5ɕ|P 1VpԺϩldi 2{{PIX#2 g?Ws$qim8,K0%7*%mBBb[{i2┮[h`$i*qId %1@k1e0 +Ī v!NxΒB ;/Y (+$U@@ (TJ ::4m&kzN>e)kڬ@SI-u@W辂Yqkd i9ݨ_HQ!"sRIIq$)_b|7\Xڢ  ^ԤF+WH@*oתp8He" ,H d'~_ %02` -@)HHߧ>c$߲q eZ :־޻QOq#tfB40VL`%pc |탅d۱iGYǶ4,@-:];ËJ iz۟}c;ʔWa?3=$f^3{gFmvcզ ޏ&%dqDD  pKS"Ē2'+~ N[`t2!h)# 4j-{0Ul6_7]aصup@ 'THeV,jҼfAP0kÊHWt$C ĄiQD bժmh@QD @nLp@.%,rꨓn8~%"[xu{[wc 3Yr3ھ5ApĢ쐽6vmIp4)KkL?*yZׯZe] 45i=a.Utɶ$`^L$ZD)|@Ѓ|-'9Z"!ɒB04;+!z~ib"J6v`]Fp9\='PnŪg^?*𖑹sf\0{H7-K/+A$T.*z~` !R J`2y,()n--U]`Pl zz]ٜ׳(Q+wE-KcDMcdvfV5_q Ż0 XW?3Upwؤ6WJ=f_c7[k/5!iuwH!u P<'樗~a .h|p2Trv 8a!tF:J szs,z_/囕")# ]n?a7>M׌1!$Ԙp $@Mnǎ3` k@G@qMTXd`ܦV&R{^x+E2$(@0{ 8ki-[rqD8xMd )K:U`% d ?\1oWb6p'O%'{z,Xʼn }Ƽw}6d"24̌~܍)EI+ %"!w| dҮN@̔Di#R "$dÌW?3fP\Jb/ryjgY6K)K):! $CȥL ƕ|q(s-ߩ HIҧ+<'YS3l&،L11 $, DlᏵ~}- ~w~`­οؽS~EF:H<'$L`>@n4KteUYS`"45XRhkI֫>JRMwmR }|yv@@d@(˹="gar1d5,R=ݎb64H`XΈR~J^ ]}ݷT~bkz 8̺[W;!lR(>A-05X:o#FlS.hnI"aMN=.<~ҷ*-; XH% B^4 }M3ᘫG^Y="7B٬Bx_y'iDB}R,d*@!AR6" 4Vi'(tٯin *C* FZ6͒sFUݨϹg'RОЇ?/wJhn/Yu @.(L4d,_EĜ n\7-W)9LL ZHK"mN1J^D{t4$#pZi=NvS99zfW7펯#CHXqD_y[WڬX3%pѮ]3)-e40`4%C`~\H!A*ѧ J< &IIosXm"Rr"D L9n6޼AFf싺Z(>A "ZNPpJI;vP Fö]ktҸ#Omټ)E!cî{KJm|nf`qAA;\$kֶǿv.޷4M* <_YX|ad8(Jw@{:a ݶ{$3H]Q*+mϲ$dЪ9p`ƶU ,0BCǎL!I٘6RNah!c0$~*Bh t>맿j OPuɯq'A~ f?!#<kd$&$J@ >>` |EYqW.ʈ5א,\b"b*@~.W=I ֖;]Am)4:SQO2a)2oLmX[an ^eH ==&KeL@ `*{41,}hς}"{|`t12J֬^J CdȐ$HBK0Ig̠ѫj^괴v6N#k*ݔUxn Z5QC愩~_Yǎ[oSUǚye]{B*+GDzy%CLƼ ջRJ &%01 hJ:i7^<ہpӴ;ug謁0rL$,`H0 0$1kӯ/VJc5ZA$.t.KZ K DN)Г:+4Y4s/?A001k/"~6CN8mfG +TjGrdq;H }0ߛVTyS8b m7k ;%@r4-R" @0x_H@z{"|@},A 8Z&DO;ZҔ`,fcP>=yHCS4TgBS|,{R`@HBQ:HIce9K낱 tefau}v-0јDL_2 Io464IԐ ٬$ 4)^A c$E Qowy#[ua8v_h2R$MDLApI" KZ&@ȁ8S|R?|s7$|d̺'Mi^zy=.+DEF<.U[ڭzsKrmt' #IbTœP(K&DcirCfU5]iC:BIdI @΀PGpC3"= R\ =)@D4(  5s D"ADeH$pq|5π#vemҲ,erq].8Ʊ/ r҉yQG7F䎞s);xS4"J&rnin:C.plT{ 5-_mMipX񗐏7|82^k}z3Շ$$` ;LJ1,#P*.p Ov'8O'TЮٓ>CҤGA4\1c9p0r RQIv!1 L `1u?s{m}2qo[-lHi HT\-e,H Lݐ'uIi-FSr~Ct0uI?'1Wz` k8w(Y}U>[% )5L$0b(fie ,eN˖XN<`4A@9GK[m׎kx NLюrY,]g}fΙ[@c 0{y,HIe^1i[oݼymZlٴi^zm=jÆL~xYf' t KDRUd@T>@C$`MrRRZ/صkΝ;۴iӵknݺWMT"ʁRxʔ)k׮֮i{6ldbo` !#6U{wUTl09@=T;vFH)]ðyϚI&I)WXaYn6mN;40\[;,P9.I 1dhw1BJ!CEKm&k,Pfoo%0@c1M,RQHrA11)!c)Pkقdtق GlTtJ8\sG>w<[I,SV.y׼+L޺"tZ}]"ݻw B)н>sy^B5wnUPQ5Bz%"^z,]t5" RR!%|ڵ2<&<7-_JSݐ`q6ԫ}?T6>ߏ t@L̼dguo\8o?fUswZ`'գ)S95&WW6!lRF>CzA#bo=bM? )%`Gp֍*6\4gul!>zcHl-=u=_AmgH};:˷zN#帟Zr~]¡xlsZʈ>5]9Wr=E/z%K#ZI ,䍏zu d _ @f L?3D?#`3mWolZ0+5ˢM;vޫ$Y}< Cj~ҹ{[j->i3i9}?m:Р]~pkJ ĝVH`&x@ts%$IIJ9_o:gI+7oeS#  ! ` ϣaI:${Ȏo0`@b/>ye~,{﹋0V,i?e`;P̀+ äW,鑰os?hUkfI]z5.A1~syWڌgNBm+ˢ#~'}cdWF&0v鬫Z mD0AE 5ZյQaJ\K߽e-8lYfr$0?Q:鈌(UTlر7^0@_''&CW <Q_ ,\T!3f/3R͛7oٲ>C TVVEyY4uhJ$$RL,!DH@ Q~;j *S:xn7[hQTTԺum۶?9(T!EOJ9eʔ&MqY/ZiG}4us=7y!I0|>n̺aG. cɣsvesΝ_\wuRH.r @v:@J$y[j5`%z>2eСC !4MS=Ƙ"WVVT*ETȟ%*1Ƃ;ᄈq;~^Jqq# ! tבk\hH)M{ `;3d2YVVأw2 2[V*KIM6""Pl']m5.,' +++pEEE(]˗/?@ ֤;Yx]JRQKL`9ue=\W]?ŋO61VRR>%8Dzg݇Wz\Wof=TC5CԩSʺuEұ6Ms̙mZ^rUGqDH$0d)TWgx+)@MIpXroWiE-};ú6}GϘc_\>Fbߛzo6ְ{vcG=WW_~{W/ZfX26GuyW ٷi׶;詵:B`}›ZiW*.k^ǝv. 8Q2eO}x.[Wf tr.>#- kնsFa1 6bҀ喹Rj ~U [`5k6nZijޢ;^ؤQzt=#صlpԔ$A Cd!H+y^ҁm&΋mbL#Qtg -mIDX+|,^fؠ^|ȀF^pZ~3Ȿo]f60 Q" 1\/ԫOokZ5ʁr];Z`AcD@BNĶ-rVeK6TJI Glެ-f-e]p[L2_|xT8s̑R:[noܸqٲe1"q{l*j/!\d>:w)G ɉ#@v'~D+LIF!,c+4K)Xkt k׮GywիW?|Ϟ=u]_r=CMvgB& 3+; :t0)_@ZίnG4a8J4J`BR@Ţh:k^<4nYIMӓu$(@$i/ʮgl((ceE!ï:xUZ9& ?b<(8p*Z' _h :%AcKĀ0L+EWJFKT_3|uZQRr`@wPD';IîR~/%1)z,^ b *QX|H"~d+oQ6&S` Ufq0s@ @MɗEn=Mr#/TUH Eх@ `|歽Ͼ7`_Ӏ,`XhZʊJZL'a*,ّU/EEAP:gO."sQHX§qa x2 1QI (j$ W!JR8d~gҐ2b]?|D A%㩷g7T*W@` Qڪ]JS|#Co]+`FWtih4d4"/G^T?/ W5NACGZi]PPoɀ?@f̘yɥrTfig)oO"`Tq@T%L;W0$4@? 9z@- }Z 4~(M_P#?М0#'XydTi~`HHa"c,P@`t\ XH $ @:SpbfPH xaA^ I +`RaRQ:u%2Itd끎@PefTiF@V~6=% ,'P*M@5 2lQ l$@"à(d025]-X0 ~3 `@' 4Fqdt2%rIg~0լFhP>L0ֳW-t_ND$!l~A)^RLDQHX -8p4` (0œ(P@]خԈiJP{rN8`Yd dH;i0$L˭HUw}믛7o~:,5k֣GÇwcUge.& d Xȥۇ??51lޱ K8|2)qj4\nD3V"h[} @Qiiiqq];ŠPزm۶5hڮEr H$K}FUJW0=>c4y"Zf͉'x!SN5 c9c?8}t)eϞ=O9!DEE2;oԨyרQ6l0dȐw}w̘1D믿9oyGWX*vI4{x߲}{g*(8a„cǎB7 #όI)WJ)LBYJ?W޲e1c\wu R曧zjn>쳷~[qAzdrÆ o+6lxnZ?˗ط˾{.IBqͲӧ0zi\4}!:jD"|ɓ'=W^ӧOᇹ|)ԓ"w}> B\rgM8駟~$O5j}s΅jSïef{Z2B"nݺx3%%%?sYYY~ J=܂ ڵkw@8}ы/| PˆjY~ &r5M3 oܸ^:E 8~cޛ7o/ZAk{#GoB/Zn=/xYٕJ.͚'SC=_㚦ٳG KqȬRU/r0={_pC)&._E'n[&Y ϲLۡL+[tFd9r~)9-vx ΄N6*sׁ1'&@hvb4r ہi 4`>D\K`@cC#pXhȑ@z;^w}=c 8G`:*5@Fgbk%w͡ctfث5:UX:@1cL۶Ȁi@+=*FTyR FN-?W Va}í 8y.#r~ΔJf[ HP NR4 6nТJ[R}QFd%Rnٲ:;`a6oTC1.`N%NwU&.Xqgfx?ẻ=yψ&t3º1 H,jRZ͔JeM6;vo勖5сò $X֧rWH$-Z(gX,vwcٲeoƭzw~gWVqq[l x뭷#<ҭ['XDo?;v'XVV5뿚rV* lrJeׯ;c|M"x{SNN,C򲲡C{G*|wm^DO>)-5v /^ݹce(װhѢٳgu]w1vÆs)++{g?c !}p(4cv;v_om۶JK }}wߕR~7W.3^4MS5)ES~:y_ )h:Ν;۵k4ܹS'=؇zRIDAT^{_ ퟔrW\qŘ1ch4jYԩSKJJc„ E9w7i֠A>}J}-..V{F}R>hڵ*Tj{ӦMN<wy-D4bĈmۚzQ!:u4lذb꩞TN >}4nԘks޸qnݻX,6x={|e!^4fNe1dе%r,ҡ:aw9 H###!Z fYFҎilt{fdD>J`N6Jn6 pME CLC"m- '@Br+8F* x#Gkϥ=3Ŷ(EH}6?G+i 6Ic*)q$5NL#LY:Sq;qNw4TYefcf۲ 9"ڐ5rQLfd+q4۞Jg2>@f5U,%%kwyz{^v`7o޼]v\ܨ?طoߒ{wƍ7n E$>CP'|rQQQ0۴i]RR^{hѢc9AӦMO?t"}Ѿ[VVF$?O 3ECvmC Q/S5 H=e˖nP(ԦM!CpΕay=lzRbcD5]SqH$Աiz,seٶٶa{= }1Նm@f@$J@'d"n` t8jӀL`er2߹7=9e~nJܽy)Oin]qJ4lo㺼ծyO?UW]վ}5kո"RʛYObuU;;bNj]n梠ڝ WoclPB,(J'fݒ@]_a@a}DFPXĔ?-_)m:C?_| /Fmݺ_E>}d%L} .2r!4hqZ$ zfwDRp42dذa֭?3Ϝٯ_?vV|G}4JieRd27(wp8UVV~{キJߥKYfb1d{۶m~_~eEEEeektm۶Yo>o<"J%SpLv3ϨI{DTQQo. m۶Hdڴi[l)++{g9昪<Ƴ|8֠A-}]KKK_xˬuxa\u+OݓKIuM5MT3UuʥH$Ҿ}SN9eذaM4qG[I1j<.3w׷o,A'{ʤ^YQlٲ "2y<g%S"5"nhw(rmcME%@d) 5^Z^Do]Y'1VBvme=IW1/+e B;Y53dl1koD"AiehM6{7[w}irp-`Q 5˲s!C<ioaÆ%c9_;vlv튊$ ܳg͚5p\P(D^ &K*.cjtҧOH$2rȗ_~ɤi믿r.]x p#MkѢa]v߿7D9^zixiӦGN}k7F ѴY7 cD>|InWH.W_} {>k2kz;N.9 "@`Y2., :4{?=59:^luU=Pf2 BĐs=l+hǚzz׵Э.D eZ __fdD:[ڷoڷolٲ^e8uPSD UA$ V2]hʃ3 zuA \Y @")ru·[T\>e͜s9⪬) ڳ\M&婊jUJm(u%5Qs;ǁ9^'<"̣ٮNlgfNy`:J-2J+c ? }tI׆ [5joԘ…ĀBz#b</,,9sW_}&[ z|yyy0{\r=T<Œ#cȔh(QqF f,*=ЎrFȥ;N9Y ߬|Jg̘_{Ȑ!eeenީ.-[^{e)cq ӧOB/u1"VVVxxi\*o[/CT>/͉DHe-//Cx< |"ҝHIJh4"xLoV!2TWMauw߭SWUinv" u}JSqQ$`?&WY}?\Z|yǎݳ.KZc&`0hM7dd(((EcYqA |K0,:4`PrܫJ3A.oG> sB^Y6FU %Ur*''t UcQR\[\z?@6]̌H$,,*J(r#rD HPPaIT+X:\Ru]v…k׮ݼys&M:vxnڍ@!hYֺuw~LG%蔯qN]$Rv \|xRHIChKU_,RϪr}UeǦi%KtY wƪ7u¢8\UHϭj[\A˲ Vʶu79-H Rd ! pز3ƥR*\e0`%KoY%εV-zgw\cf7(T^V"P֍JSוz˕P#irv]3|{fKxvtsz _w}<%K]Ϫm-W*ڴg iwmn[)Et]kvݛy>BeU[uWZKyMiz^M67"38{'7oڜH۴i{# "J!I4#ҲM^g)Lw[{e{5skV7>,8eܪ:jK1QD*.E1 N\-pVY3uU ο2$UiR LE1 BP=DK~/mETΨg6mڴlRh4O(Ѩ2 b15I[)[!%XۑKd zyG4 Hf_2.dB"RΑHW^p8z{m2TZYW-9ˢk֛զ\ʬ罾W\pn&E@"ᝣ\|RHH ݪUkl3!aO>EÇ/))4M;owYy NF):z")pJp-n{r1Tq"r~R&X/*HnZ-;Yz"rH:m_ZTAVs̹S. "*++s媼,Mnݕ:efgfsn(S[D$s~BҎGc1-nGVԎ BF6fHRN8>զ 9nh˗WUr?3ƊW+aZ*Ww=xuVNwj3 (_wOq4o1YJwr@5ز1<מ)߂)Uu*[$Ri^ܽt;O~꩞?P߬$TZU"zf|*;@e}C;Ezǐʐh=Yż%mA|y1-:Tɔi CTm.T%#=\s@<$= A<~YعV񼃐{7byTAvlzϬ̓ުƼ-bU+ʣЙ]T)Y#9oY??YSS=SBT-",ð&G9PZ6d7wֲy۱̞tVGXQY$'꩞i…:tp%ʱnT=DDXF_*EB@"IXGp`vY?3+qPm֣=zXF[es;㰶7 *oH v_Ie]SY"ZʆAQ*DPʻll;=0n{꩞꩞7IDSHMׂyy/ !ܰo!a!.A!CHsvNL6~1RI_De r6#"!$1T$U\oΑ#2D !vJI mv2l^.HΟ??)ī«q,˪7oU/X Ic~ME6F _$>9Zjx挗OSxr%BjzcTYZ]J;;Û]"#o\V@R e;q>MTPxqZ.7@*&5֬X9 [Uf(8 ugFjNJ#{,YwFTHܦ-!ӸBH)uei =3*2pOn@H) U{yK=w8KC@}r2 j6y{$:YQiGbL8"1Dȸ] [9$jx쑪X/ ]EYgN Ozz&7A>C0klE \D"!u]Ӵ,mYV(FxkH>\#$)D L7+!Wg=9e'A#DfHJ:!pcp["_nǎi8hZra#Liz7J[NeMJs+kr<?s]w#/yhc.R?=]6pm:Wr 2}F( %f=B/%PӮfS,Ly 4y ;'6i6̧ΐeSQ.|O68lGHD.ʌٲJv׉WswT׳4-ʄ<Җ1Wt#@n(x<g 1iBD"aTʈE I%Mqθw9{{ eh vdtxR(Y+)wr]k J/<ˈٽpAO^p9l"$'wć wgl 7kz^ik@'멞꩞?W_`U=EEE'Ob6l{9'||+( rZ2'FD҅ >STL-2R"I豦#DJMv9!#;8)$""G(I)V 3d҆0[83g`$d mn sI!d2~{;931N61:M/P&c[үp '%*A eb-tf(z.E{2lk4Usd1HRY. CיGNmwګRtJʚ{O~kՋtV+ Ao̚kσARzs./N+p^@*: 3!L7 }6(# I5-UAYH+œKVl7]@yIzxMe+x^/J֬Y&1dU˖pxQi$":ˆqHw>m]=Z.zFDDlX DHSS -) rɀ]rg.ۓ9rYfQ摲0sZmcHx< ߐy΍dK^:"zכ5k6pW~믿~yE++"9$Cpye#a"2P}e@ 5'xp=:6T*iI $)Ҩ1|q:5r @5h4h T 92:Wm%@0eZpT* % +>R*0XEO2e 2 iYEEEeee*,_2, e6I@v`2qd PV@1D9CDIJ"CbH@0D@FD7|tH9Z`s#eq]dT x-]oD/'Be,)`%\':uW@´|慅tm4FS'CI azũDs ]!!"S!zprZiI dGS^6gh{UQXڨ\mXPJvd J RgJ:C$*LM[8"JaVcLBƀ1dXІi4IǓ1ϟHHڶgQW'Ѣ \_bE?+TGt]Oy$[׮, Ϸz$⋭Z8pig=9kG>eذ)j8RP~_@ 2h4k1 :$%䖭[n{ ڭGxA\JĕzqԬ!ck!?7tW0:gIRJ{$XnUW_3镗#;1[un~hDURNf|MNd tu!J@) 33fUBUuQI1]OTOT9kACЌ3%x  KzshW9v 0 "4(JŢQ8G@T^Qymns\{ǞxP^x PJ (DqX2 j QS@0Ǒ1&$ !3,K^XBb -qKI'nz8kܟulg1{O<=8I2 أWhvbeٷ LD[߿EE2n3<3K@Ȕj\H$I  , *$$* Ugma1ő2beݚ^*q2e2 8_PR 2t:x)4KĤhBcyvYEj^WWҙ `)I$e+;;'R AOwI2'UR INvDD$IRJ7@2-uOvT 5I)%&4q=XC"H-7 T(,Ixr@FHJfc\S%BK$&$`@HWYJ A$cز+8묳FN&" lvTf]1b6sW; >5hsFgۊK7dUh4H$a9,ᾫJ8pm#|ttysn;$g˯J0H$ =v  IDip!H AEPդē +J[DJlGΖd@h(J0+,,1@ȥ- I A@(-$ I0:dR {ðNc@HY\R-3id71@멞꩞{رw}w/[lկ,۷ϟ?/j[=(k9T6֭_2 @ @*$2@' 0X@&$!ӂ0rRHb啕\㩔-!`(\' C Sr',) KL<ْPV$`)!O ) q8G)Xg$H뵉|٧>'Oz(2 $x")#E!ƕmtaCEaZuGwڕs; R4DbeySY'k ^x(B(`}7 #|7/$-X_9?'Oy Ӥ2eSԲߖs$Cwߟ9lه{oy#)ȉ^m2j H${A'6 o}k7me 6uǧ]|aGW.^TIcϿ\uC;QgϘ1󹣐 #8%IcBJЕH$ 2Sheaq _z壎v:)Ҷ%o}АiPIB08ƿ 8R"na@ ߻N[NZ94'pRc~ŶWj="Rr @2`z3g*'T#CK)kOzP2n4, Am=8iOmѴnIUhsɘ1!ݿqKiN~ /NH aloAv5׌:,5[)| \h!(]8d30Mp=&LJGdqB]n3 4ђߖ^qGuԙgŗ_ |e)3}~!%I!RsB:9fAe{ b*Z~iȉ'yK#0%o̴d /O ԃqChh"#aJDIq&LgpB@4RB$.HR0 ) ?I+Ɓq h *,*J} M$-B G -KBYB穀5=Lc)dL\ MB ,J1L+jPldd(;Aq-[)IF*E5DVEz9`jLAf/M]S=S=Յ1yUWzwqǵ^>4k쨣|` 3{~ю zHa悂kt PyCE@Laf D$KHZ"e=g}ȄwuDh̒dXViyO>9hs;om)D,)篺:)m.s< W^bQgug^n%i8㜣; h%kGlDqFsdRmcu/dȁ1D$w8cOe+V_yթD~X< +**'I]=3>M~9}8Yal=!`00RIaC/_yo 4`CoܴIrKt#$zlK>1c {4wI?O8Ꭻ/ь 7nLyG~1GsҤWg))3(~^XX(D$#YEJ=8cLD23XZ/\D"OcI`IIR&xF2L$c]|qnݒ2 i?s2aYY?fNyyTBJt I 32dk֮P [r[I2-8a#7xFR)mm-@BE"͖4 SX?_~Iߖ/uT4ytϼ+W>s^$ۀû<Sd1۹?L1FȤ =iI"I9EE^{M8شuk.]D !ie;wvݺ< L*--;gsO<9whԴ_O)9Bڳ1aȸUydsDe [P(9uݱݻ "%^PTpd#i -![νSG1WK, 5j:EpE^cW9HLa'M|ҩG <~wCD*}1W]#.s֝6f2H_p֬?|А =eҔ78oi~%%qT6 2 N|u#F8t'2իGqq]xEwLY0a_tʲ Ƙ̉`GXjuyelW!- ȳ=zࠗ'|ժSO?}؈Q_{CY4\d*\b,>I=tz`Μ9{O?/!.\8a„~x6F7!Q}57<q]eg_ںmoO ,^,t{ٳدK'O'Oz2WyL{}i 3?pXd V\1iGW-YG\&D"(iPt钍7mV=YTNB\pZEe'\xHrI!hĔ$iQ9䐵*^o@t$R([fΝ۶iG;b萡[6of!$[heŬOk k玕˗_SN{)r!N:i ۶me ?nڝ{۶mw J= a O%G:?3uqϼʹNLSؙCN;';aBN;A]{D_M0>˒k7l:_WzwO&5_"涻>knm6D!ߖ,onEcr7Oɔ{=qtv6X%.:1ǟzʕ\afܺmiG;{9Zn{.\8bi`1x6 oh,?ē;xG| #-[]~Ctŗ.XʌF@ ,:k_[}Wonъ2Zr;{5kyԑEEEP:)2g3 u:˄aX$Sv゚a$:|7G{ѧ+oD6x|oi{3?Xӵ]c5rdYicL~5MחXy9acMfX,u/<攳oM7py#G Pq 9Xͷ:CN:$ ~!]W_{mʕgyeYsŸ֊i\AOZ Lv:zW۰ Po{IO9sa!gѵe߲m#6C Ri%@‘[nO>3C{xߓO>cx<|9R̐]:=嵉=wg#i\1ASO_dė^|'M9xk3=p}e"Xf<Wp3 bŊ{‹.lۮm  dA,[?x=<_|s9rgװ_$s!8Zf˴R獀eKf꩞꩞W(HB~D<蠃=ئM^r%D4իW_wur̙3-2 c׮]Æ ;~=fP5WbKױ/1PLؼ~Yg8G)SޠEK}FusσzRYOO?tM' [|];A"?/Xr{^$B^}uz2 [a9CF"*,]v>PQ$TXkBU ) 1&l̬L">O8!Cuh?!#DT 4v{N )ܧw~ҥ/nڴ)J w’B 8F_y͵HcBi-"BR\)jsNRYf?t6[nܶ]HRlذM*+XqqioG`&O)-- s΁=lѼy»Ǝݰ~y1#GrQ<GDƂ `0a]x9>GlcW7u3 +oU%k7KW.XٶM h4#%qK+ѣ>JX)Sވ&'OFtO\xΨ;#I+Ҳk5e.R_Arl-؞B{nSϜƴztϽ`YEtێ|֫=副{7tt+ʽ՝1$D` ` ST={_ cO6, >+.;Yn qw?`S|_f~t}m?>_q?BjˢOVjp  9FfۄoXGT#:A+lغk%ĭz Zr0E++vhѢ[oY}>"b@*Fw0mڴ>]67=~sskϞ=zFBG?$IKXq l߱uQAkiܤgֲeA!|;KK׮_7߶lb1GiN=yhE\fu2{i#GDd Y>c[6oҾMc'yiw& B>{15H&Kʚ7k3x,۵msϽKC=}V۶m#sόiҔ󮺵II>AՒ4D;*-6pNt<ݻ)SSѲ~!;ᇭXIA@,Q([(,}>v];ܣCgwMHa>񩧞.<(.ٯP1Mk֬[h9;A׬K&S, }G|{i\ضqmm9=w泯ro;_ø+kظI2k۱m |I*DR4dH10iΝ;Y<2R'8>{I# vW^s w4 nƙm2d2U^QѬY32[Ҳ a(!C5h߱k׮mݲٷtMC=D":~`xj8\ Бq7B8`m^0QU0ӤAD"%٭7TZVH$蠞YOT|d4NH AR"͛WXSsWi˖͑Ha?㝥6kƘ S. "-& K*+I˯d畱dAPmM7!a;!mֱSX,سqBfB`宝paMׯXVVްyS&-)5jh-i}7 1o&m.0͝J|ՌOM&ɯO}YŐ{]0~OlRMvjɾHp$J9[ zz)mR2ꪫ E/ge%5 VGeY]vUzSf G΍jGcԐ>r{{M5--+M%0P}@͉/,_0„䒄bEx0R(){n]~m570A 'Nzu҅V_躛H$ST?J2Tx49r~s'0n50TfD[ln֬3=PVk]w?Ӆe{Eq=~U@: ("bo$j%=&ݘb/*RK-{Dc ޻ \ݝy?fwwGn>1~;vvf޼7 >XmZx!CZZZ.]:t?0rn4@!c%]{o?}sy"gozuuu~~2? OXhӂ["XX)ZZ|sf6߳\73(HFh'ƆKbp:9`1| s7_}'L>O=EsM=vSGrR}{#(JrM P%XɈaDԯR ?X@HC$ʃ ןq2?;8fS6!!~՛[߶bxC3oO~gf*_ti-d3$Dm}W˗Z@fd+o0  *1Ux$B_SL9;QcUљ!)|ƍv( NN:?bnRR2>psk֗_Y ?vͯ暜V5^zYutk;4{45jm[5! jkn-{ NgHL{{=8_zwkRI?s,>{e_ßGo2bАm+t-j-+hxʊ`=w8L4~' 8Ĭԫ-Ιr G@'.,F`“ҕd.ȿZڳp[N5;릛o]ՖY{w=jll]wgwcd21|ѣF=y̙3[~be{N}߂E,b-7x3HgbF%.;}G]4kon'>}]xwmV)M6PW7dQ8zҤӧM[ {c ڳI:%jE,g$xsTϬcx 6a}ˋw?vy:kC慳So{s?;{3^rݔTλ`0qJ{؛*:ĉ.\ގ>`.Kӡow5,X`AMMMx03?C555\1G"б|Gsr?r1ƛnvܸ֖?ሔJʣ&9nq'|'_,bZϓ߶g??іZ=~Luot>崃ABHbr_'|o3SZP_[,b!XH,%3dL*y,?d3>`cF!D< 0#m[*9;wnc6<m;]ctx[f?]M߼[(d<sp{͵xl * Dn3q}i{WrvH2@BOW(Jz=фLoW]՚k_[3bPmmHI;|^]nCC#<RԂ ʏeیd ֙]g]|đxatnQǂ瓏9}s[ F5oGקu+?l1=<<3^^dox-?}es^6J?T"q 7vQ'~9?:b3{qM|֙gΞ=?=-)fF%{uq?mmH.wᇿ/%gκ|;hsg+t:;DdՂf_oo۳u#`'C3w83 Dt]WJA{:R0.iӦ㎙Lo[kkH$,f }Rk8뮻^BDc/~񋖖˲y `C}/3%YgN95mm,gJ[ktryM͉d*8+XM;笚ڶvu8N~-"qNh۳&.w-t魶|w?sض֚Eb\W[油lV*lx@mHK@H%m#UigF<#7! iiJnƓ~{ wK渙Gusʬj8أNzS3/l ?ɓ'+A9SP]%kb'-f%ReRI'dѓNfljw挍Ս:R,rdv"lhikR|@+YkfIÆpj%j&t;Y.Qݨv~NEm3En4@DU&,4 "H%_`$šS?^}ty BJzL.}[F؁?;-U3rG:a=vt|` ҝq޹S_tЏܿ1)gϟ}=xȐsM^E;{[--=/? l3jMSGy~Y$"RO!2>nL&gmm6l#byСC iooRix}',KJݡ\SJ }MR<=wG'd-zR@QgLW|fPQ@~kB?5B$YIPḞb`O2Hz3 T6 +y oƍ7x駧c<_$KCA\u=O_ wy!4~r`&u"M@ rʼn>EP@D0[HꥴC_DB-94d0XD"%TLV)eY(P> 'vap)FY=xe˖r9DL$SrZNmmmņnfUD~K[ΔzuPJ?3$=#与fpwۇm~-˲PVAg`_)й l2J-RZAB$))˲+J*i xQl6J/+V no9jC'M>Q~so1vHSXc 82 ^? x̞+- E.3rf$ǕbJY{`gkN6.!PKs\Y7xc3HG .J. o'D$T%@ҺT8 PUJP놼,I0[#`I\eVB($tz'e I,!9_>%ЏFk xk'=۲-˷s!$Dw\r` \Ue-y}WJ? "B)%RғB ADR +%RڧF?IݡESJ a K(): AIϓJI-5f 'ڒBB@*)>r)=+?5};*%q(>bW#kGAJPlm)%`ww aOY=GR`QT!iXQT_*걾|Y~1KQ|*_rjGUR fmCI?[៑o m0eFNaz"EI >} TsAk}[jz#ub@"m̡D4EbR'[l_|re ٕ߬m۶=rЇRK+5ҒA@]h#|(0+G1 V&O*,کU> s{GK_dnzܱǜv꩖tdLIA" a#X`@0?!N7Rs, RȪ66 ZD`U-)"bRG݋|#(w$,#enE6!lz[e`-).|eA7rY Eɗ)tͫEm5dA;䟯"!DMHvHPP ]Kp3M{ HH`gR8tw_ 7pG?@v ÀH a{FB`mqP77!r`K&b[@*Xҟ**PEߵ0ZaچEDg̿J%=e_{0Rwr-CAV|٬I`0q8 bx~“YX;e'ӂ@sRplq:ShK\ۆ ߹.,gН/X/3L fZ;-0j8ϩ8E 4βy{w,KGse@$ :oq ETU|eE&wa^ziŊ\:b~^"CCY/`I)!_f}P12XjreE[ܺCH,uf AUe oS0?.(ɴiZ2#"[e`c.;"a*.5,y9+"{[ $ j$v.Gk@-r~&}1F;jovk1F.(zao_Ж8DVYM(#~r[oFA nznB"*BZ%gH~ l(X I4 tؿ˜zC#sD$] ^v;=jTpI4H JeV'#Yߕ»7 )ABK^*_4hvFwCЫ"Rk7V{`?5"3D;аTa=`h`X)'_qtvu8ͨd<9ݬ;~Iꭸ̽+5^ML*Ꙭ >9U ܡ̄op flU.p/-FUj*ȡw_&Q`#q9sO6=M AC+Eٛz1 MkeW^j ˽wWXyyꚚځnuuu:B[txKE H Ӆ"׉RY`,:״ J]@/Y|'?jh[ KmbasB } X؍7 yM\0y1E@ۍȠlW>$,~J]v~\Ky.`X*`y0X+%թ2%+E—l1 Sι:+A(8"F^끿TY\\ "7hG~':(`n3MbC42Cy^Vd4sF7=6*[`݈=w8yMnK)ƚ~} [)ē!1V]:0M[);i[nikkϥaYDtM|"?Vd w&k3@~K4V3PF.HD:ʢoUd bZUV:(L[}M}8 !B \ѵ}ت^1,tU#zubMZ@û@ 0V>M+GQ_6D#LbIcn0 =JK|m 2(qX,vm{lkk+ w>D²D{{eWI<1D:iGkRPBϚ[5yr.Uz/4F:o*ON=oV_<㸱D X!l=A)bPJ*)s38P{e#"+Ff`߈M+U{KK]MJ_H 9`OPuNa6\:u5=XԼ%cda60-tJg5]M—W P+p@4eYpW]uU[[hk"۹UX6s ^6R:&`E Q(V̌-'9!R ˜d *:Ž׳o)g >|G!0X!Y(#$P12BP (CQČB|ARI%Q1+@i]ƿ0q4xFb hP׈a A0`0)Kǣ3ܣ~q]qs=耉 P2+=@'S <;wTHո-RPqWzmRV,)ՖNgd2床A.2ڞB&xy?6iwy{N)5+J֠w+fO)b~Z-$vT@"˂e9v*BRcqSv-Q.QS/>{P5 B8>142gInފis8` ! ,יˎّ#hzo ^VWWWj uf۶TJӁ Jm!t6ر[}gDH M7r}}t6|劓m}plO*ʕjEsYΞwς!eb|hSkk,x~vQxu7(,;ͼ?>?ّgs[~p=]~?䳟sF''vʦH}Tg0lz}r5b[<`X rkW3s?:uC! 0N+0N,%%z^Z." lR;|o{YcpKf{9{ϛ7d ?GyM>~ gosI"0"z :%2J_>0->u~{knNgk={Ȳa1s2%y~K5W?f /|=xcn?5jWB™Gg>@co X!0!P?`0<\o곘2.c%`06 ̥GD ~&$ 1c,ĝwd䦀Hl6x䱅'\~ vSO=5aV՗}!eRz|OϜ&H>#G9)O7v;> Xb1cvyd|oȿ$=%%s'/;p=sΙ2mĉ=c]CN8E/~¯~:dFĴq$ͮP,V͵==co{avIծ\rժtk HC]m-\m*eV8[t,nB}h'`0 >9UcyMu 0}-eg`0l(q޷"J Jf_ifһ20ϸ;=zKNW65 1Y2=rU!CR̰`9DӏfV,;nGVrB"b&#۟`|Ա6(.[O?')' _˖-m-pR);+Iڠ!\]% :6lt5rH!3H3 8|~?M̬${wm7ߜN/_~]w瞍n;vnMxg D 8?n&F{vֿeV458qO?7ފ%~YABJW!+i [z!;ӎ|g~_J{xO{e ^W3b_xaʦx"<{vO|霼+RzG}kZSJU{:][[ҜdW9W^{#US[SSt.n T1bAl} Q1W c!gP !V輝1 KRJJ)X`A* O{G]N QM>jo~7ؿOSfRaLb̘N8O;XX{΢W߽ۦOuPs?ȿ^YGtРaG#9cƆd2yg̚3?;M$RR,bV(a~7`iO#o嶭ކu/jR\M7#jo/O;&O>j+-ʋnr~+ry^}U|s/Va !9T*O*Hdd<O$[Z<ϫMv,J[[rl~[ɔRɤHX1Gֺ˲ҭ-u 홬m[b;OL 1LjjI%'y=mT*ڞɤuuYAD r!"!M$d5׺\%:dܥX?4z$GKVt ʭOɧ[VDU8Տm(Ty:l?=dgs̈ 觙ֹ'V`0)Z sϑR_EsL/BGWTPa DYReV~R+ߤ$9 ]S\!"rP'u<3K)Z<ЅR&I8v:bf$$$}KCR*TѺGj39@@7(%R-5ʛ;FuGWfQ-HJ[ S_tX"gw >\SjPgK[2XК :"ԙG( D UN߅K+Wڥ|i Kע#vf4`0-|߰gjcb~Q̌kN&o'fZ-!BӫPZbPZA`# T z}# #*f̈@53(5xB9̯0%ɷLBKA FD;k3 ϡH "ɵϮhl ?VPr.RXq(? zX3WTfZY[LLQ^Evn\S(o酰v@3Njc6#sTl"*L{BL"l1&NjWvOz\-Jߊ/Q]tI[UԹH8Z2VUSJZB*˿;%*b(ɝX~)$1y^ a:GmFQ r~@xf.QJq.B}b1^,b0 }12,3V2L(O`VU^DEf` DBK"p&"ECDV*\#PJ*$(zRN'*rNAS*I@\_g[Xz{ʉUϏXQIV_(}Vk"J+hY %.ohpz_1zf=!Xs頨U47mJۨ\e|;dCr?F5@D@@4Âeei+v͹sD‰T!|"S@?_'v\йgI3=p5R/=y_'g{RJAbĉ]Нd2d2ͮ4g՟_Zȟ1q9':rᗃ[W02UlZp uoU4P+ ;s9o͟슾@tЎbJ$V:97-u?.[&.`Qp:u5'R_Em{f@JPYwͣT> "wPg T+|ΎH,W$9UyErcF-gV"BoU儙D0M/Px2:`PJ;|w6Eztb8l1np' ~+D0WktOZed\ޱU)"}b̈uŨX2 ^6 %Ko- !JO+52C0Y~JЉδd)vK\x1]r"Bǒõ]̕D9^'PXͪWC+tfX!18sg̯-~eu"9Q0/ry9 ByyeY߬ʰ'pWZ+24 b P2/h{KdE#]K DLf-\y%DEa:ݓD.#"*NX`z C_Ae}#.q9GA@=\1SCf>VY-xti%30ב\Q8pO}jT5VXs.{^WU^u[P h?D3 \ti4qPއn=6JR*9y}g03"魗!a.J;x֣|tgPsH"*ޯ%g/|_dV&6}4~P}/HA=`FЋ{ 䵟徫~EWǗaDۏRX ֏,a~4%APU`7]*TVG>K/T[)D= J2\<QJ!RkD 2pYd?G`[0~Y%P戢(UAGۧpZ*D:c[ 8y]FlaXTd+%uT?(V30wnnC,]I(SR{HdCmdjK"Q=X9' 鍤`fVak3^ enZ4J uu,mJ)Xzwqr^䶵Na'PaVJIm䗖 PR J*f,\[0 g* m)`_-O: JIsɑwYF.rqKMȚE)*WӐ ˅JБ zF -Cѫ'Hёɯ#BwztJ>ÈzR *,E!hX}#ނ9ROf_W939Lj̡9x5 !37 Ei93>)BJK "uoBȗܟj7N Ufaa:,H3 zxp@f#EGfmAhLւ{EVvQlmPG~0A@7D*~Be)z鈍.É6ɚvʏb)|_*XPV>a>1, m_Uy|'B`'yJ_b >BM;: BIB\מ9DDi!K(\'/c_щL É>|y_L$mX.D(_~.f$,r}X&v0tm;qNUgzh"q8,PER)!|؅xwv+6s_8&:^,Z'P Eߒ  װ|! SicT_ G> DI< QF)$Ԟ+ pAƸhu@?MS2j{nLVXֱ (4jz^ipr(_tZ dpv5XvMR*k3 bF3f| Wm"Tz=ofCRY/+~JJ !pΈH)1})aդ]~Ѻzz뗬ͬB ?Գq`%}?X"IRwƕDzT8*Z9&^'5PmTۑ|c\u(.#%Η121kRʷT$/"D BSAd [ FK3Bw0 Jn{ОIDPB(@Ж?=#.I \x Rhޤͺ7t!Wo@t@Ǖ H 6 !W%@Q0g@ Y6i/@g!@k:6L&HH9WAŠEπh=QPa\f ǀHa-3N8d$,E|L>RZ% 0ƣ݈O*PEt^{ B% 8HȌ$ T,%[+I.Uz r $@k[Z1 mQ=ڳBYtd 30#> !%sBR%\@C @sBDD*`G\8V*gM"FJ]_lE$XwH9<)<5VO"Yv&\Al<'9Pw%K0)r{: rVVR AX+_r`08_^4T*sg̘P#.?_g2g=eӍG,y_{!h9j 0{˖.eM:b@ޢ!O0b·~3Ny(`˿ZM=wİ!}%̯͸c=F̝eם6m&"Po,fFVJ1(o%,1#]pgV%otGozOR3f^ޞI57w11nvG9ɲ9-qϛ6bجc@Lǭ!9G eWDTkMbmmmLO$Ss/]ǝ:u&C6ZՉ㏜4YgrafoˇIkk=_?AΛ+V5Ϻh%‹q{K.]Iדּ8xǟ~zc[lʼn's_癜sΔGn/F Xb *v2պPQPu]">b$xzL67iL=&Ό4̙;o闟gsdĒ7޿t|Gϛ|R'=i# /.61# ^}>tϛ=9_xq0k˗;3eʔMF O͟W[[;nܶ{ \|K-wwi {tIwR )wZY7ϒW_#=m6f̘O8;/2͜7m?\R[[;nܸ9VX>DEwQ+#ؚ]ү;Ï3Lmm\83csΛՊW{Cl\لۍ0iQ-.=W_iS760-Sa @+PDÂXU a],P ιh6c|bFK[L|7?ϿYt^^9=m'P@SYP@-J#B{&kVclj TW\:'p k4}^zW_˥/y啗;z7\C-s1 1i$Lt/pyNI-_ZT[[{es>z7LWOqW-_\:%sg;7r[8#"$+$,Ārd~9?_(9VGÂw.⁃?-zUW^:o#zsWˌtwqW:?MK/lɫ~җ^^ڴK5n>(`\WCq Ї0R= Yڬwr֭mm_|-_:mK<+lnyGuuX]qg\p^xɫ_~ezF^W#o7΁HD\gdL_{߅_M9k"r L9zfkk6e'L}?|x7_ecǎM'̼YsҙL&u~UMf̘n֬ٳx69cFƆ>ƞerpOl=~/;o9zӍm&k䇟/d|͕+av, 㷽+<,{Ɯ٭M-ޞizK͝;+N&Րɴ͙{Qc*Ư3LH3f\X~ވ#s'NnWOX6hP`0q;gmTamf]͚ҙtv]v~7W1}͞=;Hdٙӧk|MXU6W~U6Dc64v:&oCn7~ܜOX:pfķ}>-/sәl[:۞.oFӪ3ObfNl=nLxrֻ<$~Rjܶ> #Fxv㶹??]С `Ǽ[_z'(&L+ۖ. 󚚚mw|wjܹs)秒L95; ӱp~D2q'އ/ sfC}w'";̹j'8XMn[o_n5vl28a /N(͞ڞΤtf]w{Vj1}m۳gNcLf鍍@~gyk~Sd=/rxwGƌ!>[&37{7W| A:OLj]6M=;o/[l܋ k jR_|pU_圳\ƻ=t,czXX)SׯN}jl"fo?a…A}M6ɴY3m5Y_دH~P-xNxKں--)K3{N~"08qˮχ '}gl=6w˯ LpѬhf'۳gN$Lf?+t++зQѢ%ګK^ ۲ B`eO*ו)|03>\ym9e.~~ 2gI&}W~(`UNAK-{ v?p.wp-ٌ= 6:n@<@$q%l*5vء͛=|0`d̃{w+5jμG=?)tZFhM[2dC?d]F^Q)ul&KE`"g}l[oɤ/7ko'{ 4h'M~|pιDx?;w}o=$X=KQuuUz3s/o{5I'} *0̖el۶f\3IJsSH%d1A#λZ򢑣FΙw'|t6?J_@|퍷{we B>$uT~6c55W\r%s>C̞s񑓎\Wtp FZR_ q+>%Q)] bqQK@FuP&Axa\1aÀY3{ЁwuעElYs.>-[֞&"rmY IlٗƍYl2dcnglż|>|0ϛQ\xq-]-u/Cug=QѡJo??t̻キ{ ez _RH]]eJI" (л?v}[ɴ_:w7 5{ɓ/_8X\Rљ PVTgK.Hғ',(K cqT/klt$mH0榦vqȐ!g}?>|ю 7A+(_﯇zh@$c:2 U1;"b*UC$ ˲]#D'`𡍍9kjR1wo8zQ#Gy^P]M[oUm\n^y%HjkY\α@z: '"| PA̡t{{~Y TrM<75 :saÆ<=TW,;뮿~=wbaiAI!<¢d<-- ޯ_cFB*0ss;0pРϙOl]*2QJIJ۶{Rj#x<P:|֙3V\8. 㱘 vF}c9N J$P穀mG-Rn?˯y_J%<rz3Ѳ5XߎLmuuF ojjq r9S.||Ӻ$]/DC( CJP: `IHl6:O8 >m{}</2thmM Xe)Ŗ\.6cvۍb1;N.IXY+L6 ر|F X g3u ZS VOYɌ"ԙos]{w ˺ԹV2m[KJ766f|ذ dS3 CO&$bٲ;gʔ]mͫ&xWf+ {萁K}K//7ofw0 `YAga{.|||~.}n2IIq~gO=,-3sQm[oeW]5|'}xlѣ7{EꫯMn|{&t `bO=w‹F裏DA]I;ʢ>ѣ77n/Dm1l_lůr1c6uɫY]՝&Z$AGGe p&l%sw]wiTz4Hwg>`  him=z^z^}Ə6te_}e +j1yuɫٜעBQIQ{ o#x\2A$"ЏhКqbG}^?~#1q8jĐO>Q{j-njY"XxmiOg;$+)=̳{dАGW(zZ#W̽sL4h#a-\hX[o6tвMc637r_}m |K>m> >>a/dv~wq%M@`%XK3Orn[z٣G~󍷤wy6aQÇ|gT|[m5z^ZvmoR~GcO=̞;zsF p²=Aa.1+ݫKpr?U<SΝ8sϙ"A_θTfmsSLLę^vC >t#3r2SSc"@&l1ε /;oʹzK$K->.ux55D29eʹrR5ێ?xC: &373kX")so^#Wy9(D4'3J 8Sfϝ{m>A_駟8ԩS%_ꤙ3/]wm >s\;o@JBn9'μ?f#͜>B8<,W8_ϊc0 kŋ⋞wq_PH7:OђpL_VԞnIbnkkʘ.ݞI$@)fTB*lF;F*m}QFuFAٝ`Mg2ޞIJ)"\ϲ\M2 &㮧lN2Ať1K|&ʏ^t)ZR %|Qdx<&"lϤk)}f[[qj13^2igY|&l벓nRŜ+m[( AݏPȹel.V1$~Ag*)$OwJ-Sd?םb>^7 UP 8@d%dbVkjSZtmmڤ]7gz8fҙd* դRɸɤ Je @O7<bPb"B+"jRl.;@T'Þ=T acDrIf?+)eLo:rdXrVkxx-u?\W":9@FB A 8\΋ǂZRV֕q[0@[{_V 뺶m2'ٞnM\Oږݞ%Sq'c ~#7 >4 `0z0AmR(H@5 ":bG 3R41$ ŠCq@ =jD0hR 2 zX2ne!,a}[R00" A` IBK0oDgB ~{Rɤ^G_af`!3(ײcRɸ@M<:9bP!Pb)Q &q?'B*n{LTL) 33':-bPgYjݹBORY x-D*T BY)H Ahc KON uHhQB =q[0C,f) t~f1/{HlfVJiu  0 3c:~CPI@WYnJ@2"Bm<2H@M*Jv,_pl0 `0 !뭁9`0z?ڃkۖwԛu]⤈a @b jsiږQ`@De`fHh##+V8R o YX@Bcb(*bPBcQT̤Mbp Se ֆæ+@3@bTѷ m"QDhc?sXжZzajMU^>rE@  ̧d(3UU2|:>{Bh\do s Pitaa*fݵ?GR$5g /7J\ԫ݉:RȋDr!n3aTd2_ fAP^zZP`~)_țZfR:P-JdRd$ \Uq |#*`N·0Ӊ|꨽W$ja `,2Cw@I٠4BK<@SFa6 } d8WTRJYT#S:ӹ z0" &^c: rHL~pwia@,eDVz3ỲV 30TxLL ٫ }U>}صI#|k׿[ыFeSPOgN0jm@`Fҷg@[|?{o p-E Xh+:J.1pWc #j,Ne ̕#'[u*= #<%Jw;u. d@FP]] @TY3ʽZ,՛ ?_?z#=Q C tj]4x/"izh`5"`@b@T8WUV`Ĉ: b)9=J}0*ps_a7 |92"vr>ُ,khA*컻K~dEt@#`{X?7h{Q3=6`0#tPhĺv?ƷB+zSɨAddEL @)xt ~&9tV\$Pt]z3(8cdR?^nww;~5f@0+e~1 =OHP'UٻAv$zW 3#+, |b|À%UJw_– {PϼP0҆Q3 @ (%vɃKv Cy`?JK1%0PH^?Hy @`$3r$*',dl,o؂uTlPHhwOiC_]#0VJ\# ,%6n, BN ,csO3VTS&v@A!U,-3E ;Q`0Q%Ey, trR rK+ ZZT}} +*"XVfjǮH#%vυ+f`AU׵H%TʋOfR5566 7dMEQKؘ2ݥ&I)MM WzyrMa(҇œ+Z[d]]'=}4F8%w;mZf |]GWY nr³A ڙx4\$tt@\4f2;`hؑ09Fr=\Utf rc9\uq|+B,%NՋeR "Gt_&9;Q޿i0!r+[➫Vs`6ME`09B75^֖YJIT Ȍ#`43`uz;وwK j{xD@8A.V 2`uk~^O% ~ּ=LwP bq]S,N_\rDVJr? U&ԙMlW+._;A@u&b:N9UB#bbުC+ XLXD1*M R3j}/P~JgS9G(T KSZ}|^a;L_a&NCd[h1ٌr̀tؙ C_Drvl mP",ܿw-cnQ.?Q+K'\q(2 H[ Np܃2T_žTTh**ͅU6|JUmxCO( 9\MtvYPA>rDqوsJ%!%A)/B@Z IP=feI @ ,)\p s"?ܽI 0F u`;HiFTUr{G_55^e`QҠt ʧVi }R@4֤OԘKo6p Zq"ܣ_R4 }Ol2֙IČ  cZpFAډyF/EU W02ۏbX]mR&0*9\y 7>sU| ,ͅoAFWSlP:*ܧU(y@@iwffH ]l!M*IWb,rcx= :ip*+Aͩ} SE!1.:sK=@p033Q1bDچEl 9fQ!G =C/)r R̬Og "m"ͦ>F~./#֡H0R%pMY* 6`0A\PBN yΪvX-@zZ}PSD@SYe1T6%k=xKD,%+V #,ܹ $y (ffŊYARJ*DDJ*)%""!"bͰx!| Bb3&.&wS]J%:Oa b5Ӛ{}+"ka97%‘_e`H? X)fI#:r^Fg6 }=ڬzQS_|8d[8^&H[!]&9! ńD%bN4YB2hko(CJD*d yը3e&% [ٶʜBC{1:cΌABP(:^} ):3Tl/V8"wLH`gӹ!P>D8ϟ_u$Ef@`W}E:/={c|P ; W9R:LY`0z= b9A.d$@#ٴl2d:,z )N GkdELb # E'*˚™}G{X̱Ƞs0mb.XYiHRL7kX FF(1KGʎ*Gn0 nj5`0 }3 >H"`0`0t+ 3 KQ> a'sn9ltfa1Pbcc0 M[l0 yLRúŴ-+`0_D6 }.dX]" v1ӵ!ؙ CzJf.{`0 l0: ?jf`0 émtf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctfGy.d0 s9_ 4*Q~ش5fL1 CIC C"\.IoTW+@3:9b1DaCl?U0CF6b|  fY} ki?5w 㫸 T,i9kљ a%{}Ci~7tHh?_1z9Fg6 `0z&naMM5oSjƔ5onQ*. o㭰M7eCP0tc00.p?r:+Oy֬E'ٙpt ^~љ CF9f&ѭBx1f)(489jTdQb+7IPqJt3W;kKo]J]:s*tx*b~~%ٮ#:Q^.U|-֥"Em3:er btfGADGa(s-js`6 /AeQuDJmUbqNsvUE)w؆WBg_5ٗUtNx}]RpIK%1{ zjHZ!D$р!2 U! S9:ڪsÆKY?8ӏg`=T6CmHQJPhruR.Ş-;/ޡx;PjHx`F`0U?c)99\<"DzvH")fݥ )G:s\dqC!Abғ_;8c-۪mii8#GjCN7x#̜dL2gΜT*`:pxGZ86"?"?բ~',˪ֶ6`/if}|pFW^yk]xnz644~mnȑыۅ*kW)q]~e?ϒ%KN>ί?N.?0"tA_}՛o{ !MvqǍ1غ=wPw.Z)Wr(x3liiIR\.ׯ?GR)HF#[_|ǷEvtŤKzDǺd3 >" !PwA?9?OdHؿ-N<8nm`( @JЖ-`F@@CȠ}  2Oz =!K)T,|WzکmmmZ[[x\}/1Gbe566e2)e,,u]˲/:jweYZBQmXhb_64655z衧vZŵRIIAKYt="$3(+8lL&3e9g}%\Μ9s6u]~ 3U~5 H@\5vk Avz=IGDqqX,5#+ꨣ6xcuC`KfԺqh=nkkSJu]/СC9g2nw߭rg}tg뭷\.x{'|c=);?3g}v:>q?lZZZŃ-Qi4]f[@[n_;o^.;^{9gsr҉'N:Nj˭'Gq1}|s=3ƶc{WmM[lqǯX?QSs9s'L8S0᭷޼{[|'N6y޼y/9ٻ@+3n `]؁]nQ;~>|DfZ?̜9q/ |?sL3gV|kYf~i[o /jwy>Ї~8bĈ3òik[QQ/Μ9~޽{{L_իWuu3<8%x{6hƌO=̙3w=JxhN;Xcg}wމD"{ѣc=Դx⫯vp)ʲ˿'|;3mڴl6;}wygsslp[:u[r^{-|=z,OkkkXct:}1ǔ6Ҥ0(ГFfP,PҀAk?\b{/C?j|QXsgx.Ǿ'[P:9Nyx}gӦކP0%8BΝ;x {~\  Bo@QYY裏&믿~ȑ?/2"^y{O<4u=㪫liiAEM:SOK_^7ػwSwygΝ_yU_t,w L@nOP'|777uY~O=D:5wy{`䧟zjSL9gv4xPUU _?h$ۏ7G۷g@SS&o#f .ȣ|Dž>`KKC?lG">쩧zuYhhlXwu_aÆ{̱v7T[K/y.$zЦ<6y0sKKK,vK/T)uqƌs!tE]DD"l'\gun_ʔ) ?N5XW^駟&Nx>s_|EUUU6u].B!EdJ\.gYOrĉ3mv)\uU3f\.@kkk$FꫯVVV~~驧:a„f\\aˏk| LDR٣?2#}ݎryhs=g'|fO=Q=c>>uj}>tO<9w't5׺3L{yyn1X>,s\TDRRW_M---AjH'|~qǝ~LFB}ѾkYȑ#gΜfm{o˲6h#uMj̼WTTd2n-dMV;vBs%Kd2=cLFת;~-b-fm>#˶ W_岹iӧm_unݶjwދD"^{Y}~ 8pڴi $&!Ľ&UVVp'to:NMu@aI,ԩ;lIѽرc+++:>q{9!tu-d7xС#Gd6l@J wf`@633Bxunm>|kHmـB)%@rNCCe2F!xԆZYQ`Y͝:~t[s5SG=eʔEiefy|[d2̬)wRUUfs: ˲N=TMMMh^뮻;6L2L&98>xg8 Bn(H Wo!oͶSLرЭ[!CvmdR) <( Gd2E_yչ=#vm;kjeY\.iw=wqG*RD;bY_k=\`c-KY+ⱮB7)|PH UHL{nݭe !t8y{t[oUtڲ%K߿SNTHzox"#cD{z~=pgΝd&mYp֌)%&`U32 7Cv7fϙӚJ \{j{p~uʘ:T0ٖB(")qE"Q[SsU/?K/|2/JܲAguv]׍b]v0aB~9D5gzZs5Nj̙3NDZZZ9}lXcsmךMmfoV]]]*zw;qBx5̝;7q!DkkV$[num-]vmo_}SO=iYRS(@]I F#dk2ɬ޻>{ﵴ̝7?k岶m54g2Yq<6?Ϛ"W_~{(2_&q׏@/J)G(WcF_Iu] hz/mۙLu]"&F}5?T*93"j5M67Xti}}[oD"Q{ 6a`oZ/@Y1TYKjK)_~{uuu_> h``g>Oed󝁁_ ~x<6vǟ1dP6fܒ/eK )ň:=2);\xy2<2uvZw@0_yVDlwbh4=A~\nllRbT*Rx\3 &vm{nmm^{=#/k꫷vNjC7x믿FieYLv„ &MrsGyD׮]S*G"P>3O?cGx<_xE'` cxn]sz/믿K/]sРO8٬mGPHRJّlsw-;o\zez o~wuwssȍFl6zE]t?q%Z'|rsK˄ nƇ~xm^sР TWW#f%jjkA!9.fu$X,d2BT*D9RAٶ}p UUUz}f[ov#3n{g_p;c6 +**F5z薖)eP<vyfjmd2`Εڶ",+JjTJ١o5YDbРAu]WYY9p;600񛤛-Sʿr| GpSsW% Jaʹெ2 :TH),:9ɎiKҊ3G3a̦x܄On7o0w#<"w9S~8fY}у>v-7Y_y>W^ْl}`ʔ{y<Բ@w.PifeᅬF `f ./R I^5`DDf4g9&egY S_4A~l}PfR.jbJ)˒e !J);[:Ơ9mB"-.43+EDJ|qaQ螰"""n޳v&KiYTH)!p[BH}u_kՆIyu9m\Z_]j;ry=]m{՘ njG},}s[9X*8Nɤ 9S-z- g[X? zz56`_~ 2"WĪUѶ#JeG\ELSm풺h$NыSl.#T*^Y͹R*eYeGt:XsSVTRm0xof~Zj83Q Z yffD-`Jˆ߇9IxIx.%jfݬeh%Elpuͫ/n@ *ޏ@"ܷsywaz(wG,C Vf89ۺan ~ ~#t^Մږ-E7;'ֆ[>pk5lSSӛo{qxaà]xa Di9sh1rfA28IDATǃ&tyX(9*,UYҒh*Z#)7j@,`c- QFp2)'+XTyYE nK`GǍ!O5 X `\i@ 嚡졈K\z wD  " ~E&D23 e6MB e x= 6}< gBS9[@]9ކh6<w\^\RKXt˝Jty0]k*Zq㎁_4A 랧2d zst0"?Tj0NOlX 乃(T<KCog`EXFb1eօrE{RsB楇 b]A~H{. sl;_7|W,3w<(V/ (5,W z(;== ȼmAl.hY>q?z3ffPz!)o3"df.j]8βP?s_ȋJ,2>BǞvQIo,s}Z|5V"V^LB͔-'G}K@rHuLԉ7¡Xp2!maY-7n9 ,q|,m- J5!J\OiG٫1e \v]-oAGdARI[2ƒh`WEQRWFl#+_U bjM15RT[x_|GKAAVYagE:0”HXkϚ5+u'EDT* łʼ\f9aP9 RGd G.$=C>G? ꇳ02 'ȡcKPf0{ܩ(+uEQ珠7M߷9_[lYl@3^Xw,VȽ&SAkS6|$S~?m :>f6$cSs૫Om3%_|E4[F*&uvP-Ne[+e]sl6j_(es8ڨռ̣"LHt"HՖ=*y/lixG)25-ge.g9A0C/0셒yPp,3@DdkkUeeK2YYQȁz V;W{s!@@yXb{Yshs;t24o;Ef !ݭ@3` ;<>.2D393X$􌹵5(.g.K.B U~܃eeoM|EY.Bs!*|6;cɁ7PeZ ,!,AJRn5 ėy[ pvQnRŗ^7nRJ+p |n6@.22#D/`#}̋ m Vč3﫯V*[-#%>8n[jMW01kMn4000CdΔGxZ=N,@D/p8O /|ח3" Cڰ2ܤ8ƻg@[5}S !\E’-D(@] (y\]-0ǜ(*"عn,<PkO{8] Bʀd@D DF,hïĿ!cse-p Yf6֐9$ "ʏ0 ^Ol6000XuPJAD{u)!`"E,Vfd=3_t 1R4OVJfKfp a_Ƭa6bBgœY6X.sIra5ÃlDieR^2sFڶ ߋ min_"¼޻=Y.↹̤ +ϻw:y˜3-l $A5W> Ufc.b6;tIn;UY+ЀҸ>?KT{XÔECJ/z;+l.?X=+LYfUaT8@iӦql=C^5 >*BJⶉY^>Z .@(ss~JÙW&lgL` 0O fE|3R\~ *|oP'r5[֫Plsd~ksWr#3ύu@>0dQ0emLpKaRT Jĺ!$`$ nH(|,cr8C`&^.MmWVV ϸ'8̙L&PY""fs P3H,"Ѹ.ăv4UN+p#xfE4cl.gٶeٶe К8 hUhūcU5+ ²,O )J!$1\lM}:ߊV*H$",#GeǎPHS @@&d (P1(b :?)"_67sG"DKRxuU"Q Q @ i B@\йL~tø הBX%ONFι,lVQYX"&"2#BSD "#anl```h4u]7Λ7/cܹ:X)c, tgx?떮9x3:{xO"Niu]tk >bQMmǦ>>e}jv8ǣx$ꀣW>ԇzȲvxߏeF앎v|5aF!%-]!C^{X,F\UY]C@b gd83t&,.U>X$EFdE:A`J11),u ķa p4^7W^&ZB dFv-.w~G3)R;(i0! `?IKZd:igdr%D]<)~n0l!0!GfB &Vyf^B COg600XEQ$Ǫh~z)ׯ_߾}{ݯ_C^&0eE=su;jni)-y9/v4ޜL1h*F.c$_B϶A a60I:J)&F"7pK?|_~'&bI7bP!LuAFU$ͩi˹Tk*Mv$*h2P邥bGl```sfR*J-X HdL&Zk-Y$N!Cx鋁ӧ}qul40'~va{m=`}8渊Jr3 _~޽{D^{ڛo^na od{fǮ/@Gf1Ȉ RJ-Xʉ_حYq]&bd&Y4*@`/G,rMhN9ޭO|ݏW\z!rKꛇ3v\wɒ%k tYgDYM~7|3QYyoiu 43~fpH$׽{>}н{:ף"帮8;wnꚚt:-b:NMu uSVa :uDeUWW3 @@LePYYf$OG,x%Cfȑ<8e 2 xU 91Q8V<&AЬ^WMCƌg$Ii[o룭I6_yeMlG쩏?Kk3f|`}tWMt9\&*CTB̛+msA W^ mgmnXwx`wqSO=1}qzمu[#NH$.GmO;b[o-H@(0Yքc|k/SUNyGÇ}wnW_~[= K/}g>g~u7/YEؔZ8s'd6`2RYf͟?u3fϟ?o} /ےLJieYVJe2 ---̜f555붦RVvsS3\&Dt]ŀUUl(>P-YZo-ƌŢ,5yE~[peSk٧~ܹ-i`XFߪ a?T_wj+7xkCDX`"(8ZlmExO-|f-'hmMVWUvmnW_sm4ѭæM^]QJEQ[`Ks˩߾@[m_677#@՟+9300004 /ٳDB,RNK6x(gf Φ#7daKK|9MFm8x!?Θf}Ƕ UJߚlU<6Hߟ}D"fWۯ dUe"XT)B`uu a6lYV"]WQΝYGI***1IΝ:e۶ hiI&**tg?) %ƀ t()$zna,j#W|fYE9ťw@[[KZvk)5,eћ1+ W@:8K f˲t %4=C' Sٳ[ ὴ1z2DP D! (fμ[29+VknbQe`'d\g```~_s~-.av}}8QҒxBF"&WҢ939Yb&xbނ\NXTYY¶uDbެٮR1jni$3@QB!:@A`62BA}?j`bˆ"o>SNKf7HJK̪nzds{:` X.&&|=`mP1+\*_$]z?QZۏ_ӫvԩӦM*b\zr,Е"rE]~y3>-i!A)xJ͢Ǚ!oZF$&+E*n{~3fsDi  &$ b e600X>h4ڿD4`>} )@)ELma7^glM7qsٖwf[ot:oĘ1c\WN6H ?o{vQ*8X46dy 7?܋m6&ih(- Q0#QuT]Zs'|˼͙2˿oH!$d`"Wh$گ_ݺ~7`x<ޚNOSS2qyS635VSҚilIv=?͚C*i%aӎT ̹%|vh"_x-6mڷ~+\EXܘ.klMehҦOT**h)l``#;'%% !L.1 1L"(H))DIJ\W".?yi]ݢK~po٬*/7J VQ ;pB"b޽{/^wDd۶^A)%!(ܜ3oIw޾G3s;CuU5e' V1Z3}̾+!P\"fR1)YsfM`d )LʕB;oףG|R;lka@Y̕P6{_}U.:t()":Oy(\.jz=/ꌈ(HKk2wrيd2JTiweGt,dUUT*N%k\ET:xd2\<eIl.KbL&sxEe2υF"\.k1m@oMVUU'*)˵R5"`&fһjZ3XEx㍝v sVEU>Hds9;qLO${O>⧟52͵5 DBdbh,ijI;lE<@SX}4xuRb$|Ǎ̱DEcKJ0 x<عS\6㸮%ʊdU)e۶*mDdv$L&QS믿w5B8ǀ)J !DZK5*QWiRz#iL ߚzDQxeDA$f&Bk0vu?Et03Ԝ<;kCk=f:#Xz7|CyQU/ vNfﵫY)>||PY A =3 nu3TrUlkvzmR !e&bL:>^aiUmöb7000_G;3O7;Pg;RH`> L" %EDT"m hE㯯ڍ(PGtҾJDG=>jrsss>vw"b"2rq #2d#AK6Ϣd?ns a&QJE"T*u+aMAHT-t[/뮻wɳs:W٫^yl}A=1"9m:΍}B^v[X,.7">cx_ˋc@w:3{PbPв-Rl9 GyEd:KgeooghG^7neO'B?E|W٧]Ύ pd\&Ȟݓe-dd77mxoa0fᕋK$ O?f; . RJ)x`bgJ *{xmzyo^}.nj6޵7(ɧ>䣓oΙ(qbQ_yˮ<.oljVĤ)E}ALk=u R\6 vKʹTExfκlXw'A777iIX}pD&&fғ;RAܟ (/yoi ӌ ~,nP3Y Hd=ukRzMfDB h\W@)"OQpJJ13 uPOKgy?8) s`a8t1sד* Bݻo;vl̖n:뭳X[ns8Ck |w:޺6csSto3fLĖgsλ#ny|vuյ-ȥ౧<#jA1b?pf/C:r 2J@ Jfq] /2Dѣ{tru~va±믻I3gi0eHg2]pA]]]sUPuMPj@QCk%\zv5-ƌ2WLOf RJJ#Ȳ \Nf@Qs򉇝pWCS?LniʆiiPb$W@WAmzO]v+ |'UT$䇧ֻ]k>쐑#<[}yCKw.8Fl 9L&z-):HPiE!ly{umM]~#=voolj+z?ϺFms&tj:ֳGkŲcTʶ#T%. YKDlo;$Jz3醆=f#!Deum>(ab````+΋swz浤Ku8;̎GO9=vg %a o?̳>3f,^Z٦Dv1Y*aI&nI&+*b6FRJ@x"dƏřƏX,=!+ (TfqCK5?2iQ?̳s\(HRkY;c+E4/nqΙ=rM>ٜoӴ㎹7!+:Ygw؅Po~sσ.g.dRRJfnRJ'M|҆Ɔ{sE?͘q '4%bKJ;˯&pҒh4v%ܒB45SrV4&y39/ѨKN?޺ƥKuuRH\JJg^Q{h̎F/?J;tlc'i1X"$[*DZhd@~-DMX.7ʉI2/'nڈeUX6#NKs3"rM{۩[׮{}ݎ>ō :~]WǸ ǟyoOԙ|k74~ȁQ"Fx=MHB퐃o}ߎH;;wiq[!Dq&tr'9M-C Kc-p(/--sϻ[t}\z%%Okk zM7Jw~/۞(a'[hؤ:}ACknp>W]ra~U'>6[nec7O4ɲ$J!cntPa 1!+rI#rU:1!,@ qE"J45ҒR^-o$.xbX&b-D"!Eĝ:u9yofG~"PA`4CAۯ@$p ~bFqۮ @Ėr駜 C=пlC:_9޻8`;0㨨-:+ [lhiY~9op`+YJ~5G'Z2*qav!6 p9Oy;`p)}n}hRH);J/ BX(XY <,:S^ 2 H$jQkqCcQb%Qxe{_SN:;oʊxSMu1G1j䆭H$ /!"R-]ҵ[醛n~w_Ԓ`&%Іr@KHy1rA p76?{}\xa%+r`ŶD~\31) md EB|0 G:r"""!nog ~:!@HGnd:93gʤ 8ˆD/fgX__3z V[lO66-I&MQH͞= /Xp~uukGk103"b.&^ݵB~J[LU"5v>=~-pP:U:(eנљRE^. dfJNK*?aVvi,mRrBH)ǁA$wGwČ̊(("Gc]g;m !2@Q:G !?gi+3k'3 k{{ ؎m`Ʋf˅7 ٬_$3hU'a6WBwb@PJYv~M|Mu#]r9<r]m' h[.ٯէ! WѷX FS{y9!@ng[}10"O^ԃ:wĒi8* L i8qpU32e Bq=/pV cx?xT0 BmNVm>׮XV""%" 4BJ)MK7 mP.f4cP7TjbU)p9۬kQ"\m```!R--i4^ 1 oĊH ~P>bsML:wuwl6`7"t9̄|,zc@*]{AHm(sod/Эr>Lin9̙Q &f'AemמDH!ZB 2@!-`כxQ9,]җ*`]KY3L~2I> j,ҟ k#r5wp~f```?"5/JCJ@3ADLPR~r0iBHDf (upQ8CC?3rבj0k*Z;.WBaLGV\P^1`%w`n7b?7{jE{&E D|"kv-ҳ=? ͽ /! xHLٽP:vb:p *pO?-[-/Nz=)S&?tꫯ&f3m (Ba,,+mzHu]Mkkj]}'NcƏd&q^pE}=s㥄^zZtlx[UUY*g4`C;Z# w'(LJuX ,PvL[P 2LF 0N?W H)8:81zf xiz,%D$Rp2t` "{p2Kv!C,Yb.@&}q!TKB'7ðgIQSj=]}էv&o|]w]{u\;>|WRvmWKO?ҺSN=SFbRCɷGnAr.\`_F vE-\ev 7C zpyI)<1l6ôiݺuj-x}p챹n֕Dλ;onݺC8,)hn]p {~xT0\{me VjF&ŚJJ=vO98Ls0,E M뭷˯:pGuqƛ55?㸏>s.ollj^ZW)W\yO<3zٿ,<+'oN*87_wnFb/xoIfΚJ+<̟g~ǝW\uՍ78.1ueW;S*׼W m!@nMu sY{y~^tq:ХKRth.^v]qeձvnyugC> hy/̏cc^e^*X)+NBǛm-uܜfRV)EEEvڵvmmN ^s͵;uR$-[{w>n,)[ZZ~78q:J[3hl<([<`^~6^t=G[n3l&C` `̘1̝+߾ݺu[sР!C}BJWQsKs$۶;u14DoiM7"'t;$6̩ww޹_{u&DEk{o]vC|ŗ9DZ,KHYEFsG_0POGVg%{Ȋŋ~Mf.Ĝ=PBA^^ d~e_÷2A/H"9A+sb]~[+.s&u˼k^!\OCIzC@DJ5__hs^l6 (ߥk"B)r;s޽;"$SK.x]v?oǷ&1FJm```P"Ml&jck),T@Έ9C4fGcL6'eGUJZϳf]qUl.粹ct /Is6y䑽W}%Ot_~nm>t:G̗\zY}}]*B![sԼV^ %X,s"={/WM:Nb1qF>,s۲.bUsW_}Jw? Ù `AW2] bBP!$ߜ/QY&(,m\Q-5]A bտhľ+[wh6ǹSQ?oq߾}o'>xPݯT*uW?Gqĩrz .묛nuÇpxR~"nK  P. F}+SK2`.\oqsq 䢻,*zEɼ1N lEa /c {\yoȶmI);no8`E]$Z{^{mذaw~[MMuSs?߭[9[pGESԈ#nsNk.n _駟>|nI&I!MIUPv/[d' gAa~+pd/}GH}E oSWwa@ WZ:/ DDE HLD^# 2l<#￿I& E-skEQ(Y@ĬыqԈBs2wjy6KX:tQ:ޛ`w 1WLplo(j:43uX\`w &\Xw>sB {yAףQ"BTPO_}w}魰HԏR )05hD$Bw\=p! )t,$h>l`````B(||2H9/LCz\~~* 5>#pP7{Dfbb(t0b>7F@ֳ̊HJ))666}=zj*~NK޷ބ bQ`!}eNO%,ʚ.@_SNZ^9ƻۖ-r_`>70q ep/]g=kآ(=E!cVJ?l><2 /Ҋ+Ù ~<^RX9͈9Yf 5̐ gW V, M$Hn|\d90 (Za[P> Nr^TZ k:#0칄WDXcjwPA{б\B'$ƅ넮vt9̌ ßLTq7Y"y֩|({ !I2jdE' HD@L,b~M{ IX4(o/&F@ɂdO/˕g\Ù ~0"luK!L P$mL૏erG^w>ЅIX$eYDȒdX./' Iyj-X.}! (BK!<@AuTkB'@F\)Ȉ%54.;Qe!jaH:,[3-IXϳÒv >q +.5Y/0oEywn4|5DQtśtABHS;05ϹL ~FA( 0@9,% @ < LȒCϢ(Y` cޢ@A1CSt.@6ۇ%cpgb y=#{Aa_% pu%)\ =X0`Y|,rY…CG@֡q l{C33@tv-',B2'k0|F@̅2\J."~+—?R.{PZv~ZxC;  ~l':? $0h&l`{ 0a pl޶IŸ2zD8,s, N h!ۅ:%U8o? @92 l:eOa ia|(t$"̈PPs85{B,*fT@Bۯ\">E\0+D M$1G` g!Z(X хz*#!Y^GyJ 3ʖk*"UƠ^bgX@p/Y. 9'@u.lI2DmHg**vSwFȀS8RV@ ,a!X 6- LIpG9?b9 @L.(KEyN^̬WYKD 9+wiPn@A )-$[BV.bB0" @EL Yj_90bT- S<} 5^!p^+jDb@bFV|DX$\ |  `DFgׁ)R*PH> B@P2@`]BP") W@DE $X \  BW %X%:v-$$X da$T,1(@d-&l.frA)X bEZMg37` %TH%BrJeVEB@X mZG%# d]K2Z`(1!A2+ "*e+£; eA`?MY`%`-e~ m W*QȮZœEBP+ìB!H^A2#Cx|0000000ukAH- -^<ɻAh(|2$KX1! lHĮKQ*`X4Lp\uА9"A__(Pk`Fʻ)H`Y*I8@F.R"Y $[ Y""J!2(hp& ,@)Y!)EZ$Y,KD,B@dDFBpP K DR( # A]IbA$0X $KDRH Hݼ(b"vs1;] HO]&@0`JaN"IA* R$vr@$E76 "$A,]-I X %30`312J[T[ V|y b߀,H!,lR;@%Y8\b I! , l!EBeJRB xK8W!l``````+-|ӟBk(nm*kazuJ3HLvcdɕ hFkHI  @dዕO(԰\S 宠cnP*DfOnfvZuZB|Ct+hq[w;stM˙]cOV-ŢS u-~lvy Koo}t<'#Kw}y]O?^ҥNʭTs=^Pd-`R YkToΧSK5͗2=n4*Xl uv ZJAf5:aHD iGn|q#(靇VܹG'>޽Ư eTv.|ψUE-T*&}SlhlP;m]yh{Jx1/7:Yńl8wS_HYe.{+?]fcQ ^Q ȥ}'%mbix_- єy)VHPXj˸ p2R(B/b@{5o?d8k6bkvI7Ӛng%ꊷ#Ri!ؾb!bN6q݇/m!wyݲ>&ucͱթu!>FX(`P`@DjΌhlDe#Đg _n婍"ƇUr{ܘ- FBJ fAOM(A蔽T3fZC/}~xI㾟.nܧ^:_ҒTk|͎t;tǸ*K,8bRӵ;UݷJ-pY_:&4[H)P 3.9rvC5.䛵)+M%n82v@D0W[z^`v]F~51weӀfP{ "oFmzwgvR}u?kވ-V>ab`w}9z4{emkRzE]eV""bEZMuZ*WΒt`.?vM) Gb6vbO^[߻j{Tn6ѸmuMߖ..jr괗~-Dw]8g+Co\I^gMl%nS9|͈8֦ ?p"2b+300Xaw~x~ePgƄBa7y?6eFfrK~W&U%"#;Beص 9⥇ߟfkD垺 .\&8knd~1#'ͬTyKa %@D)>M@m*X.̅<] ]pnyxg鈪9WL=fqӡxʾ5[E[wnOSےsc9{ĠgϨ~Q%sy;eA"MW4G}ܨ'e_u# Rh1D7ϦJ;>snnnZ59GKXgu5y+d#ϟ=[= e"A5U n⧿d9fX8YdDsWB` {6HgNm:+ڤ:w0{|'D}ےRQ́/۴hAnlbZYlR.4VYy Dg}Ig\r̍mًDU7UMrznik.zh/ *6$,"*f蛟?jnxuaUK\\$~nSޟFU(3$v8`3Zzt&]4ZI؞\=mNH.޳7ZmP01(UX5>Pg~Gpdgk&!5l>s =^z~u5n5DߩoND:yëh 4-68wM?-r5cnmKU5\G/48Yfmxt,cS3F MҎu B/s+Umդ{&j"TLepYqtUccKO;s]jGlf$pZk2s@/鞃*J W1C5-t#"&A"+ŬϢ2/^{wک+xJ v"ՕVW*9EgD<.?YO: nOW?)'݃JkHgWu֟>[yVHuEž߶5I_fȷpVĄ|sLLJD9000000+C^g]Eer%2s[kT2 dH ?CV,V?zE警JJk46.+q˹\,bE!PhJ -0~_eQKS.Ӥ(avlUX"b:ţ$>޴5o|N*XZ<2L Y2+]/}LDڱ2"$`N0[d# ,"P !6稔#_Y#556*3v+S;KHךZ5(O`.T&߷.N-.Hc?s2v̗37]i'*NܲsL[jA]k=nT!ө{~MS2S/qlth"2}܆QWDrPk׍|HtPixd0^yyJq?$H8,fA( U~}7wpGoZmW s-#]{VIras*"D绋;׽s$&lJgBDd2/||OWC400000XuzdDx+2VB?1TR% 2a!t4ZiUMk(!%`@% p*8dwr"M=3 4;)k1ō c ohΫ5j{y'G?dMy^Z" ԼvNSH&. H r?֐vd} $Fv,wރZ]@Xb[SPɞj=;/y㜵'UX +#l§t^S'?'rȶ6 tFF`bK8L ٢7@aL*Ifw13Ӡ{>ܼVխ**8rY}>;kVΊTH"v 5qDA@C>w7O۩<(jG<2ƃVK3?YX/̪X5E}4'u\Ŗ½׫ѹ:+"NkMcħVѼ&٩/ػƷ$d[ge+*Bhz,!* , Pbdg?8Ԙ$g8%[2" {նڪ5fEL O˶*B$OCU:\.}C#\lY)-BـenRS!dc_92\klHSUd DCRB抦ʥ5QXִK &dB] uKxֿ/Aqp`Wf1D UZ²8"??DW: 49:93ݘZQw Cn_] s%-uy@|V+ N]nU8}i 1j 5wqrkwҵKbKTea~\eE,n ׎w4$4-۳#JH@BFWY% VMԪd^49l}Q8GH$gJ@wܒ̶X0>`N-JAg/&@ 8&UCSKIL^C*Es:M0nMNV^޸QY͔˹ઌGa";okYotZҍdfҧK6ꩺVWP8 JfsRb&uE/o:Kы%;.V&y hh g3CN׮⓷izlpA9ń UV6n1-Q{Ѹ=*%ZJ0 ];7Εsv1Gv/Hfm̶ Cih eMάu68 %Sv&ydM\b;HNϦ/[-v]K۲r*z|ݫvLOd̽圣Fw91Gt/Vuiw21y V:E;UGz؛nwBTCmX`!7s!xX!`eBwy)mĥצ{|Y9&,iCZVŠDy],::jO|O&g`Cf-G -{."{ۅ]Gz2cёDۚXT߅Oλ䀺o\wO~T{ݫf\Yy,z.),=v[5'{ҋ- #*UM_4bjuj] z+oLsAʪؑ  +Xe$v)Z1kڇmU#,ӟm<%ߣ"z7s/ۭf|MW7Љu5/tMskH}6޲Ӻ7,%[2?w/7vcQ+~)IɖЇ-Q6,rI;ފl̞v;lXP0DEnbDĂJ,, P Jy?fwΜ= Hyw9gݝ'lu ?o.RemfF7>tԣ-,a! Ɯp< 'gX7M,,,~}\s]y_yxyST߱p8 ?߻[F,-I-ixSܷN5=3M[?eWzj~2K4 k007|f:ZN`g O?zM9ZeAAFһ柫Oh@>»wq;p` 8l#|l5 1/(1HH !Dd\|s&]5%(O0ϡ( /70W- $A0vێ_^)H2BF` w $J@ @đ80B0@IjC4(v2Ƒ1!K% 0!0& #)ˁq@@u)%ㄪB 3bA+" !1D $J.,9!!0P"2$ d9@Lw HdqF%L 8#ǐCd($Rrd$Uo$ĉ1HGdDdޓ~'BׯCoՋ  kBTq4!#!  K$0HR2Fș$&X0 !C)ȹgIDATX6U!9s&Q@猈ΚT ߤK6~\.3kyiEM=64 S HDD D  2$t#2D<}O+ WHESuZq2bf%OL(YA$ d(#HLf1ˀ!pcw{%!.$ws$$Uf$ME's˔\)I#rIBDqDH b!qI2JB ""=y H"IvC=C)@d3Be꾩r0r 6H$.\$A8.Е $$PMCL3_OD0" ) I !HFHIcUjfc=Wu93*7]z P*+ $HF@Hȑ9@D p3DIR  CBr!p&y뀒k#" ̪7nŊAY{9w7w*ڸٷ:G""$JE3aƀ8g1FQ#D(%L<.bHeNGh\6̅bމ"\e mvn҅ A "A!Ը$$R60D"$RY# A !I)ɉ0ޢ& (]Hb% !0bxH I aYDd1 ar*]QG0`LrV9c@W7c(Id$f0fyJs8C\&]eK(C $003Hi!I<@@%.nI@""đ$@v(ફ P띉H1\Cde _ @& .cȑ0(Pf@GEB',+e3t@<#tQr!B2)COg&h= -$PxEjG#9~r T`A|kJ )֊$Id_c@"˳wxz3RT""9ǠuLz!H=! %`1(vH1L! 1$`ےyzk%`3"In%Ƃb Ae1UNRQ'@JɁ!T I2K$E<,t7}r1 ql(ptADe)p@`$ADR"1?f~ԑ`($LɄG rDf$pey 'HC/7Ě\D"`! Aʀ[r1[XXN7|MDLR8!J".!2$eih5[P cA2 H @ 2N!H S'@DTsJHYm|c4T5f[XXXXX|-) qK Z@}s0SG,8ZD#&丕#sP .2|5I"@b@=+H$1n/ qATMB !S2a`B*`e k!0t9#xzx<8"*{bD6[nw#Q*A 1N^r!r@<+e  ` @(2B깗M{Ri=1P]&r8(N 롧AU2* |9SCMY`̳T ʽlT Հg4,=ƤK3FVQda+# _͊! R 2_ 22%/T!"  @8sXWKA$cQJflaa0҃E(Kj&_T+)$%g~!o$Z:maBnsrqExo#Hה$ѢK }q}^5ܭ#0&]jh53nbuɞt@HDkaѝxBߺ|n8LK ~,OKYf!;zp;SM>΢7F55e0wݤhh̕'0,6ٱoʣ Š/W_\Ut4X|#wPad$ߚI*$ʰџ!*˙-,,,,,V[rdiԏ"pN^^J,AbYRV9ΡJE5Lf +0 p_'%q<@*]G$8tzZٟc!HYFŨSSuS:ŝd)74ٹ@xSnQf- yh1iPa4?b[jOA28jwC22Ncэ˻C4ڸB`nrI[Xh %8OsFfG˷ s$:IŒEr5⚲KԤhP8~Ug8EHKh*˙-,,,]._0:NLcrȍ%I@ izf@˓Ad w1U~|3`?t?&+֕Aa@ )U(,.gF+d $?S:2$ 4 ]e&m)\A $0Cva5y-5sjmm2>w]M:jG4TA(?3nE7΍atI)=wfX0WHUDH IC\z ܀U2a}6̻L!BEa9E6[VX9z|4$/S)5J!,Ju|#X PfTe)TGƙY} 1oO]l~_ЎsJG@ $1D΀3# ?Dm̷=s".hC6ͧrDF&ht2z+r Ú!_qg2e,P .y?W8K4lؙ>d FnLKEWDYL )HH1 %v ~jyhF.D'fD[¢Z3Lv)_z/] *z68/  U|zż^0@eA'\a*\1Ιv#[% ZtmKad0Im+C!=29I$ :U+{7I{+)!'YBP54sx9O?ؠ[aF|CYʥ D]ldٮgT˟caa AEi"-o5^gDyD$U?[T0[> "c1*1JF66am,Vl~h](̧ޝja5q_EqRsD߿U_u$D L@$Xm[<n͚U~mPAÊb#- ԿL*ͱ2ڳM]6[8|^jn`s_!'# h$̹8F,z8KE}caah-'3&Tᒿ)2PZHHyKBJƐD*22)N2X:6a#t$=Q<{g_)e^>N65Jq9cDƀ@z:g˘C%IR&#gtsnJ>I7 ʳ+iMs0tlYٳ~c=w]2K>99M4+k|sܗ7*W^]:WraxKy>EE:1[X6g2JF/ۆ!3f̸{{UWf]z'ñ!|FX:U1 +ʊC9G98?>eKv /08UՈR[,ib}C)l*S) @d<ׯv?T@s0t&)_0!@鏉Hzѭ=dDd9͵oL^U^^uDcʫ#QRJ9@(_ntiySt]y¸q[n/,q"wܡ:/,^)v"-s?v:X*CkA1WFRs"\q>| E^ϜE.Sm6tM7#F{n[n/? -]x[ 0 vu7TLw-mUMM?;ݻM7CDOw:#ȀypMbQ)m_*b⑴R&ޯE* :w޵ϾriW{e]! #:7+&=[os]=wܨ\IHO:CO?,$ #xЁ~oF)twyQGqԛo;];=P%Vp㰉>x7q%!c|kG`-QE]ל3|9w՞oaa6 6,.5yItj֬ݺvu]CaYt/s=+++7wxp$|w<裌榓O:s޿ޛl/?:k6_}U4x(-?<7 v=oӨ4tn9uzW-1JShD躢& ͺ]Jz޵6lMŸx; X=[U◴V9we8+_'۟uw@d3#b&'"pڵksKK*㌱"tҵ<{o-ҹSgykkO?[}{;imiyv3#v!rc: Hr53[XXPRJ5S)5vupM6~Ztsz M2dL 5%=U۰?x!S.ʊTAD=zuqȑ v`vY;?#֭[r˙bB657#ѿvC[ZÑ1rd$9sG?{ݢcGF0bDEEe"yw<]vӧ[l駳21%о)*zHJ)1vɷF` ƌ93y`ͣ*h9׶mmy."iገ)lvW~eɢ{W4 ۧK.RH ?>v UW]yӏѭ#U[ 8ZXXX桶1!:A-RyMЌoڥKtP+^:W$A"&hԉD+ҙ,qxV ~w7d2X"In;w_q}{I'F^yU?ާzj2W]}M}}}"`3Լy͐֔Dl6-Zt7Rh$dvN1 ):J,}P+lIhT AFH[4S6+㈄~ еjso ~^ ڵL""b+ )8gg3j]WWT؜;RJds/K/!8W]y+{oku`A/Q0nml RJHai΋K\z*brGۿaO,waEEE$"fAvn.rS! M$ΐ!Q$\wuÆn@& ޛl|miixc9Gzs2ѓN:λ+ /wyDk.xlimÉd2X,v5Wy2!VUEL8R(SXvX=w" NHdgDg&>D~4P@}m\Xmmmjm;k1fݻh$캢 YguʩTVU}9#GX:-P8&[nR0ƾuSS9nj93cQښfnCcC]mm8'55D=tq]'x 2L~RJ2sM36/YH8:<4gqd8!5,ӂu<ˍF3# ~Ԗ*g%qc&UW]ED>a`;nK.h$/nֻK.X8䤒FD?/#vn{˭뮵uu/宝$R4j'_.xǏ8Ν:TS֯XT/f$@J!CA31NDOEDT[H#=`M ?JLT5~mmmom;8s;=3dJex`#Gt]Zpaeez?c7pCUUU$d]Nno&M6lذTJәO>dZ,o`S\:J`')o X,ַo_3$3=} H A)ge+ |.+˙d^ַ{*KD ,D(g{1Ku᥯%*"f5UUUr)*Cass=N885jTΝ6ܠ缹;x<>xȐ#+r8Sjre`NBH n p*9gq)J??L+gujτ^fN=X)i^k_=*pƔjf!,'(Em6lmmm~MFr"9*}/g̨Rb̓rJ)!AuUz|W|uTcNů@6p*s7>3SI=vњ@5m^!JS2_yhOvv'/BE rAXd3+uN0`Ɨ<2>ՉI[$G%0DƘ" 3Θ+\!\8cIW΄RHsB $BTWGݻp p!N}ad6Oh:h}!ȍv+{?3@3.B Azr0nE k=wN$tlRr$b.52gHD$%"&n)"pK H1d"s|1cLII6h oM@¿_̪x _dP2 0 φPUuݷ7]9gX9IRd20h@@*B*.nOu—2DD!(k5B) DR P]VtVDRH b@$\) cEN938"ԚT"LQhTx@r7G^@(! 򂦩QP(k ~~u:~fB>TJ*z8HYTZeLjBh+mB[ !ZXXXfh=!EY(9gu4-W裏6|eJhOEJSA_m( W(>*C|X,6k֬b~e_QircY՞&5ڻ"c8T,h؅I ӀD^;QdHR Ê#fIpN$[@E"H$5^0~qMi o8}CƸHiM}j ʗXsfWQ"IBHaTa!.Ha@mx0qOV!Lp!.OnSAL.x;A{.+m/\jwN98cI, 3xJgP1nmmm:~H9+c+/Bh}TR񜫵^JH> >!b8ZXXXX[裏5[o]tEO>dkk*)0?~ƌk_k bép̙?|ccc>}ƍשS'䜷VTTdt:]QQO$P($l6JQp"PfA+2VTT$H$tH$JbL&8gϞnFfBx<^UU庮ER3X&b;ӷow]5LMR|kt~|=zHRږp88N:bl(9cu]WUrbСCU(PHBJYYYn"D"p8LZp<WN]~o:3LFX,NըBV#LDT\J)+**ܬH%:&R AU|M>B&Y! T _UYPx+3` sxPΓ<͋VF5̈ˢ,YH/f:!^`!D*-D^㉐/~9 JO)Wmmm<IaeA1sT)/"cvzIȀ1R1ƀqeEXXpe/Lje`Gbicdɒ~N?~|=&NERt: tuuuP(Lbu;w ts8j8fBT*ftZ1t:F18bDzEe2#LVUUiLw4L7`XUUL R}Yt?qu]ݻw2eJSS 9hTDP7xw~m}r2o[)e&mJjjjihhy(BTWW !9:uR8***q%KmjiiiwUcu]uJ f:R*]QQŔ8R,:vtb1TP%|~|Q`smW?18tXp\C#Vh w1  0FȀ#!!c#@ H Pi Ȃ[BE?+8-[XXXhXؒ%KcM7T;<È4UUUSN5kVSSlpg;/b<{Gd|e˖m喟}م^f'Lp50>ɓ'_~NR ïګJDÆ ;_~yᇗ,Y2f̘SN:UJ9dȐ?^{ʐ="7rҤIHd>!6liӦ)Kϟ/VVJ zٿ%KhM?'O:;oذa~_~駟Nӛl 'ХKK.}YCC.rGpg͚c)-ܒH$.N8aРAO=̙3ƍ6lزenƍ6hgumֻwUm?nv~xUUU6}> 6 *sj(mV; !$c|^$/9ZLcT݆F- H JhBɋd(G&Ix$mshȐDKщE@$ɏ᥄.2=/z2\Uy |"tX4OX(F7|>Xowޚ+*9s7N7oޤI<̫zCx`7+.-cM=-˖-_2nܸx1??wW_p©S^s5;vѣ_%Kx y Tyhsh4ZWW8kc}ilKKʮJt]Bl6|7{p8Bŋϙ3gϞqn!":s 7ti„ rW\{7`…9{''x[{ꫯv媫r;2dȫxksι2Jm\s"L:K/ Bc;CJ9mڴT*k555]y啣Gnjjjmm5Jk?^X E~)u2E3ɧDեੱTz<oΩ1}x*~v9}:koʶYXXXX~\w}G1gsN}C#!f<ȓt{”09v*/Wy{~+gϞ#F(TqDs=#"/xkkk7t˗WVVa6lnݺ͟??J)G}衇:Rgg}***z馛~B~wVht]wD"q.]F '|F?w߽nӧOUUI@mڼ61,bٳo_Ku`ȨD66AdA9h\_H(Î<H4Ni{~="߮p-yjaaaNBϟBBF5]Imnwޟ)=Cی+{XeO}_|9w»vM^9:WGxʊ62W@ [6:LkJBDžǏ?{w !cTjٲe3g|cV[md1B!E竊*$˗Bq+**.O=sΝ;N/I&=S[n{ٵkע})uD7ӊ!SO=O|{qi9Buug}8N2tG5N:?cSN{uIJή<j$飌Q*f='|^ӧ!(e*mҥ=Pss, :tM6ѝUCZR__hѢs9' )d2Y__F!nϞe/vNY5jܯϺ}w`K.{wj} w吏ڹg~:nk]tY3iNj~wygFBEmg~lxxǞ~6aߍȤS󟢑糓֥g>"PP;E*$bG~s.2N"9sޤ&HÈ./1,,,,,:?A:9ݺvm]Wǝ~V68gjՇ~+N?u7ԫWO8!h3CnڷzhСKml}<&sQ$ɕ@Cti[XXXx0Ic(;G5x`R*n >g:sOU[R)̀՜sM:ԜuY{Vk+++/L&s}}V'ɊK.$Ho?]E $!0cDs~Ǧ!C0vyoFV҄~{챷r[oݫW/ej2w}mywԘ 0fue3\z=zxΝT +vy6M&gyg}cz;h"}uujjj?9NP[[lٲݻ35/|BڴV3bȦo2xigs_8?;+ũ9?<ٟ+]NS;z_v= kG{_vTs޹gQk{{{_ǏY~2O?6|GK.Y#L._1vwǹO?z{}0ӷO];.Dx';":pC dt:8-Ǜ 3d3ga8"Vq=7bN$\+./M<5'0̝}7޵0`o:.HÀsGe`O>4\uŕ!DreyC7tM^QXoȠ8uH$ЃacccHD555P ],,,~[5kV&b-*d2+Sl6RT*UWW纮vUy[ZZ***Duu >s9_}4D"555D"WUU)[x< ZZZv/M$H$JEQV!UdR TYY>ϝ;_~f Ϊr***U1d2YWWةS'e =NWTTdYD\UleeeSSS,7U*p8\__ߥKT*U[[N5WwAQp8,t,kmmVOOR*Y6U#;&=H)a0㖅E O>:ɸ_?i /pڙNy;!ak"w{@ W^~X1v޼%K9-S_YodȒT,U)PÏƟ~l6˼T>y: GZ)`Ǭ"(ͱXu]82"i~sS:JUWW; El6f]U1T`M2U9*?a3 HZєHRxEʹWknU&*EST8v]7HhD٬礒o)UU`,?Y&QdU㜧iEkUD"8Nuu*M ȭXt$BB!{LG ÙLF5*b>rΫUuPu_ AT ޶ZCLa 1@s/@J&\0D@Ipze M 瞟~y>묆H3"|gtyc8C桊LSSs!omn$&ҡpw; vҿ&;KHH>xgeg/O(M/`@P(e?`?hɴ߷ݶj0RR^)mߤ|sg`d$K3o;d2bJJwu%B .[No>*#oo嗷bT:NgfϚMDK,Yocf EVwunڧO;Ǐ!bd^/܄!f mAt(K9Kז(`ȢŠ3X.ʤ+t|D6X T4?6lXBoʂz9g5ɷF/UF${% DH2&IJI:P:rB,ziϗRp%q$D 1~'xg;08)H̍, $ ZXXXXG<ҧI"TzUх;$UGAJBD43=Hc!#$c#`sMYXX_(DZ43 = l ly;`*-ߪڡhUxTwnwugdD` sf˪H"r ''\"W_% ͙UW]O-e+/w#DD bU>Gr7#꫒)7% %Q8YbTZAF:*|19GI 1`ԍt^JHT#0֙ $kz -,,,V+ -m/WL3fuD=_t:⢗X|Vfp2,m>&xUa2!nrDҒC,ЈD~F7oR!bzÏ"`t$92 Hkk~PP#p#C0*[XXX)4VLZ$"IR_"B"C˕Z!h mTNfj,5B`TFbZz4R_x0ܥ tͬw\~(Vf(E(zr1G KK͆_i;)I@D bxܒXV3 =,HgD*C$ ]j*usl1_}zZ( )B^yXR[Xd\Ufa0fcr+ovkz-,,,Vtve3(WQqm-sfKOPK6J][fP= =/VJ^HE !ϟyo{F튊 NZe-ӵb1@[*3.<,ϝP"Њu($ds&yvx~_68ϱXLYLO2&*[XXX0ݵѨsdYE\btd rԜ81TGo $$1$Dθ{*3P)hUXe;Ec/=][mwkyB řWlvU7"E8?PryP$d~n% +] Z{3/ _[K-,,,Ve^ܯvi9T{Z,%Y&ĉƢ@F&OoMYqX$Qee9cIJ.uCB=XSY%Q_Ujlt~.3==*z n4u V ?#bD9V .5*n ̺VyĢVc? ˥-,,,ʣ,RpΡ>`v-b s.k檨/XlaaAzRQLM]!e-3r-t( [^`Fq߷Ms=2 szT8hEsPJ!YĐ^b{\rN^@'nφwY;v O (~-W6imXj"qt5=dn G#;|ڱo'/ky7c+Iӻ"6e+܅R̀~ %sa:lP&6-fPsVjYXXXXQQŗZ\-\-gX`[4^-0ߎHR2D˛Ci@T+vTJos@мo4|-b{SHEebyQQ¿x^ͺsj"򅲰Lb=GmP5ԖI˲̏;Fȁ_ 0n3%lq PTi|;=_ H+>^=aE2ClGD$'wzDRUUDdsssΝ$I*T_XPLoPYcA@Q&:N UûLc:u@*jO*BG_Xr8/coL˫²)qHO$Ss_P~mhX&(##¾W?亯B "0_i& 0J##TUU=_~o{"  Z21 -Iy2TX31uq0͹@ MbWsQFas] Tد-[6sp($SDž<stEELF2lUUcUJ*+5eOe+2pKIB՗Dϋwm*R^s|z\gYUQ6T*%Tzx" /_N(n5B5tnf6N]\H$BP*fXld!a.T'J>- ϋx=XuMŚnKVXT;TxѺ,Xfl&QL&M\xۀN 9laaa~Iͪ0+b6rȮ]:4Hxw42~d2~q8C9^"H33Ti V_ t DDQ׌XzY) $K <ɜyx?~oID͟|LFaR^h jř~mqRTEE?>餓MV]]H$bؤI~a]R M*_=BSnd\n(,,,,,,"z7/?a„t& J;r}S16[lY-,,,:#7L3kfD(9T֊͛7Ot/'~D"4R8a4I$P(&*DJch:fUW0TRlΝh4"0Ri0p]n u]X>}[Df ,5k< -XO>DF8dR'P(Np6U~x"J)=Jk) 1!UUUjG"l6ȹR+ y.`U-̥p -WbzD<7p <#˗/O>w-0`GO$!gGVlaaaa"W͕X[[+hmmduuuRU0XfQ_;p衇B6ls?3H$| A8i3=yԑ=رǎ3f/\SS-:1cFO~ar,MR}wI'm\pAKKNgçNqǍo}~X4J8!$H)۷y`޼yl/"?~޽ N^x%\@MMK/t5לvi&MB>~{饗nFG}4|ڴir8}}9NpN:&Lsimm2e߯h9uʋ-,,,,,#YJy{{'xr޼y}=bXMu5Ck6XXXXcqMx㍫wޑR܁ 4:ٳ 8l6{ر_|rνG{玃c=zw}D˟xnXxq*ӟtGm݅^(D9su]r˽[o͘1C'Ծ$T0%M7t…D4gΜA 8pܹ~-HRp~ˎ?':_N>.k>㯿zȑG}t~Zq~_|W^?;PH!Lq_W_}UYY J$xw-Z2xTݺu;x_\UUJS[n?eƘrZnmm>}￯Xfm8NΝŋp W]u… w~\"X99Kal U3y\)pɧ\`m woyN:3AY! Iqf*ogaaaBqfc=k秜 D*NWnٳgᄀP(?|?*e``9sʫ={Bݻ~ׯ_7/~ǓN:v]Wqf`K.r {ッguGq-ܲ0s>z1cƨHo߾n=Bl0cƌbT*ϫW|z[laaaaa:4xww}׷O?^H裏.Z?O;=H&EV5! 5Bd}|?S_2=zO>dɒe˖=8[V4/;7pC:qyĈK.}y+bni,#Ds=}ŋRɓ'S_LƚP/rr6`o~3p@Dt]w7㏷bԪ9ϟ?/ *W"PgΝ;oW3 "Ԁ﷬n/X H8[{-"^{O?4ho[~B{FyE>OG-,,,,,,ڏ iǾ_o~i2N>=/]ORz&R6)RS-"jd,{oS!b=?Wo z:g :,vgp$|"R:#駣>Z1f#wL^{mvݵ 2[naSiHnz%.YdǑ#c5/"b3<3|fmKqcs5Ri̙s9lfÇt^zwމnŋox<>dȐvۭsʥw_}}[n;A1 DD[mO?=`uǁUL qSc?Los뽅E)eZ7*O608?}7ݛ|74"\U:č]-,,~[5k֦nR&\uD\třtW^s$SjCc ?7bѦX,N;ujljd2;unnifUWU[_]]Dž!'FjkjD4mmmUzh4\hmmU9---ՉD" !jjjD:R zٱ֪XOʭa:ƢRJTYU82(+++3L:bD"WWW]h4L&"H477WTTHJwUe9<Bx< Bf2hv$Q`1 1U̷/!J˝R+ 2 2 WWVUj4t,#DRo(|ΌU3[XXO(řkzs=ŗ_n?|+\lq0V#""SfΌ]^*gq&%IeȄBHB̰ͭddX"c1d1()}`4y!cs.R g1]ITjAԯjh&T>KYM)l*;%e ԄyezT"keBe~Y9O myak֋#+IzX-D$c RJ)U~䨨$I)s|BvE"rγl_jn#:b6bipH|s y)"0?9YE\ *4d Q~ZQwomm= xFE!S xDdj˻tH)91f*~q,sN!mKk]~(ŜRP pc&1Y.PV.=.]bǗB#'9)Lc r "")%c1Fy|FR2`1Ol|0]3ȼyUĢ2ڡb}8[ "d'<C 3@ĐpƑ)9,xhC9(>ȳڈƺzgJ_؝Z76 "Z72T S)˝zιpE$q8.Mq31mm!SFoέ˖ik^Rʅ}׷O_Msj|ML!W֚c+ä\rJj mQe^^Nf2@9șd;7vBN|%߰Uvh9xO f: 7od )LW0'w$A.xE‹(ds&Cl]#IT%JSV4c.7qm:6l낅_ڊRJI$\ 9"+a4d2&R1,,,,pNƙ=,:o+sQ<5z"˥oT-^!Jnd3 $qΕ&$0_Cna0sX|IAS-E nԼ"h(5>%9TšA)tl;ʣ@] eXpyKʗ9w2d2LEe73TdRR. ǍJ%Xse=bNeN|5$! od_uk__ ~j<ɼǐs\˒y;w RJk/w7Κ^{^1ΘhXadUAw?$ 1}$H1'5L 9FtCXLZzi5XAC É<ː !Lyiiiጧ3銊 lmw}#ሎcg s~7C`B+Sf $A/0ogXrx$t]7 3Ƅ$ix/BGqzkkjyaYI/G=!E/NnQL{rPT&>e,ڗ\YJZPu%D9stQeUg۴_f9(|g:s̊ʊ8t] 9baaa~MJkkk$!CyQ>PGӧMxaϿ6w}1;b{|*ݧ=q[lѫW/܏iȐj !pFSZW603fQ9oJbX6bx*b%H, 8s*T`$h2'O,L$}ٳgMu_|QP{}0ビO9W^s`099M{l& qsc-Xk h$DJyEyԑ+D:}Ph#f hoL~4 !PiI2R W0Μ\YY tq9ݚbߵQOӧGl6;`@qeH&q =6kccv!!s߭9ۿxW_U!(>ɖ[mU]]=ҽn]{}=C #HT8q;tT׭[714CI`%6y̹XlĉBat'p 'P#.$I3hpDmW_=ʥꤓN0`@8}>4i<z[oi[!! JYO(&?vXu?c=6&Iq#G['( ;!O>e]U8~5T 2yݽ$83NqɏBs}mV[m5vX]kyY9x|&9?Snmچ x:y7Y R)SL& jjk  L&F(ʫmpXXXXX /3Qmm/4w<: i?Dc{ro GH }n:؁Ovĉ~DPYYٿv>x饗E.z.d2sرo'|3ϸ;h'xb4:oj'trF+@mtQFM0U ^EEŨQZ[[?ýqg ^t_/-_|ʔ)555[negϞѮ:dȐmv̙d7ӧpFDLe/!c(O,dȑlqd":H$?Y`eʔ_~^ܹs:F ӦMSQŗY^R)[`&MRg}'Onll;cB~;͛Df̘cw}o*$b}~l駟~n 2cƌ<ۖSOuo1bĄ zd2g :1Λ7ꫯ>Sg3Y%3J}y?'\l9f@J٣G#FDQB1G C-OJ***jnݻ)3ݻ2q;;8qfE0te]7٤wmm݁gH$ңGNjkve>\uk͏=B= sDRnDTQQvۙcѡC/BR677777WVV*\<wGj;`R2~Yh4lVQb)a 2䠃ѣy'裏~38㨣zgiԨQGVf_K-1ZUU[{uuuxc3f |v[xq2nf͚NA) ѣv@M79sd2rXCcc]]7ݴFt kjjvqǺD"QWW;؇bE#jzI$Vu+ԪfH8H$C)eEE^ӭ¢8L#Dk#UB vywfhtȐ!P(*tA*_Dx!ok۞|I9_(]4B>hFo<RDիl`t zf !z~i…W_siDliiimm/;gϞ ?6l#\| N9唋/oIp$lć馛f|뺦R}#^YY?遴Xq"nyi̙SLr{.[L-?̙3D(za |IsK^[?Eqy1FmفF!OK)G8po/~{ʪT*u) ,8qb,A[ ҬmV=)1溂[ZZB!O:ur]7& !DUUҥK+ GV6lD"n FX}Ȑ!sy׫͛xG6SNx>pG;߿2Xn+\gfPPC;%LR&Mbd2+lu&O?-Zhĉ|O~t2eʔ: R~Z|p8km6kz%⍇~8c,J)-􊕬rKzBK.?~;g2z7Pn{ïLP|s0dJtquM6sL4,L(}'|6ۜqtf͚5iҤ>@|zώ3|ǎH$ kTo+}}ݷqt:3}~SNuO5cݫFqXX1zx@}Vb Hڌ18L:s3i8sp9nDb% ӧn6}'` ~].\PҧOUډ'מ|M7TYY9`>X&N8!C~kzt-po6?x"裏f̘H$"8qӧ| 6_<c=Yx뭷N:$9J 6矟3g /c%L>}7omm=znq=[pg8qUW]EDj^ @<{l.{^0AmMm>}38bѩGPHk"H&qGe@Q'"Ba6l~],p$)wep(/t7_FST*EF9rn2%b Z+IE)pȑ;IDRvQ_J&ápMugt}t:CG)y:&%emYU9r@jR e36d/xٲe}sss(rw޽{&#ZWDIDҢѨ.A2L,c׏nK/tĈD⮻F[lE$R7BkE4uv3. ?Br-WzudDtGoѠrs1 p ?򥔑Ho߾L 8#8B6p7qӑX?f\TnIW/Z ujR4TȂ_U<Fֻw/"N#؁C U Z-X'Vz?I/2 N:TRb%6l馛~s6h6lذa:ujk'hnJ+fZrnVSs^uU 1TÀDqx4Ƣݻw==ls?;5$Ha@k]p׷o_8@кvXQQQYYp*Of[*eҟICY)h֮2tnc; BH)8R R~sD1us>vPw nmfv*Ҭwy)\]TڢP 菦XWY@Xn4)Ǡ"Ж\' ]MRtz P_F_B%nT蟄|\X\hyо9 JT~v`evŪ+SK{FuNܗvT4Bn_,_,DDT3NsPfV|YIH*@'VlgaaìY6tSmK됵5&C.TSK] /4JR*OKH$ʘL-EF~<.ӌSj.U`{*jRQM x"IcR`!icHxt[[[J)kjj:RϪ}G'8#ú"*h_/z0*zy}.O j <X++3BĖc!j3bdrݼ$99_E" @EbOG,嗙V,ْ2 P@VjigvA/`rWUXW`˴=4Ѯp{VN\j9/S\UUU @jDlZ2dR ⾮[XXX(\&Muh C`X*\>N`ծPb1݉*h}I)PTJ!tܥ6: /-*z~ᖴC{ͨk+Ty@$JP(N Ds@3g$@3P=DAcWmDbBMDQP/Tl]3&G07lE`oWe*W*w~ gzuYZQP5*Rw`- zonةf02Ii^t7g+*To<3k79i-Q\ 5Wt2ŒZ1$evaIP!#œAI CBA.VH/)PoRd D!_O!rHP%a+6R(~b"ؙ-v꿮G]{t!z^5Qk>IR QaaF A0p9p%EHB !DaaF,ca JH gLkB\ #I@L 8ci$%ADBAV"c$LldAH&E ^fDȉd$"z9$(':04EG`|JVȓKI%skFD*o~LOƘ8*égK4`ʉ*裦aIܼWͅLmQq]{^[Z=E^Tiʬ8CMACT@bU{އ5= 0eflد5=@PTTҡA˗{\9@,X@uf萡~XXXXP+B%*(kRi3pD Zq+H WJT9]%km 6`Q)ccW 1@ }#!ҵz:Uա)fyn6I'3}A?W{mR14JsfgA5KRJ)%BH@bTA2-^}*$DjI)\Á0$RH2.$H̥$ $I+& A )WA!H.oPÑ#I=B@) ID27~I !}g+CkR0H#aNn`p2DTa (ti擦iC3gaKߢ391s#-MlÔTwt!ffֽ"X_ECr\kQ5DuGŜvL"5\kr~)S?!E0ՠ#X_̾Y'kP{-.k٬ny0!sJ z9 BӧOjKdaaa[K,IRBXt} в7Z5nF@{XLEy`sȪ!\kk^.0@;5_s3W󸾶APU|@P(T D"r8 HĴ'0_IĈIb#A "AA"ޗ=9G,}ensnnI ;U֧G.4gB@<\M WB#j'șy~# ,PDAƑ \@ȸd\2̺:81 $LOv 9̑%EqdɑqN$%I1DHC` !pIRDI(GJePŶ!DDL1:K$CnJTH")> HDs< A F(%cqHJb!@Ȁq"B"FD@{@ ?"II$!"om_?~aUuq;_{5>{ʼnDb޼y]vO<ɓt:Vnd2D[oug?#> >l)wQ2:NyHg__xIt2&m?i Y""N:In_7mS_љ}k?ẇ/:7%ڵ/Z謳R 3f?~<L6;O<{L<}j |߮K./ˊ`HdwS; {ZBX7BO&")eSSرc/?\o}|㡇z9L_|Uguŋ .`ϞRYڳO9Dرh)ehܹE_ 5|ǾY_VLGwv#hu,m(^HJ$e֕%ʨ? ASMDxwom2}م-]>=2􋛖RH"DY͟nC|oaswK$N5i"Sן}fɴs/:{Mnߓ>>_|sɇ?C$ A2%?8yܲuS\LD^oṗyKN]:w|Ko{nk=s[tK{w/g㣨ϝٖF:Bw*TD}ĆAE@ 4"bE,J)JeK=ww2[<{~wgrttO>dɒ%sYxbA_|q͚5?(Nrɍ7Ux… W\)--5 6 Nj2^}UD˛6mږ-[>쳝;w>Sꩧb{W_}߳:e.ayyO?m6ŋsrrZ (xoߞͺeֽ>!v3f(.\3gW^yE9W>}_0iiioj$g9|X|VVV۟駍7VUUK̙l٢<[333mbk }Q̺@)JZh``4Fh0 * !E:+aS^1s2AzN:RByqtڵPR͜9) 6l0eʔ穧 !?yM>N:uڵ=zHNN~75͉'FgϮY9;DEEqڵkW[[{x@hRBCC7mk׮bL>ر={,))1 SJjY1ٳ}J&g5Mrr wnjӡC'O;+Wlٲ%Igdd))))O<C>6M-ZHtپ}@hh￟rСyw322uV7Zjj#CBBv (Ν4i(V0>>cYLe!<8D1#\:$8s=nmC(i3[:]5Z"3;% С' j\1fHcbb)((xu:ʕ+>===11QV3^x?5kV6m~ᇊ 歗ps@@@85 4cLH<4n'; 9--sl999LĈg̘1Zca^z5>>5MJJJ=gff:PjuZZ]wh4 ТE Bȹsz!G҃R.jA9qamTR<[{kBH)'Ȁ-QHGO& R(hcBysvbzіGvcɈ5K@(J@C$"8)wuJ9W_oʰ-5NdvkMu[& M'>FHp"|EӶKklʥ[Ak x /^7=`[$WH8(\Lgg|RVs x#&/n\yPŷP}LD~T[Nx=짹r{' +SrR9`pG;boiLg>b6@ fE`NjEd0E +#$Iݻwg;w>s[޷o_II ;;~ԃ^pW^糳۴i#… :uld2mڴ駟cСl 0@$%%LJ˗~zfffefښݱcGϝ;7ydJj-**b{DQTnuklNQۗƍСCVVʕ+|gee5 RRRnF{w#KڶmhxpB޽Qa(ٯ_?yI@VVVnFVewqZkyȂ  ͛@AAAll,"}R$^ߴiSFfUV0 |Ux$G_e |b v~t@jr һwo6/?ӧ+**SSS޽{GDDVٽE$&&;wwUT<ϫ3fl۶ȑ#ؾ}_~9;;ZrJz>wy˩S&MhdW=>TӽK>y虉.DQ8^Oܓ  !Aizݠ-ԩ|qazNNNDDDTTTdddDDӧn3ݻwbbbΝjl=zL2%22M6ym{aaa ? ]v8nC a^ "ٳcǎڦM={;66qǎݻ70M839~/A>}ׯgϞҐ:h &%% 2=//k׮,b6mڨT*Wq.]FV+oGaiegKR1PӅ2f022|vڱy9r!CAqq1 #h7oӾ}(ǻ(+'+~gg"%pa]gG6%GU*P"ӓj:pܦu}D9꠶{ :C5kӧ9.i:TRxѸ~v3F!&k.$J.Zt g-^l뫯뮻xw8/_ܹ3q,jՊ]h4$Gi!6-==[nl^p!11Qx322xw]eC{;ڪ-*s}58$cmFAHDN$ WFtnWbR*=sk@o:q6(^z㍊fnvz CL%/\!p8 -֯?ѽOBZPWYʭ՟lk1shN!W_*U̹8MvsᅅoĽF)yty)Ӆd huv -iԲ_/$!u¦XndSurB8'mtV/=:Vn݂JQy +%\9TnR9Fש#7*3C˭[v:$nj Ys^a[,ƭ+ IyoƓn$BIR 7n,?FѦM/{l2dȐ!C8cŋqqqR KOO۷wݻwiӦSNr8]vm֬!$++W^՚V+\z]rt!#r8KKh޽ׯ|2~tE'\+יjνBDZcǎ`̧ngN<ɆS^^$VС;F333 [,$zqqq۷o֬[(YYYǽor mۖZVK5kPRR¸k / L&Е+W-[f4嬐;w\felٲtю;z1# o7QA7n\ZZ``?u]/޲e{[opܹSVaÆ=||^y啹sZjСve˖-Znݚ5k^~eܹZZNLL\z5YVQnZR1cvO6oܿvӐ}Vz"cy-!A!뒲+ЦN:x`o*Bӧ.7tȑ{.66vܸqCرh3gΰaݻqƸٳgGDDĉ5FYnZn۶ǟ}Yp8r <#?۴i3`D9s棏>W[[{w<ΝKNN߿?paÆ<~o&$$ڷow5]vկJO:5h HNN裏0;tlٲϙ3gرʱ˸ADf׭[(;;w~G;O?o߾d„ 5Q СC$#+,,I&K.4LL=gΜ͛p֬Yr:wuVN`cǮ^СC#44_[neٲe͚53Cep8˥Kę'(P~xehRwtգRqDE/ڱs936A߷OZjtm!6\_eZv-%Դ?k޼vѨ|HCBBz?._\Ն0mvڵ-ZjM4b Zv޼y7ԩW_}u־}{߿ŋt+&?pvK}c<9tw=3CD% iD>}7a4ݻlHt:QϜ9sJպdɒѣG5jҤIׯ?sL- !%%%1+V=.\`W=f/,Zўl>nz& SH\"Rm}4| ^[Ӽ->@v2W{T{oJbO_k?}O DbWz/2l:]3tI3 j_}-"OQ]ӕM|(5Q;h U{T&͈JCeM$6n6'ISB~%b"&w;|^4GP# t_.N^z>J[頏HT/U7(B ݞ3VwLy .(cmv>'*?}7~{6Igg Um#T :CP D7o޲dwu&ܴioFEE%$$|ΝTT=zs2nR:k,Az޽۪U <^ZZ2? 6j۴isĉu1`߾}<`Ng.\s(%%%L>V-[t:7n۷j:uСCoJ2dȲe˚6mZ[[.;wLHHC_vb']D믿~: &hm۶5ogϞ111kٲeii1cLff&X(7nʕ/&w?ϟϰh"09s_]dk˗۷oώ|ۗ*B\\ NHHطo߱cEEEBju֭{=zR9rda9rرI&ݻ۾}Ù.7ʕ+/$oy' CF~JӦ%9GDg @=Jy=3 L6A<2t|lVkhh̙3hn\\"'|F_S]S]qA !"|c](:- ) 3!AZQQQXX|[$zn/--c-"(O?}v{II$I_HBD2;rͬWVFEVy(=wرce7rAfUVVz&.yAz<"JYYödbvU|,ϣ܄G$IbxcM(@y){}GNMMhN9 Z)((2d|ߔ9'OyVQRc+np}^oz`2L&Smmd4F_8FZo!AO^zA?~E}Vn0Tvy!+B_gh4j+WTzU)K,w#,2&jl{g{g?~QQ+ljO:uH@pӓ _/ Jl(kq"w""E*s@oHr@ 0u p H9Tsr&$!#r*xV ҖO?y8tX;u 'QҪ<9*{;] o1J AЁcgZ!JZyӦMc8Ef+WAA2=( f[w,̋/(z|.+5Φ\6pD;PxЩI uA@NL_~6=y\"O@ *ACJ6d3.Әr]xxz>WJDEeOGIgw)#$+kV8" aX;B8\-qWer:D$Il٥G7vo$֬Y3u1ct=wJzV[3ZvB!OgO܂k(߁QtM4 &csZksJR7԰}&3!A<3^MǹKn<˙噕>}ʕ+zҥ9&|GJnD {zЃqm ,8>i)(SĭBW$B" p ,D DXfBKH("FD!283%$8@@(G81G%v({,O@"(X6V˹}Q?9i'=e"uЉ nRkz1FJ'Op*5~ jZV(ABk'yby ׿jLJ||`WM&<* @2ax,r}aM.Y6<.54}MxZY%_GTk܃& .xX[͍iޛBM9dUzAFå >F1s͛gW==g9rx3rD-eGJP陑 !A<nT_Sm]U%ѿ5 D[_&{1عk#^<@}GI3+u 3GorYx?f=/-t#{3Cuc@@@JRW[4fy4gP&,7$I9χZyQ;e$IxSOmҼQJ?.+{08^$?t+(k~]0lx`50! QBQ*eߊ9$ lLAD%k*Y+~=ҪT*x]i(8"!H5Ttj ԉ17!@ '(0Rvɣ D c|ب #Tr GUtPf]*8pH6g2eSO@$.]+ gX%b:\ED`?3 '*"HH7LTWtzIpn'$zi8ozQR~]}E oD( 8I9f7B)"ؔeʵ!=MRͦ*XVLzi؂$^f?diŲsν{I۶m;ubT*Uee?se˗/+/p'x_dl6_tmQz\xfduXS-€#^֞9s&0V=~R҈N$""P dƎQ ح% ZX"(c-0/(^믿꽗 pZF >fd+c(ljp>D(4*RE%)+ԃmFv,K (D MPQtI 킵VK(%7nbaCE%!$F4TºHNH"d1@EI_c.]j0K%w`%V̵H,"(R]=1,_ϟ?o߾dQٚRy+J݌ڟp%IrrY$-g.)EA(:.R@J!IAY>נϵǯ>߽$Avv'''! $dff&%%UWW{p}@ċ/>|d2]G뭜#JV3f d29PI19rdFFFmmm}3yfOͱk&0j 7}5nS{~bY`AϞ="whJoOq~l624ɓ?bĈ#G5j9/g}O>dvv6uo)ð'%I:C0$RJv{XX_|QQQ̇rgvwDiQ[ہP'Ty@8RgH#Hx QVu{{iMA@K.0@ZqaK<=z`֥< ;C@-rsػ&ޟ7jk;p3  HP&ǟ}cLG~OSB * 8˘s(<8S&k8t%Gpۧؔ;GO rV!oᢴGHv sS dNo;I~999<+ryd"a42Arr)S^z'x_?d]"_ٴZ+TTAPR;q{IOOÅ zg}vڴi?c fV˫Tȹ~Had$j-KK[y:zfQ'&är3vޱ=^WxǮ-";w h4IGxx}>Z_먡!ϣFbxFq .LIIO8oYnݼy󊊊pܹW^YlpZQQaÆ9s,\Ν{UAݻi&y.=Unn_~n ҥKzz|QIXP"@3 q%B \(׆ )?x̙ΎWT BmmPUUURRQFz^{(vJiuu LCb2ӏ;?_K ΋XYY)e8J%eee{޽{ĉfjݺpر'OVk ,Xtƍ_~۶m]tFQ)u2/IRuun%AVGVY(puM(¥X?t (X%ZYc2[,]/x 9^&͝av]bf96_=zPRR"IRZZfcbq\mm^BG9sYXl2ubksp F J@«u3{/Dl~`G'J(gFD(Hȉ쟥nOdznBzռFn? -G!J ԩATDqG˿Ϧع$J J9z}nۺ}ߘ>aP佚gO˾Ky,=u뫞{7J9rcVf@?mh<.Q}3I<"MQv{bbӊh*++vr0 FΟ?!SKJJʔ)SO?>;T*7XIޢ(MII`2l6A8uTӦMv;㱻u't+Vl޼9<<v8ŋs̙7ӣ)R 'c&;x@_*(RC,RB{ZO\;vgP(ت4 EpN:oߥ͑uk`0(O@Il6bwa>@(VZ1#DDDh~u0lذo=$$2:0tȅ :`08LHH5k֠A{˗+ń?xРA… kD6mںu.\p\)ٳgZZW{e=j111gϞeTVVVUURy H\4V!AB ˍl.((Xzӻt"`^WYY3227nܸo߾M^t \hbaDwv8'O裏juQQђ%KFp8&O*dT*ϟVsss=J9}uZmffG}4xӧO80$$D(cƌٵkWxxxhh?=O?ݵkWLL̅ o}G۷nٲ;F3~0fXRRRfΜ'Oܷo_~~MT*ӢV1o&{ŋ#GݼysN l6۪UΟ?ԩg}VR[BBBVV֧~ڶmۼ{_~N?Һv횒2vءC~gb̘1'N4ͧO?YvzbZ׭[ץk׉n8p/[L;cwwմgsG7U%F!g_$z[zDe7Ca%}v9.'Ie_MC\~lbHdZg͚GbbbJKK'Lpm8q]tIJJ;vsssnںu˜_~1))飏>裏Z "PcFtLWz?Zξ=0G뢛ƢӦ!E"-GNx,"6ЁZUiz>_xVD0ő(YYY}YDDDqqŋ۴iq\~~ڵkw^\\\RRrJ:^z1aʡCۧZx뭷!+W5jԩSٺ޵kh4LC{Z-ڵK.pnѪzJMrNszKtEW6nT]Ȼt?{czҘ*L{Dmju檋W7mu䰑}b/jwWpSnuhBAZSSi|6].`.Iݻ1B*0bC"&gWG63 '! ~bٻCIj .2 @$P"o3m"JдqZRu(̚H+S;tit#8uW\wmn H/5{Q@&9];dPZS^M*J-"B.j W_8vbS fZ%QVyNޔ'ZpAw >v :Tw(YYYgϖnڴ(444??ѢEmڴQ}ݹs""".]GYn^Z%KpҥS*Y+W1b/LGy|۶m$M;0 .۷o~~~YYoݴiݻw}駢(꫌M&SUUUll,䰰O?ҥKUV;wfr[+xbF "KlާhR؝:TMSz>8cm(KuQAfrRSSwѮ]K.=S={l8z(q!!! , رsÇGę3gaaa3f5*;;|Μ9]tIIIOڶm[\\*,//O$I*//3f̝w$I?cjjҥKտ Svn]v…ԩS(B JV\\ܻw{x`hhk:sA***'/^Z>`ƍm6Fɉcj߸q+4i´1$ «dQ\pq} u]***>?44t֭'OT*UjjZ:ujXX(:N 47i aWlPzBDƦ"cevH/..y͆!}K5!窴ЮR`i>Pk2F`.-.^آE &.a0upV駟?>66ԩSo6̝;>kݺرc6h/]<ȑ#GѲeR:j*Ųrgy&!!lժU{oJJF:uV7olnҤwСٳg+y={w^o'xbʔ)XNNΑG/^,"㢝h`XH8[4 N@nnig)~wA 1aÆ˗Ā+کSyZ=gΜ޽{77oxK.ӧK$bFFƏ?f͚ VZ3Ǘ\r„ R㏘IEwߘ}7ooUWWN 8mDZR :JP>:;v8m۶{ҥj:%%e̘1**))xAT*UMMdfvS(Κ5h<+/Ŏ ;w۷CJHHҥKƍܹs5MFFFǎcxǎ]v7ns {n:uJ'O={yk׮ &4nܘY1;grIPU gtlk;y"q*V@\ѧ󎐎rQEu@e%En1j aT3.%IaԴ f3es#@́5_/׾.ҫKv}NM(jٚf:ɔ~ﭿrh}Žk1^A$UI}z5*&=U?;x7)lCDٽ{wp(EرcV'FSQQwmذaEsdUպulP6mZ^^nZ)SRzӧOˁssso6fh]SS˖=X2)IүvZDTT!!!qqqIҥKzFMZN.nJ}3f|ݻw ߎ9cǎG~F_vmnݒϝ;7dv9}]wE)=vتUZV;vl۶mF &N(_Aղe˲>h͛7/**EQVDu]UUUՌuܿػIII^9<Ͽk?L3y{~]wu-))iŊVbP:{15͂ nsrr:vNu֝9s?HJJb~3sw…aÆۗ#"" 77cz]vRM;gu:- M8|pql!1" RvNmt+s\00I)%#A<~bȢ(=[ H2!^4u̓ef<<|FF_EEE=XhhҥK<3ŋ~ٳ[l?zYni\T"x+zFC ^$0]Դn޺ ~~H9쐫2("48V5bZDBfb׸^z+_tK.̩S""_eaD,--beHIIڵkxx8ҥKǏg.2 +n 'seTu˶O$T=G 9p]oԳ;$=94$NpjVo.^gFq %D FkrrƵ&ڽ3p1AtCTU@eK6'.b(),1 <"!@%Wtpk% ,h|9Z4*;.j(*z =CBd}zKc %YY1Cԍ#Z]xI^@tJ-(yDpe qPH{_ffζ5֬YӷoT'|O>ЬYkצ|;ZIZn-+3CJ%^ӦMsss/\`6 $IRnn#oܸq$9sfnr[=6ެ'|9EEE322%Ibx2U %"% JqsQNovڴ?#==}ܹݻwgւ k!\paL99n89 㱇 Ϙo0%g3jIJJJR._ܴiSys=JcC4i҄i`U2t(NɴǏڵqh[=z3gwd^_Mrʕ+U*Ռ3֮]b &Ͽە=,--?g̘!?ٸqcYYN9sfxx$IVzA9ABxV5>>Gach.999M4a%Ϝ93x`DZC aVNիW6m6mڰWwq^OOOǎKHHڵ+WǗ_r$CcEkGյ^X_ӸNkE)EhFs;tC{68>**rl,ؼ6 ze|; !=5i=4<2|cONI6C+ xi6k,: k^oC7:v`#Qm f#-` kz@FQb.nډoihO-*|vmKg2m ձ7+"}7SDy/BbjL'|-Z`橈ؼyqƥ2Q3'VEQx)SoO6k֬/|W62z}MMMV 33[nK4̫V ɉv;ӬZ,N:ԹoloIndF~((#С;μO3h_Fh6/_L1͡/FVsrrs9sjvҥN:#]QQѢE f6RXU2ʽpB 䊢Ym2ѤE144T$ΆPYY){fN;vbhp"":f0sϖ-[6l_|Ō3:wt n`5F?WWW7mƌ3bfM\;If{yb%**Ivؾ ֭cڵkիWv^j2,`ѣm„wyG8(Gt<4B_ e)SR1yٳ#G$\G}bccǍ7tX/6_⪪^~eN8iӦjZVmڴ9qp8 ? /׏h9s?`ZǍ3Ϝ={ܹs}ef|A߾}Zm˖-?qڵ?~1cڷo_]]={֭[?~"3ւ9t@6m/_oKL$\mw}ov||>zIu{aR9we9,944I&%%%˗/oԨ``'Y5k=yfiQFG^v#G$I DQ.}GZk*|̄vC&AW7O' ӓ(E+ݻ?tRfTm۶]f slܸAߺuN?~tttN꫔Pڮ];&XٿVV. WO "[vArq͛C;vt|ѽ,oKA@@)!n>?ެY3A8q7nܶmڴi,¶1{fsIIIUUopBD뮻>mj4]j?… eee/={vtttzzqv{iiitt4[;wdz˺#$ P}R̐s`8y28'md0'nޛоo|EG|= )ɍzu/wJM|]c@9e~j^@}󖟏T CJ#kpU%-\m6nqZ_رekr #J]|^6`FTVw hIˮ݋¬;qh-@mFcR2.t!%U.ޑ凩ݣrT-Ēiuwր4!`Hꚁ;6:aXćKBU?fxhwO=3-I m$)R}-Zq xggegÏ>,!JT9e,cz]9A$$$pWXXlٲN:9fR3/0`17n57odD }*"N0a,#tddK/&Q̼#ѨQΝ;/XiӦe20ynYf5ZbETTTmm-RDIJ:w믿ΠHڤ,"8⋝*2S^_Ν;jDZ5k3oq&MZbERRfkҤ+–_|gJEe˖lݻMӵmOLLdRFӶmۃ_~=z`qDȈ]ح*vie$3y/쫯2L3fOs9ÏTV?SC -}3@oг?g*4AB %%E̶z,s?Y΢P!"-IRqq1ܰJKKB.SPPleY1n:ى}']2Xքa&#bU)GWSSSPPRJV+{K.2y "GYU!))iܸq? KKH1,<f%?C%Z5"zDD fD4cTW%(V[rrر*+DQr=Qh4*םLfI(?vA^|ŚogqDQd8} nSncnC@.]BDQ@# C2Kev#""V% HXy1B-FSu~ѽTu+QDDV_EjgDU D+j*K%H)""J(X,PcsvD$wsCBRi\iD"huXyȂyZфHZGqTᨪv6kC բ!PQ@,MU(٪Q(:;(H(ɄL~7#*J$*'T9FqqǚbOmX$Y,{ʔ)e sAهϷn VJC^aŔ+1 QIDFz` z^o`dZoAF.ᒒve gAjj*أW$  / Jh)c)b֤(eK @R7g'NEn>{d AOo[W._eg ~x\58#;}) SM+"X}ű(nP]W( aNjϟ?zh퓓Yb%*zCf$+[f$"((qf+@$N )s?IDAT9&H}/R" O8ǞKE^"tE%GN$/ 3؜$>0I<c޸d0ӧOgDKv-'_8۲fw묢8NξN:9g:xJ[Ν;uD;LW7Ně|"(A[ɸeu*I<<駟*#ZARjڗ_~{uqpj(_Tns|5VZu#uBB8Ad y !xfPlJNߋo'^>SǛ\Rix h(oBzocu|Dﻥ++H \.).H pNv,AT5, {]^uJXyjNrߋ1;v3F9W&B~y~o xDĪbJպuk!^^EƌO9򢄮`%Rp(׀,0g&csN'z,Gx|nW!vA~3q< P,p KF*Q"NY C  ea}"JeB8b@K@kOdD ,e5ze;G%O 5ﱋzG_U*TGRgkP$ED3l=wڐáE+3P*eyH:<ޒ[7'V+륮rfef' z@wyp+@aEpG.ǵ[cS^?=Z(NH`;[ݪDf5=?GK)}|iӦ,΍7~[Hn r%2.(pq DsWj"STgޫECs\*|T>^W)B*94:}w=!Ww e9;\ixx-d>Ʌן4p^ZYߧ r` 1ACZ J| 53@|!ͥk=OI:07x ˸)#vGUA9A/?۽B !A4|1ݙgI6dw cf7Ә뒪9;a7qE>MV7oiȖ$:ޕK6Į_ 66g3Wt_Ayr\ nC 3uɁ-; jpn큢 NrpHpNCm?y !p۴+9'sM4$:W&t%OL8gaW W]DpJկY<D Y P '!ˣAC:&!xu pE_@}^ЉC<X*:Ct voL*"M;QTz/3p4c]p.:6@)i݊ @ypB7j` -B"p) UF$ r1T܉y/RWugnUar[ i]٢2>P(T\|B|]+L$(Ĭn&.d|+Ahޕ=_$6f䮺MRNdY$HʺeaYON_e<4R'>33PIr&zg^dHGPB]͘:  *"-8rG^,SLo/*r_&f;.WidVm!Q5bݗ/zotುj5Y`<{ඁWI<ΠkUyP|Jm! %?>FoB̛0RA9ABnT-%H<@WP!p=Tʱ? + }oS U6.~ :5{y.Ww\ֳE94!J9=qiK|^˼L#u@G σN9W3rBH.M+QLJ$籔T*nJexCയ'g &DDg1'KY&oϗApH)ƂsL'KRs<$ʬ AKq3Oɠ<3u0J$"3.xgW/C]xQRmmmnn JXȸU|UoUV5//ʻ;6RR!Ro!݊,KRRꑿn^C I@(PM !HSNm"ytQ9r[ŋ&!s?L+YjlE,t0Ҭ#"D2'8Et >A䨣ƀ%`JrAnߩ$00JJ'PV68<jfCH@u3 ,Y3AvfSGP* *@䁪d J(P,jI@%@8?{n$IRJJʯMiI[s1` 3g={p` q@ H?>{X/&lEW^c0233Ϟ=[]] "iVgPRRRRRҷo_yF4͘1cƌ3G-b80om2rȌZeOvO>GɹwXQ@ygB2(:$8{G1ͯz^V++p8$IBf c7@yRzY{l621evN8F3fѣmˡK~.?d}`_]js=//NII qxر e4T!dҥ/SO=5}Yf͘1Rd7$VҺ~M(n $ !$$ퟗ69zZݜ p AI$u::N)Px \=ESA(/^I{PWw >SIGJ>2T"R/̝r}= ʍyuG7Q[70=w5Vplf>@ 6EDxzDDz$B(@2;l6(%2Iyۯ~Gl&|0Tu…/peeMHHHOOL8y !A~@ϟ~zvY.&¹sZnm0.]ӥKF(FI(֝55W !XQQaXv ^/@X$iq%I9cǎ;vÇgmqQJkjjWp8jfeFt.qSڵkҤIgnӦ (cǎbZYY)oƍ[nҥ J- +SiUUUrV,--f)9v36MH;v=/?K. Tȼ3H):< A r)*$-כMV@@ؤHR˪N}:*{їbPΞvAҺw0,Beeh KtyiLS]]f܇Ҝp!'R=ڛfm yvX;2g 4{G_¢2Rx=ѾHZÔ.>A*i6ِ !!!!͛7<%IZf_$f4U0Ph ⏞ޛ Zb=}頡:RVNZJaˆCh1Q+E " (9p u"6kTDsIQ7:~8}Ɇ4O?غCSN* IK?{jfzxN%[iOه}~:`Hha0 T1k@dA OMR=!{~#_@ $44|[qÌh~NՔSO+8~=?k\]n,.~FGOW~5QC&؎xP?A$/Eɶ=ZŮ]ʓN)ZUUU$d{,[QQ!)))SN]~?WʍRJ%J)u82RJ r6MQJnݪVXy戈V?crrr?B#;9Ԩ Q$Nb;=Oj%M\xf`2dickjj<ὥg4R(E ʝߣ@%evłm=!!!ݺuaWT-[ oժWsS 8lذoo}v @ta ]Ξ={ǎKΞ=d֭C y_;wRJOaÆ .9rdƌr=zHIM8WhDĂ~jZjuYfggWVVhq Af6 VZ5}]*B*++7nح[HDܸq}4i{%JdXvN:ꢢE3Fɓ'h2~Ju_=<|JbhݼysN vʕ+SSSO:K ۶mkӦM~~>}:uiii Ν;nzKYYٶmvGYyٸ&MdΝ="~ĝ'7o޺qXօ.}cJ'~Y;u&ooBLw!n[d2hfϞ wSZZz7ɓ ]tIJJۆm۶VZiW^astܹ?pӦZ!ϣP}x3'Z#B-]fǦԤ};KZ1&J" ʌɩ}&-Ɋ;?ݺvadVV#""x㍶m@AAڵkuVRRRZZj*2޽{3?tZV᭷UVz=`0 aÆ}݌'ٵkWzz·F؛5x4T+.qBgZmTׂߩN@U#մ]כ*3W_OӖ2hDT|웯ܚ>Yoxj͙bhP FֻD.hguXQd`ArʐX@0݄kDP# Qf]%o7hҴHQA/HКGT FI/P$47ՉqmLsZ5H3p5I絃4D-b&MQl98 W~"SHJ֝ lBt@AfwO ?Lp@*@y|=EEE!!! ,jvJJJjԨŋ7nf͚RͶj*[o9/>#VVZ5jԨA!={M&ӣ--)O)cƌ;L 7??lŊ͛7ߵkWjjj~~;AxWt:N:t`g]|Y׷l2>>IV+O=Lh, O焌WzL Cx8mTNzۜK>PNa)?'2ه۷n:77gի8pÇ9 ]`!dǎÇ'ٻwm۶ wwT*J?ֻ\<6vA_{衇:ljv ;3gp7d())iժW( )ɉѹQZ~PTTԲeKZm*//ZݱcGhԨQ^^dggۗYuAl믿 zնmv޽O>K.]nR"ٮ];&g !c6ф# A.\7 7>  !7 a7mԷoI&EDDaÆm۶3~Ǭ~IVϟ??u:ݺuTj@ռݻwi ؽ{Z &w^ضm[||o:˗/ߺuk֭ٳk׮}>}ʕ+ӦMc;t:]xxxiii^qܘ1cvy̙{kɓ*ݻp_=+SF_SGuz)Lvf1P@ Tf 7)TvM8ǏtO,;p? ^]v⟲p[l^nGuر7mۖRگ_[oRzɿ{ܸq sΕ1[~O?M\9idspYHye#@;9: u-3*PAաq@ -Z BUak}f|uֳg29--￟IZ-tO>dbb"˗wyG,X`ذa^իWwޝ} KIIovfAPl׮/ ǐȔ|8s6ՀVE]qRi5{SB(mqclt$ocF;RjDq&eTfaxпdh$ЂW- PCQg5]u 91\ ϵŴK^6W0r(6翴׋Sz<:CYUPG}Kі/ZtjM؞mk gRD[ 7޼k  ٺ+f--\$R}h⯾m))Ν-A,xP (P`^ڄK.5o\NʌooߞPpIFTҎΛ7o111cƌak_}Jy~ȑ#FiS^^N)/+?|Uk~鄄ҕ+WN0!;;[L6MR͝;l6#ɓ;vx9sµYކ/&iٲe3f`R!:r[o%"'Ouy.M`QDh7ig gߨ\ ZPw6lX|y-d;SN?~ŊjzΜ9ٽzɹ;!999-Z`+WlnݺM6ddd|V AQWZOǗ;wpwm;G̵Rh  ʗx߿;/BHRR҄ 6P#iӦv]]垃c6ٯ58Z!!!QQQ6M$o293Yg=oܸqQQQ-VU*(!8*5zڴG=(l޺9Ю  !70X$Ngl6,e;ٳgǏ_SS_ϟ?3fȑ#{j*Vv>ힻzԩ 6 rji.;P6lh4YYY[駟lǎ ~ahh7|c322z3g̙ӣGJRv{HHHVm6|c'kٲe&55u̘1*ܹsk׮eڵ+;_kkޕ/XTTfv4ի+_|E߾}u&-i|&McO>=oh4>#!:*4mZQ^nھ)SRkTԩSgNDx pc2ED&… J)ݷoߚ5kbt:ubY׮]'Ri \ G4o넄QFS.KUUŰ';; 84hP߾}wSLaNFh/ANx/^ZE 0`ɒ%3gμ;W Bȵf{˘.//g;b eV#!0%_l>}Q]gnI!!@轈DDQQ"*GT@@QˣPH!u7o17w[߳q)g̜>m۶뮻;yK>:tzaAaJw>%P_wo#<"oee+*[of!ABp_Ct:゙={3x!&Mڵs(v[XX rLM{Av=m۶ر߹s皷X3f꫽{>rH]]]֭=:tPJ`8tе^E+Vpb:uX,EEE7xPYYnݺnM6,vmTkRRRjjjjkky?<|pN(CC(A#S;B @,X0c Jɓ'G}5+##^Xr%gK933{Ul6Kģ:w=|Co ,jefBHNNe]6h J)%4<< nTbL:0qC PK4 \=( 8\?bX0P((.0hI2q>Z5z@2 s*lߑM[JCv@k&vjGP/DBvvCA 83fDDDI@ 6f8!//o<SNNΣ>( =gLUɓ|Veڴi`XjkktcMbcccbb[YYYݺuS&N]Kx >wC?!Xye0̹b$ YQ𮆰p) b21mS#-w`2 `qvp \xJb@Vdlyu*aAD+m7yUo E732kgg| 1"===<<\Q &pj*zR1wIʄvpLa !Onٲb8u?Tjٲedd$|L>>2:(Zc{7tfcƌ9x`޽ ""⧟~:p@ee%~2eʔ}j3DrT>B(+hۊ70!Cfݖs@[n]t)tǎO>,G)..NIIH(--2d}׮]cǎMJJ:u/Op4??ݺuR7j[P{Z[l'b.Φ@9ttb:mIMnNJ^:Jc}/^>Eo:x`lllz}QQQ֭}n`FqƹgGdYm۶7|rF#";v{<^L$?wܙװe˖s2%57h}KMuN `_{"(GeVuoo[4FɬuDW}2c: DY}y5@P)kc΍萊:"NBx+U"XOYIr@P".UgCeg⻴emͭkQNЪ–mAU`_ (8]bXnO?Bf6< p#s |1$E 6{.V."EyYܨQĺy5T fHnzcrF9Dֵ*T o< Bip::h9Sej~Ć : %td=3\s.&(ZRR2|^k`0p &;v,22ﱥ۷m9uСCyztӧ=rFK۵og1[۵kyyy={5444%$$+TQIy2]$fW]v_N矿!3M~&w?w{Ϟ%Kx].Wll!CVSZb'|2zhNWXXu񌌌sر#WL<[z5'O?ڵ+?.: {~upW7N _l#F'c{u8Fψn?>V@)֭믿ΗO^^}UөΝ;gYT Ȁ1vŘ+FM"@)ŗ^`2۪? !9!A.fڴiÆ S3#GL={~Ν;O0/OII'Fm۶k֦t111@olmohl߾}|Ap\<w#ر}AGy;ڵj8qC=c(W.oj9rmڴie(C wUaЖ8۶p;WmDf>+n X^Z(h|q'=sdUc:;?@%A1 *""o>|yeaaas;v\re||^X׮]7l1ץK>,+++""Bs3 }Q&`Lp֝?zێ?*8)rup>nz$ɝTA|w\O<"RRRn˗/w8eee?ŋ !^{[oŇf47mTXXXYYhѢsj*//oҤI$iϟ|Ijj*l'O&\6((kI}qH:;U B:}l|;[?P)իj.S[Jv ﷆ-~ڨgmDI*_zô[ EL" giz;:tpd':#|#UAfӾ?Z` a?>zQhg](;l-lѳJXHc&.X]۫o8$漻ת3$oҴku'o@0PŤ1q6O͓)mxGs‘\H,CHq݉ Ϯ{ؾCuo!dH=PD~jB߾}_{֭[/[WZ%IhLOOVTT<3;ve9))C C|||MMܹs 2m4~kH~O8y7n݊SΔ)/]43,-[=牼7|۴i /Y֞={E?>4MŞD5{>`VZt:DMǷo~ ʝ;w^n]AAA\\\޽z([;u:M7vd2-^Rz 7GEe˖s[_$qxk-$I ĵSDsm۶Rm"O7h[SSS3"""ׄ `0taǎk׮5jT>}'k>u=S[nر-[*>/JLͼuYO8">sLֲe˛nd, LU \%y=_|b;C$t_@RYQ (F:t?&d6& ȴ0!A?G^TM-DYWD[dY.//X,zd\!"BDTdAMB.Bm>۶mSs\<-/$";5UWWW\\?veC^-vHOAD8fbʈvD%?n|mmcbhɀAv|9?裵Zt'N9Ar6I>Tͫ> ʈ2TEѪpԘ[ CeDKBt"]ï=Պp[b D "3_f=[yxLPI!*)""ku(QibdGt e.J"ʨn*W*YY9N].W): ](:DVW9U[BQf8*N#*VَVDdXVjmpW!JN3Ò+P(/Fk="ETz/ҽyo^k{P^^C @D;uUh"2QAd(:%D,=[jصMj749mEQ.ıǃWEZ?8W%"?8{]II ?,3]")(:DD]2%$9%-Jc|QO%tF}Yf!b'0Gbw1m4 \]E-OE;YzR>Njvc2 f 憆s`&&+&bbb2"]B#deeiN͔jb*+Ws-,wB ^y=GPEA :̙̽3dȐON(~Ϋ|nڧ@{ _F뤠Ȋ j&Liamiii]t( 9./m`G_Dwr#sY|홁)HS_y&nC|OԎc@;9sdo>S)xVSt<~N k򳘟i\R @EQ@0m3*%L諵{,B2sBN2Y=P铞siwZY}E{F:,sy̠ijGնv)  W 'Epg5%#E+(D@ a𑩺@@T> p{VK"}kZPptKϞKk|鰁@)A !AB ֛+5K7QcwO@Ր_U$`@Z|*4.{8*(ǬFVK7GA@5;Izn' 7i{@guhWoԁmh7'/TܣhVEo'GW+ƦF)e F1aX&K~%C B^\ Ec$ __|IĕOI7u(g#"Z, n:i9!AC[7kɥ@C_ 0QMP>7b_ߵaBw %^<PZ(Ԅd  nx] Ր|7.O% raFͭl?BC6xo]!?8 5Nhh|&HZig Tz4/7 Kj3Q^Ğ9kAA뛧S+בEՙ͕co6 y`/I&U^A)~@ʒ$ɲNtS%8JW^7576Hu;>mjڐ@};l/`B2sBRB$DD_DNN土W_O4!pk ?ѣsuWq' 4o{_Э YJ8oˋ'b'+$3 !A-{$4bdrEܳRbkMU832P7{%k MғnHRZY@o\@wIvx3-jV۝oYB5 !9!A.hsU94.:]LrxI[ ,J^bFt;^z?^ۋt --?m%xfRd`Y]cxD,Gh}@ゎ~U?Uo? S{$@M@DA\[TbOp/8vomK= ݷ>Aa\>W*^:5Ep O*8  my؎8]G{Jjyi{x=iN[Mpq/3zvɟ?*+`ż2/"}1R *G6 5.8=͡$P1~_PmG~Vxѻ@> "2Dߴt ai_^REpOe (( ?HP S U<׀ːFrC$ʀ@Ys\Yϟvٹhy=oXTx9>l~-[S-"nذv=`ڇ|O&.?|F\d !h.4zLHe[?s^׿'Lr9OR p~w}9[y^_]]gϞSNcZN򑢛4L5ba5hQy톯}7##wxP5qyPQTPd@1&sXWپit56l=WLzs,gfffee,LÇ61~ĉ;wZ,U̔ 0@= رcnjD |^V('?z蜜8PPP믿g~~AECHfAB `; Y}k(<Ȁf-XO>pAeYo#*XmtB_A:uAF9jԨ+Q*^>5Lŋ79s~H}}բqҥ?}7}ٳgϜ9@1&s:N5h;vl>{,!cLO?ƃPM~anSﶽ^ %lXh B(T^N= 4PfSN:ο@NN۵oTSA;;H@wQ_.cg@WUVKƝh/\p8srr|lV>&eDt6lWqQW K=oy@L;kk3 nу;l(J+s["3٩eC:@(܉cW}.IO?q@Quǫo{ء= BoCeN|;9ɿ~jNC1(C#6x\w x.*i2q][gD (@ ԘQLv2x0s8˟A # mx?wO˚4tuH<}Mٗ_W)t`$wW( DJKV>]G+?zN}9mڴ{5k֯P^W_t|J]ڔ~"?~衇GyDEYr`"Jl ͧ]W@x/O<đ#C4z@yQ=WO86' 7-s]]$)""ȑ#`0 (۷ooѢŅ6(JiMMg}pB߱99|W^y%"byW/^|Q__/))3'<˖-#8իWϞ={ɒ%LzT-[;j7vޭ7mgMŪAqOnrrr|g $3 !@;vx7j<%I:tPbbj=ydAAAZZxdYl߭-//r󌱺:ժCCCl$X,Аw={;w9:IyYkkk%IҚEQl$I on{,11Qmt„ SNվt:f_tڵkx77nLOOWmfYUTc _wEQ8+ɑ##GNp8֘#˲($у?l_*u 2aonؕہFTUW[ t8kmhh$8--/OϜn8Z%9W? ըk]@pw` UJգGUerlꪫ,͡6;;;::Z-siӦ|ڵkjNڥ(t:J,0媟ǻ\.={ܸqcXX}]ueO81h@0F31&M5Nٻ@=ѧG+0`L=Yɪk6-_k>&tmܓVX,ڝW#˲p8v{q7>_qL4%ѣ.11GmFGGmV-tApO0!<<>2 Z=xqqqNx/\{v:t(t;lٲ'|dݺuC}/^@\\ܝwo?~|3fPzٳgl[4IIIs_[[7/BwM !ŃlΝ{WO޽{w_ʢRSSkjjz>}h׮]}֭[8q_~YdnGDݾyfQo%K;VSFFFJdXnJ)=v؂ u:]QQݻ)|7~Ccd0̇~X}۷_^nEyW?Py^j=ZehN8~.]={rǎ;p?o[n7nLNN>sw=pG?~#?Iǎ{ 7lCoz^Qt믧p GL(|>>Xhɹ뺻nb_^k*ct>M3{'E֬8Ǘ¤ _S)L#I3'N_tv]vNLL2eʸq믿tȑ#ƍ9rdQQ{wxܹĹsr6%33sݺu֭9?.CkPQ{pOmYԽ @lil?}FFK$WJ;d(T@='ם Y9wF"8LdYKKK~:BW\٫W/m/\>(++k}Ν;mf4EQ\t)X̙3W\qmƩX,/kF#|YYYK.Eƴo5TeI8Ui~ PKk kΜv>%k+g3 ڧ~v]iEZm;:/YXϾ- ֢| >ա.,֓oՓ* k!YQ`q}fʞ<}lj;s+QP !k7? h il @KCJg_ڥ$ [[E¡#&JUn߮s'x V R9R!C[fP'N} ?6|h }ع?~@%͍:dMti)vO7Da`SŪ\G)D֑0t5u8jPtTO&y_={|%%%gϞ]xqRR^/>sɷ~;<<|ʕ.W^egu\'O۴;ˣF6l;ڸq(|S8qj]xϜ9SYY/999O޸q,O>$jZ[[۹sgNQQQ7n}TUUU;vҤI<Ʒ~Wn@2ovl6={nҥZjŋ].Ac \OV\\Ѯ%l=zwq8>>)Q`0tڕRã :u2 plݺU𒒒޽{ҥohTq\UU a7nW\! 2dӧ/^  }q@&gd !n###_w1rHѸaÆwsw}WPP l۶mԩ\B{w¸`0̝;wm(~t裏[gϞ/h4:u^xڷo?|W;|O?D)]`9yݻwXke˖|رc׮]4v3gZޮ]wy!oEDD(I^_RJ( CԠ_#9Mi-qCGV hHY"Gdocebᣆ:|[׳(̽a1)l*XԥdEd'?}:gO/cA# ߙ]{01X^vku#:Cb7y3:ء;# ZˊNvi_R_| m!$4?( ~xÜݫ7knfdɻ$v?ѱ{ JP)aS.$B:;%sV{)Hf01=--L5a:UZb|fՄ$! ?=Mi@GCDq DM^ :\Bڶm˷)zktt`:utܹ,_\׫r޼y|ARRCQO:_t:AF=jԨ JiUUΝ;WXp8VXUUUX+**2 zh?>׮tM;w|'Avvi?X˗744{キr /VXP>Yt:gG#JLJ@%&.kC6o?֣=ш\ލW~ڵkj~饗zٳ [TT4aD,((h۶-N|8vdɒɓ'O<'0LoFqqqXXXnnnv6od/4wM;_'O馛Zj-7ohҥz ݻw0aN@vvvnc -kvAhyްN)J@@Be+̮?{ί1LPX<3s3\Dߺu7M:h4rHaaĉcbbT߮];t:n:uT5S̙3:u9N5rH(--ҥJo^眥@m q3Vd'5 L[[tMp8jfnF8J VNd1h}( tQl6 H@PЅ = G @*b{?'Xn_':@>u@W]K{JC svnDz*Gvtb)@ SiQR۫K];3KgLQl&SsjC"oky d ?+tv~UُW-,vgNs 8y-k؟97OyP?K]{ێ^H]nfD1ewm[OZ#JD>ٳ)wLY__='~ثW/\u0>|*0󪒒f̘S֭[WWW;M6M6M|S:xƍc}}}N.-LEQnݺj*ѵkWYuz]nsrs$IRcj9@-MԜ2DUjtyzzW\n,$EGG[֚;2Ǝ?޳gOw1bРA|h:o[###1,,,,,gz`0p9iU\\ܵk׸8BH}}}>}(%%%\f[?!ΝG \2e ?.TT֠[!C/^CM<6BZjU]]{IU0WЄҩS;vtM$111iii۶m2e 4'''%%%<|8g:4ydDܳgϊ+;tpo|+Zv~S\ӦMkjkk8?2Wٗ&Jg̘f>SkV=&M/+=rȌ3m6,IIIܹ3?xC믙 ,@)=~ȑ#yPf̘X,&COqJ2B?D@ތQdz!.m"#&+dIwwcK:d9_7wt߮{QA!QoxBFTJ999#ILL$رdQQQ=\zz:@NNOEQٳg'$$|w3t5jUKjU#Fܹֈĉ"6tP}ԨQ6~xEQ:sAp͚5KLϟ9s&'R3/榧+f䂴;368x @)A]nWn@I +W12ͳZŽzEp|ر޽{[I̬΅ŋo驩VyUWq j haef ryy9L>w܈#̙3[V]Ν;-\'BMMMVՍDٷo߫7&Z3fLFFF>}xLgϞ#GSN߿Vf._|1<<80uK :tSOڵ_3g\r˹̙3'Nv~{U ]2,,V%b;_AHfABmLKK;8SYTT۪U+y1n !g}i߾~ 'NEqϞ=ݺuKOOW^>|8yϏ?ݒc;v4uuu111۷oݻi(mۖw 3t$GFF۷1Ʋ#ĉݺun8$''i=ro9saaa)));h8x9sTFٳFQMlcJJJbccyy뭷raxxQ[?dȐ! gyiӦMJJ(*rA$LNNjt:{q Li#c0RbaCDnآ4"7:nVd^Ý Ӏ-t.ҪؖYfM>}!?#p8j6e˖!;̙cՆvN111III'N2E^8~b(EQ5k7^}-: `HnzWNzd1V{mYS\訮 o-)sΖNM#bF W)"='> )G7EEEqYj={|I۶m)҄m^uUYYYɩ˱\GYZZd2L&gѣ!xTJ䓙3gk$IʕW^ֶnƎ;rH x./c6mȑ*3p}sn[h)HKK{78+())X,Z3(cƌ(rװ+V /vIǫ$CozL6mРA<PsReݏ>hN&L eܹ#F駟֮]۵k9spnuz^?e$~t~>ؿ?|mup\uU<@FFÇ׮ k׮0``HHHXfg}:\}cǎرc]]ٳ2cdžʑо}e˖O=7~FJնi2^}U>˗u]Y***$$cǎcǎ 6L٪U^x!&&l6sc=֦Mn~'tw _hQLL̘1cVZ{nYz)EQ lٲ֭[laÆq3nߴi Dd Hhm{"E_ݶ ){֛Ȍ@(!HR{F>6+?i@Iۄ%}ZX:^$!=;.\(ޠeye˖qĤ$DLNN^jlժjAMKK{,XТE>,+++""tvЁg۷o/((P=~ =+ܚ67ܖ:y< l'm?l3.t";[? b_`iQ&Y8aF{kqR(_1[8i)V*/PcGݞ]Z@KU;XIK"4΄oE/0]dXܔ++o8RzwL!(1;=W dD}83G^1,[;jM?^(0~Ȳ_=-y5*ļ#F0ظV!ђZ͘\wތl߶@ϚJ^|C>@O̽{^UViii ,[K.$%&&rlN_]]=gΜ|6ĉk׮EDЦMgy?~->SLYlѣG%I}dz˛2e pLLLjj… [nSO9spӇz覛n;vl|||LL[haZ(Jff_|1g 6p3$fI 'p靟wRFc78|^ߵkot;Ջ 32sLInvҠf/w{hnT`0]vYXXl2MfɝM=OC3ʺuʲ7z-8N_O"" *RVVƙ^C]]]EE((rYɤVrGEEʓjܶmzNU^^ADB$I<] zPŴ5{Px~ԫ233*^ U$IE[i8xMmmjCVZj٬bX; v{(JCCC}}O9r8шyT :)"NdDDcOwX6DT"(1Ćj,>] gߊ.B #l6LZTGj9nhhRkW3śYSC 6V Qj4{f5lff?~|mm,KyѤ:X 3S>͚5_C Nzg nJ8v~ɓ.?Հvt>}C`/#~Ԕ.) 7΋1G٤6MDŭϖ|iB|ٳg|W49Z#F~ <#?B2sBNRϡf>Qh#Ϝ9ӿT.Z/i 4P`<_sD w;noCmUU@HP$@J@!@*.#GVRyR&˲NoIny4h|T&yMuhUL,)Ux=_})`TH0d1'/lλx2AFPi{_/J@@PK-3{dH쎓'U PP# 0=AmV7Xsl6 %nʳh3#T^d0TU O0㹵'z~d|La!;3qc<* #T4{яj$4?mb֝?-. `.ic>rH4/hXO3!k$E :̉0s{Z@Dz[{^Y>]?%ܜeE~eݦquq'+X Q9hY{4 ތv 6z٣ܟ{OW:[&2dd &0TN+`}>Ois#T%ހm{Ӿc;ED_(DkՈ"pcH5 P4&ﻣȈ 'H4rbɟVǏVPʀ @a tBd|iPJ5sZjů( X҇y~hOGS՛aDÇ1֜ @ݹDGvVf 0BhcDĭq=sgD)z*!\A~b56Ƶ (qۢۋܹ (%0@.C0'Z- cH]PP2`޼'**RH{>;j[:ŇjԶ-|D(=Kw^NSD|k١r  RBG{s< D[VlviSצ=7yM.0;`|Wz^Q`Gs ysq\&nzƷ!$3 !I CS9NDڂI87|yKÀ)Obv4qPD["6Xkr紊^^$AE<%B:DKD[R4k,Mc>u[~f:J\J aׂۡ0 IЂ5~¨gp~.PB}Dx25[g_S mrt5RRvg=+@kҨRrҹHO੓P{'0Gys ڙ|c@R0Lua8 kݑ hhDZJ7WDQmqI&־ۄXty@sg*2[##^|37l4j2uѡB2sBjhԴC/Ph__6|to}Z hoy3 5D 1uޒ>nA[( =S;$*(x4lWK;&G@㨼:_Q h&S|s B!2iEA?tV;= E?1P< a5JFD,D1-a^'\@~S~x#a{pot{e#AHܜvW BJ81̚ K`U$^tλ~/4==܃Sw.㿫DM"Y@twtZuv^W⟚P iOZqVoϤ4_Xkx4hOpZ-$3 !rԯMșiLZ88oy^܋qki0X%Aϱ*6cFxjxP-$oB״ҤyoM3D5Q kL.h(EsQM7W9j$Goy D&jqѴxۃۺ5]"#;n{z5ԠɸГ>]i(W4=(|@2IlAGy C8sr0OnP dRjnNDoӪGD՜n7lIw$ -C@&ro8o %K3+ gI uBjͲ @$\F?1%!9!3;l{ !AB4ld !APؤ\*Ш_!%?KV' '%_M7pxo3pA1 !LW`#WPy8Ã%֐.Uܣ?'sE{iCݚ9P_&l]L!bS<-u) |&i2P > hX}(4g!_b jq/j@/`tu^yC#My'+hso#xGzE3kk>CA@͍}Gw1A/5qn,iV++efy֨/5MH5wiFj/IĐ Tidi9j/t{oI7ϵ~ehQA෋y物j:8Fny=s("jqK~(hԖQ%HYPe?|uM ~D :.'l^=d !p4!D{ab5!@pٟIjB~h0e$IdYֶ¿Ro LGoEtC6?$nGF'3X4n PeX1jEaȄ ~t HEJR OPTdn ̩W9ՎHNzgfN*6d DPE"EP'x'V;B2sB\2rN>U*eU9-ܴ>84)g)y&ϫx5KzjΝ'OTl'NO|d{ %ŝ<(..m㍇/"2(4vѓH~~mi!#G(rAv`Փ p2BA.0 Pt"9Mb}(a]lAҚ^/9Rek׮+I҉'/Cd VVԖ54*M!Sd8+BD z: nz3׀ RJE&\vRQVh([F=apg*" u[ (3YM&kC=GC` 8+lf tTʲdilJmgC GTYYY۶m;vs\s!X&03[|m2e ̰ ;^3YAQȁ0GWoذ!22R]żZQίDGҧ6mwƛT/}-SB\Nk2(z R G&L!H(2Tn";HcC(p+1--3H.k[QY܊7fxņWg 'MR;ʟ2uI-b !PJn̙#Ūbp=V3@ hruryyV T#jL'Q8ϽvtVVL5ɴg0puǦLϝqIcՔ̢%ywrlĔo@ :88]&=%E?7f+***((Ю ^?E(~:N6Ҭ[ousϬY~gUc賜y+>+S#I^>}>jEQ|e+3VbsQl(<ݗuQ'yXMM E1Lǎ۳g޽{w5\z̢(X[[+dUVVs6_p O?nrF凞{5k 4o~{ݻ&ds9v]iegg;N6bhuEQ\.:sL۸/c)(,ɕVCy'fV 0YZx@RёLna\.Irrrz1,IRMMMCCZXQcǎq hfZ}J>̗ǐHa}:Z;Z%U ;ut7O!|h]0B#gz'> ͱl{BQg֦MGyħ_PQ+WjQeDj-{M5hSc9D7+rT_Y6C s'۝s-G{ bgaAJODY@rNd]@M*Avξ7@U+]l֗@/~{_q E{[{Jr kÊrTb`'ʪ"0DKn϶qăvf+X0Mz/;Eciw[HX_4|ywۙR-e穷VJN砟~ʏ+@}nf{~o9d{$ ZW\q$I}p鬭U#|rss}>++n{7?õkN8QťrNa.2cl6kzIt:F#"vw5˗/_~}tt4,vp=DZi 8HBu];Y7r3'D3FlX6J}֓ZcX,VUE,[VF\r\v=!$""GuuuIIIRƘNKHHj׮]'/^Bh?sL$I".Z/7*BZh޽{;vL#rرc7n_o߾kٲ?~Ν;&$$|G iiillm6hР'|Rk*ъV533_䯿ڶmٳgׯ_A@W_}cRϫ.**9rjW)**Z~}JJٳg].׊+8墥KN:{6lh߾}qq=3`999ݺu;|ĉ/첪 6\O:pdddzУGޮnzq7z|xܸqF***ڸqcvΞ=8w\>^v;c4 !D|"T@eñcn~pLD@gLddO?xjQ#jz/Fi-T9ei޶f$V$?t+IRAA~URRvΝ;rʞ={VTTXB?ѣ ,ׯaΝ۷o7FQ$Ni+V(..3f̴i8~ ffȑ^{-×_~lٲ  2"Od]APUl,/= S%ҾE9/3wL׳ߩ>W|e{ZMs,޴IKx]dv>i8T՛:qܷgWƈ=x$rZ̲N/^gs~fʞB@$-[( z_FE@:yW?@_Z5вU[3b\1RyR40%.* 򽂰?gѵ-wJÉ-gI6k>f&pQgZ펋Xc[bѮEJ{vNG[_;~ȫGLQ=%`T6m|>ח/Z(11h4~WG)**ZvmxxZQQp88.];~0W\qСC`˖-V;ccǎ8qbYh+**^z*++>eyܹF1,,d2tԉSL&SvxNcܹ{AW}(tX 5(Oޓ{+x**;;?LJJ***zr~~l-\RG5 |W_}5**=zt~~~UU՜9swwܹs3gׯ_uu yر'Ot͛7gee=]~SJ׬YөS'T\\|뭷vUUV͟?_CQJ/2DHLLT\'J0*FٳK%%% zߋJNҥ Ĝ9s   :u s\Ǐw8[nE1""499w_lo2NСC !Ǐ+znf8pV{ɡ1oNB2sB\@DXr; )aǎ#F0 6l7n?cƌoo ,ؾ}M7ᅦzkߍFO>ydd'Eqx2eJNNNJJʬY6lؐ/2N: /{III?͛ pСӧOu]ohl۶-[(cǎO:eA,Xs뮻鯼JeeW_M)mٲ͛'LvԀWzÇ? 6m۶nXXo?䓠<矫{2 'Np8ӦMkݺ0 Ǐ֭Ϝ={6--MիW pСzz'y~NbŊGySNfy…SNݲe˒%K-ZԣGޮ`";jۖoRD4.cdF\٣hB`_)” *>P18oɱVu Æ+۷vZN3 +q;v?~СC{9o޼~s{/ru+Gvv("PJBMf;~)E #i()̄87€|e_:JWMIG`Mo@75:dE즒q k{:tǎᦛn+HQ ̜9 ԩS?ˍF… Gk^p!רG^uUW]u޽{k -`x̀߾#GKFG[jQKY+%؞r0l?nh06u;)2Drm E)Lj8"b:sw[eJ bDZsyuZoF`ؖϽҔ2A1jl1m>`<#S(&BCvIJ}"VqwHdE_Xo'/})=YERf5yI8@Ѓų_ET;L{.+:y\CmAxZǟ[Xa.m ؿ_cRhr%i f'Ns.~mq?0++sD}7!Ǎ6'OAaѣFj׮]ee%?|WNUxʗ_~k-((0wuN7ofkݺԩSt{ٳgk^ze /X,k /?K^J&?C5]ӏ!@k!{:p31֑Xzec|?xcǖ/_gϞ]XXاOǏO8RPPЦMӧNgϞ=.͛7X"22R$QeY~xnݺSL_&smZm6СC[jm6n.**֭ch4={v۵kǵj}<aff)Sz?+Vu.KemKfQeWAGxxx\\4s\=O=g϶lٲm۶*%GEEi|z0 wywnӻwH]!9!A. pϺ0t:4322j_,X_;vѣb xرkG#8p`՗]vСC`XxW_=yd.L7|`0'%%}NII`ڵ_|ӧ ={v^t:Ns: Ns͚5}ڸqc~-[f4=:fNw+WlNOO.]mj(>hII zU)yyy}QżO?t iiiZ\`p8xu:]nnnΝ|ݻw8qZ[vv67gQ$$$_~y5F{ N3,,l޽:N}霧QrF¯gvs a^C4W`I=uZ/Jr`ab!0LKYdDQܺuԩS !:N?~|ҤI-[f%^>///!!`09.SG܆t:O>2Bw)]v]?0xd裒[!::JQ\ 4hi8榻E@DX{XnŔD "JCIFD+F?E<4c/j$un3}6~RG-xiYjuߏ"A8ܥ Щo_:dO2@CVnTz/]}~ #P&#@)Z~RۻkLʩ}AKBxm7\)i{T (J_Aӟ_|SUET*ܾp믞ڳK=^t(㮚 L!@} rM PeYYYv{PUUG[ m-;;;11{(..Zn]UUp8>iӦt;v(rN:5n8a6dArssR=?΍|o۶:.,,,%%f=ӳs ^DNǯsPPPA}N%Ѣ|}ݺu+жo~mq1IhV[[۾}{D,((kyС P_}-p`0 ;veEQ+FyMF8,..ԩS\\ &OgΜԩ<cN U$eܹs]w3U?Qg_*e3<Ó&M$UA]%˖-[VUUn54o@ΝwqM7/"""55u۶m^{-;vk׮|MxxҥK:nݚ3*wo{!bYYYRRRYYپ}z"_| p!ABp xnDp83gٳ'9S ddd}pU=}Rt Θ1cF7yd~&MիWFFƲeVZkj~̼{U$fQc\fC57̄Ç4KӧOgY,ԡCQݗDN(uKϷH$DRH2U' w!-JO[%9[ (PucujԇQ&hvv6~PPPy;vTTT}ݜ_ի#uN:_̳f3™0Bɓ'ӉΰiӦB,KmmmΝyXIѣݺu_O>.^<@jw} ȑVS@8詳zZb$ (GZ/HAoWq?;0b{?3w[* = Bw"XQO"͊"((EE RN( n{ݛMH=/wΝr̜9u*:fTpYMd B8@5@i"H?cxhdvshC N ;/pkĔ6Geo-uLKڜܹGPǎ={顧ZLYg0D`Lǰ7oX=uKvIc9j@Y3 h;f\^1ʅ*F@Ds.}:DV+ i?-aM+6VTcخSnt-L!1FÄ ͭƳϿ90\23? J}NfZZڄ 8 |~-XR:s>}@VV\y̙m۶UVVN4g?E122RY)))CKf͚eff={n4t={vȑqqq\5[?} m۶Е6fmʚ5kߊ/_xLlZZZΝEQiuhKݛ|=QICF 3Q+N""n+ۗZ,ݻ1$''у)S*ʔEmYYYÆ ҥK@@,Ǐw:\ 7Pes^\\U999^pYf /\0yduM6 L-'+LUߔN崴#G۷k98ԞޣG>qW ڵgΜ9rȭګW/Q=dȐ^{M*D`?p#22rɒ%Zb?ʕ+/_ N4Im/**ڷoߌ3CԺu ã>O엙?ZsAֹsgE3fE!!!M6jBB Azذaj@ tJ : 򋚆5~H(!(lՈpL]v-[R狢ã ??A8xرc.\/̙3@322>wy.|R%eONk >p KsJ(]zz_pEnCĝ;w={vW3+~s.U mڂ4\ @;]d U, KТmW P~-P) ׯj>sjcgb ldmg`h1mҰ,X[ht 0Sn䨴6!-;D 7Yۑg`cfkZ6# 5^|5@GpHhY W^cƗ5hӚ8oAϐ6D M"kQZ?*W2^OLjpX4#V#I3C†jU /F ?zz1ƛ(ile>i8\>wenVZeu:]^^jٳ'ק=zԨQ|p-˕gN$W=+@2;\8m4V[xǎ1bA>ON0a۷7s5jԞ={֬YӡC9s愆 ps3+::ȑ#=8CO߿M6 O>gZo'x"!!!11[#)z}V}ݯ*((cbb&M4vؘsFGG_m#j׮ݫo߾9sL0?`\_^\\wCX|yǎᆪG~m۶-..۸+++%Ij׮8Ϝ93x`Eb jݺuQQ/ܤI}#gϞݢE F#ٳ^uiӦM:kڴĉWXq!ߛ5dȐW^yyeĈ!i۶miE({88|3a~ĖzT}S;RInf>oXZD={"cKKmK.JRRժ7@ W۷o_UYЦMBHLLʕ+[hjù#,;vܸq^_paxxxmۖď}QQQ|wެ,An'Cxirm%{7^Ҷh"V6}ⱘQ1uPB(@O[Gvgi8'Na.*̙3ۅR|rZPPPVV?/]r7[.**J [feedee͛7y'OE ,,KMe˖;*Xd"  L?3RۆW„ict\ q湅ƃ6VmJ:ݤ{)3y25eǰdsl<|A&阆bw OA  &Izaq7ZZ53FhP6my6>Yi:!?0,#=z$ڲG'2YP j˩$ܱ 14om9iwpЪ oX6a@0 cݡ,[9 Q il-_j"7|w]V7L=zbJbjns_mTt?0P@&By7>~ѢE-r8 ,{nm۶ݹs'W% }uL*EQϟ?K/!W_}#X֦My| U$|'K{a)Jw))_}b5kcS.S pY}$wz  +f4&dtv!S?$sksD'}61Ə/Zb "7VUU)/vDoI\n)v^GݳgҜn/((i9x';ɟKS+++/]?˲{AVz8V+jxU$tf(q4JUJ%JsII w[PP1̿*hxdRjPVV&I cl6+(%WQFDiwʈh8P@U*3"(e(쮁U[gz9kl/&I}%^EEZly>!C?_]@(3tXM(ۭ{X ϧ\(yO.RIL0n\eY2z4y7] M?-B(>S Miu塲kC̘!"*Dt"S2ˈ"웝h:%D%DӉhCWeX{N.+da #ŌXh҄).ڑ|&kեSc{&S>SJDDS6>"C V$J: j[* J9X3DD%JE,Us":VNCE4"" R%D hmUiH 2hCD "2Y,(V8eذܔ+!l_F !I eʓɌ&ǟod=ϿJ0f6|@DnDD$n=6U^S 7y4&QUt_w|s^>9`mq@'j*(KLL?a|EeQUۺpႲ+=1|]+(R<Ϗc/| Egmj)[n-T)'ȃK~O?4"VUU)Gك7Lf?M0k"DYfJzIqK=ك,zũo՟'L9}W*s\i{whcOVE*WqZ׺S`2 ^~>16o|}w]c sk׎NVfU9}#?ǿ.{[lc9 ܱ&3ex;$/?KZdfTrՃZܛo8C(ON8q^zuʻzP5(K9_=zsiQ^}QJU j<ɧ]Kl&!\g !@1LUs@&,J+C*^(jtZaUꊄZ֥_x <[u0*wdHeJD Q"dd55P̈@13xV¼LEEE~~ QQQA8+gtWPBWTe^C (uu1N 1(#t_L$U ? .u AFFddh2eRe"dDP`2 U;ׂ D1 Nܗ `@2H H # ;r0NJZ TPCȵ( \HP5-VkPPa.eQϝG]@MuigI })5o՜wB4.AԖU*pM}>);GiK]K'QڪG|V2}\]uIZ-o]5x[]Y}NJpjnWYp9߹h2u,5~Իw>~Ñu^O%jِ\].֐7pxUՂG;ju5UT] K<;Ƹ8g1'%-⪏53QCH1.y_Cr4VJz cZPT f?-ס OWtU-Vʔ\8cƯ==ZsԐK=DRy#`e(˄iuobU?ջ\BC6CD(7~xJ.j{2x+TSOcƂǟ@OCN6`ШCf6)um2?5\Ŷ[+u15XW%*4/b#sEW-x~$>鐂 9?H^4| ĉo >KMꤶ㳥 *뢾_="];~w݊ZҟR}PS݃q?6jց hTy'l| Wy5\N l};n x;1NTӖXk[gZGP.(~~A $dHSQA%5+h{96Z tMGW?+Rsj_ ܆9 xu>:A~~ÿx&Lk=1E< 3ӣ|=]WĵԱ;zǻby|^OV|nWA cMW. DD#e݄-WTAEo+mDL-_א=L5oJyU7[FY)O~߇ƭs'NKxfkD.vǎUQo8aXzUn' rFD@jlM8A*qW( sܒZ}TW%wqT$@OP{,*[_kfГ, |G#*:/⺆P?#P}DO@·*]:2\U50ʛ'֏sVţ 퐬Xo'k QCwEy@<+~`0x^ ?򳫎nl&iVK" ׻.3ND΀A{pRTBSЌOd5>[rv W첛YuВkjQ(zͩPS-}OzVE'n=qe/H꣙+KQ7 JDm 쟷(`m{k7RCd% *rx  L]F:_uVZ[\eR4J !. _f:7,{7Կ_Ѧ糞P9_60*ǃ4{_B'BuYmOq%BU.s]ѺSN*eP1*pn@-?4WߴW}f5OetUT"B"iyHu"Vh؁X=7l|`2übYuїBjak>(%K?ݨ!TrB1*cjY,Ab*8xS3pC%{s *4_tEĀHZSuP#U^qvOֿ*b:Ǯzˍ(A_I-ے\_'j'LACXGz&!U݇TjNuEN}p;:r6jmVn_^rz2)4<ϻ[mzp߰[94@p}DCxVa(/jEvHK R =(%NϏF@ݔՃfי .qՖk: 'HM[AP#>7+LiI f=+5MV)>ψ:Q>ThqS_t؉UEBUyjU޹*5Fܽ`]e= nOXDeBGxElVDЇCC]0 6l|tV#({_e䎏vy8P'jiyXLQ>dHF@\^DP\"NjcV/0eu\<%TV\@-eH$ | Ƚ$#1 15+mCW0A 1nƵOƮJ=w%r}Yy`P}'OqXbpC4 DU0ޭYQcԮ)/UyͲI!`smExo~0V[͈ϛ? . V]cTϵs"rO/V+¸KtWJU7 )p^gU6DE{pԟTGaK% up(e(#!5*@=A޵ )J<(> (vZ:(7sSw^9@XjB|,s'`{AH_ ^/s_&u-=PY.UH[b=yƘͣ5!AO=Ǘ~p̀"v< s'ᓊ6{gή]pCX$IAj(lU6yxVA(ψ>|o5`*NӨǏ2vAUE+N|]&*jayo""2 2Cd%`2ȼ#k!7R!J ҆$I0z(j1ǀ@f0;TڀdN%28j dnUD`,Y!iVed&ITnj#d @ Ps2! $H)j 6ME( J v'E=Wp\e D@@ +J2qD@+Cd]**&V$e(t:I{G{u"],js5SXf~vBr(rcb":{;Tp@BC^LXxiԡװw@l6-#")[uQ%+@>D@uu֭[wِN"ƍ?^]]3!DBȁ6mj&ip}ٳs}vγ?#@C2)\ 1&Ij}ê?.5=їSUe,Sʡ[\}&=@є>|… [CxT덊so<+@uW Vs%%%JUWKfBc"xM Qʝ&Jj]H1cXN<>o>(3d%Hp_@_̫d@Fd 3` !M_]9"o?9wbƉgS2 07{A P;PdddL%2?sD6,3%ڐ"DSV&Tr 2E{++Q5^yca@a|F+5cd3̻,1 N{e Ld@I6Vˋ@ɅUTBo\m@ƕ\2.,a-\2eHNN޻wobb$I;R]8cO,3LY=jdYV}c%LPI5e&蔙̭ ,`W: W›<zGeV#0du6,>}:999//EQ$2==ԩSP~ՠϝ;VUU'JO)(((((ӧaV;vرc6YNg``&OԨQii*K]"±c222ywyQfLm?߯>+O>d~j.ZgϞ0!D$J'T8&\[S?G;?bĈQFp F&e`PxFqҥoɹ{N>pVBѣGSSS^lٳ~|g}G233\dYNII_< f:Πo-+-SpH9By!˪ g@ T1o \Sv%AB$WF$wVP9}᎔];BHHQ~!k2-nJxtV҈܊E5G6e(3eOqYnM{>>Kwݒ0đM~A .oܜ|ۃ3i,IK_L3o޻P ZR|hH4Ǻ @( Jkjfee={V'9ȲT[~i>[bbiӞy晇~駟dIB@VU*h4NFSbI)SSS !={v֬Y=؃>j.Iʕ+z=bSy h>8]0^^|:a}s+DypLnE$U;'Jq X-~P#00ԩSCeNs8{ UR^^_.YobAdBȏ?x 7Fl^rҥK~W_}z ܺuy^}UN6ߟ;wҥK=Fqyyy(ܹs,:tH5f>mȐR*:%%%ZN:?剫=?~j;VIN< ;v'Q- T7UUIܒP*S&h4z0vG?c(r-lNII9rÇ(\Ȕ$Ut:,IN8Q\\L /l߾o駣Ǐ:u vɤ觗-[v~}ݫW޴iSΝølVAe|/rEEMӧOvkmv&L$JNStyvf.81oI :%Wb@Q1,;̬()CIMfb?|ciii=zf)GR.3v+>Rj4=tG<< P @t}vGRzM(fstX|-# @)"P-Va={6iӖh`f@#g,kWNꃈހbp cLӵjꩧReY- +UV)n"NhtҊcG # G  cǛ VRV` dڌe˞CGm9V-Rtʌgepdw) LTwgum׬G ;}ݺ?ůuڴoR@" /#D]+J *&BJ@ /͜}çkص %Є22 )]釦_m9cfS,}\+LNV>r~Q,:m=w>˅9%uD_zb&N.#8 3cF55jڵr^$nqyIIZZZ%[pϜ9PfRRҴi}͛7Yo4KКXrIvͮFlj2>~xNCnݺmڴ`0}QHHpTWW;w_~2Ap ф3`ܝ~Rq}2H"P}8)W}'+f%d2UWW+!$\E[^^2+e^ܢbZh69@vͦx$qj[]!]vh4|iݺuHHHV|ĉdsss۵kk04idɒÇFoM4ԩٳ ta8sLjjk6o޼BH@@~8xwygҥ_~%ٳg:C){i=RRS]t;w3"#"N&01eff+ RW9?AVKz|s BBB֭[׳gϰ0D\f޽{7o~_500W۪zDرc|V{ǎt:N(IRUUݻ5MJJʢEBBBZ-L'N^`0[n'N8p`@@CIƎnjiӦo6**ٳ?Sxxݻ?Ø֭[oٲl6?2󑼼{キjKLL|[cٓ~zFí(Nuu5z_~eΝ5j?}.]+V8sqF+y睝:uؼystttNNΌ3wĉ~-%%K.:*IDATIIIƍ6lXQQ'?Et옱q[ɓ{եK޴f[zu.]n6#|/Rg^c؍Ԥ4l*Է ic&q,ڷ}eNe7\huӧm@uh-[ vw߭ef͞=<7DFFr-Ǐ?vؾ}RSS;uꔘ8nܸ#Fdggoذ!22QQQsD<}~tzdjW1E(}}.c̲lMJyQ3@"[E?yT\IS4Bay_}ݞ̲yE^+<$IOBBB ^xhBHnnUuVXXXXXo-[$''/ZW^\?٣z\l!7ɹNu|MUUUUUUYYٰanf^~mJJʲejn5xdQk*7 :AV_ (YF8[sX#;#ú_zMݠ)}ئWV۞Xq.h֑%%_n/ YΖvj$(VyN1P lam)Swiӱ.  3퟼w$]@AڼLp kDFA$yw<2k t i0o0so|;m&IyӖ' 1m@P"0Vw"jmdM/h =+h瘶rуd95!Di;nV!5N-_BU) Nfegq; ]Hs уPM't䁲;H+^̙|]~}^^^``K.]ڦMV7ߜ:u*$$|A@@ʕ+ [o%/t:ϟ?=9Ȋ7W9rs*s}WR\ifYKKKǎ{7Z-K,۷onnnQQ믿ޢE.555''g͒$͟?`0XX,7o>d44̙͝5w!U Y>t DA-Ԥw&} #@;h9gΜٲeKtt}=z8{:tRxbBȖ-[:v8bD|~`B̙3GY\\۷w}z~ƍƍz~!33t-ڳgԩS7Vz!Π7oۣ@L}vVK222:t?֭o:… ƍvwɓ/^y?sFTPPлw;w 0f̘m۶:uj׮]E8p`ʔ)ر[oURR2ydA¶>v5ktر6f=U]]3h nݺ ?% ,ڞ{ܸݵkWslᄏiӦv]eeeK.k4k._Yf#Az`^zWUezcO=T\Evm_j$lҥ]tIZ]{EHH)1c3b(?{2KMݲfCXU E䂱KBuzUѾFĞy1폣n tH2w^b{ 2n8vڵk۵k}9r$Iǎ;r ԣG Ky(**j< r֬Y>bdq ZC?$6@ 2S2G1{/s٠ h4> 8 B KKK׬Ynذرc $''k{7((HŀY/^?.vnNCkJ<~F &6,H+!BNa˵P#l34Da 0XK6w hcߑSքDC110piKE󶖑=t I0 h2d6}rq se$^Fr/b?ܵ"| A(j(Fx"wޛu-nv4ǟEv/:6MӪ>?3gZIMM&~_7?ix (i s]37Yw!@O>Ӣ$ȐP{ZDDcǎKMM}7Z>ٻwgN0222Zj ϟZ]tyncǎz+00p8NQWXcz+"RJר(f=<9XfyРA-ZؽkOyyyv2338ct9b/_ܺuk< 0@-^׹|w4oiӦ%((Ek䩺c,44 INN l(:_~Y+|ǾtRӦM9Ɣ˃@:"h`送V>ڶmOzhef?~> nyɓ''Ol2{W_3f̨QzrJV|aw8y6lСCfu^xaSL Ѹz\}vIEQǍk׮ 믝Ngjjj)'NxgwhZn7 %%%v}͚5[lq:7nիײe˴Z-7j4ӧOZJرcGQ5Mee1n8VX!b#QҶnڷo_ѩS'PO:YfOO<`N־}{nU-[te„ J0cz -Ń#KGrHbbn|@ӕ~gݺu>|`|).qHKKz衇͛7/))WۿiӦi?1v'O=n8.:r2FRRRu!B({&wؽ{Ux~```\\$IsΩsA >BCP:,F)3^u=h4_}UΝG_{jt:CBB,Kyyy۶mcgϞ֭lzzaKfǎӧOzj`0~wSL35)B6mZVVcl6DEQQ+p_wU!y睢(8qgϞ{!iii:t0 ۷o˖-[lYv8̬v퐻,Bdgױ{~Qm ?x?~~ .U6m̙ ʓ'O.[R:ydn{wFսk7`0}=|̙3nݻ޳[l9t{kVWUU=CV޽{bbbyyyxxSO'N|+VpC!YvN>=c u(QQQվ}{W^}~[2 JٳgGѷO_ @v3bVUUU11(˧Ray#:$ #P``rf%<ڡebWrᨾmd@I+&y6ux6%s#8sLߟ7cƌW^yd*/2Ʋgy&""bǎJ%y ( 5b8S;k#FhZ={6zgxi~'\pK.3~{x0|yyyxxHJJҥKpp0^;i$^+ȕֈ j _Cydq>uzn4Bttt@@.s3h8{lǎ9bѻM6S%'OΝ;W˗ Chh(jZ4iN>G@@ȑ#m6[NNz^^ހ8lҖ-[vt8 ?O3@%QL@˗wU f&F40q&t@"%dA"А$˄-4D=5D7ثz6 0hy&BCC۴iC)=w\˖-߇rfs JNEe˖;vܹ,9s;NVڥKntRx?SvvyAW9Jk`L{ƿ5< <]ܩ,iV;(@ki , ?Z9@d *N/vHt8njuxSI:m[;̪,e\˺-a=k "Hۿ (o+YZ,kQh9S &yLI/ RdoWa\l#LPћ_A'y ̞m !ķ6LNkڏ:ut3D4kj56$3X #w^k]`r @1k~~@7jZҾԲ!n`G|WnC{PQQU'Rrҥ{N~-[k[j5a„ nrϏ"p~~ٴiAPvТEҭ[Ο?asjyMFSee%k֭l6( ۝NgaaaΝyzgV6 }w;/|m 4`WH~OǑG>|]w 8pjZ@Qu:>j(VպukKHHxgZ8|8Zj]Z-kxy1o}ΝgϞ?~>gZZڰ ֭ZiAvfI2N>ye9 @$p8+ey˖-?bLBx)S|>߾>Gycǎ\cnAlV=z?P^^ޢE 7nȑ#y>98oaY#F{جYx9^fqW3եKzKEJi^^^UUUn\4$,F=(HIрo,2AC2_X~P3VN6K\pSBBωC=S۷8qСCccc- k׮5ku7wnpH"~-7jZ'hӦͱcǞx ~g]wSO=DFFۗh}'Ν; &< O^ Yo߾zuk֬ٶm7DL4iܸq111siӦѣGy[$%''.hӦͫgg̙tӍ2*""sUVX|yǎxǏc<[U6m@;qfy̙+_5kVXXk5id2Ξ=h5b{L3cF^jաC$I Yp_]j-,VN/xk"!s_g/Ah*뇏'jJ(6L @$-xә]z爬{߶:Ah<#/5ߧehӒ~ŋEɩ3 w;vXl,؋^jUVz}f j||.\ޡCm۶%%%l~ٻwofF";牍'yseb%G? D<'k*RYG@j|?-[JLۊ ۾&LذaC6m$I={6?q!j-(((++۽{?'O^fMttVҥ`ϲJJJBBBΝ;7gΜ &8p%-[kdqOdر>d5&ܭweӷSsK6rV[6%ѵֻ3{⦌D-Etj,7?ea?'A\V,[htG9]qMf!}׭S@+KO=# Ko}Q4mbh dx C'3/f;@pB Cs͉Iϸ51 nr&M$DT_U "h.0hIӂ;3WTl C-l, mIcNb3Dm2QjДs/.)V=mJ PWrsH;qU,8"nٲeAZJeV۩S'J˗_}:8H.j4-[͝;wwyguuuvv5kr!$8\v]wբe n}ד:{3gz(vm4iҤcǎ-j޼s=gϟM;s-[ ]|yXXjP\򫯞}Ypl# [?֭\ѪɄx^ [`AykEQQQ-!..c~GgϞ ޽;yBMy pw::ƌÅvI}˗Cm9Y,Xk׮v\:yO>ɵJkajfIΟ?/Bn:sL~wх<5ܮ/I [jt缆m۶Y,Gf>"=zBT=Sr{lȐ!5MFh2]Csw?$%%)'d2)ׂ^^iĻ$M j%DʲJDDƭIh2+Rf\׶Ȉ"+eh%;cXd^$3b"^8kXQfcRm hV=2k?po!hn̸P,Z/Jm*z2ad71:fDwcL-U3YfC QB;u +*x3?I)4`2L:_~p8DQ|%:?U~8r8V8UED3]VYЁ@DhG#Z$c֐ rYcK тX'n8#k*/%%=:&DN.Rto-hA+K2"e2VhX%N͒YT rT):E«m|EE6K(3I:Q("QBDY"UFD#$[vKBMoG3("JbD&#ee>@>cvI1 UzVPP@ d2fwyDː賂O|d(ED,+Yl(9$> zPwjz+BIѤ<yWxLL<5aʊ:kq3/7d[̱/"VVVzp.*--˗yZZD I х|ɇ*:$&!\*HS3P[qPnƍg:8w$믮n^{eS苖Pvó{ Q\507__MflRl2Mfl2Lf1\=+G\~+."Z곭'NKI*0üGִv>^]ُ%I~9\5ynrON} Q)]4dFHmN{=e{|yzeUV[{L1J3 Qal&0Ye`>p6f5V~W1*7~ÿ RRR:u3_wO$?~?NK q5?_(JI=9NJc\l_O%ww"qZ)vE>S/x<3];9_34!xEBU|]u/vmx^xP zӂ|Vj5؇bjv>UXFʏ֕WWy22\ilTbFubj,Zzs 7vP5HͰ+zW~AAAY;s2uv+\uNiu%{Ǡ.<\U+%:CpkP[ƭ/9S܇=U\܈*ǛXoOŊg+\/z*stWZWFW/H˞7-#3' >]JJ8~W?iF+#WsT"V_8 y57Q]@ʕ;:}AR+iQO 4.yм]A:rCC,^5 c]i}6w=5{ iyS }DUt]6"7櫁rԍ}C p_lZpm_Qm#)+SץW=ﳓV=n3M^DFvZuNJ7Gx8h\::mjAϧYK~B _ IKSwQR#0oR sǫ:q!szX}.WQP5QjDuGESEoԢ~ 5r} q4o_a~.ZyN(EOPe]}xץkAk9o Cn,.X}? `6orՍ#GK6.(ZШwpv[ % Gg.5~7+V|):ewiRWY+ӈw|s#ĉXV׵ \23!uuY&JCsޓ9Ɣ9m,2=P(a@͛t_. }s j^o2C {ݶiw˛Ԭ)7ވrk+}\i;+;H-ˌ /.C]ρ(#R BPd2  07 5Q#]q"t3@ rdQSKк+6&~}[RҺ:s}Y?,퓹sQ]껑<}1y}~~TS6Sy7~/j,;~ÿ1ɖOF{yMT4-PqM{W\BIP+ ̮#\~u6-,׍{^Su)*[-p_he@಍w_ڪ \ZpTx#C_7z~廯iB u7q~VWɰf˾Ԣ .0ȪW[*|6J P8eEZEv+ @wm ˀ wJ+ v/aL5 ;} ӃիhMݤq+! u{H,eY*Uy?WU||Q1{:j~p!<"r65aExjS]Jſz{zC_ztU9#{WK 2ԖUsq>mVJ !\Ng$DJ7(@d sZR\D]$n2DQv(AR<EhqKR# 5D \M*,ԃwW1$|P);ﮀH)A5@nqO}m4\1qrA dDsR.ôSUAį֌p_8p$IΝoԍ1_a]RٖW`I@'A5,"c_ D!\DX]s)+MXP.$*!>͒n2EjCIFBN1m d%h$FTk?$gQTſ %b.H0Jd d.1U+\lYFYDT5HC1k׮d+Jq>Uv0e+6Iոg=dt:uP@J2"u1À7n+R״`IN8b2O:5F bVVa2lE}UFjǎ;fgJiuu PR{t[qԨQEzE5r񌌌wyw9p@VVŀB^QWogos(x1 D>'TWW/^W^6v:\&xE5j1[nW(TN;߿ 70vѣG ^ <ǟ:yH@XtiCP{&%%+<ȑ#tꫯΙ3g֬Y<ٳgΜ,r⭶u*R_~CeY%%I2 }Yqqϊ(RnD,C(S޻Tޮ`tE1o>J)ǹc_U?^A?] l%o; o9tVx񗆏'dʜ{l˿^۶8&:]av]` ]n[.((HIIxWM|f5͆ Im6Fzj&M[=| h14!v;q;" O=7!"!TƼ>I(0$ AQb6D@(91.2(*)*N; :Ejܹ܌^|%ӟk쐢 Q!YYᶏߘqmnV -a"!2!J=mάG%\2U[(đ;}YNc> ۩@@e(g}衇~_~EqmPo]5܌SEzNȘ9sc=>SV7_Eqʕ60G5TFxsϿh=e 2 u8[=\w1R+xҊ~Ma ]oYO>t:9O$f/aaau~W ~ȑn7LoҥK$~|ի{|5غuܹs_y啲2l%%%ޜ9s.]zQD4 ,|(?ӆ 4v +Gm۶(..߿?_;;wNMMWiy]i8\C=#{~?/{=E^QO>e2Ο?Ν;t:$l6{ب+**7$biih86oYXii$IÕgΜ9rȑ#G:t}vit:+**ojQO:U\\\ٓ÷~{?3mڴQ?~]wݥvЪ.++Sz/Yfwu;SaÆΝ;~ʲl4x@yyyuuZJIIjqUUZep8ΜΝ;P 0\Ar,F_ J $TBd$%*S'E+MneT\n貇q!S{odp8DQLMM޽;(eeefY]899n{X,KeeeAUHhgpZqUgu: ˺jgAǏ901͈-hSyL$P掭`Z !e˖O>GI'+WQ$~T >>\H#ჅɁ#zˢ؎h6xXYy"HVXN\-rX %) E% cLr"*ģH2 WG/֢U/Pc{(i붸͟nJl$L,}s8z8/=5lK㖃H.O}xOWSV?dNٕ!tF0κC;?!{K!Yu1DQ ^4ٝz|_\.$Xrm=o-/KV:m~Ɋ>f aetP?>a @dLV}Y3F.]ꊊ RS#鮴4===$$D&%%M>}՟}ڵk'Mh<萃l\XɤV:ΣGlX||  ?#::33_~cTmj*brQ$ L5CYcGL!2"]rz&b(\jiYTn(0|OSpeXPO ͐ح[H.`k4֭[GFFBd'N bk/pg04idɒÇL&]v3g΀> )))˖-{g1 `Æ C Yz%Kn {׬YsكΜ9SiGjUKvſȄ6f78tag.1+9~ ]j^tiŊ>`.]!AAA:t(++[vmnݚ4ik׮ݳgOf͸I0((^Zdcquiڼ_|q̘1(N:5((HE?k43g,Y$88Xќ={&!!w|O81hР@pvࠠ'|rڴicƌٴi۴i?ܹ>j׮]VVVDDħ~j6y{ͫ\]]Wyrرݻw_t?h4o[VnYlsFGocŊ'Nx'AXlԩS;wq蜜?}=vؾ}RSS;utԩ'6xƍdSNlNAEk׮|\6֭wQۙ=6oK+8$ӏ<] 6LQtXLV}?rwjm\-ӂ/?o> o<LUjD\zbEnϙ3rСo&**[n0aΝ;:ujܸq#F޴iS֭sssϟϫ=u*auׯPAe# @!ΜsYg3"eGppH~/,q?:}4cGldxTO@2MLJ_N=xCѠょ$I~ippp~~K/1/_^ren |MhѢ޽{c?ܻw^(+bŊѣGO>,w}g6M&SyyçLb0c~mjjk9V6M-Oi: dZ*PajMri?S(ϽA-taY~Vo?ܼuqwťWW֒])'3]i1g-нDHt6 h |f7ԧ;_% XӱoW$jr|~CYˌ+?B :~t!/-@ C&bHA͌_}[hptB-L:D}0@@qy-fY D8_y]׵Ci:^ 9;H>KmU7; ̥N `mPjhAjsR7#&-ATQTM 41':.}>==R6>(??? 77wɒ%zo=}thhs֮]rbͶb +8s{⦆Yb 70h DܹsgUU_XXyf;v7hX.]گ_˗loMNNݲe(3 h4k׎s͛7_xh4n:>>7m͛sk*CJQyaLC'Co"LC1x!y+" B&gEFFfgg?zr8)K,!lٲcǎ㏯Z*889rdFFFIIܹs;wiӦ3gݻlÆ \H?~Yfv]ӝ={6>> .]/7o\ <{ ,xA O>dlldZdԩSwܹt%K(Nk׮>};@3aX#v8@xd$Ze&|Pa%U%p\5fphF!n%D4Emoi@J< {C 5jѣG׬Y}cǎ?&L0hРnݺ1mڴy%I$GU𜒒j2TaRB!ZG؋q}.$@1|+C&Zq:AnIJJ=v'*VpO?422rر|q/Aь5jȑ%%%Xf\窟[n%33S=fVN{g}T(fpp0_}ժ3gN6qСW^yE[T*yih~aZ WZ52+@-4 ׬YꫯjJ:~xJJ˵Z>٫WoղeKnkpn޽;b,}woVPPEQ7|G{7nVmڴwbXA5klݕݩS'Dt/_0`"##*[ANN]BTR>}[oUB_7?BZhaۃ\ۗx-QJwCXXwr8/GxJiNNNӦMZj࿢+aN?|(#\w{fp<*J×tUUn~EӲ,s%n,MBB¤IF_~hѢ˗;vԨQzZb^?s̔)Sf?~2dȐ!C^tқniʔ)PYY{rr6mtAEQǏ֭ /Gzzz=A8y>ۣGnu8v}ڵ[lq87nݻk钓ԩS+WإKIA(//o߾=RzcO=T^^zUҌ^zt}֭r&̌W< !/^6mZf!p{NѤrVMٺukΝ'N'%%K׼#G8ο+!!u_tM={n7 GV,\JP1tp$DA )&'?@4}KF&ʧt՛_]xjFv "7g锒?s1п>uTVVVQQQ^^ވ#xwZZZNJdYP*ZSrq!Dmp] Qg!= :Ξv-d{wn]-ˀȈPl78ݻwO:O='f޷gtMM6A iNOOj<2eYڵ+p(6"~lÇ'r>@y)=w'rRRă!4$HfvsUpxN{9Lg|GEC:DH 0U9(YBz pBs eh\bMW}+'~38s県J[m*FGO!"23i] Pm33?(,,1cF``+&l'_}ٳ[u PA`[ J#B-y {%Z;"Ȳl!vЀAȀ2 q*RNKOO5jϻSOIjϞ=OQΟ?ߥKUѤM>RUUU^^U %%%M4QD׋/r ̍,.} N<}iA6zRh K2KJ $Ys!LJN7$H(( ]X4'y,MǪ,~tT"lq-SFϿfǷ5 0't=;-ܬ O%ɠ8ѼC,z k@ )Td2‶`ȪKˁ#G!E>\2YFrrA"|j]Qpo)e={j#vjmPn~)Ġ3R#g0ab ke/~Y D Ӂ{cRB}&L oF߾}ϟ/?[lr3g|&M(Is :+rj֬Yffٳgm6۠ANgvvȑ#;vȕA'Ne911瞓e9++]v ;jCYYYf˗/z.UvEEn3[=>4999$$Dc:&2S2̪-퍅IIIL]VVD bb&M"K.)/BHEEEӦM stU7Wޙ)G]jURRSI[v۩Sw'OVTT=ztɽzyfUVW_}O?ݿhժՂ -9{'K<|aa ؐ٠_Vڵk O?A!P1Lm2l0z%’jժC 'r۷iF,]K.SL=3F43#;jG³ǽ âh@ qX+ ӆ:JJD7c8Ňzh*2#j"Rq\}}Ν;z-+RXXؾ}{VqqMC=:>>ҥKǬY4;;O?]r|Shlkryf I9i8͠ CڷRRP舁K8-!8v έTX,fx騨֭[kMɒ/a1cưUWWWhܹ`瓓}˗X ۷opœ9syfz.s!-hAC4AZnHNhS h-_|b6]DZn5b~As @sݹy/&Ι 4oFXsxd: "H1aj3>F;jpv@mQQ _-4)Ai0gv8ԋ_mjHt GDT:9媯I\&@Bh3jgּ!7[4QVeZ\yh^{&qfĦ`iF[xо|ؐ$荄7P)Lg2'?80؛pzf:hXh$4Rg/Joqw u0H3LWk:nqqqZ954o|ܸqiiiaaal)..flc\UB͛WUU}Wng9FӣGpkkkcccUzRڱ5mq 搐[zqfSLa{'%@T_83oOLQ\A]p̙3gf+7??6۩Zh:nt:%Xk^^ޜ9s<$O+Wnh4(2^vFF)egᨮ V/ ɳ~)Ș4izjVW_}SOuЁIEn_5k&L;v^8ñuVJd:t|xX,QQQcӪjyܹʕ+Yݺu[bnyl6=QJo6Yʤ&s9ň@&;u@47 !A{N6 -'N6l:rs=4~aÆk׮v֬Y#FصkիF_ L2I&죏> ǎ{g>?}ZnݿD||;L &|,a/^y&iذa'v믿^x'D\hB A_:{aۺ-[ 3UӁfK V˓#~qIUto/pܹ]Ӻ[={m%KzNc76mڬXyZI&L@)ر zܹs۵k7ߜ;w9nݚvޝ+ˀhlFAeKkg(>z==6lʞ9f,Շ$/uRo3+|J籱^zRN^tRh~[h!dҤIk׮j:ut|MNNNyyyHH̙ӴiSf!BIIITTle˖;8Vopu|b['tzq䀷Ӵwxukӳgh3-'g<٣[Ӳmf?;kyaMC|/v-ji@5"B-&~3C%t\=JCFJ8T@b9{N)B4$"$r−)Ӌ-&ʹ( bL響cj@:j@քiۛ*M7N;FO~J$m~ǽ MAj9ܞ~.#}LHE} _S}|bOֲKN#Dygz6k&h4+Vt䓹sܹ311q.]̙33gΔ>=بA7o}'fsLL=ܣj}bbVoYܻb#n644{\$"CafY?%?_DDɤ|].yv-˾}M ,_I7 (1"fي%t.Xg78x`8xS,-TxF*ZU҉.yAA 9y"  "\9$RBN$& RhDp^9iXXl < G qO(Rp2%SDQ"-EA"5 P@Ѐ^#i!K`'T$ 8=f D@^BQPy !px"p@8 Dr:)$ D Zg2*J@%  @m?0+Q7)e{2*b;)wT+~Vw^]M*'[:8vٱSv1 o+ےʖ]*MVjϳ@YjYӠHjnM6=C,Lj>ה}Y^?{lں{} aIj{wѿr.go\+R&xBRSS"3ڂ88±gA9AngkvPr,s(@gX1AW^ɪ(_m  d+յ@OgYFٖ [/2r&נ:˝ua %9JH8z(prtAi:ۗ#E弫pn L2g( (XqP"(A NHfVnB (oZʛwuuuqqFr!%=Y{k0=^N_Q $@ Em&KG./eΉy18%PH<=!%<%i\$9 2JF%$ G9<i0B A'.gvgp9QpH@ A 㰩CB.s~pfQEz(g)@ HFw"G19 |L0"t^G bGo:Q>go^10 ~8U{Z:@<>luD9ם Kʡ)94M{Juziy3r>(ɠ/᣿"#lLwVL›7 xDE|2@sSy+{yTlWy3QvU>}5/fcp$53` AB ́)%/k]5QOA7='@u9.ǛφCI#e *y8C;#!yvΥoDYi/dxx +V3{ u@y@Žczߴ~Ky,j=ʧLwd4ݙ2(;<9*PW8VGY2=M^r.ioD0]L4=vVY)@8r!~,@ѽ0g/qۦMFEGtEYCJ~UK u_5> <<(2ڻf +Y#(,z~S輱j#{sޯHJJ*RtU7W'sUgˢ~8\E}qihq_>T,˨b}-V}Ű uX`P3$<\DU] Rh_̐KɫW# ~*HW7fЈ2z7y{݅g-_"G~䫜[rAPVٳ^ ` z w̛#)P{ç= f;+ `q陃 z7nwnVonZ: Q}%A+woF7$7χJ_&ik/7-PlN^4ޱA`3NA֔_4__!AO`a0Zw9kgUQT|ґϟ5p]s nAq1utjcYiuy<8U߀?ܺmRKi-Z/[i,miI l\,0l|U>N;BTF*t)_s !+|Pe.{}rE! tR;=ǀ9T[QG51?duGnE*1HB)I\]ww=6c[߳[@.{s'P̓#@A:>">e\Y?$h*Zkzx9\ܗP Weu%98FsƔԮ.Y5 $&ECNQz41ϽM9M_uQ&9:=wTV薧G& z}V~|{<]%K#T=zo,u>Tw^Rr?]e\>$W~٤j4c.,Nkʪw1_d"j ABR7&}]7Fl̕":zfkJ7FXoM e<{C@([Qas1`JϾԥ RG.OOwsܵ紪f1W'4=/|P*+S%k`)f1fVt׌(N:(rĻ"Uױujc xu@S'Y!r]7/ͳs.k \T [jJNg ? -PϘ'39:yI| }V]za9C9u;.QG%&]U&*S/WI2m6Ǝ' e:N<B<#Z08 Sv7 쁇{}2)OY!iʾ䮯FڹPU)<=˃ ܘ[J Xe>opJ`F'JR{Fؾ̨p8fIs&/ڟ坙UUP $IRfH)lDo{oi97f _d&Rj٘CKywySrU w ey*++9r%y /^Tqс95qHلC|Ŋ g=H/ۜn J .2_o>&ԩS*OED "RD)>$D+DZGU)H" H(I$Oe,Ϧs=*A< Ж'E 82 X$ i9 .+O%&.J !g3{4L)" uR ԤTAIR2]Q?TTJG\S jZ]N_*"JQRbbj@ GAKH: pAP+~Qj5 ltHAu52gh9)sbA ADQD,D)NP8iiiv:w;YdRQ0nl((PIjfr}^>_Tk̙3>`팢$P" Y@A!IX]o[kn(=FcH7VTT$OAmmmvvvJJJuu5ܯ?x`CC +-----ӧ|hѣG51Hp8BCC!U nĈl8{ĉ~~xo$˦>Eb`}av`e4=[!qZ4f(/^w^Kݻr'J9F!޳C88W[՟-zΒ l?7q<85Ws]|__Q5{էwOS2Q2^"y)IH0Z LAnذ!$$D"͡ =@pWxSּU@puC;;g.֛@: aWf,|y@U"JGs3/T@q\ͯLp9Qpء{ fʬ;=j@<Q!],ӌqqw?%p8[=c~Rߡbe (:[YPxijO=ynx*D2Mx4oSc&g<2{:Գ熏m8;R=A<贴AC9克2'}˫VpD=WZ|jpgǻ9 r~p;ly^9۲!z|'555OӦM5k?>s?C%;N![\믌r…zg}fV5$I￯d7QިHp_:(xe'_[=RerZ;CcTJj[P`o,fs'BhhhJJnjZJߵkWtt44Z-qRUU7̟?z;MqN_F…ΝV\9wܢ"6_}՜9s,Y(fUVVZ_^hh4kł l߾}ݺuSNR… _}5A*++wܙMsaSpP} ABp=M2}}*V>EQUctn(繦aJTDfBE 1`&-w8=zȚf5'$##nFl\&QK3u0g껵9cp @v/pfÈd6>b~jr+ovGN<y!;u TW4V\n<ERS`2ؒt-ZŖ.D}vwgY:$?2VhVĩAC**+BLN?9fVw"qmC"\,PhC$ !f㒙q6@{+%f@Pj^)^MU[tDlΛ6A,$R@9h:ߺ9؉܌ dXt9G~/l8$0J@+ʿM s""PjaWc[ukK{W|8 iiiK,yWJJJ!O?4hʕ+-Zw@LL?_pÏ=jz왞Օ+W~7^?{,[VVVUUbx/v 1 /|X,W^]|#< #"":tPUUvڞ={FEE5kvլY?#,,rѢEVRjZmfO<'hڢE=ZS аsNΟ??o޼pVwaN:G O>dO0`S΋8z~!<<<44}7jԨM6.\_w'$&&n޼'zjLL+P(fܹs>ĉw.,,\nFaZ>aozL&S^^ވ#dN&//>k׮ݕ+WveN:j4z{ܹsvvƍ }Ѿ}K.2 ы*`뎫N?S7mՏ<y]5D|ouƹ,dշl-nxr=b³s{:￸ސ"Of.&Of裏f3b̚5r>..ǘ1cN8gϞ䔔1c 6,//oqqqW^3g~駟~)*+(.J2-l!1/kQFTن֣FyIVmHjҔv}fxbqG +e*M6EFF X{%%%fۼysZZܹs{qtwn/^{1 L~rС&M2 ?/^](X$l"6=IzK@/_^F[Uqݯz.T<:~IMqeǚe6OҢ5n;.Zp&sJ" '_ӽlxb;! C'M э*U4Zz1iǕ h4ڨf"+,9H8B8Buv%+/ZBz4: h?o)\7k$( S2hVޭ7.3J1M.vȥs]@)?rؤwZ%eDe)z퓤 1hDGyƯ:V\pC+MRsl$jhtr`譲_~eu늋CBB\pxVߟ={6""ҥKk׮ YbEiin_|$Iot߯4x>h ؾ}{CCC=T^^i&Iئt744,\o߾ovͷnݚQPPi&Q̙jjjqƋ/׷jժSNϳMc93f<ѧo_eD5YMLp䆎SylENS zN=g 2x AID<͛.^On޽<χ̟?y: 6 y?0<<2cƌ#G䔗]t9wƍz꩞={VVVnܸQQFql꧟~JKKc]5UV%%%x]vv}Ŋ .t8'Oy[ojՊȵ2+A";wGL:\ryR#ku:]8bU} $^oZsssVΝ;A )**JHH޽-ܲx>HˣNHH`2&n̘1#Gyf _|yзo_!$y !AK uZ8gʔ)aaa:t^߰aرc{짟~駟t:ݼyv=u={t?`00 ^3gζmevp8n)Sdggk^OutRzK~o߾~۷S._C͛5MxxxIII޽7Gߞ={}7oށCuqwq111۶m=z5k:vKV^Ȟ4(66>c|tϞ=(ln)t"6ViӚ4ibt:]nnnʕ+LzK6mڔicDQ4hP^^}_nhhxw_x744̟?ʔ)?ӛopBdEQܹwr'"p om~8ڥL3GO4 fRYN.וui=wLEQ:ll{n gyB\(|4n;~5kڴi}>|('N8~1cأG^{7ސ/IK.e.yO=sLuuurRB8&@+h_$|5 ;87|h'|j۵K=?XahM~H';.XWCCCׯ_VZi44V0RHH$Iꩧvl v޽l2Ν;dvG?ロP2a„'=zرclat?-IU$$ t}p! RNbZ_ U"K zkv(6 ~0vlOnm.!"ݖ& :5ԙ1aZ .]<3MHZBWf{PBN/@f5M'vKl2gF!p鲭Eg;: \TOm Q.z=qΜs}u'r׮w +|K\rW[v~vpR@-jlg~טܬYϷo' )싸.K/'Ęr mVH\+2O({9%w&w[J:p dDHx-Q9fx-[*ͤNm۶zɓ'y%+|cǎ/~۶my~ȑÆ -++8bYl3<ӹse˖u]yyy:se{oǎ8K/)٪=z0 _M&ҥKxiӦb99|E j2klХ'^I`75mNli5 +ADWsT&`Vz[jy涚jڗ_~9''W^.\`xnٲ%fs׮]yIDQ駟P,-[Owԩwߝ}w?s}G5bĈ޽{3I&n?uի 2x`X,:nѢE&M4i QWWG VZm۶mɌ-3f ]6,,￷ݻwg_~{ZVv^QaVZyfñ~޽{/^X՞;wn<ϧXyةS'AZm]]d03Μ9h̆ \w bG!33s˖-}m ;;sΠRx۴iS`h9s+233۵kԉyq1_AHOOܹ3ԩS$8qٳ͛7[u]111o;tsOFBD_zl$ vFؾsDH)7sdsOwaՆ=<;-XJp:22ˋ uEEE/^|$Ij}!X,ӧO䔕vmKOOԩ\(2vE ᣏ>c%yCgdbg' ; q)]YU^_pDzCF_Lɾ֠ѡi"i3; sλ[3Q;af!ۜgeejՊɶl6ێ;N xݺu#RGdZvСC]vr֮]ˮtsĕ_ݏP*jMXmU>c<ڬYJ_O6M8pRzӧO1/ƌXGɻh׮]U,Yvvl$IΝ;WX:j;wNA0]6jN [1тa=h.]ӧOg, DDDL6mPJ/\Э[7weee 2_~?N6-,, `ػw$I {*kt:f }l篭ѣ!ի۷gyǞw]:c'O,t7*-t.\N4鿤mnҤIUUU||<lW? dLJJڷo=\zѩS]vM<پ}{?ŋ/^m۶͛7gu02Ǖ}ӧ3k8Ddꢢ'O>#_c}9|3~ݻرСC7o>tի}Qf}ZUU2x`&8?}I(GYl>;vlbbb}}}nnw-{屿ZONڢE"QeEwѩSꚚ:޽LIIaחrt͛c9-,Gzzw)-&NإKԥK._<..=a<۔{LnbO)MJJbG}t?355u޼y<Y8p°a䐡///Geakkkiqv]oR {30e8zj8"Gk3o  ؏+7A"DtHOVo}Νh|޽{@-oh4N8L&$IrBcڶm͛7|:0رc%I:}4nr9sr7 dgg?LW\\WٵkWI4Z- z2wxI}hY ^""EFB￟&{j:w]ޢ'N(cǎePheee-\5;2&|L+k/e{c3]ŒX(**b˗/7o\f#^z]wMᣕgV`UJ,?s  ٳgѣGRRR7uTv>qXzNHHH\\knݺ}!bbb⫯}С{O>+V`p?^9={09PJW^]^^n0{Ʊ7޸@gB6SN> (cxEEE5k֌<}Aj2(ĺf9<1Clֲ>=C ;@iqEhd@_|G׿?(Av8Ѹ{%K ޽{̙#IRjjիW(JJJy!ÇGժU]v͜9Ygee}+W~B+7i#2.FNi 5^6sl(Q@yg !>rxѢEF- gFEEsߢE U]I=ўVE?c.]v`$L5'󙙙]t!X+Woߞռ}9s(;nBdɁ._1&NcbڥK˗իWdE=ѣo6XyFÈYW]ݴ䙃 M9Ji' a*̙3r>'I> /$%%7nȐ!III g:t;֬YӡCٳg3)S4kLjZ<#!!="vvי>} />}0f{:wlZǏO9sٳ}e&mW۷NkٲU&&&N0a̘1/R֭eY4jݺ%Kv/qJpU^^.6>Jn_tiǎ~'Nceeewuc1AhӦ|<AaaaM6---}###F#;_|-ZsW="b֭[:nmŊE1""W_$iРAK,i֬lfmny*p]z`rK-slB帣!Dr^ݥeVǑJ2l_NJi Bƹs{?ophuFZ!!!{޶mے%Kz}HH%&&Xe˖ziӦL ;w^~`7o^ttt更P͖gwq_QwA [ް}XQl=v~]~c+4cǎݰaC֭EQ|%d^^^N~m\ZZZ]]cƇqk֬iݺNKNN6 _~ ***_z饘q&MDFF2oٲsr_[?̼\j/^luk? g E'FW_;D "@bN.4:gZy\jTnĺS8i 8(1g_2Kp8蕒[zZ@HmVξRpM1R,ݸ4Ϛu6NgJWź3vtٳ'[GK,a4b ѹsgJKK,YnqqqCj4͛WVVΙ3_~{/Yf٢E7xٶ\pc!0y%K;wNYfՋ5ydٱc7mtܹVuΜ9瞛:uѣ7othČ(ロ={soXɄBžyWP85ݼy󸸸sj:L>֭[w…ݻ3$""y^+ԩS.\رcGs۶ng!lyKo4F#LJIlC*oWJ$* eA7)QJjqgF+ҥK P[[6pZ6^y,CJjEEEalͦ[t. 3> R0fΜKU6m+ 9& TFſش JVMb3BMXk78p`8x8KL9b$x%uI4J !wg:g5jc,u`:7Ϟ={z~ҥ,V!@ZLj{`Q>WYp̛7lÆ ƿ 5_we<+mx@AT|  <HyF@E\RK)R% x]]utTvP>R)*11 8?qkʜ:u[nر#uU 5{%ׯ:#9m=F?dߝ1 p PC#לAfmmg*9p C[8w Dr2.^z\`+'@<4tŪi$|͔bοJeq9;BRS̾SM#!Dy#wy)))y>>>^zo#-d<9t@K ]<$G,֋2hN\¤1r\cQJrDM#].4%ν,:Xvtͦ QE Hμh֦9Ő e'gMEBt ]QEeRYu'N H +c1Laa#]yNO&i viYSvlN)S!hޛc!JTnL& A]s{ĪS6XnZuU8Tuo0uV}~2xn`\o_ ]76b!4BRSS]NgBEy' ^(gj<d!Nd;yƾ0@v0>YnM`Uz]RjpeR,)>9^m=e J)UNey= oQjwB]ER$QD@]t&Rn%"" %<g&HUr}bɛV}Яga%6r)"P ND%դ}Uί[*hڴ)KQ泤z.UHOgՓ(DqSrBk且'$3.Ap~CpP%'G@8!m5}&@@BtPI8º铊"SBD < DŽ29LN Ŀ,<tPq'2KxY[ liEv$HDx9.;2(*Ӄ~;˺'iU5,*")GA$'s+vyߛS֯1YA\~V썀"G8A/gfogxT?;gRMU]޶26YM0ts Y+V+I?]Gcyϕ8:^z;TՖ7y !SPq>/41"Rk.nc>-e}*}BS*OlvVTҘ\u%b}bJq.q"IĕY'(8VQZF%0}-FpĭJgx#Q'pr&٘@ xBR=_)#KԤ^f6TgQxAI y \G'־-w:̊ }' xDITvf#O=6 A|^Ɖw[,_U|uBj?3^Nn A#AB`0  !AB?5 a7n=3!AB&f%V}^>7NO*M_x׆\u;j6X+WJ 83!A[{b$|cf^a 7[#՘0k {oJ|)t}-hi>K7un08Mz`jf_ kfX篟Y>61 ;m=iePbV]I`n?wq7xzzx3+ kE~՗Eo^1o>({%^#.nw9E.hbXJ@Q7uQkw/8 H,HwsFjoǐGA}ădve7p~]mQ{{#{ō/k~}<@0_ A2 "_+e>;K"Pț%OW:b+ѹxsŐ@uM=@@T>Eρ{o ,O55d'R.U+ߵ\}rb!"Rq_R)Fob^Ok !AafGJ?9#YPan4AKEH#ڒ?|c;U%!m}ػ-(2*W䫂hUjgB.DH %PD*)HY :TW- @]iVCyyUrJPM7zl#c(),!چ)8º@Y&Y gyr+Ye 8Ag1ܬA 3JBݚx:9 Z%O$1r"@#R 8C&PH@TJk2^UxzcDP "Z0y{D@/~kUsT)9R߅Au_Iq\>x${R~I9 g=n"UlV^C ɈA9ABn\i!D$7jf tI~RP]>|Q | WDQg6{c ޣs),g]Y[>m:%u)EEiWyeA*fB<^q8+F<+_+Og_r9ByGy9-!2Κ$AQ H8D-Q`?rSxh4;5Tz=W4Yn7C`pp<GN8d,]L ky !Q絔C99(MnQ4Mtu\ "E 6v-#rx\RA`uxƨ;IkDPDBIli!@Pz@#)&qJ4wUf)k-lU*J+"R98pD tG)ecKĀˆ,7aR]m6ç\jej1-lja^ME)ORSSQX,_U6/"q6m:ulVYm%rjoܰљ[ qgۿ˗fҬ~ג@y !Ai ߄F3O)ܪ213f֏QE-u,I(^|-D}ghڊfs~~  l­"4zAYNqZXPX]Yj)E@fChC1k J]{,KJJ5s~fwO} P*1CEs ƒҵǢғB:twAϯw|ؑ5d+*1fHTTD(+)PYC/95M@9aa% XZ@pd $2{a2=% DESP@D QrZB9(8L5(l ku Hhkh $ԛ+"zK}_H)H*[sEĴ]vö\aGOTR4FDIfOev{iAK뱵8y-EQB,|UZ*so EԩSeee={<m}ݿh `q'!C{iiiiii>}YtG=z?>~eb0@VF-w#p䩜윕\ʃz_mOgBwuٳ>CByNp7s̾}l^`A޽m6+p8JLHpSkPeu8qêbVe[Xлᄏ_~#G=zQg|*\zrYN^`!O˗/O>ܹsr?=23knųfz'z衙3gΘ12O)ejթfddyA$ƄD$C /˝T>ٔ)uBGp:R"PNa n=8#!"$,O1pRgE6kzz•O1J&vtM1Nyb+`fvWaxfV ޿ۮ=Nvi5A [ѾoXTsS9nVUy +qVT2Dj6l W1p(%' i^g?~@h?[SBʊ:釦acax(s(A%`HxM<GJr3G P 'i@nȝJ/=lbЕJ"}.cɓ/y-W#H@"O8p;..TrZS@_Ui/|`ҙgJv.ΗJtW 3ϥ X{@G&?GVpH f?x_л.~pXrddӜѕp!"8%tϙb sM)5L.\ʍ[V'|RSS#^z{a - .=-Hpsp8T?ț 3fxgy^xl6;?44TѸeO>h4^x… :DQ7Kt驭-)*R\tZ溺:3|U;tEQd;ѣG=zUaew3;^SS^ADARΦTTTxhKuy~Fغuw=k֬xp Ǝ{=(ع+u|իW{ׯ_,kkkkfPu'=6$rtAC**BmH@bɞ,9 y Z(aH `:F<=@0]-Yv>X:MݦMHGeeTGP7+2f4򋵽ӘҸ yDDOݭ[%rMeٓ MΟ1=leJOO{l?7Dv GˏQ7~ϟL._n".y_翗}fDzxO}X)@QRxF\vm $''+Z]]4aX]]\/rڵn<t(!J(8fZH)5ʭ^cǎEFFl6^:uZ~`Xtg}$be2\ޅӽ풑O^9T8/@I %^b?=|4qDpN&Rj`Z3 4-ZӖ444L&OFEDQ4{!EJ asf*<ڭ[8&@h4ZC R~`hAAAbb lZ`СCF.]̚5G%KK Y~޺r |W^://СC3f̐ѳpʕ;vZUlӧ$QIɩ.WFaGx'7;ABnd$D4L#<ҥKe()) СCUU՚5kuk֬ٵkWӦM.ٳ',<0̒$Z,m?ms؄'O]VG%w&d4,Xhrss:3gV\i0?:uj>mǎu𰰰=zƍnݚ/l߾}ݺum۶mժ՗_~Y__ԓOGGGO>o~29x:{&Kjj / ĉ;wrg}jR?4LL[o95goʕ+v}ٲeiii'O|y_x=ӹs眜 6nݺӧω'ٓѹs3g~zkEEv{yyرcnv̙?xAv,V|حk׻ޭo*&#d뮫<]78/5?ud=Kמ?NC"[niē$,;vղKr n//u46 ŠqQn裏L&c^z%8r_VVvw7a ===999%%e̘1Æ ۸qcV q3g֮dݺOz=!@x734Jϧr[;W@0C[x#Cl #'H#zj4P5scFZ˥d!''//**׿W^}uVVVVZZl2_;wn޼y{f58p`z^ (mٲeF6m[FX]]=lذ;SB%K(N1֣^&B|˯JK.Psɸ#%Fw2ڴ<&t擪 n9ȑ},_obα=r!ZS|."!Ik@UMvKWfR!HQ(++Z/^p8O$e-1b䠁L><|ӦMѣG~&K… SPPP^^6o|֭iii7oaΜ9z`0ƪm2J ۴i˗bcc;uYgϙ1㉾1ͶRԜ oӑw p5C1d_+O;5nݟ7'ӿg}W^?tq!!!'l޼cǎÆ #<3+V`G]QQ1{ԍ7&&&͘1[nܰa=zҤI|ٶm[ZZ[otYm6uuu@NEbŊ_ԩSzPZZ'/_BsySSSu&ǧ XVa.hڵkӧOf5d0v{nnbٱc -..NHHѣ-ܲx>mXUU%l3n̨Q!:~ ![~Fcxh."3!A_ʋ֭ӧԩSecطoߐ!Ct:݆ ƌ???cvv?j͝{Lݻg`裏4:`Agнʫ۶mk(Z-tڵ9s :v;PJ ŋ,YaÆ~m۶m}9}˗~avnٲEGDDlr<Ϗ=믿>s5ܹs8p]w8qK.˗////0aq111[m?~5kwh'+M&˃ 4E``Oc0^yPXϕݻwOʼ<:mڴf͚YVNw…Ν;3-իW;v;4kLV4{onc{˟Iuuu /{UU۷o_paXx t̳t:ݎrKo//n_}τqCsO'R@ФfX$\sWXh7J(/f8z}p7|]dνW8Rvrk #NM7IG4hȑǎ[f !;rHD]ʶ%EWUU^? [~ӧxϟ?=z^y=]ta_tiǎK.2d Z ;wܸqƏرcǎt:Ʊٳ'!!ro6E!gOys 97e a Ts)[V"[d~- @IN}CW|^.aQI[64, pV17r[bkC0 =GH辴+YǓ~/q (Ek7~HsԳڤ. m;S"q:54^6^/yoS+DE ZHCu} ^Z0{^q= m#(n-|slyۃS_Mkݙo @@٧ g[sktD6JZ~u_ڽ4//"j}US۪_7,X$ҺNJ*-թ= :@h==,ky׼ys s<@tt4|iiiIII'Nxwu:j!s?zhAx~" >|Z('<(-?xmg:uX^V{uם9)9:h4ln֬ԩS۵kwa&#𥧧+)y&iɒ% 3f`R!>|ޒD#g.1f @,J6ZZ+io5ygCZjɒ%Rg>yyN/+77o8.;;Eaaa˗/lnݺSḼ[._<44T!{3tԩޛKHH0׀  !70X$`l6 9s̄ ;F1bD޽-[ϧyHj%%e]tEښښvyp˞H$|ᅢ+Vp:,(BVVW_}էO]ʧcvvvN !1N;wFj۶-3#|WǏ4;v.Ǐ?sLuuMll, 'qGdL$ӳgO ` ѣGyGɄq;=gj hu8?@t GʇiM3u/< m<ݥwyo d]4&aHu֝$YTTt$&fXΜ9[^^^TTt뭷[Qff&/JsС:֢E yyGyD#?v:I4p: .򼹃^MhxG,rWqPNعsԩSCBB!8͝8qb&M4 38.++iQ$uڕk٘5g,СC9+--m߾k;RRJ=!I)}g>|{ @W]֗6@88ICښ#'ׯBEJؠSDžDt0qpRp45־F_rh/^2p0׎-8u]ϾVc.ؑc` eeOˊHAmc 6TaR !W6tkߩNڌuҥ&}z T*>zĮ…r<5=P{l\do[#LD=qogkGO'ґm"Dž=dD^y&-QP5fM k2KvwL2XI>|y\]]N/z1x`3gΌ;VN=c̥3&:5mV^QaXi}QJO, a2[n 9998y>33s}֭[pDd#{EĉgΜq8ʔk׮eǓIII1113z|Pqʕxqݻ;w*JyEի'OffXR "[D~x{nĉ>uf+_ycoҤIEEE˖-z^n9#s=ɓ{ СΝ;N߱c144ZxqBBBHsss۵oDYYG>}!)I/))kݪɂtxƓOCBCvڵwލ7߿>ihhxVXѣGM;wntSNM4 ={zN7nܸm644\paʔ)rVZUTT|SNmѢEqq(ӦMc'vСG}ԩS={$aC)r,<7o޼{; ФIduĉݺu;{o|xvEرre(0 IIIPO>2\gfJV[zFq#< =(Phh0@z=ftֈn:EӵC@N9rMq-Q"g=Z6xjگG);h8'iա^kܶH222 srr]s%%%>hHHȒ%KwLY$]x{n*q5-+KϾ?9I3JhxB0fg5m(D'.[PA.YE>D$uuŗhȻr\6l8R ,.JsM^i-P3^,ե} y#LWʍU=wIIɑ]ҵ3&R}qZ2YaRxƍc, ^>}^}Uf̘ [h?o0a"FQYpER\E^j0KNfffrr : !5DAllL Qq10Le΋iv˗/ڳgONNٳ iAHHH8|ݙ.4'';`Ueee5Jr9|477wС!!!$7NfZJ.q$%%:(‚B.]ԴiS94Ki+#iӦJv]'"O[& 9fVVѣGWZծ];&mg 2gQF>} ٱcɓ'ϟ?)SKٸqoVc꫟~޽{G\\܂ >l2wesaa =,++۳g#> h|Iee`x#""qvABX̃ENNN>}:(C[GDD4i҄=9{l6:Rjڬ6AoZ]w۲eKBBqȘo:##CGv)99lٲ3ND)ݾ}{QQU mݺuBBV5ѿ{^eh4#66رc SG;?;>b{̽HH A4<+OT>AD)>PPQX H!$!=$@n6[s~ݒ%~vΝrc̭R6gyJ^zmvVc1Yɹ_ibcuL <3\Y,;:t1%.}ܹT*Kӱd2UTT0WII;v]Ӎ9l6'kYYdX4mTTTBBgIf6yA[ni߆5o٫=:yot 9W9eqO4(!ǟH=4c.Qq!Yi_n*'G&j4 0VzΝ# 쳀62n+bvvw;Lk׮9stܙX7g="3)SL0E |wR4|A15kfcYT.]}fiJvqFVU^~mʼM&hF cG38mSk^"r*]GDe2?\7ˁg̘tSgΜ5j|Ν8q駟ԩӄ ޥK_|qԨQ߲eKBy燄6mZ6mMZmNӧ[]]=mڴh tؑL ==1y "##+**VZj0XW_|6mڨT*Yď?e cu֝8~n-[2 v۪UڶmX6"ŗ_^!0s2_4H* _bz_?)<<;mK/duPD~*6*dT[ey1>B?-Yn4.vdbd@@`߾}~믿< 9..nݺu۷j.]l۶MվKaaa:uꫯocbb7\diZK :2ZMتOw|yQȓU %0w0|m۵Dpxx19;裏1oxbDDD^Zjd:hpZ;U*W\Ne˖BMol yΝ]taIfT|XD(ՒT]_|*,GĀط~W^wq &66ȑ#|ȑ#{<^Z6,Z_~߻w/S%>;wW7K-pVJ(k_?&)""bL#=T{nPڱߠ> 7466Ι3RC;.@FЭZBU*՜9s &k\>t#]H~AZZYֳ!?a~xjb v# F*QDDZ[SWzf#тETxH_GQfX,eK دO?݀bZ+**̷Jn#"W kkk ًL.#f! 85HOBDLIN8f}f&uQ> FFsWSS)qJ@R(?TKS  F}hVVX_G]{*@*!JÒSբ#V;ED%*1YolDDю(5)YEE&sFO?O?kEJgӎG cMP[[P-Z$DQlej+Qzp1x*QuUA(Rj4""h08M?iJJ %Eş=y e})YIKYܹss!?arh呀AQDD43F"22AhA"6 n/"T!5v^BR4e;qY@)M`R|{o*eCQvDDC hc$h4ƑRJ͍u%( X",}$\,evDEd},UERɀM*/jmu(Q((ڜ)R'mH͈hDDK*-ZֱlXg(Ƣ6!\UDGDyT'<7 tM^W{0J`"^ohhhhh@DFf=;>P=6%U@ҫeFrn]rR1);,ba\\u4IlK)"MiMh`kJT%IDAs,&zz%A2XI%•cA>8q( -%Z H_a Tɔ:L&taPq"G}4w\t\J.x宲j͑G>}:[,5(lZs`oH٢`w҆ϕȰߍ7#ÑG>|G=rȑ#G9ra2!d1z$ȑK?… La-=g2fu_8wZ*(Ȯd}}Pv/%7RG`_3K%9 QJK%ϸ;ئHʽ@,cRQDSqDb:P>͌EJ3*c}GUDܾ}?ʔrͨ s=S,|."S`nI9/ues*rr|c+qJGIA>|Sgd:wau')80F~BBBf͚e0ƎnOf᭷ )Eq?<_7ܸ}Ի.X5jݿg;v3ff;vb7q} $_ka.O>,Ωfiꛮ466>73~饥LL[?I&$?~mpZ~<`04ٙ~~mt;?$6\s~f]_~tF 7~?~̓_pÀTgM\7"3~jrD5,9ü>lyD{}]W>RiI< _׌77WZ䛑me\Nq@T9CΩo5QMx1*̠}E*fQr5\I'nkޑ&P\hRjҔ cNVE 2*;\х rTp9DD.@[8 JzL{iTmș\Qt[J%>F VNw[R|9-'i.4|ʛ ]g]H{[gnL} |ujam9>ͭ?7Ϲck%ͦ4%W .y2^t:+Y~3_%C[]:yW\^SWىVkP\vpnB>ˡprbgXm-O!u]vy7dc2JҬ}9HYxoCUs-|ޑHq6H\PtVuڦIzrǒ&%KXd;3qJM y<=OD.; .fQt>wpi]FNصJᣃNz|B;H-@01gF!#>$b7P9MQ:_P ʙĒcDb}oВHЛo\KcD.~k t8I['}(М/WߥѭK-5S|[vEy4C7JQcҕoj7La@ϵV?ˁQ鴹_rNVOMؾϱܤ 皣K3tm0a)R#҈ 4$$.xܜE-Ǟ&նJݓ9G.)^eIjta-齛T"0yowtI!Wzh-6UCDz߳n|G̙8Ѥׅ@B;fC.r9*i80D81EyCCx}8ZXRPTO]KB!MԩhXiQ~Mx=sׇ9(<]F^y-[.u+uhqשA-o[nT%D 㗙?W#9۳Mx>qn]wQ#j+7"okEw;3N:zH4ɡi&nfsco{c[@Rx$NIfTYWTH:;A9n_}m[h| 5l q7Og.0&MȒ*]uwd&4+i:LLwVԞ%*Mr{M8&45D^dGB%7yn*:C]<22hU칶z)~-1kNzb5(Ͼ)>E]_f_ >Drkhym7#+BC䦔BB:]{cnI bBD$سzvZ0eRʅ{xeW ]Q!$*emYSFC2\G.됏IEË 9xTB˞ij.> ,NjPs8 )+мTk+PDsh DXWeԄ.tGX,^ٍuqxmR}U~E^߸n ܀Jۦ N$I<+fVʺ~C94iӚqk5? X g I~Q$OײdfIx6絟ʒnmy6f7x1@$[Ss8 }`ƷCf(\.MHr IT ?"#zN D H(uΐFx PĐb4Xf}P(z5k"PD3T6BmV4F ( Jr\7q>RQ~REBe#DBd(RA)!PQ^EE#[j QrdsSjQP*)QZ& B p-"1:l8*M"ma56skJI?nefEy^ "[nYe A?%%Edڹs?Bm߾=))l6_f ~~@DOWsWLfvcc˼Iϕ'<[ U%Z>q˗766^tɍ*\M P.kM9eAW.<e.dU=MNNEQnZv㡄@* IXٻksWݱW-^ܤJ$IJIIIKK+))Q%INII:녂Gƛ/WV7nܸq׬h4@=:++Q~={677wƍ7npAaNJn<1/jZݚureMu9rѣnjʫT*9:8$I{ qrz˕6‡z(%%%((HSNeff6 V;wٳ{?䓹yʘYTd6+qX7$33BPPΝ;epDW&P7Q C\:9HS.@Bp"e絋A}> .]:xI8N6M+TU7p}֚>^:ٞ>G9ʾtɗ_\xwƴ ^og>ĥ 7cK 3Yeeeʨ9J)U*8?%3 D _}~ʪWWnIZ8T! &pA:fC2sI5o8opH2TXK |dz{/6#Z(;{[WN M<:#@ccc^^^~~>ϕa:yjj3^|ſ/DAV!V/T*VReόrx9syG}3Lr@kZ#ANt ԁr3=h}wZ%?NepExMSrnހ4L8}?[1YV>ܰaLlEv^23't#qt LgB 8ER_7l54+,fC%`E !R?q(R=z˖Pj HvSҍt|S[;;5Dh۷Un-I< #JDBNU|k?-[Lb{Q[[ju탃###%&`ȑwqG@@_u;sSӅ-_|z^Ihhh׮]_|!C0A7===33s .,++#|C ٸq˿K {Gy睋/?~'铑Uqq޽{YZ6:::9999960?~qP27fxݺu=XnCYYYHHH.]jjj{>}"-[ߦM?#00fŊfI{gΜyjuIIɫ:vX~2{߾}KǏB6mڤ鲲C&%% <8 @(ƍ۽{wppp``s=;O>ٽ{wttŋ駈}qqqQQQ;v0 O>dIIIxxC=4pE! &)55ٳg_TTuVJŬ(obaʕ+YƂѣG˦>SNVuڵ.\HJJzgT*ʕ+O޵kלO>$..ʕ+f߿RRѽ{ & >O?zرӦM3LIII'UYO,˦Mw~yV k]g;Z~W3C-$KCUz>߲ôʿJXg]^~ S}Ӥjݸql$b̝;;FGGWTT}Ǐ?s٭[ &92??۶m111111 ,`s)RB"!@ʠ*;Kr?Y1"5\ݪ]~QЩ+stkͩYkRsj=T/$x`Iξ'*͊"*qC5i.=3駟jժW^СqEEE6lիWyyyyy[oeZwq…^zo߾:ru:VVk3f̙b[h4kjj~]wiZؽ{wzzU"GB>`K4Bluo(ybMO][ _}Gt!J-Ϯ-(9:2&{:r{ Ft'h_{&(: 20Z_f}zr@iHTl 3nJ8#mS-gNB9귇Ѫ 0pD5sNGmŷ%hޮ΅Z:P 3ԟGZ6{M(G_ֈg*{-3nNRcv?եfj UkJBRdH%] ◯0Zc0oEuw%9MHh";4u(UX:i,, ̛7Ou֒+VtAVϟ t~rݾn:I^}UA.]4sL([o5jСwƇ~r$UWW7nҤI&i/**|7ڴigϞO>DE1nhhg駟 .J6 ~bdu$C`Vh0&ѿ)c9*iZ{I\0Cw6Yw{9sfoǏ8. _&رK.#Gg}vÆ 9s3&77jݺuKKK۾}{\\\ii9sS]]KTUU5v;3}zzʕ+&dO}x^_\\:4rHVO05k֏??K߿?jG}L.ZhϞ=taϞ=jMөS{n֭={|7G˗W^8ps\#!dΝ**(([oݻw/cǎꫯΟ?/ptңGu]ǎKLL\vmuu)SxǍe˖.]M l6 "sCܺuNc<dPZ 4ۣGIAAl~"""VFxbBB33c-[֬YӺukf$iȐ!}Yx?O 7|ܹh\tiӪ^{-44tLfEQV}$'w[~#g ( Ugf9 ;޻+ n4qUpE_=fp΃[i5~;8$:ç t%xw 6f̘3gl޼m5j(gΜ9y һw%Kꫲc֬Ys533`3k" ]%}%  8[5Vḧ1 Bڎ_{=l3ƾ4/V0"@_ @DfuD ,0U]]y7n۶̙3{/iiijz̙AAA(t:JҥKz=z0Sҕ+W8n:BҥK ,/o)RSS'OʼWb.I54;њ9䣝1zX/uM@ "hCI6-|KMv޶_.t04TtBb+t-vjЭRiǾR`nҬj=N`i${]AAA홺̙3Z'|ճgϾLbxO?4&&fĉft7|}zBB‘#G͛y222rPP޽{FoO̘1;v+" J-q  e\)"$VӺO@O?WS ' RtMX~.WfAijgfddjzzk~~>[nnnv혵ѣc=&I(?Nx뭷***z{8?%Ir󨗡aȐ!ڵ۷o_]]]|||^^;4MqqFtH5&CQQyc2Bw BFDD0 Sc(2lFy&<r ϋ/h4YYY:u;wvmĉr>ݻ˫9)X@sd$fK.-Y8E;w.77d̘1LLLLߕ$)77zfmVYN:B!~@<άg ho `6wLl;dTǟX? #Ui:ր+͗3D,pwFaZD&M*8.''Y}1܌"{jl#F@IIIΝe |cGQcr+ΧG>:5T4՛;xjS/|H^U)o$#)p(jsџȇHA**NճZP-u^uW=a}oJ|ԀwRP!ڌs X4bgN5Q<c4!3#wwt?j0 0)PTXY^b:L "C~2Ik5}⾠ꣂ,rﺏw7 IZɪà3i??LsN٭յQANw ~}[>=kI<`1.*'s$M:^z9C('OLMMX,O<h4?gϞ#Fϟ??aeU111fb2#6mTWW/bƌjÔ3g$%%63ѱ>>>Q Vrϔ$i߾}ׯg (Tnݺefe^V"/'U f˩1T*_ݭ[o3z,$[n^xgϞl1byϞ=3f BDN<ȶt=eƐ-[h49xի;wf/--e3{.UロtO%?+`q7hР˗?3SNh^,Ba1S%00i2|A ̩cǎ>}: @ӧOV=B:w{NjժUVuؑ\!qegg>}bpPZZSZZzG}f?@>9V'`Q`sέZStܹة IҨQz쉈fׯ߉'fϞw+00p߾}ǎ۱c7o0k֬ 63556<<Æ cLORRҝwI)=yڵkZV0aBlllCCŋM&G젊|vڕ("ں:&8p`РAݔ&)y2_t[n3g"he0"VTT1vҺwL)tɓYLiX N8vȩ=tۉ$T'@ 9M,,jէ$-qX6Su֊"{]UtBUrrxN!!"i%ڊsyl>E IƬWFAP8qFM`Vo qODЫGPbnYχ5E8"I#ymbu7_M"`.*@6  <̜U^\S0jAJ '$-]m$(irBh߶OƬFOmدYnj' 0D<)RWʫё;I#]ۈ!;;;ׯ_߿KT'|_~жm 6}Waʔ)(IRLL5|;m۶-((7LC $)??ԨQ 7qDIΝ;tRe7y9~noNNΓO>䜒ZtYYY=z$.07A(DvfZA%Nb)8 5Ѥ ۰aCFFYxqcccQQQ^v;pKOOgJ.^8ydfΞ8q"'C`vve/^8bĈD&q=כ݀jZrf-))a˗/iF^W^뮻yJiݺ59eհrn]e8PNzWǎ{ܹ^z1O8QZZrС￟f`JBóW^zK/mݺȑ#ҸE;v쭷RTgްaÚ5k";P?={d˖-:g f'?ǁgX~aأ撗ںukVܹsCED2l0JjX,:1$$o߾:t/:t\N4Igffl'Ovڵ{<ϯ[nС,$˃?3d[t:]]]]V8лwo4%cڬVkddٳg~'fd5:uQJәiRPPl6]5>B۵kdݞBgcbb<(3Ҥ CqqVe-466BDQx_[㩭Rڐj )h RفAՏ'ǻdvt>rĉWߔ!h󡡡,]vGl}&fWWWm֭fj$3lCٽ{wf...ܹ3p޽ ,nvd`|E_ xVCG"PRʂu2Bc# UZsrt*~X5}Go}b>Q/޲pa-n p?KϿr„w(J- &45C7Oێlwa9+ccvL.,鱓Vly!W^ׄE[`pPMkRq8 'Y ) zqu]ta檶A,XF88Re11仈hS h 0KPH5ڐrSYT`g_:/AƒGaC8qa:oM̎}ge =?>C=ԵkW2qħ~:99gn7o߿VܼyW_}$޸ɓ'7[n7o^LL̩S L`]СCիW۷_dOUUUmS׿L4}7y3gΰcwuy;,Ӈ*900uWnժ``'ܹs۶me#"&$$|,LVƎaÆcǎIdQ믷md2b|o" "aJuX v@őIN, F Bn~T߻-Zk<#w誫7_2Sϗ.;(e+[UV1Dfr]~= Ō-۶mtK. ܹ_~hXb99fYm6^P)TN?m{K.՗Զ:2 a׫}mڵDyob_?Сgrr~~~׮]Y6Voa2kkk۷|rD;7ohwj?/VVV+ ̜8qfgKk׮DƬ798pVRҥaG̙An81P2qzL^@['f.^a\)˗cKD-[FE]\Q36rT*U[ Uyם<"DvUd?AWojmhHI]AI gt}[O=y31go] "$M@C'?}]xiM~Y55hz|DBEQj=.+蝠nr<3"993O?C(y'^nݻ7[GWfaѵkW^wnGGG3lJń  4ol.((زe l׮ݫ<YEĻ{F_|1##CN}2AUV]ty۴idh4#?~|۶m[jf͚F&rW_}%k-[H%&+P`yvŢUrJŋ١qkm۶/Jҥ? :uںuŋzns,//#/~}-_taG*~AZZY77=?RnϭV/"4T2cKTVVƘVCmmmEE3YefYJNvbvz}`L,5!wXURޒ <գ*Ր2qDVRj2sAUhX***On 10Ln2UƎ2X?Y rymm-CjEQ3"ʳN"%h#VhF QDTB/_fD("mQ 5XXXjh1??sҡ``PBL9EnjAerܱ6uM450DS(h]ښR[T/B%D*5:aZA%ɥ!' u'S YF6M^xޓm6 [e8 lLcn蘞RMD" hC4i,.*l (("X-R$l@hšw^g`+*Iۗe4*+ED4Uh7P6F4Q3Y)ZZ_S^&cjDPr[X&jmVAJ""#"ڤ2V_(2@ZVP֚ҊBDH-hDRf9pKJQ(\YZu(Q6 %)n#*J$*'T9FYYۚbOmhR(e-^z-*74ϯlk1AV\fSv1DO155uĉz\JXpd׳K~iKZ'ՒDy^^ʦCZM͡5Đ)fD!Wy rq#>hܹ<< cJd6>ٷ@N:#-u5BIr&y~[n%55e-VBi'Q>kvC\;ȮSpJ'k;-a@8dMc ljnׯ-붬&(}dpq{JץKΝ;'_TM>-Gdܲ:$Dn}OetB)}gZ X7ρ0`3>N ^Ylzeo!F544pp\Vζp?̬=+M_) 7L+BZ*18{lQQQ~tҒ+w3Z|%ejABj&7'}sJD//1 ᜸[8g %+M(,?6yz VkXQNK^9NKy((8.q@Prh,ϒX[[[VVRbbbXk*2f깔:B`VDthU1( Tv `6_*8ٹD`B0D Aā#v]>WLf=a6)Os ]*Q"@G!&iǵe D-"`S1 HEΩYKL'wHi% rS)0(#*grL.v~݇TRJo< kԡ QN_w+ǝs*`Y(C: 2$xJnoɭ_ٛE64O[,&o_Sm1;gг=-۷L5 .23۱2?~)(-z]`l:_@n\Yq+O}y* Du]DK8W&*29,x!LDTni.C5P92kqdKюTC$q@"Pg$+""PRpoDV'ᝤ/pe p.J8^ pVxP <I@(mrk(A rh2u]9-x>/^u 4nEitgp8^B\un":{M@1 Fs|YOcGO #%brrm:ݔ9&xe'x(dcVy4* 7>W8pl$B\ {S7`'%t q cVˀ99 Γ#k&#KOd;'D@@Iƙ8C5#r][#;>sT3A::y[=Q4@p]5+.9uyJ>s͟>!WʒU!B!:Brd:ux]7{i>J\5@YflԳT\?=+oCʇj$^j ef?NuA-䢮Yuc;ћ?yK܏Vs9S|\|*0{ HnܤSCs  Hؔy9:]x`re1T|'Q-Q\)9˭㫜wU 5#c:\o)<@F%h[|hU3aL\[$ /NV.~hZ:dq$;GJ:P$MRP0hUXsp+css2Eގ*>pf{߯ef?@l,[ok%>G{ݍQޣ%f9lYՒHӷȄٳFI3?*_vfaeo]חmCST z6*Vi$!_ QJdHnq*0&˳ea2CBK|d$RѳYRq<&A9r IuSAܨOtk*.zP-,Ora:>'DVi9>c7Zdg-|xU(ꧏyBKdſ*r.ђ'GsyAyENKy-] ):cjqGG7bK\\97{*rƯ΋\7Rpv LM9:'Eq Y].d+S47o>iɖҜK +l_qs5\Q7D@8;uzoЛz!_-92'̿7yn-vk7@j< r`/m_f7M˲|{\v$1-;uISn,w}{9>R]xc qf*4nr;K8"Wڂ~X5u+!"Drx!!AJ)p!C@ F|.P :i>5Ue]%$"a#qRٓ!`ݘH6(FQ ьKt#({@3ItE%b ;eڴ"%@FKP5 -KJ9R "PS@r RTW5O`^dnfYNV[}KZW}w.uܬM _E@{dohXf`Q^Tn7WymMg-KK0[mD[ʈ33'e\9^7]7q{rlq3~['7 )chf 7$u ,Ӝ)̴;e9En^^XrG.mNx&4O[bU6LPE@@ )|CJq 8l9y+9jd|XsxemȂt!  @(O]suD@$e۲W۰l~nOS^e24R>gp|%d@i $#&:@(HINGN;3SS@G :+" E +¨bA(6fL 7*r_.f m+.WdVD3QR@eSLNњA೅j7o<ᶅ,$InguUQ|J hnSK~y6O7y*1zef?~Y,!D$>y|ӜC9v  ,ƾzmJ5͡- |3IsID8O4啸n-7HsvmWS;]G88yU?8P_õW9FqM4HMMk6ͻv矕<_ww<駟;wd2)v4^juȑ۷7w7f}gsΝ;w._5p}旙?Tc%ź=gؙPeW nJ$"|z<7wMPUUUG)((ؘ/R$V<2nYb),,, :MdSqFz>m|s\lNIIQR5/ާ۳9 # q@8xʢTDMZ,5`$)$ *q(+h;[h4c.5we'kgm̔v&3NoD*re)/O3y#GzW (Ar7(جFـQrJbTQ tx"Bd J P:ƩʣD( ƆZ@䁪h+(P0W uP P"=]?r$)--_p'&EO;ٌ_y6@rrnG_. ;0" RBk;A8(&QRSSKKK 人:h b^^Ç ÿò*OAyyyyyyh4ƍ7n;= lۃ<|keYYYʞ`&%%nܸqƍǎk1B~pOC9{ @1L˖-[- +lەO֕kA{YVp1ebi8f̘qƍ;VYE@Lfɬ[l5L(PXXC8H=~7zk=CXg&(q& Ю]{έ,I(IjmhhWٵmΞן91?q!pT_IKRR!kjtl ,}-99ڵH3Bȑb4#@((R30c_[?i;Dph()Λ/3 Ge'VMC*G?>y4;38"Y'lKkp 2#x ܧz~)쉇ψ$E)>׮=}c9rnB͙1kO?D7"S5|e>ǟWJW.GHւۭ~ɺQ>;5lF ")BıcNJؽ{wbXjkkHjdVZjZZ̙3y?ޛc={fHJ 7 l#F;d_nmf ve˖1`0޽y| \ry^pm۶aÆmܸqٲev=c7oxcfϞ-޻wﴴ4߲۷hټco9f~ÍRAn2׮]cu]YRVVPSSe˖^z"-[ߺuս+&I$l{OVXbܸq AAA 466/**==}ٲe**//رc<'''oܸQeggC IJJ2d31sf0aw}s=ƍ۾}w}?FDDݻw֭yyyQQQ}`3gNiiiXX̙3hѢ0f6SSSyϜ9>HR16L(rj*݂QFT*?SNW^lk׮pBRRҳ>UO޵k܏?CEEEf߿3g<ٵkqÇm6[UUՄ ~Œ݉\ͤoD3!qj]8(?i}}AdU" иbn[V 7lm|"paK(Ԃ뇽Bhab5pCߴ..!hݦ]6A"Y7Bâ IaWy{(%pk;xk 5~Wү&= vb")]-_1 Ykv%5D6xAK-5Tj#5%sҚeIvv?//?$ hٲeZv)))Z*((ؼys@@o]QQaZ׮]kVZe ~a%]v̘1C AĽ{GyO>VWW7nҤIFq/**\fMvv}…;vpBN CMMMǎ '\rEGFF&&&:bYpٳ !2.Pq\|FǍO?srr~GZtt6mRLj-Zgfev={v=dffv߾}{.]x JN|իmwIIIW\yGѸsNV\YYپ}qڵ+99y޽}:LiZI.]O2;!"^r_}75Ͳeˆj^lٺuz Ҡ;cҤI5C1NB0 {@hjc K6F ^*4dpx-O[CVI/[B{ l7o"Ft{?6L~g'83d liv#.&t1-AZ+GR™3x(&L%N' 8uɿ6t! aszRCyM|@("990T\_DŔㅄ7VBC% H<  _\岼ޏL+999Ǐ_r$I,%ݠS}h3MY*Fr ݕB37o믷oߞ9ٳg׬YVϟ۷o߼I&BڵklW\Zzb$IYYY{Yn]PPnAŵk>So=æСCsq&d2 :4""b߾},,.RFS\\*ܹsݻ7ZրJպy;vl۷3VpرcyOIIY~=@=ZWWWWWשS'eSRϗ0W}S;w߿Ϟ=e"772ί\2cƌ֭[@@@$%%K**;;cǎ&ڵ[nwqܟ 6D}>p PXSbZKԀ4ΩyW]hU!]{HMs&NvQzg8#;)pw)S̢4 _~(IR=ظV+W- 3s'$${i4;)-5UHD DHv!5 x V{EWD%ԝ<HD"PӅ4$$GpP#m޺}gц1?G0ZܹV#:<@!ȃ Y!z`Vwjs#(pD'HyqwB }AH@`?|Clp1S*^'AV! Aok㆗fI[=1=suump[[k;G<1n&g%5uQ@Sɿx@@=2gG@eeeZ3F3Ǐpd}'@TUU}g{6l_~eyȈwкu몪*W_͘1CV>|Rz٤$B._>ӧO7LgϞ۷oPPP.]wwB.\ХK>00pժU+Wk۶-E^^^N䍚ɓ'~aFPVV]^^~ԩ{^`?kHVٳ{B-99^8nʔ) W^%ȑ#[lill5kֆ zZWWצM!CNrk[8qbǎFc~~}80QQQUUU|۷o_RR"I҃>*;;w\[[[[[BdaÆ1pRRR>}*n^d-]t֬Y,=2uvvԩSY1D2eJ^W^~z0@NNSզ>rADɉg%ys/+ !vxQ#hqqqR6_<۬6N++pxmh *&¢M PAz}5$;{%p?r6 <ìFU$ih4٣Gf󙙙?<5//^,(.]ԭ[76M**++$xnUUUXX$<\.N&0_ȑn}vOMY Jh׫R-[$8F#TUhWtF%*9u IA8@@Byya@j5f~[بNÉ/+jX>g[$` Bvp!aǟk;.V %(J!'M8)<"vm;?h[I;q(+:ƗF5Bu:3,@cccEEs$ѣ3g$^9b\|YlȐ!ybȏJHH`80ݻ7..Nf}֬Yӽ{iӦApa@, H#`Q'G8DE8f87 8~JPZ`TGa}a#<2x@+!bA6㸆}ZC-ZHŔΝ;JKK8;6nܸ˗//"c@srr>7wiHgnZjȼ|׈@VW6ڵ 2lqZme;J'*>u#UT,BCC;tV ڴi@)?~<{yֶkOLLL~HOO֭c3\/rJ||4t8QuPj[ChP5/M"H@Pa 2к)?|엀Ls. *K6뗟|@cPTpib#),<^gF_k۩ '46ttrsx:h5y#p`ٵv}opj  r+5_5֘p/.L UhycET`gi^wxIڍ[zu"~833sԩ}͛Y]v͙3iOথDtڻ)jmW8qދtŊ vEEDDDEłů P&vmf#(,#l&d~7|+ؿa.q}󒒒ݻn9QTXqܸqbXm6(M4yWDU-[6mHxv+R

8qn;vlJ /\R.]L4)--G%~>4iR8Da 'SG=%/P*g΍CR d:6n|}6HwezKjK8H˺ nڼK;Vv[rn/ szQV-Ji:uMf*U$ Fcر)))7m$kժ%gK,ٽ{ɩFV$!Lp` ,gه<~/~Y˹:VɧEΖ3BjR(fLplxWOsέ^:!z{ål"Tnnw}OBkl6?޵kɓ'].njSr;v 4HǏWX4ԟ?~F"sE},fѵ ((A Nj~n fӥᣏpN֛>Vˊ*]k 7mЪˆV憗 Jpn;'̊3ZȁxhֹSZM{p@["tq& JK:}PS9yōG*Ad\;XVU[dm.ߜIHEPO[y pTҀ 3>Fm]1ѶmӧWR#:m40GfE9vĉԩzZvs83fLN x<8{li_z'|w I&mܸQJ*=zBMٱcW_-f` 7n;xšɴ2qr0^w}wΝ\W,_|[3* 6m:LL fd^z"%IDaEO"Tff}%9rЬ|'NTc쮻ZdY?~\04M|??r,XˈՊ~ţ%\bzf +]z^SDJ\Ox*=uTAAIǏ 5XG0hNN H)&3q#rθ#cQۧG}:G`dax`oI:"+A::))q_}H@y&]TT E֙H y4.pD.DDQCDt~ƊwȽY^oh"o4q~i"!rX17+-\wa<yyy͗œxGb8SSC @ukBqO:G4D/bxWK` i#HXŜ?rez }x'"banqIԽb!2,"@@qy'y1?4<#L'1,*̏Ŭ<'5D40cQOIn7̓h@9:uD,FD3E''Mana&f斠EC 3/( 1?-1gz{>>-%؉'"&.flg: *qZ_g,f_"va^N R߸ac~/T4O4_I%b3v!-:+~egg[kO˸暫JDWcFA">Od4@u8Ν"bIIvbvm>,[lذaѫйͰ.~_DJO)oeW,_ˊ_~Yˊ+Vb/+ !{x o l޼YhU;Xe!LXQow6OACPT`~.pe3%K6hP^= Afۛu 1f #ѪSںu믿ZN 6ٳgϞ!3&<ZiԚ&q Į%1@+ h`7Gp'd`T#AT@(@ʉAXrPs&sDC#8 s@Pj >b@e?e # `* UF9#)`c "("ՁRB@ J 6 Ç4ߚp*e 6xut@uD  %9S˅_|̈́PBIiXK_h΢R83ZwEJeW Q:!Z qxFׯ__hu,iyaл8ªd̽5m5_Ϙ{Ub0R")UUS8o޼nIGTȑ#ѣ֭+."<@pޚzls7R 1h>c HVͳi#`QQ!!tƍȑ@0JYBB1ZzXˈ ~s*1 զMMF4zi[ QDvb=Ieϊ8+(`o{V4Ed)^snjlm}Ib%KߣF)D"n;GM5wA^lM'@Y~|Py}{bhIIT~0QMTNaٝ ĴmSVbiro ;3#.ZZcnZY8xSw1_R^" tAUy^4 4G*H`5 #B=q'48bϰ6iDp1`5#b(YĐCY/t$nĻSB,Xs8fe@c6эKrsQ=.%Y&}z++3̧ExFe}gcV-EHxƜstv[~Nyywro9[yF<&!!qkyJL{9|iu)S'ҹQJV qF$PF>-6A)vX$]& D̞ Q: $CЗs1V = V֎ j#DX?ߢ:Sy]ߩ6ǂ캣`v04utƲr[6d}8E}ѐUnZ< +50;:pF!m'N_q ͧ֩R~/cgX!!$!R`9v;t'X>`цV6cW9dGjS(9 Aj(-S zB!ztH0hRǶ0\],|XB Er3s).c\J3bY`F\-ِ|P.vOc-i3Db{},+54G[՚}!?JGrĢ *Q4 "[Q#ϑ&PiPt*gfPhFP'ř^"NKbXbC7,pY,CĶa 7,b!(Oh"uBBGX؜Y#62ٞ(e4@^%96&Nr,UœڱJ5HYBB⼆_[Nn$2pT HI%VP`1q,@m6Xy-b4(+k-jbPI,M{S`=xT cMHOl!}"E6Lұ6 $<;ʸ[3zn;W8c%4 $lt@Zso*'E "WG/yH s-T?]FZ) yo,G*zWF:mf ?K,^{@c{#J9/cs6D\mjr} :R@.~2BPRQbdL9caKSZ&&뺊@;ABʀ9aC(*h&S= 4xη<7[@Z||^@ CИQ(UGd F` e.G(~|>_ -Qc O?s]QCm5G<\KQZ2Ƭ[CnĢFBG9XX$xl9)Wj`6Ĺ~a x a6ҺǠUl//Nj ̋?oYofmݑg PJUU%XwމT_޻=?h9S0Y`Ub#7 #o{sXxQl[|Yxg)J!zo++cln^r8`eTv+TD \سSYف!F&Z xaN[>.DE ȃ֫a1?bdڵ_g3t)t~xf3>v$/,^O㠹1X~su{-))Ig5mҷ !8Ze~{C Js`r.f'&ga9^XA93j\s5qBG~@8 XCc$̑l` Zb"_-.e |y'/rYA+"Dh hpS#rnmiyN9-[,ZhӦM1ϲyiBPVN,ZjUS6*.F/u֙}A0\Ԅih2q`4xWO j&޵r5bNi/SiAp]DDD06nܸiӦcǎaaرc}.'q߾}Kqqq6GhEd'O8qַۛo߾}B1.Ś%&&FoeիmKK`͚5vzW^y+Vڵbc^HHHH8K#v/]n ]DįRJ۾}{x<ǏoժiaPB#Rj2^!=gDk}>_D/|>_ 0^}\pAϞ={ٻwoQf c0ϤnU]_0 Vx8x_aÆuVTL}ҤI=Ј#>jԨ;s`}c #4*B-.2ƶl?D p$/04=19?1f1y-Yym~( 1:Gbe)LLղ_#bt]G/]TU՘%c[nRJUN µg{x`U7?U$r>[M=]S0'k-'soh}ExYg=qĶm۬&ܜs]1ISyq$Z7"ZLP>5f=@wnb1cy$ҬFb0j-m E`ۗe`TyknfyY۷s[T@>LjHO?.sՇ.r"!@.P߆_^l^^xW_}uO<ի;v옮~oi#7ZrUCwޏT%:}9GαI&b+  yf 3Ulٲ3g+h 躾vښ5k۷oΝ7']KJJ(b񛗓u1nJ/CZ;>xO4i:tkg̘o7mԔ`_sss4A4M۰az=^zHAai8ټe3q1xh&07UIth5Dd}䗸}a"(ٹn b~QB}6[liZy<H۶m[)v@Z H.uz@7:q/ms&~r6lجEя[ }myblMk{]x<"TjժVAX',5m4cD$K| 4oo]?;/ k֤\T)'>7?\\l۩0f_R \g 9 :C^D0J@~A6̚,  `xOԛ=@?|1Ayo|kJgFDdR],Ysֻ5iy?Vߵ-qI`"-B"pAG<Sajſ.Gΐd`5/Jt% A8R`nHUZݏ,_Ux*g"a'Xm{ݏ?fl6M-S?x[?E;W9Ҕv4C6."߼ys_̊<ONNUəudʦM +̛7oY DQk'Фd:{5E6*bs+5kTm6"6owq:?oi>{<}u0 Y  WѳԎ CN eoaa5tRRx,bꐋ\(,,4pA++=k@@DθY{=x!$!!yyyy5jPE3իWOJJ^zDdͻw>`U.}_2Ç׫WOt:)))&L֭X+VؤI|sοlٲe۶m=ܘ1c?Nq\z.]OO|'zM7͜9sϞ=+W[:[neV+ȑoN_^Pfǎa2Y!{<#GL:uM6pǓ6lkn:%%gϞx*ۿJHH}'|O_zkf233D߾}5M꫓t]/..^h([n;vlrrfۻwʕ+)k֬1cܱcǜ9s:wvN:\.aoIII wߵ^ۧOy-X ==}|MjjE̙SN]vըQ/**1bDoydL@>oƍsYfɒ%~7TUZ_~䂞yQ7ˬ{߾}sέWޑ#G|>ߋ/e˖k׎9RUgykiܸΝ;yڵk:t[om߾5k~駭[6klӦM֭[։w}W>}\yՕϪa3cƌf͚ 2D(0$"G~uu~s]ɗlncmq_g75omU#5iצ}Y{b EUM'3bME$/y͚5~Zjҥ۶mkҤߣG{[GIOO=z8lذ_}vHD!+gmo||;19 msB]isMwPHRF>U]6P !;oۚV?g9cnA @K9őa;w|w;OfddPJ>fY>lE**q<{w6PQ;a8v9j(oq1uȑ &l?|3g|饗~ԩS xꩧ4Mۿ_o=‹={raoo9y1ݷoK.]㏷oçNzҾm۶y睭Z?ï(?~hذa={y !#Fݻ]N<9j(ϛ7/##رcwyg֭O:;0N:շoK/TQW_}yfq_-Wg׭[ȑ#pCuu1mڴifEQv9?~x5Ě`&38Nvg7nlժU9p>\JѶB"РAJiŊwСǮ[xnŋ_}?a9ce؝Gy/Uh /v; 2dǎ 4{x-ZLĶֻ2!D[lbDgΜٵk^zZj֬Yu0իW^_~;wnݺرc'NhNZjM_8}zbbܹs׬Y#=6ml_}bbaN0u]bp[ߝ*4v ý)Iw:e=!qvjچ>1ɁQΫfkԭ*d}eA;k5S '8eP@!{瞳#Њh (<3Ԋ>>dG=sS9lb A ]oOo̻co& pjϏPsx u^V@~MNߓQؑœ]zuO=4>qg:j6(icQp|icoOg cQCǘvV` *lym޼nݺG]fɓm65 as dj=4U$@y L5̙3yիWoݺ^lFڵkW6mӿDܵkWjo~ݼyÇ ۷WSNMHH4/}ݍ7ʚ2e_ͭY&c, @IQIQQQΝҪ-Z87'^ݺwj԰!#GtI,DG^z7{С;BbrHJ^&&&**F4pBm6pP 7ps̩]_Jx<Ĺ`;N'7?8p`aa>vg}O>={l۶ԩSvM >oݺuΚյk׮];O<䥗^:x(((xW9p8o^F/SNM44M~ٳ?3/,uy-Zv]4^FSN|Yf[m۶4iشiS>}TUݰaôiE)((hҤ`r󊋋5j"GTO|033sԩ† 牭[طm6:4oܬRqCV\"R֭{vׯ/,q͛7M[6iDIq5`Wڰ~}^^^ժU )#lt]w:dZ3G#m^g|}Ǖ'zu5̣ojաW8;컬_5 'ZG۷oر1UU;t@q֭۵kWVVVfff߾}aH(Mzrw믿|>A [̾QH "?<%P.,`E+vE5RN0{sDh`(KN/ꪫ!f9ag{K.bŊ;vQ`f|>/ΠBFТE Qz_ݻwL;C?g1#|Y/'u[4H' w+6hj(n\[$@9l?QB4~ӑr]W9IL/tRBJڪ]XQ/0T7#J@ T^_ܭkoϵO{eU^)ܺ=U b$֯on]A~JS%9.p"paRي8 ?!KHnQA(m\P 8+v#dL(^1S~3/YfS34_vN VArwlpoS)h"g..'PL(qgeرC7oxnv8|[hѭ[7_|۷zb *Ur>|ݰa6brի׭]kOw~ CzꙫX-LΝ;M'آE^z%DTUr5lP,M6ݺuk Cԛfa3[@%6PV:FLHdAUՏ?Yf]tx~nfp .))ͭ]6|Ϟ=Dݺu DͶpaÆ]p81zk.P-qÇ7j05%$/7UV@hff=رc59rHVu0Ǝ=zWY(1Xv VxJiǎ{G/@Jh$&& /-sgab֭[wW_}[fM֭+Tиqŋ_q۷7ht.\tN4iҤIu5ݻw׭W9;wZju_r9Y5k8yb7|_2!yf ~I4;bĈ-ZGs[nĉUUczLBm&Z+_z͚5۸q??utΝ;gbÆ zI䢢"Mӄ={ի':8cƌ/]tӦMcǎe˖ƍ6Pٽ{wu%&&޽{ovdPTXWV-ݧ }8;`/!BN۟=`Agƾ=FU8P[9WZ``ncG #k2e5n`'~9qp˖-;vgm۶լYlٲÇ'%%=-Zd1yf`߿>{衇WW_#B)uAgK$@?*"!APs~s}_j@;|Uvդ8#otidpA7{#:A)u8;vѣf4m۶m>8ڵ롇%UUٿfSeǎ(77~b2deeVXQ7nؼys߿60ֈPVbn.]x޻٩u+6oT :١#ɭ[ UKEb'dg78f_ڤAbjP  ;#cV 4 4m}U]T{Y+k\߯l#?Q(CqN mKhոA#c2:y@)z˂alٛ֠V3yw^y@pi % C-:] ۏ9޸gO&EJ?o^Йs8^yT9zM8{'J 'WIVkafr;{t 77'?#p ()_1رcSQɓ'_pƍ~m۶iӦm޼O>),,K0tuݺu3mwJZ*۷w㹠L{ѳgF#?cٳGXB>ڵk׈#iq͛75pִ8[4M bJL) 5k mQiC d&^ 4_"^z>j9t:W}ĉatnATسgOϷo߾`0++cǎBl膪iii5b`@u5N87šv>,"/>9rN:ά`U({]zŋ?>tٳgΜ9ӧORPh qJW΄4%]K)}vjh8SXtŚ5kƉP3k֬Xpf6faRj\r*L'OZ 5k&f#%x<˵k.!$*))9zhEm_={}G!@<jg\[=pxb:PʓsV&h't=3h@Td2:?̙VvXBQxTZ K#5PŘhvǵ^$L;g>A~t´=F,΅SɫOosXB4vm;u'NW զ}R)iڂ D{٥KA;ClܢBǓ㏋KiӦ3f,w-NUU=v^.( -hРANNUW].B|u늊E(/U3TR%77W=UVn|&Mx㍄J*{gWZM !0w6qĴ4ݳgOl}G},L@CvV3z7L'nA @iѼl*O9fةzU{!Vݚ=ݹfu|;w\tk(Jx)v}O?tjjU"֫W綾^JOOOLLTРB6m'%%M0!))N:~͛sxzz8"W >N<J~ݸ{ {etjqд75Q'lnx[>5B'db)a{թSBPBbu}KJJRe̘14ibqʔ)ݻ￟0ai_~̙3ׯ9oӦsI5nܸVZ;wn+Wfׯ_M8ތn] 1Zr#@4JIdwVށ>T'80⃚-m?>5v5Z7μ|"=/۳u龍Gl6\?o^H5;؅)|9:$_ oaiZ~l6Cɉ Q=Cznݺzj6G#uu*V3aUk˻@<[gMl􂵛kOOAGp.uu'+[t pLշ~6'(/9躤;7 4ieN]ysv2zH5x\۾9GT-d]~s춰ڼe˂ F RM3J( hvMVj{NQUU_z%Yf=zgmРnԨQ=8vjժ999<\p5׈ճf 9DPJ8¥M:uƍa5O={ 0@4OD3~jժ裏nEđ#G:o߾UTIJJz۪0u}Æ }ٸqNs -?ȑ#T~*t];V0feURVZƍclR6n^ڻwoZZZV`ĉIII(vaÆ=S5k4m„ 6/:u 4MKMM}ᇅi4hXtͯvQVVV5EQmjRR{wV=-''CnUӛ5k6p@q%##cٲegѣGVI`ƌ=6W33֜9sƎhѢ:u|7֭{7Cݻ駟&|g#G|xUWe"aL])1~[Am!1 B,gqk^p:.#ucX5{̴XMb,_\̛޽zCs0d%$$$Uؼys6mIUQ&Xb`"ygee9΄@Iܜ\XZZ@8!p+VXĬDY裏{РAG߿?##Chm6*nWF'&&)~y^Gj^y}jSmA1:"_aܸq?-QQUUL)]RRR\\l]D P ̓Sg%ʘ:0M Mp\.an^^@M Au* aQHL Yx$sy`@UNbC꼂ɀL0 "d 䎻٣7$bv_p^r\.1Č1*Wl]}i)g&#">~)2(TEGE oPđ/!4P܊(5aQ`F~3Eppcj۶l3f #xfs @ '`G6L4i̘1iiia&;q.,,4}=n@a-HwC() *@|^uh@9ZEةWnK;*V  ͓`'60k/%Ԯ:=a^enj@UD6prrDL5VA4*u +()iVKnTwQBbAR rXF58<ANC;׬\G`<(T%pש{y*YIrUH(CX# dF QmE%tOQQ/qْ0PMVB'}gؽwݻw g>rcEEE*UHZp8N8&TUu݉b7yC@3󜜜Sf]|>nxP,b5xa3Bbϼuѣ|@j+ 2KSfffrr)fgg ZY{D6!UX쑈 . 9b;:{{bmj5{!  ^z ۅ0T|nʿԩS,X RЉ},&yͬWMyyfvTaBqFhʈ$%,!!qA[l9W<ZAAQ.-[0ƦO./k'駟>p/xxy0+ϛ7ԓ9_dI&MLstm۶+VTVmΝ={ٳgd֙ ?(1X^{9 b,ow֜ϰrh%%% .>|8HL-^I&$f̉qPü/;UU0a0?hB<3'g8`|V`phL{!'$ybe"NFpRSSEwvFQ+V#ꈦc'ur?o!0 a>snL5i=k iokoM?/ιPM[=ӵMס2[U9.G/A+@)E9BJ4o0G u-+JO!ooyoʬVZ9]yKv2qrCZe&M3W)yf h_˞C93l):6Q gX{h+]bȭ$,!!!!!qqq%$ʁ(e @ XLel TV(1etnHKqFa\X_4*֚?oD<6qCeC1 ьxӵZNt:8)Wopӵ9̽=Gcm R 4>}I=}Z/O% Wxem%$$SCX˨EH3B(ȑs Ts8ù~#ҨʄZh`KaXXBCF}AH8AB%?<q)s"rNQ$Nls$B@$,ƒ ^(<ZAq!j8ABxle;6Xf&D nDN9g@, *fTY,3EBBBD4gkf)"+dLW5X#ETdXnmXDΐ1ij+dg] Nrns.TE0E?GeQ1ޒ&!a. %'0+UHCbRRsrG'jn'$vBP4$ۑs>G؇BM%9Ԓ$Y> FUEvr-'Nz^X{Gº 3 e M_|w\;;ǟ>)nzlEQ(5Ҷ9@Jt!"-A757tO׽~mĽ_s}<~ +ڄ7[}ၜaY!BvRBȽ޿nOWQ Yr0u%dU0sQ8C ~i"!dժUӧOԲˇ󥂵\E~Qֻ̋?-=_}w6l߾}f{;=A"qX3KHH8K΁8+3f&;_~{}5 vm#}l$B/ʗ#0p7]:hjjޛ K[@/7@RX2[66Z^ d!kdߙa@%B9ƍVz„؈G f &`§ƏZ49AKxB ^9G@SiC^)/{oҤ)~1!7jլ +芠PĴ!a r@ x*P'pJ9rdrpF5="#IlDg T5KHHq.x7 Ln6m9/%G p8BrGhMA}'ڶm;eʔjժ1̋7n\II?̿?¯%?dwӦ4jPUn:D9|ԩ/1trww%O|]b*IΜ^p7߬R3EظQ3M |DQecsk7nKPw#G /r_5kM\79/>8jLjZu#;n;n;nۺeW5o)_%n[S?Iuj]۩RNu-;\*~]wgzwcHiլ{k+ke8TXKJL\J'Wvp:߷];e0%pQ{#H=Zw_~8is<%Ź}gYoՐA\ڟXշ?,]^P˨O@>[Tg}bPa]2)@O%/]b3]:O}Un6˅+C!BO.;:]vŕ_.XVsO3)E[nx%׬t%s?xz7o js$:=pjUOfmh;s>珞<4{vX-gIIHHHćE 7o#?W_{㏕)qn){5M <)V-Z}7}gw6o^z ?\2A w6g(w_~ w> Osr:-UGB+%9zL}ծ; 9֫*C+W/~ ||f^رs(o;kÆ 6E_b@/qu\XR2ggn݌ޫf?3auoa.bF)`p )s5*W$ƌ~tu{t ~<7Vͪvj5s櫏Em_^9]A?z3{YvUy@*|]]*Wcؽ寧5ٵjEO܂¢yo+o ~-!11ïPPՕЯmZ>tŗ^z'~XqIqzZ{y={L|晏{7B?7< } toRu?s֭.17;7bK+P{HHH7onڴK^1R6Ͷm۞Եڡc'Cԯ)8UWUWҥȽ1@B:uꄀNVWȅ˕[A9:)P*9'@B@QU0[6gg1~WREIA5)ᢋm@ƒ\Qk/~)) %i5ޚ3v<1)1 Tܴy (\l|=SNqΘX%rq~aJdu]w8.iFđxБ#'N7zݑP.t{_ 99nx4U 鹹Jܹs:Nu`orJ LĊmY%,!!!qZ V_5o޼]XXVEѨ9 JJ4N8S 3YAC[ؾ\s͵}qZ@d*BsBK(6q8g^BjٜD\E P nmv9l\7CfpWUGÎ@ UWPHHp R%%~6+/%WHimڷQ(@Sͯ: 91T(j0LYbbOTEA4@Q+ pB^/ T =R  |kL<ϯ) DG((xuD֭G\&ϑS\X)5Ug̦(J!}Ql9?p`Ι]z r#dzZ4it28&%&2 9[4swԤSjp);3TUJiyEQ~P) AÆϙ N%%k n*l͹ooڴ郏>Yj͸#0pB4B@VoAwZ$dlW62"!P\\lf{"8NDt8'%%\.Ji׮] f٬O9rHj8лwokͧNP0qh@ǟ~ճ[ _~ղ8r|ͪ?/nBJL8N۷o{MKԤq]!hm:[_}mΐa7rW\~yuzs?wsƞ|≴4@Juà @çpCW ;c sBrSO>Y;%{ioխ[n3oĄ;ScǶS|ȱܬ~6n{i)Ǐͯ'8:CRfΑR(Rs5-08W)ή6%Rza9v\6EcܮP fSOs:@3]*u!{hǗ?CBgܡx6 ݴ f0PAi: 082CT 7@,ljfv w>nQjL"Ԯ~Mwm\aW(%NЩb )9X2W~Z)Ebua!Gj@`6n7)9P_ggLhP4i N2Cm!*IHHHHGW_lAY5Ʉɴ&yaNLLt:bbw6n|{cǎ:tpc¨[SE3,H`IxZ3B7n܈E΀B暒(e9(@]w   frFbOtڀ[D]EvUET ! vc;7 ؂"Pɵ^dÛOv$8h@0RVB)E#B)"0fp8lsBnMBDIUU b* }E  4 RbS)U]U$9m`6;<,I@j+*%b4N's ֭i,LUDqj N @48 LGƒaq33jP.HDlCI |u(: (h-( DL t!0#rNH {a1 ? !W\q(x"ږp!ښ6m\s5Պf\ڄ]:81ڣ%+%$$$3(JvFg(OҟmU|Ji#$,!!q-!-VAqUMZ8Z:EA^?P9A VUp aQga1#%x_ n-Ѽ}h`1eLB+m#d qѻq"{LIkXӸ2?,$,!!!Byfgk0Bĕ8lmVe-yf 3 LU} \bjI(_O7۱[>NWIJa9JRkd $鍥C D&O 7-sW.7$[J+"cGy`f("r$U֑(rl~= tǠ=f*xSa):ȗeͧu;q˙/f eN>,sa0,JkJBBC XKUPKGP{c;ld$$$$$$$N0/$,!!q։QǏɡnA4c$J&|ϷJHHHHHHD 1^<ú=~cz:] @M~R 3)N! "**IM]aߥY? y<3-@JιRZmY(V%$JYBB|H!ZPr1s4#tSOBBHjlfF!?½zU0t(zl'!!qDV>DA7@gp;[m5F{C)WM ^"-,l_آVc@ H S0xf A[$֥ò2a9%$$$$$$$;L <DKFPPf!7KHHHHHHH1GT  !aH* r PP "^ ,{HixTՖ8_Ab_ hf PE@DW0%$$/٧"~IYBBBBBBB?+d,>2U8aFBBBBBBBB DDR~'@a` ڵC@붿O#P$mw*#bfNIIIZLBB|d%$$$$$$$ 0ʄҨQ$Yx2 =yН㓐8O@HK n9BINN paMVY%$$GĒ;J CBazy:QE;KHHwANHHHHHHHHHw Y}~ɧЁ0*Jࢄ5!\%$$$$$$$$=؂Iv e>u5C5Mqex0 =+@\$$$$$$$$G;9pO>Q)cRq@YNAoi(!!oղc]6ǖ6.d !Cu8B(q3;[XZ y|w>+OK,=  ӯ򊯿tx}+R%(Ta! $311JHE 07>,= 8NOA!