diff --git a/.cz.toml b/.cz.toml
index e3ec4f15a8..2de0139704 100644
--- a/.cz.toml
+++ b/.cz.toml
@@ -40,6 +40,8 @@ version_files = [
"packages/opentelemetry-instrumentation-mistralai/opentelemetry/instrumentation/mistralai/version.py",
"packages/opentelemetry-instrumentation-ollama/pyproject.toml:^version",
"packages/opentelemetry-instrumentation-ollama/opentelemetry/instrumentation/ollama/version.py",
+ "packages/opentelemetry-instrumentation-oci-genai/pyproject.toml:^version",
+ "packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/version.py",
"packages/opentelemetry-instrumentation-openai/pyproject.toml:^version",
"packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/version.py",
"packages/opentelemetry-instrumentation-openai-agents/pyproject.toml:^version",
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 07b0b9bb49..8ef639da01 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -122,6 +122,16 @@ updates:
- "*"
labels:
- "dependencies"
+ - package-ecosystem: "uv"
+ directory: "/packages/opentelemetry-instrumentation-oci-genai"
+ schedule:
+ interval: "weekly"
+ groups:
+ gha:
+ patterns:
+ - "*"
+ labels:
+ - "dependencies"
- package-ecosystem: "uv"
directory: "/packages/opentelemetry-instrumentation-ollama"
schedule:
diff --git a/README.md b/README.md
index 65ac1c4c42..525f236388 100644
--- a/README.md
+++ b/README.md
@@ -126,6 +126,7 @@ OpenLLMetry can instrument everything that [OpenTelemetry already instruments](h
- ✅ [HuggingFace](https://huggingface.co/)
- ✅ [IBM Watsonx AI](https://www.ibm.com/watsonx)
- ✅ [Mistral AI](https://mistral.ai/)
+- ✅ [OCI Generative AI (Oracle Cloud)](https://www.oracle.com/artificial-intelligence/generative-ai/)
- ✅ [Ollama](https://ollama.com/)
- ✅ [OpenAI / Azure OpenAI](https://openai.com/)
- ✅ [Replicate](https://replicate.com/)
diff --git a/packages/opentelemetry-instrumentation-oci-genai/.python-version b/packages/opentelemetry-instrumentation-oci-genai/.python-version
new file mode 100644
index 0000000000..c8cfe39591
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/.python-version
@@ -0,0 +1 @@
+3.10
diff --git a/packages/opentelemetry-instrumentation-oci-genai/README.md b/packages/opentelemetry-instrumentation-oci-genai/README.md
new file mode 100644
index 0000000000..0f9c2afdb0
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/README.md
@@ -0,0 +1,52 @@
+# OpenTelemetry OCI Generative AI Instrumentation
+
+
+
+
+
+This library allows tracing calls to the [OCI Generative AI](https://docs.oracle.com/en-us/iaas/Content/generative-ai/home.htm) inference service made with the official [OCI Python SDK](https://github.com/oracle/oci-python-sdk) (`oci.generative_ai_inference.GenerativeAiInferenceClient`).
+
+Instrumented operations:
+
+| SDK method | `gen_ai.operation.name` | Notes |
+| --------------- | ----------------------- | ------------------------------------------------------------------------ |
+| `chat` | `chat` | `GENERIC`, `COHERE` and `COHEREV2` request formats, streaming and non-streaming |
+| `generate_text` | `text_completion` | Legacy Cohere / Llama runtimes |
+| `embed_text` | `embeddings` | Emits `gen_ai.embeddings.dimension.count` |
+| `rerank_text` | `rerank` | Emits `gen_ai.oci.rerank.top_n` and document count |
+
+Spans follow the OpenTelemetry GenAI semantic conventions (`{operation} {model}` span names, `gen_ai.provider.name`,
+`gen_ai.request.*`, `gen_ai.response.*`, `gen_ai.usage.*`, `gen_ai.input.messages` / `gen_ai.output.messages`).
+`gen_ai.provider.name` is set to `oracle_cloud.generative_ai`. Both on-demand (`OnDemandServingMode.model_id`) and
+dedicated (`DedicatedServingMode.endpoint_id`) serving modes are supported; the serving mode is reported on
+`gen_ai.oci.serving_mode`.
+
+For streaming chat requests (`is_stream=True`) the span is completed once the SSE stream returned in
+`response.data.events()` has been consumed. Pass `stream_options=StreamOptions(is_include_usage=True)` to receive
+token usage in the final stream events.
+
+## Installation
+
+```bash
+pip install opentelemetry-instrumentation-oci-genai
+```
+
+## Example usage
+
+```python
+from opentelemetry.instrumentation.oci_genai import OCIGenAIInstrumentor
+
+OCIGenAIInstrumentor().instrument()
+```
+
+## Privacy
+
+**By default, this instrumentation logs prompts, completions, and embeddings to span attributes**. This gives you a clear visibility into how your LLM application is working, and can make it easy to debug and evaluate the quality of the outputs.
+
+However, you may want to disable this logging for privacy reasons, as they may contain highly sensitive data from your users. You may also simply want to reduce the size of your traces.
+
+To disable logging, set the `TRACELOOP_TRACE_CONTENT` environment variable to `false`.
+
+```bash
+TRACELOOP_TRACE_CONTENT=false
+```
diff --git a/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/__init__.py b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/__init__.py
new file mode 100644
index 0000000000..5dd5fba67f
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/__init__.py
@@ -0,0 +1,362 @@
+"""OpenTelemetry OCI Generative AI instrumentation"""
+
+import logging
+import os
+import time
+import warnings
+from functools import partial
+from typing import Callable, Collection, Optional
+
+from opentelemetry import context as context_api
+from opentelemetry._logs import get_logger
+from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
+from opentelemetry.instrumentation.oci_genai.config import Config
+from opentelemetry.instrumentation.oci_genai.event_emitter import (
+ emit_input_events,
+ emit_response_events,
+ emit_streaming_response_events,
+)
+from opentelemetry.instrumentation.oci_genai.span_utils import (
+ CHAT,
+ EMBEDDINGS,
+ OCI_GENAI_PROVIDER,
+ RERANK,
+ TEXT_COMPLETION,
+ get_request_model,
+ is_stream_request,
+ record_usage_metrics,
+ set_input_attributes,
+ set_output_attributes,
+ set_request_attributes,
+ set_response_attributes,
+ set_streaming_output_attributes,
+ set_streaming_response_attributes,
+)
+from opentelemetry.instrumentation.oci_genai.streaming import (
+ OCIGenAIStreamWrapper,
+ StreamAccumulator,
+)
+from opentelemetry.instrumentation.oci_genai.utils import dont_throw, should_emit_events
+from opentelemetry.instrumentation.oci_genai.version import __version__
+from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY, unwrap
+from opentelemetry.metrics import Meter, get_meter
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE
+from opentelemetry.semconv_ai import (
+ SUPPRESS_LANGUAGE_MODEL_INSTRUMENTATION_KEY,
+ Meters,
+)
+from opentelemetry.trace import SpanKind, get_tracer, use_span
+from opentelemetry.trace.status import Status, StatusCode
+from wrapt import wrap_function_wrapper
+
+logger = logging.getLogger(__name__)
+
+_instruments = ("oci >= 2.121.1",)
+
+_CLIENT_MODULE = "oci.generative_ai_inference.generative_ai_inference_client"
+_CLIENT_CLASS = "GenerativeAiInferenceClient"
+
+WRAPPED_METHODS = [
+ {"method": "chat", "details_kwarg": "chat_details", "operation": CHAT},
+ {"method": "generate_text", "details_kwarg": "generate_text_details", "operation": TEXT_COMPLETION},
+ {"method": "embed_text", "details_kwarg": "embed_text_details", "operation": EMBEDDINGS},
+ {"method": "rerank_text", "details_kwarg": "rerank_text_details", "operation": RERANK},
+]
+
+
+def is_metrics_enabled() -> bool:
+ return (os.getenv("TRACELOOP_METRICS_ENABLED") or "true").lower() == "true"
+
+
+def _create_metrics(meter: Meter):
+ token_histogram = meter.create_histogram(
+ name=Meters.LLM_TOKEN_USAGE,
+ unit="token",
+ description="Measures number of input and output tokens used",
+ )
+
+ duration_histogram = meter.create_histogram(
+ name=Meters.LLM_OPERATION_DURATION,
+ unit="s",
+ description="GenAI operation duration",
+ )
+
+ return token_histogram, duration_histogram
+
+
+def _span_name(operation, model):
+ """Build span name per OTel semconv: '{operation_name} {model}'."""
+ return f"{operation} {model}" if model else operation
+
+
+def _resolve_details(args, kwargs, details_kwarg):
+ """The ``*Details`` request object is the first positional argument of every client method."""
+ if details_kwarg in kwargs:
+ return kwargs[details_kwarg]
+ return args[0] if args else None
+
+
+def _metric_attributes(operation, request_model, response_model=None):
+ attributes = {
+ **Config.get_common_metrics_attributes(),
+ GenAIAttributes.GEN_AI_PROVIDER_NAME: OCI_GENAI_PROVIDER,
+ GenAIAttributes.GEN_AI_OPERATION_NAME: operation,
+ GenAIAttributes.GEN_AI_REQUEST_MODEL: request_model,
+ }
+ if response_model:
+ attributes[GenAIAttributes.GEN_AI_RESPONSE_MODEL] = response_model
+ return attributes
+
+
+def _record_exception(span, error):
+ span.set_attribute(ERROR_TYPE, error.__class__.__name__)
+ span.record_exception(error)
+ span.set_status(Status(StatusCode.ERROR, str(error)))
+
+
+def is_streaming_response(operation, details, response):
+ return is_stream_request(operation, details) and hasattr(getattr(response, "data", None), "events")
+
+
+@dont_throw
+def _handle_request(span, operation, details, instance, event_logger):
+ set_request_attributes(span, operation, details, instance)
+ if should_emit_events() and event_logger:
+ emit_input_events(operation, details, event_logger)
+ else:
+ set_input_attributes(span, operation, details)
+
+
+@dont_throw
+def _handle_response(
+ span, operation, response, request_model, token_histogram, duration_histogram, start_time, event_logger
+):
+ usage = set_response_attributes(span, operation, response)
+ if should_emit_events() and event_logger:
+ emit_response_events(operation, response, event_logger)
+ else:
+ set_output_attributes(span, operation, response)
+
+ response_model = getattr(getattr(response, "data", None), "model_id", None)
+ attributes = _metric_attributes(operation, request_model, response_model)
+ if duration_histogram:
+ duration_histogram.record(time.time() - start_time, attributes=attributes)
+ record_usage_metrics(token_histogram, usage, attributes)
+
+
+def _finish_streaming_span(
+ span,
+ operation,
+ request_model,
+ token_histogram,
+ duration_histogram,
+ event_logger,
+ start_time,
+ accumulator,
+ error,
+ complete,
+):
+ """Callback invoked once by ``OCIGenAIStreamWrapper`` when the SSE stream is exhausted, fails or is closed early."""
+ try:
+ # The stream is consumed in the caller's context long after ``_wrap`` returned: reactivate the client span so
+ # the response events and metrics recorded here are correlated with it.
+ with use_span(span, end_on_exit=False):
+ if error is not None:
+ _record_exception(span, error)
+ else:
+ usage = set_streaming_response_attributes(span, accumulator)
+ if should_emit_events() and event_logger:
+ emit_streaming_response_events(accumulator, event_logger)
+ else:
+ set_streaming_output_attributes(span, accumulator)
+
+ attributes = _metric_attributes(operation, request_model)
+ if duration_histogram:
+ duration_histogram.record(time.time() - start_time, attributes=attributes)
+ record_usage_metrics(token_histogram, usage, attributes)
+
+ # A stream the caller closed or abandoned before the end is neither an error nor a success.
+ if complete and span.is_recording():
+ span.set_status(Status(StatusCode.OK))
+ except Exception as e:
+ logger.debug("OpenLLMetry failed to finish OCI GenAI streaming span, error: %s", e)
+ if Config.exception_logger:
+ Config.exception_logger(e)
+ finally:
+ span.end()
+
+
+def _with_tracer_wrapper(func):
+ """Helper for providing tracer and metric instruments to wrapper functions."""
+
+ def _with_tracer(tracer, token_histogram, duration_histogram, event_logger, to_wrap):
+ def wrapper(wrapped, instance, args, kwargs):
+ return func(
+ tracer,
+ token_histogram,
+ duration_histogram,
+ event_logger,
+ to_wrap,
+ wrapped,
+ instance,
+ args,
+ kwargs,
+ )
+
+ return wrapper
+
+ return _with_tracer
+
+
+@_with_tracer_wrapper
+def _wrap(
+ tracer,
+ token_histogram,
+ duration_histogram,
+ event_logger,
+ to_wrap,
+ wrapped,
+ instance,
+ args,
+ kwargs,
+):
+ """Instruments and calls every function defined in WRAPPED_METHODS."""
+ if context_api.get_value(_SUPPRESS_INSTRUMENTATION_KEY) or context_api.get_value(
+ SUPPRESS_LANGUAGE_MODEL_INSTRUMENTATION_KEY
+ ):
+ return wrapped(*args, **kwargs)
+
+ operation = to_wrap.get("operation")
+ details = _resolve_details(args, kwargs, to_wrap.get("details_kwarg"))
+ request_model = get_request_model(details)
+
+ span = tracer.start_span(
+ _span_name(operation, request_model),
+ kind=SpanKind.CLIENT,
+ attributes={
+ GenAIAttributes.GEN_AI_PROVIDER_NAME: OCI_GENAI_PROVIDER,
+ GenAIAttributes.GEN_AI_OPERATION_NAME: operation,
+ GenAIAttributes.GEN_AI_REQUEST_MODEL: request_model,
+ },
+ )
+
+ # ``start_span`` does not make the span current: activate it so the events emitted here carry its trace
+ # context and spans created inside the SDK call become children rather than siblings.
+ with use_span(span, end_on_exit=False):
+ _handle_request(span, operation, details, instance, event_logger)
+
+ start_time = time.time()
+ try:
+ response = wrapped(*args, **kwargs)
+ except Exception as e:
+ _record_exception(span, e)
+ if duration_histogram:
+ duration_histogram.record(
+ time.time() - start_time,
+ attributes={**_metric_attributes(operation, request_model), ERROR_TYPE: e.__class__.__name__},
+ )
+ span.end()
+ raise
+
+ if is_streaming_response(operation, details, response):
+ # The span is completed once the caller has consumed, or closed, ``response.data.events()``.
+ response.data = OCIGenAIStreamWrapper(
+ response.data,
+ StreamAccumulator(),
+ partial(
+ _finish_streaming_span,
+ span,
+ operation,
+ request_model,
+ token_histogram,
+ duration_histogram,
+ event_logger,
+ start_time,
+ ),
+ span=span,
+ )
+ return response
+
+ _handle_response(
+ span, operation, response, request_model, token_histogram, duration_histogram, start_time, event_logger
+ )
+ if span.is_recording():
+ span.set_status(Status(StatusCode.OK))
+ span.end()
+ return response
+
+
+class OCIGenAIInstrumentor(BaseInstrumentor):
+ """An instrumentor for the OCI Python SDK's Generative AI inference client."""
+
+ def __init__(
+ self,
+ exception_logger=None,
+ use_attributes: Optional[bool] = None,
+ get_common_metrics_attributes: Callable[[], dict] = lambda: {},
+ use_legacy_attributes: Optional[bool] = None,
+ ):
+ super().__init__()
+ if use_attributes is not None and use_legacy_attributes is not None:
+ raise TypeError(
+ "Cannot pass both `use_attributes` and `use_legacy_attributes`; "
+ "`use_legacy_attributes` is deprecated, use `use_attributes` instead."
+ )
+ if use_legacy_attributes is not None:
+ warnings.warn(
+ "`use_legacy_attributes` is deprecated and will be removed in a "
+ "future release; use `use_attributes` instead. The current OTel "
+ "GenAI spec emits prompts/completions as span attributes "
+ "(`gen_ai.input.messages` / `gen_ai.output.messages`), which is "
+ "what `use_attributes=True` (the default) does. "
+ "`use_attributes=False` opts into the events path instead.",
+ DeprecationWarning,
+ stacklevel=2,
+ )
+ use_attributes = use_legacy_attributes
+ if use_attributes is None:
+ use_attributes = True
+ Config.exception_logger = exception_logger
+ Config.get_common_metrics_attributes = get_common_metrics_attributes
+ Config.use_legacy_attributes = use_attributes
+
+ def instrumentation_dependencies(self) -> Collection[str]:
+ return _instruments
+
+ def _instrument(self, **kwargs):
+ tracer_provider = kwargs.get("tracer_provider")
+ tracer = get_tracer(__name__, __version__, tracer_provider)
+
+ # meter and histograms are inited here
+ meter_provider = kwargs.get("meter_provider")
+ meter = get_meter(__name__, __version__, meter_provider)
+
+ if is_metrics_enabled():
+ token_histogram, duration_histogram = _create_metrics(meter)
+ else:
+ token_histogram, duration_histogram = None, None
+
+ event_logger = None
+ if not Config.use_legacy_attributes:
+ logger_provider = kwargs.get("logger_provider")
+ event_logger = get_logger(__name__, __version__, logger_provider=logger_provider)
+
+ for wrapped_method in WRAPPED_METHODS:
+ try:
+ wrap_function_wrapper(
+ _CLIENT_MODULE,
+ f"{_CLIENT_CLASS}.{wrapped_method.get('method')}",
+ _wrap(tracer, token_histogram, duration_histogram, event_logger, wrapped_method),
+ )
+ except (AttributeError, ModuleNotFoundError):
+ pass # older SDK releases don't expose every operation (e.g. rerank_text)
+
+ def _uninstrument(self, **kwargs):
+ for wrapped_method in WRAPPED_METHODS:
+ try:
+ unwrap(f"{_CLIENT_MODULE}.{_CLIENT_CLASS}", wrapped_method.get("method"))
+ except (AttributeError, ModuleNotFoundError):
+ pass
diff --git a/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/config.py b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/config.py
new file mode 100644
index 0000000000..f78d2f0d60
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/config.py
@@ -0,0 +1,7 @@
+from typing import Callable
+
+
+class Config:
+ exception_logger = None
+ get_common_metrics_attributes: Callable[[], dict] = lambda: {}
+ use_legacy_attributes = True
diff --git a/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/event_emitter.py b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/event_emitter.py
new file mode 100644
index 0000000000..00c13da19d
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/event_emitter.py
@@ -0,0 +1,188 @@
+from dataclasses import asdict
+from enum import Enum
+from typing import Union
+
+from opentelemetry._logs import Logger, LogRecord
+from opentelemetry.instrumentation.oci_genai.event_models import ChoiceEvent, MessageEvent
+from opentelemetry.instrumentation.oci_genai.span_utils import (
+ CHAT,
+ EMBEDDINGS,
+ OCI_GENAI_PROVIDER,
+ RERANK,
+ TEXT_COMPLETION,
+ chat_request_to_messages,
+ embedding_input_parts,
+ response_to_output_messages,
+ stream_choices_to_messages,
+)
+from opentelemetry.instrumentation.oci_genai.utils import (
+ dont_throw,
+ should_emit_events,
+ should_send_prompts,
+)
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+
+
+class Roles(Enum):
+ USER = "user"
+ ASSISTANT = "assistant"
+ SYSTEM = "system"
+ TOOL = "tool"
+
+
+VALID_MESSAGE_ROLES = {role.value for role in Roles}
+"""The valid roles for naming the message event."""
+
+EVENT_ATTRIBUTES = {GenAIAttributes.GEN_AI_PROVIDER_NAME: OCI_GENAI_PROVIDER}
+"""The attributes to be used for the event."""
+
+
+def _parts_to_content(parts):
+ """Collapse OTel parts into event body content: a string when text-only, otherwise the parts list."""
+ parts = [part for part in parts if part.get("type") != "tool_call"]
+ if not parts:
+ return None
+ if all(part.get("type") == "text" for part in parts):
+ return "\n".join(part.get("content", "") for part in parts)
+ if len(parts) == 1 and parts[0].get("type") == "tool_call_response":
+ return parts[0].get("response")
+ return parts
+
+
+def _parts_to_tool_calls(parts):
+ tool_calls = [
+ {
+ "id": part.get("id") or "",
+ "type": "function",
+ "function": {"function_name": part.get("name"), "arguments": part.get("arguments")},
+ }
+ for part in parts
+ if part.get("type") == "tool_call"
+ ]
+ return tool_calls or None
+
+
+def _emit_message(message, event_logger):
+ emit_event(
+ MessageEvent(
+ content=_parts_to_content(message["parts"]),
+ role=message.get("role") or "user",
+ tool_calls=_parts_to_tool_calls(message["parts"]),
+ ),
+ event_logger,
+ )
+
+
+def _emit_choices(messages, event_logger):
+ for index, message in enumerate(messages):
+ emit_event(
+ ChoiceEvent(
+ index=index,
+ message={"content": _parts_to_content(message["parts"]), "role": message.get("role") or "assistant"},
+ finish_reason=message.get("finish_reason") or None,
+ tool_calls=_parts_to_tool_calls(message["parts"]),
+ ),
+ event_logger,
+ )
+
+
+@dont_throw
+def emit_input_events(operation, details, event_logger):
+ if operation == CHAT:
+ messages, system_parts = chat_request_to_messages(getattr(details, "chat_request", None))
+ if system_parts:
+ _emit_message({"role": Roles.SYSTEM.value, "parts": system_parts}, event_logger)
+ for message in messages:
+ _emit_message(message, event_logger)
+ elif operation == TEXT_COMPLETION:
+ prompt = getattr(getattr(details, "inference_request", None), "prompt", None)
+ if prompt:
+ emit_event(MessageEvent(content=prompt, role=Roles.USER.value), event_logger)
+ elif operation == EMBEDDINGS:
+ for parts in embedding_input_parts(details):
+ _emit_message({"role": Roles.USER.value, "parts": parts}, event_logger)
+ elif operation == RERANK:
+ for document in getattr(details, "documents", None) or []:
+ emit_event(MessageEvent(content=document, role=Roles.SYSTEM.value), event_logger)
+ query = getattr(details, "input", None)
+ if query:
+ emit_event(MessageEvent(content=query, role=Roles.USER.value), event_logger)
+
+
+@dont_throw
+def emit_response_events(operation, response, event_logger):
+ _emit_choices(response_to_output_messages(operation, getattr(response, "data", None)), event_logger)
+
+
+@dont_throw
+def emit_streaming_response_events(accumulator, event_logger):
+ _emit_choices(stream_choices_to_messages(accumulator.choices_list()), event_logger)
+
+
+def emit_event(event: Union[MessageEvent, ChoiceEvent], event_logger: Union[Logger, None]) -> None:
+ """
+ Emit an event to the OpenTelemetry SDK.
+
+ Args:
+ event: The event to emit.
+ """
+ if not should_emit_events() or event_logger is None:
+ return
+
+ if isinstance(event, MessageEvent):
+ _emit_message_event(event, event_logger)
+ elif isinstance(event, ChoiceEvent):
+ _emit_choice_event(event, event_logger)
+ else:
+ raise TypeError("Unsupported event type")
+
+
+def _emit_message_event(event: MessageEvent, event_logger: Logger) -> None:
+ body = asdict(event)
+
+ if event.role in VALID_MESSAGE_ROLES:
+ name = "gen_ai.{}.message".format(event.role)
+ # According to the semantic conventions, the role is conditionally required if available
+ # and not equal to the "role" in the message name. So, remove the role from the body if
+ # it is the same as the in the event name.
+ body.pop("role", None)
+ else:
+ name = "gen_ai.user.message"
+
+ # According to the semantic conventions, only the assistant role has tool call
+ if event.role != Roles.ASSISTANT.value and event.tool_calls is not None:
+ del body["tool_calls"]
+ elif event.tool_calls is None:
+ del body["tool_calls"]
+
+ if not should_send_prompts():
+ del body["content"]
+ if body.get("tool_calls") is not None:
+ for tool_call in body["tool_calls"]:
+ tool_call["function"].pop("arguments", None)
+
+ log_record = LogRecord(body=body, attributes=EVENT_ATTRIBUTES, event_name=name)
+ event_logger.emit(log_record)
+
+
+def _emit_choice_event(event: ChoiceEvent, event_logger: Logger) -> None:
+ body = asdict(event)
+ if event.message["role"] == Roles.ASSISTANT.value:
+ # According to the semantic conventions, the role is conditionally required if available
+ # and not equal to "assistant", so remove the role from the body if it is "assistant".
+ body["message"].pop("role", None)
+
+ if event.tool_calls is None:
+ del body["tool_calls"]
+
+ if not should_send_prompts():
+ body["message"].pop("content", None)
+ body["message"].pop("role", None)
+ if body.get("tool_calls") is not None:
+ for tool_call in body["tool_calls"]:
+ tool_call["function"].pop("arguments", None)
+
+ log_record = LogRecord(body=body, attributes=EVENT_ATTRIBUTES, event_name="gen_ai.choice")
+ event_logger.emit(log_record)
diff --git a/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/event_models.py b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/event_models.py
new file mode 100644
index 0000000000..f5f3881494
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/event_models.py
@@ -0,0 +1,41 @@
+from dataclasses import dataclass
+from typing import Any, List, Literal, Optional, TypedDict
+
+
+class _FunctionToolCall(TypedDict):
+ function_name: str
+ arguments: Optional[dict[str, Any]]
+
+
+class ToolCall(TypedDict):
+ """Represents a tool call in the AI model."""
+
+ id: str
+ function: _FunctionToolCall
+ type: Literal["function"]
+
+
+class CompletionMessage(TypedDict):
+ """Represents a message in the AI model."""
+
+ content: Any
+ role: str = "assistant"
+
+
+@dataclass
+class MessageEvent:
+ """Represents an input event for the AI model."""
+
+ content: Any
+ role: str = "user"
+ tool_calls: Optional[List[ToolCall]] = None
+
+
+@dataclass
+class ChoiceEvent:
+ """Represents a completion event for the AI model."""
+
+ index: int
+ message: CompletionMessage
+ finish_reason: Optional[str] = None
+ tool_calls: Optional[List[ToolCall]] = None
diff --git a/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/span_utils.py b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/span_utils.py
new file mode 100644
index 0000000000..5f9dd3cecb
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/span_utils.py
@@ -0,0 +1,639 @@
+"""Span attribute helpers for the OCI Generative AI instrumentation.
+
+Request/response shapes handled here (all from ``oci.generative_ai_inference.models``):
+
+* ``chat``: ``ChatDetails.chat_request`` is a ``GenericChatRequest`` (``messages`` list, OpenAI-like, used by
+ Meta, OpenAI, Google and xAI models), a ``CohereChatRequest`` (``message`` + ``chat_history``) or a
+ ``CohereChatRequestV2`` (``messages`` list). The result is a ``ChatResult`` whose ``chat_response`` is the
+ matching ``GenericChatResponse`` / ``CohereChatResponse`` / ``CohereChatResponseV2``.
+* ``generate_text``: legacy completion API with ``CohereLlmInferenceRequest`` / ``LlamaLlmInferenceRequest``.
+* ``embed_text``: ``EmbedTextDetails`` -> ``EmbedTextResult``.
+* ``rerank_text``: ``RerankTextDetails`` -> ``RerankTextResult``.
+"""
+
+import json
+import logging
+
+from opentelemetry.instrumentation.oci_genai.utils import (
+ dont_throw,
+ get_server_address,
+ model_as_dict,
+ set_span_attribute,
+ should_send_prompts,
+)
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+from opentelemetry.semconv.attributes.server_attributes import SERVER_ADDRESS
+from opentelemetry.semconv_ai import SpanAttributes
+
+logger = logging.getLogger(__name__)
+
+OCI_GENAI_PROVIDER = "oracle_cloud.generative_ai"
+"""``gen_ai.provider.name`` value for OCI Generative AI (open-telemetry/semantic-conventions-genai#526)."""
+
+CHAT = GenAIAttributes.GenAiOperationNameValues.CHAT.value
+TEXT_COMPLETION = GenAIAttributes.GenAiOperationNameValues.TEXT_COMPLETION.value
+EMBEDDINGS = GenAIAttributes.GenAiOperationNameValues.EMBEDDINGS.value
+RERANK = "rerank"
+
+# OCI specific attributes (vendor namespace, same pattern as gen_ai.openai.* / gen_ai.bedrock.*)
+GEN_AI_OCI_SERVING_MODE = "gen_ai.oci.serving_mode"
+GEN_AI_OCI_ENDPOINT_ID = "gen_ai.oci.endpoint_id"
+GEN_AI_OCI_API_FORMAT = "gen_ai.oci.api_format"
+GEN_AI_OCI_EMBEDDINGS_INPUT_COUNT = "gen_ai.oci.embeddings.input_count"
+GEN_AI_OCI_EMBEDDINGS_INPUT_TYPE = "gen_ai.oci.embeddings.input_type"
+GEN_AI_OCI_RERANK_TOP_N = "gen_ai.oci.rerank.top_n"
+GEN_AI_OCI_RERANK_DOCUMENT_COUNT = "gen_ai.oci.rerank.document_count"
+
+# OCI finish reason -> OTel GenAI finish reason (stop, length, content_filter, tool_call, error).
+# Unknown values are passed through lower-cased.
+FINISH_REASON_MAP = {
+ # GENERIC api format (OpenAI compatible)
+ "stop": "stop",
+ "length": "length",
+ "tool_calls": "tool_call",
+ "content_filter": "content_filter",
+ # COHERE / COHEREV2 api formats and legacy Cohere text generation
+ "COMPLETE": "stop",
+ "STOP_SEQUENCE": "stop",
+ "MAX_TOKENS": "length",
+ "TOOL_CALL": "tool_call",
+ "ERROR": "error",
+ "ERROR_LIMIT": "error",
+ "ERROR_TOXIC": "content_filter",
+}
+
+_DETAILS_REQUEST_ATTRIBUTE = {CHAT: "chat_request", TEXT_COMPLETION: "inference_request"}
+
+
+def map_finish_reason(reason):
+ if not reason:
+ return ""
+ reason = str(reason)
+ return FINISH_REASON_MAP.get(reason, reason.lower())
+
+
+def _normalize_role(role):
+ if not role:
+ return "user"
+ role = str(role).lower()
+ return "assistant" if role == "chatbot" else role
+
+
+def _first_not_none(*values):
+ for value in values:
+ if value is not None:
+ return value
+ return None
+
+
+# ---------------------------------------------------------------------------
+# OTel message parts
+# ---------------------------------------------------------------------------
+
+
+def _text_part(content):
+ return {"type": "text", "content": content}
+
+
+def _reasoning_part(content):
+ return {"type": "reasoning", "content": content}
+
+
+def _image_part(url):
+ if isinstance(url, str) and url.startswith("data:"):
+ try:
+ header, data = url.split(",", 1)
+ mime_type = header.split(":", 1)[1].split(";", 1)[0]
+ return {"type": "blob", "modality": "image", "mime_type": mime_type, "content": data}
+ except (ValueError, IndexError):
+ pass
+ return {"type": "uri", "modality": "image", "uri": url or ""}
+
+
+def _parse_arguments(raw):
+ if isinstance(raw, str):
+ try:
+ return json.loads(raw)
+ except (TypeError, ValueError):
+ return raw
+ if raw is None:
+ return {}
+ return model_as_dict(raw)
+
+
+def _tool_call_part(name, arguments=None, tool_id=None):
+ part = {"type": "tool_call", "name": name or "", "arguments": _parse_arguments(arguments)}
+ if tool_id:
+ part["id"] = tool_id
+ return part
+
+
+def _tool_call_response_part(tool_id, response):
+ return {
+ "type": "tool_call_response",
+ "id": tool_id or "",
+ "response": response if response is not None else "",
+ }
+
+
+def _output_message(role, parts, finish_reason):
+ """OutputMessage per the OTel GenAI JSON schema: role, parts and finish_reason are required."""
+ return {"role": role, "parts": parts, "finish_reason": finish_reason or ""}
+
+
+def _parts_text(parts):
+ return "".join(part.get("content", "") for part in parts if part.get("type") == "text")
+
+
+def _content_to_parts(content):
+ """Convert OCI ``ChatContent`` / ``CohereContentV2`` lists (or a plain string) to OTel parts."""
+ if content is None:
+ return []
+ if isinstance(content, str):
+ return [_text_part(content)] if content else []
+ parts = []
+ for item in content:
+ if isinstance(item, str):
+ if item:
+ parts.append(_text_part(item))
+ continue
+ item_type = str(getattr(item, "type", "") or "").upper()
+ if item_type == "TEXT" or (not item_type and hasattr(item, "text")):
+ text = getattr(item, "text", None)
+ if text:
+ parts.append(_text_part(text))
+ elif item_type == "THINKING":
+ thinking = getattr(item, "thinking", None)
+ if thinking:
+ parts.append(_reasoning_part(thinking))
+ elif item_type == "IMAGE":
+ parts.append(_image_part(getattr(getattr(item, "image_url", None), "url", None)))
+ else:
+ # Stopgap for audio/video/document content: encode as text to keep the parts array valid.
+ parts.append(_text_part(json.dumps(model_as_dict(item), default=str)))
+ return parts
+
+
+def _field(obj, name):
+ """Read ``name`` from an SDK model or from a plain dict (some SDK fields are untyped ``object``)."""
+ if isinstance(obj, dict):
+ return obj.get(name)
+ return getattr(obj, name, None)
+
+
+def _tool_calls_to_parts(tool_calls):
+ """Convert ``FunctionCall`` (GENERIC), ``CohereToolCallV2`` or ``CohereToolCall`` lists to OTel parts."""
+ parts = []
+ for tool_call in tool_calls or []:
+ function = _field(tool_call, "function")
+ if function is not None:
+ # CohereToolCallV2: {"id", "type", "function": {"name", "arguments"}}
+ parts.append(
+ _tool_call_part(_field(function, "name"), _field(function, "arguments"), _field(tool_call, "id"))
+ )
+ elif _field(tool_call, "parameters") is not None:
+ # CohereToolCall (v1): {"name", "parameters"}
+ parts.append(_tool_call_part(_field(tool_call, "name"), _field(tool_call, "parameters")))
+ else:
+ # FunctionCall (GENERIC): {"id", "type", "name", "arguments"}
+ parts.append(
+ _tool_call_part(_field(tool_call, "name"), _field(tool_call, "arguments"), _field(tool_call, "id"))
+ )
+ return parts
+
+
+def _cohere_tool_results_to_parts(tool_results):
+ parts = []
+ for result in tool_results or []:
+ call = getattr(result, "call", None)
+ parts.append(
+ _tool_call_response_part(
+ getattr(call, "name", None),
+ model_as_dict(getattr(result, "outputs", None)) or "",
+ )
+ )
+ return parts
+
+
+def _message_to_otel(message):
+ """Convert a GENERIC ``Message`` or a ``CohereMessageV2`` into an OTel input/output message dict."""
+ role = _normalize_role(getattr(message, "role", None))
+ content_parts = _content_to_parts(getattr(message, "content", None))
+ if role == "tool":
+ parts = [_tool_call_response_part(getattr(message, "tool_call_id", None), _parts_text(content_parts))]
+ else:
+ parts = content_parts
+ reasoning = getattr(message, "reasoning_content", None)
+ if reasoning:
+ parts.append(_reasoning_part(reasoning))
+ parts.extend(_tool_calls_to_parts(getattr(message, "tool_calls", None)))
+ return {"role": role, "parts": parts}
+
+
+def _cohere_history_to_messages(chat_history):
+ messages = []
+ for item in chat_history or []:
+ role = _normalize_role(getattr(item, "role", None))
+ if role == "tool":
+ parts = _cohere_tool_results_to_parts(getattr(item, "tool_results", None))
+ else:
+ parts = []
+ text = getattr(item, "message", None)
+ if text:
+ parts.append(_text_part(text))
+ parts.extend(_tool_calls_to_parts(getattr(item, "tool_calls", None)))
+ messages.append({"role": role, "parts": parts})
+ return messages
+
+
+def chat_request_to_messages(request):
+ """Return ``(input_messages, system_instruction_parts)`` for any OCI chat request flavour."""
+ if request is None:
+ return [], []
+ api_format = str(getattr(request, "api_format", "") or "").upper()
+ if api_format == "COHERE":
+ system_parts = []
+ preamble = getattr(request, "preamble_override", None)
+ if preamble:
+ system_parts.append(_text_part(preamble))
+ messages = _cohere_history_to_messages(getattr(request, "chat_history", None))
+ message = getattr(request, "message", None)
+ if message:
+ messages.append({"role": "user", "parts": [_text_part(message)]})
+ tool_results = getattr(request, "tool_results", None)
+ if tool_results:
+ messages.append({"role": "tool", "parts": _cohere_tool_results_to_parts(tool_results)})
+ return messages, system_parts
+
+ # GENERIC and COHEREV2 both carry a ``messages`` list
+ return [_message_to_otel(message) for message in getattr(request, "messages", None) or []], []
+
+
+def chat_response_to_messages(chat_response):
+ """Return OTel output messages for a ``GenericChatResponse`` / ``CohereChatResponse`` / ``CohereChatResponseV2``."""
+ if chat_response is None:
+ return []
+ api_format = str(getattr(chat_response, "api_format", "") or "").upper()
+ finish_reason = map_finish_reason(getattr(chat_response, "finish_reason", None))
+ if api_format == "COHERE":
+ parts = []
+ text = getattr(chat_response, "text", None)
+ if text:
+ parts.append(_text_part(text))
+ parts.extend(_tool_calls_to_parts(getattr(chat_response, "tool_calls", None)))
+ return [_output_message("assistant", parts, finish_reason)]
+ if api_format == "COHEREV2":
+ message = getattr(chat_response, "message", None)
+ otel = _message_to_otel(message) if message is not None else {"role": "assistant", "parts": []}
+ return [_output_message(otel["role"], otel["parts"], finish_reason)]
+
+ messages = []
+ for choice in getattr(chat_response, "choices", None) or []:
+ message = getattr(choice, "message", None)
+ otel = _message_to_otel(message) if message is not None else {"role": "assistant", "parts": []}
+ messages.append(
+ _output_message(otel["role"], otel["parts"], map_finish_reason(getattr(choice, "finish_reason", None)))
+ )
+ return messages
+
+
+def text_completion_response_to_messages(inference_response):
+ """Return OTel output messages for a legacy ``CohereLlmInferenceResponse`` / ``LlamaLlmInferenceResponse``."""
+ messages = []
+ if inference_response is None:
+ return messages
+ for generated in getattr(inference_response, "generated_texts", None) or []:
+ messages.append(
+ _output_message(
+ "assistant",
+ [_text_part(getattr(generated, "text", None) or "")],
+ map_finish_reason(getattr(generated, "finish_reason", None)),
+ )
+ )
+ for choice in getattr(inference_response, "choices", None) or []:
+ messages.append(
+ _output_message(
+ "assistant",
+ [_text_part(getattr(choice, "text", None) or "")],
+ map_finish_reason(getattr(choice, "finish_reason", None)),
+ )
+ )
+ return messages
+
+
+def rerank_response_to_messages(result):
+ messages = []
+ for rank in getattr(result, "document_ranks", None) or []:
+ content = f"Doc {getattr(rank, 'index', None)}, Score: {getattr(rank, 'relevance_score', None)}"
+ document = getattr(rank, "document", None)
+ if document:
+ if not isinstance(document, str):
+ document = json.dumps(model_as_dict(document), default=str)
+ content += "\n" + document
+ messages.append(_output_message("assistant", [_text_part(content)], "stop"))
+ return messages
+
+
+def stream_choices_to_messages(choices):
+ """Return OTel output messages for the choices aggregated by ``StreamAccumulator``."""
+ messages = []
+ for choice in choices:
+ parts = []
+ if choice.get("text"):
+ parts.append(_text_part(choice["text"]))
+ if choice.get("reasoning"):
+ parts.append(_reasoning_part(choice["reasoning"]))
+ for tool_call in choice.get("tool_calls") or []:
+ parts.append(_tool_call_part(tool_call.get("name"), tool_call.get("arguments"), tool_call.get("id")))
+ messages.append(_output_message("assistant", parts, map_finish_reason(choice.get("finish_reason"))))
+ return messages
+
+
+def response_to_output_messages(operation, data):
+ if data is None:
+ return []
+ if operation == CHAT:
+ return chat_response_to_messages(getattr(data, "chat_response", None))
+ if operation == TEXT_COMPLETION:
+ return text_completion_response_to_messages(getattr(data, "inference_response", None))
+ if operation == RERANK:
+ return rerank_response_to_messages(data)
+ return []
+
+
+def embedding_input_parts(details):
+ """Return one OTel parts list per embedding input (``inputs`` strings or ``embed_contents`` items)."""
+ inputs = getattr(details, "inputs", None)
+ if inputs:
+ return [[_text_part(text)] for text in inputs]
+ parts = []
+ for content in getattr(details, "embed_contents", None) or []:
+ content_type = str(getattr(content, "type", "") or "").upper()
+ if content_type == "IMAGE":
+ parts.append([_image_part(getattr(getattr(content, "image_url", None), "url", None))])
+ else:
+ parts.append([_text_part(getattr(content, "text", None) or "")])
+ return parts
+
+
+# ---------------------------------------------------------------------------
+# Request helpers
+# ---------------------------------------------------------------------------
+
+
+def get_request_model(details):
+ """Model id for on-demand serving, endpoint id for dedicated AI cluster endpoints."""
+ serving_mode = getattr(details, "serving_mode", None)
+ return (
+ getattr(serving_mode, "model_id", None)
+ or getattr(serving_mode, "endpoint_id", None)
+ or "unknown"
+ )
+
+
+def get_inner_request(operation, details):
+ attribute = _DETAILS_REQUEST_ATTRIBUTE.get(operation)
+ return getattr(details, attribute, None) if attribute else details
+
+
+def is_stream_request(operation, details):
+ return bool(getattr(get_inner_request(operation, details), "is_stream", False))
+
+
+def usage_to_dict(usage, include_output=True):
+ """Normalise an OCI ``Usage`` model or a camelCase streaming ``usage`` payload."""
+ if usage is None:
+ return None
+ if isinstance(usage, dict):
+ prompt_details = usage.get("promptTokensDetails") or usage.get("prompt_tokens_details") or {}
+ completion_details = usage.get("completionTokensDetails") or usage.get("completion_tokens_details") or {}
+ data = {
+ "input_tokens": _first_not_none(usage.get("promptTokens"), usage.get("prompt_tokens")),
+ "output_tokens": _first_not_none(usage.get("completionTokens"), usage.get("completion_tokens")),
+ "total_tokens": _first_not_none(usage.get("totalTokens"), usage.get("total_tokens")),
+ "cached_tokens": _first_not_none(prompt_details.get("cachedTokens"), prompt_details.get("cached_tokens"))
+ if isinstance(prompt_details, dict)
+ else None,
+ "reasoning_tokens": _first_not_none(
+ completion_details.get("reasoningTokens"), completion_details.get("reasoning_tokens")
+ )
+ if isinstance(completion_details, dict)
+ else None,
+ }
+ else:
+ data = {
+ "input_tokens": getattr(usage, "prompt_tokens", None),
+ "output_tokens": getattr(usage, "completion_tokens", None),
+ "total_tokens": getattr(usage, "total_tokens", None),
+ "cached_tokens": getattr(getattr(usage, "prompt_tokens_details", None), "cached_tokens", None),
+ "reasoning_tokens": getattr(getattr(usage, "completion_tokens_details", None), "reasoning_tokens", None),
+ }
+ if not include_output:
+ data["output_tokens"] = None
+ data["reasoning_tokens"] = None
+ if data["total_tokens"] is None and data["input_tokens"] is not None and data["output_tokens"] is not None:
+ data["total_tokens"] = data["input_tokens"] + data["output_tokens"]
+ return data
+
+
+def set_usage_attributes(span, usage):
+ if not usage:
+ return
+ set_span_attribute(span, GenAIAttributes.GEN_AI_USAGE_INPUT_TOKENS, usage.get("input_tokens"))
+ set_span_attribute(span, GenAIAttributes.GEN_AI_USAGE_OUTPUT_TOKENS, usage.get("output_tokens"))
+ set_span_attribute(span, SpanAttributes.GEN_AI_USAGE_TOTAL_TOKENS, usage.get("total_tokens"))
+ set_span_attribute(span, GenAIAttributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, usage.get("cached_tokens"))
+ set_span_attribute(span, SpanAttributes.GEN_AI_USAGE_REASONING_TOKENS, usage.get("reasoning_tokens"))
+
+
+def record_usage_metrics(token_histogram, usage, attributes):
+ if token_histogram is None or not usage:
+ return
+ for token_type, key in (("input", "input_tokens"), ("output", "output_tokens")):
+ value = usage.get(key)
+ if isinstance(value, int) and value >= 0:
+ token_histogram.record(
+ value,
+ attributes={**attributes, GenAIAttributes.GEN_AI_TOKEN_TYPE: token_type},
+ )
+
+
+def _set_finish_reasons(span, messages):
+ finish_reasons = [message["finish_reason"] for message in messages if message.get("finish_reason")]
+ if finish_reasons:
+ set_span_attribute(span, GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS, finish_reasons)
+
+
+# ---------------------------------------------------------------------------
+# Span attribute setters
+# ---------------------------------------------------------------------------
+
+
+@dont_throw
+def set_request_attributes(span, operation, details, instance):
+ """Request metadata: serving mode, endpoint, sampling parameters and tool definitions."""
+ if not span.is_recording():
+ return
+
+ serving_mode = getattr(details, "serving_mode", None)
+ set_span_attribute(span, GEN_AI_OCI_SERVING_MODE, getattr(serving_mode, "serving_type", None))
+ set_span_attribute(span, GEN_AI_OCI_ENDPOINT_ID, getattr(serving_mode, "endpoint_id", None))
+ set_span_attribute(span, SERVER_ADDRESS, get_server_address(instance))
+
+ request = get_inner_request(operation, details)
+ if operation in (CHAT, TEXT_COMPLETION):
+ set_span_attribute(
+ span,
+ GEN_AI_OCI_API_FORMAT,
+ _first_not_none(getattr(request, "api_format", None), getattr(request, "runtime_type", None)),
+ )
+ set_span_attribute(span, GenAIAttributes.GEN_AI_REQUEST_TEMPERATURE, getattr(request, "temperature", None))
+ set_span_attribute(span, GenAIAttributes.GEN_AI_REQUEST_TOP_P, getattr(request, "top_p", None))
+ set_span_attribute(span, GenAIAttributes.GEN_AI_REQUEST_TOP_K, getattr(request, "top_k", None))
+ set_span_attribute(
+ span,
+ GenAIAttributes.GEN_AI_REQUEST_MAX_TOKENS,
+ _first_not_none(getattr(request, "max_tokens", None), getattr(request, "max_completion_tokens", None)),
+ )
+ set_span_attribute(
+ span, GenAIAttributes.GEN_AI_REQUEST_FREQUENCY_PENALTY, getattr(request, "frequency_penalty", None)
+ )
+ set_span_attribute(
+ span, GenAIAttributes.GEN_AI_REQUEST_PRESENCE_PENALTY, getattr(request, "presence_penalty", None)
+ )
+ set_span_attribute(span, GenAIAttributes.GEN_AI_REQUEST_SEED, getattr(request, "seed", None))
+ stop = _first_not_none(getattr(request, "stop", None), getattr(request, "stop_sequences", None))
+ if stop:
+ set_span_attribute(
+ span,
+ GenAIAttributes.GEN_AI_REQUEST_STOP_SEQUENCES,
+ list(stop) if isinstance(stop, (list, tuple)) else [stop],
+ )
+ set_span_attribute(span, GenAIAttributes.GEN_AI_REQUEST_CHOICE_COUNT, getattr(request, "num_generations", None))
+ set_span_attribute(span, SpanAttributes.GEN_AI_IS_STREAMING, bool(getattr(request, "is_stream", False)))
+ tools = getattr(request, "tools", None)
+ if tools and should_send_prompts():
+ set_span_attribute(
+ span, GenAIAttributes.GEN_AI_TOOL_DEFINITIONS, json.dumps(model_as_dict(tools), default=str)
+ )
+ elif operation == EMBEDDINGS:
+ set_span_attribute(span, GEN_AI_OCI_EMBEDDINGS_INPUT_COUNT, len(embedding_input_parts(details)))
+ set_span_attribute(span, GEN_AI_OCI_EMBEDDINGS_INPUT_TYPE, getattr(details, "input_type", None))
+ embedding_types = getattr(details, "embedding_types", None)
+ if embedding_types:
+ set_span_attribute(span, GenAIAttributes.GEN_AI_REQUEST_ENCODING_FORMATS, list(embedding_types))
+ set_span_attribute(
+ span, GenAIAttributes.GEN_AI_EMBEDDINGS_DIMENSION_COUNT, getattr(details, "output_dimensions", None)
+ )
+ elif operation == RERANK:
+ set_span_attribute(span, GEN_AI_OCI_RERANK_TOP_N, getattr(details, "top_n", None))
+ set_span_attribute(span, GEN_AI_OCI_RERANK_DOCUMENT_COUNT, len(getattr(details, "documents", None) or []))
+
+
+@dont_throw
+def set_input_attributes(span, operation, details):
+ """Prompt content (``gen_ai.input.messages`` / ``gen_ai.system_instructions``); gated by TRACELOOP_TRACE_CONTENT."""
+ if not span.is_recording() or not should_send_prompts():
+ return
+
+ messages = []
+ if operation == CHAT:
+ messages, system_parts = chat_request_to_messages(getattr(details, "chat_request", None))
+ if system_parts:
+ set_span_attribute(span, GenAIAttributes.GEN_AI_SYSTEM_INSTRUCTIONS, json.dumps(system_parts))
+ elif operation == TEXT_COMPLETION:
+ prompt = getattr(getattr(details, "inference_request", None), "prompt", None)
+ if prompt:
+ messages = [{"role": "user", "parts": [_text_part(prompt)]}]
+ elif operation == EMBEDDINGS:
+ messages = [{"role": "user", "parts": parts} for parts in embedding_input_parts(details)]
+ elif operation == RERANK:
+ messages = [
+ {"role": "system", "parts": [_text_part(document if isinstance(document, str) else str(document))]}
+ for document in getattr(details, "documents", None) or []
+ ]
+ query = getattr(details, "input", None)
+ if query:
+ messages.append({"role": "user", "parts": [_text_part(query)]})
+
+ if messages:
+ set_span_attribute(span, GenAIAttributes.GEN_AI_INPUT_MESSAGES, json.dumps(messages))
+
+
+@dont_throw
+def set_response_attributes(span, operation, response):
+ """Response metadata (model, id, finish reasons, usage). Returns the normalised usage for metrics."""
+ if not span.is_recording():
+ return None
+ data = getattr(response, "data", None)
+ if data is None:
+ return None
+
+ set_span_attribute(span, GenAIAttributes.GEN_AI_RESPONSE_MODEL, getattr(data, "model_id", None))
+
+ if operation == CHAT:
+ chat_response = getattr(data, "chat_response", None)
+ set_span_attribute(span, GenAIAttributes.GEN_AI_RESPONSE_ID, getattr(chat_response, "id", None))
+ _set_finish_reasons(span, chat_response_to_messages(chat_response))
+ usage = usage_to_dict(getattr(chat_response, "usage", None))
+ set_usage_attributes(span, usage)
+ return usage
+
+ if operation == TEXT_COMPLETION:
+ _set_finish_reasons(span, text_completion_response_to_messages(getattr(data, "inference_response", None)))
+ return None
+
+ if operation == EMBEDDINGS:
+ set_span_attribute(span, GenAIAttributes.GEN_AI_RESPONSE_ID, getattr(data, "id", None))
+ set_span_attribute(span, GenAIAttributes.GEN_AI_EMBEDDINGS_DIMENSION_COUNT, _embedding_dimensions(data))
+ usage = usage_to_dict(getattr(data, "usage", None), include_output=False)
+ set_usage_attributes(span, usage)
+ return usage
+
+ if operation == RERANK:
+ set_span_attribute(span, GenAIAttributes.GEN_AI_RESPONSE_ID, getattr(data, "id", None))
+ return None
+
+
+def _embedding_dimensions(result):
+ embeddings = getattr(result, "embeddings", None)
+ if not embeddings:
+ by_type = getattr(result, "embeddings_by_type", None)
+ if isinstance(by_type, dict):
+ embeddings = next((vectors for vectors in by_type.values() if vectors), None)
+ if embeddings and hasattr(embeddings[0], "__len__"):
+ return len(embeddings[0])
+ return None
+
+
+@dont_throw
+def set_output_attributes(span, operation, response):
+ """Completion content (``gen_ai.output.messages``); gated by TRACELOOP_TRACE_CONTENT."""
+ if not span.is_recording() or not should_send_prompts():
+ return
+ messages = response_to_output_messages(operation, getattr(response, "data", None))
+ if messages:
+ set_span_attribute(span, GenAIAttributes.GEN_AI_OUTPUT_MESSAGES, json.dumps(messages))
+
+
+@dont_throw
+def set_streaming_response_attributes(span, accumulator):
+ """Response metadata aggregated from a consumed SSE stream. Returns the normalised usage for metrics."""
+ if not span.is_recording():
+ return None
+ set_span_attribute(span, GenAIAttributes.GEN_AI_RESPONSE_ID, accumulator.response_id)
+ _set_finish_reasons(span, stream_choices_to_messages(accumulator.choices_list()))
+ usage = usage_to_dict(accumulator.usage)
+ set_usage_attributes(span, usage)
+ return usage
+
+
+@dont_throw
+def set_streaming_output_attributes(span, accumulator):
+ if not span.is_recording() or not should_send_prompts():
+ return
+ messages = stream_choices_to_messages(accumulator.choices_list())
+ if messages:
+ set_span_attribute(span, GenAIAttributes.GEN_AI_OUTPUT_MESSAGES, json.dumps(messages))
diff --git a/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/streaming.py b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/streaming.py
new file mode 100644
index 0000000000..9b27d80315
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/streaming.py
@@ -0,0 +1,212 @@
+"""Streaming (SSE) support for OCI Generative AI ``chat`` / ``generate_text`` calls.
+
+With ``is_stream=True`` the OCI SDK returns an ``oci.response.Response`` whose ``data`` is an
+``SSEClient``; callers iterate ``response.data.events()`` and read ``event.data`` (a JSON document or the
+``[DONE]`` sentinel). Observed event payloads:
+
+GENERIC api format::
+
+ {"index": 0, "message": {"role": "ASSISTANT", "content": [{"type": "TEXT", "text": "Hello"}]}, "pad": "aaa"}
+ {"message": {...}, "finishReason": "stop", "pad": "a"}
+ {"usage": {"completionTokens": 8, "promptTokens": 41, "totalTokens": 49}, "pad": "aa"} # is_include_usage
+ [DONE]
+
+COHERE api format::
+
+ {"apiFormat": "COHERE", "text": "Hi", "pad": "aaa"}
+ {"apiFormat": "COHERE", "text": "", "chatHistory": [...], "finishReason": "COMPLETE",
+ "usage": {...}}
+"""
+
+import json
+import logging
+from contextlib import nullcontext
+
+from opentelemetry.trace import use_span
+from wrapt import ObjectProxy
+
+logger = logging.getLogger(__name__)
+
+DONE_SENTINEL = "[DONE]"
+
+
+class StreamAccumulator:
+ """Aggregates SSE event payloads into per-choice text, tool calls, finish reasons and usage."""
+
+ def __init__(self):
+ self.api_format = None
+ self.usage = None
+ self.response_id = None
+ self._choices = {}
+
+ def _choice(self, index):
+ return self._choices.setdefault(index, {"text": "", "reasoning": "", "tool_calls": {}, "finish_reason": None})
+
+ def process(self, raw):
+ if raw is None:
+ return
+ raw = raw.strip() if isinstance(raw, str) else raw
+ if not raw or raw == DONE_SENTINEL:
+ return
+ try:
+ payload = json.loads(raw)
+ except (TypeError, ValueError):
+ logger.debug("Skipping non-JSON OCI GenAI stream event: %r", raw)
+ return
+ if not isinstance(payload, dict):
+ return
+
+ if payload.get("apiFormat"):
+ self.api_format = payload["apiFormat"]
+ if isinstance(payload.get("usage"), dict):
+ self.usage = payload["usage"]
+ if payload.get("id"):
+ self.response_id = payload["id"]
+
+ message = payload.get("message")
+ if isinstance(message, dict):
+ self._process_message(payload, message)
+ elif "text" in payload:
+ self._process_text(payload)
+ elif payload.get("finishReason"):
+ self._choice(payload.get("index", 0))["finish_reason"] = payload["finishReason"]
+
+ def _process_message(self, payload, message):
+ """GENERIC / COHEREV2 shaped events: partial ``message`` objects, one per choice index."""
+ choice = self._choice(payload.get("index", 0))
+ content = message.get("content")
+ if isinstance(content, str):
+ choice["text"] += content
+ elif isinstance(content, list):
+ for part in content:
+ if not isinstance(part, dict):
+ continue
+ part_type = str(part.get("type", "TEXT") or "TEXT").upper()
+ if part_type == "TEXT" and part.get("text"):
+ choice["text"] += part["text"]
+ elif part_type == "THINKING" and part.get("thinking"):
+ choice["reasoning"] += part["thinking"]
+ if message.get("reasoningContent"):
+ choice["reasoning"] += message["reasoningContent"]
+ self._accumulate_tool_calls(choice, message.get("toolCalls"))
+ if payload.get("finishReason"):
+ choice["finish_reason"] = payload["finishReason"]
+
+ def _process_text(self, payload):
+ """COHERE shaped events: ``text`` deltas, with the terminal event carrying the full text."""
+ choice = self._choice(0)
+ text = payload.get("text") or ""
+ if payload.get("finishReason"):
+ if text and len(text) >= len(choice["text"]):
+ choice["text"] = text
+ else:
+ choice["text"] += text
+ choice["finish_reason"] = payload["finishReason"]
+ self._accumulate_tool_calls(choice, payload.get("toolCalls"))
+ else:
+ choice["text"] += text
+
+ @staticmethod
+ def _accumulate_tool_calls(choice, tool_calls):
+ if not isinstance(tool_calls, list):
+ return
+ for position, tool_call in enumerate(tool_calls):
+ if not isinstance(tool_call, dict):
+ continue
+ function = tool_call.get("function") if isinstance(tool_call.get("function"), dict) else {}
+ key = tool_call.get("id") or tool_call.get("index") or f"position-{position}"
+ entry = choice["tool_calls"].setdefault(key, {"id": tool_call.get("id"), "name": "", "arguments": ""})
+ if tool_call.get("id"):
+ entry["id"] = tool_call["id"]
+ name = tool_call.get("name") or function.get("name")
+ if name:
+ entry["name"] = name
+ arguments = tool_call.get("arguments", function.get("arguments"))
+ if arguments is None:
+ arguments = tool_call.get("parameters")
+ if isinstance(arguments, str):
+ entry["arguments"] += arguments
+ elif arguments is not None:
+ entry["arguments"] = arguments
+
+ def choices_list(self):
+ """Choices ordered by index, with tool calls flattened to a list."""
+ choices = []
+ for index in sorted(self._choices):
+ choice = self._choices[index]
+ choices.append(
+ {
+ "index": index,
+ "text": choice["text"],
+ "reasoning": choice["reasoning"],
+ "tool_calls": list(choice["tool_calls"].values()),
+ "finish_reason": choice["finish_reason"],
+ }
+ )
+ return choices
+
+
+class OCIGenAIStreamWrapper(ObjectProxy):
+ """Proxy around the SDK's ``SSEClient`` that feeds events to the accumulator and finishes the span.
+
+ ``on_done(accumulator, error, complete)`` is invoked exactly once: with ``complete=True`` when the stream was
+ consumed to the end, with the exception when iteration failed, and with ``complete=False`` when the caller
+ stopped early (``close()`` or leaving the ``events()`` loop before exhaustion).
+ """
+
+ def __init__(self, wrapped, accumulator, on_done, span=None):
+ super().__init__(wrapped)
+ self._self_accumulator = accumulator
+ self._self_on_done = on_done
+ self._self_span = span
+ self._self_done = False
+
+ def _span_scope(self):
+ """Make the client span current while the SDK stream is read; never held across a ``yield``."""
+ if self._self_span is None:
+ return nullcontext()
+ # Stream errors are recorded once by ``on_done``; keep ``use_span`` from recording them a second time.
+ return use_span(self._self_span, end_on_exit=False, record_exception=False, set_status_on_exception=False)
+
+ def events(self):
+ try:
+ iterator = self.__wrapped__.events()
+ while True:
+ with self._span_scope():
+ try:
+ event = next(iterator)
+ except StopIteration:
+ break
+ self._self_accumulator.process(getattr(event, "data", None))
+ yield event
+ except Exception as error:
+ self._finish(error, complete=False)
+ raise
+ except BaseException:
+ # ``GeneratorExit`` (the caller left the loop), ``KeyboardInterrupt``...: partial, not successful. The
+ # caller is done with the stream, so release the SDK's event source instead of waiting for GC.
+ self._finish(None, complete=False)
+ self._close_wrapped()
+ raise
+ else:
+ self._finish(None, complete=True)
+
+ def close(self):
+ """Close the underlying SSE stream; finishes the span as incomplete unless it was already consumed."""
+ try:
+ return self.__wrapped__.close()
+ finally:
+ self._finish(None, complete=False)
+
+ def _close_wrapped(self):
+ """Best-effort close of the SDK's ``SSEClient``; never masks the exception being propagated."""
+ try:
+ self.__wrapped__.close()
+ except Exception as error:
+ logger.debug("Failed to close the OCI GenAI SSE stream after cancellation: %s", error)
+
+ def _finish(self, error, complete=True):
+ if self._self_done:
+ return
+ self._self_done = True
+ self._self_on_done(self._self_accumulator, error, complete)
diff --git a/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/utils.py b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/utils.py
new file mode 100644
index 0000000000..8415f4c8f9
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/utils.py
@@ -0,0 +1,85 @@
+import logging
+import os
+import re
+import traceback
+from urllib.parse import urlparse
+
+from opentelemetry import context as context_api
+from opentelemetry.instrumentation.oci_genai.config import Config
+
+TRACELOOP_TRACE_CONTENT = "TRACELOOP_TRACE_CONTENT"
+
+# The OCI SDK keeps unresolved realm/dual-stack placeholders such as ``{dualStack?ds.:}`` in
+# ``base_client.endpoint`` until the request is actually built; strip them for ``server.address``.
+_ENDPOINT_TEMPLATE_RE = re.compile(r"\{[^}]*\}")
+
+
+def set_span_attribute(span, name, value):
+ if value is not None and value != "":
+ span.set_attribute(name, value)
+
+
+def should_send_prompts():
+ return (os.getenv(TRACELOOP_TRACE_CONTENT) or "true").lower() == "true" or context_api.get_value(
+ "override_enable_content_tracing"
+ )
+
+
+def dont_throw(func):
+ """
+ A decorator that wraps the passed in function and logs exceptions instead of throwing them.
+
+ @param func: The function to wrap
+ @return: The wrapper function
+ """
+ # Obtain a logger specific to the function's module
+ logger = logging.getLogger(func.__module__)
+
+ def wrapper(*args, **kwargs):
+ try:
+ return func(*args, **kwargs)
+ except Exception as e:
+ logger.debug(
+ "OpenLLMetry failed to trace in %s, error: %s",
+ func.__name__,
+ traceback.format_exc(),
+ )
+ if Config.exception_logger:
+ Config.exception_logger(e)
+
+ return wrapper
+
+
+def should_emit_events() -> bool:
+ """
+ Checks if the instrumentation isn't using the legacy attributes
+ and if the event logger is not None.
+ """
+
+ return not Config.use_legacy_attributes
+
+
+def model_as_dict(model):
+ """Convert an OCI SDK model (or a container of models) into plain Python data."""
+ if model is None or isinstance(model, (str, int, float, bool)):
+ return model
+ if isinstance(model, dict):
+ return {key: model_as_dict(value) for key, value in model.items()}
+ if isinstance(model, (list, tuple)):
+ return [model_as_dict(item) for item in model]
+ try:
+ from oci.util import to_dict
+
+ return to_dict(model)
+ except Exception:
+ return getattr(model, "__dict__", str(model))
+
+
+def get_server_address(instance):
+ """Return the hostname of the OCI GenAI inference endpoint used by ``instance``."""
+ endpoint = getattr(getattr(instance, "base_client", None), "endpoint", None)
+ if not isinstance(endpoint, str) or not endpoint:
+ return None
+ endpoint = _ENDPOINT_TEMPLATE_RE.sub("", endpoint)
+ parsed = urlparse(endpoint if "://" in endpoint else f"https://{endpoint}")
+ return parsed.hostname
diff --git a/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/version.py b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/version.py
new file mode 100644
index 0000000000..6475ab9c9f
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai/version.py
@@ -0,0 +1 @@
+__version__ = "0.62.3"
diff --git a/packages/opentelemetry-instrumentation-oci-genai/poetry.toml b/packages/opentelemetry-instrumentation-oci-genai/poetry.toml
new file mode 100644
index 0000000000..ab1033bd37
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/poetry.toml
@@ -0,0 +1,2 @@
+[virtualenvs]
+in-project = true
diff --git a/packages/opentelemetry-instrumentation-oci-genai/project.json b/packages/opentelemetry-instrumentation-oci-genai/project.json
new file mode 100644
index 0000000000..d54bbbda24
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/project.json
@@ -0,0 +1,77 @@
+{
+ "name": "opentelemetry-instrumentation-oci-genai",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "projectType": "library",
+ "sourceRoot": "packages/opentelemetry-instrumentation-oci-genai/opentelemetry/instrumentation/oci_genai",
+ "targets": {
+ "lock": {
+ "executor": "nx:run-commands",
+ "options": {
+ "command": "uv lock",
+ "cwd": "packages/opentelemetry-instrumentation-oci-genai"
+ }
+ },
+ "add": {
+ "executor": "@nxlv/python:add",
+ "options": {}
+ },
+ "update": {
+ "executor": "@nxlv/python:update",
+ "options": {}
+ },
+ "remove": {
+ "executor": "@nxlv/python:remove",
+ "options": {}
+ },
+ "build": {
+ "executor": "@nxlv/python:build",
+ "outputs": [
+ "{projectRoot}/dist"
+ ],
+ "options": {
+ "outputPath": "packages/opentelemetry-instrumentation-oci-genai/dist",
+ "publish": false,
+ "lockedVersions": true,
+ "bundleLocalDependencies": true
+ }
+ },
+ "install": {
+ "executor": "nx:run-commands",
+ "options": {
+ "command": "uv sync --all-groups",
+ "cwd": "packages/opentelemetry-instrumentation-oci-genai"
+ }
+ },
+ "lint": {
+ "executor": "nx:run-commands",
+ "options": {
+ "command": "uv run ruff check .",
+ "cwd": "packages/opentelemetry-instrumentation-oci-genai"
+ }
+ },
+ "test": {
+ "executor": "nx:run-commands",
+ "outputs": [
+ "{workspaceRoot}/reports/packages/opentelemetry-instrumentation-oci-genai/unittests",
+ "{workspaceRoot}/coverage/packages/opentelemetry-instrumentation-oci-genai"
+ ],
+ "options": {
+ "command": "uv run pytest tests/",
+ "cwd": "packages/opentelemetry-instrumentation-oci-genai"
+ }
+ },
+ "build-release": {
+ "executor": "nx:run-commands",
+ "options": {
+ "commands": [
+ "chmod +x ../../scripts/build-release.sh",
+ "../../scripts/build-release.sh"
+ ],
+ "cwd": "packages/opentelemetry-instrumentation-oci-genai"
+ }
+ }
+ },
+ "tags": [
+ "instrumentation"
+ ]
+}
diff --git a/packages/opentelemetry-instrumentation-oci-genai/pyproject.toml b/packages/opentelemetry-instrumentation-oci-genai/pyproject.toml
new file mode 100644
index 0000000000..6af931b90d
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/pyproject.toml
@@ -0,0 +1,73 @@
+[project]
+name = "opentelemetry-instrumentation-oci-genai"
+version = "0.62.3"
+description = "OpenTelemetry OCI Generative AI instrumentation"
+authors = [
+ { name = "Federico Kamelhar", email = "federico.kamelhar@oracle.com" },
+]
+license = "Apache-2.0"
+readme = "README.md"
+requires-python = ">=3.10,<4"
+dependencies = [
+ "opentelemetry-api>=1.38.0,<2",
+ "opentelemetry-instrumentation>=0.59b0",
+ "opentelemetry-semantic-conventions-ai>=0.5.1,<0.6.0",
+ "opentelemetry-semantic-conventions>=0.63b1",
+]
+
+[project.urls]
+Repository = "https://github.com/traceloop/openllmetry/tree/main/packages/opentelemetry-instrumentation-oci-genai"
+
+[project.optional-dependencies]
+instruments = ["oci"]
+
+[project.entry-points."opentelemetry_instrumentor"]
+oci = "opentelemetry.instrumentation.oci_genai:OCIGenAIInstrumentor"
+
+[dependency-groups]
+dev = [
+ "autopep8>=2.2.0,<3",
+ "pytest-sugar==1.0.0",
+ "pytest>=8.2.2,<9",
+ "ruff>=0.4.0",
+]
+test = [
+ "oci>=2.121.1,<3",
+ "opentelemetry-sdk>=1.38.0,<2",
+ "pytest-recording>=0.13.1,<0.14.0",
+ "pytest-sugar==1.0.0",
+ "pytest>=8.2.2,<9",
+ "vcrpy>=8.0.0,<9",
+]
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.hatch.build.targets.wheel]
+packages = ["opentelemetry"]
+
+[tool.coverage.run]
+branch = true
+source = ["opentelemetry/instrumentation/oci_genai"]
+
+[tool.coverage.report]
+exclude_lines = ["if TYPE_CHECKING:"]
+show_missing = true
+
+[tool.ruff]
+line-length = 120
+exclude = [
+ ".git",
+ "__pycache__",
+ "build",
+ "dist",
+ ".venv",
+ ".pytest_cache",
+]
+
+[tool.ruff.lint]
+select = ["E", "F", "W"]
+
+[tool.uv]
+constraint-dependencies = ["urllib3>=2.6.3", "pip>=25.3"]
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/__init__.py b/packages/opentelemetry-instrumentation-oci-genai/tests/__init__.py
new file mode 100644
index 0000000000..33248208eb
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/__init__.py
@@ -0,0 +1,62 @@
+"""unit tests."""
+
+from opentelemetry.sdk._logs import ReadableLogRecord
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+
+from opentelemetry.instrumentation.oci_genai.span_utils import OCI_GENAI_PROVIDER
+
+VALID_OTEL_FINISH_REASONS = {"stop", "tool_call", "length", "content_filter", "error"}
+VALID_OTEL_PART_TYPES = {"text", "tool_call", "tool_call_response", "blob", "uri", "reasoning"}
+
+
+def assert_message_in_logs(log: ReadableLogRecord, event_name: str, expected_content: dict):
+ """Shared helper: validate an emitted OTel GenAI event log record."""
+ assert log.log_record.event_name == event_name
+ assert log.log_record.attributes.get(GenAIAttributes.GEN_AI_PROVIDER_NAME) == OCI_GENAI_PROVIDER
+
+ if not expected_content:
+ assert not log.log_record.body
+ else:
+ assert log.log_record.body
+ assert dict(log.log_record.body) == expected_content
+
+
+def assert_valid_parts(parts, context=""):
+ """Assert every part has a valid OTel type and required fields."""
+ assert isinstance(parts, list), f"{context}: parts must be a list, got {type(parts)}"
+ for i, part in enumerate(parts):
+ assert isinstance(part, dict), f"{context}: part[{i}] must be a dict"
+ assert "type" in part, f"{context}: part[{i}] missing 'type' key: {part}"
+ ptype = part["type"]
+ assert ptype in VALID_OTEL_PART_TYPES, (
+ f"{context}: part[{i}] has invalid type '{ptype}'. Must be one of {VALID_OTEL_PART_TYPES}. Got: {part}"
+ )
+ if ptype == "text":
+ assert "content" in part, f"{context}: text part[{i}] missing 'content'"
+ elif ptype == "tool_call":
+ assert "name" in part, f"{context}: tool_call part[{i}] missing 'name'"
+ assert "arguments" in part, f"{context}: tool_call part[{i}] missing 'arguments'"
+ elif ptype == "tool_call_response":
+ assert "id" in part, f"{context}: tool_call_response part[{i}] missing 'id'"
+ elif ptype == "blob":
+ assert "mime_type" in part, f"{context}: blob part[{i}] missing 'mime_type'"
+ assert "modality" in part, f"{context}: blob part[{i}] missing 'modality'"
+ elif ptype == "uri":
+ assert "uri" in part, f"{context}: uri part[{i}] missing 'uri'"
+ elif ptype == "reasoning":
+ assert "content" in part, f"{context}: reasoning part[{i}] missing 'content'"
+
+
+def assert_valid_output_message(msg, context=""):
+ """Assert an output message has role, valid parts, and valid finish_reason."""
+ assert isinstance(msg, dict), f"{context}: message must be a dict"
+ assert "role" in msg, f"{context}: message missing 'role'"
+ assert "parts" in msg, f"{context}: message missing 'parts'"
+ assert "finish_reason" in msg, f"{context}: message missing 'finish_reason'"
+ assert_valid_parts(msg["parts"], context)
+ if msg["finish_reason"]:
+ assert msg["finish_reason"] in VALID_OTEL_FINISH_REASONS, (
+ f"{context}: invalid finish_reason '{msg['finish_reason']}'. Must be one of {VALID_OTEL_FINISH_REASONS}"
+ )
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_legacy.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_legacy.yaml
new file mode 100644
index 0000000000..d8bd2ac668
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_legacy.yaml
@@ -0,0 +1,42 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "cohere.command-a-03-2025"}, "chatRequest": {"apiFormat":
+ "COHERE", "message": "Tell me a joke about opentelemetry", "chatHistory": [{"role":
+ "USER", "message": "Hello"}, {"role": "CHATBOT", "message": "Hi! How can I help?"}],
+ "preambleOverride": "You are a terse assistant.", "maxTokens": 100, "temperature":
+ 0.3, "topP": 0.8, "seed": 42, "stopSequences": ["END"]}}'
+ headers:
+ Content-Length:
+ - '526'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: '{"modelId":"cohere.command-a-03-2025","modelVersion":"1.0","chatResponse":{"apiFormat":"COHERE","text":"Why
+ did the OpenTelemetry span cross the road?\n\nTo trace the other side.<|","chatHistory":[{"role":"USER","message":"Hello"},{"role":"CHATBOT","message":"Hi!
+ How can I help?"},{"role":"USER","message":"Tell me a joke about opentelemetry"},{"role":"CHATBOT","message":"Why
+ did the OpenTelemetry span cross the road?\n\nTo trace the other side.<|"}],"finishReason":null,"usage":{"completionTokens":19,"promptTokens":22,"totalTokens":41}}}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:47:08 GMT
+ content-length:
+ - '542'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_streaming.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_streaming.yaml
new file mode 100644
index 0000000000..916509cabb
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_streaming.yaml
@@ -0,0 +1,97 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "cohere.command-a-03-2025"}, "chatRequest": {"apiFormat":
+ "COHERE", "message": "Tell me a joke about opentelemetry", "chatHistory": [{"role":
+ "USER", "message": "Hello"}, {"role": "CHATBOT", "message": "Hi! How can I help?"}],
+ "preambleOverride": "You are a terse assistant.", "isStream": true, "streamOptions":
+ {"isIncludeUsage": true}, "maxTokens": 100, "temperature": 0.3}}'
+ headers:
+ Content-Length:
+ - '536'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: 'data: {"apiFormat":"COHERE","text":"Why","pad":"aaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" did","pad":"aaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" the","pad":"aaaaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" Open","pad":"aaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":"Telemetry","pad":"aaaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" span","pad":"aaaaaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" cross","pad":"aaaaaaaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" the","pad":"aaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" road","pad":"aaaaaaaaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":"?","pad":"aaaaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":"\n\nTo","pad":"aaaaaaaaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" trace","pad":"aaaaaaaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" the","pad":"aaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" other","pad":"aaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":" side","pad":"aaaaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":".","pad":"aaaa"}
+
+
+ data: {"apiFormat":"COHERE","text":"Why did the OpenTelemetry span cross the
+ road?\n\nTo trace the other side.","chatHistory":[{"role":"USER","message":"Hello"},{"role":"CHATBOT","message":"Hi!
+ How can I help?"},{"role":"USER","message":"Tell me a joke about opentelemetry"},{"role":"CHATBOT","message":"Why
+ did the OpenTelemetry span cross the road?\n\nTo trace the other side."}],"finishReason":"COMPLETE","pad":"aaaaaaaaaaa","usage":{"completionTokens":18,"promptTokens":22,"totalTokens":40}}
+
+
+ '
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - text/event-stream
+ Date:
+ - Fri, 18 Sep 2026 19:47:09 GMT
+ Transfer-Encoding:
+ - chunked
+ cache-control:
+ - no-cache
+ content-length:
+ - '1471'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_with_events_with_content.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_with_events_with_content.yaml
new file mode 100644
index 0000000000..8311d2f7f4
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_cohere_chat_with_events_with_content.yaml
@@ -0,0 +1,41 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "cohere.command-a-03-2025"}, "chatRequest": {"apiFormat":
+ "COHERE", "message": "Tell me a joke about opentelemetry", "chatHistory": [{"role":
+ "USER", "message": "Hello"}, {"role": "CHATBOT", "message": "Hi! How can I help?"}],
+ "preambleOverride": "You are a terse assistant.", "maxTokens": 100}}'
+ headers:
+ Content-Length:
+ - '455'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: '{"modelId":"cohere.command-a-03-2025","modelVersion":"1.0","chatResponse":{"apiFormat":"COHERE","text":"Why
+ did the OpenTelemetry span cross the road?\n\nTo trace the other side.","chatHistory":[{"role":"USER","message":"Hello"},{"role":"CHATBOT","message":"Hi!
+ How can I help?"},{"role":"USER","message":"Tell me a joke about opentelemetry"},{"role":"CHATBOT","message":"Why
+ did the OpenTelemetry span cross the road?\n\nTo trace the other side."}],"finishReason":"COMPLETE","usage":{"completionTokens":18,"promptTokens":22,"totalTokens":40}}}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:47:12 GMT
+ content-length:
+ - '544'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_legacy.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_legacy.yaml
new file mode 100644
index 0000000000..61b85d4614
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_legacy.yaml
@@ -0,0 +1,40 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "meta.llama-3.3-70b-instruct"}, "chatRequest": {"apiFormat":
+ "GENERIC", "messages": [{"role": "USER", "content": [{"type": "TEXT", "text":
+ "Tell me a joke about opentelemetry"}]}], "topK": 40, "topP": 0.9, "temperature":
+ 0.2, "frequencyPenalty": 0.1, "maxTokens": 100}}'
+ headers:
+ Content-Length:
+ - '429'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: '{"modelId":"meta.llama-3.3-70b-instruct","modelVersion":"1.0.0","chatResponse":{"apiFormat":"GENERIC","timeCreated":"2026-09-18T19:46:59.025Z","choices":[{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Why
+ did the OpenTelemetry span go to therapy?\n\nBecause it was struggling to
+ \"trace\" its roots and was feeling a little \"distributed\"! (get it?)"}],"toolCalls":[]},"finishReason":"stop","logprobs":{}}],"usage":{"completionTokens":35,"promptTokens":43,"totalTokens":78}}}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:46:59 GMT
+ content-length:
+ - '504'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_streaming.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_streaming.yaml
new file mode 100644
index 0000000000..72cfb8a74d
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_streaming.yaml
@@ -0,0 +1,172 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "meta.llama-3.3-70b-instruct"}, "chatRequest": {"apiFormat":
+ "GENERIC", "messages": [{"role": "USER", "content": [{"type": "TEXT", "text":
+ "Tell me a joke about opentelemetry"}]}], "isStream": true, "streamOptions":
+ {"isIncludeUsage": true}, "temperature": 0.2, "maxTokens": 100}}'
+ headers:
+ Content-Length:
+ - '440'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: 'data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":""}]},"pad":"aaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Why"}]},"pad":"aaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ did"}]},"pad":"aaaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ the"}]},"pad":"aaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ Open"}]},"pad":"a"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Te"}]},"pad":"aaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"lemetry"}]},"pad":"aaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ span"}]},"pad":"aa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ go"}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ to"}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ therapy"}]},"pad":"aaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"?\n\n"}]},"pad":"aaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Because"}]},"pad":"aaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ it"}]},"pad":"aaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ was"}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ struggling"}]},"pad":"aaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ to"}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ trace"}]},"pad":"aa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ its"}]},"pad":"aaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ roots"}]},"pad":"aaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ and"}]},"pad":"aaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ was"}]},"pad":"aaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ feeling"}]},"pad":"aaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ a"}]},"pad":"aaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ little"}]},"pad":"aaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ \""}]},"pad":"aaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"distributed"}]},"pad":"aaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"\""}]},"pad":"aa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"!"}]},"pad":"aaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ ("}]},"pad":"aaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"get"}]},"pad":"a"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ it"}]},"pad":"aaaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"?)"}]},"pad":"a"}
+
+
+ data: {"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":""}]},"finishReason":"stop","pad":"aaaaaaaaaaa"}
+
+
+ data: {"usage":{"completionTokens":33,"promptTokens":43,"totalTokens":76},"pad":"aaaaaa"}
+
+
+ data: [DONE]
+
+
+ '
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - text/event-stream
+ Date:
+ - Fri, 18 Sep 2026 19:46:59 GMT
+ Transfer-Encoding:
+ - chunked
+ cache-control:
+ - no-cache
+ content-length:
+ - '3777'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_streaming_with_events_with_content.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_streaming_with_events_with_content.yaml
new file mode 100644
index 0000000000..69985399a2
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_streaming_with_events_with_content.yaml
@@ -0,0 +1,174 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "meta.llama-3.3-70b-instruct"}, "chatRequest": {"apiFormat":
+ "GENERIC", "messages": [{"role": "USER", "content": [{"type": "TEXT", "text":
+ "Tell me a joke about opentelemetry"}]}], "isStream": true, "maxTokens": 100}}'
+ headers:
+ Content-Length:
+ - '377'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: 'data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":""}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Why"}]},"pad":"aaaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ did"}]},"pad":"aaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ the"}]},"pad":"aaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ Open"}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Te"}]},"pad":"aaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"lemetry"}]},"pad":"aaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ span"}]},"pad":"aaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ go"}]},"pad":"a"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ to"}]},"pad":"aaaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ therapy"}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"?\n\n"}]},"pad":"aaaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Because"}]},"pad":"aaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ it"}]},"pad":"aaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ was"}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ struggling"}]},"pad":"aaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ to"}]},"pad":"aaaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ \""}]},"pad":"aa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"trace"}]},"pad":"aaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"\""}]},"pad":"aaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ its"}]},"pad":"aaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ roots"}]},"pad":"aaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ and"}]},"pad":"aaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ was"}]},"pad":"aaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ feeling"}]},"pad":"aaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ a"}]},"pad":"aaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ little"}]},"pad":"aaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ \""}]},"pad":"aaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"distributed"}]},"pad":"aaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"\""}]},"pad":"aaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"!"}]},"pad":"a"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ ("}]},"pad":"a"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"get"}]},"pad":"aaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"
+ it"}]},"pad":"aaaaaaaaaaa"}
+
+
+ data: {"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"?)"}]},"pad":"aaaaaaaaaaa"}
+
+
+ data: {"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":""}]},"finishReason":"stop","pad":"aaaa"}
+
+
+ data: [DONE]
+
+
+ '
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - text/event-stream
+ Date:
+ - Fri, 18 Sep 2026 19:47:03 GMT
+ Transfer-Encoding:
+ - chunked
+ cache-control:
+ - no-cache
+ content-length:
+ - '3909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_with_events_with_content.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_with_events_with_content.yaml
new file mode 100644
index 0000000000..91f26307f6
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_with_events_with_content.yaml
@@ -0,0 +1,39 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "meta.llama-3.3-70b-instruct"}, "chatRequest": {"apiFormat":
+ "GENERIC", "messages": [{"role": "USER", "content": [{"type": "TEXT", "text":
+ "Tell me a joke about opentelemetry"}]}], "maxTokens": 100}}'
+ headers:
+ Content-Length:
+ - '359'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: '{"modelId":"meta.llama-3.3-70b-instruct","modelVersion":"1.0.0","chatResponse":{"apiFormat":"GENERIC","timeCreated":"2026-09-18T19:47:02.791Z","choices":[{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Why
+ did the OpenTelemetry span go to therapy?\n\nBecause it had a lot of \"baggage\"
+ and was struggling to \"trace\" its problems! (get it? like distributed tracing?)"}],"toolCalls":[]},"finishReason":"stop","logprobs":{}}],"usage":{"completionTokens":40,"promptTokens":43,"totalTokens":83}}}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:47:02 GMT
+ content-length:
+ - '521'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_with_events_with_no_content.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_with_events_with_no_content.yaml
new file mode 100644
index 0000000000..3c1532dc8d
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_generic_chat_with_events_with_no_content.yaml
@@ -0,0 +1,39 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "meta.llama-3.3-70b-instruct"}, "chatRequest": {"apiFormat":
+ "GENERIC", "messages": [{"role": "USER", "content": [{"type": "TEXT", "text":
+ "Tell me a joke about opentelemetry"}]}], "maxTokens": 100}}'
+ headers:
+ Content-Length:
+ - '359'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: '{"modelId":"meta.llama-3.3-70b-instruct","modelVersion":"1.0.0","chatResponse":{"apiFormat":"GENERIC","timeCreated":"2026-09-18T19:47:03.457Z","choices":[{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Why
+ did the OpenTelemetry span go to therapy?\n\nBecause it was struggling to
+ trace its issues! (get it?)"}],"toolCalls":[]},"finishReason":"stop","logprobs":{}}],"usage":{"completionTokens":25,"promptTokens":43,"totalTokens":68}}}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:47:03 GMT
+ content-length:
+ - '460'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_openai_generic_chat_legacy.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_openai_generic_chat_legacy.yaml
new file mode 100644
index 0000000000..9ea1465d2b
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_chat/test_openai_generic_chat_legacy.yaml
@@ -0,0 +1,41 @@
+interactions:
+- request:
+ body: '{"compartmentId": "ocid1.compartment.oc1..redacted", "servingMode": {"servingType":
+ "ON_DEMAND", "modelId": "openai.gpt-5.4"}, "chatRequest": {"apiFormat": "GENERIC",
+ "messages": [{"role": "SYSTEM", "content": [{"type": "TEXT", "text": "You are
+ a terse assistant."}]}, {"role": "USER", "content": [{"type": "TEXT", "text":
+ "Tell me a joke about opentelemetry"}]}], "maxCompletionTokens": 120}}'
+ headers:
+ Content-Length:
+ - '445'
+ accept:
+ - application/json, text/event-stream
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
+ response:
+ body:
+ string: "{\"modelId\":\"openai.gpt-5.4\",\"modelVersion\":\"1.0.0\",\"chatResponse\":{\"apiFormat\":\"GENERIC\",\"timeCreated\":\"2026-09-18T19:47:07.230Z\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"ASSISTANT\",\"content\":[{\"type\":\"TEXT\",\"text\":\"Why
+ did the OpenTelemetry engineer break up with their partner?\\n\\nBecause every
+ time they asked, \u201CHow are we doing?\u201D the answer was, \u201CIt depends
+ on your sampling rate.\u201D\"}],\"annotations\":[]},\"finishReason\":\"stop\",\"logprobs\":{}}],\"usage\":{\"completionTokens\":39,\"promptTokens\":25,\"totalTokens\":64,\"completionTokensDetails\":{\"acceptedPredictionTokens\":0,\"reasoningTokens\":0},\"promptTokensDetails\":{\"cachedTokens\":0}},\"serviceTier\":\"DEFAULT\"}}"
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:47:07 GMT
+ content-length:
+ - '663'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_embeddings/test_embed_text_legacy.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_embeddings/test_embed_text_legacy.yaml
new file mode 100644
index 0000000000..ad863f4993
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_embeddings/test_embed_text_legacy.yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: '{"inputs": ["OpenTelemetry is an observability framework", "OCI Generative
+ AI serves Cohere embeddings"], "servingMode": {"servingType": "ON_DEMAND", "modelId":
+ "cohere.embed-v4.0"}, "compartmentId": "ocid1.compartment.oc1..redacted", "truncate":
+ "END", "inputType": "SEARCH_DOCUMENT"}'
+ headers:
+ Content-Length:
+ - '337'
+ accept:
+ - application/json
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText
+ response:
+ body:
+ string: '{"id":"REDACTED/REDACTED/REDACTED","embeddings":[[0.009473139,-0.010914704,-0.011738455,-0.014141062,0.037892558,0.006315426,-0.049425073,-0.016131794,0.021142948,0.013660541,0.018397111,0.016269086,-0.044482566,-0.0010425601,0.0031748745,0.0033979737,-0.019220863,0.039265476,0.0011154965,-0.00844345,0.023065034,0.007756991,0.02045649,-0.02045649,0.0057319356,-0.0016131795,-8.4949343E-4,-0.010708766,0.04475715,0.027732957,0.0072078235,0.04915049,0.03734339,-0.0013900802,-0.04338423,0.028968586,0.024849828,-0.03322463,-0.009679077,0.027732957,0.02128024,-0.032950047,-0.0085807415,-0.011395225,0.073588446,0.03954006,-0.048052154,0.033361923,0.013866479,-0.029655045,0.03075338,0.021417532,-0.008855326,-0.043109648,0.010914704,0.0017161483,0.004118756,0.01908357,0.0025742226,0.038441725,-0.027321082,-0.020181905,-0.0035352656,0.028556708,0.013454603,0.03322463,0.02567358,0.028282125,-0.02498712,-0.0041702404,-0.015170752,0.013591895,-0.022378575,0.037068807,0.018397111,-0.0067959474,-0.018397111,0.00624678,0.0010382697,-0.0029517752,0.037068807,6.4355566E-4,0.023339618,-0.0065900097,-0.0059378734,-0.026085455,-0.007619699,0.024437953,-0.042285897,-0.032126296,-0.0055946438,0.040638395,-0.068920515,-0.0439334,0.005388706,0.0031405515,-0.009473139,0.03075338,0.0036210732,-0.0034494582,-0.0069675623,-0.001098335,-0.0025055767,-0.02279045,0.012630852,0.038990892,-0.04036381,-0.06068301,-0.038990892,-0.02718379,0.005251414,-0.009747723,0.02128024,-0.048052154,-0.008065897,-0.009747723,-4.0758523E-4,0.002059378,-0.03597047,-0.02498712,-0.013523249,-0.001132658,-0.012356268,0.010022307,0.005560321,-0.031851713,0.034734845,0.022241283,-0.020181905,-0.020593781,-0.04777757,-0.0036210732,0.017847944,-0.031851713,-0.029380461,-0.047502987,-0.016818253,0.012218976,0.03006692,-0.018808987,0.014415647,-0.008923972,0.029929629,0.002265316,0.03226359,0.012562206,0.028968586,0.009198556,0.028144833,0.0027115145,-0.0065213637,0.050523408,0.0102968905,-0.01757336,0.002728676,-0.007036208,0.0094044935,0.025810871,0.0016904061,-0.026360039,0.026909206,-0.01503346,0.0011154965,0.00844345,-0.014621585,-0.06233051,0.026085455,-0.004461986,0.004307532,0.017710652,-0.025124412,0.03597047,-0.009267202,0.02924317,0.024437953,-0.008718034,-0.029380461,0.040089227,-0.011601163,0.010571474,0.028968586,-0.031027963,0.029655045,0.0016646639,0.008992618,-0.004118756,0.010571474,-0.0028831293,-0.0012699498,0.025536288,0.042285897,0.029929629,-0.01249356,-0.013797833,0.0036210732,-0.035695888,-0.042285897,-0.015788564,0.009541785,-0.0058349045,0.022927742,0.00439334,-0.03006692,5.384415E-4,-0.0168869,5.4635193E-6,-0.05079799,0.009267202,-0.013866479,0.014621585,-0.0439334,-0.034872137,0.022515867,0.0130427275,0.0066586556,-0.017024191,0.027870249,0.03322463,0.06068301,0.017985236,-0.027732957,-0.023339618,0.002299639,0.023888785,-0.028831294,-0.05134716,-0.022378575,-0.018534403,-0.03597047,0.026360039,0.0102968905,0.019358154,0.01098335,0.035695888,-0.030478796,0.023614202,0.0017333098,0.005560321,-0.06535093,-0.00312339,-0.052445494,-0.010022307,0.04997424,0.028831294,0.0068989163,0.009335848,0.007859959,0.0036210732,-0.027458373,0.0019478285,0.016269086,-0.004015787,0.020181905,0.0057319356,0.01064012,0.01249356,0.01908357,-0.0043418556,0.054916747,0.028282125,0.03954006,0.004427663,0.003054744,8.0229936E-4,0.01908357,-0.019495446,-0.014415647,-0.06946969,0.02347691,-0.018946279,-0.02498712,0.04173673,-0.003947141,-0.0073451153,-0.0073451153,0.021692116,-0.023614202,-0.015582628,-0.005525998,-0.026360039,-0.036794223,1.521741E-5,0.015582628,0.031027963,0.007859959,-0.0042903707,0.014484293,-0.02718379,-6.521364E-4,0.014415647,0.03651964,0.0019478285,-0.014484293,0.0049425075,-0.034734845,-0.004015787,0.010571474,-0.007756991,-0.018671695,0.0011498195,0.05656425,-0.004599278,0.015582628,-0.029929629,-0.018122528,0.015170752,0.03226359,0.023888785,-0.029929629,0.008923972,0.017367423,0.0058005815,0.052445494,0.026771914,0.030478796,0.0018706018,-0.04256048,-0.012424914,-0.01503346,0.046679236,-0.0017333098,-0.03075338,0.028968586,0.029655045,0.04997424,-0.018397111,-0.009679077,0.014964814,-0.021692116,-0.037068807,-0.036794223,-0.009747723,0.0059721963,-0.021554824,-0.018946279,-0.039265476,0.001561695,0.048601322,0.028968586,0.009061264,-0.004256048,-0.017710652,0.014072416,5.4487714E-4,-0.0065900097,0.03322463,0.009061264,-0.040638395,-0.0065213637,0.010708766,-0.018397111,-0.03734339,-0.023065034,0.013248665,0.048875906,-0.0048052156,-0.014484293,0.019358154,-0.007791314,-0.004221725,0.051896326,0.002230993,-0.01757336,0.0020851202,0.018122528,0.001295692,0.017024191,0.032675464,-0.0010425601,0.004667924,-0.023202326,-0.04256048,0.018534403,0.017847944,-0.0056976127,-0.007688345,-0.03597047,0.034734845,0.03651964,-0.028282125,-0.007413761,-0.025398996,0.024437953,-0.008615064,0.03322463,0.020731073,0.0040329485,-0.057662588,-0.034322966,0.03954006,0.063703425,0.021829408,0.0102968905,-0.05793717,0.0048738616,0.021417532,0.0051484453,0.02718379,-0.035421304,0.01908357,-0.003895657,-0.017024191,0.020731073,-0.028968586,0.021142948,-0.036794223,-0.001098335,-0.035695888,-0.011395225,0.006349749,0.013180019,-0.00878668,-0.03075338,0.02718379,0.0042045633,0.0027801604,-0.009816369,6.703704E-5,-0.0019049247,-0.014827522,0.0011841424,-0.03514672,0.027321082,0.02347691,5.019734E-4,-0.018397111,0.0168869,-0.018122528,0.010708766,0.06452718,-0.019907322,0.018946279,-0.0017676328,0.002299639,0.0019735706,0.0073451153,-0.06013384,-0.015239398,0.020044614,-0.03006692,-0.051896326,0.022241283,-0.020868365,0.03514672,-5.66329E-4,-0.027046498,-0.03226359,0.03597047,-0.014827522,0.04256048,0.044207983,-0.00751673,-0.017847944,-0.022241283,-0.02045649,0.02924317,-0.015788564,-0.0047708927,-0.019632738,-0.08072762,0.024437953,0.037892558,-0.037068807,0.0014587261,-0.023751494,-0.0042903707,-0.013866479,-0.013660541,0.005354383,0.028282125,0.019632738,0.06535093,-0.013591895,-0.075785115,-0.0024197693,0.03651964,-0.018946279,0.004359017,-0.035695888,0.065900095,0.05436758,0.03226359,0.0072421464,-0.042011313,8.419853E-5,-0.022241283,-0.02045649,0.015513982,0.0065556867,0.043658815,-0.0068989163,-0.007139177,0.007756991,-0.0072421464,0.018122528,-0.065900095,-0.038990892,-0.010159599,-0.014415647,-0.032675464,3.839882E-4,-0.019632738,0.0010382697,0.021692116,0.046679236,-0.0056976127,-0.006418395,-0.02649733,-0.0073451153,-0.006452718,0.045306318,0.01757336,0.023888785,-0.0043418556,-0.012424914,-0.010434182,-0.022653159,0.004564955,0.065900095,0.0058692275,-0.003192036,-0.012356268,-0.014827522,-0.025536288,-0.016680961,-0.010914704,-0.059859257,-0.04613007,0.01400377,0.017847944,-0.01825982,0.020181905,-0.003226359,0.041187562,-0.041187562,0.025810871,0.0036039117,-0.017024191,0.010090953,0.004599278,0.0021108624,0.002299639,-0.0102968905,0.043109648,0.16035691,-0.03226359,-0.018534403,0.005388706,-0.012424914,-0.007070531,-0.00751673,0.010434182,-0.0066586556,-0.0130427275,-0.0047708927,0.009610431,0.0034666196,0.0139351245,0.0017247291,0.04695382,-1.3461038E-4,0.008923972,-0.02128024,0.022241283,-0.012013039,-0.03226359,0.009061264,0.0018534403,0.0027973219,-0.044482566,-0.020731073,0.0039299796,0.018534403,-0.016269086,0.0068989163,0.027732957,0.0034837811,-0.010502828,-0.0035695885,-0.0058349045,0.0085807415,0.023888785,0.040089227,-0.021417532,-0.009541785,-0.007619699,0.037068807,0.0067959474,0.00219667,-0.010708766,0.0060065193,0.021005657,0.032950047,0.010159599,0.0032091974,0.044482566,-0.016612316,-0.015582628,0.005354383,-0.021554824,0.0024369308,-0.010502828,-0.022103991,0.01977003,-0.010777412,0.024026077,-0.07413761,-0.050248824,0.025536288,0.012424914,-0.0013557572,0.005560321,-0.001076883,0.009541785,0.014690231,-0.0051141223,-0.02128024,-0.0019220862,0.007139177,0.007482407,-0.0056632897,-0.03253817,-0.010571474,0.0028831293,-0.018808987,-0.0069332393,-0.035695888,0.0035695885,-0.0073451153,0.022241283,-0.05134716,-0.011669809,0.007139177,-0.011257933,0.0026085456,-0.021417532,0.0065556867,-0.017024191,-0.034460258,-0.040638395,0.082375124,0.017161483,-0.010914704,0.014827522,0.007756991,-0.01908357,-0.0018534403,-4.6979563E-4,-0.0219667,0.01908357,0.01757336,-0.013591895,-0.021417532,0.020319197,-0.08292429,0.04695382,0.007688345,-0.028556708,-0.011395225,0.023339618,-0.01249356,-0.0050111534,0.018397111,0.014964814,0.014964814,0.056289665,-0.02128024,-0.05436758,-0.023339618,-0.004633601,-0.018946279,-0.013523249,-0.003981464,0.017985236,-0.027870249,0.034460258,0.018122528,-0.014621585,-0.023202326,0.024437953,-0.0068989163,-0.042011313,0.017367423,0.0042045633,0.029380461,0.027732957,-0.025536288,0.019220863,-0.014278354,0.06452718,-0.019632738,-0.016337732,-0.02924317,8.108801E-4,-0.012218976,0.004633601,-0.010914704,0.023751494,-0.013797833,-0.031165255,-0.024849828,0.040089227,0.0168869,0.004461986,0.027595665,0.05354383,0.01977003,-0.03157713,0.020593781,-0.01249356,0.02924317,2.4026078E-4,-0.027046498,0.033636507,0.019220863,-0.02718379,0.0011927232,0.010571474,-0.006212457,-0.032675464,0.014072416,-0.011120642,0.011875747,0.032675464,-0.026909206,0.008923972,-0.009747723,-0.018946279,0.013248665,0.0057319356,0.008340481,0.025810871,-0.017985236,0.04695382,0.05134716,-0.041462146,-0.0058349045,-0.023888785,-0.018397111,-0.009610431,-0.012081685,-0.034322966,0.05079799,-0.045855485,-0.034872137,0.007619699,0.010708766,0.020044614,-0.026771914,-0.0028488063,-0.0011841424,-0.008615064,0.003981464,0.02279045,-0.023202326,0.05217091,-0.013591895,-0.013523249,0.009473139,-0.0016646639,0.018397111,-0.024712536,-0.0068302704,-0.01283679,0.006109488,-0.008855326,0.027870249,-0.004153079,-0.014827522,0.027046498,-0.012218976,-0.00624678,-0.016680961,0.034872137,-0.027321082,0.07303928,-0.004118756,-0.05079799,-0.08567013,-0.092809305,0.022378575,0.0102968905,-0.017710652,-0.0121503305,-0.010022307,-0.059859257,-0.002230993,-0.033361923,0.027595665,0.009610431,-0.036794223,-0.01503346,-0.0033293278,0.0047022467,-0.02649733,0.017985236,-0.020593781,0.018946279,0.011326579,0.0024712537,-0.007688345,0.010571474,-0.0067616245,0.019632738,0.020181905,6.1352307E-4,0.0024369308,0.0025227382,0.026222747,0.011532517,0.016612316,-0.015788564,-0.0047365697,-0.02498712,0.051621743,0.02800754,0.035421304,-0.03651964,-0.018534403,0.018397111,-0.034872137,0.017161483,-0.00219667,0.003192036,0.024712536,-0.009747723,-0.026909206,-0.010571474,-0.007585376,-0.015788564,-0.009610431,0.009267202,0.024575245,-7.207823E-4,0.07688345,0.008615064,0.0041702404,-0.046679236,-0.027046498,0.0066586556,0.011120642,-0.027046498,0.015582628,-0.018122528,-0.013180019,-0.012424914,0.026634622,-0.0057662586,0.009953661,0.03253817,-0.00751673,5.4487714E-4,-0.03734339,0.0018534403,0.07853095,-0.017024191,0.033361923,-0.012768144,8.9239713E-4,0.017161483,0.009953661,0.022241283,-0.0019478285,-0.017161483,-0.021829408,0.0121503305,-0.0013042728,0.025536288,-0.0102968905,0.033636507,-0.038441725,-0.020868365,0.060957592,0.016063148,-0.0013557572,0.015719919,-0.053269245,0.036794223,-0.028831294,-0.025810871,-0.020319197,0.031851713,0.032675464,0.042011313,-0.0029174522,0.008065897,0.05134716,0.001990732,-0.009747723,-0.0058005815,-0.016680961,0.01098335,-0.0060751652,-0.023614202,0.026634622,0.034734845,0.002128024,-0.016612316,-0.022378575,-0.012562206,0.021417532,0.02347691,0.011326579,0.0102968905,0.050248824,0.03075338,-0.021554824,-0.009679077,0.022103991,-0.001990732,0.038990892,0.020319197,0.013866479,-0.024575245,0.013866479,-0.024575245,0.03226359,0.024712536,0.026771914,-0.025261704,-0.0014329839,-0.0030032597,-0.033636507,0.0029860982,-0.036245055,-0.024575245,-0.026634622,-0.014484293,-0.052720077,0.007859959,-0.008923972,0.014415647,-0.03871631,-0.0014415646,-0.012218976,-0.025124412,-0.0050797993,-0.030341504,4.2099266E-5,0.0013042728,-0.010708766,0.051072575,-0.022927742,-0.043109648,-0.009198556,0.017710652,-0.035695888,0.017710652,-0.0066586556,0.03226359,0.039814644,0.028282125,0.014484293,-0.029655045,-0.028282125,0.03226359,-0.0060065193,-0.010914704,0.020044614,-0.010571474,0.018946279,0.009198556,0.008923972,0.0051141223,-0.0168869,-0.046679236,0.011669809,0.021142948,0.020593781,0.03006692,0.021554824,-0.03597047,-0.0028659678,0.01400377,-0.016131794,0.0012442076,-0.050523408,0.019495446,0.016612316,-0.03157713,-0.0455809,-0.025948163,-0.015170752,0.006487041,0.013317311,0.0035352656,0.011395225,-0.028831294,-1.8663114E-4,-0.025398996,0.008923972,-0.004461986,4.762312E-4,-0.05436758,8.9239713E-4,-0.012424914,0.027595665,-0.008409127,0.004256048,0.024026077,0.0025742226,-0.025398996,-0.017985236,0.015513982,-0.021829408,0.034048382,-0.0050797993,0.027732957,-0.027732957,0.0050454764,0.008512096,-0.016269086,-0.01249356,-0.010090953,-0.008855326,0.0073451153,-1.3729188E-4,-0.011944393,-0.02800754,0.013454603,-0.0025398997,-0.0030032597,-0.028144833,0.036794223,-0.008340481,0.016612316,0.0168869,0.0036725577,0.018534403,-0.017230129,0.043109648,0.0034666196,-0.021692116,0.008065897,-0.03253817,0.038990892,0.020044614,0.002230993,-0.033636507,-0.026909206,-0.015788564,0.007859959,6.6071714E-4,-0.08676846,-0.04997424,-0.04338423,-0.003895657,0.01537669,0.039814644,0.012081685,0.020044614,-0.017161483,-0.0060065193,-0.0027801604,0.020044614,0.016475024,-0.007619699,-0.0039299796,0.068096764,-0.009541785,-0.04036381,-0.007859959,-0.05436758,0.07853095,0.01503346,-0.04036381,0.0033121663,-0.0019392477,-0.01249356,0.0013900802,-0.003157713,-0.021554824,0.009061264,-0.065900095,-0.0069675623,-0.036794223,0.012218976,8.666549E-4,-2.627852E-4,0.020319197,-0.02128024,0.004015787,-0.004153079,0.022103991,-0.00624678,0.023339618,0.03651964,-0.010571474,0.013454603,0.00912991,-0.057113416,0.023339618,0.012218976,-0.03651964,-0.012424914,0.017985236,0.05793717,0.0042903707,0.066723846,-0.013248665,-0.008340481,0.011395225,0.014827522,0.006178134,-0.022241283,0.004633601,-0.037068807,0.022103991,0.028831294,-0.0026771915,0.011395225,0.031027963,0.044207983,-0.033636507,-0.011944393,0.0048738616,-6.521364E-4,0.023888785,0.018671695,0.025261704,-0.010846058,-0.0018019559,-0.0015359528,-0.019495446,0.015719919,-0.0049425075,0.0065900097,-0.03651964,-0.01825982,0.017367423,-0.06644926,-0.0014415646,0.011601163,0.025536288,-0.004530632,0.0015788565,0.009541785,0.016680961,0.03253817,0.0130427275,0.0021451854,-0.024575245,0.04475715,0.045031734,-0.036794223,0.017847944,0.0050454764,0.018946279,0.0055946438,0.0020851202,0.01537669,0.015719919,-0.0049425075,0.0219667,-5.019734E-4,0.0067273015,0.019358154,-0.01064012,-0.035421304,-0.0010211082,0.007482407,0.028556708,0.019220863,0.04338423,0.025124412,2.960356E-4,-0.018946279,-0.008923972,0.015925856,0.010090953,0.014690231,0.0036725577,0.019220863,-0.01249356,-0.014964814,8.1946084E-4,-8.90252E-5,0.03514672,-0.01098335,0.017847944,-0.062055927,-0.0010039468,-0.021142948,-0.063703425,0.024437953,7.937186E-4,0.015170752,-0.025261704,-0.013797833,-0.03253817,0.012630852,0.017847944,0.027870249,0.0020765394,0.018946279,-0.025948163,0.07249011,-0.019632738,-0.021829408,-0.007688345,0.036245055,-0.012218976,-0.011395225,-1.8877632E-4,-0.033361923,-0.026360039,-0.022515867,0.02045649,0.01825982,0.06864593,-0.037892558,0.019907322,-0.01757336,0.018671695,-0.0121503305,0.006109488,0.01825982,0.038990892,0.026771914,0.031439837,0.0038784954,-0.04036381,0.032675464,-0.015788564,-0.031165255,0.0069675623,0.037068807,0.033361923,0.010502828,0.03322463,0.0047022467,-0.005354383,-0.03253817,0.024437953,0.01098335,0.020868365,0.018671695,-0.029380461,0.016131794,-0.029929629,-0.03597047,0.005525998,-0.010571474,0.039814644,-0.032950047,0.0021795086,-0.036245055,-0.011395225,0.05656425,0.025536288,0.04338423,-0.004427663,0.0060751652,-0.018534403,-0.013591895,-0.02924317,0.024575245,-0.026222747,-0.010777412,0.014621585,0.04695382,-0.052445494,-0.017230129,-0.006315426,-0.016269086,0.019907322,0.040638395,-0.0030032597,0.003981464,-0.018534403,0.016612316,-0.014827522,0.0035009426,0.03734339,-0.0047708927,0.010846058,0.0059378734,-0.028968586,0.012287622,-0.018671695,0.017024191,-0.05656425,0.018946279,0.03075338,-0.014072416,-0.016818253,-0.011120642,0.0019220862,0.036794223,-0.016131794,-0.03075338,0.021417532,-0.013317311,0.023065034,0.03871631,0.021142948,0.015239398,0.009267202,-0.0066586556,0.0111892875,0.016612316,0.0057319356,0.0047708927,0.005457352,0.039265476,0.002299639,0.019632738,0.062055927,-0.003157713,9.009779E-5,-0.09335847,-0.02279045,0.0027973219,0.007619699,-0.008168866,-0.007482407,-0.0050454764,0.009953661,0.016612316,-0.03006692,-0.006109488,0.022241283,0.009198556,0.0050454764,-0.04997424,-0.037068807,-0.082375124,-0.0030032597,0.021692116,-0.03734339,0.013866479,0.0057662586,-0.008306158,7.122016E-4,0.001330015,-0.02718379,-0.016818253,-0.016680961,0.005285737,-0.0012184654,-0.013660541,0.008718034,-6.1781344E-4,-0.010022307,-0.021692116,-0.0021709278,-0.0025742226,0.028282125,0.00751673,0.012013039,0.007585376,-0.0069332393,-0.011532517,0.037892558,-0.042011313,-0.019495446,-0.0024884152,0.023339618,-0.011807101,-3.7969783E-4,-0.019907322,0.03253817,-0.0034494582,-0.01757336,0.015239398,0.0130427275,-0.045031734,0.042285897,-0.0050111534,-0.008340481,-0.011395225,-0.0048738616,-0.035695888,-0.035695888,0.03157713,-0.0168869,-0.011944393,0.016475024,-0.011120642,-0.03651964,-0.022378575,-0.01908357,-0.03954006,-0.006418395,0.02279045,-0.013591895,0.0069675623,0.0050454764,-0.0051484453,0.03734339,0.0219667,-0.017847944,0.00912991,-0.0017847943,0.008512096,0.01283679,0.02924317,-0.050248824,0.017436069,-0.010022307,0.0065213637,0.013866479,-0.00751673,0.01825982,-0.008855326,0.04915049,0.0067616245,0.00912991,0.011395225,-0.012562206,0.012905436,0.014484293,-0.011669809,-0.011395225,-0.02649733,0.062055927,0.004599278,-0.010571474,-0.008134543,-0.0067959474,0.013591895,-0.033361923,0.030478796,0.01757336,0.027870249,-0.010502828,0.014278354,-0.04777757,0.024026077,0.0026085456,-9.739142E-4,0.017847944,0.019495446,0.00878668,-0.018534403,-0.004667924,-0.019632738,-0.01908357,-0.0039299796,0.029929629,0.04036381,0.020868365,0.011326579,-0.008992618,0.011395225,0.014964814,0.0102968905,0.0068645934,-0.022927742,0.006143811,0.018122528,0.02279045,-0.016337732,0.00312339,0.022927742,0.04338423,0.023339618,-0.007756991,-0.016612316,-0.013591895,0.026771914,0.021692116,-8.4949343E-4,-0.019358154,0.009953661,0.013797833,-0.02279045,0.00751673,0.02279045,0.034734845,-0.012768144,0.019632738,0.009267202,0.03597047,0.0058349045,-0.034322966,-0.016612316,-0.020868365,0.011051996,0.03157713,0.026085455,0.024026077,0.008168866,0.028282125,-0.02924317,-0.034872137,0.027870249,9.117038E-5,0.023065034,0.008031574,-0.01503346,0.017710652,0.0032950048,0.015719919,0.0073107923,-0.037617974,0.0048052156,0.011326579,6.263942E-4,-0.00844345,0.06013384,-0.0010039468,-0.0058349045,-0.040089227,9.2672015E-4,-0.020044614,-8.6236454E-4,-0.01825982,-0.0111892875,1.4050966E-4,-0.05079799,0.0020164743,-0.014484293,0.04256048,-0.014484293,0.0102968905,-0.033361923,0.008718034,-0.017985236,-0.028282125,-0.039814644,-0.010502828,0.0011069158,0.00532006,0.025536288,4.0329486E-4,-0.034048382,0.033636507,0.04777757,0.011120642,-0.014415647,-0.01283679,-0.017710652,-0.032126296,0.02649733,-0.016818253],[0.0028516285,0.025906319,0.032350678,-0.03763505,-0.018817525,0.028484063,-0.056968126,-0.011470958,-0.08661217,-0.0066376887,-0.01727088,0.0054777046,-0.029257385,-0.020621946,-0.023199689,0.031190693,0.060319193,0.013919814,-0.0065088016,0.006315471,0.047172703,-0.015788678,-0.009408763,-0.02087972,-0.023070803,-0.04072834,0.017141992,2.5475354E-4,0.077847846,0.016755331,-0.016304227,0.029644048,2.9805157E-4,0.023715237,-0.01565979,0.0040438347,-0.013919814,-0.04072834,0.010762078,-0.00612214,0.008248778,0.0040438347,-0.0128887165,0.005735479,0.039697245,0.0241019,-0.03402621,-0.02680853,-0.044079408,0.040212795,-0.04175944,-0.05284374,0.004124389,-0.04588383,0.005961031,-0.012630942,0.031577356,0.011470958,0.025519658,0.04459496,-0.027195191,-0.027452966,0.00882877,0.016755331,0.02087972,0.027581852,-0.032608453,0.0050265994,-0.010246529,0.019719737,-0.011599844,0.039439473,-0.02036417,0.015337572,0.011793176,0.036603954,-0.011922062,-0.0026744087,-0.009666537,-0.04047057,-0.016755331,-0.001780254,-0.017786428,-0.020493058,-4.8332685E-4,0.0017560876,0.023328576,0.04459496,-0.014242032,0.011019852,-0.027066303,0.026035206,-0.033252887,-0.018817525,0.025648545,-0.0029966265,0.02036417,0.01224428,0.014822024,0.012437611,0.005509926,-0.016304227,-0.016175339,-0.001474147,-0.025261885,0.0074754553,0.01475758,0.049750444,-0.030546257,-0.04279054,0.008377666,0.0033993989,-0.028097402,0.023457464,-0.04227499,-0.0034316208,-0.002609965,-0.010568747,-0.012115393,0.013533152,0.027581852,-0.018688638,-0.003705506,-0.013275377,-3.2725256E-5,0.02087972,-0.030288484,-0.005735479,-0.013210935,0.00215886,-0.046399377,0.030159596,0.064701356,0.06959907,-0.038666148,0.0062832492,0.008248778,0.0060899183,0.041243892,0.015337572,0.020235285,-0.052328188,0.046399377,-0.04356386,-0.017915316,0.001385537,0.009666537,0.018688638,0.0026744087,0.023973012,0.010246529,0.021008607,0.0036571731,-0.014242032,0.036603954,0.02680853,0.059288096,0.016755331,-0.016755331,-0.046141606,-0.0025455214,-0.054905932,0.017786428,-0.03402621,0.0015224796,0.014048701,0.04227499,-0.008442109,-0.030932918,0.008699884,-0.009150988,0.0016272004,0.060319193,-0.03583063,-0.011599844,0.04304831,-0.0024488561,-0.016626444,-0.02680853,-0.008248778,-0.037377276,-0.02448856,0.02539077,0.030159596,0.01997751,-0.0190753,-0.0060899183,-0.00882877,-0.049750444,-0.028226288,0.0056065917,-0.011019852,0.010697635,-0.002126638,0.02268414,-0.0054454827,-0.044079408,-0.06341249,-0.015079798,-0.007282125,0.009666537,2.3562185E-4,-0.02268414,-0.005799922,-0.018688638,0.0029966265,-0.03583063,0.019461961,0.011470958,0.045626055,-0.018301977,-0.033510663,0.012630942,-0.06263916,-0.014950911,0.01456425,-8.619329E-4,-0.006315471,-0.0053488174,-0.003995502,-0.010182085,0.035572857,-0.016110895,-0.0040921676,-0.015079798,-0.039697245,-0.031190693,0.023973012,0.046914928,-0.018301977,0.0033510663,0.021266382,0.0038666148,0.046657152,0.01224428,0.014950911,-0.04536828,-0.040986117,-0.05284374,-0.04304831,-0.016626444,-0.013404265,-0.023070803,0.007829895,-0.016884219,-0.018044204,0.005993253,-0.019848622,-0.011470958,0.005896588,0.022039704,-0.016884219,0.030288484,-0.02036417,-0.016304227,0.02087972,-0.056968126,-0.010955409,0.012630942,0.016175339,0.0067021325,0.0077332295,-0.0059288093,0.021653043,0.014822024,0.005735479,0.017786428,-0.07320791,-0.021008607,0.019848622,-0.02448856,0.005896588,-0.007668786,-0.03273734,-0.032350678,0.01727088,0.014048701,-0.015466459,-0.019848622,-0.0071532377,-0.022039704,-0.028226288,-0.015079798,0.043821637,7.531844E-4,0.02680853,0.030932918,0.020493058,0.019204188,0.019333074,-0.019204188,0.047172703,0.01727088,-0.010375417,-0.036603954,0.025261885,0.00953765,-0.04175944,-0.044852734,4.7325756E-4,0.00953765,-0.01456425,-0.025132997,-2.3058719E-4,0.0017238657,-0.019590849,-0.0015063687,0.021910818,-0.04072834,0.04459496,-0.0015949786,0.007411012,0.0050910427,0.04072834,-0.0034799534,0.017141992,-0.02539077,0.042017214,0.0067021325,0.033510663,-0.0013049825,-0.018301977,0.018301977,0.028484063,0.019848622,0.0012405389,0.0013613707,0.034799535,-0.014435362,-0.0025938542,-0.035572857,-0.0034477315,-0.010053199,0.011019852,-0.017915316,-0.029644048,-0.045626055,0.036088407,0.02087972,0.03454176,0.013017603,-0.0125664985,0.046657152,-0.018817525,0.010633191,0.008152113,0.0066054673,-0.0052521518,-0.0068632415,-0.0053488174,-7.370735E-4,-0.0031416246,0.03763505,-0.021910818,0.021910818,0.016626444,-0.03531508,0.026035206,-0.009408763,-0.0024166342,0.03131958,0.008152113,-0.02951516,-0.0034799534,0.0060576964,0.0190753,-0.002174971,0.02642187,0.015337572,-0.009150988,-0.008152113,0.010182085,-0.009086545,-0.008377666,-0.06341249,0.01565979,-0.02500411,-0.0033993989,0.007572121,-0.045626055,-1.9131688E-4,-0.0062510273,-0.01134207,-0.01765754,0.021653043,0.015144242,-0.009666537,-0.010568747,-0.02036417,-0.01727088,0.010697635,-0.020750834,0.030675145,0.005542148,0.0054454827,0.04588383,0.0012566498,0.03402621,-0.02680853,0.022039704,-9.585983E-4,0.03222179,0.03131958,-0.0241019,0.0094732065,-0.049750444,-0.03131958,-0.017786428,-0.05361706,0.047946025,-0.008957658,-0.0019816402,0.016626444,0.0030127375,-0.006315471,0.049234897,0.0024971887,-0.0076365643,0.005735479,-0.0128887165,-0.029257385,0.019204188,0.012824273,0.009924311,0.025519658,0.021524156,8.256834E-4,0.042017214,-0.027581852,-0.04279054,-0.009022102,-0.006186584,-0.04768825,0.020750834,0.004349942,0.04897712,-0.05851477,0.016755331,-0.018946413,0.0128887165,-0.0087643275,0.004575494,-8.90127E-4,0.035572857,0.036603954,-0.023844125,-0.003560508,0.036088407,0.008055448,0.004607716,0.04536828,-0.009150988,-0.03131958,0.05310151,0.011922062,-0.007894339,0.0018044203,0.028870724,-0.011664288,-0.0146286925,0.019848622,-0.00863544,-0.004478829,0.0752701,-0.027581852,0.023328576,0.02861295,0.014435362,0.0034477315,-0.038666148,-0.00863544,0.04227499,-0.023973012,-0.0482038,-0.009215432,0.0039632805,-0.033510663,0.046914928,0.0067021325,0.0752701,0.031190693,0.017399767,0.050265994,-0.012373168,-0.010182085,0.018044204,-0.006895463,0.0035121753,-0.014306475,0.029644048,-0.007894339,0.0038182822,-0.032608453,-0.022426367,0.013919814,-0.050265994,-0.032608453,-0.027839627,0.021910818,-0.025648545,-0.033768438,-0.03402621,-0.02087972,0.0059288093,0.03131958,-0.010182085,0.013275377,0.012695385,0.02036417,0.025519658,5.6388136E-4,0.026550755,0.022426367,-0.016304227,0.022555253,-0.03686173,-0.012824273,-0.016755331,0.017786428,0.009279876,-0.03131958,-0.02951516,0.02448856,0.008699884,0.019333074,0.0381506,-0.059803642,-0.04897712,0.009666537,0.009988755,0.02448856,0.017786428,0.02448856,-0.0040921676,-0.019204188,0.030159596,0.04588383,-0.023844125,0.016304227,0.037119504,-0.009859868,-0.017013105,-0.009988755,0.00521993,0.10310973,-0.022168592,-0.018301977,-0.016755331,-0.03222179,-0.004124389,0.0036571731,0.0071532377,-0.019333074,-0.004188833,-1.5909509E-4,0.02087972,0.013726483,0.020621946,0.010826522,0.05310151,4.5110506E-4,0.03222179,-0.040986117,0.054390382,-0.022168592,-0.037377276,7.6929526E-4,0.0048332685,0.011213183,-0.030675145,0.0068632415,0.009859868,0.010633191,-0.03763505,-0.015337572,-0.03583063,-0.018430864,-0.010890965,0.026035206,0.021910818,0.009924311,-0.022555253,-0.016175339,-0.02448856,0.01997751,-0.01997751,0.036088407,-0.0060899183,-0.02951516,-0.030159596,-0.030675145,-0.006766576,0.05000822,0.018817525,0.021653043,-0.0028677394,0.0291285,0.031577356,0.025261885,-0.022813028,0.004801047,0.008699884,-0.005703257,0.011986506,-0.018817525,0.048719347,0.0012727607,-0.027195191,-0.046141606,0.012502055,-0.006895463,-0.035572857,0.009666537,-2.859684E-4,0.033510663,0.01043986,-0.009408763,-0.0066376887,-0.0011760953,0.015079798,-0.004575494,0.0012969271,-0.011470958,0.05129709,-0.025132997,0.010182085,-0.015273129,-0.0146286925,0.02448856,-0.030288484,-0.06135029,-0.021653043,-0.0066376887,-0.01456425,-0.011406514,-0.01205095,0.010890965,-0.041243892,-0.03131958,-0.0011116518,0.044337183,-0.00521993,0.0052843736,-0.002916072,0.028484063,0.02087972,-0.028484063,0.008313222,0.013146491,-0.01043986,-0.0035766189,-0.0048977123,0.009666537,-0.025132997,-0.0135975955,0.006154362,-0.018301977,-0.016884219,0.013275377,-0.007056572,-0.03222179,-0.0063799145,-0.017528655,0.05774145,0.004575494,0.013082047,-0.021653043,-0.04459496,-0.018946413,-0.06444358,0.0059288093,-0.0010874855,0.04072834,-0.005509926,-0.018559752,-0.004188833,-0.007539899,-0.050265994,-0.017915316,0.046657152,0.012759829,-0.007829895,0.014048701,0.0063476926,0.004446607,-0.0025455214,0.0063799145,0.017141992,-0.011922062,0.002899961,0.008699884,-0.03454176,-0.06135029,-0.0043821638,0.014435362,-0.005703257,0.044852734,0.0017399767,0.034799535,-0.010697635,0.004768825,-0.024875222,0.024230786,-6.117106E-5,-0.042017214,0.020235285,0.016110895,0.002754963,3.9471695E-4,-0.03995502,0.0010874855,-0.02229748,-0.046141606,-0.03402621,0.00557437,-0.008506552,0.03995502,0.0023683016,-0.016626444,-0.037377276,0.02448856,0.013017603,0.02087972,0.011213183,0.05310151,-0.004349942,-0.009730981,0.018430864,-0.0029966265,5.9610314E-4,-0.017399767,-0.012630942,0.024230786,0.018559752,-0.03531508,-0.03402621,0.013404265,0.023457464,-0.027839627,-3.5041198E-4,0.0027388523,-0.023199689,0.027452966,0.0030127375,0.01817309,-0.07939449,0.018817525,0.041243892,-0.07320791,-0.016884219,-0.02642187,0.0037699495,-0.013146491,0.019333074,-6.967962E-4,0.019461961,-0.03686173,-0.0017399767,0.02539077,-0.015079798,-0.0080876695,0.009924311,0.0016996994,-0.013533152,-0.0024166342,-0.05903032,-0.034283984,-0.020493058,-0.019719737,0.01636867,-0.009279876,-0.048719347,0.02087972,0.04536828,-0.015079798,0.0067021325,-0.02036417,0.01475758,-0.009602094,-0.054905932,0.0146286925,-0.013404265,0.016755331,0.03634618,-0.021910818,-0.017786428,-0.016626444,-0.026164094,0.056968126,-0.0063799145,6.6457444E-4,-0.009408763,-0.0028838504,-0.017399767,0.026035206,0.043821637,0.0011116518,-0.008184335,0.052070413,-0.012179837,0.0024166342,-0.014048701,0.030288484,0.034799535,-0.007217681,0.03454176,-0.006315471,-0.021266382,0.04072834,0.0013372044,0.0024810778,-0.006766576,-0.027066303,-0.019461961,-0.018946413,0.058257,0.03763505,0.031964015,-0.010762078,-0.027839627,-0.0040921676,-0.0073143463,-0.0050910427,0.0049621556,0.0014983133,-0.019461961,-0.018688638,0.01043986,-0.019204188,0.021910818,-0.017786428,-0.023328576,-0.039181698,0.007282125,0.037377276,-0.018946413,-0.011986506,-0.030288484,-6.605467E-4,0.007926561,-0.010375417,0.005864366,0.0012566498,0.007572121,0.04588383,0.019333074,0.027066303,0.0011438736,-0.04897712,-0.016110895,-0.033768438,0.038666148,-0.011019852,0.017915316,0.039697245,-0.036088407,-0.038666148,-0.01727088,-0.028097402,0.007056572,0.024359673,0.0017560876,-0.07423901,0.0073143463,-0.009924311,-0.030675145,-0.031706244,-0.055163704,0.004446607,0.033252887,-0.0023521907,-0.010697635,0.061092515,0.016755331,-0.008893214,0.0037699495,-0.0049621556,0.0056065917,-0.062381387,-0.0064765797,0.0053488174,0.018301977,0.033510663,0.019848622,0.012953159,-0.00953765,0.07423901,1.7017133E-4,0.04047057,-0.0019574738,0.015853122,0.02539077,0.0014822023,-0.02178193,0.0018285866,0.019333074,0.0049943775,-0.008248778,6.0415856E-4,0.04536828,-0.013275377,-0.022555253,0.03131958,-0.013082047,0.018559752,-0.009150988,0.022941915,0.06521691,0.007056572,0.025261885,-0.040212795,-0.013017603,-0.02036417,0.023457464,0.013017603,-0.028870724,0.0482038,0.0016594222,-0.0010230419,0.039697245,-0.03222179,-0.008313222,-0.013275377,-0.026550755,0.013017603,-0.009666537,-0.007282125,-0.0019735848,-0.07887895,-0.004285498,0.04072834,-0.016884219,-0.04304831,-0.015273129,-0.021008607,-0.018301977,-0.02139527,-0.029257385,1.01700025E-4,-0.010310973,0.001474147,0.029644048,0.016110895,-0.02139527,0.004124389,-0.013146491,-0.016497556,0.032995112,0.022039704,-0.03273734,0.0010310973,0.037377276,0.062381387,-0.029644048,-0.04459496,0.052070413,-0.028226288,-0.0029966265,0.015337572,-0.012502055,-0.014306475,-0.005832144,-0.0015949786,-0.009215432,0.019719737,0.043306086,-0.04072834,-0.009344319,0.013017603,8.216557E-4,0.08351888,-0.01043986,-0.012695385,-0.020493058,-1.3090103E-4,2.0642085E-4,-0.056452576,-0.015273129,-0.025132997,0.00107943,-2.9402383E-4,0.007991004,-0.005671035,-0.016497556,0.046399377,-0.023586351,-0.0020783055,0.017013105,0.008893214,-0.014048701,-0.02861295,-0.056194805,-0.001691644,-0.036603954,-0.011599844,0.013533152,0.007282125,0.006025475,-0.00215886,-0.010568747,-0.01565979,-0.01727088,-0.0241019,0.05903032,0.022168592,-0.0039149476,0.02500411,-0.019590849,0.0031255137,0.048719347,0.020235285,-0.024875222,-0.030932918,0.00953765,0.023328576,0.044079408,0.034283984,0.030159596,-0.01997751,-0.0076365643,-0.06959907,0.015079798,0.036603954,0.015788678,0.0010109587,-0.021653043,0.019204188,0.07063016,0.013275377,0.0050265994,-0.016884219,0.04304831,-0.005542148,0.0022716362,0.020621946,-0.011019852,-0.056968126,-0.010890965,-0.014048701,-0.004156611,0.0021910819,-0.023199689,-0.042532764,-0.012115393,-0.011213183,0.021910818,-0.021910818,-0.009730981,-0.008184335,-0.023199689,-0.011922062,-0.02268414,-0.041243892,-0.0135975955,-0.016497556,-0.010182085,0.018559752,-0.02448856,0.02139527,-0.015788678,-0.019204188,2.799268E-4,0.0054777046,0.051554866,0.02036417,-0.004607716,0.014242032,-0.0291285,-0.012308724,0.005542148,0.006186584,-0.01727088,0.0034477315,-0.04846157,-0.022426367,0.02680853,-0.026292982,-0.014950911,-0.016755331,-2.9402383E-4,0.0020621945,-0.014048701,-0.017528655,4.2492486E-4,-0.016110895,-0.014048701,0.015273129,-0.02036417,0.002303858,0.0017238657,-0.051039316,-0.0019091411,0.007282125,0.0015385905,-0.0019574738,0.0060576964,0.013919814,-0.0064443583,0.04175944,0.012759829,0.01043986,-0.02178193,-0.0010310973,0.038408376,-0.03505731,-0.015337572,-0.003560508,0.021910818,-0.007572121,-0.014435362,-0.016755331,0.0023521907,0.07578565,-0.01636867,-0.005993253,0.0062832492,-0.004575494,0.019204188,-0.03763505,-0.02036417,-0.0032382898,-0.011728732,-0.0021910819,-0.0033188444,0.038666148,0.004285498,0.012759829,-0.04846157,0.019461961,0.034799535,-0.02087972,0.018817525,0.055679254,-0.019461961,-0.002948294,-0.02500411,-0.015982008,-0.0020380283,-0.01997751,0.010826522,-0.0013049825,0.022426367,0.022039704,-0.02642187,0.01727088,0.0054777046,-0.015337572,-0.033252887,-0.009666537,0.023457464,0.02448856,0.0077332295,-0.0038988367,0.027452966,0.008377666,-0.010182085,0.014048701,-0.02642187,-0.0029644046,0.0087643275,0.060319193,8.3776657E-4,-0.0080876695,0.06959907,-8.297111E-4,-0.011406514,0.003560508,0.027195191,0.017915316,-0.0097954245,0.031190693,0.0020219174,0.0105043035,-0.0037860605,-0.022555253,0.010246529,-0.0020944164,-0.012759829,5.034655E-4,-0.02229748,-0.028870724,0.011664288,-0.015853122,-0.0291285,-0.005896588,0.0070243506,0.056194805,-0.059803642,0.05000822,-0.007668786,0.015144242,0.004929934,0.015079798,-0.04588383,0.002771074,-0.019590849,0.067536876,-0.0034316208,-0.03131958,-0.018946413,0.055163704,0.0049943775,0.004446607,0.0066376887,-0.013790926,-0.039697245,-0.013533152,0.008248778,0.0094732065,0.024875222,0.052070413,0.012373168,-0.03402621,0.030932918,-0.015466459,-4.027724E-4,0.027839627,0.012437611,0.06959907,4.984308E-5,0.013919814,-0.02861295,-0.00521993,0.012373168,0.0053488174,-0.004253276,0.02139527,0.020621946,0.033252887,-0.009924311,0.0036410624,0.010310973,-0.027195191,-0.034799535,0.054905932,-0.015337572,-0.010246529,-0.031190693,0.03273734,-0.0025455214,-0.0019735848,0.0028355175,0.007572121,-0.030675145,-0.015466459,-0.005413261,-0.017013105,0.013726483,0.0752701,0.031577356,-3.5846743E-4,-0.018817525,-0.026035206,-0.0020783055,0.0074754553,0.01456425,0.022555253,-0.0051232646,0.010955409,0.01224428,-0.0034477315,-0.015079798,-0.008377666,0.035572857,0.005509926,0.01997751,0.04279054,-2.8194068E-4,0.018044204,0.017141992,0.01727088,0.014048701,-0.036603954,0.07578565,-0.006766576,-0.021266382,-0.016884219,0.009022102,0.050265994,-0.01043986,0.020235285,-0.018044204,-0.010955409,0.06392803,0.009408763,-0.013726483,0.01475758,-0.011406514,-0.0017238657,0.003995502,-0.017786428,0.015337572,0.009215432,0.0146286925,-6.2933184E-5,-0.0032221791,0.00612214,0.0039149476,-0.033510663,0.014822024,0.032608453,-0.04536828,0.015853122,0.02861295,0.008152113,0.029644048,0.025906319,0.006315471,-0.004768825,0.043821637,-0.077332295,0.018301977,0.0032866227,0.019848622,0.0020460838,0.014435362,-0.0063799145,0.011535401,0.03454176,-0.014435362,0.010890965,0.018559752,0.02642187,0.011470958,-0.023844125,-0.03995502,0.015079798,-0.0048654904,-0.01475758,0.014822024,0.023457464,-0.009086545,0.027839627,0.007572121,-0.01765754,-0.009666537,-0.0056065917,0.005961031,0.02500411,-0.027066303,0.02680853,-0.0024488561,-0.013919814,0.015466459,0.024230786,0.049750444,-2.7589907E-4,0.005864366,0.012373168,-0.013275377,0.007217681,-0.026035206,-0.047430474,0.04897712,-0.0051232646,-0.013404265,-0.009279876,0.04304831,0.010182085,0.018946413,-0.0029966265,-0.008957658,-0.012373168,-0.012502055,0.008248778,0.023328576,-0.008152113,-0.02448856,-0.021008607,-0.019333074,0.015466459,0.0135975955,0.010375417,-0.014306475,0.0241019,-0.009924311,-0.0031255137,0.012502055,-0.027066303,-0.04072834,-0.03531508,-0.03583063,-0.010762078,0.020750834,-0.03402621,0.005832144,0.005832144,0.028226288,-0.004285498,0.0291285,-0.012373168,0.01475758,0.03505731,0.029644048,0.033252887,0.033510663,0.04459496,0.01765754,-0.02539077,0.0042210547,-0.03402621,0.015273129,-0.04304831,-0.0016433113,0.005896588,0.034799535,-0.023070803,4.7728527E-4,-0.01565979,0.004285498,-0.003705506,0.009859868,-0.009279876,-0.0019091411,-0.016884219,-0.01475758,0.040212795,0.008377666,0.0059288093,0.028870724,-0.007572121,0.008570996,-0.005703257,-0.002609965,0.025777433,-0.04175944,-0.010955409,-0.020621946,-0.01114874,-8.820715E-4,0.0016755331,0.03583063,0.02861295,-0.015853122,-0.0048654904,-0.027195191,0.01636867,0.027839627,0.025648545,0.018301977,0.028226288,0.009279876,0.011470958,-7.6929526E-4,0.025648545,0.002932183,0.004349942,0.007282125,0.021910818,0.02448856,-0.009859868,-0.02178193,0.007572121,0.03531508,-0.009859868,0.008957658,0.0020219174,-0.0241019,-0.014048701,0.0015788678,0.012953159,-0.027452966,0.011986506,0.020621946,0.02642187,-0.009086545,-0.05129709,0.026035206,-0.009086545,0.005896588,0.030546257,0.033768438,0.020235285,0.010246529,0.0028677394,0.015466459,0.02642187,-0.020106398,0.055679254,0.009666537,-0.0051877084,0.02036417,-0.048719347,-0.016175339,-0.043821637,-0.016755331,0.0047366032,0.05361706,0.023973012,0.04846157,-0.019590849,-0.001530535,-0.013017603,0.009279876,-0.0051877084,0.0062832492,-0.022168592,0.021910818,-0.036603954,-0.024875222,-0.0291285,-0.014435362,0.0030449592,-0.033768438,0.003705506,-0.023973012,0.0381506,-0.011470958,-0.0024166342,-0.0039632805,-0.05774145,0.025648545,0.021653043,0.03531508,-0.0125664985,0.0036571731,-0.0049943775,0.017528655,-0.004446607,-0.0067021325,-0.026550755,-0.0053165955,0.0046721594,0.04175944,0.035572857,-0.009408763,-0.0125664985,0.010117643,0.051039316,0.02861295,0.031190693,0.009279876,-0.054390382,-0.00612214,0.008506552,0.007282125]],"modelId":"cohere.embed-v4.0","modelVersion":"4.0","usage":{"completionTokens":0,"promptTokens":16,"totalTokens":16}}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:47:12 GMT
+ content-length:
+ - '38547'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_embeddings/test_embed_text_with_events_with_content.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_embeddings/test_embed_text_with_events_with_content.yaml
new file mode 100644
index 0000000000..503abc92a4
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_embeddings/test_embed_text_with_events_with_content.yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: '{"inputs": ["OpenTelemetry is an observability framework", "OCI Generative
+ AI serves Cohere embeddings"], "servingMode": {"servingType": "ON_DEMAND", "modelId":
+ "cohere.embed-v4.0"}, "compartmentId": "ocid1.compartment.oc1..redacted", "truncate":
+ "END", "inputType": "SEARCH_DOCUMENT"}'
+ headers:
+ Content-Length:
+ - '337'
+ accept:
+ - application/json
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText
+ response:
+ body:
+ string: '{"id":"REDACTED/REDACTED/REDACTED","embeddings":[[0.010479199,-0.010821656,-0.011369589,-0.014451706,0.037807304,0.0057532857,-0.04986181,-0.017328348,0.02054745,0.012944893,0.018355722,0.016780417,-0.04438249,-6.84915E-4,0.0032019776,0.0038355237,-0.019451585,0.039451104,0.0015753044,-0.009999759,0.023561075,0.008047751,0.019862534,-0.0201365,0.0052395994,-0.0018321476,-0.0011814783,-0.010342216,0.04493042,0.028081514,0.007225853,0.04903991,0.037259374,-0.0015581816,-0.04356059,0.028766429,0.02424599,-0.033560835,-0.009246352,0.027944531,0.021643313,-0.033149883,-0.008903895,-0.012054504,0.07342289,0.039177135,-0.04767008,0.033697817,0.01280791,-0.028766429,0.031506088,0.020958398,-0.00958881,-0.04219076,0.010890148,0.002080429,0.004623176,0.019040637,0.0027567828,0.03753334,-0.027396599,-0.02109538,-0.0038868925,0.028081514,0.014109248,0.033560835,0.026300734,0.028218497,-0.02520487,-0.0041094897,-0.015136621,0.013287351,-0.022191245,0.037807304,0.01876667,-0.006677921,-0.018218739,0.0067806584,1.09158325E-4,-0.0034588205,0.037807304,7.191607E-4,0.023424093,-0.0060614976,-0.0061642346,-0.026300734,-0.008287471,0.02424599,-0.04246473,-0.03246497,-0.0061984803,0.03972507,-0.06931339,-0.04356059,0.005273845,0.00297938,-0.009520318,0.029999275,0.0028081513,-0.0036471721,-0.006917641,-0.0011301097,-0.0023458337,-0.023013143,0.01280791,0.039177135,-0.039999034,-0.060546484,-0.03972507,-0.027396599,0.0052053537,-0.010273725,0.021369347,-0.04849198,-0.008903895,-0.0102052335,-6.335463E-4,0.0020033764,-0.03561558,-0.025341853,-0.012328469,-7.9621363E-4,-0.01191752,0.009520318,0.005582057,-0.032601953,0.03479368,0.022191245,-0.02054745,-0.02054745,-0.047944047,-0.00297938,0.018903652,-0.03068419,-0.028492462,-0.047396116,-0.016780417,0.012465453,0.029862292,-0.018903652,0.014451706,-0.009314843,0.029862292,8.261787E-4,0.03246497,0.014109248,0.028903412,0.00958881,0.027396599,0.002037622,-0.005856023,0.050957672,0.009999759,-0.017944772,0.002585554,-0.008321716,0.009040877,0.02520487,0.0020975522,-0.026437718,0.026300734,-0.015205112,7.790908E-4,0.008150488,-0.014109248,-0.06219028,0.025752803,-0.0040238756,0.0038697696,0.01780779,-0.02520487,0.03616351,-0.010136741,0.029314362,0.02424599,-0.008903895,-0.029177377,0.039999034,-0.011369589,0.010410707,0.030273242,-0.03109514,0.030410225,0.0013612685,0.0091093695,-0.0036129265,0.010479199,-0.0034588205,-8.689859E-4,0.02561582,0.041916795,0.029999275,-0.012122995,-0.013150367,0.0044177016,-0.035889544,-0.04164283,-0.015342095,0.009725792,-0.0052395994,0.022328228,0.0040238756,-0.029177377,4.195104E-4,-0.016848909,-5.564934E-4,-0.051779572,0.009657301,-0.013972266,0.014999637,-0.04383456,-0.03479368,0.022739178,0.013150367,0.006027252,-0.01739684,0.028081514,0.033286866,0.05999855,0.017533824,-0.028218497,-0.023424093,0.0025513084,0.023287108,-0.028492462,-0.052053537,-0.022191245,-0.018903652,-0.036437478,0.026437718,0.010273725,0.018903652,0.0113010965,0.035067648,-0.030273242,0.02424599,0.0015581816,0.005582057,-0.06629977,-0.003527312,-0.052053537,-0.009383335,0.04986181,0.028218497,0.0066094296,0.009725792,0.008047751,0.0033389605,-0.027807549,0.0020718677,0.016300976,-0.0038868925,0.019999517,0.0055135656,0.010821656,0.01280791,0.01917762,-0.0046574217,0.054245267,0.028766429,0.039999034,0.0040238756,0.0025341853,7.7481003E-4,0.019725552,-0.01917762,-0.013766791,-0.070135295,0.023287108,-0.018355722,-0.02424599,0.0410949,-0.0041437354,-0.0071916073,-0.0080135055,0.022191245,-0.023287108,-0.015684552,-0.005582057,-0.026163751,-0.038081273,7.619679E-4,0.015342095,0.032191005,0.007876522,-0.004383456,0.014999637,-0.026163751,4.623176E-4,0.013698299,0.036437478,0.0019862533,-0.013835282,0.0045546847,-0.03479368,-0.0041437354,0.01054769,-0.007465573,-0.018355722,0.0015239358,0.056984924,-0.004931388,0.014999637,-0.028492462,-0.018081754,0.016027011,0.03246497,0.023287108,-0.029999275,0.008972386,0.017328348,0.0060614976,0.052327503,0.027259616,0.03068419,0.0013355842,-0.04219076,-0.012533944,-0.014931146,0.04575232,-0.001215724,-0.031780053,0.028903412,0.029314362,0.050957672,-0.018218739,-0.009177861,0.015136621,-0.021369347,-0.036711443,-0.037259374,-0.010684674,0.005410828,-0.02109538,-0.01917762,-0.03890317,0.0014725672,0.04849198,0.029177377,0.008903895,-0.0046916674,-0.01780779,0.015205112,3.9596646E-4,-0.0060957433,0.032054022,0.009657301,-0.0410949,-0.0066436753,0.010684674,-0.018492704,-0.037259374,-0.023150126,0.012944893,0.04767008,-0.004794405,-0.014451706,0.019725552,-0.008492946,-0.0046916674,0.052053537,0.002431448,-0.017328348,0.0020290606,0.017944772,0.0017550946,0.017191365,0.032191005,-0.001352707,0.00434921,-0.023013143,-0.04246473,0.018629687,0.017533824,-0.004794405,-0.0077395393,-0.03561558,0.034656696,0.036711443,-0.027944531,-0.0081162425,-0.024930906,0.024382973,-0.009177861,0.033697817,0.021232365,0.0041951044,-0.057532858,-0.033971783,0.039451104,0.063560106,0.022054262,0.010479199,-0.057806823,0.004760159,0.021643313,0.0051026167,0.027122634,-0.03616351,0.019040637,-0.004332087,-0.016232485,0.02054745,-0.028492462,0.021369347,-0.036437478,-0.0010016882,-0.03561558,-0.011643554,0.0062327264,0.012876402,-0.008390209,-0.030410225,0.027259616,0.0039725066,0.003407452,-0.009931267,-1.9905341E-4,-0.0025170625,-0.015684552,0.0011044254,-0.035341613,0.027944531,0.023287108,3.7028216E-4,-0.019451585,0.016574942,-0.018081754,0.010273725,0.06438201,-0.0201365,0.01876667,-0.0019177619,0.002311588,0.003133486,0.0077395393,-0.05999855,-0.014657181,0.020273482,-0.029999275,-0.05123164,0.022191245,-0.021232365,0.03479368,-0.0010530568,-0.027670564,-0.032054022,0.03561558,-0.015205112,0.04301266,0.044108525,-0.0077395393,-0.018081754,-0.02246521,-0.020273482,0.028492462,-0.016027011,-0.0045546847,-0.018903652,-0.07999807,0.024930906,0.03835524,-0.03698541,0.0016951646,-0.024519956,-0.0031163632,-0.014246231,-0.0143832145,0.006027252,0.028081514,0.019725552,0.065751836,-0.013081876,-0.07671048,-0.0024143253,0.03616351,-0.018903652,0.0045546847,-0.03479368,0.065203905,0.053697333,0.033149883,0.008047751,-0.041368864,-7.7588025E-5,-0.021780295,-0.019999517,0.015684552,0.0066436753,0.04383456,-0.006986133,-0.008321716,0.007876522,-0.0070203785,0.01780779,-0.06657373,-0.03890317,-0.010616182,-0.014657181,-0.033560835,1.5624623E-4,-0.01917762,5.9073913E-4,0.02150633,0.046574216,-0.004862896,-0.006369709,-0.026026769,-0.007842276,-0.0063354634,0.045478355,0.01780779,0.02383504,-0.0038697696,-0.013561317,-0.01054769,-0.02287616,0.0042978413,0.06492994,0.005856023,-0.0033218376,-0.012191487,-0.014931146,-0.02561582,-0.016985891,-0.012122995,-0.060546484,-0.046574216,0.014246231,0.018492704,-0.018629687,0.02054745,-0.00297938,0.04219076,-0.041368864,0.026574701,0.0033389605,-0.016574942,0.010136741,0.0045204386,0.0017122874,0.0026026769,-0.009725792,0.04219076,0.15999614,-0.03246497,-0.018903652,0.004794405,-0.0123969605,-0.0063354634,-0.006917641,0.010753165,-0.0063354634,-0.013424333,-0.004725913,0.009999759,0.0041951044,0.013081876,0.0013441456,0.046574216,-8.647051E-4,0.008561437,-0.02109538,0.023013143,-0.012465453,-0.032191005,0.009177861,0.00148969,0.0026540456,-0.044656456,-0.021369347,0.004623176,0.018355722,-0.016095502,0.0065751835,0.027533581,0.0037499093,-0.009999759,-0.0031163632,-0.005342337,0.0091093695,0.02383504,0.039451104,-0.021643313,-0.010273725,-0.0076710475,0.03698541,0.0062327264,0.0020119378,-0.01054769,0.0051368624,0.020410467,0.032875918,0.010616182,0.0038697696,0.04493042,-0.016437959,-0.015890026,0.0055478113,-0.022191245,0.0020033764,-0.010890148,-0.021369347,0.019451585,-0.011027131,0.025067888,-0.07451875,-0.05040974,0.02561582,0.013424333,-0.0017122874,0.004383456,-0.0011129868,0.009383335,0.015205112,-0.005993006,-0.021232365,-0.0022773424,0.0062327264,0.008321716,-0.004897142,-0.032191005,-0.01006825,0.0033903292,-0.019588567,-0.0064724465,-0.03561558,0.003253346,-0.0072943443,0.022602193,-0.052053537,-0.011986012,0.006506692,-0.011095623,0.002448571,-0.021643313,0.0067806584,-0.017122874,-0.034656696,-0.039999034,0.0821898,0.016643433,-0.009794284,0.0145886885,0.007225853,-0.019314602,-0.0016609188,-9.032316E-4,-0.02191728,0.018355722,0.017670806,-0.013287351,-0.021232365,0.02109538,-0.0821898,0.04712215,0.008424454,-0.028766429,-0.011095623,0.023287108,-0.012739418,-0.004897142,0.018355722,0.014657181,0.016027011,0.05534113,-0.020958398,-0.054793198,-0.02383504,-0.0045889304,-0.018903652,-0.013287351,-0.0045204386,0.017670806,-0.027122634,0.034245748,0.018218739,-0.0145886885,-0.023150126,0.02424599,-0.0067806584,-0.04164283,0.016780417,0.003801278,0.029177377,0.028492462,-0.02520487,0.019451585,-0.0154790785,0.06438201,-0.019451585,-0.016300976,-0.030273242,0.0013270228,-0.012876402,0.004862896,-0.0113010965,0.02383504,-0.013629808,-0.031369105,-0.025067888,0.040546965,0.01739684,0.0051026167,0.028218497,0.053149402,0.019451585,-0.032054022,0.020684432,-0.012533944,0.029999275,3.617207E-4,-0.026574701,0.033286866,0.018629687,-0.026574701,0.001900639,0.011780538,-0.0062327264,-0.032875918,0.013835282,-0.010890148,0.01191752,0.032875918,-0.026711684,0.008218979,-0.00869842,-0.019999517,0.013287351,0.00547932,0.008903895,0.025478836,-0.018903652,0.04712215,0.05123164,-0.04164283,-0.005342337,-0.02383504,-0.019040637,-0.009451826,-0.012465453,-0.033697817,0.050135776,-0.04575232,-0.03438273,0.006917641,0.01095864,0.01917762,-0.026574701,-0.002431448,-3.9810681E-4,-0.008766912,0.004383456,0.02287616,-0.023150126,0.051779572,-0.013424333,-0.013698299,0.009520318,-0.0011044254,0.018629687,-0.024930906,-0.0071231155,-0.012602435,0.0059245145,-0.008664174,0.027670564,-0.0040238756,-0.014794163,0.026711684,-0.012465453,-0.0062327264,-0.016643433,0.035067648,-0.027944531,0.072874956,-0.004160858,-0.05040974,-0.08602532,-0.09314843,0.02246521,0.009999759,-0.01780779,-0.012191487,-0.009999759,-0.060546484,-0.0026197997,-0.033560835,0.026574701,0.009725792,-0.037807304,-0.0143832145,-0.0026369225,0.004725913,-0.026026769,0.01780779,-0.02109538,0.018492704,0.013835282,0.002431448,-0.0080135055,0.011506571,-0.0070203785,0.019999517,0.019999517,7.919329E-4,0.0027567828,0.0014383214,0.026437718,0.01143808,0.017328348,-0.01554757,-0.0048286505,-0.024930906,0.04986181,0.027944531,0.03561558,-0.035889544,-0.01876667,0.019040637,-0.03479368,0.016437959,-0.0018492704,0.0035615577,0.024382973,-0.009451826,-0.027670564,-0.010821656,-0.007876522,-0.016027011,-0.009794284,0.009725792,0.024930906,-2.8493532E-5,0.07561461,0.00869842,0.0038355237,-0.04712215,-0.026985649,0.006814904,0.011164114,-0.026163751,0.015342095,-0.01780779,-0.013287351,-0.012465453,0.026848666,-0.0057875314,0.009451826,0.033560835,-0.0075683105,6.07862E-4,-0.037807304,0.0018492704,0.07780634,-0.017670806,0.033149883,-0.012328469,3.467382E-4,0.017670806,0.009794284,0.02191728,-0.001900639,-0.016643433,-0.021369347,0.01280791,-0.001763656,0.026026769,-0.009725792,0.034245748,-0.038629204,-0.02109538,0.06082045,0.016027011,-9.331966E-4,0.015136621,-0.053149402,0.03753334,-0.028903412,-0.025889786,-0.0201365,0.031780053,0.032875918,0.041916795,-0.0031848545,0.0077395393,0.051505607,0.0017979018,-0.009451826,-0.005582057,-0.016232485,0.010684674,-0.005890269,-0.023287108,0.026437718,0.03561558,0.0025170625,-0.017122874,-0.02246521,-0.013287351,0.020958398,0.023150126,0.0113010965,0.009177861,0.049587842,0.030958157,-0.02109538,-0.010410707,0.022602193,-0.002431448,0.038081273,0.02054745,0.014109248,-0.024656938,0.014246231,-0.025478836,0.03246497,0.024656938,0.027670564,-0.024793921,-0.0015924273,-0.0024999396,-0.033149883,0.0030307488,-0.03698541,-0.023972023,-0.027396599,-0.014109248,-0.053149402,0.0074998187,-0.009040877,0.014451706,-0.038629204,-0.0020290606,-0.012191487,-0.025752803,-0.0050683706,-0.029862292,-6.934764E-4,0.0011129868,-0.009314843,0.050957672,-0.023013143,-0.042738695,-0.009040877,0.017191365,-0.03561558,0.01780779,-0.006266972,0.03246497,0.040273,0.028218497,0.015136621,-0.029588327,-0.028218497,0.033149883,-0.0067806584,-0.0113010965,0.019588567,-0.01006825,0.018903652,0.009177861,0.009451826,0.004760159,-0.016095502,-0.046574216,0.01095864,0.021232365,0.020958398,0.029588327,0.021643313,-0.035341613,-0.0029108885,0.014657181,-0.015890026,0.0013783914,-0.049313877,0.018903652,0.016437959,-0.031780053,-0.04630025,-0.026300734,-0.016027011,0.006506692,0.013355842,0.004075244,0.012122995,-0.029588327,2.932292E-4,-0.02561582,0.008835403,-0.0046916674,2.5149222E-4,-0.054519232,9.246352E-4,-0.01280791,0.027533581,-0.008595683,0.004486193,0.023561075,0.0029280116,-0.024930906,-0.018081754,0.01554757,-0.022328228,0.03438273,-0.0042978413,0.028218497,-0.027259616,0.005171108,0.0091093695,-0.016780417,-0.012465453,-0.009177861,-0.009451826,0.008287471,-1.8193053E-4,-0.01143808,-0.028492462,0.013561317,-0.0022259736,-0.0025684312,-0.026985649,0.037807304,-0.007876522,0.01739684,0.01780779,0.0041951044,0.018629687,-0.017328348,0.042738695,0.0033218376,-0.02191728,0.0080135055,-0.032191005,0.038081273,0.020273482,0.0021232364,-0.033971783,-0.026985649,-0.014246231,0.008150488,4.002472E-4,-0.08657325,-0.049313877,-0.04356059,-0.004383456,0.016095502,0.03972507,0.01191752,0.019725552,-0.017122874,-0.005582057,-0.003013626,0.01917762,0.016232485,-0.0074998187,-0.0030478716,0.06712167,-0.009794284,-0.040546965,-0.007054624,-0.054245267,0.07780634,0.014931146,-0.0410949,0.0037327865,-0.0020033764,-0.012876402,7.191607E-4,-0.003801278,-0.021232365,0.008424454,-0.065751836,-0.007054624,-0.036711443,0.011780538,2.675449E-4,-5.4579163E-5,0.020273482,-0.020684432,0.0036985409,-0.003938261,0.022191245,-0.0066436753,0.023698058,0.036711443,-0.010821656,0.013287351,0.009040877,-0.057806823,0.023150126,0.01191752,-0.03616351,-0.012465453,0.01780779,0.058628723,0.00434921,0.06712167,-0.013835282,-0.008595683,0.011369589,0.0143832145,0.006369709,-0.021780295,0.0044519473,-0.03753334,0.021780295,0.029588327,-0.0029622572,0.011643554,0.032054022,0.044656456,-0.033971783,-0.01191752,0.0051368624,-0.0014982515,0.024382973,0.018903652,0.026163751,-0.011164114,-0.0017550946,-0.0016523574,-0.019451585,0.014657181,-0.004246473,0.0056163026,-0.036437478,-0.01739684,0.016985891,-0.06629977,-0.001703726,0.011369589,0.025478836,-0.004794405,0.00142976,0.00958881,0.016985891,0.032054022,0.012328469,0.0020119378,-0.024656938,0.04383456,0.04438249,-0.03561558,0.018629687,0.0046574217,0.019451585,0.00595876,0.0022944652,0.015684552,0.015753044,-0.004623176,0.021643313,-1.4581197E-5,0.0065751835,0.018903652,-0.0102052335,-0.035341613,-4.152297E-4,0.007876522,0.027122634,0.019451585,0.043286625,0.024930906,3.617207E-4,-0.018903652,-0.009794284,0.015342095,0.009999759,0.014794163,0.003527312,0.019040637,-0.0123969605,-0.014451706,5.265284E-4,-3.681418E-4,0.03479368,-0.011027131,0.018903652,-0.06273821,-7.534065E-4,-0.020410467,-0.064108044,0.024382973,6.335463E-4,0.015753044,-0.024793921,-0.013903774,-0.033149883,0.013424333,0.018492704,0.027807549,0.002705414,0.019451585,-0.026300734,0.07177909,-0.019588567,-0.02150633,-0.0073285904,0.036437478,-0.01191752,-0.011849029,-6.506692E-4,-0.032601953,-0.026026769,-0.022191245,0.020410467,0.018355722,0.067943566,-0.038081273,0.019314602,-0.01780779,0.018355722,-0.012602435,0.0057532857,0.017670806,0.03890317,0.027670564,0.032191005,0.0036985409,-0.040820934,0.033560835,-0.016027011,-0.03109514,0.0074998187,0.036711443,0.032875918,0.011369589,0.03246497,0.004897142,-0.005342337,-0.032191005,0.024382973,0.011095623,0.020958398,0.019040637,-0.029177377,0.016574942,-0.029314362,-0.036437478,0.005445074,-0.009725792,0.040546965,-0.032875918,0.0031163632,-0.036711443,-0.010684674,0.056163028,0.025478836,0.04246473,-0.0045889304,0.005856023,-0.01876667,-0.013835282,-0.029588327,0.024930906,-0.027122634,-0.01095864,0.0154790785,0.04767008,-0.052053537,-0.017944772,-0.005342337,-0.016095502,0.019451585,0.040546965,-0.003133486,0.0040581212,-0.018355722,0.016574942,-0.014657181,0.0034588205,0.038081273,-0.0055478113,0.011232605,0.006266972,-0.029177377,0.011164114,-0.018355722,0.017122874,-0.056436993,0.018629687,0.03068419,-0.014999637,-0.017122874,-0.011095623,0.002191728,0.037807304,-0.015753044,-0.031369105,0.022054262,-0.013287351,0.022739178,0.03890317,0.020821415,0.01554757,0.008903895,-0.0067806584,0.011232605,0.016232485,0.004760159,0.0044177016,0.005342337,0.03972507,0.0012499698,0.019451585,0.06136838,-0.003270469,-6.463885E-4,-0.09369637,-0.023013143,0.0032019776,0.007842276,-0.0080135055,-0.007773785,-0.00547932,0.008561437,0.016780417,-0.029588327,-0.005856023,0.021780295,0.008972386,0.005445074,-0.04986181,-0.036711443,-0.08164187,-0.0033903292,0.021643313,-0.03835524,0.013766791,0.006266972,-0.008150488,8.647051E-4,4.4519472E-4,-0.027122634,-0.016848909,-0.016027011,0.0049656336,-0.0020547449,-0.013424333,0.008424454,-9.717231E-4,-0.009451826,-0.022191245,-0.0020718677,-0.0018663933,0.028218497,0.0077395393,0.011712046,0.007773785,-0.006369709,-0.012191487,0.038081273,-0.04164283,-0.019999517,-0.0025170625,0.022739178,-0.01191752,-4.7944047E-4,-0.019451585,0.032191005,-0.00273966,-0.017670806,0.015342095,0.013081876,-0.04493042,0.04219076,-0.0045889304,-0.009451826,-0.010410707,-0.004862896,-0.03479368,-0.035341613,0.032191005,-0.016027011,-0.012465453,0.016780417,-0.010821656,-0.03698541,-0.02191728,-0.019588567,-0.040273,-0.0060957433,0.023150126,-0.013561317,0.006951887,0.004931388,-0.0053765825,0.03698541,0.021643313,-0.01780779,0.009383335,-0.0020547449,0.008150488,0.0134928245,0.029862292,-0.050135776,0.017191365,-0.009931267,0.0067806584,0.014246231,-0.007842276,0.018218739,-0.0091093695,0.049313877,0.007773785,0.009246352,0.011095623,-0.012328469,0.013698299,0.013972266,-0.01191752,-0.010890148,-0.026848666,0.06219028,0.005445074,-0.01054769,-0.008492946,-0.006986133,0.013766791,-0.033560835,0.030958157,0.01876667,0.027807549,-0.010136741,0.013835282,-0.048765946,0.023698058,0.0026026769,-0.0011643554,0.01780779,0.01917762,0.008561437,-0.017944772,-0.004725913,-0.019862534,-0.019451585,-0.0036985409,0.029588327,0.040546965,0.02191728,0.011643554,-0.008903895,0.011369589,0.0145886885,0.009383335,0.0068833954,-0.023150126,0.006403955,0.017944772,0.023287108,-0.016848909,0.0040238756,0.022602193,0.043286625,0.023698058,-0.007842276,-0.016643433,-0.013355842,0.027122634,0.021643313,-8.9038943E-4,-0.019451585,0.01006825,0.014040757,-0.022739178,0.007773785,0.02246521,0.03479368,-0.013013384,0.019451585,0.008561437,0.03616351,0.006129989,-0.033971783,-0.016848909,-0.021643313,0.010753165,0.03109514,0.025889786,0.024793921,0.0077395393,0.027807549,-0.028903412,-0.03561558,0.028081514,2.6861508E-4,0.023287108,0.0076710475,-0.015136621,0.018355722,0.0033560833,0.015753044,0.0077395393,-0.037259374,0.0044177016,0.011095623,1.5624623E-4,-0.008424454,0.059724584,-6.806342E-4,-0.005856023,-0.039451104,9.503195E-4,-0.019862534,-0.0013612685,-0.018903652,-0.011095623,-1.5517605E-4,-0.050957672,0.0019177619,-0.014246231,0.04246473,-0.014999637,0.010753165,-0.03438273,0.008664174,-0.018081754,-0.028218497,-0.039451104,-0.011027131,0.0020718677,0.006027252,0.025478836,-8.304594E-4,-0.034245748,0.033560835,0.047944047,0.011369589,-0.013972266,-0.012739418,-0.01780779,-0.032601953,0.027122634,-0.017670806],[0.0029812413,0.025396952,0.031713963,-0.03712854,-0.018306434,0.028619917,-0.056208484,-0.011796047,-0.087148935,-0.006123631,-0.017532922,0.0063170088,-0.029522346,-0.020626968,-0.022947501,0.031327207,0.060333878,0.014761173,-0.006607075,0.0061558606,0.047442023,-0.015470225,-0.009411054,-0.021142641,-0.023076419,-0.04073826,0.017790759,4.2905702E-4,0.07735112,0.01675941,-0.016501574,0.02913559,3.243107E-4,0.023334257,-0.016308196,0.0041898526,-0.013536447,-0.04073826,0.011409291,-0.006123631,0.008315247,0.0042865416,-0.012505099,0.0061558606,0.03996475,0.02488128,-0.034034494,-0.027072893,-0.044863652,0.039449073,-0.04176961,-0.05311444,0.0041898526,-0.045895003,0.0056401864,-0.012247262,0.031713963,0.011215913,0.02488128,0.043832306,-0.027072893,-0.02745965,0.009024298,0.01675941,0.020884804,0.027588569,-0.03274531,0.004705527,-0.010506862,0.0194667,-0.011731587,0.039706912,-0.020240212,0.015599144,0.011860506,0.03661287,-0.011344832,-0.002465567,-0.009475513,-0.040480424,-0.017017247,-0.0014745059,-0.017532922,-0.020498049,-6.848798E-4,0.0014342188,0.023463175,0.04409014,-0.014116581,0.010506862,-0.027201813,0.026170464,-0.034034494,-0.018693188,0.026041547,-0.0032390784,0.02036913,0.012182803,0.015083469,0.01244064,0.0045443787,-0.016114818,-0.015856981,-0.0011199799,-0.025139116,0.007831802,0.014567795,0.049246885,-0.030553695,-0.043058794,0.008089638,0.0030295858,-0.028233161,0.022947501,-0.04176961,-0.0032068489,-0.0028684377,-0.010958076,-0.012053884,0.012827395,0.028104242,-0.018693188,-0.0041576233,-0.013020773,-4.8344454E-4,0.021013724,-0.030166939,-0.006445927,-0.012311721,0.002127156,-0.046152838,0.030166939,0.06445927,0.06910034,-0.0389334,0.0054468084,0.008154098,0.0065103867,0.04073826,0.015147929,0.019982375,-0.0528566,0.045895003,-0.043574467,-0.017790759,0.0014986781,0.009024298,0.018693188,0.003013471,0.024365606,0.010055646,0.020884804,0.0035130302,-0.014052121,0.036870703,0.028104242,0.059044693,0.016308196,-0.01675941,-0.04512149,-0.0029490117,-0.054403625,0.017790759,-0.033260986,0.0017645726,0.014438877,0.042027447,-0.008186327,-0.030682614,0.008637543,-0.00979781,0.0018048596,0.059818204,-0.035839356,-0.011731587,0.042027447,-0.0022238449,-0.01675941,-0.0264283,-0.008637543,-0.036870703,-0.025010198,0.025396952,0.030295858,0.020111293,-0.019208863,-0.0056079566,-0.008959839,-0.04950472,-0.028490998,0.0057046455,-0.010893617,0.011215913,-0.0023527634,0.023076419,-0.004963364,-0.043832306,-0.063427925,-0.014116581,-0.0073805866,0.009926728,8.2185573E-4,-0.023076419,-0.0057046455,-0.019079944,0.0029328968,-0.03609719,0.018048596,0.011215913,0.046152838,-0.018177515,-0.03351882,0.013407528,-0.062396575,-0.014438877,0.014052121,-0.0011119224,-0.006703764,-0.0053501194,-0.0035613747,-0.009862268,0.035065845,-0.015792523,-0.0036097192,-0.015147929,-0.039706912,-0.03094045,0.02397885,0.046152838,-0.018306434,0.0038353268,0.02127156,0.0041898526,0.046668515,0.011796047,0.015341307,-0.04512149,-0.041253936,-0.05311444,-0.043574467,-0.017275086,-0.013600906,-0.023592094,0.0073805866,-0.017146166,-0.018048596,0.006478157,-0.020498049,-0.011731587,0.0060591716,0.02204507,-0.01675941,0.030295858,-0.020498049,-0.016114818,0.021142641,-0.056466322,-0.010958076,0.012891854,0.015985899,0.006607075,0.0073161274,-0.0051889713,0.021658316,0.014567795,0.0059947125,0.017532922,-0.07322574,-0.020884804,0.019982375,-0.024494523,0.006349238,-0.007799572,-0.03351882,-0.032229636,0.017146166,0.014052121,-0.016308196,-0.019208863,-0.0075417347,-0.021916153,-0.028490998,-0.014954551,0.04409014,0.0013053003,0.026815057,0.029651266,0.020626968,0.019079944,0.018693188,-0.01933778,0.04692635,0.017532922,-0.009604432,-0.037386376,0.02475236,0.009475513,-0.040996097,-0.04409014,9.789752E-4,0.009217676,-0.014761173,-0.024494523,-4.2502832E-4,0.0018048596,-0.019208863,-0.0019982373,0.022560745,-0.040480424,0.044863652,-0.0015631374,0.0075739645,0.004963364,0.040222585,-0.0035130302,0.017146166,-0.025396952,0.042027447,0.0073805866,0.03377666,-0.0011441521,-0.018306434,0.01766184,0.028490998,0.019982375,0.001103865,0.0013133577,0.035065845,-0.014438877,-0.0021110412,-0.035581518,-0.0031423895,-0.010442402,0.010442402,-0.018306434,-0.029522346,-0.045895003,0.035839356,0.020240212,0.034034494,0.012762936,-0.011538209,0.04692635,-0.01856427,0.010506862,0.009024298,0.006703764,-0.005479038,-0.006800453,-0.0058657937,-8.258844E-4,-0.003351882,0.037644215,-0.02217399,0.022431826,0.016372655,-0.03532368,0.026170464,-0.00966889,-0.002401108,0.031585045,0.008089638,-0.02913559,-0.0030779303,0.0063170088,0.01933778,-0.0021916153,0.027201813,0.015276847,-0.009604432,-0.008154098,0.009539972,-0.00966889,-0.008089638,-0.063427925,0.015470225,-0.025010198,-0.0034002266,0.0072838976,-0.045895003,-3.9078435E-4,-0.006381468,-0.011086995,-0.01766184,0.021916153,0.014954551,-0.00966889,-0.011022535,-0.020755885,-0.017790759,0.010893617,-0.020884804,0.031198287,0.0055112676,0.0051889713,0.046152838,0.0010474632,0.03377666,-0.027072893,0.021658316,-0.0011602669,0.032358553,0.031198287,-0.023721011,0.010184565,-0.04950472,-0.031971797,-0.018048596,-0.053630114,0.048215535,-0.009153217,-0.002304419,0.01688833,0.0029006673,-0.006897142,0.049246885,0.0022560745,-0.0074128164,0.0064136977,-0.013407528,-0.029522346,0.019208863,0.013020773,0.00966889,0.026170464,0.021400478,0.0011924965,0.04176961,-0.02745965,-0.042027447,-0.00966889,-0.006639305,-0.04769986,0.020498049,0.0044799196,0.048215535,-0.05852902,0.01675941,-0.018822107,0.012762936,-0.008702002,0.0039964747,-0.0016034244,0.035839356,0.03609719,-0.02397885,-0.0041576233,0.03635503,0.008379705,0.004705527,0.04537933,-0.009282135,-0.031198287,0.0528566,0.011989425,-0.0076706535,0.0021593857,0.028877754,-0.012118343,-0.014309959,0.02036913,-0.007799572,-0.004512149,0.07580411,-0.028233161,0.023205338,0.028877754,0.014245499,0.0038192119,-0.03919124,-0.008573083,0.042285282,-0.02397885,-0.048989046,-0.008959839,0.003899786,-0.033260986,0.046668515,0.0065103867,0.07528843,0.031585045,0.017532922,0.05053607,-0.012182803,-0.010120106,0.018435352,-0.0071549793,0.0034324562,-0.014052121,0.029522346,-0.007928491,0.0038353268,-0.03274531,-0.02204507,0.014052121,-0.05053607,-0.03261639,-0.02745965,0.022560745,-0.025912628,-0.03351882,-0.034034494,-0.021142641,0.0056401864,0.031198287,-0.010442402,0.013407528,0.013020773,0.02036913,0.025525872,0.0011441521,0.027201813,0.022302909,-0.015985899,0.022947501,-0.036870703,-0.01327861,-0.016630493,0.017532922,0.009024298,-0.03094045,-0.029522346,0.024623442,0.008637543,0.019724537,0.03867556,-0.059818204,-0.04873121,0.00979781,0.009926728,0.02475236,0.018306434,0.024623442,-0.0035774896,-0.01933778,0.029651266,0.04537933,-0.023721011,0.015985899,0.03609719,-0.009475513,-0.01688833,-0.01063578,0.0053501194,0.10210349,-0.022431826,-0.018435352,-0.016179277,-0.03274531,-0.004512149,0.004608838,0.0072194384,-0.019079944,-0.004044819,-9.3465945E-4,0.021400478,0.013020773,0.020755885,0.0107646985,0.05311444,6.244492E-4,0.031971797,-0.041253936,0.054403625,-0.02204507,-0.036870703,9.789752E-4,0.0043832306,0.011215913,-0.030682614,0.006639305,0.00966889,0.010700239,-0.037902053,-0.015470225,-0.03609719,-0.017790759,-0.011215913,0.025783708,0.021787234,0.010313484,-0.022689665,-0.01688833,-0.024623442,0.020240212,-0.020626968,0.03661287,-0.006445927,-0.029522346,-0.030682614,-0.03094045,-0.006478157,0.050020397,0.018951027,0.021916153,-0.0029328968,0.02926451,0.031327207,0.025010198,-0.023205338,0.0043832306,0.008379705,-0.005575727,0.012053884,-0.018822107,0.048989046,9.668891E-4,-0.027588569,-0.045895003,0.012569558,-0.0069616013,-0.035839356,0.009604432,2.782324E-5,0.03351882,0.010829158,-0.009088757,-0.006703764,-7.694826E-4,0.014761173,-0.004705527,0.001418104,-0.012118343,0.051825255,-0.025396952,0.010184565,-0.015341307,-0.014052121,0.024236687,-0.030295858,-0.06110739,-0.021916153,-0.0068649123,-0.014567795,-0.010958076,-0.011989425,0.010506862,-0.04151177,-0.031585045,-4.3510008E-4,0.04409014,-0.004802216,0.004802216,-0.0033841117,0.028104242,0.020498049,-0.02913559,0.008250787,0.013085232,-0.010120106,-0.0036097192,-0.0043832306,0.009217676,-0.025010198,-0.013923203,0.0058657937,-0.017790759,-0.017017247,0.013729825,-0.006800453,-0.03274531,-0.0071227495,-0.017790759,0.057755508,0.0043187714,0.013149692,-0.021529397,-0.044605818,-0.018693188,-0.063427925,0.006445927,-0.0017404003,0.04151177,-0.005124512,-0.018693188,-0.0039642453,-0.0071227495,-0.050020397,-0.018435352,0.046410676,0.01237618,-0.007928491,0.014116581,0.0062525496,0.0045443787,-0.0022883043,0.0062525496,0.01675941,-0.011924965,0.0030457007,0.008379705,-0.034292333,-0.06136523,-0.0041253935,0.015147929,-0.0055434974,0.04409014,0.0013939318,0.03455017,-0.010829158,0.0056079566,-0.025010198,0.024494523,3.847413E-4,-0.042027447,0.02036913,0.016114818,0.0026106006,4.0287044E-4,-0.040222585,0.0018048596,-0.021916153,-0.045637164,-0.03377666,0.005253431,-0.008637543,0.039706912,0.0020949263,-0.016372655,-0.037644215,0.024623442,0.013536447,0.020755885,0.012118343,0.0528566,-0.0035613747,-0.009539972,0.018048596,-0.0033841117,6.6473626E-4,-0.018177515,-0.011796047,0.024365606,0.018822107,-0.034808006,-0.03377666,0.013600906,0.023205338,-0.028104242,-6.6473626E-4,0.003094045,-0.023205338,0.027201813,0.0029328968,0.018048596,-0.079413824,0.018822107,0.04073826,-0.07322574,-0.017017247,-0.026815057,0.0034808007,-0.013407528,0.019079944,-0.0010474632,0.0194667,-0.036870703,-0.0025461412,0.025139116,-0.014825633,-0.008379705,0.010184565,0.0018209744,-0.01327861,-0.0021916153,-0.05930253,-0.03455017,-0.021013724,-0.020111293,0.015856981,-0.0088953795,-0.04873121,0.020626968,0.045895003,-0.014954551,0.006607075,-0.020240212,0.014825633,-0.009088757,-0.054403625,0.014761173,-0.013407528,0.017275086,0.03661287,-0.022431826,-0.017790759,-0.016372655,-0.026041547,0.057239834,-0.0055434974,0.0010232909,-0.009153217,-0.0034002266,-0.017790759,0.0264283,0.043832306,7.0099457E-4,-0.008250787,0.05234093,-0.012311721,0.0027717487,-0.013923203,0.029651266,0.03455017,-0.0077351127,0.034292333,-0.0067682234,-0.02127156,0.04073826,9.2660205E-4,0.0028523228,-0.006445927,-0.027846405,-0.0194667,-0.018048596,0.057755508,0.03712854,0.031971797,-0.011022535,-0.027846405,-0.0039481306,-0.0073805866,-0.004802216,0.005479038,0.0016034244,-0.019079944,-0.019079944,0.010055646,-0.01856427,0.02217399,-0.018306434,-0.023076419,-0.03867556,0.0075417347,0.03661287,-0.018822107,-0.012053884,-0.03094045,-6.848798E-4,0.0076384237,-0.010506862,0.005930253,0.0013133577,0.007831802,0.04537933,0.01933778,0.026815057,0.0013214151,-0.04976256,-0.015985899,-0.034292333,0.03867556,-0.011602669,0.017790759,0.03996475,-0.035581518,-0.03867556,-0.017017247,-0.027072893,0.006123631,0.024365606,0.0017404003,-0.073741406,0.0072194384,-0.009926728,-0.031198287,-0.031713963,-0.055177137,0.004705527,0.032358553,-0.0031423895,-0.01063578,0.06136523,0.01675941,-0.009153217,0.0039481306,-0.0044799196,0.0052856603,-0.062396575,-0.006478157,0.0051889713,0.018177515,0.034034494,0.020111293,0.012698476,-0.009024298,0.07477275,-2.024424E-4,0.039706912,-0.0022883043,0.017017247,0.025396952,0.0011441521,-0.021529397,0.0021593857,0.019982375,0.0051889713,-0.008089638,5.31789E-4,0.044863652,-0.013149692,-0.02204507,0.031585045,-0.013085232,0.018435352,-0.009411054,0.022818582,0.06523278,0.006607075,0.025396952,-0.040480424,-0.013149692,-0.02036913,0.023076419,0.013149692,-0.029522346,0.04873121,0.0015470225,-0.0018693189,0.040480424,-0.032358553,-0.007831802,-0.01327861,-0.026299383,0.0126340175,-0.009475513,-0.0070260605,-0.0022560745,-0.07838248,-0.0032068489,0.04073826,-0.01766184,-0.042800955,-0.015083469,-0.020884804,-0.018048596,-0.021529397,-0.02913559,-6.40564E-4,-0.009926728,0.0018532041,0.030166939,0.016114818,-0.021400478,0.003899786,-0.012827395,-0.01688833,0.03274531,0.021529397,-0.03274531,0.0011522095,0.037644215,0.06317009,-0.030166939,-0.043832306,0.051567417,-0.028877754,-0.002562256,0.015341307,-0.0126340175,-0.014567795,-0.006639305,-0.0011763817,-0.00966889,0.01933778,0.043316633,-0.04073826,-0.008959839,0.013020773,0.0013375299,0.08353922,-0.010377943,-0.013020773,-0.020240212,-3.001385E-4,1.7827017E-4,-0.056981996,-0.015341307,-0.025525872,5.398464E-4,3.9279868E-4,0.007831802,-0.0057046455,-0.01675941,0.046410676,-0.023463175,-0.002127156,0.017017247,0.009282135,-0.014309959,-0.028877754,-0.05569281,-0.0018209744,-0.03661287,-0.011473751,0.014116581,0.007928491,0.005479038,-0.002304419,-0.0107646985,-0.015470225,-0.017919678,-0.02488128,0.05852902,0.02217399,-0.0040931636,0.024107767,-0.020111293,0.0027072895,0.048989046,0.019982375,-0.025139116,-0.030166939,0.009346594,0.022689665,0.04434798,0.034292333,0.030295858,-0.019724537,-0.007928491,-0.06910034,0.014954551,0.03635503,0.015663603,7.4933906E-4,-0.021787234,0.01933778,0.07064736,0.013600906,0.0060914014,-0.01688833,0.043058794,-0.005479038,0.0025944856,0.020884804,-0.011215913,-0.056981996,-0.0107646985,-0.014567795,-0.004077049,0.0019176634,-0.023463175,-0.042285282,-0.012827395,-0.011473751,0.021658316,-0.021529397,-0.010055646,-0.0074128164,-0.023334257,-0.012118343,-0.02217399,-0.04176961,-0.01321415,-0.016372655,-0.010249024,0.019079944,-0.024494523,0.021400478,-0.015792523,-0.01933778,3.122246E-4,0.004898905,0.052083094,0.020884804,-0.004608838,0.014438877,-0.029909102,-0.012118343,0.0055434974,0.0059947125,-0.017275086,0.0033196525,-0.04873121,-0.022431826,0.027201813,-0.02655722,-0.015276847,-0.016372655,-3.1851945E-5,0.0023527634,-0.013536447,-0.017275086,3.8877E-4,-0.015599144,-0.013600906,0.015663603,-0.019853456,0.0025461412,0.0011763817,-0.05130958,-0.0014745059,0.0068649123,0.0014664484,-0.0019337782,0.0057368753,0.013923203,-0.0064136977,0.04176961,0.012569558,0.010506862,-0.021916153,-0.0014342188,0.038417727,-0.03532368,-0.014954551,-0.0036419488,0.021787234,-0.0070582903,-0.014567795,-0.01675941,0.0020224096,0.07683545,-0.016308196,-0.00622032,0.00618809,-0.0037386378,0.019853456,-0.037386376,-0.02036913,-0.0037869823,-0.011731587,-0.0026750597,-0.0035291451,0.039706912,0.0040287045,0.013149692,-0.048473373,0.01959562,0.035065845,-0.02127156,0.018693188,0.05569281,-0.019853456,-0.0029812413,-0.02475236,-0.015663603,-0.0017242855,-0.020755885,0.011215913,-0.0012891855,0.022560745,0.021916153,-0.02655722,0.017275086,0.0056079566,-0.015470225,-0.03261639,-0.00973335,0.023721011,0.025396952,0.007928491,-0.003899786,0.02745965,0.008637543,-0.009926728,0.014438877,-0.026299383,-0.0030295858,0.008573083,0.059818204,5.237316E-4,-0.007928491,0.06910034,-7.533677E-4,-0.011538209,0.0035291451,0.026815057,0.01766184,-0.009024298,0.03094045,0.0020143522,0.0107646985,-0.0041898526,-0.02217399,0.009217676,-0.00220773,-0.012311721,5.056024E-4,-0.021916153,-0.028619917,0.012053884,-0.016308196,-0.029651266,-0.0055112676,0.0073805866,0.05569281,-0.05930253,0.050020397,-0.0076384237,0.015856981,0.0050922823,0.014567795,-0.046152838,0.002739519,-0.019853456,0.068584666,-0.0033196525,-0.031713963,-0.018822107,0.055177137,0.0057368753,0.0044799196,0.0067682234,-0.013407528,-0.03996475,-0.012956314,0.008508624,0.009282135,0.024494523,0.05130958,0.012247262,-0.03455017,0.031198287,-0.015599144,-6.6876493E-4,0.027588569,0.012311721,0.06961601,-4.3107138E-4,0.013729825,-0.028233161,-0.0055112676,0.012698476,0.005124512,-0.0043187714,0.021013724,0.02036913,0.03351882,-0.00966889,0.0039481306,0.010506862,-0.028104242,-0.034808006,0.055177137,-0.015147929,-0.009991188,-0.030553695,0.033260986,-0.0024172226,-0.0020143522,0.0034324562,0.0072194384,-0.030553695,-0.015341307,-0.0050922823,-0.017404003,0.013407528,0.07580411,0.031585045,-4.3912878E-4,-0.01856427,-0.026041547,-0.0023366485,0.007831802,0.014761173,0.022560745,-0.0055112676,0.010829158,0.012182803,-0.0033841117,-0.015147929,-0.008444165,0.03532368,0.0058657937,0.020111293,0.04254312,1.0323555E-4,0.018306434,0.016501574,0.01766184,0.013923203,-0.03712854,0.07631978,-0.0059947125,-0.021013724,-0.017275086,0.008702002,0.05130958,-0.0107646985,0.020240212,-0.018048596,-0.010829158,0.063943595,0.009411054,-0.013729825,0.014438877,-0.011086995,-0.0016275967,0.0044799196,-0.01766184,0.015276847,0.008702002,0.014761173,-2.1452851E-4,-0.0029973562,0.0059624827,0.0041253935,-0.033003148,0.014954551,0.032358553,-0.04512149,0.016179277,0.028104242,0.008637543,0.029651266,0.026041547,0.006574846,-0.004866675,0.043574467,-0.07683545,0.017790759,0.0032229635,0.019724537,0.0017242855,0.014632255,-0.006349238,0.012762936,0.03455017,-0.014245499,0.010958076,0.018435352,0.026815057,0.011731587,-0.02397885,-0.040480424,0.015341307,-0.005221201,-0.015276847,0.014632255,0.022818582,-0.008959839,0.027846405,0.0074772756,-0.017532922,-0.009411054,-0.0055112676,0.0060914014,0.025525872,-0.026815057,0.026815057,-0.0019821227,-0.013536447,0.015470225,0.02384993,0.050020397,-4.0689917E-4,0.006574846,0.012569558,-0.013923203,0.0076384237,-0.026170464,-0.04769986,0.048989046,-0.00531789,-0.01327861,-0.008379705,0.043316633,0.010120106,0.018951027,-0.003190734,-0.009153217,-0.013536447,-0.013794284,0.008379705,0.023205338,-0.008154098,-0.02397885,-0.021400478,-0.0194667,0.015341307,0.01321415,0.010700239,-0.013729825,0.024494523,-0.009862268,-0.0027556338,0.012118343,-0.027201813,-0.04073826,-0.035581518,-0.03609719,-0.010958076,0.02036913,-0.034034494,0.005575727,0.0056079566,0.028233161,-0.004705527,0.030295858,-0.0126340175,0.014825633,0.034808006,0.030553695,0.033260986,0.03377666,0.04409014,0.017532922,-0.026041547,0.0046410677,-0.034292333,0.015341307,-0.043316633,-0.0020788116,0.0056401864,0.035581518,-0.02217399,5.156742E-4,-0.015856981,0.003915901,-0.004044819,0.009346594,-0.009088757,-0.0022721894,-0.01688833,-0.013729825,0.040222585,0.007928491,0.0058013345,0.028490998,-0.008508624,0.008637543,-0.0058980235,-0.0026911746,0.025783708,-0.041253936,-0.010829158,-0.020884804,-0.011473751,-7.614252E-4,0.0012569558,0.03635503,0.028619917,-0.015663603,-0.0044476897,-0.027201813,0.016179277,0.027201813,0.025396952,0.018177515,0.028104242,0.009024298,0.011473751,-6.848798E-4,0.025010198,0.002384993,0.00441546,0.0070260605,0.021400478,0.024365606,-0.009475513,-0.021658316,0.0074128164,0.035581518,-0.009346594,0.009153217,0.0020949263,-0.02397885,-0.013794284,0.0018451466,0.012569558,-0.02745965,0.012053884,0.020498049,0.027201813,-0.009217676,-0.05130958,0.02565479,-0.008637543,0.005672416,0.030553695,0.03377666,0.019853456,0.010184565,0.0037064082,0.015792523,0.02655722,-0.01959562,0.055177137,0.009926728,-0.0050922823,0.020755885,-0.049246885,-0.015599144,-0.043574467,-0.015856981,0.004866675,0.053630114,0.023592094,0.048989046,-0.01959562,-0.0016598263,-0.013407528,0.009088757,-0.0046410677,0.0059947125,-0.021916153,0.021400478,-0.03635503,-0.025010198,-0.02926451,-0.014116581,0.003013471,-0.03377666,0.0038675563,-0.02397885,0.038417727,-0.011086995,-0.0017404003,-0.003899786,-0.05827118,0.025783708,0.021916153,0.035065845,-0.01237618,0.0038353268,-0.004866675,0.017404003,-0.00441546,-0.006381468,-0.027072893,-0.0054468084,0.004705527,0.04254312,0.03609719,-0.009475513,-0.0126340175,0.010377943,0.050793905,0.028233161,0.03094045,0.008379705,-0.0549193,-0.0067682234,0.008702002,0.0070260605]],"modelId":"cohere.embed-v4.0","modelVersion":"4.0","usage":{"completionTokens":0,"promptTokens":16,"totalTokens":16}}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:47:13 GMT
+ content-length:
+ - '38610'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_rerank/test_rerank_text_legacy.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_rerank/test_rerank_text_legacy.yaml
new file mode 100644
index 0000000000..c6e130295e
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_rerank/test_rerank_text_legacy.yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: '{"input": "What is the capital of France?", "compartmentId": "ocid1.compartment.oc1..redacted",
+ "servingMode": {"servingType": "ON_DEMAND", "modelId": "cohere.rerank-v4.0-fast"},
+ "documents": ["Paris is the capital of France.", "Berlin is the capital of Germany.",
+ "The Eiffel Tower is located in Paris."], "topN": 2}'
+ headers:
+ Content-Length:
+ - '369'
+ accept:
+ - application/json
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/rerankText
+ response:
+ body:
+ string: '{"id":"REDACTED/REDACTED/REDACTED","modelId":"cohere.rerank-v4.0-fast","documentRanks":[{"index":0,"relevanceScore":0.8570099},{"index":2,"relevanceScore":0.42403036}]}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:51:44 GMT
+ content-length:
+ - '240'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_rerank/test_rerank_text_with_events_with_content.yaml b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_rerank/test_rerank_text_with_events_with_content.yaml
new file mode 100644
index 0000000000..389c9435b9
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/cassettes/test_rerank/test_rerank_text_with_events_with_content.yaml
@@ -0,0 +1,37 @@
+interactions:
+- request:
+ body: '{"input": "What is the capital of France?", "compartmentId": "ocid1.compartment.oc1..redacted",
+ "servingMode": {"servingType": "ON_DEMAND", "modelId": "cohere.rerank-v4.0-fast"},
+ "documents": ["Paris is the capital of France.", "Berlin is the capital of Germany.",
+ "The Eiffel Tower is located in Paris."], "topN": 2}'
+ headers:
+ Content-Length:
+ - '369'
+ accept:
+ - application/json
+ accept-encoding:
+ - gzip, deflate
+ connection:
+ - keep-alive
+ content-type:
+ - application/json
+ host:
+ - inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ method: POST
+ uri: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/rerankText
+ response:
+ body:
+ string: '{"id":"REDACTED/REDACTED/REDACTED","modelId":"cohere.rerank-v4.0-fast","documentRanks":[{"index":0,"relevanceScore":0.8570099},{"index":2,"relevanceScore":0.42403036}]}'
+ headers:
+ Connection:
+ - keep-alive
+ Content-Type:
+ - application/json
+ Date:
+ - Fri, 18 Sep 2026 19:51:14 GMT
+ content-length:
+ - '240'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/conftest.py b/packages/opentelemetry-instrumentation-oci-genai/tests/conftest.py
new file mode 100644
index 0000000000..ebdfa559c1
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/conftest.py
@@ -0,0 +1,219 @@
+"""Unit tests configuration module.
+
+Recording cassettes requires OCI credentials::
+
+ OCI_CONFIG_PROFILE= OCI_COMPARTMENT_ID= uv run pytest tests/ --record-mode=once
+
+Both API key and session token (``security_token_file``) profiles are supported. Cassettes are scrubbed: the
+``authorization`` signature (which embeds the session token), ``opc-request-id`` headers, request ids echoed in
+response bodies and every OCID (including ``compartmentId``) are replaced before anything is written to disk.
+"""
+
+import os
+import re
+
+import oci
+import oci.base_client
+import pytest
+from cryptography.hazmat.primitives.asymmetric import rsa
+from oci.generative_ai_inference import GenerativeAiInferenceClient
+from opentelemetry.instrumentation.oci_genai import OCIGenAIInstrumentor
+from opentelemetry.instrumentation.oci_genai.utils import TRACELOOP_TRACE_CONTENT
+from opentelemetry.sdk._logs import LoggerProvider
+from opentelemetry.sdk._logs.export import (
+ InMemoryLogExporter,
+ SimpleLogRecordProcessor,
+)
+from opentelemetry.sdk.metrics import Counter, Histogram, MeterProvider
+from opentelemetry.sdk.metrics.export import (
+ AggregationTemporality,
+ InMemoryMetricReader,
+)
+from opentelemetry.sdk.resources import Resource
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
+from vcr.stubs.urllib3_stubs import VCRRequestsHTTPSConnection
+
+REDACTED_COMPARTMENT_ID = "ocid1.compartment.oc1..redacted"
+REDACTED_REQUEST_ID = "REDACTED/REDACTED/REDACTED"
+
+_OCID_RE = re.compile(r"ocid1\.(?P[a-z0-9_-]+)\.oc[0-9]+\.[a-z0-9-]*\.[a-zA-Z0-9]+")
+_REQUEST_ID_RE = re.compile(r"[0-9A-F]{32}/[0-9A-F]{32}/[0-9A-F]{32}")
+_SCRUBBED_RESPONSE_HEADERS = ("opc-request-id",)
+
+
+def _scrub_text(text: str) -> str:
+ text = _OCID_RE.sub(lambda match: f"ocid1.{match.group('type')}.oc1..redacted", text)
+ return _REQUEST_ID_RE.sub(REDACTED_REQUEST_ID, text)
+
+
+def _scrub_body(body):
+ if body is None:
+ return body
+ if isinstance(body, bytes):
+ return _scrub_text(body.decode("utf-8", errors="replace")).encode("utf-8")
+ if isinstance(body, str):
+ return _scrub_text(body)
+ return body
+
+
+def _scrub_request(request):
+ request.body = _scrub_body(request.body)
+ request.uri = _scrub_text(request.uri)
+ return request
+
+
+def _scrub_response(response):
+ headers = response.get("headers") or {}
+ for header in list(headers):
+ if header.lower() in _SCRUBBED_RESPONSE_HEADERS:
+ del headers[header]
+ body = response.get("body") or {}
+ if "string" in body:
+ body["string"] = _scrub_body(body["string"])
+ return response
+
+
+def _playback_signer():
+ """Signer used for cassette playback: a throwaway key and a dummy session token.
+
+ The resulting ``authorization`` header is filtered out of the cassettes and ignored when matching requests.
+ """
+ private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
+ return oci.auth.signers.SecurityTokenSigner("playback-token", private_key)
+
+
+def _build_client(region):
+ # No retries (deterministic cassettes) and a generous read timeout for cold model endpoints.
+ client_kwargs = {"retry_strategy": oci.retry.NoneRetryStrategy(), "timeout": (10, 240)}
+ profile = os.environ.get("OCI_CONFIG_PROFILE")
+ if not profile:
+ return GenerativeAiInferenceClient(config={"region": region}, signer=_playback_signer(), **client_kwargs)
+
+ config = oci.config.from_file(profile_name=profile)
+ if config.get("security_token_file"):
+ with open(os.path.expanduser(config["security_token_file"])) as token_file:
+ token = token_file.read()
+ private_key = oci.signer.load_private_key_from_file(
+ os.path.expanduser(config["key_file"]), config.get("pass_phrase")
+ )
+ signer = oci.auth.signers.SecurityTokenSigner(token, private_key)
+ return GenerativeAiInferenceClient(config={"region": region}, signer=signer, **client_kwargs)
+ config["region"] = region
+ return GenerativeAiInferenceClient(config, **client_kwargs)
+
+
+@pytest.fixture(scope="function", name="span_exporter")
+def fixture_span_exporter():
+ exporter = InMemorySpanExporter()
+ yield exporter
+
+
+@pytest.fixture(scope="function", name="tracer_provider")
+def fixture_tracer_provider(span_exporter):
+ provider = TracerProvider()
+ provider.add_span_processor(SimpleSpanProcessor(span_exporter))
+ return provider
+
+
+@pytest.fixture(scope="function", name="log_exporter")
+def fixture_log_exporter():
+ exporter = InMemoryLogExporter()
+ yield exporter
+
+
+@pytest.fixture(scope="function", name="logger_provider")
+def fixture_logger_provider(log_exporter):
+ provider = LoggerProvider()
+ provider.add_log_record_processor(SimpleLogRecordProcessor(log_exporter))
+ return provider
+
+
+@pytest.fixture(scope="function", name="reader")
+def fixture_reader():
+ reader = InMemoryMetricReader({Counter: AggregationTemporality.DELTA, Histogram: AggregationTemporality.DELTA})
+ return reader
+
+
+@pytest.fixture(scope="function", name="meter_provider")
+def fixture_meter_provider(reader):
+ resource = Resource.create()
+ meter_provider = MeterProvider(metric_readers=[reader], resource=resource)
+
+ return meter_provider
+
+
+@pytest.fixture
+def compartment_id():
+ return os.environ.get("OCI_COMPARTMENT_ID", REDACTED_COMPARTMENT_ID)
+
+
+@pytest.fixture
+def oci_client():
+ return _build_client(os.environ.get("OCI_TEST_REGION", "us-chicago-1"))
+
+
+@pytest.fixture(scope="function")
+def instrument_legacy(reader, tracer_provider, meter_provider):
+ instrumentor = OCIGenAIInstrumentor()
+ instrumentor.instrument(
+ tracer_provider=tracer_provider,
+ meter_provider=meter_provider,
+ )
+
+ yield instrumentor
+
+ instrumentor.uninstrument()
+
+
+@pytest.fixture(scope="function")
+def instrument_with_content(reader, tracer_provider, logger_provider, meter_provider, monkeypatch):
+ monkeypatch.setenv(TRACELOOP_TRACE_CONTENT, "True")
+
+ instrumentor = OCIGenAIInstrumentor(use_attributes=False)
+ instrumentor.instrument(
+ tracer_provider=tracer_provider,
+ logger_provider=logger_provider,
+ meter_provider=meter_provider,
+ )
+
+ yield instrumentor
+
+ instrumentor.uninstrument()
+
+
+@pytest.fixture(scope="function")
+def instrument_with_no_content(reader, tracer_provider, logger_provider, meter_provider, monkeypatch):
+ monkeypatch.setenv(TRACELOOP_TRACE_CONTENT, "False")
+
+ instrumentor = OCIGenAIInstrumentor(use_attributes=False)
+ instrumentor.instrument(
+ tracer_provider=tracer_provider,
+ logger_provider=logger_provider,
+ meter_provider=meter_provider,
+ )
+
+ yield instrumentor
+
+ instrumentor.uninstrument()
+
+
+@pytest.fixture(scope="module")
+def vcr_config():
+ return {
+ # The OCI SDK routes HTTPS through its own ``OCIConnectionPool`` (``ConnectionCls = OCIConnection``),
+ # which bypasses VCR's stock urllib3 patch; patch that pool's connection class explicitly.
+ "custom_patches": ((oci.base_client.OCIConnectionPool, "ConnectionCls", VCRRequestsHTTPSConnection),),
+ "filter_headers": [
+ "authorization",
+ "opc-request-id",
+ "opc-client-info",
+ "x-content-sha256",
+ "date",
+ "user-agent",
+ ],
+ "before_record_request": _scrub_request,
+ "before_record_response": _scrub_response,
+ "decode_compressed_response": True,
+ }
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/test_chat.py b/packages/opentelemetry-instrumentation-oci-genai/tests/test_chat.py
new file mode 100644
index 0000000000..883cb2a3cd
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/test_chat.py
@@ -0,0 +1,413 @@
+import json
+
+import pytest
+from oci.generative_ai_inference import models
+from opentelemetry.instrumentation.oci_genai.span_utils import (
+ GEN_AI_OCI_API_FORMAT,
+ GEN_AI_OCI_SERVING_MODE,
+ OCI_GENAI_PROVIDER,
+)
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+from opentelemetry.semconv_ai import SpanAttributes
+
+from tests import assert_message_in_logs, assert_valid_output_message, assert_valid_parts
+
+LLAMA_MODEL = "meta.llama-3.3-70b-instruct"
+COHERE_MODEL = "cohere.command-a-03-2025"
+OPENAI_MODEL = "openai.gpt-5.4"
+PROMPT = "Tell me a joke about opentelemetry"
+SERVER_ADDRESS = "inference.generativeai.us-chicago-1.oci.oraclecloud.com"
+
+
+def _generic_request(text, **kwargs):
+ return models.GenericChatRequest(
+ api_format=models.BaseChatRequest.API_FORMAT_GENERIC,
+ messages=[models.UserMessage(content=[models.TextContent(text=text)])],
+ **kwargs,
+ )
+
+
+def _chat(client, compartment_id, model, chat_request):
+ return client.chat(
+ models.ChatDetails(
+ compartment_id=compartment_id,
+ serving_mode=models.OnDemandServingMode(model_id=model),
+ chat_request=chat_request,
+ )
+ )
+
+
+def _assert_common_attributes(span, model, api_format):
+ assert span.attributes[GenAIAttributes.GEN_AI_PROVIDER_NAME] == OCI_GENAI_PROVIDER
+ assert span.attributes[GenAIAttributes.GEN_AI_OPERATION_NAME] == "chat"
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MODEL] == model
+ assert span.attributes[GEN_AI_OCI_SERVING_MODE] == "ON_DEMAND"
+ assert span.attributes[GEN_AI_OCI_API_FORMAT] == api_format
+ assert span.attributes["server.address"] == SERVER_ADDRESS
+
+
+def _assert_usage(span):
+ input_tokens = span.attributes[GenAIAttributes.GEN_AI_USAGE_INPUT_TOKENS]
+ output_tokens = span.attributes[GenAIAttributes.GEN_AI_USAGE_OUTPUT_TOKENS]
+ assert input_tokens > 0
+ assert output_tokens > 0
+ assert span.attributes[SpanAttributes.GEN_AI_USAGE_TOTAL_TOKENS] == input_tokens + output_tokens
+
+
+# ---------------------------------------------------------------------------
+# GENERIC api format (Meta Llama)
+# ---------------------------------------------------------------------------
+
+
+@pytest.mark.vcr
+def test_generic_chat_legacy(instrument_legacy, oci_client, compartment_id, span_exporter, log_exporter):
+ response = _chat(
+ oci_client,
+ compartment_id,
+ LLAMA_MODEL,
+ _generic_request(PROMPT, max_tokens=100, temperature=0.2, top_p=0.9, top_k=40, frequency_penalty=0.1),
+ )
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {LLAMA_MODEL}"]
+ span = spans[0]
+
+ _assert_common_attributes(span, LLAMA_MODEL, "GENERIC")
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_MODEL] == LLAMA_MODEL
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MAX_TOKENS] == 100
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_TEMPERATURE] == 0.2
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_TOP_P] == 0.9
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_TOP_K] == 40
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_FREQUENCY_PENALTY] == 0.1
+ assert span.attributes[SpanAttributes.GEN_AI_IS_STREAMING] is False
+
+ input_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_INPUT_MESSAGES])
+ assert input_messages == [{"role": "user", "parts": [{"type": "text", "content": PROMPT}]}]
+
+ generated_text = response.data.chat_response.choices[0].message.content[0].text
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert len(output_messages) == 1
+ assert_valid_output_message(output_messages[0])
+ assert output_messages[0]["role"] == "assistant"
+ assert output_messages[0]["parts"] == [{"type": "text", "content": generated_text}]
+ assert output_messages[0]["finish_reason"] == "stop"
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS] == ("stop",)
+
+ _assert_usage(span)
+ usage = response.data.chat_response.usage
+ assert span.attributes[GenAIAttributes.GEN_AI_USAGE_INPUT_TOKENS] == usage.prompt_tokens
+ assert span.attributes[GenAIAttributes.GEN_AI_USAGE_OUTPUT_TOKENS] == usage.completion_tokens
+
+ logs = log_exporter.get_finished_logs()
+ assert len(logs) == 0, "Assert that it doesn't emit logs when use_attributes is True"
+
+
+@pytest.mark.vcr
+def test_generic_chat_streaming(instrument_legacy, oci_client, compartment_id, span_exporter, log_exporter):
+ response = _chat(
+ oci_client,
+ compartment_id,
+ LLAMA_MODEL,
+ _generic_request(
+ PROMPT,
+ max_tokens=100,
+ temperature=0.2,
+ is_stream=True,
+ stream_options=models.StreamOptions(is_include_usage=True),
+ ),
+ )
+
+ # The span is only completed once the SSE stream has been consumed
+ assert span_exporter.get_finished_spans() == ()
+
+ chunks = []
+ for event in response.data.events():
+ if event.data == "[DONE]":
+ continue
+ chunks.append(json.loads(event.data))
+
+ streamed_text = "".join(
+ part["text"] for chunk in chunks for part in (chunk.get("message") or {}).get("content", [])
+ )
+ assert streamed_text
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {LLAMA_MODEL}"]
+ span = spans[0]
+
+ _assert_common_attributes(span, LLAMA_MODEL, "GENERIC")
+ assert span.attributes[SpanAttributes.GEN_AI_IS_STREAMING] is True
+
+ input_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_INPUT_MESSAGES])
+ assert input_messages[0]["parts"][0]["content"] == PROMPT
+
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert_valid_output_message(output_messages[0])
+ assert output_messages[0]["parts"] == [{"type": "text", "content": streamed_text}]
+ assert output_messages[0]["finish_reason"] == "stop"
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS] == ("stop",)
+
+ usage_chunk = next(chunk["usage"] for chunk in chunks if "usage" in chunk)
+ assert span.attributes[GenAIAttributes.GEN_AI_USAGE_INPUT_TOKENS] == usage_chunk["promptTokens"]
+ assert span.attributes[GenAIAttributes.GEN_AI_USAGE_OUTPUT_TOKENS] == usage_chunk["completionTokens"]
+ assert span.attributes[SpanAttributes.GEN_AI_USAGE_TOTAL_TOKENS] == usage_chunk["totalTokens"]
+
+ assert len(log_exporter.get_finished_logs()) == 0
+
+
+@pytest.mark.vcr
+def test_generic_chat_with_events_with_content(
+ instrument_with_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ response = _chat(oci_client, compartment_id, LLAMA_MODEL, _generic_request(PROMPT, max_tokens=100))
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {LLAMA_MODEL}"]
+ span = spans[0]
+ _assert_common_attributes(span, LLAMA_MODEL, "GENERIC")
+ _assert_usage(span)
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS] == ("stop",)
+ assert GenAIAttributes.GEN_AI_INPUT_MESSAGES not in span.attributes
+ assert GenAIAttributes.GEN_AI_OUTPUT_MESSAGES not in span.attributes
+
+ logs = log_exporter.get_finished_logs()
+ assert len(logs) == 2
+
+ assert_message_in_logs(logs[0], "gen_ai.user.message", {"content": PROMPT})
+
+ generated_text = response.data.chat_response.choices[0].message.content[0].text
+ assert_message_in_logs(
+ logs[1],
+ "gen_ai.choice",
+ {"index": 0, "finish_reason": "stop", "message": {"content": generated_text}},
+ )
+
+
+@pytest.mark.vcr
+def test_generic_chat_with_events_with_no_content(
+ instrument_with_no_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ _chat(oci_client, compartment_id, LLAMA_MODEL, _generic_request(PROMPT, max_tokens=100))
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {LLAMA_MODEL}"]
+ span = spans[0]
+ _assert_common_attributes(span, LLAMA_MODEL, "GENERIC")
+ _assert_usage(span)
+ assert GenAIAttributes.GEN_AI_INPUT_MESSAGES not in span.attributes
+ assert GenAIAttributes.GEN_AI_OUTPUT_MESSAGES not in span.attributes
+
+ logs = log_exporter.get_finished_logs()
+ assert len(logs) == 2
+
+ assert_message_in_logs(logs[0], "gen_ai.user.message", {})
+ assert_message_in_logs(logs[1], "gen_ai.choice", {"index": 0, "finish_reason": "stop", "message": {}})
+
+
+@pytest.mark.vcr
+def test_generic_chat_streaming_with_events_with_content(
+ instrument_with_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ response = _chat(
+ oci_client,
+ compartment_id,
+ LLAMA_MODEL,
+ _generic_request(PROMPT, max_tokens=100, is_stream=True),
+ )
+ streamed_text = "".join(
+ part["text"]
+ for event in response.data.events()
+ if event.data != "[DONE]"
+ for part in (json.loads(event.data).get("message") or {}).get("content", [])
+ )
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {LLAMA_MODEL}"]
+ assert spans[0].attributes[SpanAttributes.GEN_AI_IS_STREAMING] is True
+ assert GenAIAttributes.GEN_AI_OUTPUT_MESSAGES not in spans[0].attributes
+
+ logs = log_exporter.get_finished_logs()
+ assert len(logs) == 2
+ assert_message_in_logs(logs[0], "gen_ai.user.message", {"content": PROMPT})
+ assert_message_in_logs(
+ logs[1],
+ "gen_ai.choice",
+ {"index": 0, "finish_reason": "stop", "message": {"content": streamed_text}},
+ )
+
+
+# ---------------------------------------------------------------------------
+# GENERIC api format (OpenAI)
+# ---------------------------------------------------------------------------
+
+
+@pytest.mark.vcr
+def test_openai_generic_chat_legacy(instrument_legacy, oci_client, compartment_id, span_exporter, log_exporter):
+ chat_request = models.GenericChatRequest(
+ api_format=models.BaseChatRequest.API_FORMAT_GENERIC,
+ messages=[
+ models.SystemMessage(content=[models.TextContent(text="You are a terse assistant.")]),
+ models.UserMessage(content=[models.TextContent(text=PROMPT)]),
+ ],
+ max_completion_tokens=120,
+ )
+ response = _chat(oci_client, compartment_id, OPENAI_MODEL, chat_request)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {OPENAI_MODEL}"]
+ span = spans[0]
+
+ _assert_common_attributes(span, OPENAI_MODEL, "GENERIC")
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_MODEL] == OPENAI_MODEL
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MAX_TOKENS] == 120
+
+ input_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_INPUT_MESSAGES])
+ assert [message["role"] for message in input_messages] == ["system", "user"]
+ assert input_messages[0]["parts"] == [{"type": "text", "content": "You are a terse assistant."}]
+ assert input_messages[1]["parts"] == [{"type": "text", "content": PROMPT}]
+
+ generated_text = response.data.chat_response.choices[0].message.content[0].text
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert_valid_output_message(output_messages[0])
+ assert output_messages[0]["parts"] == [{"type": "text", "content": generated_text}]
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS] == ("stop",)
+
+ _assert_usage(span)
+ usage = response.data.chat_response.usage
+ assert span.attributes[GenAIAttributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] == (
+ usage.prompt_tokens_details.cached_tokens
+ )
+ assert span.attributes[SpanAttributes.GEN_AI_USAGE_REASONING_TOKENS] == (
+ usage.completion_tokens_details.reasoning_tokens
+ )
+
+ assert len(log_exporter.get_finished_logs()) == 0
+
+
+# ---------------------------------------------------------------------------
+# COHERE api format
+# ---------------------------------------------------------------------------
+
+
+def _cohere_request(**kwargs):
+ return models.CohereChatRequest(
+ api_format=models.BaseChatRequest.API_FORMAT_COHERE,
+ preamble_override="You are a terse assistant.",
+ chat_history=[
+ models.CohereUserMessage(message="Hello"),
+ models.CohereChatBotMessage(message="Hi! How can I help?"),
+ ],
+ message=PROMPT,
+ **kwargs,
+ )
+
+
+@pytest.mark.vcr
+def test_cohere_chat_legacy(instrument_legacy, oci_client, compartment_id, span_exporter, log_exporter):
+ response = _chat(
+ oci_client,
+ compartment_id,
+ COHERE_MODEL,
+ _cohere_request(max_tokens=100, temperature=0.3, top_p=0.8, seed=42, stop_sequences=["END"]),
+ )
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {COHERE_MODEL}"]
+ span = spans[0]
+
+ _assert_common_attributes(span, COHERE_MODEL, "COHERE")
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_MODEL] == COHERE_MODEL
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MAX_TOKENS] == 100
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_TEMPERATURE] == 0.3
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_TOP_P] == 0.8
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_SEED] == 42
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_STOP_SEQUENCES] == ("END",)
+ assert span.attributes[SpanAttributes.GEN_AI_IS_STREAMING] is False
+
+ system_instructions = json.loads(span.attributes[GenAIAttributes.GEN_AI_SYSTEM_INSTRUCTIONS])
+ assert system_instructions == [{"type": "text", "content": "You are a terse assistant."}]
+
+ input_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_INPUT_MESSAGES])
+ assert [message["role"] for message in input_messages] == ["user", "assistant", "user"]
+ for message in input_messages:
+ assert_valid_parts(message["parts"])
+ assert input_messages[0]["parts"] == [{"type": "text", "content": "Hello"}]
+ assert input_messages[1]["parts"] == [{"type": "text", "content": "Hi! How can I help?"}]
+ assert input_messages[2]["parts"] == [{"type": "text", "content": PROMPT}]
+
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert len(output_messages) == 1
+ assert_valid_output_message(output_messages[0])
+ assert output_messages[0]["parts"] == [{"type": "text", "content": response.data.chat_response.text}]
+ # The service answered this request (which sets stop_sequences) with ``finishReason: null``; the
+ # OutputMessage schema still requires the key, so it is emitted as an empty string and the
+ # span-level finish reasons attribute is omitted.
+ assert response.data.chat_response.finish_reason is None
+ assert output_messages[0]["finish_reason"] == ""
+ assert GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS not in span.attributes
+
+ _assert_usage(span)
+ assert len(log_exporter.get_finished_logs()) == 0
+
+
+@pytest.mark.vcr
+def test_cohere_chat_streaming(instrument_legacy, oci_client, compartment_id, span_exporter, log_exporter):
+ response = _chat(
+ oci_client,
+ compartment_id,
+ COHERE_MODEL,
+ _cohere_request(
+ max_tokens=100, temperature=0.3, is_stream=True, stream_options=models.StreamOptions(is_include_usage=True)
+ ),
+ )
+
+ assert span_exporter.get_finished_spans() == ()
+
+ chunks = [json.loads(event.data) for event in response.data.events() if event.data != "[DONE]"]
+ final_chunk = next(chunk for chunk in chunks if "finishReason" in chunk)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {COHERE_MODEL}"]
+ span = spans[0]
+
+ _assert_common_attributes(span, COHERE_MODEL, "COHERE")
+ assert span.attributes[SpanAttributes.GEN_AI_IS_STREAMING] is True
+
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert_valid_output_message(output_messages[0])
+ assert output_messages[0]["parts"] == [{"type": "text", "content": final_chunk["text"]}]
+ assert output_messages[0]["finish_reason"] == "stop"
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS] == ("stop",)
+
+ assert span.attributes[GenAIAttributes.GEN_AI_USAGE_INPUT_TOKENS] == final_chunk["usage"]["promptTokens"]
+ assert span.attributes[GenAIAttributes.GEN_AI_USAGE_OUTPUT_TOKENS] == final_chunk["usage"]["completionTokens"]
+ assert span.attributes[SpanAttributes.GEN_AI_USAGE_TOTAL_TOKENS] == final_chunk["usage"]["totalTokens"]
+
+ assert len(log_exporter.get_finished_logs()) == 0
+
+
+@pytest.mark.vcr
+def test_cohere_chat_with_events_with_content(
+ instrument_with_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ response = _chat(oci_client, compartment_id, COHERE_MODEL, _cohere_request(max_tokens=100))
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"chat {COHERE_MODEL}"]
+ _assert_common_attributes(spans[0], COHERE_MODEL, "COHERE")
+ assert GenAIAttributes.GEN_AI_INPUT_MESSAGES not in spans[0].attributes
+ assert GenAIAttributes.GEN_AI_SYSTEM_INSTRUCTIONS not in spans[0].attributes
+
+ logs = log_exporter.get_finished_logs()
+ assert len(logs) == 5
+ assert_message_in_logs(logs[0], "gen_ai.system.message", {"content": "You are a terse assistant."})
+ assert_message_in_logs(logs[1], "gen_ai.user.message", {"content": "Hello"})
+ assert_message_in_logs(logs[2], "gen_ai.assistant.message", {"content": "Hi! How can I help?"})
+ assert_message_in_logs(logs[3], "gen_ai.user.message", {"content": PROMPT})
+ assert_message_in_logs(
+ logs[4],
+ "gen_ai.choice",
+ {"index": 0, "finish_reason": "stop", "message": {"content": response.data.chat_response.text}},
+ )
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/test_embeddings.py b/packages/opentelemetry-instrumentation-oci-genai/tests/test_embeddings.py
new file mode 100644
index 0000000000..69a679809e
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/test_embeddings.py
@@ -0,0 +1,76 @@
+import json
+
+import pytest
+from oci.generative_ai_inference import models
+from opentelemetry.instrumentation.oci_genai.span_utils import (
+ GEN_AI_OCI_EMBEDDINGS_INPUT_COUNT,
+ GEN_AI_OCI_EMBEDDINGS_INPUT_TYPE,
+ GEN_AI_OCI_SERVING_MODE,
+ OCI_GENAI_PROVIDER,
+)
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+from opentelemetry.semconv_ai import SpanAttributes
+
+from tests import assert_message_in_logs
+
+EMBED_MODEL = "cohere.embed-v4.0"
+INPUTS = ["OpenTelemetry is an observability framework", "OCI Generative AI serves Cohere embeddings"]
+
+
+def _embed(client, compartment_id):
+ return client.embed_text(
+ models.EmbedTextDetails(
+ compartment_id=compartment_id,
+ serving_mode=models.OnDemandServingMode(model_id=EMBED_MODEL),
+ inputs=INPUTS,
+ input_type=models.EmbedTextDetails.INPUT_TYPE_SEARCH_DOCUMENT,
+ truncate=models.EmbedTextDetails.TRUNCATE_END,
+ )
+ )
+
+
+@pytest.mark.vcr
+def test_embed_text_legacy(instrument_legacy, oci_client, compartment_id, span_exporter, log_exporter):
+ response = _embed(oci_client, compartment_id)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"embeddings {EMBED_MODEL}"]
+ span = spans[0]
+
+ assert span.attributes[GenAIAttributes.GEN_AI_PROVIDER_NAME] == OCI_GENAI_PROVIDER
+ assert span.attributes[GenAIAttributes.GEN_AI_OPERATION_NAME] == "embeddings"
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MODEL] == EMBED_MODEL
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_MODEL] == EMBED_MODEL
+ assert span.attributes[GEN_AI_OCI_SERVING_MODE] == "ON_DEMAND"
+ assert span.attributes[GEN_AI_OCI_EMBEDDINGS_INPUT_COUNT] == 2
+ assert span.attributes[GEN_AI_OCI_EMBEDDINGS_INPUT_TYPE] == "SEARCH_DOCUMENT"
+ assert span.attributes[GenAIAttributes.GEN_AI_EMBEDDINGS_DIMENSION_COUNT] == len(response.data.embeddings[0])
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_ID]
+
+ assert span.attributes[GenAIAttributes.GEN_AI_USAGE_INPUT_TOKENS] == response.data.usage.prompt_tokens
+ assert span.attributes[SpanAttributes.GEN_AI_USAGE_TOTAL_TOKENS] == response.data.usage.total_tokens
+ assert GenAIAttributes.GEN_AI_USAGE_OUTPUT_TOKENS not in span.attributes
+
+ input_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_INPUT_MESSAGES])
+ assert input_messages == [{"role": "user", "parts": [{"type": "text", "content": text}]} for text in INPUTS]
+ assert GenAIAttributes.GEN_AI_OUTPUT_MESSAGES not in span.attributes
+
+ assert len(log_exporter.get_finished_logs()) == 0
+
+
+@pytest.mark.vcr
+def test_embed_text_with_events_with_content(
+ instrument_with_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ _embed(oci_client, compartment_id)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"embeddings {EMBED_MODEL}"]
+ assert GenAIAttributes.GEN_AI_INPUT_MESSAGES not in spans[0].attributes
+
+ logs = log_exporter.get_finished_logs()
+ assert len(logs) == 2
+ assert_message_in_logs(logs[0], "gen_ai.user.message", {"content": INPUTS[0]})
+ assert_message_in_logs(logs[1], "gen_ai.user.message", {"content": INPUTS[1]})
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/test_generate_text.py b/packages/opentelemetry-instrumentation-oci-genai/tests/test_generate_text.py
new file mode 100644
index 0000000000..4ce5674ee4
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/test_generate_text.py
@@ -0,0 +1,143 @@
+"""``generate_text`` (legacy completion API) tests.
+
+The legacy text generation endpoint is no longer served in the commercial realm (the service answers 404 "The
+requested API is not available"), so these tests stub ``BaseClient.call_api`` with the documented response shapes
+instead of recording cassettes.
+"""
+
+import json
+from unittest.mock import patch
+
+import oci
+from oci.generative_ai_inference import models
+from opentelemetry.instrumentation.oci_genai.span_utils import GEN_AI_OCI_API_FORMAT, OCI_GENAI_PROVIDER
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+from opentelemetry.semconv_ai import SpanAttributes
+
+from tests import assert_message_in_logs, assert_valid_output_message
+
+PROMPT = "Write a haiku about opentelemetry"
+
+
+def _response(result):
+ return oci.response.Response(200, {"opc-request-id": "REDACTED"}, result, None)
+
+
+def _cohere_result():
+ return models.GenerateTextResult(
+ model_id="cohere.command",
+ model_version="15.6",
+ inference_response=models.CohereLlmInferenceResponse(
+ generated_texts=[
+ models.GeneratedText(id="gen-1", text="Traces flow like streams", finish_reason="COMPLETE"),
+ models.GeneratedText(id="gen-2", text="Spans light the darkest path", finish_reason="MAX_TOKENS"),
+ ]
+ ),
+ )
+
+
+def _llama_result():
+ return models.GenerateTextResult(
+ model_id="meta.llama-2-70b-chat",
+ model_version="1.0",
+ inference_response=models.LlamaLlmInferenceResponse(
+ created="2024-01-01T00:00:00Z",
+ choices=[models.Choice(index=0, text="Signals converge", finish_reason="stop")],
+ ),
+ )
+
+
+def _generate(client, compartment_id, model, inference_request):
+ return client.generate_text(
+ models.GenerateTextDetails(
+ compartment_id=compartment_id,
+ serving_mode=models.OnDemandServingMode(model_id=model),
+ inference_request=inference_request,
+ )
+ )
+
+
+def test_generate_text_cohere_legacy(instrument_legacy, oci_client, compartment_id, span_exporter, log_exporter):
+ request = models.CohereLlmInferenceRequest(
+ prompt=PROMPT, max_tokens=50, temperature=0.7, top_p=0.9, num_generations=2, stop_sequences=["\n\n"]
+ )
+ with patch.object(oci_client.base_client, "call_api", return_value=_response(_cohere_result())):
+ response = _generate(oci_client, compartment_id, "cohere.command", request)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == ["text_completion cohere.command"]
+ span = spans[0]
+
+ assert span.attributes[GenAIAttributes.GEN_AI_PROVIDER_NAME] == OCI_GENAI_PROVIDER
+ assert span.attributes[GenAIAttributes.GEN_AI_OPERATION_NAME] == "text_completion"
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MODEL] == "cohere.command"
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_MODEL] == "cohere.command"
+ assert span.attributes[GEN_AI_OCI_API_FORMAT] == "COHERE"
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MAX_TOKENS] == 50
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_TEMPERATURE] == 0.7
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_TOP_P] == 0.9
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_CHOICE_COUNT] == 2
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_STOP_SEQUENCES] == ("\n\n",)
+ assert span.attributes[SpanAttributes.GEN_AI_IS_STREAMING] is False
+
+ input_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_INPUT_MESSAGES])
+ assert input_messages == [{"role": "user", "parts": [{"type": "text", "content": PROMPT}]}]
+
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert len(output_messages) == 2
+ for message in output_messages:
+ assert_valid_output_message(message)
+ assert output_messages[0]["parts"] == [{"type": "text", "content": "Traces flow like streams"}]
+ assert output_messages[0]["finish_reason"] == "stop"
+ assert output_messages[1]["finish_reason"] == "length"
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS] == ("stop", "length")
+
+ assert response.data.inference_response.generated_texts[0].text == "Traces flow like streams"
+ assert len(log_exporter.get_finished_logs()) == 0
+
+
+def test_generate_text_llama_legacy(instrument_legacy, oci_client, compartment_id, span_exporter):
+ request = models.LlamaLlmInferenceRequest(prompt=PROMPT, max_tokens=50, top_k=10)
+ with patch.object(oci_client.base_client, "call_api", return_value=_response(_llama_result())):
+ _generate(oci_client, compartment_id, "meta.llama-2-70b-chat", request)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == ["text_completion meta.llama-2-70b-chat"]
+ span = spans[0]
+
+ assert span.attributes[GEN_AI_OCI_API_FORMAT] == "LLAMA"
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_TOP_K] == 10
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert output_messages == [
+ {"role": "assistant", "parts": [{"type": "text", "content": "Signals converge"}], "finish_reason": "stop"}
+ ]
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS] == ("stop",)
+
+
+def test_generate_text_with_events_with_content(
+ instrument_with_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ request = models.CohereLlmInferenceRequest(prompt=PROMPT, max_tokens=50)
+ with patch.object(oci_client.base_client, "call_api", return_value=_response(_cohere_result())):
+ _generate(oci_client, compartment_id, "cohere.command", request)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == ["text_completion cohere.command"]
+ assert GenAIAttributes.GEN_AI_INPUT_MESSAGES not in spans[0].attributes
+ assert GenAIAttributes.GEN_AI_OUTPUT_MESSAGES not in spans[0].attributes
+
+ logs = log_exporter.get_finished_logs()
+ assert len(logs) == 3
+ assert_message_in_logs(logs[0], "gen_ai.user.message", {"content": PROMPT})
+ assert_message_in_logs(
+ logs[1],
+ "gen_ai.choice",
+ {"index": 0, "finish_reason": "stop", "message": {"content": "Traces flow like streams"}},
+ )
+ assert_message_in_logs(
+ logs[2],
+ "gen_ai.choice",
+ {"index": 1, "finish_reason": "length", "message": {"content": "Spans light the darkest path"}},
+ )
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/test_init.py b/packages/opentelemetry-instrumentation-oci-genai/tests/test_init.py
new file mode 100644
index 0000000000..e2ff722b2a
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/test_init.py
@@ -0,0 +1,292 @@
+"""Instrumentor lifecycle, suppression and error handling tests (no network, no cassettes)."""
+
+import json
+import os
+from unittest.mock import MagicMock, patch
+
+import oci
+import pytest
+from oci.generative_ai_inference import GenerativeAiInferenceClient, models
+from opentelemetry import context as context_api
+from opentelemetry import trace
+from opentelemetry.instrumentation.oci_genai import OCIGenAIInstrumentor, _wrap
+from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+from opentelemetry.semconv_ai import SUPPRESS_LANGUAGE_MODEL_INSTRUMENTATION_KEY, Meters
+from opentelemetry.trace.status import StatusCode
+from wrapt import FunctionWrapper
+
+CHAT_SPEC = {"method": "chat", "details_kwarg": "chat_details", "operation": "chat"}
+
+STREAM_PAYLOADS = [
+ '{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Hello"}]}}',
+ '{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":", world"}]}}',
+ '{"message":{"role":"ASSISTANT","content":[]},"finishReason":"stop"}',
+ '{"usage":{"completionTokens":8,"promptTokens":41,"totalTokens":49}}',
+ "[DONE]",
+]
+
+
+def _chat_details(compartment_id, model="meta.llama-3.3-70b-instruct"):
+ return models.ChatDetails(
+ compartment_id=compartment_id,
+ serving_mode=models.OnDemandServingMode(model_id=model),
+ chat_request=models.GenericChatRequest(
+ api_format="GENERIC",
+ messages=[models.UserMessage(content=[models.TextContent(text="Tell me a joke")])],
+ ),
+ )
+
+
+def _chat_result(model="meta.llama-3.3-70b-instruct"):
+ return models.ChatResult(
+ model_id=model,
+ chat_response=models.GenericChatResponse(
+ choices=[
+ models.ChatChoice(
+ index=0,
+ message=models.AssistantMessage(content=[models.TextContent(text="Hi there")]),
+ finish_reason="stop",
+ )
+ ],
+ usage=models.Usage(prompt_tokens=4, completion_tokens=2, total_tokens=6),
+ ),
+ )
+
+
+def _current_span_id():
+ return trace.get_current_span().get_span_context().span_id
+
+
+class RecordingSSEClient:
+ """Stand-in for the SDK's ``SSEClient``: records the span current at each pull and whether it was closed."""
+
+ def __init__(self, payloads):
+ self._payloads = payloads
+ self.pull_span_ids = []
+ self.closed = False
+
+ def events(self):
+ for payload in self._payloads:
+ self.pull_span_ids.append(_current_span_id())
+ yield MagicMock(data=payload)
+
+ def close(self):
+ self.closed = True
+
+
+def _streaming_chat(oci_client, compartment_id, sse_client):
+ details = _chat_details(compartment_id)
+ details.chat_request.is_stream = True
+ response = oci.response.Response(200, {}, sse_client, None)
+ with patch.object(oci_client.base_client, "call_api", return_value=response):
+ return oci_client.chat(details)
+
+
+def _assert_logs_correlated_with(logs, span):
+ assert logs, "expected emitted events"
+ for log in logs:
+ assert log.log_record.trace_id == span.context.trace_id
+ assert log.log_record.span_id == span.context.span_id
+
+
+class TestInstrumentor:
+ def test_instrument_and_uninstrument_wrap_client_methods(self, tracer_provider, meter_provider):
+ instrumentor = OCIGenAIInstrumentor()
+ instrumentor.instrument(tracer_provider=tracer_provider, meter_provider=meter_provider)
+ try:
+ for method in ("chat", "generate_text", "embed_text", "rerank_text"):
+ assert isinstance(vars(GenerativeAiInferenceClient)[method], FunctionWrapper)
+ finally:
+ instrumentor.uninstrument()
+ for method in ("chat", "generate_text", "embed_text", "rerank_text"):
+ assert not isinstance(vars(GenerativeAiInferenceClient)[method], FunctionWrapper)
+
+ def test_metrics_disabled(self, tracer_provider, meter_provider):
+ with patch.dict(os.environ, {"TRACELOOP_METRICS_ENABLED": "false"}):
+ instrumentor = OCIGenAIInstrumentor()
+ instrumentor.instrument(tracer_provider=tracer_provider, meter_provider=meter_provider)
+ instrumentor.uninstrument()
+
+ def test_missing_methods_are_skipped(self, tracer_provider, meter_provider):
+ instrumentor = OCIGenAIInstrumentor()
+ with patch(
+ "opentelemetry.instrumentation.oci_genai.wrap_function_wrapper",
+ side_effect=AttributeError("no such method"),
+ ):
+ instrumentor.instrument(tracer_provider=tracer_provider, meter_provider=meter_provider)
+ instrumentor.uninstrument()
+
+ def test_conflicting_attribute_flags_raise(self):
+ with pytest.raises(TypeError):
+ OCIGenAIInstrumentor(use_attributes=True, use_legacy_attributes=True)
+
+ def test_use_legacy_attributes_is_deprecated(self):
+ with pytest.warns(DeprecationWarning):
+ OCIGenAIInstrumentor(use_legacy_attributes=True)
+
+
+class TestWrap:
+ def test_suppression_keys_skip_span(self):
+ tracer = MagicMock()
+ wrapped = MagicMock(return_value="result")
+ wrapper = _wrap(tracer, None, None, None, CHAT_SPEC)
+
+ for key in (_SUPPRESS_INSTRUMENTATION_KEY, SUPPRESS_LANGUAGE_MODEL_INSTRUMENTATION_KEY):
+ token = context_api.attach(context_api.set_value(key, True))
+ try:
+ assert wrapper(wrapped, None, [_chat_details("c")], {}) == "result"
+ finally:
+ context_api.detach(token)
+ tracer.start_span.assert_not_called()
+
+ def test_details_passed_as_keyword(self):
+ tracer = MagicMock()
+ span = MagicMock()
+ span.is_recording.return_value = True
+ tracer.start_span.return_value = span
+ response = MagicMock()
+ response.data = None
+ wrapped = MagicMock(return_value=response)
+
+ wrapper = _wrap(tracer, None, None, None, CHAT_SPEC)
+ assert wrapper(wrapped, None, [], {"chat_details": _chat_details("c", model="m")}) is response
+ assert tracer.start_span.call_args.args[0] == "chat m"
+ span.end.assert_called_once()
+
+
+def test_service_error_sets_span_status(instrument_legacy, oci_client, compartment_id, span_exporter, reader):
+ error = oci.exceptions.ServiceError(
+ status=404, code="NotFound", headers={}, message="The requested API is not available."
+ )
+ with patch.object(oci_client.base_client, "call_api", side_effect=error):
+ with pytest.raises(oci.exceptions.ServiceError):
+ oci_client.chat(_chat_details(compartment_id))
+
+ spans = span_exporter.get_finished_spans()
+ assert len(spans) == 1
+ span = spans[0]
+ assert span.name == "chat meta.llama-3.3-70b-instruct"
+ assert span.status.status_code == StatusCode.ERROR
+ assert span.attributes["error.type"] == "ServiceError"
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MODEL] == "meta.llama-3.3-70b-instruct"
+ assert len([event for event in span.events if event.name == "exception"]) == 1
+
+ metrics = reader.get_metrics_data().resource_metrics[0].scope_metrics[0].metrics
+ duration = next(metric for metric in metrics if metric.name == Meters.LLM_OPERATION_DURATION)
+ assert duration.data.data_points[0].attributes["error.type"] == "ServiceError"
+
+
+def test_client_span_is_current_during_call_and_event_emission(
+ instrument_with_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ seen = {}
+
+ def fake_call_api(*args, **kwargs):
+ seen["span_id"] = _current_span_id()
+ return oci.response.Response(200, {}, _chat_result(), None)
+
+ with patch.object(oci_client.base_client, "call_api", side_effect=fake_call_api):
+ oci_client.chat(_chat_details(compartment_id))
+
+ # The client span was current while the SDK call ran, and is no longer current once ``chat`` returned.
+ spans = span_exporter.get_finished_spans()
+ assert len(spans) == 1
+ span = spans[0]
+ assert seen["span_id"] == span.context.span_id
+ assert _current_span_id() == trace.INVALID_SPAN_ID
+
+ logs = log_exporter.get_finished_logs()
+ assert [log.log_record.event_name for log in logs] == ["gen_ai.user.message", "gen_ai.choice"]
+ _assert_logs_correlated_with(logs, span)
+
+
+def test_streaming_span_is_current_while_pulling_events_and_finishing(
+ instrument_with_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ sse_client = RecordingSSEClient(STREAM_PAYLOADS)
+ result = _streaming_chat(oci_client, compartment_id, sse_client)
+ assert span_exporter.get_finished_spans() == ()
+
+ caller_span_ids = {_current_span_id() for _ in result.data.events()}
+
+ spans = span_exporter.get_finished_spans()
+ assert len(spans) == 1
+ span = spans[0]
+ assert span.status.status_code == StatusCode.OK
+ # The client span is current while the SDK stream is read, but never leaks into the caller's loop body.
+ assert sse_client.pull_span_ids == [span.context.span_id] * len(STREAM_PAYLOADS)
+ assert caller_span_ids == {trace.INVALID_SPAN_ID}
+
+ logs = log_exporter.get_finished_logs()
+ assert [log.log_record.event_name for log in logs] == ["gen_ai.user.message", "gen_ai.choice"]
+ _assert_logs_correlated_with(logs, span)
+
+
+def test_streaming_early_exit_finishes_span_as_incomplete(
+ instrument_legacy, oci_client, compartment_id, span_exporter, reader
+):
+ sse_client = RecordingSSEClient(STREAM_PAYLOADS)
+ result = _streaming_chat(oci_client, compartment_id, sse_client)
+
+ events = result.data.events()
+ next(events)
+ events.close() # what ``for event in events: ... break`` triggers once the generator is collected
+
+ assert sse_client.closed is True
+ spans = span_exporter.get_finished_spans()
+ assert len(spans) == 1
+ span = spans[0]
+ # Stopped by the caller: the partial output is kept, but the span is neither OK nor an error.
+ assert span.status.status_code == StatusCode.UNSET
+ assert "error.type" not in span.attributes
+ assert GenAIAttributes.GEN_AI_RESPONSE_FINISH_REASONS not in span.attributes
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert output_messages[0]["parts"] == [{"type": "text", "content": "Hello"}]
+
+ metrics = reader.get_metrics_data().resource_metrics[0].scope_metrics[0].metrics
+ assert Meters.LLM_OPERATION_DURATION in [metric.name for metric in metrics]
+
+
+def test_streaming_close_without_iteration_finishes_span(instrument_legacy, oci_client, compartment_id, span_exporter):
+ sse_client = RecordingSSEClient(STREAM_PAYLOADS)
+ result = _streaming_chat(oci_client, compartment_id, sse_client)
+
+ result.data.close()
+
+ assert sse_client.closed is True
+ spans = span_exporter.get_finished_spans()
+ assert len(spans) == 1
+ assert spans[0].status.status_code == StatusCode.UNSET
+ assert GenAIAttributes.GEN_AI_OUTPUT_MESSAGES not in spans[0].attributes
+
+ # Neither closing again nor iterating afterwards may finish the span a second time.
+ result.data.close()
+ list(result.data.events())
+ assert len(span_exporter.get_finished_spans()) == 1
+
+
+def test_streaming_iteration_error_finishes_span(instrument_legacy, oci_client, compartment_id, span_exporter):
+ class FailingSSEClient:
+ def events(self):
+ yield MagicMock(data='{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Hi"}]}}')
+ raise RuntimeError("Mid-stream failure")
+
+ details = _chat_details(compartment_id)
+ details.chat_request.is_stream = True
+ response = oci.response.Response(200, {}, FailingSSEClient(), None)
+ with patch.object(oci_client.base_client, "call_api", return_value=response):
+ result = oci_client.chat(details)
+
+ assert span_exporter.get_finished_spans() == ()
+ with pytest.raises(RuntimeError, match="Mid-stream failure"):
+ for _ in result.data.events():
+ pass
+
+ spans = span_exporter.get_finished_spans()
+ assert len(spans) == 1
+ assert spans[0].status.status_code == StatusCode.ERROR
+ assert spans[0].attributes["error.type"] == "RuntimeError"
+ assert len([event for event in spans[0].events if event.name == "exception"]) == 1
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/test_rerank.py b/packages/opentelemetry-instrumentation-oci-genai/tests/test_rerank.py
new file mode 100644
index 0000000000..5459e05c74
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/test_rerank.py
@@ -0,0 +1,95 @@
+import json
+
+import pytest
+from oci.generative_ai_inference import models
+from opentelemetry.instrumentation.oci_genai.span_utils import (
+ GEN_AI_OCI_RERANK_DOCUMENT_COUNT,
+ GEN_AI_OCI_RERANK_TOP_N,
+ GEN_AI_OCI_SERVING_MODE,
+ OCI_GENAI_PROVIDER,
+)
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+
+from tests import assert_message_in_logs, assert_valid_output_message
+
+RERANK_MODEL = "cohere.rerank-v4.0-fast"
+QUERY = "What is the capital of France?"
+DOCUMENTS = [
+ "Paris is the capital of France.",
+ "Berlin is the capital of Germany.",
+ "The Eiffel Tower is located in Paris.",
+]
+
+
+def _rerank(client, compartment_id):
+ return client.rerank_text(
+ models.RerankTextDetails(
+ compartment_id=compartment_id,
+ serving_mode=models.OnDemandServingMode(model_id=RERANK_MODEL),
+ input=QUERY,
+ documents=DOCUMENTS,
+ top_n=2,
+ )
+ )
+
+
+@pytest.mark.vcr
+def test_rerank_text_legacy(instrument_legacy, oci_client, compartment_id, span_exporter, log_exporter):
+ response = _rerank(oci_client, compartment_id)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"rerank {RERANK_MODEL}"]
+ span = spans[0]
+
+ assert span.attributes[GenAIAttributes.GEN_AI_PROVIDER_NAME] == OCI_GENAI_PROVIDER
+ assert span.attributes[GenAIAttributes.GEN_AI_OPERATION_NAME] == "rerank"
+ assert span.attributes[GenAIAttributes.GEN_AI_REQUEST_MODEL] == RERANK_MODEL
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_MODEL] == RERANK_MODEL
+ assert span.attributes[GEN_AI_OCI_SERVING_MODE] == "ON_DEMAND"
+ assert span.attributes[GEN_AI_OCI_RERANK_TOP_N] == 2
+ assert span.attributes[GEN_AI_OCI_RERANK_DOCUMENT_COUNT] == 3
+ assert span.attributes[GenAIAttributes.GEN_AI_RESPONSE_ID]
+
+ input_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_INPUT_MESSAGES])
+ assert [message["role"] for message in input_messages] == ["system", "system", "system", "user"]
+ assert [message["parts"][0]["content"] for message in input_messages] == DOCUMENTS + [QUERY]
+
+ output_messages = json.loads(span.attributes[GenAIAttributes.GEN_AI_OUTPUT_MESSAGES])
+ assert len(output_messages) == 2
+ for message, rank in zip(output_messages, response.data.document_ranks):
+ assert_valid_output_message(message)
+ assert message["role"] == "assistant"
+ assert message["parts"][0]["content"] == f"Doc {rank.index}, Score: {rank.relevance_score}"
+ assert response.data.document_ranks[0].index == 0
+
+ assert len(log_exporter.get_finished_logs()) == 0
+
+
+@pytest.mark.vcr
+def test_rerank_text_with_events_with_content(
+ instrument_with_content, oci_client, compartment_id, span_exporter, log_exporter
+):
+ response = _rerank(oci_client, compartment_id)
+
+ spans = span_exporter.get_finished_spans()
+ assert [span.name for span in spans] == [f"rerank {RERANK_MODEL}"]
+ assert GenAIAttributes.GEN_AI_INPUT_MESSAGES not in spans[0].attributes
+ assert GenAIAttributes.GEN_AI_OUTPUT_MESSAGES not in spans[0].attributes
+
+ logs = log_exporter.get_finished_logs()
+ assert len(logs) == 6
+ for log, document in zip(logs[:3], DOCUMENTS):
+ assert_message_in_logs(log, "gen_ai.system.message", {"content": document})
+ assert_message_in_logs(logs[3], "gen_ai.user.message", {"content": QUERY})
+ for index, (log, rank) in enumerate(zip(logs[4:], response.data.document_ranks)):
+ assert_message_in_logs(
+ log,
+ "gen_ai.choice",
+ {
+ "index": index,
+ "finish_reason": "stop",
+ "message": {"content": f"Doc {rank.index}, Score: {rank.relevance_score}"},
+ },
+ )
diff --git a/packages/opentelemetry-instrumentation-oci-genai/tests/test_span_utils.py b/packages/opentelemetry-instrumentation-oci-genai/tests/test_span_utils.py
new file mode 100644
index 0000000000..801359f33f
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/tests/test_span_utils.py
@@ -0,0 +1,479 @@
+"""Unit tests for span_utils / streaming helpers (no network, no cassettes)."""
+
+import json
+from unittest.mock import MagicMock
+
+import pytest
+from oci.generative_ai_inference import models
+from opentelemetry.instrumentation.oci_genai.span_utils import (
+ CHAT,
+ EMBEDDINGS,
+ GEN_AI_OCI_ENDPOINT_ID,
+ GEN_AI_OCI_SERVING_MODE,
+ RERANK,
+ chat_request_to_messages,
+ chat_response_to_messages,
+ get_request_model,
+ map_finish_reason,
+ set_input_attributes,
+ set_request_attributes,
+ set_response_attributes,
+ stream_choices_to_messages,
+ usage_to_dict,
+)
+from opentelemetry.instrumentation.oci_genai.streaming import (
+ OCIGenAIStreamWrapper,
+ StreamAccumulator,
+)
+from opentelemetry.instrumentation.oci_genai.utils import get_server_address
+from opentelemetry.semconv._incubating.attributes import (
+ gen_ai_attributes as GenAIAttributes,
+)
+
+from tests import assert_valid_output_message, assert_valid_parts
+
+
+def _span(recording=True):
+ span = MagicMock()
+ span.is_recording.return_value = recording
+ attributes = {}
+ span.set_attribute = lambda name, value: attributes.__setitem__(name, value)
+ span._attrs = attributes
+ return span
+
+
+# ---------------------------------------------------------------------------
+# finish reasons / usage
+# ---------------------------------------------------------------------------
+
+
+@pytest.mark.parametrize(
+ "raw,expected",
+ [
+ ("stop", "stop"),
+ ("length", "length"),
+ ("tool_calls", "tool_call"),
+ ("content_filter", "content_filter"),
+ ("COMPLETE", "stop"),
+ ("STOP_SEQUENCE", "stop"),
+ ("MAX_TOKENS", "length"),
+ ("TOOL_CALL", "tool_call"),
+ ("ERROR_TOXIC", "content_filter"),
+ ("ERROR", "error"),
+ ("USER_CANCEL", "user_cancel"),
+ (None, ""),
+ ],
+)
+def test_map_finish_reason(raw, expected):
+ assert map_finish_reason(raw) == expected
+
+
+def test_usage_to_dict_from_model_and_stream_payload():
+ usage = models.Usage(
+ prompt_tokens=19,
+ completion_tokens=11,
+ total_tokens=30,
+ prompt_tokens_details=models.PromptTokensDetails(cached_tokens=5),
+ completion_tokens_details=models.CompletionTokensDetails(reasoning_tokens=3),
+ )
+ assert usage_to_dict(usage) == {
+ "input_tokens": 19,
+ "output_tokens": 11,
+ "total_tokens": 30,
+ "cached_tokens": 5,
+ "reasoning_tokens": 3,
+ }
+
+ stream_usage = usage_to_dict({"promptTokens": 41, "completionTokens": 8})
+ assert stream_usage["input_tokens"] == 41
+ assert stream_usage["output_tokens"] == 8
+ assert stream_usage["total_tokens"] == 49
+
+ embeddings_usage = usage_to_dict(models.Usage(prompt_tokens=4, completion_tokens=0, total_tokens=4), False)
+ assert embeddings_usage["output_tokens"] is None
+ assert embeddings_usage["total_tokens"] == 4
+
+
+# ---------------------------------------------------------------------------
+# request -> input messages
+# ---------------------------------------------------------------------------
+
+
+def test_generic_request_with_tools_and_images():
+ request = models.GenericChatRequest(
+ api_format="GENERIC",
+ messages=[
+ models.SystemMessage(content=[models.TextContent(text="Be helpful")]),
+ models.UserMessage(
+ content=[
+ models.TextContent(text="What is in this picture?"),
+ models.ImageContent(image_url=models.ImageUrl(url="https://example.com/cat.png")),
+ models.ImageContent(image_url=models.ImageUrl(url="data:image/png;base64,AAAA")),
+ ]
+ ),
+ models.AssistantMessage(
+ content=[models.TextContent(text="Let me check")],
+ tool_calls=[
+ models.FunctionCall(id="call_1", name="lookup", arguments='{"animal": "cat"}'),
+ ],
+ ),
+ models.ToolMessage(tool_call_id="call_1", content=[models.TextContent(text="a tabby cat")]),
+ ],
+ )
+
+ messages, system_parts = chat_request_to_messages(request)
+ assert system_parts == []
+ assert [message["role"] for message in messages] == ["system", "user", "assistant", "tool"]
+ for message in messages:
+ assert_valid_parts(message["parts"])
+
+ assert messages[1]["parts"] == [
+ {"type": "text", "content": "What is in this picture?"},
+ {"type": "uri", "modality": "image", "uri": "https://example.com/cat.png"},
+ {"type": "blob", "modality": "image", "mime_type": "image/png", "content": "AAAA"},
+ ]
+ assert messages[2]["parts"] == [
+ {"type": "text", "content": "Let me check"},
+ {"type": "tool_call", "name": "lookup", "arguments": {"animal": "cat"}, "id": "call_1"},
+ ]
+ assert messages[3]["parts"] == [{"type": "tool_call_response", "id": "call_1", "response": "a tabby cat"}]
+
+
+def test_cohere_request_with_history_and_tool_results():
+ request = models.CohereChatRequest(
+ api_format="COHERE",
+ preamble_override="You are terse.",
+ message="Book it",
+ chat_history=[
+ models.CohereUserMessage(message="Find flights"),
+ models.CohereChatBotMessage(
+ message="Searching",
+ tool_calls=[models.CohereToolCall(name="search_flights", parameters={"to": "CDG"})],
+ ),
+ models.CohereToolMessage(
+ tool_results=[
+ models.CohereToolResult(
+ call=models.CohereToolCall(name="search_flights", parameters={"to": "CDG"}),
+ outputs=[{"flight": "AF123"}],
+ )
+ ]
+ ),
+ ],
+ )
+
+ messages, system_parts = chat_request_to_messages(request)
+ assert system_parts == [{"type": "text", "content": "You are terse."}]
+ assert [message["role"] for message in messages] == ["user", "assistant", "tool", "user"]
+ for message in messages:
+ assert_valid_parts(message["parts"])
+ assert messages[1]["parts"][1] == {"type": "tool_call", "name": "search_flights", "arguments": {"to": "CDG"}}
+ assert messages[2]["parts"] == [
+ {"type": "tool_call_response", "id": "search_flights", "response": [{"flight": "AF123"}]}
+ ]
+ assert messages[3]["parts"] == [{"type": "text", "content": "Book it"}]
+
+
+def test_cohere_v2_request_and_response():
+ request = models.CohereChatRequestV2(
+ api_format="COHEREV2",
+ messages=[
+ models.CohereSystemMessageV2(content=[models.CohereTextContentV2(text="Be terse")]),
+ models.CohereUserMessageV2(content=[models.CohereTextContentV2(text="Hi")]),
+ ],
+ )
+ messages, system_parts = chat_request_to_messages(request)
+ assert system_parts == []
+ assert messages == [
+ {"role": "system", "parts": [{"type": "text", "content": "Be terse"}]},
+ {"role": "user", "parts": [{"type": "text", "content": "Hi"}]},
+ ]
+
+ response = models.CohereChatResponseV2(
+ api_format="COHEREV2",
+ id="resp-1",
+ finish_reason="TOOL_CALL",
+ message=models.CohereAssistantMessageV2(
+ content=[
+ models.CohereTextContentV2(text="Calling a tool"),
+ models.CohereThinkingContentV2(thinking="need weather"),
+ ],
+ tool_calls=[
+ # ``CohereToolCallV2.function`` is an untyped object (plain dict) in the SDK
+ models.CohereToolCallV2(id="tc-1", function={"name": "weather", "arguments": '{"city": "Paris"}'})
+ ],
+ ),
+ )
+ output = chat_response_to_messages(response)
+ assert len(output) == 1
+ assert_valid_output_message(output[0])
+ assert output[0]["finish_reason"] == "tool_call"
+ assert output[0]["parts"] == [
+ {"type": "text", "content": "Calling a tool"},
+ {"type": "reasoning", "content": "need weather"},
+ {"type": "tool_call", "name": "weather", "arguments": {"city": "Paris"}, "id": "tc-1"},
+ ]
+
+
+def test_generic_response_with_tool_calls_and_multiple_choices():
+ response = models.GenericChatResponse(
+ api_format="GENERIC",
+ choices=[
+ models.ChatChoice(
+ index=0,
+ finish_reason="tool_calls",
+ message=models.AssistantMessage(
+ content=[],
+ tool_calls=[models.FunctionCall(id="c1", name="get_time", arguments="{}")],
+ ),
+ ),
+ models.ChatChoice(
+ index=1,
+ finish_reason="length",
+ message=models.AssistantMessage(content=[models.TextContent(text="Partial")]),
+ ),
+ ],
+ )
+ output = chat_response_to_messages(response)
+ assert [message["finish_reason"] for message in output] == ["tool_call", "length"]
+ assert output[0]["parts"] == [{"type": "tool_call", "name": "get_time", "arguments": {}, "id": "c1"}]
+ assert output[1]["parts"] == [{"type": "text", "content": "Partial"}]
+
+
+# ---------------------------------------------------------------------------
+# dedicated endpoints / attribute setters
+# ---------------------------------------------------------------------------
+
+
+def test_dedicated_serving_mode_attributes():
+ endpoint_id = "ocid1.generativeaiendpoint.oc1.us-chicago-1.example"
+ details = models.ChatDetails(
+ compartment_id="ocid1.compartment.oc1..example",
+ serving_mode=models.DedicatedServingMode(endpoint_id=endpoint_id),
+ chat_request=models.GenericChatRequest(api_format="GENERIC", messages=[], is_stream=True),
+ )
+ assert get_request_model(details) == endpoint_id
+
+ span = _span()
+ set_request_attributes(span, CHAT, details, instance=None)
+ assert span._attrs[GEN_AI_OCI_SERVING_MODE] == "DEDICATED"
+ assert span._attrs[GEN_AI_OCI_ENDPOINT_ID] == endpoint_id
+ assert span._attrs["gen_ai.is_streaming"] is True
+ assert "server.address" not in span._attrs
+
+
+def test_get_server_address_strips_endpoint_templates():
+ instance = MagicMock()
+ instance.base_client.endpoint = (
+ "https://inference.generativeai.us-chicago-1.{dualStack?ds.:}oci.oraclecloud.com/20231130"
+ )
+ assert get_server_address(instance) == "inference.generativeai.us-chicago-1.oci.oraclecloud.com"
+ assert get_server_address(object()) is None
+
+
+def test_input_attributes_respect_content_tracing(monkeypatch):
+ details = models.ChatDetails(
+ serving_mode=models.OnDemandServingMode(model_id="m"),
+ chat_request=models.GenericChatRequest(
+ api_format="GENERIC", messages=[models.UserMessage(content=[models.TextContent(text="secret")])]
+ ),
+ )
+ monkeypatch.setenv("TRACELOOP_TRACE_CONTENT", "false")
+ span = _span()
+ set_input_attributes(span, CHAT, details)
+ assert GenAIAttributes.GEN_AI_INPUT_MESSAGES not in span._attrs
+
+ monkeypatch.setenv("TRACELOOP_TRACE_CONTENT", "true")
+ set_input_attributes(span, CHAT, details)
+ assert json.loads(span._attrs[GenAIAttributes.GEN_AI_INPUT_MESSAGES])[0]["parts"][0]["content"] == "secret"
+
+
+def test_embeddings_and_rerank_request_attributes():
+ span = _span()
+ embed_details = models.EmbedTextDetails(
+ serving_mode=models.OnDemandServingMode(model_id="cohere.embed-v4.0"),
+ inputs=["a", "b", "c"],
+ embedding_types=["float"],
+ output_dimensions=256,
+ )
+ set_request_attributes(span, EMBEDDINGS, embed_details, instance=None)
+ assert span._attrs["gen_ai.oci.embeddings.input_count"] == 3
+ assert span._attrs[GenAIAttributes.GEN_AI_REQUEST_ENCODING_FORMATS] == ["float"]
+ assert span._attrs[GenAIAttributes.GEN_AI_EMBEDDINGS_DIMENSION_COUNT] == 256
+
+ result = models.EmbedTextResult(id="req", model_id="cohere.embed-v4.0", embeddings=[[0.1] * 256] * 3)
+ response = MagicMock()
+ response.data = result
+ assert set_response_attributes(span, EMBEDDINGS, response) is None
+ assert span._attrs[GenAIAttributes.GEN_AI_EMBEDDINGS_DIMENSION_COUNT] == 256
+ assert span._attrs[GenAIAttributes.GEN_AI_RESPONSE_ID] == "req"
+
+ span = _span()
+ rerank_details = models.RerankTextDetails(
+ serving_mode=models.OnDemandServingMode(model_id="cohere.rerank-v4.0-fast"),
+ input="q",
+ documents=["d1", "d2"],
+ top_n=1,
+ )
+ set_request_attributes(span, RERANK, rerank_details, instance=None)
+ assert span._attrs["gen_ai.oci.rerank.top_n"] == 1
+ assert span._attrs["gen_ai.oci.rerank.document_count"] == 2
+
+
+# ---------------------------------------------------------------------------
+# streaming accumulator
+# ---------------------------------------------------------------------------
+
+GENERIC_EVENTS = [
+ '{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":""}]},"pad":"aaa"}',
+ '{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":"Hello"}]},"pad":"a"}',
+ '{"index":0,"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":", world"}]},"pad":"aa"}',
+ '{"message":{"role":"ASSISTANT","content":[{"type":"TEXT","text":""}]},"finishReason":"stop","pad":"aaaa"}',
+ '{"usage":{"completionTokens":8,"promptTokens":41,"totalTokens":49},"pad":"aaaa"}',
+ "[DONE]",
+]
+
+COHERE_EVENTS = [
+ '{"apiFormat":"COHERE","text":"Hi","pad":"aaaa"}',
+ '{"apiFormat":"COHERE","text":" there","pad":"aa"}',
+ '{"apiFormat":"COHERE","text":"Hi there","chatHistory":[{"role":"USER","message":"Say hi."},'
+ '{"role":"CHATBOT","message":"Hi there"}],"finishReason":"COMPLETE","pad":"a",'
+ '"usage":{"completionTokens":2,"promptTokens":6,"totalTokens":8}}',
+]
+
+
+def test_stream_accumulator_generic():
+ accumulator = StreamAccumulator()
+ for event in GENERIC_EVENTS:
+ accumulator.process(event)
+ choices = accumulator.choices_list()
+ assert len(choices) == 1
+ assert choices[0]["text"] == "Hello, world"
+ assert choices[0]["finish_reason"] == "stop"
+ assert accumulator.usage == {"completionTokens": 8, "promptTokens": 41, "totalTokens": 49}
+
+ messages = stream_choices_to_messages(choices)
+ assert_valid_output_message(messages[0])
+ assert messages[0] == {
+ "role": "assistant",
+ "parts": [{"type": "text", "content": "Hello, world"}],
+ "finish_reason": "stop",
+ }
+
+
+def test_stream_accumulator_cohere_terminal_event_carries_full_text():
+ accumulator = StreamAccumulator()
+ for event in COHERE_EVENTS:
+ accumulator.process(event)
+ choices = accumulator.choices_list()
+ assert accumulator.api_format == "COHERE"
+ assert choices[0]["text"] == "Hi there"
+ assert choices[0]["finish_reason"] == "COMPLETE"
+ assert usage_to_dict(accumulator.usage)["total_tokens"] == 8
+ assert stream_choices_to_messages(choices)[0]["finish_reason"] == "stop"
+
+
+def test_stream_accumulator_tool_call_deltas_and_garbage():
+ accumulator = StreamAccumulator()
+ accumulator.process("not json")
+ accumulator.process(
+ '{"message":{"role":"ASSISTANT","toolCalls":[{"id":"c1","name":"get_weather","arguments":"{\\"ci"}]}}'
+ )
+ accumulator.process('{"message":{"role":"ASSISTANT","toolCalls":[{"id":"c1","arguments":"ty\\": \\"Paris\\"}"}]}}')
+ accumulator.process('{"message":{"role":"ASSISTANT","content":[]},"finishReason":"tool_calls"}')
+ messages = stream_choices_to_messages(accumulator.choices_list())
+ assert messages[0]["finish_reason"] == "tool_call"
+ assert messages[0]["parts"] == [
+ {"type": "tool_call", "name": "get_weather", "arguments": {"city": "Paris"}, "id": "c1"}
+ ]
+
+
+class FakeEvent:
+ def __init__(self, data):
+ self.data = data
+
+
+class FakeSSEClient:
+ def __init__(self, events, fail=False):
+ self._events = events
+ self._fail = fail
+ self.closed = False
+
+ def events(self):
+ for event in self._events:
+ yield FakeEvent(event)
+ if self._fail:
+ raise RuntimeError("boom")
+
+ def close(self):
+ self.closed = True
+
+
+def _wrap_stream(sse_client, calls):
+ return OCIGenAIStreamWrapper(
+ sse_client, StreamAccumulator(), lambda acc, err, complete: calls.append((acc, err, complete))
+ )
+
+
+def test_stream_wrapper_invokes_callback_once_and_on_error():
+ calls = []
+ wrapper = _wrap_stream(FakeSSEClient(GENERIC_EVENTS), calls)
+ events = list(wrapper.events())
+ assert len(events) == len(GENERIC_EVENTS)
+ assert len(calls) == 1
+ assert calls[0][1] is None
+ assert calls[0][2] is True
+ assert calls[0][0].choices_list()[0]["text"] == "Hello, world"
+
+ calls.clear()
+ wrapper = _wrap_stream(FakeSSEClient(GENERIC_EVENTS[:2], fail=True), calls)
+ with pytest.raises(RuntimeError, match="boom"):
+ list(wrapper.events())
+ assert len(calls) == 1
+ assert isinstance(calls[0][1], RuntimeError)
+ assert calls[0][2] is False
+
+
+def test_stream_wrapper_early_exit_is_incomplete():
+ calls = []
+ sse_client = FakeSSEClient(GENERIC_EVENTS)
+ wrapper = _wrap_stream(sse_client, calls)
+ events = wrapper.events()
+ next(events)
+ next(events)
+ events.close() # what leaving a ``for`` loop early triggers once the generator is collected
+ assert len(calls) == 1
+ assert calls[0][1] is None
+ assert calls[0][2] is False
+ assert calls[0][0].choices_list()[0]["text"] == "Hello"
+ assert sse_client.closed is True # the SDK's event source is released, not left to GC
+
+
+def test_stream_wrapper_early_exit_survives_close_failure():
+ class UnclosableSSEClient(FakeSSEClient):
+ def close(self):
+ raise OSError("socket already gone")
+
+ calls = []
+ wrapper = _wrap_stream(UnclosableSSEClient(GENERIC_EVENTS), calls)
+ events = wrapper.events()
+ next(events)
+ events.close() # must not raise: the close failure is logged, the cancellation is still reported once
+ assert len(calls) == 1
+ assert calls[0][2] is False
+
+
+def test_stream_wrapper_close_finishes_once_and_closes_stream():
+ calls = []
+ sse_client = FakeSSEClient(GENERIC_EVENTS)
+ wrapper = _wrap_stream(sse_client, calls)
+ wrapper.close()
+ assert sse_client.closed is True
+ assert calls == [(wrapper._self_accumulator, None, False)]
+
+ # close() after normal exhaustion must not report the stream a second time
+ calls.clear()
+ wrapper = _wrap_stream(FakeSSEClient(GENERIC_EVENTS), calls)
+ list(wrapper.events())
+ wrapper.close()
+ assert len(calls) == 1
+ assert calls[0][2] is True
diff --git a/packages/opentelemetry-instrumentation-oci-genai/uv.lock b/packages/opentelemetry-instrumentation-oci-genai/uv.lock
new file mode 100644
index 0000000000..1c397cb6b2
--- /dev/null
+++ b/packages/opentelemetry-instrumentation-oci-genai/uv.lock
@@ -0,0 +1,1667 @@
+version = 1
+revision = 3
+requires-python = ">=3.10, <4"
+
+[manifest]
+constraints = [
+ { name = "pip", specifier = ">=25.3" },
+ { name = "urllib3", specifier = ">=2.6.3" },
+]
+
+[[package]]
+name = "aiohappyeyeballs"
+version = "2.7.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ce/f4/eec0465c2f67b2664688d0240b3212d5196fd89e741df67ddb81f8d35658/aiohappyeyeballs-2.7.1.tar.gz", hash = "sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d", size = 24757, upload-time = "2026-07-01T17:11:55.501Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/71/43/1947f06babed6b3f1d7f38b0c767f52df66bfb2bc10b468c4a7de9eceff2/aiohappyeyeballs-2.7.1-py3-none-any.whl", hash = "sha256:9243213661e29250eb41368e5daa826fc017156c3b8a11440826b2e3ed376472", size = 15038, upload-time = "2026-07-01T17:11:54.055Z" },
+]
+
+[[package]]
+name = "aiohttp"
+version = "3.14.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "aiohappyeyeballs" },
+ { name = "aiosignal" },
+ { name = "async-timeout", marker = "python_full_version < '3.11'" },
+ { name = "attrs" },
+ { name = "frozenlist" },
+ { name = "multidict" },
+ { name = "propcache" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+ { name = "yarl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213, upload-time = "2026-07-23T01:57:27.037Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2d/4d/4a99fb425c5e0cad715eea7bd190aff46f38b959a0a2dadb993705d34b26/aiohttp-3.14.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eb0495d778817619273c108784292be161a924b9f5ae5cbbc70a2caa6838250b", size = 765848, upload-time = "2026-07-23T01:52:08.217Z" },
+ { url = "https://files.pythonhosted.org/packages/74/e8/43b85dc55b8e950dc644babe762add781319ea881b57b33d2cce12017d12/aiohttp-3.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c3c200cf9757edd785051dc699c7ecbec22110dbfcb3fefc7a9f9695eda8ea7a", size = 517476, upload-time = "2026-07-23T01:52:10.846Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/9e/73b582c4dbbc3c12ef4473822475effaabf1f934b56f14f5b03fe5d3a2af/aiohttp-3.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd51ebf9d3a00c074df4ede271023f4d2dba289bcc740b88191872716014e3c5", size = 515334, upload-time = "2026-07-23T01:52:12.636Z" },
+ { url = "https://files.pythonhosted.org/packages/79/03/e98c3c9e05a5bdf97defe5ff9169baba4f0ec9a901f2d60e0f060c2f051e/aiohttp-3.14.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:134ac5ddcf61c6fad984b9a5727d83492ada43d63471db20fb73042c13fca62f", size = 1708830, upload-time = "2026-07-23T01:52:14.538Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/2c/26e60b694844dfd2176c57f913a22d0cd6a16f9ff202cbda7580d0328b98/aiohttp-3.14.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:70c987b27534f9ae1a723f47ae921571d616da21d3208282bf4c52af5164ac43", size = 1674012, upload-time = "2026-07-23T01:52:16.486Z" },
+ { url = "https://files.pythonhosted.org/packages/38/65/672df92e3172cd876aacfa97a952ac560877eb169384b2991ac5b273de4c/aiohttp-3.14.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1b59533861b70a2185c8f4f350f791f39d64358ef6944ce71c5240c9ec0982c9", size = 1767015, upload-time = "2026-07-23T01:52:18.28Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/c5/228dec7bfec1c373cc2217cdeb47d6456dcd7a13a4c55144930a75ae3851/aiohttp-3.14.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1c5281acc88b92396f88c7e1e2748f8466689df22b80170e4f51efa712fb47a8", size = 1858700, upload-time = "2026-07-23T01:52:20.08Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/ff/cb36724e8c8d17f90ada567a9ff3efe1d6e9b549fba697a242aece180f21/aiohttp-3.14.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48d67b87db6279c044760787eb01f6413032c2e6f3ba1cafaa492b1c8e578479", size = 1714075, upload-time = "2026-07-23T01:52:22.071Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/3a/296a4135c6366376263aeef54b15caca1f07676c2ae0c525d7832f2f808a/aiohttp-3.14.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f53bcd52f585e1ac3e590d61434eb61f9a88c38df041b4ea126d97144344a77b", size = 1588234, upload-time = "2026-07-23T01:52:23.757Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/81/9d5d853ef892dc066d1eb6db0e87a47348b920c1c879aa554612fdbd9d79/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0fdea2281997af69da84c77ffa6f5938a0285f21fb3887c249d67419ca865b3d", size = 1677300, upload-time = "2026-07-23T01:52:25.861Z" },
+ { url = "https://files.pythonhosted.org/packages/68/96/021d386ae32d9b26d4b88df2e794546232ff56bb6be952bf6be227c0bbc7/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cda5fd5c95ad7a125a2e8464acc78b98b94c475a3780d6aa0aa157c93f470f4d", size = 1691501, upload-time = "2026-07-23T01:52:28Z" },
+ { url = "https://files.pythonhosted.org/packages/29/9f/af66adce26a14af135c003cbd0f44ccaa68cebd30ff8ac99ca47fb4958f7/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6debfa7312ff9d4c124dc71d72e9a0a4b9e0879e48ba6fcb42bef5c3300289e2", size = 1735113, upload-time = "2026-07-23T01:52:29.995Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/90/28c390d4c9851effe52ac25b5a2e1d92246acd00728b4fc7975dafb67484/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f4e05329faa0ea1a404b37de4f034fd2c2defcca06a68dc6745e4e56c88e8a48", size = 1577486, upload-time = "2026-07-23T01:52:31.937Z" },
+ { url = "https://files.pythonhosted.org/packages/db/c2/00e23a1bf2abb70dd353f6987db7e7f2491d0261f7363997738c71c98f95/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a3a8296e7ab5c295f53f1041487cb088e1480775aafbf7fe545d93b770a0f96f", size = 1751353, upload-time = "2026-07-23T01:52:33.688Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/7d/d51a706a8cbfa57f0611127daf61ab3ae02ab8420b0407412079227d1c65/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5373dc80ad1aa2fb9ad95c83f24eef418bbda3a61375f128e5b0192e4f3f9b32", size = 1698681, upload-time = "2026-07-23T01:52:38.167Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/b0/90bd5cd9fdd9787cb4211d284d1fb8401339a933cb0227a15b71e789232f/aiohttp-3.14.3-cp310-cp310-win32.whl", hash = "sha256:a3e22975f905b89a55a488c2a08f2fdb2186175349e917d48985cc468a3d4c6e", size = 456733, upload-time = "2026-07-23T01:52:41.823Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/15/fe5b8f6a71ae112bc677163d0b0701bda5dc15005249582258ede0eb88c7/aiohttp-3.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdd0e2834dce1a26c1bbe26464861e16bbe217042cbff619247c11594472518c", size = 480460, upload-time = "2026-07-23T01:52:43.905Z" },
+ { url = "https://files.pythonhosted.org/packages/54/00/45e98b6645cd7f00a4b78b749ebd309094b0eaeb2d2e96157eadbc0d0050/aiohttp-3.14.3-cp310-cp310-win_arm64.whl", hash = "sha256:eac645b09bcfdf73df7536331f0678c1086ea250981118ddb5199e17ccef72bb", size = 453479, upload-time = "2026-07-23T01:52:46.075Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/5c/b3e4ff8ad43a8afef9602c5e90285936da1beaea8b029016b793891f03c3/aiohttp-3.14.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e568e14940c09955aa51f4e645b6daa18a581c5dcfcd73744dcc86a856e3ced3", size = 764250, upload-time = "2026-07-23T01:52:48.525Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/da/f1b384465e51449d844056b75070461da03a9a23e6c1747003695bf4172a/aiohttp-3.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54cfcdee2770dac994417cbb0ee1f3eb0e7cb6b30c79bf44f2c02ff79ec5124a", size = 516281, upload-time = "2026-07-23T01:52:51.047Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/3f/01264f820ee2e3712a827892b1cd6ff80f3300c1fcbffbb45714a915d47a/aiohttp-3.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:21c016079415ed3fd676963e9793700a566d85dbbd6bfc564b9b2d209147dcc8", size = 514742, upload-time = "2026-07-23T01:52:53.779Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/8d/a71c6f2db52ac1ed142b133f7feddaa6b70539c3f4de24d7e226c95b794c/aiohttp-3.14.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6088ec9894113802bddb3c09e974929aed2c7b3a8c456219b8aab4481f1a239", size = 1780613, upload-time = "2026-07-23T01:52:56.948Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/11/3dd9b3fb3a170f6ec9011b5291d876a6fab4086714c9e158600edf01b4fd/aiohttp-3.14.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:16ea7e24c309fb7c0bbd505d149abe4fe4dccfb8db911db7dbec0921bc889a6f", size = 1737688, upload-time = "2026-07-23T01:52:59.294Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/3e/834c26918be7d88068822b40e0db30fca50b5f4fe79104aa16a93f1d74e6/aiohttp-3.14.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56f355e79f71aef2a85c80305cc915f894b170dba76de5fe84f6351939b83c06", size = 1845742, upload-time = "2026-07-23T01:53:01.641Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/c9/49ab8572df7d66bc13d11e31f781292badb04180dd87ba98733066c6aed7/aiohttp-3.14.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:18c441d0a8fca6de8d1f546849b9f0ab20d435993e2c5b59562b2fae6be2f929", size = 1928412, upload-time = "2026-07-23T01:53:04.018Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/b9/2b8f0c0ce09c87a1daf80fd483431b56b1435d3f62789bc86f572e1245de/aiohttp-3.14.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53e7b4ce82b54a8bcc71b3b67a5cbd177ca1d7f592cbc92cd38b7349f73482db", size = 1786220, upload-time = "2026-07-23T01:53:06.481Z" },
+ { url = "https://files.pythonhosted.org/packages/85/00/9c45f81de11710460edfa1dc81317b6e882703b160926c879a9d20da9fcc/aiohttp-3.14.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f55119f7bf25f49ed210f6096090715da24f2943c62102448915fde3c62877ce", size = 1637231, upload-time = "2026-07-23T01:53:10.258Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ce/967d628e910756f3539c6107cb7844a1b69440dcb3029a5ee7871b09ab63/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9aa6e61fdf20105c4144e755bd586008ff450791d67b1c8146fdc15959c4d51c", size = 1753161, upload-time = "2026-07-23T01:53:13.817Z" },
+ { url = "https://files.pythonhosted.org/packages/11/b2/0c3d4114f0aee4f580f5b3b4eb71b24d7a23b834ea506a4dfebe76513f35/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ccd4893707b3e2a13e39c90d43cf80edf2e4d0457935bcc103bf2346214c3f15", size = 1756356, upload-time = "2026-07-23T01:53:16.211Z" },
+ { url = "https://files.pythonhosted.org/packages/63/5d/99e7d91c82f1399d1ae2a854e080bd1493fbc31e5e959dbc4ec33dac3bec/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2466434105a4e03113c36ec775cc2ebe6676b62eae326fa670bb607ef788c1c", size = 1819846, upload-time = "2026-07-23T01:53:18.289Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/05/d5e1cb6480eeffd3f901d40a2c5e2d1e7effdc797837da3b490272699f13/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ba59d59aba08ac02fc03b0c8983ccd5ee39a199d0552ce9e6d2b4845b34d59ae", size = 1628531, upload-time = "2026-07-23T01:53:23.86Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/90/b934682bcaefae18a9e04f3dff5b68522ba810906358ae5029b68110ea3b/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ed099d105449c4f9e84f24af203cd131349d4761d8813fa7e02c32e7128cd910", size = 1832712, upload-time = "2026-07-23T01:53:27.551Z" },
+ { url = "https://files.pythonhosted.org/packages/21/df/6061679faaf81fac746e7307c7adb71e858071a5d34c27583afefc64f543/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:152516815ef926786a0b6ae2b8f1fd2e0c71582dee0b435636865316fd4891b7", size = 1775014, upload-time = "2026-07-23T01:53:30.223Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/1d/f854878bbc69b88faefe924b619a34a6f59ec05fd387c77690667eaa75eb/aiohttp-3.14.3-cp311-cp311-win32.whl", hash = "sha256:a4af35c443e0b1a1bd6a8af3f3485d7fda15c142751a00f3ff8090f0b93346fa", size = 456006, upload-time = "2026-07-23T01:53:34.97Z" },
+ { url = "https://files.pythonhosted.org/packages/73/0c/2af9d1674baccd1dbd47282a93d660a22e57ef6167c856deb24b4214fbab/aiohttp-3.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1e74298bab6ee0d6e749ed4fd1901c7e604bdda32c03d787a2cc71c46d0433d", size = 481069, upload-time = "2026-07-23T01:53:39.673Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/76/88401ff3fc95e85c5fc38d588f36f55e61ecb64343b2bc8d69326f453cc0/aiohttp-3.14.3-cp311-cp311-win_arm64.whl", hash = "sha256:03cd2bde3d7f085b64e549c985f4bb928cad7e8ecf5323bfca320db548d81b39", size = 453021, upload-time = "2026-07-23T01:53:43.749Z" },
+ { url = "https://files.pythonhosted.org/packages/18/d4/eb96299230e20acf2efae207cb8d69051f1f68e357e5ea5e479bf6fb097a/aiohttp-3.14.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:39aded8c7f3b935b54aab1d8d73c70ec0ee2d3ec3b943e0e86611bc150ba47f5", size = 754690, upload-time = "2026-07-23T01:53:47.332Z" },
+ { url = "https://files.pythonhosted.org/packages/88/11/e7a70a209eb9a067c0d3212b518a0134e3484f5178c7533878b6b514d469/aiohttp-3.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5bcb6ff3fdab1258a192679ff1a05d44f59626430aa05cd1a9d2447423599228", size = 509484, upload-time = "2026-07-23T01:53:51.159Z" },
+ { url = "https://files.pythonhosted.org/packages/30/07/4bbc222cc8dbe31d4c3e8a5baad2286e4d42026ac0c570027b89afce6344/aiohttp-3.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:617105e2c3018ee38d0c8ce5ee3c84f621a6d8b9f723202aacaff28449ca91ee", size = 511949, upload-time = "2026-07-23T01:53:55.083Z" },
+ { url = "https://files.pythonhosted.org/packages/54/b9/42e74c46b7b7c794b995bbc1f573fb48950c38b19d8600c62a6804ee2d67/aiohttp-3.14.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f631fe87a6f30df5fbe6d79640b25e4cffb38c31c7fb6f10871517b84b0f8c1a", size = 1765282, upload-time = "2026-07-23T01:53:59.662Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/ed/62bc4d74363ad346d518e0720363a949f63e2e23439a79eb5813d4d29bb3/aiohttp-3.14.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a94dbaae5ae27bd849c93570669bff91e0510f33a80805738e3de72a7be0447b", size = 1741511, upload-time = "2026-07-23T01:54:04.063Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/9f/181e8a8bc79e47d13c7fc4540bd7a3b729d9505609c61f392a8dd2fbfe55/aiohttp-3.14.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8f2f1c4c032c7cedd7d8da6f54c97b70266c6570c3108d3fdffee7188bb70529", size = 1810680, upload-time = "2026-07-23T01:54:09.882Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/9a/dec94d6ad694552fe3424e3f1928d7a606a5d9d9433a04e7ecdd9d38ae7f/aiohttp-3.14.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea05e1f97ceea523942d9b2a7d7c0359d781d683d6b043f5943a602b14da4787", size = 1905646, upload-time = "2026-07-23T01:54:13.475Z" },
+ { url = "https://files.pythonhosted.org/packages/52/b7/7cd31f29d6055bd711ae6e669367fba6f5ae9de463910a793e30556a8db7/aiohttp-3.14.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:543906c127fb1d929b95076db19b83fa2d46751006ff1e23b093aa5ac4d8db42", size = 1792122, upload-time = "2026-07-23T01:54:15.752Z" },
+ { url = "https://files.pythonhosted.org/packages/66/73/10b1ef93afa61f4963c746257b70ced619cf31a4798671de5fdb2608501d/aiohttp-3.14.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0a5ff2dfbb9ce645fa5b8ef3e02c6c0b9cc3f6030ff863d0c51fffc50cb5541b", size = 1591127, upload-time = "2026-07-23T01:54:19.489Z" },
+ { url = "https://files.pythonhosted.org/packages/49/ed/3b203fa6de1b338c14acdc06bf6ca9b043b7944f005966958c2ced932cde/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:041badb8f84396357c4d3ad26de6afd7a32b112f43d3c63045c0c8278cfd2043", size = 1725210, upload-time = "2026-07-23T01:54:24.129Z" },
+ { url = "https://files.pythonhosted.org/packages/28/b7/1c2aab8c706436dcc28598452488ac9cd7c409da815237c28c27d58993e6/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:530125ee1163c4219af35dc3aa1206e541e7b31b6efc1a3f93b70a136f65d427", size = 1764848, upload-time = "2026-07-23T01:54:27.973Z" },
+ { url = "https://files.pythonhosted.org/packages/54/50/94c28f08b131c4bf10984ea2c7a536c9920608bb2d6e7f95642c30cc87b7/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8653fd547c93a61aadc612007790f5555cdd18946fa48cf45e26d8ea4ea473d", size = 1777102, upload-time = "2026-07-23T01:54:31.775Z" },
+ { url = "https://files.pythonhosted.org/packages/13/d4/e7d09ba7d345fb2d74440fd2fa033c5e079fac05552927705986f41a364f/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:89176250f686cb9853c0fb7ead90e639e915b84a6f43eedc2a4e7ec21f1037f0", size = 1580205, upload-time = "2026-07-23T01:54:34.518Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/84/072a91d68e1e1eb587985b54baab94221277f877e8ef274fc213a0ceae28/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3a26434dafe408229ff3403458ca58de24fb51936504decac49ce6755f77e59d", size = 1797219, upload-time = "2026-07-23T01:54:36.995Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/eb/aad34e897e668424d6e995da5dff8a4a09af93363d3392488772957a63aa/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d1558173930a5a8d3069cee5c92fc91c87c4dbcb099debbb3622053717145a19", size = 1768629, upload-time = "2026-07-23T01:54:40.103Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/2b/6bb88ddba0fecd9122aa3ebcad25996cf6c083a4a7040dbb3a4f97972af6/aiohttp-3.14.3-cp312-cp312-win32.whl", hash = "sha256:16100ad3ab8d649fdfbee87602d9d2dcdca9df0b9eda8a1b5fdc0d41f96da559", size = 451481, upload-time = "2026-07-23T01:54:42.547Z" },
+ { url = "https://files.pythonhosted.org/packages/76/9b/f2f8f108da17ecef2cc3efc424e8b7ad3782b1a8360f7b8eae8ced84f6ea/aiohttp-3.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:33a2d7c28d33797a2e99923dffa63f83d908a19b6bf26cfe80fa790aa5e1a75a", size = 476845, upload-time = "2026-07-23T01:54:44.853Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/44/28dac80a8941b604f4da10ce21097614ca1bf905ce93dca28d8d7de9c1e7/aiohttp-3.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:362a3fd481769cac1a824514bcd86fda51c65e8fe6e051099e008fddde6db17c", size = 448050, upload-time = "2026-07-23T01:54:47.087Z" },
+ { url = "https://files.pythonhosted.org/packages/57/be/5afd201cc0ab139029aadb75392efe85a293403d9dd3a3226161c21ce00c/aiohttp-3.14.3-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:2e9878ae68e4a5f1c0abe4dd497dbc3d51946f5837b56759e2a02e78fa90ef86", size = 506269, upload-time = "2026-07-23T01:54:49.075Z" },
+ { url = "https://files.pythonhosted.org/packages/22/09/dec8189d62b45ade009f6792a2264b942a90cb88aeaf181239933cd72c3c/aiohttp-3.14.3-cp313-cp313-android_21_x86_64.whl", hash = "sha256:f3d2669fe7dec7fc359ecdb5984b29b50d85d5d00f8c1cb61de4f4a24ee42627", size = 515166, upload-time = "2026-07-23T01:54:51.894Z" },
+ { url = "https://files.pythonhosted.org/packages/28/24/2854869d29ed8a8b19d74f9ec6629515f7e04d02dd329d9d179201e58e47/aiohttp-3.14.3-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:cc7cb243a68167172f48c1fd43cee91ec4b1d40cefd190edd43369d1a6bc9c82", size = 486263, upload-time = "2026-07-23T01:54:54.223Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/dd/57187c8be2a35aea65eaee3bd2c3dcbbcf0204f5106c89637e3610380cd1/aiohttp-3.14.3-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:78253b573e6ffab5028924fc98bc281aae05445969982a10864bc360dea2016c", size = 492299, upload-time = "2026-07-23T01:54:56.236Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/11/06ae6ed8f0d414edf4068861e233d8fe23ee699bfd4b3ceb8663db948a62/aiohttp-3.14.3-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7041d52c3a7fa20c9e8c182b534704abb19502c8bdcbde7ab23bfda6f642394f", size = 502235, upload-time = "2026-07-23T01:54:58.377Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/a3/559639c34a345d2cf7c52dff6838119f2eaf29eb508227b5b83f573af813/aiohttp-3.14.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac74facc01463f138b0da5580329cfcc82818dea5656e83ddcd11268fc12ff80", size = 750883, upload-time = "2026-07-23T01:55:00.65Z" },
+ { url = "https://files.pythonhosted.org/packages/91/cd/41e131f13afd1e7b0172a9d9eda085ef90eb8439f41f0d279db81ed3ae60/aiohttp-3.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d6218d92e450824e9b4881f44e8c09f1853b490f9a64130801024a4793b1b3b0", size = 508473, upload-time = "2026-07-23T01:55:02.945Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/6b/e7f13410d391c6e55b4c007a8de024355389d7d459e3d64c42b2d33617e5/aiohttp-3.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:11fb37ef075669eee52ab1928fbf6e1741fada40409fa309ebde9607a962aebf", size = 509190, upload-time = "2026-07-23T01:55:05.173Z" },
+ { url = "https://files.pythonhosted.org/packages/97/21/6464573e53d69672cc1eada3e5c5cb2d2efa82701e8305a0f2047a576967/aiohttp-3.14.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55bdcc472aafe2de4a253045cc128007a64f1e0264fb675791e132ea5edaa3bd", size = 1761478, upload-time = "2026-07-23T01:55:07.383Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/81/d217043a4c17fbce360905e3b2bdd20139ebc9a2de836d035d179c4da006/aiohttp-3.14.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c39846c3aad97a8530c89d7a3869a8f8e9e3762c6ac0504481e5c80948f7e807", size = 1735092, upload-time = "2026-07-23T01:55:09.803Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/66/e13a02d0eeb1a9a502402a977abb4e4abff9fe4051c26f80558c57a7c975/aiohttp-3.14.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5895ef58c4620afe02fa16044f023dc4dafec08158f9d08874a46a7dbc0341b8", size = 1800546, upload-time = "2026-07-23T01:55:12.012Z" },
+ { url = "https://files.pythonhosted.org/packages/26/5e/57d42fca1d18cb5acc1cad945d017fabc5d6ae71d8a08ad66be8dc3ee544/aiohttp-3.14.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa9467a8113aa69d3d7c55a70ef0b7c636010a40993f3df9d9d0d73b3eb7ef24", size = 1895250, upload-time = "2026-07-23T01:55:14.357Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/1c/7da8d08e74d56f00070822f9638ff3f1c563f8ad87d1efa996c87bfc8644/aiohttp-3.14.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7d2deec16eeedf55f2c7cf75b521ea3856a5177e123844f8fd0f114ce252cb5", size = 1789289, upload-time = "2026-07-23T01:55:16.668Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/0f/cf16bcf56896981c1a0319f5d5db9337994b5165730c48a8fa07e9b34be6/aiohttp-3.14.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dd54d0e8717de95939766febac482ac0474d8ac3b048115f9f2b1d23a16e7db4", size = 1586706, upload-time = "2026-07-23T01:55:18.913Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/6f/76eac12a7f2480e1e304f842efdb07db33256b0d9165b866b6ef0806c202/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df82f3787c940c94986b34222d59c9e38843fba85139f36e85255a82ad5355a9", size = 1724652, upload-time = "2026-07-23T01:55:21.296Z" },
+ { url = "https://files.pythonhosted.org/packages/39/b6/19c8c592baeeb94b75f966547d40c02ac7590902306ec5863d5c027cf506/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:42a67efc36300d052fb4508a53e8b6901b9284b599ae63945c377569c5fcc1e1", size = 1756239, upload-time = "2026-07-23T01:55:23.705Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/c9/4e9383150296f97f873b680c4de8fb2cd88608fb9f48c79edcb111611abc/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7a75aa63cbf9b21cfaf60dc2657e19df2c2867d91707d653fee171ffeedd1371", size = 1769161, upload-time = "2026-07-23T01:55:26.082Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/1e/147bdc6cc5de5f3ab011be8bf5d6e786633249f22c20bae06f85e45f5387/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e92eb8acc45eb6a9f4935071a77edf5b85cc6f8dfad5cd99e97653c26593cdde", size = 1578759, upload-time = "2026-07-23T01:55:28.846Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/31/78388a9d6040ece2e11df62ea229a822cf5e52d238374b220ae9975b2623/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b014a6ed7cf912e787149fdc529166d3ceabac23f26efeea3158c9aba2354e7e", size = 1792025, upload-time = "2026-07-23T01:55:31.457Z" },
+ { url = "https://files.pythonhosted.org/packages/03/51/a3d29fdf2c25d796746af8ad6fe56a45d6256c38b0a8a2ed752e1160b3a2/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d4f72af88ac2474bb5bca640030320e3d38a0163a1d7533500e87be458eef71", size = 1768477, upload-time = "2026-07-23T01:55:33.87Z" },
+ { url = "https://files.pythonhosted.org/packages/29/a6/442e18b5afeade534d877a2dc3c3e392aff8d49787890b0cf84790410267/aiohttp-3.14.3-cp313-cp313-win32.whl", hash = "sha256:5f08ec777f35ee70720233b8b9811d3bb5d728137f30ac91b7457709c3261ac0", size = 451069, upload-time = "2026-07-23T01:55:36.121Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/69/3d876ac02659f271cf7f6769f14a8e3de5b6e888ed8b5a7e998086a4cec8/aiohttp-3.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:dff9461ec275f22135650d5ba4b4931a11f3958df7dfbb8db630000d4dee0883", size = 476518, upload-time = "2026-07-23T01:55:38.303Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/0e/50d6e6471cd31edce8b282bdec59375a3a69124d8a989a0b1313355cae52/aiohttp-3.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:ddcac3c6b382e81f1dd0499199d4136b877beb4cb5ef770bbbfba56c4b8f55d2", size = 447676, upload-time = "2026-07-23T01:55:40.451Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/20/887fdcf832326571b370ffc347b3e70abe101096f3720126aac161b1d872/aiohttp-3.14.3-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:49f7325beb0f85ef4aef5f48f490269575f83e6e2acad00a1d80b807eb027062", size = 509067, upload-time = "2026-07-23T01:55:42.618Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/a3/92cec936f78cc4bf0fa5554ebe593b73459d94e3c62303e1902a4cccb6f7/aiohttp-3.14.3-cp314-cp314-android_24_x86_64.whl", hash = "sha256:e3be98a7c30b8c25d573dafba7171d66dfb05ee6a9070fc46535464ff97700a6", size = 514774, upload-time = "2026-07-23T01:55:44.937Z" },
+ { url = "https://files.pythonhosted.org/packages/29/ba/2a0c38df3fc557620b6a5acd98364af050053b6285b4dc7ee74100c63c18/aiohttp-3.14.3-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:614c61d478b83953e261d02bb2df750f17227cd33ef8002945bf5aebbde21919", size = 488134, upload-time = "2026-07-23T01:55:47.135Z" },
+ { url = "https://files.pythonhosted.org/packages/48/d6/d51b7d4bf309af3693940d8ffd2b9ed0b682434ef85959b7c9c137f60cf8/aiohttp-3.14.3-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:1caa7b0d05f3e3a36f87788c59e970a7ee1cefcfcbb924a9f138c4a6551c9cb7", size = 494201, upload-time = "2026-07-23T01:55:49.451Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/5a/8f624384e5f1efabb5229b94157eb966b021e97bdb188c62860c2ae243c2/aiohttp-3.14.3-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:dfa68deb2a443bdaa3ea5297b0699c1464f08aef3812b486d1348eee61b07dc0", size = 502766, upload-time = "2026-07-23T01:55:51.656Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/26/4ff0164370deec18fb19254ee4ab10b7a73304ac0c860b13f5f84663759b/aiohttp-3.14.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:e72ee89e28d907a18f46959b4eb0bb06701cc7f8cf4366e00029e2ccfaaf5924", size = 756557, upload-time = "2026-07-23T01:55:53.964Z" },
+ { url = "https://files.pythonhosted.org/packages/97/a3/7056b86dc0d9ec709ea9777eae3b0161428f943372f8b98c01c11593b682/aiohttp-3.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ad4c8b7488d745d2ca4838ebd8ae5ba9b56341d30b1da43640e4ce87f9f49646", size = 510168, upload-time = "2026-07-23T01:55:56.22Z" },
+ { url = "https://files.pythonhosted.org/packages/85/ed/0357a015892fd68058bf2d39d3fd1958e459b997a7db30aaa6aaa434ae96/aiohttp-3.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:db332af25642007330fca8be5c4d194caf2bea7a7fc84415aff3497af5dfee6b", size = 512957, upload-time = "2026-07-23T01:55:58.437Z" },
+ { url = "https://files.pythonhosted.org/packages/47/d1/8aba53f15ccb2238405f5e9d30e2a8ca44f93878c26e7165ade00d374b1c/aiohttp-3.14.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25bd2708db6bdf6a6630dd37bdcdfcb47c4434d22ac69c64665b802910140b30", size = 1750149, upload-time = "2026-07-23T01:56:00.856Z" },
+ { url = "https://files.pythonhosted.org/packages/49/bd/40c3fee327529284375c6701cbb0fa4600cc2e8432af1378f897e2ef7d3a/aiohttp-3.14.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:cef89a58e628c4efcac3275c2d68083f82426dcdc89c1492a6f654f9f7ea6ab9", size = 1707685, upload-time = "2026-07-23T01:56:03.371Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/a3/ca0cc6724cca8114b05694abd916060758c79894c3aa5b012cdadc1bc28e/aiohttp-3.14.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c23ec8ee9d5ab2f5421f9c7fffce208435607af27fd46d4a44e031954352838f", size = 1803911, upload-time = "2026-07-23T01:56:05.817Z" },
+ { url = "https://files.pythonhosted.org/packages/95/b5/85b099c299c3ffd38ad9b3e43694c8a346934e4a30c88c4fd5a841234f77/aiohttp-3.14.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e2667f0bbe7eb6c74eae5e9691441ad186e5845ca3cff63230fc09c4e7514f5d", size = 1876929, upload-time = "2026-07-23T01:56:08.413Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/b7/1da684a04175473fa4cddbf9a2f572e79514c3fd27a74597f43057d4f3da/aiohttp-3.14.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18cb43369747b2ae007bd2655fb8e63a099c2ff1d207962943636dac989b3147", size = 1761112, upload-time = "2026-07-23T01:56:10.918Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/16/bc4b55e3e5cb175fd69c53c90d60d2f47797cb343da5106e23863dc4dba4/aiohttp-3.14.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d77640cc618c1d99fc4f8589c0f24a730adfa54eb1e57ef7bf0c8dfb78da898c", size = 1583500, upload-time = "2026-07-23T01:56:13.613Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/e8/13a9d957a1ee40837f46aa30f0f4c657e673ad86a2e6362a9f9be20d26d9/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:53e5179d8abb5710f8e83ba207c41c8d1261fcffd4616500e15ca2b7a33be10a", size = 1713940, upload-time = "2026-07-23T01:56:15.969Z" },
+ { url = "https://files.pythonhosted.org/packages/38/05/d33c680c1bcf1c7e130f9cbfc1fc02fe8bb0c4af2a94a53dd5fb56131e5c/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:cd817772b2fcf2b8c0905795318485f9ec16eae60b29feb7f4c77085311637f0", size = 1724413, upload-time = "2026-07-23T01:56:18.591Z" },
+ { url = "https://files.pythonhosted.org/packages/85/1d/af798d306f7a74b6a632dbcabcf62a4c91391b7582d2a8c6d7712e2cc54e/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4e3ac92d90e92773b2362d506068e9a948192bd553e743c5b2429e28527c8661", size = 1770748, upload-time = "2026-07-23T01:56:21.074Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/92/ad720d472556a995049206867765e9410969684f86ee09423ff9969044c1/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3f42e9b78301f11c8f861746175d8b9c1ccef713fcad9eab396e2f6db8ed4a22", size = 1577564, upload-time = "2026-07-23T01:56:23.475Z" },
+ { url = "https://files.pythonhosted.org/packages/60/ad/0ed7586cbef7a884e23a752fa2bb987a122e6a5dd50dab109258d0a95193/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9d9edccfe496b476db5f398d97b865e9a6752bcf8aec4eef8390ce20fb64bb41", size = 1782080, upload-time = "2026-07-23T01:56:25.994Z" },
+ { url = "https://files.pythonhosted.org/packages/97/ea/dbaed0d73e8a69aad653b045dab451c67c2454bb731a37b45a86593e9422/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c5ec8fb1bcc31a8466f74aaf26c345d5c386fa4bd08a3f0eb9c7a4a3fe8b5bf", size = 1745813, upload-time = "2026-07-23T01:56:28.604Z" },
+ { url = "https://files.pythonhosted.org/packages/81/1b/6893d4bc57e434fc93a6c9217c637d967a0b651d989f6e3265179375754a/aiohttp-3.14.3-cp314-cp314-win32.whl", hash = "sha256:38901a84da3ce22249f6e860bf8f90d141bcab7da090cc398f8bb58c0e44b7da", size = 455872, upload-time = "2026-07-23T01:56:31.031Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/8b/c7baa1ba1eda4db6989baefe5de6d99834921b84ebd7918624febcb9f290/aiohttp-3.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:8b3b60de05f3dcb6f6a00f818bb2ec781cee4de0645f59ccaf99b1d1823b6100", size = 481030, upload-time = "2026-07-23T01:56:33.365Z" },
+ { url = "https://files.pythonhosted.org/packages/22/8c/c29d067df825a2df88ca432db848aa2fe8199598359cc06c12b09320cac9/aiohttp-3.14.3-cp314-cp314-win_arm64.whl", hash = "sha256:1576145bdceeb92382d899751e12743a3a5b8e460a841e3e50543859e54864dc", size = 453669, upload-time = "2026-07-23T01:56:35.731Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/a4/9c033beb355d39b6147980597ec9645e4729243f686ee4dc73945de72030/aiohttp-3.14.3-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:8800c996b01c2772a783e3e46f3e1abd5823029adca0df54231960de9bfefa5b", size = 791403, upload-time = "2026-07-23T01:56:37.972Z" },
+ { url = "https://files.pythonhosted.org/packages/80/ca/87c32a0a7704583cfc49660bd817889bae5b830bf53b5dcb4e92145ac2da/aiohttp-3.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ebe8e504f058fe91223351cecd2d9d6946c9d241bb0250d898ffbdf584cc72b0", size = 526413, upload-time = "2026-07-23T01:56:40.523Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/d8/8ec0e471248c500acdce2be3f46db8fb62b5eb60efef072529cc85ee1d26/aiohttp-3.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30402d03a7c0ff52bce290b57e564e9079fd9d0cb545c8aba73f86a103162d2e", size = 532135, upload-time = "2026-07-23T01:56:42.876Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/45/f8919fd936e8b79fcd9bda7b6d8e62613462a713f4f17987fd7c34399142/aiohttp-3.14.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9fc7b5bfec6573f3ae844f457fdde5adeb713f8b8e4a81ad64fc207b49383716", size = 1922742, upload-time = "2026-07-23T01:56:45.528Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/ec/9ca76b28a27525b0cc53e20842e0228b022f301ce1f436b7d814b4aaf2df/aiohttp-3.14.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8a5fd34f7f7410d1730d5c2ba873cacb2eed3fede366feb268a70ba22581ed8f", size = 1787371, upload-time = "2026-07-23T01:56:48.045Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/04/6acdbf17315f7b55f1937e3387acb89a3cddeb4995689553d064af8e92ab/aiohttp-3.14.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:270d3dace9ca2f10f0da5d8ebe519b7a310fc6112ed916e32df5866df0888553", size = 1912623, upload-time = "2026-07-23T01:56:50.605Z" },
+ { url = "https://files.pythonhosted.org/packages/86/e6/438b0c79ca6f45eb9fd9817dd4c01a91919a38c0de5ee9e05e2b4dc0ece7/aiohttp-3.14.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3ae5b3a59436d089b5395d910121a390feed4d00578eb95a0fd1a329fe963100", size = 2005515, upload-time = "2026-07-23T01:56:53.153Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/6b/62cbd6577758699525f5c712d1ddef57d9875fbab0ae8d5f5a202fd598f8/aiohttp-3.14.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2498f0fe69ead802f9675beca44a7c21c62fdaa4ec5145ea1c3ad6edbee29f85", size = 1879906, upload-time = "2026-07-23T01:56:55.818Z" },
+ { url = "https://files.pythonhosted.org/packages/00/95/18bcbf830a21dc3aae24d8f6b6feaf3db1d2090242d00a7868db2ffb0b67/aiohttp-3.14.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a0dc483c00da8b673abbb367eb6f8d8f4bcec30eb58529ea13cb42e7fd2dfa33", size = 1675849, upload-time = "2026-07-23T01:56:58.861Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/19/47f4968659c5e23606c3790c80fc624e691c153d036148449ee84d31b287/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c7d3a97c678d34fc5b59da671ee9cd630096ddc643e7b5a30d54a2a6f3574d3f", size = 1843496, upload-time = "2026-07-23T01:57:01.591Z" },
+ { url = "https://files.pythonhosted.org/packages/64/af/38c33c4dd82fddcb4e56c4653b6f1072a8edbc6b7fa15809f14932c41e2d/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f8fb78a83c9e5f741ca3a68cfb455c1f5bb83b4e7249a3848b3cd78d0a8563b0", size = 1827746, upload-time = "2026-07-23T01:57:05.131Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/9d/0537cda4885ac8f5b7053d164dd06312f4c483a4edcb8ee5b8aaf2a989bf/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:74ab5b6a9fb13e873e5a90946588baecaf488745e1db1a4a5c433f971f035098", size = 1853810, upload-time = "2026-07-23T01:57:08.043Z" },
+ { url = "https://files.pythonhosted.org/packages/19/fe/26f9c5e6458385aa86497836b0dea6fb2f027827d63f37c7856cce9286ee/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:bd52f811e65f6fb634b1047159657c98f52b407f8efec907bcfc09da9a4c0a25", size = 1668895, upload-time = "2026-07-23T01:57:10.837Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/4c/618b1db9b9ba079b8875d2cdf78e7c4a3bf72903bd5850fee7dd9544600a/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:f0f177d1b195b9e06376cfd7d308d8a1b920909a609d03ac82a8c73bbb16d3b9", size = 1883833, upload-time = "2026-07-23T01:57:13.672Z" },
+ { url = "https://files.pythonhosted.org/packages/94/c6/bd959bd1e4771f9fd944e9e436224c48c77b018b73b519b5aad346335bcc/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:498c6c623134f8e09a3c4e60bcd607a0b4590dd7dbf08dd40851b27cbb520ccb", size = 1844251, upload-time = "2026-07-23T01:57:16.593Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/19/08d41839658bdd44a0ed2480f3891705ecb487ce28c0dde62c9040c997e0/aiohttp-3.14.3-cp314-cp314t-win32.whl", hash = "sha256:b304db572b4368edd8dda8a2274f73156fe15558fca4a917cb8a09fc47af5963", size = 474180, upload-time = "2026-07-23T01:57:19.306Z" },
+ { url = "https://files.pythonhosted.org/packages/99/5d/3cd6ef0a2b2851f7ab913b5b079334781bd50ff56a323e4454063377a080/aiohttp-3.14.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b20032766aedf6261c7a566585a40867d092ac03a0d81592d5370ef9b054f99b", size = 500528, upload-time = "2026-07-23T01:57:21.762Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/37/cfd1ed540a4d318da025590d96b728e63713c09e9377950fc655dadeb856/aiohttp-3.14.3-cp314-cp314t-win_arm64.whl", hash = "sha256:2e1161602f45a54de2ce0905243a95f58cb42dcd378402f3697f5e0b21e9d2e7", size = 469280, upload-time = "2026-07-23T01:57:24.241Z" },
+]
+
+[[package]]
+name = "aiosignal"
+version = "1.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "frozenlist" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" },
+]
+
+[[package]]
+name = "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 = "26.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" },
+]
+
+[[package]]
+name = "autopep8"
+version = "2.3.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycodestyle" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/d8/30873d2b7b57dee9263e53d142da044c4600a46f2d28374b3e38b023df16/autopep8-2.3.2.tar.gz", hash = "sha256:89440a4f969197b69a995e4ce0661b031f455a9f776d2c5ba3dbd83466931758", size = 92210, upload-time = "2025-01-14T14:46:18.454Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl", hash = "sha256:ce8ad498672c845a0c3de2629c15b635ec2b05ef8177a6e7c91c74f3e9b51128", size = 45807, upload-time = "2025-01-14T14:46:15.466Z" },
+]
+
+[[package]]
+name = "certifi"
+version = "2026.7.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" },
+]
+
+[[package]]
+name = "cffi"
+version = "2.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b6/d2/2cde336b375f55c76ca670f0be3978cc048e31e24f3b4d7ce8473150a388/cffi-2.1.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:baed1e86cc735622097354b9d1281406caf42ff42a886d29faa8e8d1630333be", size = 183779, upload-time = "2026-08-03T21:19:15.602Z" },
+ { url = "https://files.pythonhosted.org/packages/94/1a/4b2f7c92293ba05cbd4a9a1b28faaf0326272d9488e6354657571c48a7aa/cffi-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca82be1a1d406ecfe1d25dc16cb33488e5a16bf4438c9fb590484ea29d92478b", size = 184178, upload-time = "2026-08-03T21:19:16.67Z" },
+ { url = "https://files.pythonhosted.org/packages/17/0b/ba385d8ccedf926c3cd06e8e2f327027da5afe5f0eb30f1f7bc43ac55125/cffi-2.1.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004", size = 211037, upload-time = "2026-08-03T21:19:17.705Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/b9/0f2e58b2cefa33255bff36935d42b13180fe559bba82596540eb404bde7d/cffi-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9", size = 218652, upload-time = "2026-08-03T21:19:18.735Z" },
+ { url = "https://files.pythonhosted.org/packages/37/15/180e0dab27b9312c7479003d14c9e547634b7dcb934e2cc4650e1b131a7a/cffi-2.1.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:9f8d177621de5cb38ee3e731eda45d421db093ec0739f46a5594babda7987a98", size = 205422, upload-time = "2026-08-03T21:19:19.96Z" },
+ { url = "https://files.pythonhosted.org/packages/18/d4/03026f0c850cbbaa9030750490225b4a7f4d524ea4df72c3cc740a90f4ef/cffi-2.1.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:75f80557d1389eddbd0de2681f6a390a0c5338c31ddaa821381c203fc3fd50d9", size = 205444, upload-time = "2026-08-03T21:19:21.246Z" },
+ { url = "https://files.pythonhosted.org/packages/75/77/60bebf6f818bec84210ac5b6979ce4eeadce6fbbaabc9c7ab23e506d1ce5/cffi-2.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6", size = 218742, upload-time = "2026-08-03T21:19:22.523Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/ae/679bf47e73fd77b352171727f07de559a003f14de5d02b904a6ec1fa73ca/cffi-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf", size = 221054, upload-time = "2026-08-03T21:19:23.694Z" },
+ { url = "https://files.pythonhosted.org/packages/09/b8/eefc0e06913b70aa153bf74c946094a18f58fd4aff11b7f372bfdfdca050/cffi-2.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659", size = 213489, upload-time = "2026-08-03T21:19:24.922Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/13/4e56852824a03cdf68523a35686f1c28eacd4bd30a7b0a78e682e6e6e1d3/cffi-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9", size = 220241, upload-time = "2026-08-03T21:19:26.214Z" },
+ { url = "https://files.pythonhosted.org/packages/99/7f/040f9e163e4acac3ee3d85b02d00b2576e7ca980d8785f0a3a5f1a9bf7f5/cffi-2.1.1-cp310-cp310-win32.whl", hash = "sha256:7ce713ace7c0e4520535b42b77eaa742c16dab813978064913e5a3cf82973b41", size = 174578, upload-time = "2026-08-03T21:19:27.338Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/0b/644a2ec1a4eaba49c2939410bb1eb1d25b09d6d0582f5d2f95c537043725/cffi-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a48d62ab9d6f4f98c983223a547af44be6ca3691074c31cecced6facd3ba2dc1", size = 185082, upload-time = "2026-08-03T21:19:28.409Z" },
+ { url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" },
+ { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" },
+ { url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" },
+ { url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" },
+ { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" },
+ { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" },
+ { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" },
+ { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" },
+ { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" },
+ { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" },
+ { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" },
+ { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" },
+ { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" },
+ { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" },
+ { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" },
+ { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" },
+ { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" },
+ { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" },
+ { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" },
+ { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" },
+ { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" },
+ { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" },
+ { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" },
+ { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" },
+ { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" },
+ { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" },
+ { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" },
+ { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" },
+ { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" },
+ { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" },
+ { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" },
+ { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" },
+ { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" },
+ { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" },
+ { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" },
+]
+
+[[package]]
+name = "circuitbreaker"
+version = "2.1.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/df/ac/de7a92c4ed39cba31fe5ad9203b76a25ca67c530797f6bb420fff5f65ccb/circuitbreaker-2.1.3.tar.gz", hash = "sha256:1a4baee510f7bea3c91b194dcce7c07805fe96c4423ed5594b75af438531d084", size = 10787, upload-time = "2025-03-31T08:12:08.963Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/34/15f08edd4628f65217de1fc3c1a27c82e46fe357d60c217fc9881e12ebcc/circuitbreaker-2.1.3-py3-none-any.whl", hash = "sha256:87ba6a3ed03fdc7032bc175561c2b04d52ade9d5faf94ca2b035fbdc5e6b1dd1", size = 7737, upload-time = "2025-03-31T08:12:07.802Z" },
+]
+
+[[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 = "crc32c"
+version = "2.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e3/66/7e97aa77af7cf6afbff26e3651b564fe41932599bc2d3dce0b2f73d4829a/crc32c-2.8.tar.gz", hash = "sha256:578728964e59c47c356aeeedee6220e021e124b9d3e8631d95d9a5e5f06e261c", size = 48179, upload-time = "2025-10-17T06:20:13.61Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c4/a0/28b4686a8db0bb0f77970f4c6ccede90d1d5740a1d4b4703bd54c3e75655/crc32c-2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2c0f4eb01fe7c0a3e3f973a418e04d52101bb077dd77626fd80c658ec60aaf95", size = 66321, upload-time = "2025-10-17T06:18:53.543Z" },
+ { url = "https://files.pythonhosted.org/packages/76/1f/1697f5b8b770f715ed9b264d79e36b4f77ae0527f81f3c749ef08937a32e/crc32c-2.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6baefcfbca82b1a9678455416da24f18629769a76920c640d5a538620a7d12bb", size = 62985, upload-time = "2025-10-17T06:18:54.97Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/e5/333cfa5ffa8d5779733aced2b984b5e5139b4a8ceaa2c6bc563e9a1092f3/crc32c-2.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d7f959fcf6c5aad1c4a653ee1a50f05760dab1d1c35d98ec4d7f0f68643f7612", size = 61517, upload-time = "2025-10-17T06:18:55.795Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/d8/362a009e8140dd926a153b44d56753e3aa7cb50aca243779a84adadbff11/crc32c-2.8-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9bb678507a4e4cf3f0506607b046ecc4ed1c58a19e08a3fb3c2d25441c480bf1", size = 79385, upload-time = "2025-10-17T06:18:56.598Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/9f/0d4ea3aa71ffb15f1285669d23024cc40779388ce32157d339dc2584491c/crc32c-2.8-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a16f7ffa4c242a909558565567cbba95148603717b53538ea299c98da68e7a9", size = 80965, upload-time = "2025-10-17T06:18:57.384Z" },
+ { url = "https://files.pythonhosted.org/packages/20/44/d77657aaca4a2c0283f2356a3da6f8e91b003567bb8f09daaf540cbf192f/crc32c-2.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0184369aad562d801f91f454c81f56b9ecb966f6b96684c4d6cf82fc8741d2ad", size = 79993, upload-time = "2025-10-17T06:18:58.503Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/c0/07017a93ebf85d9408028b7e03ef96d5c6bfb14cb77cfe90d35eedcc1501/crc32c-2.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:86d2eeb5f0189bd803720abe7387019328ea34c4acde62999e5723f789bc316b", size = 79243, upload-time = "2025-10-17T06:18:59.273Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/1a/b3c5ac4cf2fd1f82395173d0bd8e1a15d09f0bc1eccdf10ea7f8caaccd67/crc32c-2.8-cp310-cp310-win32.whl", hash = "sha256:51da61904a9e753780a2e6011885677d601db1fa840be4b68799643a113e6f08", size = 64888, upload-time = "2025-10-17T06:19:00.089Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/f2/60c45fc7bb2221d3c93c7a872e921be591f40d45228fe46f879b1d8c0424/crc32c-2.8-cp310-cp310-win_amd64.whl", hash = "sha256:b2d6a1f2500daaf2e4b08f97ad0349aa2eff5faaaa5fd3350314a26eade334cd", size = 66639, upload-time = "2025-10-17T06:19:00.974Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/0b/5e03b22d913698e9cc563f39b9f6bbd508606bf6b8e9122cd6bf196b87ea/crc32c-2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e560a97fbb96c9897cb1d9b5076ef12fc12e2e25622530a1afd0de4240f17e1f", size = 66329, upload-time = "2025-10-17T06:19:01.771Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/38/2fe0051ffe8c6a650c8b1ac0da31b8802d1dbe5fa40a84e4b6b6f5583db5/crc32c-2.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6762d276d90331a490ef7e71ffee53b9c0eb053bd75a272d786f3b08d3fe3671", size = 62988, upload-time = "2025-10-17T06:19:02.953Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/30/5837a71c014be83aba1469c58820d287fc836512a0cad6b8fdd43868accd/crc32c-2.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:60670569f5ede91e39f48fb0cb4060e05b8d8704dd9e17ede930bf441b2f73ef", size = 61522, upload-time = "2025-10-17T06:19:03.796Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/29/63972fc1452778e2092ae998c50cbfc2fc93e3fa9798a0278650cd6169c5/crc32c-2.8-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:711743da6ccc70b3c6718c328947b0b6f34a1fe6a6c27cc6c1d69cc226bf70e9", size = 80200, upload-time = "2025-10-17T06:19:04.617Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/3a/60eb49d7bdada4122b3ffd45b0df54bdc1b8dd092cda4b069a287bdfcff4/crc32c-2.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5eb4094a2054774f13b26f21bf56792bb44fa1fcee6c6ad099387a43ffbfb4fa", size = 81757, upload-time = "2025-10-17T06:19:05.496Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/63/6efc1b64429ef7d23bd58b75b7ac24d15df327e3ebbe9c247a0f7b1c2ed1/crc32c-2.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fff15bf2bd3e95780516baae935ed12be88deaa5ebe6143c53eb0d26a7bdc7b7", size = 80830, upload-time = "2025-10-17T06:19:06.621Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/eb/0ae9f436f8004f1c88f7429e659a7218a3879bd11a6b18ed1257aad7e98b/crc32c-2.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c0e11e3826668121fa53e0745635baf5e4f0ded437e8ff63ea56f38fc4f970a", size = 80095, upload-time = "2025-10-17T06:19:07.381Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/81/4afc9d468977a4cd94a2eb62908553345009a7c0d30e74463a15d4b48ec3/crc32c-2.8-cp311-cp311-win32.whl", hash = "sha256:38f915336715d1f1353ab07d7d786f8a789b119e273aea106ba55355dfc9101d", size = 64886, upload-time = "2025-10-17T06:19:08.497Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/e8/94e839c9f7e767bf8479046a207afd440a08f5c59b52586e1af5e64fa4a0/crc32c-2.8-cp311-cp311-win_amd64.whl", hash = "sha256:60e0a765b1caab8d31b2ea80840639253906a9351d4b861551c8c8625ea20f86", size = 66639, upload-time = "2025-10-17T06:19:09.338Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/36/fd18ef23c42926b79c7003e16cb0f79043b5b179c633521343d3b499e996/crc32c-2.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:572ffb1b78cce3d88e8d4143e154d31044a44be42cb3f6fbbf77f1e7a941c5ab", size = 66379, upload-time = "2025-10-17T06:19:10.115Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/b8/c584958e53f7798dd358f5bdb1bbfc97483134f053ee399d3eeb26cca075/crc32c-2.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cf827b3758ee0c4aacd21ceca0e2da83681f10295c38a10bfeb105f7d98f7a68", size = 63042, upload-time = "2025-10-17T06:19:10.946Z" },
+ { url = "https://files.pythonhosted.org/packages/62/e6/6f2af0ec64a668a46c861e5bc778ea3ee42171fedfc5440f791f470fd783/crc32c-2.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:106fbd79013e06fa92bc3b51031694fcc1249811ed4364ef1554ee3dd2c7f5a2", size = 61528, upload-time = "2025-10-17T06:19:11.768Z" },
+ { url = "https://files.pythonhosted.org/packages/17/8b/4a04bd80a024f1a23978f19ae99407783e06549e361ab56e9c08bba3c1d3/crc32c-2.8-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6dde035f91ffbfe23163e68605ee5a4bb8ceebd71ed54bb1fb1d0526cdd125a2", size = 80028, upload-time = "2025-10-17T06:19:12.554Z" },
+ { url = "https://files.pythonhosted.org/packages/21/8f/01c7afdc76ac2007d0e6a98e7300b4470b170480f8188475b597d1f4b4c6/crc32c-2.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e41ebe7c2f0fdcd9f3a3fd206989a36b460b4d3f24816d53e5be6c7dba72c5e1", size = 81531, upload-time = "2025-10-17T06:19:13.406Z" },
+ { url = "https://files.pythonhosted.org/packages/32/2b/8f78c5a8cc66486be5f51b6f038fc347c3ba748d3ea68be17a014283c331/crc32c-2.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ecf66cf90266d9c15cea597d5cc86c01917cd1a238dc3c51420c7886fa750d7e", size = 80608, upload-time = "2025-10-17T06:19:14.223Z" },
+ { url = "https://files.pythonhosted.org/packages/db/86/fad1a94cdeeeb6b6e2323c87f970186e74bfd6fbfbc247bf5c88ad0873d5/crc32c-2.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:59eee5f3a69ad0793d5fa9cdc9b9d743b0cd50edf7fccc0a3988a821fef0208c", size = 79886, upload-time = "2025-10-17T06:19:15.345Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/db/1a7cb6757a1e32376fa2dfce00c815ea4ee614a94f9bff8228e37420c183/crc32c-2.8-cp312-cp312-win32.whl", hash = "sha256:a73d03ce3604aa5d7a2698e9057a0eef69f529c46497b27ee1c38158e90ceb76", size = 64896, upload-time = "2025-10-17T06:19:16.457Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/8e/2024de34399b2e401a37dcb54b224b56c747b0dc46de4966886827b4d370/crc32c-2.8-cp312-cp312-win_amd64.whl", hash = "sha256:56b3b7d015247962cf58186e06d18c3d75a1a63d709d3233509e1c50a2d36aa2", size = 66645, upload-time = "2025-10-17T06:19:17.235Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/d8/3ae227890b3be40955a7144106ef4dd97d6123a82c2a5310cdab58ca49d8/crc32c-2.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:36f1e03ee9e9c6938e67d3bcb60e36f260170aa5f37da1185e04ef37b56af395", size = 66380, upload-time = "2025-10-17T06:19:18.009Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/8b/178d3f987cd0e049b484615512d3f91f3d2caeeb8ff336bb5896ae317438/crc32c-2.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b2f3226b94b85a8dd9b3533601d7a63e9e3e8edf03a8a169830ee8303a199aeb", size = 63048, upload-time = "2025-10-17T06:19:18.853Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/a1/48145ae2545ebc0169d3283ebe882da580ea4606bfb67cf4ca922ac3cfc3/crc32c-2.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e08628bc72d5b6bc8e0730e8f142194b610e780a98c58cb6698e665cb885a5b", size = 61530, upload-time = "2025-10-17T06:19:19.974Z" },
+ { url = "https://files.pythonhosted.org/packages/06/4b/cf05ed9d934cc30e5ae22f97c8272face420a476090e736615d9a6b53de0/crc32c-2.8-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:086f64793c5ec856d1ab31a026d52ad2b895ac83d7a38fce557d74eb857f0a82", size = 80001, upload-time = "2025-10-17T06:19:20.784Z" },
+ { url = "https://files.pythonhosted.org/packages/15/ab/4b04801739faf36345f6ba1920be5b1c70282fec52f8280afd3613fb13e2/crc32c-2.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcf72ee7e0135b3d941c34bb2c26c3fc6bc207106b49fd89aaafaeae223ae209", size = 81543, upload-time = "2025-10-17T06:19:21.557Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/1b/6e38dde5bfd2ea69b7f2ab6ec229fcd972a53d39e2db4efe75c0ac0382ce/crc32c-2.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8a717dd9c3fd777d9bc6603717eae172887d402c4ab589d124ebd0184a83f89e", size = 80644, upload-time = "2025-10-17T06:19:22.325Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/45/012176ffee90059ae8ec7131019c71724ea472aa63e72c0c8edbd1fad1d7/crc32c-2.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0450bb845b3c3c7b9bdc0b4e95620ec9a40824abdc8c86d6285c919a90743c1a", size = 79919, upload-time = "2025-10-17T06:19:23.101Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/2b/f557629842f9dec2b3461cb3a0d854bb586ec45b814cea58b082c32f0dde/crc32c-2.8-cp313-cp313-win32.whl", hash = "sha256:765d220bfcbcffa6598ac11eb1e10af0ee4802b49fe126aa6bf79f8ddb9931d1", size = 64896, upload-time = "2025-10-17T06:19:23.88Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/db/fd0f698c15d1e21d47c64181a98290665a08fcbb3940cd559e9c15bda57e/crc32c-2.8-cp313-cp313-win_amd64.whl", hash = "sha256:171ff0260d112c62abcce29332986950a57bddee514e0a2418bfde493ea06bb3", size = 66646, upload-time = "2025-10-17T06:19:24.702Z" },
+ { url = "https://files.pythonhosted.org/packages/db/b9/8e5d7054fe8e7eecab10fd0c8e7ffb01439417bdb6de1d66a81c38fc4a20/crc32c-2.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b977a32a3708d6f51703c8557008f190aaa434d7347431efb0e86fcbe78c2a50", size = 66203, upload-time = "2025-10-17T06:19:25.872Z" },
+ { url = "https://files.pythonhosted.org/packages/55/5f/cc926c70057a63cc0c98a3c8a896eb15fc7e74d3034eadd53c94917c6cc3/crc32c-2.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7399b01db4adaf41da2fb36fe2408e75a8d82a179a9564ed7619412e427b26d6", size = 62956, upload-time = "2025-10-17T06:19:26.652Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/8a/0660c44a2dd2cb6ccbb529eb363b9280f5c766f1017bc8355ed8d695bd94/crc32c-2.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4379f73f9cdad31958a673d11a332ec725ca71572401ca865867229f5f15e853", size = 61442, upload-time = "2025-10-17T06:19:27.74Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/5a/6108d2dfc0fe33522ce83ba07aed4b22014911b387afa228808a278e27cd/crc32c-2.8-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2e68264555fab19bab08331550dab58573e351a63ed79c869d455edd3b0aa417", size = 79109, upload-time = "2025-10-17T06:19:28.535Z" },
+ { url = "https://files.pythonhosted.org/packages/84/1e/c054f9e390090c197abf3d2936f4f9effaf0c6ee14569ae03d6ddf86958a/crc32c-2.8-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b48f2486727b8d0e7ccbae4a34cb0300498433d2a9d6b49cb13cb57c2e3f19cb", size = 80987, upload-time = "2025-10-17T06:19:29.305Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/ad/1650e5c3341e4a485f800ea83116d72965030c5d48ccc168fcc685756e4d/crc32c-2.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ecf123348934a086df8c8fde7f9f2d716d523ca0707c5a1367b8bb00d8134823", size = 79994, upload-time = "2025-10-17T06:19:30.109Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/3b/f2ed924b177729cbb2ab30ca2902abff653c31d48c95e7b66717a9ca9fcc/crc32c-2.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e636ac60f76de538f7a2c0d0f3abf43104ee83a8f5e516f6345dc283ed1a4df7", size = 79046, upload-time = "2025-10-17T06:19:30.894Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/80/413b05ee6ace613208b31b3670c3135ee1cf451f0e72a9c839b4946acc04/crc32c-2.8-cp313-cp313t-win32.whl", hash = "sha256:8dd4a19505e0253892e1b2f1425cc3bd47f79ae5a04cb8800315d00aad7197f2", size = 64837, upload-time = "2025-10-17T06:19:32.03Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/1b/85eddb6ac5b38496c4e35c20298aae627970c88c3c624a22ab33e84f16c7/crc32c-2.8-cp313-cp313t-win_amd64.whl", hash = "sha256:4bb18e4bd98fb266596523ffc6be9c5b2387b2fa4e505ec56ca36336f49cb639", size = 66574, upload-time = "2025-10-17T06:19:33.143Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/df/50e9079b532ff53dbfc0e66eed781374bd455af02ed5df8b56ad538de4ff/crc32c-2.8-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3a3b2e4bcf7b3ee333050e7d3ff38e2ba46ea205f1d73d8949b248aaffe937ac", size = 66399, upload-time = "2025-10-17T06:19:34.279Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/2e/67e3b0bc3d30e46ea5d16365cc81203286387671e22f2307eb41f19abb9c/crc32c-2.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:445e559e66dff16be54f8a4ef95aa6b01db799a639956d995c5498ba513fccc2", size = 63044, upload-time = "2025-10-17T06:19:35.062Z" },
+ { url = "https://files.pythonhosted.org/packages/36/ea/1723b17437e4344ed8d067456382ecb1f5b535d83fdc5aaebab676c6d273/crc32c-2.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bf3040919e17afa5782e01b1875d6a05f44b8f19c05f211d8b9f8a1deb8bbd9c", size = 61541, upload-time = "2025-10-17T06:19:36.204Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/6a/cbec8a235c5b46a01f319939b538958662159aec0ed3a74944e3a6de21f1/crc32c-2.8-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5607ab8221e1ffd411f64aa40dbb6850cf06dd2908c9debd05d371e1acf62ff3", size = 80139, upload-time = "2025-10-17T06:19:37.351Z" },
+ { url = "https://files.pythonhosted.org/packages/21/31/d096722fe74b692d6e8206c27da1ea5f6b2a12ff92c54a62a6ba2f376254/crc32c-2.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f5db4f16816926986d3c94253314920689706ae13a9bf4888b47336c6735ce", size = 81736, upload-time = "2025-10-17T06:19:38.16Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/a2/f75ef716ff7e3c22f385ba6ef30c5de80c19a21ebe699dc90824a1903275/crc32c-2.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70b0153c4d418b673309d3529334d117e1074c4a3b2d7f676e430d72c14de67b", size = 80795, upload-time = "2025-10-17T06:19:38.948Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/94/6d647a12d96ab087d9b8eacee3da073f981987827d57c7072f89ffc7b6cd/crc32c-2.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c8933531442042438753755a5c8a9034e4d88b01da9eb796f7e151b31a7256c", size = 80042, upload-time = "2025-10-17T06:19:39.725Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/dc/32b8896b40a0afee7a3c040536d0da5a73e68df2be9fadd21770fd158e16/crc32c-2.8-cp314-cp314-win32.whl", hash = "sha256:cdc83a3fe6c4e5df9457294cfd643de7d95bd4e9382c1dd6ed1e0f0f9169172c", size = 64914, upload-time = "2025-10-17T06:19:40.527Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/b4/4308b27d307e8ecaf8dd1dcc63bbb0e47ae1826d93faa3e62d1ee00ee2d5/crc32c-2.8-cp314-cp314-win_amd64.whl", hash = "sha256:509e10035106df66770fe24b9eb8d9e32b6fb967df17744402fb67772d8b2bc7", size = 66723, upload-time = "2025-10-17T06:19:42.449Z" },
+ { url = "https://files.pythonhosted.org/packages/90/d5/a19d2489fa997a143bfbbf971a5c9a43f8b1ba9e775b1fb362d8fb15260c/crc32c-2.8-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:864359a39777a07b09b28eb31337c0cc603d5c1bf0fc328c3af736a8da624ec0", size = 66201, upload-time = "2025-10-17T06:19:43.273Z" },
+ { url = "https://files.pythonhosted.org/packages/98/c2/5f82f22d2c1242cb6f6fe92aa9a42991ebea86de994b8f9974d9c1d128e2/crc32c-2.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:14511d7cfc5d9f5e1a6c6b64caa6225c2bdc1ed00d725e9a374a3e84073ce180", size = 62956, upload-time = "2025-10-17T06:19:44.099Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/61/3d43d33489cf974fb78bfb3500845770e139ae6d1d83473b660bd8f79a6c/crc32c-2.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:918b7999b52b5dcbcea34081e9a02d46917d571921a3f209956a9a429b2e06e5", size = 61443, upload-time = "2025-10-17T06:19:44.89Z" },
+ { url = "https://files.pythonhosted.org/packages/52/6d/f306ce64a352a3002f76b0fc88a1373f4541f9d34fad3668688610bab14b/crc32c-2.8-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cc445da03fc012a5a03b71da1df1b40139729e6a5571fd4215ab40bfb39689c7", size = 79106, upload-time = "2025-10-17T06:19:45.688Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/b7/1f74965dd7ea762954a69d172dfb3a706049c84ffa45d31401d010a4a126/crc32c-2.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e3dde2ec59a8a830511d72a086ead95c0b0b7f0d418f93ea106244c5e77e350", size = 80983, upload-time = "2025-10-17T06:19:46.792Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/50/af93f0d91ccd61833ce77374ebfbd16f5805f5c17d18c6470976d9866d76/crc32c-2.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:61d51681a08b6a2a2e771b7f0cd1947fb87cb28f38ed55a01cb7c40b2ac4cdd8", size = 80009, upload-time = "2025-10-17T06:19:47.619Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/fa/94f394beb68a88258af694dab2f1284f55a406b615d7900bdd6235283bc4/crc32c-2.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:67c0716c3b1a02d5235be649487b637eed21f2d070f2b3f63f709dcd2fefb4c7", size = 79066, upload-time = "2025-10-17T06:19:48.409Z" },
+ { url = "https://files.pythonhosted.org/packages/91/c6/a6050e0c64fd73c67a97da96cb59f08b05111e00b958fb87ecdce99f17ac/crc32c-2.8-cp314-cp314t-win32.whl", hash = "sha256:2e8fe863fbbd8bdb6b414a2090f1b0f52106e76e9a9c96a413495dbe5ebe492a", size = 64869, upload-time = "2025-10-17T06:19:49.197Z" },
+ { url = "https://files.pythonhosted.org/packages/08/1f/c7735034e401cb1ea14f996a224518e3a3fa9987cb13680e707328a7d779/crc32c-2.8-cp314-cp314t-win_amd64.whl", hash = "sha256:20a9cfb897693eb6da19e52e2a7be2026fd4d9fc8ae318f086c0d71d5dd2d8e0", size = 66633, upload-time = "2025-10-17T06:19:50.003Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/1d/dd926c68eb8aac8b142a1a10b8eb62d95212c1cf81775644373fe7cceac2/crc32c-2.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5833f4071da7ea182c514ba17d1eee8aec3c5be927d798222fbfbbd0f5eea02c", size = 62345, upload-time = "2025-10-17T06:20:09.39Z" },
+ { url = "https://files.pythonhosted.org/packages/51/be/803404e5abea2ef2c15042edca04bbb7f625044cca879e47f186b43887c2/crc32c-2.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:1dc4da036126ac07b39dd9d03e93e585ec615a2ad28ff12757aef7de175295a8", size = 61229, upload-time = "2025-10-17T06:20:10.236Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/3a/00cc578cd27ed0b22c9be25cef2c24539d92df9fa80ebd67a3fc5419724c/crc32c-2.8-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:15905fa78344654e241371c47e6ed2411f9eeb2b8095311c68c88eccf541e8b4", size = 64108, upload-time = "2025-10-17T06:20:11.072Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/bc/0587ef99a1c7629f95dd0c9d4f3d894de383a0df85831eb16c48a6afdae4/crc32c-2.8-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c596f918688821f796434e89b431b1698396c38bf0b56de873621528fe3ecb1e", size = 64815, upload-time = "2025-10-17T06:20:11.919Z" },
+ { url = "https://files.pythonhosted.org/packages/73/42/94f2b8b92eae9064fcfb8deef2b971514065bd606231f8857ff8ae02bebd/crc32c-2.8-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8d23c4fe01b3844cb6e091044bc1cebdef7d16472e058ce12d9fadf10d2614af", size = 66659, upload-time = "2025-10-17T06:20:12.766Z" },
+]
+
+[[package]]
+name = "cryptography"
+version = "50.0.1"
+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/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ba/19/797e2aaac9df6a66f1550f49979dc1b1e39ecd2077501c30efa81e8d5d67/cryptography-50.0.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986", size = 4010153, upload-time = "2026-08-25T19:44:03.155Z" },
+ { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" },
+ { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" },
+ { url = "https://files.pythonhosted.org/packages/55/32/38c0d344b98c06d34b5df8946565a9c0d6dbf32c8e0730a7f05f0a3c6cab/cryptography-50.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45", size = 5353524, upload-time = "2026-08-25T19:44:11.96Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" },
+ { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" },
+ { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/38/45abd72ef63f2e7d0754a6cacf97bd8b69512ace7f6130d24c39ece65da2/cryptography-50.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527", size = 5308405, upload-time = "2026-08-25T19:44:20.197Z" },
+ { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" },
+ { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" },
+ { url = "https://files.pythonhosted.org/packages/42/8b/cb12b1b60c91b074ca6bf0fdd59aa8f10d8bc5f73af8faece86ef0421b37/cryptography-50.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:aed8db4f6d71c51efb89530e12d9464e7bf2923d46c3205dc794a2a93f8c0648", size = 3842826, upload-time = "2026-08-25T19:44:28.784Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/f0/424cb557d99aa86ac55da5e2add02e2882e44047b6264f93ade1b975a993/cryptography-50.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30a125032e5642a21ff816e021152bd4e7e94f03eff3f4b7fca41cd22bc3110f", size = 3973525, upload-time = "2026-08-25T19:44:30.7Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" },
+ { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/6e/1cf405c5c8e8df7545378048e954792f00b7f2367af8863ce8b8f3e10607/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9", size = 5332388, upload-time = "2026-08-25T19:44:39.16Z" },
+ { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" },
+ { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" },
+ { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/1b/ec3ebd31741d0e963612c4fe43caa39341b9b1e031e469820e42e4c83918/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6", size = 5287201, upload-time = "2026-08-25T19:44:47.297Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/56/bc4f2b209e766c93372cfcd59b781a0b2b59700f62a969580415b699c2b2/cryptography-50.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f74455bb086a85d5e81246412602aaa97ed095e504cd40dd261ef50be42205bf", size = 3825806, upload-time = "2026-08-25T19:44:56.209Z" },
+ { url = "https://files.pythonhosted.org/packages/84/a9/ee16a903f13755e914d1eecc482fe64d1f10761c3960e5d8fa6837377aff/cryptography-50.0.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0", size = 4035307, upload-time = "2026-08-25T19:44:58.305Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" },
+ { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/2b/214cf0cf93db9628c3c20c896b229f327f6fb1b20e4b3743d8ad3f00af8b/cryptography-50.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054", size = 5375862, upload-time = "2026-08-25T19:45:07.163Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" },
+ { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/04/557fc5ead96a829e0bc812a3b9dc4a52a2f27e4f7f5950da7ff27653a805/cryptography-50.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80", size = 5332955, upload-time = "2026-08-25T19:45:16.193Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" },
+ { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" },
+ { url = "https://files.pythonhosted.org/packages/99/89/87ef49ffe383ef4e147d27b7bf2088fb0b54ea409dd87b5a89442e5828a5/cryptography-50.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2", size = 3875429, upload-time = "2026-08-25T19:45:24.418Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/27/8d207af749c453ee17ea087340b3f2b4adef75aadd1d277b1b129bdda84e/cryptography-50.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9cb3cb952cf5a8abd50c782a98a89d71699715e802fe349704b47f2425b42a94", size = 3974350, upload-time = "2026-08-25T19:45:26.551Z" },
+ { url = "https://files.pythonhosted.org/packages/14/9a/6d3a4d7852e22d657438b7bf51f66102c7d71c0e1fafeec652281d0403e5/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f", size = 4698675, upload-time = "2026-08-25T19:45:28.658Z" },
+ { url = "https://files.pythonhosted.org/packages/73/35/5c3717edf9e68a0550ce04e28eab493fe545eccd81742af03f6a75fe260b/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671", size = 4707410, upload-time = "2026-08-25T19:45:30.816Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/e0/e786934472e3ac4ecdecc7b129a0ca1a2a40dffdafcf2c3ea9d4397f8def/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e", size = 4698378, upload-time = "2026-08-25T19:45:33.043Z" },
+ { url = "https://files.pythonhosted.org/packages/51/cf/5b3f53a0b74d122f023476ede40ba5d3e70d5cf475f73b899740d26a4fb2/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6", size = 4706889, upload-time = "2026-08-25T19:45:35.086Z" },
+ { url = "https://files.pythonhosted.org/packages/71/44/711e61f7d014be825ef79b285b047292d1bf893732ac1bc030a351fb517f/cryptography-50.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:693c99b49bd37d0d096e4334c10232c77248c415b98d35236094cdf96d57258b", size = 3824006, upload-time = "2026-08-25T19:45:37.281Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+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 = "frozenlist"
+version = "1.8.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" },
+ { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" },
+ { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" },
+ { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" },
+ { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" },
+ { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" },
+ { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" },
+ { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" },
+ { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" },
+ { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" },
+ { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" },
+ { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" },
+ { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" },
+ { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" },
+ { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" },
+ { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" },
+ { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" },
+ { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" },
+ { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" },
+ { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" },
+ { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" },
+ { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" },
+ { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" },
+ { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" },
+ { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" },
+ { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" },
+ { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" },
+ { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" },
+ { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" },
+ { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" },
+ { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" },
+ { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" },
+ { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" },
+ { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" },
+ { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" },
+ { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.20"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", size = 216463, upload-time = "2026-09-17T14:11:04.752Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", size = 69583, upload-time = "2026-09-17T14:11:03.168Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "multidict"
+version = "6.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e7/59/84b6cad9ddfdd9471db727b0e987c60ecbdb6b206ba265e8c50e74a1ab80/multidict-6.9.0.tar.gz", hash = "sha256:d7d32c0543494efbc9394e2b571725071d08e295993486bc9a43f6f89375ee01", size = 173221, upload-time = "2026-09-18T12:50:55.299Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/97/cb/e85c185d483d5bba7ee61fc593b32045052398b934f76587aa35db9f4045/multidict-6.9.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:63c9da87fa6d4284e57d2a6e549dfe8f2938ab578fddab3f8ed9742812c9d0f3", size = 94405, upload-time = "2026-09-18T12:45:47.159Z" },
+ { url = "https://files.pythonhosted.org/packages/27/d6/0e55ad978c6c363734fcec653557bb6d40a75d91e8c4a814e6dc7761f43c/multidict-6.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3663ce6cb19c5e3123c9aad5907804a42d384f8cd4b67e59291efc9480f8da9a", size = 57778, upload-time = "2026-09-18T12:45:49.356Z" },
+ { url = "https://files.pythonhosted.org/packages/91/70/dad461e4929fb1b282b8b0d164c30fe05bf034a8e06b6e51d55f8a17491a/multidict-6.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f7f340a4a6ad4dacb0f866143452d794ea32a0d9ddf79d93ecb4c3ac5515d0d4", size = 55596, upload-time = "2026-09-18T12:45:50.509Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/fb/c666ca3dabd4d4e299c90ccaaf4808dc6ca43c19ca15e7a2892e48a321fa/multidict-6.9.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bf44632149302f7fdcf5baecc277d816ab77a47a268f2392dc5d2d01c56770cf", size = 283504, upload-time = "2026-09-18T12:45:51.62Z" },
+ { url = "https://files.pythonhosted.org/packages/98/da/a37945d4960409dbc87962049eeebfef4a9ef82bc206fb09c398d1d5c2df/multidict-6.9.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:095b091158c89a03ad1237b4880f857d27628f93c23da1616ee5640011439c53", size = 282937, upload-time = "2026-09-18T12:45:52.98Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/ed/5aa096198456bdb95eeac06eff83a9258d238d4a88938f89b69007c79202/multidict-6.9.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3958fa87a161a6b9c6661606784abdd8f1afa21a0d6e99d1b99512e70e6b4f1", size = 266468, upload-time = "2026-09-18T12:45:54.316Z" },
+ { url = "https://files.pythonhosted.org/packages/33/bd/c5835dffa28a662cf11450dcb87602b2cd3e22f2cb5052208daf73d04cbf/multidict-6.9.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9f99e0eec05aca200b66735a38f8de5c9be03a6afd62ba7f28860203d936a03f", size = 296353, upload-time = "2026-09-18T12:45:55.667Z" },
+ { url = "https://files.pythonhosted.org/packages/76/6b/79fd6a995db7d0c14020748a6e912ed7ce5359f7742a8a8cbae136bb950a/multidict-6.9.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a4d98efa7b004b67cb8cca26b218012efa50c7103cf4ae54898f2bbf89a3c62f", size = 298413, upload-time = "2026-09-18T12:45:57.027Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/e4/4ea1ab36ab8ed969c945f1abdc350e5865043b7466789d917735213d2369/multidict-6.9.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a23926c06835ad71e6bc755ebc07ad34655847de63c01a5d06b6501997712c4c", size = 287647, upload-time = "2026-09-18T12:45:58.328Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/8a/a5975e9e83636f99d56d6e55d0953767264f4e3615ba211d7d023e611faa/multidict-6.9.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:06723cd13ace09a0ce1ed010fc9e57cd762e57ee23691d6cdb13b7fcf1a35468", size = 263242, upload-time = "2026-09-18T12:45:59.739Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/17/df79169acf85722959f77754fdf299c851143e791eb4662323a027564d91/multidict-6.9.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:27dee31d6f3a0d2be018b71721adbe24aed9b08bdc69d133c88eead07beee600", size = 275725, upload-time = "2026-09-18T12:46:01.06Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/ec/7857067a52d9c6d7b4c89ff95c446fd58efdc8809c75986ce1c3ea5ceb96/multidict-6.9.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:90d341b2c64eacef24fc0a35aaabc5227834ce93bb1da416d61601663df29456", size = 272405, upload-time = "2026-09-18T12:46:02.355Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/99/204738e586c0add0e8509eb6818421e080fa208d58f4fa253beb3afbe8a5/multidict-6.9.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:986de92227e44b257fef664a69613a4346a090553c186d0ae3bf15ceab447f5e", size = 284465, upload-time = "2026-09-18T12:46:03.747Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/0b/58538e92d079e9624b4fb38825db3ef554ce7b7a4015b27f44315225fa1b/multidict-6.9.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c8da6d6fc78f971ebb9e29563c891a429374861afda55e4692a7962e3822637d", size = 290600, upload-time = "2026-09-18T12:46:05.327Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/ae/00c4d8f4aa3b6c6fc455d99b490a747b5d1e8042931134adba4e4587e738/multidict-6.9.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:8903ce696f0aa9dc301c5621fa0f0e24e985d4e6cc247cd63bc9abcd5a081628", size = 264836, upload-time = "2026-09-18T12:46:06.661Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/2d/757b1db9ac984952f6c7ea18ed487341d858d9f909369ac78f0176cd0892/multidict-6.9.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bf345dacf96fd9c698ad30c620fbdbe6e1edadf83944203ce5b5688f52e3d141", size = 289493, upload-time = "2026-09-18T12:46:08.133Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/ed/e997b8227f121a720749680e8d9afd874950b527c4c39474836e79314416/multidict-6.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e63e05228c1f1c1bef09c08abd2f97b6fe597c9ca14a1c94bec4e76b4664046c", size = 286012, upload-time = "2026-09-18T12:46:09.401Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/e5/29ae2881aae5f1a5372e8f530ded0934513ee142a270eb0ba236607142bb/multidict-6.9.0-cp310-cp310-win32.whl", hash = "sha256:f25229fddbd6bb3d47f1141c319bead19fa3c9e62790c6d51201564fde05fc2a", size = 49754, upload-time = "2026-09-18T12:46:10.778Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/6e/bf53c6ca01c9b0192cf612333d52dfcd669b0691de34a54a0ca712c58a85/multidict-6.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:05f197459db34dee24ae7e3560affa5c6f93989805899c9bba13358b5116a12e", size = 56666, upload-time = "2026-09-18T12:46:12.129Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/88/e2caa7a73d5f3fd5b1b116a4fe68c23b5622506c3a9e618af054b9a86a2d/multidict-6.9.0-cp310-cp310-win_arm64.whl", hash = "sha256:d4464437dbbd7a5a71a5e86f2a9ec92ccbb8d96706f5a173ca985175f23adaf9", size = 53305, upload-time = "2026-09-18T12:46:13.48Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/66/e6a24d5312d139d22c9bde2ee2e3bbbe12e2e4e9bd2a0166e4713a3eb806/multidict-6.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e46237ef18c8ee183dde740f0174d6ecf9c26d362b506b5d23fb57bc3634bc0", size = 93712, upload-time = "2026-09-18T12:46:14.814Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/e3/2544daf98ca0830885aac9a77e975938de79c87a3bd5dac377a1b7d6b3a5/multidict-6.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e33fabca25633cf0e4f9dd4495733d09b7f0628fc9424c5b5e58da644fd4ab94", size = 57425, upload-time = "2026-09-18T12:46:16.15Z" },
+ { url = "https://files.pythonhosted.org/packages/df/21/71359300b0057f9db66784fcf1eb5da9f44e0165c32bf4cd210d5016f6a0/multidict-6.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e82873b56ed37b328501fb063962299ea6f7fc1caf1a5c47966028824bde0807", size = 55275, upload-time = "2026-09-18T12:46:17.523Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/65/f5bb323238774031fb36b17880b44d98f448291053862f8028219b8fe325/multidict-6.9.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2e2169fdb886288fc6bf9d8e48abca9487f8b3ace1f5ab269b074864d212351e", size = 303270, upload-time = "2026-09-18T12:46:18.986Z" },
+ { url = "https://files.pythonhosted.org/packages/45/63/fdebf39250851bdfceabab1b3e7c6be8b2e540fa35dab9337e301992bd85/multidict-6.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eefec2a6b0381846ce54d88f30de4b3a5c15ff0bddc5264cccba85b710a8785d", size = 297566, upload-time = "2026-09-18T12:46:20.444Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/a5/79b323360cfbe374eb50ca23bb1209e19f383c36f3d41cb4b789031917bb/multidict-6.9.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c63013a210a09d4a8f30814b785450f1d0a2aaef8230c1e068e83f3afceb6030", size = 278467, upload-time = "2026-09-18T12:46:21.803Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/19/9160c4696d0ac19ac994826eee6b53dd1fbb0f370d261e12ec13f09fcbf5/multidict-6.9.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4fd82f81dd0676059f9bc3a418a79f27feab19486100a255bf8488cccb3e60d3", size = 309639, upload-time = "2026-09-18T12:46:23.142Z" },
+ { url = "https://files.pythonhosted.org/packages/63/2d/706614e7d42872ee802cda94dd0b3836bf363ce762e140d9fadb0d10b425/multidict-6.9.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:deea26b6979ce46f2fb3b2db9b651e12eb7f94c26a1ee457b79f66ad36a64fd1", size = 309268, upload-time = "2026-09-18T12:46:24.51Z" },
+ { url = "https://files.pythonhosted.org/packages/69/d1/880acaaf0248f15f5c00f9f53cffe946552708473ddbf5377472f7bb94de/multidict-6.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58a4aee7188676c8317e3131bd844faf70e427979e1f20b8598c61f6cbd8b073", size = 304375, upload-time = "2026-09-18T12:46:26.178Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/2e/426b1d119a910cd14e028d361e6d03cafc7ccaa66448f9d5713a39c1d823/multidict-6.9.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eee11705013394ebeeb383c92beb0fc9a3c449ac3382a6ee3aa23b38c6b06c3a", size = 271528, upload-time = "2026-09-18T12:46:27.577Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/60/91c9f1c2ac13026eb0eacad8efe56600051c94b398f487b8b9e064e0f119/multidict-6.9.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51e77d089f82ed2e288d3a1cbf6cb7ffa927c8055d8ef61d57b27f4d8da557b6", size = 290205, upload-time = "2026-09-18T12:46:29.079Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/d0/91bc9f1a761b9ec68e44e8a8103ea75b4628b1bacb17a99c2b1569b92c73/multidict-6.9.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:79640bb8746b703971fb16569e7bfa82d90548137cf4094769aa45cbafda9d9a", size = 282650, upload-time = "2026-09-18T12:46:30.553Z" },
+ { url = "https://files.pythonhosted.org/packages/72/00/2565caccc7b19291958b30df8fdd26a1d9c1135e3b0faea45b8a7f044c5b/multidict-6.9.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:092214366f729803010a5c260f4a4f44d223c688641dfc27da851588ac762ffe", size = 304830, upload-time = "2026-09-18T12:46:31.938Z" },
+ { url = "https://files.pythonhosted.org/packages/18/d4/dd23f9de4a2295d197b909aee4f6f6384d67a041387a390d449130dca9ee/multidict-6.9.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:da469a672bf3d343eb6757d53ffbac36f1a29b93a9fe76558b5d0fd7a7efa599", size = 303162, upload-time = "2026-09-18T12:46:33.493Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/85/db485b0b41c6792938adebbf82e97a80a25e7f75a7b5f3ae40d82d58a31b/multidict-6.9.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4216a8b4214a1ee4511c551c59d51534637394e9433765fbd8face86db43c532", size = 270199, upload-time = "2026-09-18T12:46:35.013Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/4e/31628e8bcd7486a3f92df664194234d9c46be17d91161e28ce39137890b1/multidict-6.9.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f05f5b3171e23801e72fd818de236be9f239b10ba699f23e43bb9596651f8b34", size = 300407, upload-time = "2026-09-18T12:46:36.48Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/c9/eaafac4f07fc89a6a815dd650664afe5ef8844f1de4283e5e2896bbb658a/multidict-6.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0c69b098c85685ba39efef1d8a9711243df8a4c4b051a35d3cce7f323381f8bb", size = 301708, upload-time = "2026-09-18T12:46:38.011Z" },
+ { url = "https://files.pythonhosted.org/packages/81/38/e64dc0e0cb1b22145fa4d8077fe60c65acbc658244440b6722947deb7fd7/multidict-6.9.0-cp311-cp311-win32.whl", hash = "sha256:855be03f39b97e352d54eaa7b14ba2a46846cf14719ddb689cdaaee811462440", size = 49666, upload-time = "2026-09-18T12:46:39.448Z" },
+ { url = "https://files.pythonhosted.org/packages/08/e9/3f84cd56a83ac0369bdbf092cf5fa36da23c1903e2ee8d183a6b1cb96a68/multidict-6.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a8040dde3fe35ead6b04adf3cd3fdd3bfc7c941505775d230b4501d18227c77b", size = 56862, upload-time = "2026-09-18T12:46:40.693Z" },
+ { url = "https://files.pythonhosted.org/packages/06/0c/ab42593d68bac2655c4f25a65e9393ba468040126072f9fba2a2ee0adc5c/multidict-6.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:70b3097b838d9fc336f426c7aa7d45b7881ee9b06a10f4bcffd0dcda0cbd44e5", size = 53098, upload-time = "2026-09-18T12:46:41.919Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/c4/9cbd1370a191a49a2c4d0217c19e391aff080a9b35222f10c71ec73fc0e9/multidict-6.9.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fdd484b84d3394e805689c56be3ab1f877ae7ff0eb9ff90a3ee7a755cbebab4f", size = 94050, upload-time = "2026-09-18T12:46:43.407Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/16/898930380953e7fcc66aabb9f822c1f46c4d459cdc0d82bed0de2f687628/multidict-6.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f93c9058a0eceac0df2ce9d4c8823b84786ee598194753c2ca0c100224405e47", size = 58006, upload-time = "2026-09-18T12:46:44.916Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/22/0a55faaa9bba51bd7a01040106a5d40292e87bea575a2905afc37256e684/multidict-6.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c7ab60b91e11b25e7682c5cd8763fdd17929ea83f234ba441091f1492e631ea3", size = 55015, upload-time = "2026-09-18T12:46:46.304Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/e7/6dba7bcfda65432a5af6f5978fb84ffda0360471f9571ea434afb06bd09a/multidict-6.9.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:640113258c5925a9eed2c12523410b25565ac5df2fa6735fbae88fb09bcdd212", size = 313468, upload-time = "2026-09-18T12:46:47.587Z" },
+ { url = "https://files.pythonhosted.org/packages/20/b7/3317f5a0aba7a38f74a250a872c5a7ba58407f71028e09a9961fb3804ac2/multidict-6.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2ea72901860ccbe94517421681c60b13533ce03ba2f7bd96293c3a4d16ac4ccb", size = 313112, upload-time = "2026-09-18T12:46:49.149Z" },
+ { url = "https://files.pythonhosted.org/packages/57/d3/46a482725368f3f29558bfca1a12a05ea68db6a51be54799d80b1bf81626/multidict-6.9.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:408fac672931f2458be3bc8c89d9facd16dac2aad17c7cee2ca1693eee99f07e", size = 298902, upload-time = "2026-09-18T12:46:50.721Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/71/ce4e30a3387b403bee1623873636e2b84f2e8b686a8d584f8eb9c62fa209/multidict-6.9.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:67bed23e9803945b0760650ec3e903af772c49abe869f3bc03c66b2e7649d5ef", size = 321654, upload-time = "2026-09-18T12:46:52.145Z" },
+ { url = "https://files.pythonhosted.org/packages/de/a4/3ad5099a178cbbd28913cd1fe77fd724cc576839f7893c301428d1d4f798/multidict-6.9.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4bb769ccc72e15d7d441e1a08f169d418376be77cdc387e813129c26b357fe50", size = 325316, upload-time = "2026-09-18T12:46:53.732Z" },
+ { url = "https://files.pythonhosted.org/packages/47/cd/f27bf3242c2d70046211788d897679686a498bb032fbbc25f3c4d41ae9a5/multidict-6.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6a5111a2bd824c821a3dd09da29680391b0caaa18fea7761358f4001e6898d1c", size = 317426, upload-time = "2026-09-18T12:46:55.155Z" },
+ { url = "https://files.pythonhosted.org/packages/32/0c/8215c0167863a262ba8f886288c48fa2475c28fd0bc39fe548a8c86c8f73/multidict-6.9.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8e991677c4bdc5d9f2e71c74717a4e32cfe98930ca05becdf722b5eae1329d6a", size = 278390, upload-time = "2026-09-18T12:46:56.749Z" },
+ { url = "https://files.pythonhosted.org/packages/03/23/c51276d1086756f45cfa72d07f9d7bd21a59ce49b4ee7a245f99b2c9e527/multidict-6.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb69b724c345420ba49187a17a894f146099f5b2e501df42ddb4452ac8be37fa", size = 304354, upload-time = "2026-09-18T12:46:58.217Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/63/7d04a6347d7b06bf1868a995f91b2f2dc168a265860c55874101e4be7afe/multidict-6.9.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cff3cff5a725bdb8359962de8d7429aea592d7693dbd197eeabbdfab9b6300e9", size = 303669, upload-time = "2026-09-18T12:46:59.791Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/42/402d6b85d0e4aab551e700ca9123ebe2a52217836359eefbc1d92fd7f64d/multidict-6.9.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fca5b74b5909c29041f857c40d51d9273636fb4221cf020e4c452deb1c448a40", size = 316363, upload-time = "2026-09-18T12:47:01.41Z" },
+ { url = "https://files.pythonhosted.org/packages/64/f6/49b70d1f876d7bc9263c972d2ecc58262590ea0c70743082ef091585b20d/multidict-6.9.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11e32ccf23cdbfcf8299a6a825930a858ec9a6aa05d6752d0f90f2bdf19489e1", size = 315126, upload-time = "2026-09-18T12:47:02.889Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/5c/afff3cb22ccb3221b9715637f5e39f6a576a4c28ce8fc405555d94a17975/multidict-6.9.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3ec1e387b1f8a85ae5b94aa8c4e0576912ffa4d31bd0578f24c950d4f05ee476", size = 278125, upload-time = "2026-09-18T12:47:04.539Z" },
+ { url = "https://files.pythonhosted.org/packages/24/75/edd123ad77ac77a108b2f7ba322727e92c2d39d714df2bbca9c09af9d741/multidict-6.9.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e4826f6b56456fb1e98111d7bc20cbdc7fa0a41b1f9ad80ff2dd3f2f5b226fe1", size = 315167, upload-time = "2026-09-18T12:47:06.897Z" },
+ { url = "https://files.pythonhosted.org/packages/79/32/0ba8f8b6a0529bc46c5d4376128a3b9dbc3d7610d0a5768be0e599b5e56d/multidict-6.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e71a072c52c78b7f97cd4611df6cef10977e4f2367cd0654a7626192f931adde", size = 313411, upload-time = "2026-09-18T12:47:08.335Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/77/3b7b32a4331e99e89dc915c2dc1b054e49dd0f8c9c0c783c4d6063048da5/multidict-6.9.0-cp312-cp312-win32.whl", hash = "sha256:95d339c3b75b4a50c665bdcf8417428cd71c3e5cd48e194cb1d336fcb856beac", size = 50943, upload-time = "2026-09-18T12:47:10.105Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/e0/484132b6c9d175939d8fb8b6c45b1d4eacecc79add962e1b4157ba138f60/multidict-6.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f06c4da5315a6f709b13408c3e13f3b475f8c559ec7608c3c67062512871235", size = 57304, upload-time = "2026-09-18T12:47:11.993Z" },
+ { url = "https://files.pythonhosted.org/packages/27/14/63792486623819be73ce2149749bcc0b82772d2de22e02d452213603c432/multidict-6.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:0db5bf96ec2ce45a8bc7fbbe8a486089969bb2791a66b6789ee3aed0d5dd562e", size = 53498, upload-time = "2026-09-18T12:47:14.294Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/cd/d9475e63b3bf46bb369437323a5906f2442063812f4c7c892d39cda2a578/multidict-6.9.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:662315f8621b3559268813b11134c1f9633edd4ab5f7b713688a243c13f4026d", size = 61405, upload-time = "2026-09-18T12:47:15.908Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/d0/69cfa797b3e5f85ebc45c39d5aca05f69afc95e23b22943ee57f9499ece6/multidict-6.9.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:4bef8cb5edea9c9daeb8396a75eeb97f912c3fb3fa408fe659edfecf91e47424", size = 53250, upload-time = "2026-09-18T12:47:17.254Z" },
+ { url = "https://files.pythonhosted.org/packages/89/29/dd5d451e17dcec77f6b2dc0ed032714244d3562477349465dcc525f86297/multidict-6.9.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:75f7fc21ffce9a792cb919f0e0b0b52117bd672f2a55d1929d573b6fc437f374", size = 54521, upload-time = "2026-09-18T12:47:18.719Z" },
+ { url = "https://files.pythonhosted.org/packages/93/d5/20d0b17d61a1fba726b96fefdaa224a2da04e66b0ad9ad08af248023bb98/multidict-6.9.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bb6be697065cbf31051465f9939d65624573d2219c3da8316db9e7cf5e0f5a7", size = 93484, upload-time = "2026-09-18T12:47:20.211Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/12/8067d5bd826b16eba31cb11b3f37ca6089d31b6afa33f208e77943f86230/multidict-6.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67bcff396d2ad62197c95488a716a88462792b384b5ea6e44bf7c1070eddb8fc", size = 57700, upload-time = "2026-09-18T12:47:21.668Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/da/ebf8f7e41e6bb58240ec346e5b8165acefd7ffdbce8ff503ab1bf2a1b883/multidict-6.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:beda95a6bd0a2e2265b941b90ff72543afbeaebb6a450e3a6a010d10d4a2ffca", size = 54762, upload-time = "2026-09-18T12:47:23.163Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/d0/00ea9e7835ef5d61ce7d780d0aaca89a1d2215285937c9f12a089d1223a4/multidict-6.9.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e78870909e9f9e3d672ba99f1eb75130d7e01c42e642e6a70f434df32ca0ee1", size = 313470, upload-time = "2026-09-18T12:47:24.638Z" },
+ { url = "https://files.pythonhosted.org/packages/81/67/1cc27283d5a8b92f499addf7f8b2d47af5528dd019d3375a49c58bccf8ec/multidict-6.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91092d597fcf0940cd6a59e64ba7156ee22d6899993fd7c5b1897fda71482f8f", size = 312460, upload-time = "2026-09-18T12:47:26.282Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/ca/e5e9ff320467bfc5301499f6cfef049b427f9e2f757dbe2c2d63912c32a7/multidict-6.9.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4be612f23990a261060ccd8f15e89dad1f9b7bb0c1021c5c3987f5fc57959391", size = 297202, upload-time = "2026-09-18T12:47:27.885Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/f6/53dd52b603ab0eb5a6b4c29992d902f4f76a802c192aae48f915e7bdb566/multidict-6.9.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7aaa14f0b9ffa2780c5d3b21da0e9b58778ed47af3369df72e5fd6dc10ff8041", size = 320331, upload-time = "2026-09-18T12:47:29.704Z" },
+ { url = "https://files.pythonhosted.org/packages/54/f9/e9d3c76824ed6eb6f92a992e501f15c4daf1b01bba2451d0254c943c8eba/multidict-6.9.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:97555ad30ad20a8eb90fa86522088eebbbd68aba03e56d53f4850b3535c65e61", size = 324944, upload-time = "2026-09-18T12:47:31.451Z" },
+ { url = "https://files.pythonhosted.org/packages/82/fc/19deb0d051c694dbc2d5008ec89b341f7ee42c4412b38630a47a14339115/multidict-6.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c51fd8d59e72e45c64907bf7f81fbd94f4c8dcd1c8b2f23f4c2d7ede788fcfc3", size = 316918, upload-time = "2026-09-18T12:47:33Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/b6/b4e3a2e62ea902f2f000cd7a8eee8da4f31c6137ed35446eed11d62ae321/multidict-6.9.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22067e88ff266e6a5dc59114529332692a01cc04b10dbdc2c14ab91217dee819", size = 279224, upload-time = "2026-09-18T12:47:34.624Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/a7/656ae0635cf82d9bbd8742403c7cbebd5bf555e02686b5e1ac43a80268b8/multidict-6.9.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e231de8ce43d4fd10bec4f67f71238ed88a974de30a9f20be7a4ab16c970a988", size = 303343, upload-time = "2026-09-18T12:47:36.335Z" },
+ { url = "https://files.pythonhosted.org/packages/69/86/cabef61a7151451a7f153679a1dd8b9d31684a0f8edaad782da5f1900083/multidict-6.9.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b33e499a7b1f722547d57b4865ed68c03161643b9afe49fe097a0832078d183d", size = 302877, upload-time = "2026-09-18T12:47:38.323Z" },
+ { url = "https://files.pythonhosted.org/packages/07/63/942663ac05edd16c96ecf71f89f2f632dc113192684303287d727e465605/multidict-6.9.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1eb7939025bd9289d9dfe3a399102b1642f4fbb105a6af82f284052ee89e97a9", size = 317489, upload-time = "2026-09-18T12:47:39.843Z" },
+ { url = "https://files.pythonhosted.org/packages/08/d2/359d4ef44c74c8ae25099dc50fbbebd074cca913d49d713aad10ac83b710/multidict-6.9.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:51a08dceed4b42ef25755ee2cbf50df325e90e6b415d00955ffdea2c394ad6c0", size = 314278, upload-time = "2026-09-18T12:47:41.987Z" },
+ { url = "https://files.pythonhosted.org/packages/37/fd/0b7a4fa989135045cd531c31c1adbb7ae762ee7143f5f1bc27985ae71d6c/multidict-6.9.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cb847cb4002e725f88ffe29883da8290fd0754fa0461ed8988735e20964a9f65", size = 279318, upload-time = "2026-09-18T12:47:43.812Z" },
+ { url = "https://files.pythonhosted.org/packages/78/08/7fd82e0e627b30733619c2d5ee52df047c608b562232e501835d645a5384/multidict-6.9.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:516fa4817cd070088f616a901380db56189f86daee9da79aada3c9b653f49ed7", size = 315045, upload-time = "2026-09-18T12:47:45.659Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/99/08c09a9aa8797246bf6b646e603654a8f25326df4881855da4b9b10a5e56/multidict-6.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:254e53be2ec70518bb82dfa9b0c7166baaf2bd0e918bd17b65caaf489d5a5522", size = 313360, upload-time = "2026-09-18T12:47:47.503Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/3c/72f0c58d20f3e8d167105b0ab3e8b4a9e3d7fd285b9f6fe4f1e1295ad002/multidict-6.9.0-cp313-cp313-win32.whl", hash = "sha256:9869105ab61db13004f9ed610cd29ce4237b2c609f5f7b8bb8f2339fb9dad17d", size = 50744, upload-time = "2026-09-18T12:47:49.125Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/51/384557cf30472e760ab9e897105f3a4dc7bbb8162e4a60695008ba012c40/multidict-6.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:85ed0f3c3b01174aea5a8a8fcd456f64c2e9719c0f42c612c2694ecd35974a65", size = 57094, upload-time = "2026-09-18T12:47:50.611Z" },
+ { url = "https://files.pythonhosted.org/packages/59/89/8a3741537d155588cdf220bba1f1e5c96ef2e92ee1f41856be76237eafc2/multidict-6.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:1126782e3c3b1a7ccd990be3d3221709348e4b07d6ecf8b50965a93ae2624145", size = 53342, upload-time = "2026-09-18T12:47:52.15Z" },
+ { url = "https://files.pythonhosted.org/packages/83/35/41bfe9812c1efc85b2b1504c4fbaf19574be11d18df1f08abdd489280efa/multidict-6.9.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:1b34b10b615db5a3ed424b174a362a3cdf06220bd892d03d151a619bb157c4e9", size = 60487, upload-time = "2026-09-18T12:47:53.713Z" },
+ { url = "https://files.pythonhosted.org/packages/61/98/b5e73e4af8c6df0b2c9cdab4b2566dcd5185fb4a345567e51ea2008008eb/multidict-6.9.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:f7f0b996a20776018a253061a781ba983e7b944e17a0748822026048b8b0bb07", size = 52425, upload-time = "2026-09-18T12:47:55.285Z" },
+ { url = "https://files.pythonhosted.org/packages/62/f5/9f6586f01b458af9690490f147f5d011bda35dca8c5887258a9c7cc35d63/multidict-6.9.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b612842f7f286c42abc5dcbda1db50e9dbed39720dd15feb07dbc9974bfeaa7c", size = 53691, upload-time = "2026-09-18T12:47:57.05Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/79/532ef4caa1f9fd3573751821923fcdf1948f6b4648c96378bf9042340596/multidict-6.9.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:71ee2b3198323cbff7a846538f01599f309dddddba79b5bf5a3dca2e49460ef6", size = 91804, upload-time = "2026-09-18T12:47:59.033Z" },
+ { url = "https://files.pythonhosted.org/packages/28/5d/40602b534c8b731619a39b3cf1e8f41b25d81e125af3915b858bbc254de5/multidict-6.9.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d0dc1f9c7dc07d86e5a4ed24f3a55b945106f3e7c70a984ff8dd9267270414ed", size = 56892, upload-time = "2026-09-18T12:48:00.59Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/dc/9876ad169f03f1d6163dfb5d9b90913c9213335c19a61f206a0b75d62815/multidict-6.9.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a26c8672d70d2c12c2f1c4df91fe92422e905efaf1d639bd4d7192868a21e711", size = 53936, upload-time = "2026-09-18T12:48:02.684Z" },
+ { url = "https://files.pythonhosted.org/packages/18/75/f8e9e24de0d4d085632e867c54606acb97920b7a5c9953c0947fdbaebaa2/multidict-6.9.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:186cc28558e3d6921ba797e433cd58ce64eb8b2f553e93f75dccbb9a604b7457", size = 315198, upload-time = "2026-09-18T12:48:04.272Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/eb/f6a43d347b3b60184d4058cff8b1e611529248bee210ab78505d0f2c023d/multidict-6.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ebc02af6ac170631774219c26fd63b4404d1e836a1aa92b738a3127eaa2aebad", size = 310536, upload-time = "2026-09-18T12:48:06.323Z" },
+ { url = "https://files.pythonhosted.org/packages/60/0a/65fcd25d3f4b2972bea7c119fe7142a7e9e643f687a3f1926dcc5624d87e/multidict-6.9.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62c4ffba9f81a2b17cf081bfe4e6b7eaf17193dc17d5870c01b2763e48efed24", size = 287297, upload-time = "2026-09-18T12:48:08.41Z" },
+ { url = "https://files.pythonhosted.org/packages/87/62/e6be8a2491810ee921f60c730b7d5275b7f5212927022fa599a1c822df98/multidict-6.9.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3a7e2aaa0e9a6413b54cd90fa0fe5944487872a7130a1c07347627974e677a34", size = 318886, upload-time = "2026-09-18T12:48:10.135Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/5e/f1702e7bdce29893f05d1596c23b4eec791d89d7d69786aa4be34f7ebf68/multidict-6.9.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:26e34dbbd6c3438ee19e0db1f5b846a7ca957085d193ec312b488924c3941a0d", size = 321460, upload-time = "2026-09-18T12:48:11.892Z" },
+ { url = "https://files.pythonhosted.org/packages/54/86/ee493f4c319f998f48abd928a6c7b6f0d53604fa1b5ae53b23400cdac078/multidict-6.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d811799f821c06883404a171faa880660ef04c2687fc32fdaef22fb645fe80", size = 314222, upload-time = "2026-09-18T12:48:13.614Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/5a/a4cf1aeb9e2d17cac89686283638d89cc3dc49e9ae36c0e99fd9b5e8d9dd/multidict-6.9.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:89fde003cec43783193360c27de2fbb0c8ea2db1cfebc193c3fc657c436f9d38", size = 279835, upload-time = "2026-09-18T12:48:15.288Z" },
+ { url = "https://files.pythonhosted.org/packages/46/b1/d7e55edce6771e38c88204939720c022dd0027a2d7c110515a6f378ce76a/multidict-6.9.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9bfa4ba6d97ae6d9c1f5336c2abad5690bce1802a040f9aa5fa39cb0b3099c02", size = 301182, upload-time = "2026-09-18T12:48:16.968Z" },
+ { url = "https://files.pythonhosted.org/packages/96/cb/546c57c112860ea3c06d429f661a2e95027a7429813dad7f9bd0db7b41cd/multidict-6.9.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a776fbaf700549943b647f21479d69191c238c84fb55d5a48eec1b4cf6cf6e00", size = 295357, upload-time = "2026-09-18T12:48:18.872Z" },
+ { url = "https://files.pythonhosted.org/packages/20/64/6ed29fb8d80f806e2350ec84da14d18f079afa5be1f86529a30139dc5815/multidict-6.9.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ed04614c47379bcdfa01d3e165149518017ea034cd5f48e203c287cc3d2ebd4b", size = 315608, upload-time = "2026-09-18T12:48:20.564Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/8a/a636222fed7db139b474bbe726bca1bb615bfe0f59bcc880bd2590d05a93/multidict-6.9.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9c65d9912983991f368bd01f993191b1593c90ecde6be990d73add46084d235f", size = 311612, upload-time = "2026-09-18T12:48:22.296Z" },
+ { url = "https://files.pythonhosted.org/packages/91/6a/d475f18e6fa223d46a086c0ba6b3449582305e1a8719137b8f5df30e5eca/multidict-6.9.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:4b89b102be78ed286123e75a30efda519e1ef6b9d4a4d01a08213f5e01a18e45", size = 279440, upload-time = "2026-09-18T12:48:23.973Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/70/1eb5c630e99f8b32bdc030a46c3ddf5830a8daf38cb18364e5d75872470f/multidict-6.9.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:e3ed6563ea143214c63bb4452ae5e8787a39226b22101c179fa4d2eda5972267", size = 312327, upload-time = "2026-09-18T12:48:25.837Z" },
+ { url = "https://files.pythonhosted.org/packages/61/aa/b4dc4421596816a4444f8dd8ec25e294d47ff385feb01367941c96c6b650/multidict-6.9.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:448c05bd13f8675b3629fbc3fabb9e7bb19a5636a7a3eb677ea25a08d0544a56", size = 311385, upload-time = "2026-09-18T12:48:27.668Z" },
+ { url = "https://files.pythonhosted.org/packages/06/5d/afea7cf18163a56c3313bee7fb62771dc570a9aea193278e5d071f9b5fed/multidict-6.9.0-cp314-cp314-win32.whl", hash = "sha256:2b5db4f2ca34fce55d34b9c66a0eb5d0d01962e2420a1218ba836d8e46aa6ea3", size = 49929, upload-time = "2026-09-18T12:48:29.779Z" },
+ { url = "https://files.pythonhosted.org/packages/96/07/f20f633396700043a804fc1d7c397928e79d9955516b7621639219c6aace/multidict-6.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:ccf9f7f07e9ab6e24f68ccb2b4da8ded65c1fbc5390ebd897a5fe55cdd4c064f", size = 55765, upload-time = "2026-09-18T12:48:31.304Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/99/d1d5403e8c13bde35e4ca116213a5ebd021d35dcf546b18f5f6a38c77cc1/multidict-6.9.0-cp314-cp314-win_arm64.whl", hash = "sha256:64ef289ca3c6eaafaa705978686631cb5acc90a92a09bef39c95a810c5f4b804", size = 52025, upload-time = "2026-09-18T12:48:33.037Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/49/86d2a4ce9c034a16469096627dfc03a2c1015a21c976261bd29b80548543/multidict-6.9.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f17f485e1837a7d31216be8be991a51265bcfc3cfd2457d5c94ade6086793ad7", size = 104111, upload-time = "2026-09-18T12:48:34.741Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/94/af88a68c4536d791b9224749051856f2f8f6641a2470b04efaca22d6d548/multidict-6.9.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3fccacf47e756a0f487b2b7e4afc9f167db0770ecc4e887b38ae2aec99dcb510", size = 63316, upload-time = "2026-09-18T12:48:36.394Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/65/fb3f5fc6d108dfd32660559d8247de0834a8654f7cd0506c27881dfd9709/multidict-6.9.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:527655c10fca73fd336cbcd5ccaaba5d8ded1512a3183ed7ebcc1569db5f1de3", size = 60593, upload-time = "2026-09-18T12:48:38.136Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/e2/66e94b3ee770d5719a5e85f3c5a2f35aebd27a27025655c9694e80e9c90e/multidict-6.9.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2d3520f774e78dad488c97398e5c7253333baa4eea09785aca56d477c4dc05c7", size = 263846, upload-time = "2026-09-18T12:48:39.909Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/11/f888602d08bd861a8143c00a6cb85aac1c0f9fcfc917948465d2908898d4/multidict-6.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:518a76bff2567fb0941603b9ccecdd830dd2d717605e7a28c1edc9e64688759e", size = 278411, upload-time = "2026-09-18T12:48:41.735Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/d7/0f0f4ff3b27f9083a5c949cba860dc9552ca7a74a56621b95fcd1fe9e5d1/multidict-6.9.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ff308def558cbbff74ea889ec659d117ac550d4d554467ed6cb3bf6adadac7e6", size = 262973, upload-time = "2026-09-18T12:48:43.622Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/f6/8b70937adc0b0fa528544ce5ab98ad9dc8ba27b401b9ec8caa359fe8e394/multidict-6.9.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:875a77927cd7bc0bc1d0a0520a7ed2267bb169c5db03cc133eaa746526d4182b", size = 287097, upload-time = "2026-09-18T12:48:45.331Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/2c/ef888530e3ec279dd24fd1db34c027721b8e2aea8485bef99e7464cd77d1/multidict-6.9.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2182da6ffc9793dd66d7d3632eea2b131f1a1e26eaedd51956845501830d84fe", size = 288527, upload-time = "2026-09-18T12:48:47.094Z" },
+ { url = "https://files.pythonhosted.org/packages/99/b0/8ee78b0fbe5fe153e9566055e1107c9bae0011b1ae903e30c7ab2ba3e07f/multidict-6.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e680a0b07e44b87a975eca63f84860a772667b0037066a6e93d998eb41ad2814", size = 273078, upload-time = "2026-09-18T12:48:49.132Z" },
+ { url = "https://files.pythonhosted.org/packages/25/a0/9d0523f08827a686b80509f4f8f1b484f425f1586b951188cfa0f30f1ef2/multidict-6.9.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5066b7877e1e2ae2c3712c8037eff40a80d4cf35b393b4c42c81f1c4b73b346d", size = 249874, upload-time = "2026-09-18T12:48:50.954Z" },
+ { url = "https://files.pythonhosted.org/packages/19/77/9e5de655bc7a56d48789bcb5cfe49a89be952801d18cb3b6523190648cb4/multidict-6.9.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fd0ec96e9877cb4dddf7942dffa777837809663f8e55d4f79a2bad06453446b0", size = 266815, upload-time = "2026-09-18T12:48:52.787Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/cf/2352eed7e7984c44f896fe2034e58cd09fdcc9dc8c2385fc6177f8c00159/multidict-6.9.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:98b0738ac1a1593f609a7b67d25e09c7de57c0f91c2879eb01c46b2dae55c0ba", size = 261108, upload-time = "2026-09-18T12:48:54.658Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/a0/878e80568b168f4c623b5c3cb4d848d105e99cf9b4979f472ae7c60c2450/multidict-6.9.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0548fdffa634c495b866d89e02ae58a9588cedaeeb972f6ced433e20dee1db5f", size = 264379, upload-time = "2026-09-18T12:48:56.726Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/3f/3083816fb153cd5b7261d26160624d9289d8d0b087a9f125f4d184a86cbe/multidict-6.9.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:7d0649ae61a341b9a47a2afab57424bd2a0ce98d36ec170ce9a51ce92c7284f6", size = 277516, upload-time = "2026-09-18T12:48:58.775Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/76/55f4e30d2fb96d52e3a3d60c4aa2bd6ba6bd6bfd3ac0aa76e303e19574ca/multidict-6.9.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c6d470d693ff45678b9ab237113546f6dc18918be55b3c852a69ed05ae7404a8", size = 249342, upload-time = "2026-09-18T12:49:00.645Z" },
+ { url = "https://files.pythonhosted.org/packages/09/b9/bc9f88e51df48537105e3c6b2a6569c2de1a4deac6c7828ccc541e170015/multidict-6.9.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ac05ce26d2c902d2eb5afe70f2012d19f3b9510ed5ef054bab27a3d43bc7f39c", size = 274843, upload-time = "2026-09-18T12:49:02.927Z" },
+ { url = "https://files.pythonhosted.org/packages/60/ee/8e08e89b2b699590b5ecb8095581cb6e5389be5d985b16addbd99839065f/multidict-6.9.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e82ea3ca4409c20172074f27dc1ba5858174f143d0ee637dd058b8061ff024c6", size = 268912, upload-time = "2026-09-18T12:49:04.992Z" },
+ { url = "https://files.pythonhosted.org/packages/34/fd/f7d3e7112c4eb6f45ffafd4447fb549c1d42abb4e723db12c7158dc3e0ff/multidict-6.9.0-cp314-cp314t-win32.whl", hash = "sha256:d61680c1969b5b1b900fece510077e7732336eae02f68dda02162e04ff6ff321", size = 55241, upload-time = "2026-09-18T12:49:06.83Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/06/fcffb708fcb4f8fba0cf399af19e15d878d59dd76878d4b3f34aeba98c52/multidict-6.9.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9a9af5d28024c1de9e0efe06a64b5a8561e6517daa66788169e60d2c588e15c5", size = 62135, upload-time = "2026-09-18T12:49:08.76Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/b6/22923e7d3897b4e455c507d21695894084f6cadab8cfeaf9967e37401cf2/multidict-6.9.0-cp314-cp314t-win_arm64.whl", hash = "sha256:810ae53369d957fcc3e3855612e3a35a39960adaf4b3b1cb4cb4a2e94185bcfe", size = 56193, upload-time = "2026-09-18T12:49:10.866Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/7c/db9f8299f793ab605a0a4ad6cfdc1c8523277e08780f11b4a24a4ff84186/multidict-6.9.0-cp315-cp315-android_24_x86_64.whl", hash = "sha256:b9bcbd708bb5e1ce8cf9c58908ae9777a90f777406315b046bb10cb3e87f8621", size = 60490, upload-time = "2026-09-18T12:49:12.922Z" },
+ { url = "https://files.pythonhosted.org/packages/15/16/446e15381051737dcc08683bcce29b33a0527466807931a04c12c25e3d56/multidict-6.9.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:27ed5aaee62eeff74786a3259de81ada4f2bf84b75122bc06d7d8eadc1be5643", size = 52464, upload-time = "2026-09-18T12:49:14.902Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/08/8e3e51c02dc91b700addedf959bc850b0d7fd1e350188304f8e6a4414400/multidict-6.9.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30ba80aa7ec7340e80140d29f563e33acb21f3756e42df13612f2a26c80c90ba", size = 53827, upload-time = "2026-09-18T12:49:16.855Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/17/750bce1c2ea696c5c19644a537415b930c30a463d1c558dc48d14e45bc52/multidict-6.9.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:c26e56c68bde47f8028265b3829915450c944febc75a1e4d0365b8a75557861a", size = 91821, upload-time = "2026-09-18T12:49:18.833Z" },
+ { url = "https://files.pythonhosted.org/packages/44/40/35d4bd06f49e872fa277ed2aa38eb13b61cf0f1cfce2cf9050899e3f1eae/multidict-6.9.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:f6705ae71e4b14c693877be3cc09fc62af10197ca08ee08bb57ffce6e0f9c5f4", size = 56892, upload-time = "2026-09-18T12:49:20.844Z" },
+ { url = "https://files.pythonhosted.org/packages/60/4b/be1416c1fb3e8c273155a46179f2a5055c35db524314776675278d01d425/multidict-6.9.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:1fc7b1ce735737b7abf38935928729433ef2c81306dcab7f360ef3c3076bc8e9", size = 53962, upload-time = "2026-09-18T12:49:22.863Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/cb/dfbdf4523ffeb1bca192c9b3d429ded754946922c57dfed40e6e489a3307/multidict-6.9.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b7731a591920d77bd9372a9a8ab3f447129dbf17d29b10928c94005e1606641c", size = 312140, upload-time = "2026-09-18T12:49:24.999Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/4e/636674d1dd0acbcb2216dae1f82640835b7b738331d81a13bc442194a816/multidict-6.9.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69a9295177c33756d7a6f8da0f1db345ac951f2436be6ad4b90f53056526e767", size = 310883, upload-time = "2026-09-18T12:49:27.376Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/30/f7f0aeebb9268981f9b76171adeabff078d99f7d0efa9d1da689927eb967/multidict-6.9.0-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b4ae468e341cc84c1ae035ee12f032cc0716f618b1eb417fb14e8454a17c620", size = 290430, upload-time = "2026-09-18T12:49:29.583Z" },
+ { url = "https://files.pythonhosted.org/packages/19/4a/d00b3307561bb9ef742cfb431582a25491269a538187cf387daa1362b2dc/multidict-6.9.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:eb9f52b89e339007a06c88cb95068e9d612ce252baaaa5ece85de96e2d51fca9", size = 319088, upload-time = "2026-09-18T12:49:31.836Z" },
+ { url = "https://files.pythonhosted.org/packages/19/9e/1671a2cc29841b9ae9521a35b21f6aea9ee27ae5b6ed4b75889b096f89df/multidict-6.9.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:69190050f74fe139a7b3759c730e4e87484db9cf74b1786910a24496ab7a40f9", size = 321532, upload-time = "2026-09-18T12:49:34.24Z" },
+ { url = "https://files.pythonhosted.org/packages/76/77/0f8a7b2155d38cc9d22b033bf7e0ef1d0a44947a5a4852c9810f91bbf8d4/multidict-6.9.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5f04bbfb064b87455a8012f5829b20201d608cf4b3a1a0e50c7a14173a75109", size = 315859, upload-time = "2026-09-18T12:49:36.421Z" },
+ { url = "https://files.pythonhosted.org/packages/46/92/96cdb8ea3813116736b47097078e40977c1c5a71f02c693aa18bb4f30f59/multidict-6.9.0-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d81d0ec43a73056458e844cf90239d2c3a7aeb4ef05fea8c0f64775d5111847", size = 283500, upload-time = "2026-09-18T12:49:38.871Z" },
+ { url = "https://files.pythonhosted.org/packages/30/13/1710f1847cbabc2104440e994b1f789fd2581a03445ca45f10e75e64aa76/multidict-6.9.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:b8aea3d54f3cc20a557fb951c68294d9aa88d614cf7151aa5629b1d5e4033b74", size = 301639, upload-time = "2026-09-18T12:49:41.115Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/3b/89802c789a3e90923b872d5791a523729ae9f9d3167789aef63b0e41f4de/multidict-6.9.0-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:31fd2961bd754ac3177aae9438c01becc22eae029911f13c558e5767a10e5dc2", size = 295976, upload-time = "2026-09-18T12:49:43.412Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/7b/c27827afe584ed082eca0afe0ca10f780f842da4e6894c1aee515526e44f/multidict-6.9.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:04e6f4eddeff93c778a9e7137568284f28856d960275085fcbd87cf77a53a057", size = 315167, upload-time = "2026-09-18T12:49:45.641Z" },
+ { url = "https://files.pythonhosted.org/packages/47/b9/a6fd940d4d9490f5249b378391fc7b51cb79ce962bcfe50866ce7369e76f/multidict-6.9.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:319160c73795ce31e86494773e0f12c446d32dae7d1a76f4829007ef69eb80bf", size = 311804, upload-time = "2026-09-18T12:49:47.858Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/44/14b1cdb66e35ad8f29ac7372c4ee178c0fa350cedf5280623e9ab9ff9185/multidict-6.9.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:0d7fbd38d52119423ed8c69672ca47eac121062c30c976e00ba732d114774874", size = 283329, upload-time = "2026-09-18T12:49:50.011Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/0b/6e584b53ade95ca42160716db6fcb7c660f8607bec4c884fece84f5a6fe3/multidict-6.9.0-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:981280a946256fc151584fb3b82b99db091fccac81cfecce530585db559ec62c", size = 312161, upload-time = "2026-09-18T12:49:52.303Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/e3/a2c9b107d5a08e2415372ccea189ec23a2ec399e2de48b97eaa48a298405/multidict-6.9.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:fb3d1f3c63d49656a83e1604ef3ac573016cf2e62da84d1937f47107d5689c8b", size = 313129, upload-time = "2026-09-18T12:49:54.597Z" },
+ { url = "https://files.pythonhosted.org/packages/54/86/b2e3439e7898e18aed90c81da53a7eb71e77b0b2647813fb45e8b96044e1/multidict-6.9.0-cp315-cp315-win32.whl", hash = "sha256:0c5388c41bc7c551548c4ce840349f0708f7ced6df877d82900bac82268160fc", size = 49919, upload-time = "2026-09-18T12:49:56.75Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/8b/d7069d710ff21b627054b4e33dec8ae4f0d5493858d1d4947d53bad3a7a1/multidict-6.9.0-cp315-cp315-win_amd64.whl", hash = "sha256:49e47de3823bee4896f1eedc17ce4fc4f42c433bab168ece7911f42e69a4f666", size = 55763, upload-time = "2026-09-18T12:49:58.773Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/df/8d50fc63dd34f88f614b6188e9e75d71a777151cde436952d06af962e7f8/multidict-6.9.0-cp315-cp315-win_arm64.whl", hash = "sha256:1ac339b944616d4061a9ee9571c89767543db38c19c8c7917a9c08b1462c4800", size = 52035, upload-time = "2026-09-18T12:50:00.919Z" },
+ { url = "https://files.pythonhosted.org/packages/97/30/beeb05d09787cfda7d4b926119ab211b20fa6ffa0fc1ae71d32a665744ae/multidict-6.9.0-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:cb6be563dd43b2d4d528afded1878b559ef1c2f45f89e94d273ef515485727f9", size = 104140, upload-time = "2026-09-18T12:50:03.32Z" },
+ { url = "https://files.pythonhosted.org/packages/49/73/0dfa03c23bf73f4ed09d2ec831b6049d514aa0f4d2e3d11641458eedb2ce/multidict-6.9.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:76f0df301516563085342d9cdad03fc3c0301b36c3cfa8454e49ca73878aa59c", size = 63291, upload-time = "2026-09-18T12:50:05.65Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/87/0089f0b1660f43f9efb5a132a2fe2d81dd2539a5d6c27993fb68ec89fe4f/multidict-6.9.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:34c00a534e948eb5f8b3c50cacea9daa4fc4dfd503f6edd114bb532f53742c9e", size = 60643, upload-time = "2026-09-18T12:50:07.784Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/16/0ede7577da32830a8d80df3874cc50234a725acb0cd27ee2b0abd01015e3/multidict-6.9.0-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cce5e33383904e32b58bef7765c38917899a9dc87058f75c421c82e7c11440ee", size = 262750, upload-time = "2026-09-18T12:50:10.053Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/2c/4da6b8477cb8a6cdc79ea19f1514ab3bb664635bb3c9e0ffdc6867d4f155/multidict-6.9.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c375408881861294207c1d038a711120776989c5e8c489b251a818cd74d39886", size = 277978, upload-time = "2026-09-18T12:50:12.638Z" },
+ { url = "https://files.pythonhosted.org/packages/69/f6/702e239743ce061e20dfa29e127bbfb7df7150d449e5cb410cf9cdaeb1b4/multidict-6.9.0-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3f95940278766f273b668bbd9dd412ab5dd170ff40fc836b714c38de7852f1fc", size = 264601, upload-time = "2026-09-18T12:50:14.933Z" },
+ { url = "https://files.pythonhosted.org/packages/85/1f/2f049044fe4c7944251b34776a11e1708cc5d0911f4a298de257e2765cd0/multidict-6.9.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6009b58d6994881c53f56d2f2010f0b3cd30139c7b14156c2329d00c0d592e8e", size = 285387, upload-time = "2026-09-18T12:50:17.156Z" },
+ { url = "https://files.pythonhosted.org/packages/75/3b/0fc08a1bfd7a304c54b2071600cdc1ea4b59601050f5866c5f67206e0439/multidict-6.9.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7d5ab831301decfb7c29d1c243823f6ccbb3766117c5957bdc5b9f283355d0f1", size = 288613, upload-time = "2026-09-18T12:50:19.675Z" },
+ { url = "https://files.pythonhosted.org/packages/be/4a/0369b357785000590801bc90925ff1fe0e485d0684172a2433f801f11d3e/multidict-6.9.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17b74ffc94e63843cf34b7eb874ab1653afac0eda3edfa3de1207db7fc8c0ed9", size = 276891, upload-time = "2026-09-18T12:50:22.014Z" },
+ { url = "https://files.pythonhosted.org/packages/33/bc/23aed38c0e79532b1dcce93e13c01d31e8a18cbe85503084b28550a47961/multidict-6.9.0-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:62dc471198ac2f1085f6c6ba9aa5ad3343c0cbac0756d2fbe551659d55e14212", size = 251973, upload-time = "2026-09-18T12:50:24.452Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/bc/dfc138bc987d2981cd9bcefcf67876155a2122644bc74fa87c4df2056b20/multidict-6.9.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:da97c0a501c5da00d9c3af6d481ed97dace148f9030f4f5578534981d58682bb", size = 266218, upload-time = "2026-09-18T12:50:26.849Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/c9/7ce37abc93bf7618f18f1133083b2c14383fdfa9166a1e8756ec3a84d163/multidict-6.9.0-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:986f2a23330e8823b389872ae63b83b862a10e63e8cfbd11b42ab8664d1eaa7e", size = 262464, upload-time = "2026-09-18T12:50:29.328Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/8b/a7d25bbe0fe7d7e4a1ded661063b8465270005082d4dc258488b268ad20a/multidict-6.9.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:ed96992cac94b32a9c3da5870b05967271397a813029d68197939397860b1470", size = 261499, upload-time = "2026-09-18T12:50:31.83Z" },
+ { url = "https://files.pythonhosted.org/packages/27/29/cecbae0a00c022f9f3756f02f99d7f5d2da637aea0c5ad5102fb3a65bfbe/multidict-6.9.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:94e767d30be457da0ef134e688cd2b6a438d19b85bf000b1c4a2b9b6f55b4211", size = 276001, upload-time = "2026-09-18T12:50:34.274Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/91/ef23ee6a67ff556b8fccf4aad1dcaed8921a99e63528781bf116e0f62f6d/multidict-6.9.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:d1f98df09bc22d298d88dee07eb5365dba1fbf3b41e876a6edb2652a8b3a6ca1", size = 250967, upload-time = "2026-09-18T12:50:36.693Z" },
+ { url = "https://files.pythonhosted.org/packages/01/8d/92d7b97bd55aef4b37503fa7b622857d7e579e2303a40210b7089f7e3dcf/multidict-6.9.0-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:c5290038269f7d96037afc47b05b286e4791adfa7046911e2a0483b6220c84fb", size = 276286, upload-time = "2026-09-18T12:50:39.342Z" },
+ { url = "https://files.pythonhosted.org/packages/60/04/f9a043a7b3513c29315cbf3740a2b94bd0272ea904c844ac8eff8a3d86f8/multidict-6.9.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:8858d2ddd0bc21b4aaf189016c95840b29ddf0236a049af70a9cb4379bef9abc", size = 272479, upload-time = "2026-09-18T12:50:42.008Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/25/e1ec0c14b2fd3d4f959913862c88b0dd5748ba10ddca96411b17641d8bf0/multidict-6.9.0-cp315-cp315t-win32.whl", hash = "sha256:f90724dade5865b1c9429d9b058f11096e44a7f1f0e0a21eff18d98ef32c22aa", size = 55280, upload-time = "2026-09-18T12:50:44.265Z" },
+ { url = "https://files.pythonhosted.org/packages/03/55/8b81e62363ae0721b2735bcaa111c1e08d30d4d0680b591bfd3b7305e9ab/multidict-6.9.0-cp315-cp315t-win_amd64.whl", hash = "sha256:150f1e5bcc14234e99aacc931deafa52713157df947efeecc1a3b7601f2714ab", size = 62222, upload-time = "2026-09-18T12:50:46.979Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/73/fb518ae4d302f71a1e96496bb011409d09736a91aadd3a6ceb66a7a2f259/multidict-6.9.0-cp315-cp315t-win_arm64.whl", hash = "sha256:734c985bbd60e84d0ea523bafe139394e46b8a3f35754a70111dbcbba243f7f4", size = 56365, upload-time = "2026-09-18T12:50:49.649Z" },
+ { url = "https://files.pythonhosted.org/packages/75/2a/557689d56936a83c112ee28f4c4d7698ff01c24e22d217ad8fcce19982c7/multidict-6.9.0-py3-none-any.whl", hash = "sha256:57c2445049f7d8e66306f712868219da7ff7168ef42263dc032401211bf1205c", size = 19175, upload-time = "2026-09-18T12:50:52.172Z" },
+]
+
+[[package]]
+name = "oci"
+version = "2.186.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "aiohttp" },
+ { name = "certifi" },
+ { name = "circuitbreaker" },
+ { name = "crc32c" },
+ { name = "cryptography" },
+ { name = "pyjwt" },
+ { name = "pyopenssl" },
+ { name = "python-dateutil" },
+ { name = "pytz" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/12/36/d97822d2cfc4dd842934724a45d4e4591433432d673ebf5bb7c342249508/oci-2.186.0.tar.gz", hash = "sha256:d8c75fb73bddaadcf3835b07b584f80c785686aa3c8a66ae4e4062ac63757c58", size = 18164974, upload-time = "2026-09-15T04:10:50.472Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a6/71/10d4b2f69d527224763308f4c6ac40b1911a4994d86d333bf9a21c5a81f0/oci-2.186.0-py3-none-any.whl", hash = "sha256:8c859921ccc1e12bc7bc1c7b83e727b4d9cdea70952db86743266699a1ef9afc", size = 36896533, upload-time = "2026-09-15T04:10:43.254Z" },
+]
+
+[[package]]
+name = "opentelemetry-api"
+version = "1.44.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ee/8b/aa9e2d8b8dfa7c946f7dec5d1f8f6ba8eca062f43509a06bdb5ce93d26c0/opentelemetry_api-1.44.0.tar.gz", hash = "sha256:67647e5e9566edcf421166fdf022b3537f818635daa852b289e34604dc6fb33a", size = 72406, upload-time = "2026-07-16T15:25:32.678Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ca/6f/a04e900f465ff3221ccc395522503e2d10e79fa21f2723c8e177aae1e0d1/opentelemetry_api-1.44.0-py3-none-any.whl", hash = "sha256:94b98c893a91b88657eaac1e3ba89618cdb85be6918196705354f34728b2cdef", size = 60018, upload-time = "2026-07-16T15:25:11.657Z" },
+]
+
+[[package]]
+name = "opentelemetry-instrumentation"
+version = "0.65b0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "opentelemetry-api" },
+ { name = "opentelemetry-semantic-conventions" },
+ { name = "packaging" },
+ { name = "wrapt" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/13/91/3c58961cb0360cd60509064734f0be4275383c8681d73c580a40ca83ddce/opentelemetry_instrumentation-0.65b0.tar.gz", hash = "sha256:071d9d9eced9bd6460444ec3b0c77229870ed05a881c22c84fdede58e4eed09b", size = 42689, upload-time = "2026-07-16T15:25:50.275Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/7b/85eab1215f72adf0e68d3dc4a679b9bff993fa679ff34cd8dd378e2659fd/opentelemetry_instrumentation-0.65b0-py3-none-any.whl", hash = "sha256:ea967a72b9939b5fcfdad572753b4306c59dcb99e3f382d95dae04286805e137", size = 36717, upload-time = "2026-07-16T15:24:51.424Z" },
+]
+
+[[package]]
+name = "opentelemetry-instrumentation-oci-genai"
+version = "0.62.3"
+source = { editable = "." }
+dependencies = [
+ { name = "opentelemetry-api" },
+ { name = "opentelemetry-instrumentation" },
+ { name = "opentelemetry-semantic-conventions" },
+ { name = "opentelemetry-semantic-conventions-ai" },
+]
+
+[package.optional-dependencies]
+instruments = [
+ { name = "oci" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "autopep8" },
+ { name = "pytest" },
+ { name = "pytest-sugar" },
+ { name = "ruff" },
+]
+test = [
+ { name = "oci" },
+ { name = "opentelemetry-sdk" },
+ { name = "pytest" },
+ { name = "pytest-recording" },
+ { name = "pytest-sugar" },
+ { name = "vcrpy" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "oci", marker = "extra == 'instruments'" },
+ { name = "opentelemetry-api", specifier = ">=1.38.0,<2" },
+ { name = "opentelemetry-instrumentation", specifier = ">=0.59b0" },
+ { name = "opentelemetry-semantic-conventions", specifier = ">=0.63b1" },
+ { name = "opentelemetry-semantic-conventions-ai", specifier = ">=0.5.1,<0.6.0" },
+]
+provides-extras = ["instruments"]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "autopep8", specifier = ">=2.2.0,<3" },
+ { name = "pytest", specifier = ">=8.2.2,<9" },
+ { name = "pytest-sugar", specifier = "==1.0.0" },
+ { name = "ruff", specifier = ">=0.4.0" },
+]
+test = [
+ { name = "oci", specifier = ">=2.121.1,<3" },
+ { name = "opentelemetry-sdk", specifier = ">=1.38.0,<2" },
+ { name = "pytest", specifier = ">=8.2.2,<9" },
+ { name = "pytest-recording", specifier = ">=0.13.1,<0.14.0" },
+ { name = "pytest-sugar", specifier = "==1.0.0" },
+ { name = "vcrpy", specifier = ">=8.0.0,<9" },
+]
+
+[[package]]
+name = "opentelemetry-sdk"
+version = "1.44.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "opentelemetry-api" },
+ { name = "opentelemetry-semantic-conventions" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5d/77/a6592cbc7c8d9bcc9d6757a9df45e04a7c585e3e6e7a13456da522b21109/opentelemetry_sdk-1.44.0.tar.gz", hash = "sha256:cebe7f65dc12f26ead75c6064de12fd2a9052e5060c0272d402cfa203aae123b", size = 208624, upload-time = "2026-07-16T15:25:46.078Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/23/ff077e61886ee020a17ce9c8b6fa11c601c8d8345b09ea24f605445df62a/opentelemetry_sdk-1.44.0-py3-none-any.whl", hash = "sha256:df081c4c6bcfdb1211e3e86140376792643128a25f8d72d1d27675936e7e96ad", size = 137221, upload-time = "2026-07-16T15:25:29.534Z" },
+]
+
+[[package]]
+name = "opentelemetry-semantic-conventions"
+version = "0.65b0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "opentelemetry-api" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8f/73/0cbdebcb4cf545fdd328da14f5137e37d0770c3f26185e478b0d15d94f50/opentelemetry_semantic_conventions-0.65b0.tar.gz", hash = "sha256:f9b2b81e9d5b64f11bc952075e7e9c7fb0aab075c7fd1c46d597f1b919852d60", size = 148774, upload-time = "2026-07-16T15:25:46.902Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a6/0e/49df70d9b81fb5cbae4bbf2a49d865b09bcbcbc4eb53f5851b1027738d78/opentelemetry_semantic_conventions-0.65b0-py3-none-any.whl", hash = "sha256:1cacde7b0ad306f84c5ef08c3dbe1bbaf20165bba6f8bff43b670e555a086bcb", size = 204645, upload-time = "2026-07-16T15:25:30.688Z" },
+]
+
+[[package]]
+name = "opentelemetry-semantic-conventions-ai"
+version = "0.5.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "opentelemetry-sdk" },
+ { name = "opentelemetry-semantic-conventions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/24/02/10aeacc37a38a3a8fa16ff67bec1ae3bf882539f6f9efb0f70acf802ca2d/opentelemetry_semantic_conventions_ai-0.5.1.tar.gz", hash = "sha256:153906200d8c1d2f8e09bd78dbef526916023de85ac3dab35912bfafb69ff04c", size = 26533, upload-time = "2026-03-26T14:20:38.73Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/55/22/41fb05f1dc5fda2c468e05a41814c20859016c85117b66c8a257cae814f6/opentelemetry_semantic_conventions_ai-0.5.1-py3-none-any.whl", hash = "sha256:25aeb22bd261543b4898a73824026d96770e5351209c7d07a0b1314762b1f6e4", size = 11250, upload-time = "2026-03-26T14:20:37.108Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" },
+]
+
+[[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 = "propcache"
+version = "0.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b3/9a/9fbf4e4ec0c2d7f1c32519fff782ef467859b8faa9fbc5331a96f6395d43/propcache-0.5.4.tar.gz", hash = "sha256:ff6b113f50bc066a698db5d944d2c6dc7507168dd3341e255a8892fd0715a558", size = 61545, upload-time = "2026-09-16T00:17:14.386Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/dd/997704118aea215cc5f65c277f5323657b4ba44c1f9a32fb11c8064e4997/propcache-0.5.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b77c313314524ca9c38fbd70f73515d04597ac58c40c939bc0e71eeb4abff680", size = 87225, upload-time = "2026-09-16T00:13:43.864Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/6d/ceeca1762ed51230c08d557591404f844ecef5e294550136155572f7faae/propcache-0.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f911c395cef73c510bac566da9507bb6a43e7763d0c79138dc60ee53f11207e", size = 50809, upload-time = "2026-09-16T00:13:45.33Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/9a/6be90814d8762952594a9e380161802541bff690f3a2e011dcc28ec193ce/propcache-0.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d83b12902eb8bce151259c86c03ba746600b2d994543de46e370cecf96c452f2", size = 52552, upload-time = "2026-09-16T00:13:46.48Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/d1/7fd3ffb5ca0e669a8fbf55d9fbb17c50ff5f44becfefcab27a9b9b67908f/propcache-0.5.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9281e922c072158c91974d4589f1dbe0fee6d467f284c28e463f9f5a4d933f4", size = 226804, upload-time = "2026-09-16T00:13:47.739Z" },
+ { url = "https://files.pythonhosted.org/packages/74/87/a3e199c45b26587f073db655d19c30d2144b0f883827ba6ab77acf5c7d45/propcache-0.5.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9f3551b8a35c1df3e7ea4d2d86edee15f0dde1bddd434a71744048683544d0ef", size = 234452, upload-time = "2026-09-16T00:13:48.98Z" },
+ { url = "https://files.pythonhosted.org/packages/12/7c/08c15c7df256f94a6b4563f74165c3242fb554cdd1909b661d093c31b976/propcache-0.5.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ec6a85f424afa8d23e0d9a094e5dbb6eda01da91c92b9183cd433768247ffc97", size = 240399, upload-time = "2026-09-16T00:13:50.416Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/51/5adee15e12a7e314cece4543fbf295b0fe1b504dc78b32dff4c8eb1e29b0/propcache-0.5.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f574e460d1c8a08384a016fdb09ccf3543433263ed6b2f97104f979e64ea57c2", size = 224251, upload-time = "2026-09-16T00:13:51.874Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/53/54bd510bb5d473edf66914602885226187218b4e3a5017e9dd80bceea41f/propcache-0.5.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d8e017eeb7482bed34cdb0d61cf2bcfc88d104bbab296a17cd16a6af8aabc70e", size = 202721, upload-time = "2026-09-16T00:13:53.524Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/b4/a468700d0526dfb2ca6af5d790125de5894acc7d8ecd99243ecedfa4c4cc/propcache-0.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f273dcf7149a50527c4fd1f55cfe9eac0f60753f5af544b4c9352578e20c0874", size = 219148, upload-time = "2026-09-16T00:13:55.068Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/d4/bf563e19ac9a5cc47113431337fdf2ee3573859f3f3e0a58e59833e9b75d/propcache-0.5.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:fc2461ecc45f17893f8207e73b46ea8ba93e33630e51cf4af3fbc21d47462b1a", size = 211011, upload-time = "2026-09-16T00:13:56.588Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/3d/0189b6537f4a8cd795e685a130a6f47aeda78a5b7b062574705cffc685ca/propcache-0.5.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:279655a16973f1ee2bd2fe79973137681642fd9ae0d89215bba263726eb0dc3a", size = 228148, upload-time = "2026-09-16T00:13:57.913Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/b7/59c16e245a549df202b4ebe2de91fa58a67dc4373df9840e372a64224dee/propcache-0.5.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e9f165403b81fea7e89c932d89046a1e3d9a3a60e8d7ef2f249dccdcb0982bf5", size = 201432, upload-time = "2026-09-16T00:13:59.453Z" },
+ { url = "https://files.pythonhosted.org/packages/41/0b/7b19eb20bb0b1f9476d08f6e387ae094dc6870fc06d459ea1f35f28b25d3/propcache-0.5.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1783582065a1f07f9d9ee1e992e13f15d7dc8fb1eb3a7476d43eb3f2e69d26bb", size = 228923, upload-time = "2026-09-16T00:14:00.731Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/f9/b1a0bd47218216b935d019912d6fec1676ae7c07f15fa82bfb54b8d58976/propcache-0.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d605bb239b796e82a81c6709548b2bd460ab73b4590cb0c83de8a2dd9694d0f", size = 218327, upload-time = "2026-09-16T00:14:02.091Z" },
+ { url = "https://files.pythonhosted.org/packages/55/c0/51e5d1ad504e9529831606534c48e272db751072eee9ff07e4abe37e50bd/propcache-0.5.4-cp310-cp310-win32.whl", hash = "sha256:141fdbd73748db0cf7636035030aaac383d2efde8f34e7bc24594cc776d225b8", size = 43096, upload-time = "2026-09-16T00:14:03.427Z" },
+ { url = "https://files.pythonhosted.org/packages/80/57/0a0b4b1122f4ed5bcd1c626d910003cdf5282c2a12f8a1cfa17970b3ded2/propcache-0.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:146f48a9e4812611a7581003b1a39de56c34967046310c4171a68ef908c9a745", size = 46589, upload-time = "2026-09-16T00:14:04.581Z" },
+ { url = "https://files.pythonhosted.org/packages/66/87/e71b24adc8ece61782ba3d6f3879e6a07fdb85bce21a9c529524184e3ec6/propcache-0.5.4-cp310-cp310-win_arm64.whl", hash = "sha256:6c7599df2b57ebeea8de011b5f2f7b85de95e76037d43d34b95e328430275487", size = 43982, upload-time = "2026-09-16T00:14:05.728Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/40/14b21e505b7921617466576423f188a5c9caddfdaa1cf4b2b8a83d8fe216/propcache-0.5.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:897d1ddf6716e8f47200f7aad9a0efa6cc7586df66c6defa572f9eab379c078e", size = 86393, upload-time = "2026-09-16T00:14:06.9Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/4b/5a52e1a7b43563f7d408814194bb23cc8bf214eb6b86639b667a33a8d0d0/propcache-0.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9cbfff4423eef4cc6cafc021469641a2b835f610b2647a6c5281903e21b8670d", size = 50431, upload-time = "2026-09-16T00:14:08.025Z" },
+ { url = "https://files.pythonhosted.org/packages/05/cf/b5248180bf056cc76acc60c9c6e8c0ebbfdbd1c6cffd31fd14996927b7c8/propcache-0.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fc24f209c1b7f7f688b66b98293954f5504279760999b58920ee12dd8471c1d", size = 52116, upload-time = "2026-09-16T00:14:09.114Z" },
+ { url = "https://files.pythonhosted.org/packages/86/a8/7c6cd6bfead1a11f2e411e688640e6d26574cb0bde7dcaa7423b0b65ed7a/propcache-0.5.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:62530ca89187827e4a4fe733f971abe81a7542eeea48ff61995f19b64d7199c8", size = 238729, upload-time = "2026-09-16T00:14:10.357Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/b4/442715b2e980df51be52d203549279e027728f24c80b00b5e525e31cd5ea/propcache-0.5.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fc3f7599528db40b1efa0889a620116e2704144495273d66066e8164e45838", size = 246121, upload-time = "2026-09-16T00:14:11.735Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/5d/df0684fc2b1732a01a7bec26d7897369022712422d25b09c37ce7dbc88a2/propcache-0.5.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4f2d880ff60f45898f4acfa152aac8d04e3ee627d90ff4003491bf92239d5757", size = 251735, upload-time = "2026-09-16T00:14:13.053Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/06/519a5ebb48b6f94beb48396e55c905f12246a25c3a3608a7ec7bceabf50e/propcache-0.5.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e9368e87a3efc285e559131092c5db643eb8e56de4ee42064d5baec22ef2bb5", size = 235381, upload-time = "2026-09-16T00:14:14.398Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/07/1e0a9bb310830f2245edbd5cd3c6d24a783c053c4efd8e08e386e513c940/propcache-0.5.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:004e685b315646c410771836e72a44f143bbe624f29653a42687815069a303d5", size = 208973, upload-time = "2026-09-16T00:14:15.715Z" },
+ { url = "https://files.pythonhosted.org/packages/62/5c/9324fab27d6088eecc47fe4332bf7aaf8c1ded93c36f558391e8a06d41a7/propcache-0.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:594eb4c6ec35e7179b058481f4e9f02521b56de16fa577c4b85c76fb1bf8a9f8", size = 233897, upload-time = "2026-09-16T00:14:17.25Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/a3/570d92fc952eae93b676f3a1568f4b89264102abd3c982ab6a9ebec58dcf/propcache-0.5.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2dba2f02d2d5c09ef8a0e6c1a42aeaa451f4be9898cb00b04fe98717da2eb23b", size = 223512, upload-time = "2026-09-16T00:14:18.87Z" },
+ { url = "https://files.pythonhosted.org/packages/65/47/26810d889d89bba31db397e6a88f8984af775f5ed6bad0a29dce84324cff/propcache-0.5.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c3ef2818d63bc86071e9d2989ae75a1bc32b8f7059cfd9f5abbbee70c32e2ed6", size = 239043, upload-time = "2026-09-16T00:14:20.366Z" },
+ { url = "https://files.pythonhosted.org/packages/89/2d/f9c47691aa024c8299a3afacd78d22a01ab57eb627b481b6089708e71017/propcache-0.5.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:dd2ac8f5b643454c2cc6b6118b13da16e88f4a6434fc3ba61aca384029f04f36", size = 208218, upload-time = "2026-09-16T00:14:21.801Z" },
+ { url = "https://files.pythonhosted.org/packages/74/6b/d510c0c378cabbf9d0ac7b663af6d00f2e9074073d93b20c85f24aa5c071/propcache-0.5.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4054acf80d40456a0537f2913b349718649d8d6458a14ab7f48d0ce28c30869d", size = 240301, upload-time = "2026-09-16T00:14:23.121Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/80/c80f6adaaa1e51f0db2dce8c9b3714d94ec45e358a21f9a1910b10b40a80/propcache-0.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40e94adb1e7d39ff28a8bd8d8b8fbd1df6b9f40976dbe379134f1ce058e532dd", size = 230785, upload-time = "2026-09-16T00:14:24.458Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/e2/c32a7df3f39caa7f11b2eb37ea5b6960a6946f2bc7c4b8ff97bbdf6d6b6e/propcache-0.5.4-cp311-cp311-win32.whl", hash = "sha256:9f86f7259efe2c951f43e57d471c9b41daa5bfc7db9f67189059cf1ae6d77fd9", size = 42747, upload-time = "2026-09-16T00:14:25.715Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/8a/3db6a3543d8101263b4c52978b6276a04ead2caff2c5ab880d934f47bd89/propcache-0.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:e904d4d01f36bd6e197590be1533c44e06058771e0746dd073a8ebb3ef880858", size = 46268, upload-time = "2026-09-16T00:14:26.996Z" },
+ { url = "https://files.pythonhosted.org/packages/41/07/5222e2665bbf6e45847492ecbf3b9f3e4975a0ae300e5fd465df7d48ce55/propcache-0.5.4-cp311-cp311-win_arm64.whl", hash = "sha256:d42a9a856a4a6e2f6c10f1318c07e7daa498d6593abe745c71dae4521a26ca39", size = 43547, upload-time = "2026-09-16T00:14:28.143Z" },
+ { url = "https://files.pythonhosted.org/packages/71/cd/348d58f142aebc4873345c6b31087629182ca6e0f2b3caeaa528cf882eba/propcache-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b28f41fa3b8c6900457f858ec5b03998f3a6d535fbc1bb2edec5961ea05ec429", size = 87285, upload-time = "2026-09-16T00:14:29.362Z" },
+ { url = "https://files.pythonhosted.org/packages/df/f4/f3ffaee281b276da854ac1d7a6a506d26cbc62ea2e623756f1d0a4a1ba1a/propcache-0.5.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dcbf346a318a5e30063f547630b02bb787ce2f45b6368d5da143660b6a3835d8", size = 50984, upload-time = "2026-09-16T00:14:30.473Z" },
+ { url = "https://files.pythonhosted.org/packages/25/88/1d7df7201750b37765ef2b23bc1c526c028dadde80afa0f57a118fc01182/propcache-0.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87a3caecf8095e48dc72f84bfa42e23a848cf410cc9cc13031fba4869b706a21", size = 52460, upload-time = "2026-09-16T00:14:31.692Z" },
+ { url = "https://files.pythonhosted.org/packages/83/4f/48865bd02a16ee5236bc46166b2946f37b93e07b0eae355dac0be0b216ca/propcache-0.5.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60a64cbccaa11b7760ce705a14ada17ba459e7ca9f23ba587eb013821032d7ef", size = 251768, upload-time = "2026-09-16T00:14:32.908Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/19/3742a5eed62317b03b4002ee865dc9fd720308bdd0da1f29a5786c630311/propcache-0.5.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a74bfa37147cc08fb29df10bd9c16f40fa7f860cd3a6d2fff853323a94f6e17f", size = 257723, upload-time = "2026-09-16T00:14:34.267Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/d5/ee6350fb0be9122bb6c67082a876d34b90d980d100c106af4b81023e04f4/propcache-0.5.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a4d7a54719b67338a305dca2ce6aafe366817df94ddfd4b5514374356f5ca546", size = 265597, upload-time = "2026-09-16T00:14:35.56Z" },
+ { url = "https://files.pythonhosted.org/packages/85/9f/83a07b6ec0e043c050cfdd35fb0cf1b7897b91d554d6eea293740309afe7/propcache-0.5.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2814ecd8e818f487bee4b0f921bc4d1c176cc5fc71ac0f072d0fa67eda4ac14b", size = 250424, upload-time = "2026-09-16T00:14:36.894Z" },
+ { url = "https://files.pythonhosted.org/packages/33/2c/a763a8251f50fba042af0fb1f02bfec4b31381e40aff760db2be7b2e1f84/propcache-0.5.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6af4693716bfb03f1752ef1b30faa593db2c01d5272e9b8564a1549452a979ab", size = 216748, upload-time = "2026-09-16T00:14:38.369Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/e2/4d11bea8fd6a777149c6c20645f873952eab5de3a2497aa11648ec9ab6ab/propcache-0.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4fbc1a15dc8cd1689508758d626b372b1f09d28d9577667feaf9e6bfcd8efcbc", size = 246533, upload-time = "2026-09-16T00:14:39.82Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/36/6683597de4907e70c717e3588c541202c66086a72ff3db58be49de66e72c/propcache-0.5.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cdee8205a44d0be91bbac4c41b95d86641b72dfc7aef1279400e4fda3f26a937", size = 238173, upload-time = "2026-09-16T00:14:41.259Z" },
+ { url = "https://files.pythonhosted.org/packages/85/84/cb08d79f1762daafeb2b030c470cd0c725c97b8ad67412457c6f35c53e9d/propcache-0.5.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9a2a8a50a93dee0268a860a07fa3b4bd968f8ce4dbd794957da772f395368526", size = 251128, upload-time = "2026-09-16T00:14:42.652Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/0d/41b848036db6621370c1f2e5471a7da8149c730f8552a5257567721f4576/propcache-0.5.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7ffafcbfc7b549ab940047e505c831eabac5e67de53e1bc174adbc5285c55944", size = 214821, upload-time = "2026-09-16T00:14:44.112Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/b7/adfae4bf9c63bccf12e2d9690a175c6579047a6eec3b5a6a5f51428c15e2/propcache-0.5.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d1f5a500bfcbb2c0ab85e98a0dcd70f5899d34efe365a0187700369a79603031", size = 254793, upload-time = "2026-09-16T00:14:45.429Z" },
+ { url = "https://files.pythonhosted.org/packages/51/6f/eeca9647245d5f92e87d53e5f14335bb42fce1a7e6842c8045b364eded8b/propcache-0.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a235f73d6e020855dc29dff012d920c02ee0feab8d73a24185a7569f4be1161", size = 247134, upload-time = "2026-09-16T00:14:46.976Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/a9/424e38838793d37160b4379c702f61c74c598fc6cd17204adbe3c554f7a8/propcache-0.5.4-cp312-cp312-win32.whl", hash = "sha256:b3083bfe87f95c756e610bd8025f26cbd1cd4aaa03a422f2d65efb7a97cd53d8", size = 43073, upload-time = "2026-09-16T00:14:48.338Z" },
+ { url = "https://files.pythonhosted.org/packages/58/7b/6e8ef26f6d510a7916064fec68d55fcbfbdf7eb01e377480d66a122152d8/propcache-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:98914de2c4d7f0f9f4a8c6ea4bf05841f4175796941e3ef7d47eb718f22311fb", size = 46190, upload-time = "2026-09-16T00:14:49.99Z" },
+ { url = "https://files.pythonhosted.org/packages/08/b9/72028c5b56ced97f456de6aefa79435ca64d7f77af78ea8cf3c76fc5195f/propcache-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:8876b39961e33d912afe3c1bee18ee564fdad0206f873cc15d522756b7f50737", size = 43075, upload-time = "2026-09-16T00:14:51.155Z" },
+ { url = "https://files.pythonhosted.org/packages/78/4c/3b1365d58a667689e067e13d055fcd92bdf8d9a2fca3d9201b47ed5b3631/propcache-0.5.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:36c0d9db44b523ef93d03341b1c42d69ff01d673c053d1b1c6c3a363bcaa39ba", size = 85290, upload-time = "2026-09-16T00:14:52.342Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/61/5f9c29c3aa67c30238c4eadf95149b1d983a48f69b86b0cff927a7d6df13/propcache-0.5.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1d52a05dc417279f7e5c7618c5dfbbc29923aaf9bc0a5c1802ddcebf54c61a0", size = 50027, upload-time = "2026-09-16T00:14:53.67Z" },
+ { url = "https://files.pythonhosted.org/packages/25/7d/c1ab1ef09e9d4d835be5d58c0a32a1e1de8397abaa4e502a9d4141328cad/propcache-0.5.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44149f46500a0a41b95b4d99c2e586a77319539730607b9892974a092788b111", size = 51425, upload-time = "2026-09-16T00:14:54.826Z" },
+ { url = "https://files.pythonhosted.org/packages/73/36/0093091ebb270fcd1bc1f6e095f93b2e0ed7f1011c28837dc2dbe5f96b99/propcache-0.5.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbab5f5ff6897c81f355d079010cdae85b02e5a0b518b5251523b8ad8ae9ac3c", size = 233595, upload-time = "2026-09-16T00:14:56.09Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/8f/0de9d4c8e05ce0be71b436919a216bd7fc5cc6e2691c0602295efb22b9ed/propcache-0.5.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3e98c55bde2bcf7db3c70d1aed7ae9aa8aebbf19a250c66645cde44cdb8b867", size = 240318, upload-time = "2026-09-16T00:14:57.674Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/71/2b35e91455209b85ee98f7859583e0814fab57d3af0f2381aaee34c37304/propcache-0.5.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db3ae52ccc150dbc84704e9d642743897f3e1c54742ff34cacb661e52e3818a9", size = 246649, upload-time = "2026-09-16T00:14:59.352Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/74/08e6c1faf26ee2732023a3828787ba535557122774f4a386b1f715cbd8e0/propcache-0.5.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f85915e00dcb1cd9f2f890ead064ed40a27df06f0db65be427b29482ae357572", size = 234316, upload-time = "2026-09-16T00:15:00.696Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/9a/08385733c9321c9bb78039d3ff31045e4fca962d9665023c4eb70f998819/propcache-0.5.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c2ba30a89035b57b73e00475de948521602f543d79ce01db10b04b36c4c76fc8", size = 204666, upload-time = "2026-09-16T00:15:02.019Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/f4/e87bc7629af9a14a752b218764a78742d73c2c563ac58315da6841f0cbe4/propcache-0.5.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ae58f361bd5dae942717c65d3413b478c70aea9c462599e7b9adad3731db3894", size = 225900, upload-time = "2026-09-16T00:15:03.394Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/6d/11014938d3fe9bea2ea2dcf930f26ed565bfb2f5be3c756362ea48c92636/propcache-0.5.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:96f7c5c15656040ddcbc51e56dc59b58aa25999d743c126abd425b9766ab43e9", size = 219988, upload-time = "2026-09-16T00:15:04.811Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/72/fbf17c589f92c0b3bbf6709a425661f8ef2ed0d46b38985a7d7b5a0f6b91/propcache-0.5.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7cc528e760a8af06f2b13e9b9f362cd90c7c718ea61228a96dbd31ba16ed7f47", size = 233611, upload-time = "2026-09-16T00:15:06.498Z" },
+ { url = "https://files.pythonhosted.org/packages/55/7e/dbd637572a279692e5518d117274a9331bf5faac59f191d30e82521a3ec7/propcache-0.5.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:425f8cc86ab5018b4b8d4a23bc8e74d964bd3d757c3702e301aa79be76c53f6c", size = 204333, upload-time = "2026-09-16T00:15:07.961Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/5a/f99c92068f1e0f5c886899ce0e4a619db376ca98c5279d93f95bd86906af/propcache-0.5.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a5793c7698a53f56f4a1889a4737c7eeb1b7ad0842fa6b1abca22913ff79c8c1", size = 235177, upload-time = "2026-09-16T00:15:09.334Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/28/95456fabd2daf6be89049a13fbf03341756014d2959c83d12957d4c49694/propcache-0.5.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c02c0e570c5c7e077b0181a9f3cdb7d4c3617d1cda6b5c95bd5d34022923d82c", size = 228982, upload-time = "2026-09-16T00:15:10.729Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/bb/df90f62c9cf7c93ea235f6f9405143bba802914607317266dd81fc8d737e/propcache-0.5.4-cp313-cp313-win32.whl", hash = "sha256:3e413d7a4a9b4866b7a761d6060d434b64d23cd35122eda3b026a0bbe8196b25", size = 42611, upload-time = "2026-09-16T00:15:12.111Z" },
+ { url = "https://files.pythonhosted.org/packages/01/bc/e0a7b84af04ec02d73a48aa71f091e1e4a2107e3074b7ce12195b66901f4/propcache-0.5.4-cp313-cp313-win_amd64.whl", hash = "sha256:0c889f6fa84957bc7e8b4eab71fd16a0455068d5045e3aa40c733071d2b2fd77", size = 45342, upload-time = "2026-09-16T00:15:13.519Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/70/50b031cafe72a5c1878b903ee87303f71313345566bf3d6ec202e5ddc9ec/propcache-0.5.4-cp313-cp313-win_arm64.whl", hash = "sha256:69fc35c0779522da366c563e5faf203ffc1f8ff0021d5b1337fa4efa5be73177", size = 42408, upload-time = "2026-09-16T00:15:14.788Z" },
+ { url = "https://files.pythonhosted.org/packages/33/c9/07e227b930c8ae513b8ef1aae3793499be097bffcdf7aee4fb8b33db4cd1/propcache-0.5.4-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:e6720ba44ad7e72174314d0e1fb0172494cff5c73a3a8a2159c3d2402ff15565", size = 85933, upload-time = "2026-09-16T00:15:16.073Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/e1/6710bb44510c4e4a8e0f004bbaf3cecfd048141309c77bae56d4e5a6ebc1/propcache-0.5.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:4cfe0a92ae30151869e67a4b5f5e105e4e03ad30b3f38e5211b5bf77d0881993", size = 50179, upload-time = "2026-09-16T00:15:17.377Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/22/b533b493d7025456f44518b33e53e000021a20fe7c27b88cf3d341df7186/propcache-0.5.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d759d05634f1b038fb625a66662a8c85e5a8fec912da381b5149ddac107482b", size = 51942, upload-time = "2026-09-16T00:15:18.589Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/74/70ac8430e28f21e442c7bcb964eb46c4363f6881ade4aa0e978bfd8d503a/propcache-0.5.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:251c63dd46a0659bb875cb254dc4c1e79ee91a847c737cd62373295afc2235dc", size = 232647, upload-time = "2026-09-16T00:15:19.905Z" },
+ { url = "https://files.pythonhosted.org/packages/72/95/f222f13b6fe623310be0eb61a673bf26df439ce27e563ca8e422d0818777/propcache-0.5.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7a8d5ff04eb1f85698a78d20c62a14676e7b960dcafde09a388d60ad377d355d", size = 241541, upload-time = "2026-09-16T00:15:21.3Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/3e/763e370340db16115c5e63ad46e21ef0770a7f06928b3d3b62d8f8edfca4/propcache-0.5.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b9100a93b372418d8688f3f2a3e5b45c64d70ca4d6176e121aca1e3bfc1e32f", size = 245332, upload-time = "2026-09-16T00:15:22.802Z" },
+ { url = "https://files.pythonhosted.org/packages/96/d3/e97cd6f5de2176bd90ed4076c7a9b5e09d0f0b9687d00a576507988bb62c/propcache-0.5.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc07876cfb079b6f6f36d21ce75784ad6c2c6b563eeac0ed26c2fa2669b85df9", size = 232757, upload-time = "2026-09-16T00:15:24.374Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/4c/6766e5f60bcda26d244333aa71d0a702c1c9b21b251d543c7af5953d1eee/propcache-0.5.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0951315a6b3142ee2167404d707743f0157c110091342b1aa0accac5cf0e4acf", size = 204389, upload-time = "2026-09-16T00:15:25.667Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/5e/ec4bb09a70b26ea99d76a8292c3383b960b296de2b347ac9986678f1761c/propcache-0.5.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bee7d3aed13d56f54e681df38c3a23031bc9e3863f687d9d598825c9146acd7d", size = 228217, upload-time = "2026-09-16T00:15:27.11Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/7d/b53922ba7d9e5bf797324e63aa05906ec240871899f779628df068743e2d/propcache-0.5.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4e985382be6d15da8d0c2710a6fa7b9070fc9ecdeefb7f580e88373984ec8be3", size = 216947, upload-time = "2026-09-16T00:15:28.532Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/39/b62eee45e5ea4de094a258cbb3b01c1e856ca51ddfd95b43135c5effd1eb/propcache-0.5.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9e9ab13760aa8b6d0881ae7cb04fd891d8d490cd2554ea8e79bb278399169bcc", size = 233457, upload-time = "2026-09-16T00:15:29.977Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/a9/feec61ed296d993db9dd097e0f6723e3f576a647722367547495e4c5b05c/propcache-0.5.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:1b2f3bec4261a94019575481c726c29850f72e27907773c75b1de421e20e9f9d", size = 204131, upload-time = "2026-09-16T00:15:31.74Z" },
+ { url = "https://files.pythonhosted.org/packages/92/4d/411ef380cddad28dc001f1c6d75ec72c76cd3817030f68ec1ccfba0ec6c1/propcache-0.5.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:720cf832eb2d0b0dfee129cb3335a26f6ce3cc45ee1187e8f0731758caa16792", size = 234820, upload-time = "2026-09-16T00:15:33.087Z" },
+ { url = "https://files.pythonhosted.org/packages/15/37/c988229753629ef1cfd5198337a83e624780ea2b3787efe9e747c05aad2d/propcache-0.5.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fb0a5be8d9aa213150e8d8148a42aca4984b285bcad1e69587dc4298edd929b", size = 228350, upload-time = "2026-09-16T00:15:34.533Z" },
+ { url = "https://files.pythonhosted.org/packages/12/49/5ef1c5cf98591da3c5b952b39e6a298084cc1ce353bc70f85e82397a5036/propcache-0.5.4-cp314-cp314-win32.whl", hash = "sha256:30cc1cebaf9aef49db06357a50398323ae04d70460c0491837d026ab7d6452ea", size = 43578, upload-time = "2026-09-16T00:15:35.957Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/9e/a0ac821a2229186af5e2e3c3635a78abb23cfddca57f38513ab5d70420f3/propcache-0.5.4-cp314-cp314-win_amd64.whl", hash = "sha256:0a095db8e15a6020db149ecbed6461939fe74f6acaa3ae8b702a1fe8c38cd983", size = 46304, upload-time = "2026-09-16T00:15:37.655Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/19/c8d0d36a9d16cba5dcee67d389c9333b988c8986a653a61c00a451817a46/propcache-0.5.4-cp314-cp314-win_arm64.whl", hash = "sha256:45488d1a5f9ab5bd90aaa1ca20f50fe1922b8ffad71a2009d2adf41355897aac", size = 43440, upload-time = "2026-09-16T00:15:39.091Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/e9/42f1da77cacfc184e6ec929557ef653b7961bbf6f1da460b9221273948b3/propcache-0.5.4-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:53eaa697c4d0422ff4cb714d00231b43352064d97b944033b30c1d57cc506ec0", size = 90672, upload-time = "2026-09-16T00:15:40.306Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/2f/4b79940908c6ab8c795097c102999d7bc1f7e0b8604dfd1c232f9d99d67a/propcache-0.5.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:886b59c4d28ca97dd23b025fdfc50a0356be934efbbbca89ad26230067f86fe5", size = 52586, upload-time = "2026-09-16T00:15:41.575Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/07/02196ae6320c110235bb343f90dbd34be41f8b8964a3ee30db84ec12579e/propcache-0.5.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fa15757fea1dfcd5b7745cad9f4638929605531bd4018ab2adff7955f1a403d", size = 54335, upload-time = "2026-09-16T00:15:43.027Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/44/f48b9a131985659924df5fa5093f68fe72c7ee375329802989ba3126efc6/propcache-0.5.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6f0093ac3e9daada202c2082439d414a625c57184727a46e112a3fb2a81cb788", size = 297567, upload-time = "2026-09-16T00:15:44.373Z" },
+ { url = "https://files.pythonhosted.org/packages/04/a1/418d956d2735139f77fc35262179f1f52c23aa666de5a8ab3819c1ae7854/propcache-0.5.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3cd3a7edb6b95b9b33998135ebfa18d709da82290fb8f27c858970b5a12c8b56", size = 297477, upload-time = "2026-09-16T00:15:46.048Z" },
+ { url = "https://files.pythonhosted.org/packages/69/fd/ff811fdb6d3d3e67fd9bbfb75881675d34a42d0ef29a45d33e3e233dde07/propcache-0.5.4-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c174bfd1c48a1b51a3078e95586dde718374bac79719ab3541ec9e74aec40574", size = 302669, upload-time = "2026-09-16T00:15:47.458Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/57/527910c455b5ec62f6871bef45d4f79fea16cb8c966ba0d4a07f0339ddc4/propcache-0.5.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a219f0ac59817a9114dd2aa57c13180f993e819ba658c7ddab4b66ed1ee0d370", size = 287908, upload-time = "2026-09-16T00:15:48.99Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/86/f69ab82707534a0cb2057bdca04f9200a71214c7551800f9d34d6ac39e4f/propcache-0.5.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:17a7400cec0256f0a71ae71f9da398f9894c956ff6668a1c9d317b3367316320", size = 249804, upload-time = "2026-09-16T00:15:50.486Z" },
+ { url = "https://files.pythonhosted.org/packages/27/19/60677af50d93be4256213de7cd487f056944c048b9c0b6f2e45b3a30f666/propcache-0.5.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:978f28401afbc76cdc3df9e1717b4229a06b626a1dcc75db4e1f2beb3884c3e9", size = 282344, upload-time = "2026-09-16T00:15:52.029Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/f7/a0057808a91fb3b6a5f3602b528f0cdcb3d53e0ff8315d73fabdfdf8fec4/propcache-0.5.4-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:4a1f4f5ffa55dce6307631f3cb2948e117e665966ea512e0d502b16c24f567e7", size = 270167, upload-time = "2026-09-16T00:15:53.466Z" },
+ { url = "https://files.pythonhosted.org/packages/83/c8/f4a865490df0dc0c8531d4e59ac411cb6dc24bb255d2396a6f1c60a368f4/propcache-0.5.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:213bb68d9ced5cf2bf717b1071bf2b09b4b04c426256f9fe6d054c60318424c4", size = 286551, upload-time = "2026-09-16T00:15:54.995Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/67/b4faebde9da4e8173d0e5a30e8cd31335914af7ef350b988f27fec588cfd/propcache-0.5.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:286867fb156488c251a3721766e380ac4495e4fd6b51aaa1403d89ce7f4359d9", size = 249595, upload-time = "2026-09-16T00:15:56.505Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/40/52e1dd5636e9f5a27f6b5a4b4e2f33c322fd72afe956c397d82523ec4a80/propcache-0.5.4-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:445ee3bfb46e85838387fb3c536a73cc0b994dc192b004e40e170adc54aa2a7e", size = 286700, upload-time = "2026-09-16T00:15:57.985Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/0e/30b2b324b93ff31a0bab539c102aae59e84e444031b2742150a7646aa1bb/propcache-0.5.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:48cb48c5346a97de792254af77715aa2529c2a1ebc5f586aa0aae44a02f1fe57", size = 280500, upload-time = "2026-09-16T00:15:59.487Z" },
+ { url = "https://files.pythonhosted.org/packages/64/36/721bb59f682ff060d0c8df64274fca8cd0521b1a54506c2eedaef795b7f5/propcache-0.5.4-cp314-cp314t-win32.whl", hash = "sha256:03b229037d25b801e7af53fd52b9fc49d9439b036fca1e087e02780631adfa97", size = 46121, upload-time = "2026-09-16T00:16:01.349Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/86/0b1b80fa1ac3a0aac44e2922a6964fbe9cd52af5eab8fa933bf9e90b030c/propcache-0.5.4-cp314-cp314t-win_amd64.whl", hash = "sha256:8a1fc236528c457cd739c88abe823da851b7ab645d72792f88658114cc340c12", size = 49154, upload-time = "2026-09-16T00:16:02.901Z" },
+ { url = "https://files.pythonhosted.org/packages/69/4f/9fe6f05a47cb550c823155052116f710064b6be5c6e8ec4e9faae7e18115/propcache-0.5.4-cp314-cp314t-win_arm64.whl", hash = "sha256:135036c5cfc93864affb0f9af9a27e5d7a71cb7bd745e7b6dbfc2d56cc30e827", size = 46005, upload-time = "2026-09-16T00:16:04.266Z" },
+ { url = "https://files.pythonhosted.org/packages/58/25/895a11d1e4c5c2acc6d816e2bece34e02d9dc92f2182ae276cd819e9e804/propcache-0.5.4-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:45bf2e730ab8905d0527fe05a86500f406e64305c34cc81ebe64b4617cab9760", size = 85634, upload-time = "2026-09-16T00:16:05.599Z" },
+ { url = "https://files.pythonhosted.org/packages/58/41/c0acd69271de7a1cf439e77d5d60c18575fd09bad56e798b95fa23458ea4/propcache-0.5.4-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:31eb43ba2edc704ab2ec27815315dd8a19def0fb16215be4cfe8d32fe78ffd51", size = 50084, upload-time = "2026-09-16T00:16:07.384Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/1a/ad561f99f90884089e6403b76c220610809429ba868a81a2e7ce115d32e0/propcache-0.5.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:174507f82d3594622acb1dd2dafecf2d899d6d506335494e7107767bf05f3aae", size = 51692, upload-time = "2026-09-16T00:16:08.956Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/07/057bdd3a9609ffad59b06239cceee784b047f6c720247bfaa36d2103e138/propcache-0.5.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e337653721d20ead710da33bf44487fbe8a0db8782714b60306481e9f95b51", size = 232947, upload-time = "2026-09-16T00:16:10.466Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/dd/d36ad35986718530498a65e45e3713f9f0e6a580f192ef02d2ef7cae9b52/propcache-0.5.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d21d0d2c82bbfeb1677a9711f38df968f9837576102bb4add1bd449d28d88f1", size = 241250, upload-time = "2026-09-16T00:16:12.056Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/81/f1459415cdb6c10d46942779de39bb59a77b38e5a76bb1def9227962eb45/propcache-0.5.4-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccf4f7a79e26bb7efb06ecd50c177833b71df05cbc748701372325e6bcc17f6f", size = 245150, upload-time = "2026-09-16T00:16:13.596Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/4e/58b9b1460afc97a4c0b17ee89af701c4011d4d7f46470eba3aaff76a8069/propcache-0.5.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23278f808cd81d5ada7184a76606b925fb3389c60e1077b2cd7da7b1fcf0553c", size = 232166, upload-time = "2026-09-16T00:16:15.126Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/c6/5a79e0eda3e7b6987d03d8c622ff6d52a42165a12e8418eb37694b9cc4b4/propcache-0.5.4-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e738ab81179510ce79b2eac9a6ecf47feffd9e76d1c72e403005dddb6e36c06c", size = 206085, upload-time = "2026-09-16T00:16:16.713Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/72/940aed42c73f9da345ca2de0f6e835c726498159abca5f1ef14fb0a2af8a/propcache-0.5.4-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:a419ee85e654927baabda3929c03c0cc1112bf472ff0dfd6142f4e3a81ca4162", size = 228460, upload-time = "2026-09-16T00:16:18.352Z" },
+ { url = "https://files.pythonhosted.org/packages/85/71/3f54e1535c8f323d91ba566044d7c2b39ff6f6a2f1d0bd9071779d07b9b3/propcache-0.5.4-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:b61805357d966680acf68b3b6d49772631ed9df44ebece10ff1460e117a7da8a", size = 218350, upload-time = "2026-09-16T00:16:20.064Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/f4/025890cc389ac3ec485ecec607d4a7ca47e15bfa2a465746ab98af602536/propcache-0.5.4-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:58134228927cee6c047d626c08e60a81be604a20578a12ce752cc5c9a84d4826", size = 233156, upload-time = "2026-09-16T00:16:21.624Z" },
+ { url = "https://files.pythonhosted.org/packages/04/29/b39cae08c87c140d3d274f0a2c058cb5588e836175c3309e260b230ab07d/propcache-0.5.4-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:350b272b2279f4135a64fc0c304a5d08e28a137c9573442c606152446638a831", size = 206206, upload-time = "2026-09-16T00:16:23.204Z" },
+ { url = "https://files.pythonhosted.org/packages/18/61/e16462ef18a87247dc9ebbd5c606f46d5ce67e708bd9cc734dd0d9222564/propcache-0.5.4-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:45bebbe252550fec975ba3b62bc6f931643cfd3b5464ef47619cf3fef154e01c", size = 234469, upload-time = "2026-09-16T00:16:24.841Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/84/b6a1490922427204fc47df920ed002eec709621de6b79b11592bf45c623a/propcache-0.5.4-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:ada748108a43d29b7c328ba7db3755327cd94f028bcc1a7ee3f0addcfacd9c38", size = 227311, upload-time = "2026-09-16T00:16:26.549Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/5c/5a59527582e9bcb694b2f08b9894134b65a0f5f79dbff174f054f5f74ed0/propcache-0.5.4-cp315-cp315-win32.whl", hash = "sha256:ee19113bce2f3acd46432050688b70f61acd6857d75abb9ec96341b7e9ced123", size = 43512, upload-time = "2026-09-16T00:16:28.313Z" },
+ { url = "https://files.pythonhosted.org/packages/26/07/93cf699ed363681e754d7c3fad587fb09ef6b65618ee193332ad16a68d7b/propcache-0.5.4-cp315-cp315-win_amd64.whl", hash = "sha256:ceb3e879afac028f93d272c957814695dc5569e4904262dbee92f6c41bd5e4a3", size = 46264, upload-time = "2026-09-16T00:16:29.751Z" },
+ { url = "https://files.pythonhosted.org/packages/65/10/fef04fbdcd44a4a163cb5ff5674599c6d6fdefd64a5a459438f9ad2ba042/propcache-0.5.4-cp315-cp315-win_arm64.whl", hash = "sha256:c83acbce9f2b5e3f5f5eda9e53d2001fed22fcdfef81274a9e02d8fd53b70a30", size = 43395, upload-time = "2026-09-16T00:16:31.5Z" },
+ { url = "https://files.pythonhosted.org/packages/70/f6/7e2f4dab0b92ab46111bd48cee9ee1e5f519514c44e3779ede5358d7ada0/propcache-0.5.4-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:a5e8ef588c109725dc713ba69aadcac00a1ef90c2ce9c0a8c7075128f569f47f", size = 89825, upload-time = "2026-09-16T00:16:43.115Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/8b/dfeff925cb6ced97ede701d5c6a99998da963c6f2e06abbf879c9dac5b54/propcache-0.5.4-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:4d86476a935c88963d9b8e1a9a0d38188790e9622169bfbafa173046846709d3", size = 52159, upload-time = "2026-09-16T00:16:44.754Z" },
+ { url = "https://files.pythonhosted.org/packages/24/6c/924c810be5b7cf218ef47e707cf06d34adb4e3f3a31e3c24c55c6d945a88/propcache-0.5.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:f5470694918830da62fac9e69133b53d23b736d7070e587b27a4a2be37e08e68", size = 53956, upload-time = "2026-09-16T00:16:46.762Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/b6/9ed0a5c939b58b6bed740a05b5d0f919f0b318d03284b4b6d81a0fe8a29a/propcache-0.5.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10ef33a68a61ce317e095fd2e202a592ea92392b90944a78c993f0d9a73ab06c", size = 295235, upload-time = "2026-09-16T00:16:48.577Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/eb/5ce886e902a2e781dddf110993d5329458a9b1a8626b876c65e5e25bf413/propcache-0.5.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5cacf3c9efd09df409dc33654dd077e1c245ba8fb747b0f0236ef41b7c49b589", size = 294463, upload-time = "2026-09-16T00:16:50.539Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/88/c98f49183ecd3e5b204a556f0ca47baa02c2206a500fe8c7ec1726297b0a/propcache-0.5.4-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:770e8209d018175fc0063936fa9583b6d27e88c5ad31543f3383d66080efdd62", size = 300081, upload-time = "2026-09-16T00:16:52.423Z" },
+ { url = "https://files.pythonhosted.org/packages/27/0d/c5090f9e6f67cbc30a2b744c7bb0f8006dcba5ec1b0d82f866ae1cc7c5c4/propcache-0.5.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03969626faf0783a592dfa17e28eac06018bd0b44dafae6943d53b92421a7f72", size = 285360, upload-time = "2026-09-16T00:16:54.141Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/9c/34a55396910583ed07926669ab309dde2213a2dec05a7e946bb90ad66908/propcache-0.5.4-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ef3b928d9c984322b5c44e6964d8dbc653da87d2d8ee1647fa6da43072e650a9", size = 248014, upload-time = "2026-09-16T00:16:56.062Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/b5/c0a142b656093ca397039dd3fe166cbb87c945712b534546514a24cd2611/propcache-0.5.4-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:7177c43eddf10a0893c4fec52ebb408fdcd7f7d63962caace9180d8f81b14ece", size = 280662, upload-time = "2026-09-16T00:16:58.044Z" },
+ { url = "https://files.pythonhosted.org/packages/54/28/fab2809c2e337fe26becea9648e84d5cef46075c91b826acb13e4f9dd04e/propcache-0.5.4-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:420162a77f94eb1cf5ef7893f500016dabd548e73de956785a1dd899cc73006a", size = 266149, upload-time = "2026-09-16T00:16:59.702Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/11/7ddf336288b2678a5f054f8da2e2bd1a719f5d4b7de714d9c6bd588a2313/propcache-0.5.4-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:3eb2e820e8e2101407da93f17c57cbb7d225461955fc60105daaba14cd421ee2", size = 283097, upload-time = "2026-09-16T00:17:01.459Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/ae/351b1a5225f5473c411d9a612a229ae147cf0cf65c72ad838b87219ea8e8/propcache-0.5.4-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:13e52b6e0bde97dee98ab66552dbff2931649c96f1ac432eac299fe689ec373b", size = 248160, upload-time = "2026-09-16T00:17:03.298Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/d0/7f79f061e30d135bb615c9782c94a74652033d00b49254edbbf35a9165a8/propcache-0.5.4-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:12682126712ddc19b70ff819debbd279e58adf1f0c8f8f8138c18ade2044b284", size = 283036, upload-time = "2026-09-16T00:17:05.238Z" },
+ { url = "https://files.pythonhosted.org/packages/53/3c/016f1cad8bf4c428d748cf399b2bac603026fbfd6966e6a5579b5c5b6956/propcache-0.5.4-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:3af0c8642b2da4815d86e631232ac8286e17644fad907c19508aa8e7cb4ba8ad", size = 279350, upload-time = "2026-09-16T00:17:06.881Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/60/d8f72cb24b412487ed4c397f539117d3b74c3c33dd32020e91fe00a958a8/propcache-0.5.4-cp315-cp315t-win32.whl", hash = "sha256:1df8d8561b21465c5dd56110a01caf897e026d065b4b84e98a488209094272ec", size = 45874, upload-time = "2026-09-16T00:17:08.567Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/ef/8bae0a316d406644450522f2f3d44a4e19632f5f3bb60d1d0e6c53842616/propcache-0.5.4-cp315-cp315t-win_amd64.whl", hash = "sha256:02c0a34f16889cf800f10f0247a564d8ce6eeab6ffcd7c87198f769067eb8432", size = 48574, upload-time = "2026-09-16T00:17:10.077Z" },
+ { url = "https://files.pythonhosted.org/packages/57/be/bcc053f66a97355683884b448198e79580fae8e8fa4d96b9bb01614e9913/propcache-0.5.4-cp315-cp315t-win_arm64.whl", hash = "sha256:dc4242ca653c9b30ab51c5f8193323e7bc0928f897ee9103201e59a43abcb72e", size = 45625, upload-time = "2026-09-16T00:17:11.377Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/cd/785c64ed382f3f04201870267b02783f63b4678c2acfddc177a3ebcc2727/propcache-0.5.4-py3-none-any.whl", hash = "sha256:62c60aec739ed00124573cce1178138fd690c7676352d67a37328c1cf51d7468", size = 16338, upload-time = "2026-09-16T00:17:13.106Z" },
+]
+
+[[package]]
+name = "pycodestyle"
+version = "2.14.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" },
+]
+
+[[package]]
+name = "pycparser"
+version = "3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.21.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" },
+]
+
+[[package]]
+name = "pyjwt"
+version = "2.14.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/af/c3/8a3b59c25070cc61dc517fbdfa5dc0904670c96f605cc69759dc09166b99/pyjwt-2.14.0.tar.gz", hash = "sha256:77283c83fb56ecf566a886c757a714bc83668e38156de2cce8263302f42e0b86", size = 113177, upload-time = "2026-09-11T13:11:54.638Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9c/97/672cb32ce0dfea44b740cb7b4f97038463b9cf7c0ead1aacf595572851d6/pyjwt-2.14.0-py3-none-any.whl", hash = "sha256:ad0cef71c756a56e74863c2919cf0985f72decbcfcb550ee2f422e7c62b5eedc", size = 32896, upload-time = "2026-09-11T13:11:53.409Z" },
+]
+
+[[package]]
+name = "pyopenssl"
+version = "26.4.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/3f/e8/7325d258199b159eb2c03fe32107533e2832e70e63f4fb88a6aa00023201/pyopenssl-26.4.0.tar.gz", hash = "sha256:28dfcce0162b9211413e26dfbfdf1d24317fbeba18fc93c12400a1856b2a0bc7", size = 182046, upload-time = "2026-08-01T19:50:50.512Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/51/ad/2cf6d3fa2fae5c79e1ed9960c0d42badd0f94d81dd12b50604cdc839e648/pyopenssl-26.4.0-py3-none-any.whl", hash = "sha256:f0eb0cb2d581d3ad2b9c489468485e7f2ab6727d08401bcf9d824c3caddf3c1c", size = 56026, upload-time = "2026-08-01T19:50:48.94Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "8.4.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+]
+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-recording"
+version = "0.13.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+ { name = "vcrpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/32/9c/f4027c5f1693847b06d11caf4b4f6bb09f22c1581ada4663877ec166b8c6/pytest_recording-0.13.4.tar.gz", hash = "sha256:568d64b2a85992eec4ae0a419c855d5fd96782c5fb016784d86f18053792768c", size = 26576, upload-time = "2025-05-08T10:41:11.231Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/42/c2/ce34735972cc42d912173e79f200fe66530225190c06655c5632a9d88f1e/pytest_recording-0.13.4-py3-none-any.whl", hash = "sha256:ad49a434b51b1c4f78e85b1e6b74fdcc2a0a581ca16e52c798c6ace971f7f439", size = 13723, upload-time = "2025-05-08T10:41:09.684Z" },
+]
+
+[[package]]
+name = "pytest-sugar"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "packaging" },
+ { name = "pytest" },
+ { name = "termcolor" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f5/ac/5754f5edd6d508bc6493bc37d74b928f102a5fff82d9a80347e180998f08/pytest-sugar-1.0.0.tar.gz", hash = "sha256:6422e83258f5b0c04ce7c632176c7732cab5fdb909cb39cca5c9139f81276c0a", size = 14992, upload-time = "2024-02-01T18:30:36.735Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/92/fb/889f1b69da2f13691de09a111c16c4766a433382d44aa0ecf221deded44a/pytest_sugar-1.0.0-py3-none-any.whl", hash = "sha256:70ebcd8fc5795dc457ff8b69d266a4e2e8a74ae0c3edc749381c64b5246c8dfd", size = 10171, upload-time = "2024-02-01T18:30:29.395Z" },
+]
+
+[[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 = "pytz"
+version = "2026.3.post1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fb/48/fb042503b6ca6cd271261dc559fd6432f7d8c713153e9ec5c591af4dfc1c/pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d", size = 319745, upload-time = "2026-07-25T15:12:07.385Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl", hash = "sha256:dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815", size = 508283, upload-time = "2026-07-25T15:12:05.782Z" },
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" },
+ { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" },
+ { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" },
+ { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" },
+ { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" },
+ { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" },
+ { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" },
+ { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
+ { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
+ { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
+ { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
+ { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
+ { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
+ { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
+ { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
+ { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
+ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
+ { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
+ { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
+ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.16.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ba/78/449cb84790bd5cc3823b2652ee405a4558856e5c4195aee3a16bf7b3eb5d/ruff-0.16.8.tar.gz", hash = "sha256:9247bf92b5f04d825c8639a4fe423ec2e4222acd9222e58412b0dab7e442798b", size = 4938814, upload-time = "2026-09-16T15:54:46.688Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ac/25/6071aabc530e9be7e2c195e8fe3f7aea2735405b6cf447212832d7811831/ruff-0.16.8-py3-none-linux_armv6l.whl", hash = "sha256:6ffbd6d87383c1edf5f6fa890f10200950240d7c1a16052a19a09d3a2307dd38", size = 10048966, upload-time = "2026-09-16T15:53:57.605Z" },
+ { url = "https://files.pythonhosted.org/packages/54/98/07f90ecbc74dd5fb5764f11f2bc774d6a7cffef92d2ff5f5b4e9e23c754e/ruff-0.16.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:42ed6b878ed61e3acca92f2730a17acff39286944ea82398544696366a6f925e", size = 10165498, upload-time = "2026-09-16T15:54:01.14Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/1f/e6a712e3b47cad4a40600134105ed193cb773f618a42eb7ba323cb812cc0/ruff-0.16.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7ea781c7f2afba8c6a505ea0fb3f994020249e0c450635f5381286fea6b46170", size = 9830004, upload-time = "2026-09-16T15:54:03.998Z" },
+ { url = "https://files.pythonhosted.org/packages/23/f2/311a08776d75d81c7676e20b6b020ae63cbe881fcdc7a8dd64e6e18bdd93/ruff-0.16.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efeae3bbe414a5efefda11a792dfb51ef90ac48d50c4830de2f644caf3e8659", size = 9986558, upload-time = "2026-09-16T15:54:06.804Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/ed/37b6cb3d3ba8c73e68ae3eb1d502383beb5aa05a582bb7bb3a922f929f54/ruff-0.16.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a79b795469fef7fc6e908b218eed2eb17332afd85031db6480dc864560e69b2", size = 9877332, upload-time = "2026-09-16T15:54:09.552Z" },
+ { url = "https://files.pythonhosted.org/packages/22/cc/40873a8f36ad084cc540d55fcca7077264d5b13b24659e9180c176fb2b08/ruff-0.16.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fdc5563cdc50555e6fba39322850860e9267c1b3d12c26a74729d8604c3c812", size = 10507125, upload-time = "2026-09-16T15:54:12.152Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/e4/fc91a642b78ccbab6b9477720f3644ae7a10a9bcce69a934679cd64f62bc/ruff-0.16.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34508983c70665578dab88f5223d8e6228307e1135398ca8bfc8b7e9501e282b", size = 11336694, upload-time = "2026-09-16T15:54:15.489Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/3d/bbd2a9a600a4e73dc3e7548a249c8d1671273464b55822c6fae50f602dff/ruff-0.16.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:644bb578569e0ffc575741232bd385dacdd6fbe123f1a729e7a225f54aa3957f", size = 10774448, upload-time = "2026-09-16T15:54:18.16Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/41/d83af9879a7b6e8bf5fe16b1da0b134049d2f5d3afac12defb0897cb84bd/ruff-0.16.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15e7d226246961db9235098333caa13063906d3851136b84c2900b82f5daa1df", size = 10323796, upload-time = "2026-09-16T15:54:20.743Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/2c/cefd07bfe914b84943ea769ade8d607bd22750b965d3228eefd7cebd15d0/ruff-0.16.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a2bf6bc3e9ebdd4449abc6f06cf64b98051a2c61cf94d2fe9596518c881f1a1e", size = 10514115, upload-time = "2026-09-16T15:54:23.497Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/9d/76a2e26c79a23be6e6e3664c57bec9e9fc8de155cfb9e4b67ea91b64f9d7/ruff-0.16.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6ca111ba0849539165e9e59d2b442542f3c1e8060ebbdea82494f1ffbccb1e1f", size = 10072582, upload-time = "2026-09-16T15:54:26.185Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/d4/f42edddb39668af1a559ceafa3823aedd65633a48dc9768e775485faa2c1/ruff-0.16.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:359a1e5b495448ee1e91018064382ebc86f90e8aac2fed222c7d0e4e8df85fd2", size = 9879644, upload-time = "2026-09-16T15:54:29.278Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/d4/913e3195d95e0378786c6656945c865f534a3560e29139da4882aff630d1/ruff-0.16.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:59e8f5681349474110b24d62e93cfda6593f5fa3473446ca3705200cac1a08b9", size = 10231569, upload-time = "2026-09-16T15:54:32.036Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/c4/8aa6ea0bdcedbd1bf87397e2fc4ed8406448ea5842f8660bc6e5f163039d/ruff-0.16.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:efa3e7a16d1baaa79957888dfdf8be9ef2e44db81cb032af06d76632ab59e773", size = 10663666, upload-time = "2026-09-16T15:54:34.838Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/02/7f10ef4700bc223c30a3fdd10631a29830c45524b810a3c7ed947af64591/ruff-0.16.8-py3-none-win32.whl", hash = "sha256:55793ba85c69921e89be061426d91a78652d6e50317c962240922747a4eb713f", size = 10093472, upload-time = "2026-09-16T15:54:37.47Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/5d/a509c07d714b6da88f2c518b4637cf6f1d46b074be8f0f1e5fb9ff5126fe/ruff-0.16.8-py3-none-win_amd64.whl", hash = "sha256:a6b85621fd3c81e31fc5f5add09c9c078b430db3595ca632efafdec9e64ebfaa", size = 10586899, upload-time = "2026-09-16T15:54:40.488Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/a0/50787329e4f20bf9dc9f6230015d46ec69c51a97ace5bc202dae4755365d/ruff-0.16.8-py3-none-win_arm64.whl", hash = "sha256:d075e820af612102ce217f07cc93e69f9490b10ec13ea85fa87bd03d996cef8a", size = 10386316, upload-time = "2026-09-16T15:54:43.332Z" },
+]
+
+[[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 = "termcolor"
+version = "3.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/46/79/cf31d7a93a8fdc6aa0fbb665be84426a8c5a557d9240b6239e9e11e35fc5/termcolor-3.3.0.tar.gz", hash = "sha256:348871ca648ec6a9a983a13ab626c0acce02f515b9e1983332b17af7979521c5", size = 14434, upload-time = "2025-12-29T12:55:21.882Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/d1/8bb87d21e9aeb323cc03034f5eaf2c8f69841e40e4853c2627edf8111ed3/termcolor-3.3.0-py3-none-any.whl", hash = "sha256:cf642efadaf0a8ebbbf4bc7a31cec2f9b5f21a9f726f4ccbb08192c9c26f43a5", size = 7734, upload-time = "2025-12-29T12:55:20.718Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" },
+ { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" },
+ { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" },
+ { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" },
+ { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" },
+ { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" },
+ { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" },
+ { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" },
+ { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" },
+ { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" },
+ { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" },
+ { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" },
+ { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" },
+ { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" },
+ { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" },
+ { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" },
+ { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" },
+ { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" },
+ { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" },
+ { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" },
+ { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" },
+ { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" },
+ { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" },
+ { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" },
+ { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" },
+ { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.8.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz", hash = "sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63", size = 458972, upload-time = "2026-09-15T19:29:36.253Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl", hash = "sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", size = 135717, upload-time = "2026-09-15T19:29:34.577Z" },
+]
+
+[[package]]
+name = "vcrpy"
+version = "8.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyyaml" },
+ { name = "wrapt" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/39/d5/8a1f8eb603e2d35fbb0ecd1e309d0c5c18a0ecfc8c0a8f04088bbc8f833b/vcrpy-8.3.0.tar.gz", hash = "sha256:46d64e77e8d95e5c76c7d9a94ff05d8b38b2ae4e1d4869eb0235024b6fcb5212", size = 96117, upload-time = "2026-07-04T14:27:01.608Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/34/77/cb4219be91508399cbcb6143bad89462cfb16f6c638458f454a5d46ac95a/vcrpy-8.3.0-py3-none-any.whl", hash = "sha256:bd66e6143746778157f00e2a922527a8d96b2fdc350be8988a45a29c843815b9", size = 46530, upload-time = "2026-07-04T14:27:00.546Z" },
+]
+
+[[package]]
+name = "wrapt"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/42/a6/6375d56c44d590ef24acf0f8f5bf7ed768ff7a510b959306ec412611e90f/wrapt-2.4.1.tar.gz", hash = "sha256:fd6390aab9e8aa40c52eff3c180f098e8d9f5894b1fd4c4fd2c207067b33ed16", size = 164597, upload-time = "2026-09-10T23:12:16.811Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9c/45/fe4524dea5a15a6f64522745a96618fb2f874c11c4060848abacc4f85232/wrapt-2.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7aaff952dd6930fc87b52d44bf72ac8426e45e90058fe0f2da446889738eff44", size = 97739, upload-time = "2026-09-10T23:09:36.872Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/cb/08025a4402bd6f34ac7c07e4d5c75e4f32e595cd7424d697c6fce1663bc3/wrapt-2.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d67b916f2f777a6d31067e842598e059f1a0e29022c86454564fc9efb9a0c19", size = 98237, upload-time = "2026-09-10T23:09:38.82Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/e9/2c1a482052cfabd6906887096993099afa2db738e7597c30e4f2b9922718/wrapt-2.4.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2945f4bce1518e09eb25458dbd09800f7aa3fee81a5a5cefe66c4e82fe8cb69c", size = 217028, upload-time = "2026-09-10T23:09:40.259Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/0d/867f5a1955de8e04edfbdf32891376443629d94c3e31ae2ea2ba101d6d31/wrapt-2.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7ce62ee24eddb76c317ec790c44f4fbe9f34ee0a5dae37b30c65a2b8f3e3604", size = 219323, upload-time = "2026-09-10T23:09:41.701Z" },
+ { url = "https://files.pythonhosted.org/packages/42/21/af01e7d55ce47df290e60cc4c0acccd439ccb95f30be63e46ba013e4f212/wrapt-2.4.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cbee8d00840ac89846f6567c75506260a15fbb4dc74de180678fafe09458d47", size = 208024, upload-time = "2026-09-10T23:09:43.318Z" },
+ { url = "https://files.pythonhosted.org/packages/89/24/9ae249d4922408cb28bc31e8dec86e918350261cf61e38fd8bbfff8bfd66/wrapt-2.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b78dd8d058468156003ee8c212dab334b6eea18cd9c5db3b81f6c90a9408afcc", size = 217712, upload-time = "2026-09-10T23:09:44.739Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/a7/34b1e65e490ae886b057ac813e86e16399b7dae91166b5bde5fc9f86c2ee/wrapt-2.4.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4d48f1720569b4f6e2df97783fd270554abc4c6ebd74b2e5f15e5110283aaf78", size = 206245, upload-time = "2026-09-10T23:09:46.07Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/e5/8b5af45e8e7dc102b78a40b077f071466a0f584898fe57ce181bbca2572b/wrapt-2.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:de5d2d7f12557c9e994b4037330efa5700fccb9f2b9df0bd4ccf384eaf73c254", size = 206937, upload-time = "2026-09-10T23:09:47.328Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/47/06e483462e90a50250f51da3ffa1f1c67e457910078b36aad55805202886/wrapt-2.4.1-cp310-cp310-win32.whl", hash = "sha256:5c0217b8c12952bf4d137a19ff2c61cc9b626f52c09c43f0289769c9f5f808aa", size = 93405, upload-time = "2026-09-10T23:09:48.64Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/01/c200bbabb0c46a431c9d965fff78e6bf08c1598fa970bdf105362aeba969/wrapt-2.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:0aacc1af512e040fb0b3c4593a8bded9aaa04235025f08a54eda9d8c1103d3c6", size = 98454, upload-time = "2026-09-10T23:09:49.771Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/04/c7eace579b4c397aa3651c550c216b05d3561cff56bcbeb726c8ab3faf4b/wrapt-2.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:6f32a45d0e883918387aabf5384952e5a93ae40be0a6fb5f1eddc8281af4c714", size = 95247, upload-time = "2026-09-10T23:09:51.119Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/c6/5e08ef1e8ad5ff518354db77b7a303666c7e0652e2a569116b5ccb72b690/wrapt-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b6ea396edcfb305698f44ef0a47b9adaca15d30386ce093ca606844f776d7236", size = 97984, upload-time = "2026-09-10T23:09:52.569Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/ec/e77ba77fdce732f39522382a6a9b968e5abf3471f352d51670120534e271/wrapt-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b86bfe741840cec6d8d5858b1eb53a325f564f08d7e6fb5694981961edcec230", size = 98241, upload-time = "2026-09-10T23:09:53.72Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/af/c54bd0bf32ef3c5f6d2d50af6bd9d88c040ef53d9f8e113e065337d76788/wrapt-2.4.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8ec7aeb92e956810eedc268fe75f8c11f05d6c3d864d0995a53eb6623b3b6a51", size = 226167, upload-time = "2026-09-10T23:09:54.946Z" },
+ { url = "https://files.pythonhosted.org/packages/00/3c/934e13c7e27680760fa74e25e4b291b213fd607aa42333d883f732de6d73/wrapt-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba66eccadd4b857a845e309c08457bb71fa8300000e508e3a86cd695bf9c7515", size = 228439, upload-time = "2026-09-10T23:09:56.272Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/5e/7593f3fe527260ff3e8eb09ed26ff8f0bf51cda5702a75fb5969b689b4a2/wrapt-2.4.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3d5c8f3b4eae814213d4097f134be03aeb23816e6358213454ec5e62e8449fb6", size = 213495, upload-time = "2026-09-10T23:09:57.622Z" },
+ { url = "https://files.pythonhosted.org/packages/42/a8/d4b4d6ac44cb2c7d4a882499786fd96758c97feb6b1539ba0ed5c823849a/wrapt-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3bc7ab495e564449f39db2f54c1033d7190c944736d525f3bd06cefaf0134df0", size = 226108, upload-time = "2026-09-10T23:09:59.132Z" },
+ { url = "https://files.pythonhosted.org/packages/05/b3/aedc046bbd8ff2333c2ce9d5267db42117221d4192ac13c66e871b528d9f/wrapt-2.4.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2e2e694057bcfd46f43e28f7b50fad8f5fec7113cc6445fdf251219539a08f28", size = 211144, upload-time = "2026-09-10T23:10:01.141Z" },
+ { url = "https://files.pythonhosted.org/packages/96/60/c01efb0e8049a9df379b04ebc589eeef995d6cf184b1d8be9f1b84b4d5f7/wrapt-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5577fdc702427698c81c8c9c3b8479cbecb3dfd0f697be8c1d09c89f5838cc", size = 215496, upload-time = "2026-09-10T23:10:02.778Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/b5/26214472915eb447725982e2735c593131c5bae0c3fd582ad61e7b965907/wrapt-2.4.1-cp311-cp311-win32.whl", hash = "sha256:e78c0f6d66a564bab245faf170d55595df6fc237117b99d97fd838678f0906f0", size = 93493, upload-time = "2026-09-10T23:10:04.196Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/10/5f7d2dd40c97c5e572dce771b8d4c1c78d46a90cfc24c7b25f158253215a/wrapt-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:1f1851be0e593d65e68d7c1bc9d3b971e19fefa219f617e490d75e80e467ee14", size = 98679, upload-time = "2026-09-10T23:10:05.413Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/6a/f7565da9ab1323b2aa5fb4a83b919b6519cc0f4ea4b91ec8f2d25f5bcbab/wrapt-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:7ff549316d94c404999f96bb0a6993222566231ff4bede1b6f68908d1958a08f", size = 95071, upload-time = "2026-09-10T23:10:06.679Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/1f/a2f3225c5ecf522684c1d051aea8ce8253f240e55be75826b787777afd6c/wrapt-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7e86fbc2ac8a363ea04abf631fad82720e16b17a25020f32dbe9b24a2ed2b0e3", size = 98890, upload-time = "2026-09-10T23:10:07.876Z" },
+ { url = "https://files.pythonhosted.org/packages/68/6c/eb45660fd4d92cce11ec923f55bb2e647a6c18d30e53734eb07a3c530e31/wrapt-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24389748f0b9d5b67e478fad4fc8b3f1108422ef80716e48eead6cebcebbff08", size = 98742, upload-time = "2026-09-10T23:10:09.236Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/4f/17a89a580cb0082e61b8375074d5c9e5d38e4aa83ee19b6174ee472d17c2/wrapt-2.4.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:30d11c289b013bf384ff1a1a6553f150d0b855901708a9bef667a5680f8247c9", size = 236301, upload-time = "2026-09-10T23:10:11.039Z" },
+ { url = "https://files.pythonhosted.org/packages/01/ca/4700eb008a34bf02de328806ddde15fc84c8d1e65d3dcafb92a935a50319/wrapt-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9356dbb59199a0e4709de35fa4a1ac1a88ef6da99711a397f5b009233faff326", size = 237805, upload-time = "2026-09-10T23:10:12.594Z" },
+ { url = "https://files.pythonhosted.org/packages/75/5d/26c1740299b29e190d5f4b4a99eb001401042a9d9ab338e3f8e1ce140ecb/wrapt-2.4.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8342f332dada211f64b74609e332d727b13315e9a83177f7918bf68c59f815f2", size = 217037, upload-time = "2026-09-10T23:10:14.028Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/55/ec72991153a2ae8b40238bc44cec7c3ddf7706ef6e2d314b0c6f5c7febce/wrapt-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2f86e328c482bc5383b4eda5094be0bed3617fc3076aa9225ff1a9eb6372de9b", size = 234659, upload-time = "2026-09-10T23:10:15.384Z" },
+ { url = "https://files.pythonhosted.org/packages/51/32/7cfa1e070dcda76ea56a3e252341cba1cd1e9412baf23cd7adfebf1114e2/wrapt-2.4.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4dc92697444ee380544fbb43c86612d8486529aadf917c22b5524141d4af074c", size = 214590, upload-time = "2026-09-10T23:10:16.744Z" },
+ { url = "https://files.pythonhosted.org/packages/79/10/248841cb30107f6f32c53a02662e1c3e0c7c06bea0b8ebfaaee94885dcee/wrapt-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edd03758a7578526642508b8833d43496fdfba0f64e0025dfca153a7c1777735", size = 225103, upload-time = "2026-09-10T23:10:18.346Z" },
+ { url = "https://files.pythonhosted.org/packages/90/02/5b2bf7b35b008a39939a2908e85dba3b867596e535fc9f12ddf3ba1fcaf6/wrapt-2.4.1-cp312-cp312-win32.whl", hash = "sha256:5d83e412665aeb1e854eefbf1564d0d67872d9994b502a0bce96e6ff7f4970b7", size = 93441, upload-time = "2026-09-10T23:10:19.81Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/2a/47be56772bfb07ef242d6e924049688e38384af2b2fc99b0f31180988448/wrapt-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:b4e7efdd476ac631a0181551fd9aace844765ea3ce2b5133b194fae4421e8ad0", size = 98808, upload-time = "2026-09-10T23:10:21.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/ec/40e4c9735626afd1dc0eeb310310278361f192800503cda0f5b3d8d24db4/wrapt-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:38819761401baa2d11916d7265b82f23265f8fe5a31c431dd7c24a8863c65f88", size = 95240, upload-time = "2026-09-10T23:10:22.39Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/1a/9b5aa3c2391aa6d00fffa085c2219e8fc91cd4d2b9b080d2b4e4b6b93f42/wrapt-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:55f36bb1461f93beaf18d818e568b5de343dd8fade7456773d201a38ee723bd3", size = 98597, upload-time = "2026-09-10T23:10:23.723Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/07/dc98150c2f9ee5b5fcbd841765e178ea6cc6c43733ab8d1f5181a4fb9f3d/wrapt-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:53e15cd74bd6b84d7fa90b93dda7334d85f4641fae97632de8aa61d268dfd145", size = 98842, upload-time = "2026-09-10T23:10:25.109Z" },
+ { url = "https://files.pythonhosted.org/packages/08/c2/0e772a570e8d75c1b3ec45930a3023492fa68223f8f5e3485af4844c10c3/wrapt-2.4.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:be6cdd7121adc89a6f52e3c2f4e26a2d4dcdc1c0fde47e3156234db8939e4cdc", size = 234642, upload-time = "2026-09-10T23:10:26.644Z" },
+ { url = "https://files.pythonhosted.org/packages/76/25/4ce4d02dd95ff9ed972a2fc396d04fec636daa5a4ac18cc73a3dc20aa6c3/wrapt-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03b5598edd435373278731d0d53449ce7a9626bc48d5548e4a71124ee3e526a1", size = 235484, upload-time = "2026-09-10T23:10:28.098Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/80/436ef1df620ef8edd9ef057b4d55a0cd704435ff66852a0ef26cbaa02a58/wrapt-2.4.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fdc997819a6df4c65bdb0a1c5601c98b479ee34cc2f94ffa98a767034ad6366d", size = 214371, upload-time = "2026-09-10T23:10:29.841Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/2c/cc5b7503843399087db3106a7cf60d60d0900f69539e96148b9fff116291/wrapt-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3bfc6907ebed560d2d3f677c3b17bf6199679163b6c6e475035c9dca497d1697", size = 232347, upload-time = "2026-09-10T23:10:31.511Z" },
+ { url = "https://files.pythonhosted.org/packages/86/fb/17668b1ca572c44b458c09d76064d35f5f57d5ac7629248871604bef816c/wrapt-2.4.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a0c3b217332cf0c4df085fec41c126bf7507d6c1ca0efb3ba8d2b3fd234d4e73", size = 212792, upload-time = "2026-09-10T23:10:32.968Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/2b/0c5de10d7259e07c478c44bf2fbe179c6878727d09edf0632b97884801db/wrapt-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a23b89621cfeb3329b1a290596bf402e61d7d5a647a65ca8ea735e48771b71d4", size = 223585, upload-time = "2026-09-10T23:10:34.43Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/36/013dce1c687f8f1c87b1e78f403d04c80ae9b2ae77de4ddba16069a3e7d1/wrapt-2.4.1-cp313-cp313-win32.whl", hash = "sha256:bc67d4872af5ab2dc1b88904097b92ac00e7658fdf010dee36807807fe882ac4", size = 93425, upload-time = "2026-09-10T23:10:35.901Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/1d/d53bcf5910209a45191c8bc173ff0e00830416547d8038772dc444932ee0/wrapt-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:1fe758b9c2d49138231ec3efabd106fec665f86fec50b3d02d7edd75f08a69ca", size = 98569, upload-time = "2026-09-10T23:10:37.316Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/1f/759d0c522918f9dfb620136622d8e1ce619570adda0de8fa2cfbb55cbb86/wrapt-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c974c36e8205255a3947dad9c2fe000431b57dd522946e56c192174a7f92a0f", size = 95272, upload-time = "2026-09-10T23:10:38.657Z" },
+ { url = "https://files.pythonhosted.org/packages/08/05/ed5aa8991c5e9969e2ca17f0e44eb324a9757f44fa982bfc13844cfe9e1d/wrapt-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c6c35541cc729964c65c2b9b1f9cf317811039abc2da13b4557f20f21cdc292b", size = 98876, upload-time = "2026-09-10T23:10:40.078Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/5f/f8bf07c3b9a2ad01d28d5ca419e28819bb16937d129167d97c446c05875d/wrapt-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6b9df84f0a96763159cccb8e3b0ed83cc950c7c8bf82d6e45428372a805b3224", size = 99054, upload-time = "2026-09-10T23:10:41.484Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/7a/518e5f3ebd18472652e5332bf37728cd6634ff81a0aa568969d05cc66099/wrapt-2.4.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78af62413095d0a57077606654ce85e273deda8e2bfa28fdb04257b962d94ef2", size = 237430, upload-time = "2026-09-10T23:10:43.007Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/2b/503835d183c1ca99268e0b5a98af8f487d528ebabb124f4003cd96e73b1f/wrapt-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d60702ebc914d0bb01aa48f5c1785ceaaaa505e0a841b444a69d6ceb5de4097e", size = 237988, upload-time = "2026-09-10T23:10:44.466Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/9d/a11a3e1eb18ae1d9adef1c39f8e8e36fd5b86db33938bebf8e6bc5fd9b06/wrapt-2.4.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8c4b44e4be7680fc496816e824b6ed134d781c4da296e44b75399196e5c248f1", size = 218554, upload-time = "2026-09-10T23:10:45.969Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/61/61a6f983737ba81008561ab634373bba25b986761d3a0f0aded8352ae3e8/wrapt-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fb5b3f94258bcf71db902795f4a71151c7a74d9fe21fffa00752d2bd286866f8", size = 235476, upload-time = "2026-09-10T23:10:47.528Z" },
+ { url = "https://files.pythonhosted.org/packages/42/68/acb7cba46e0f662eaae421487807d2fed28ba52df9a00a3f04db16675e38/wrapt-2.4.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f1556a96b20d5bfdc9cb5dcd0a3ec65cbbac8a4eebcd3cd34efdc91c9519f660", size = 216454, upload-time = "2026-09-10T23:10:49.126Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/52/3a4dab8d4803df595de82f19775535d28c036746340c1b498fc8ecba39aa/wrapt-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:094a606d0bf1c4b847b3a743d22fc69cb164015b8c70cf6f20a534d30889ed47", size = 225346, upload-time = "2026-09-10T23:10:51.052Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/48/d72d051757fb7955021d8174014679f951fd5067187d2faed95520e1f8d6/wrapt-2.4.1-cp314-cp314-win32.whl", hash = "sha256:b0ee076be124406a7f97ca663c4a3ba32b6bcdd9102ca82497feaca79e9cb33c", size = 93870, upload-time = "2026-09-10T23:10:52.495Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/00/1a1bf4d8b60b9e7ac009969595438549ae6e33b2e3e174b78d26a833aad3/wrapt-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:d2d6f9abaa52de05090a2b4a4c1d0e858a268c4de69eec277506af9fbcccff91", size = 98910, upload-time = "2026-09-10T23:10:53.878Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/59/b3169c3bcdcff70a6d02ed2b6366097b083d31391d616c407efe9a943a82/wrapt-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:3152b2e94d733a9bd70dbd1c95f148266f079a70e9ffca2a9c5dc421ade1b4e6", size = 96013, upload-time = "2026-09-10T23:10:55.607Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/91/d29a063c2ca6e779305cd444dd5acaac60833d73b2d94c7b1d0820c27e3e/wrapt-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:37ff91b390400463ecd4d080ea823314510b6843ac53e6e35cc09bba1805d466", size = 102069, upload-time = "2026-09-10T23:10:57.179Z" },
+ { url = "https://files.pythonhosted.org/packages/72/26/7435de516099b528e2232770b459d6706002736f41d8f092bbb11ea01575/wrapt-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e0a518cac3e789443af54fc77f23e66f17d80192c281b160b42058f11fabccc5", size = 102647, upload-time = "2026-09-10T23:10:58.852Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/a7/cca7fe0f26aa11cbbf09b2e6f4f774db167feeca43ad22fa1772afdccbad/wrapt-2.4.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ecdeb8a1ec13397421e6f925412186bd87ab86d63517e6825b6d7bccf781f26", size = 275614, upload-time = "2026-09-10T23:11:00.464Z" },
+ { url = "https://files.pythonhosted.org/packages/77/22/f3b5f4428ae679b1e2c0d4833519045d8983a9df0ad24df96b195d44dd1b/wrapt-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c15c4ede3fde08723cabab0a892d4b75d35b5a6f0a51c84e6542ac0bdc0507aa", size = 287064, upload-time = "2026-09-10T23:11:02.111Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/b8/24274ec01b6ab6d0672f4312bfa29b5f1ffd9d56f16c8da67d5683883956/wrapt-2.4.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e32c5951c36fed88b6c603dc0bab209a62dc3217bd8762413634725fe28f2f3c", size = 255440, upload-time = "2026-09-10T23:11:03.746Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/df/c63a36f0f03d70c7b92f60ec1ad3757088167914e1a262f5dcc7df233d51/wrapt-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:898513db90d55a4ed3009312d41c12932b8163edbae3535280046d47aaff774f", size = 281681, upload-time = "2026-09-10T23:11:05.41Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/c7/4930b6a369d9b3da59f5ada4ae9e659e2d4a68fe72c5d1ce15e5bead2d24/wrapt-2.4.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:42d01574bd4bcafc3476e77a95c6c0dd6167101991401325fc5591e2db21a91d", size = 252409, upload-time = "2026-09-10T23:11:06.867Z" },
+ { url = "https://files.pythonhosted.org/packages/68/d7/f6bc5703061598c4a2ad4f7a2efce696782be6e9d5afed714a59f5902ead/wrapt-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:68a403adbeb4dd2654d6d108e43e69f0f90e6d34cb7588e0e6589109f6985e67", size = 270559, upload-time = "2026-09-10T23:11:08.385Z" },
+ { url = "https://files.pythonhosted.org/packages/68/a3/952337a153e634f530079334c47dcc935b20f8ea22f364729fc2a8cf1821/wrapt-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:7cb3035b332bc9d21478600ba82c7c71e2d074ed9b4e76364297f54598792227", size = 96241, upload-time = "2026-09-10T23:11:09.862Z" },
+ { url = "https://files.pythonhosted.org/packages/09/28/48f0651547a125dd84e312b86268d4150c565a29f81ff9ca6fd81eba4be4/wrapt-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:707d2bef68deddd0fc74a81103d91b286a69ac5a9ff0f0a6dad66f8787e86697", size = 102655, upload-time = "2026-09-10T23:11:11.388Z" },
+ { url = "https://files.pythonhosted.org/packages/21/a6/977441bed5e5afbffe7a789067ac2f5fd2e9f848884122a23db9ccae6a70/wrapt-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:28cb1c2713b4377bf03ddcb3e76d8216e4bb334199066c6122be7eed2f72de8c", size = 98495, upload-time = "2026-09-10T23:11:12.952Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/1c/03bcbc3dbf6ac11231f0434f2494aa7b80657b130be1a1a639192a3e44c9/wrapt-2.4.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:96a5023fa63ca2f095f7776c8bfaa1694547577f762646c375abafd8f8ae649b", size = 98878, upload-time = "2026-09-10T23:11:14.506Z" },
+ { url = "https://files.pythonhosted.org/packages/87/26/5ad9bd421b8cdce0b2227a61f09586423765da3c284f8bbf0f69fc149fdf/wrapt-2.4.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b21924949dedc3ac63725e09b9b0a130e771975f03432789344ed3422c46008", size = 99090, upload-time = "2026-09-10T23:11:16.101Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/c7/fa768261966d587650004ac37bef541540014b1fe23fbf4919c497ebc98c/wrapt-2.4.1-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2f725af353bb3319c528ee69dbff838599426974288b281a3258d5397b18cb63", size = 237803, upload-time = "2026-09-10T23:11:17.738Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/37/9c1c876bd88fef8d065b3e8bf125cad9291d70ed3695cedb41b36b2453ec/wrapt-2.4.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20327e162ef7953fae56b31a43ca457f94ed1fc7a206d01e3d5c8412d1b91572", size = 238338, upload-time = "2026-09-10T23:11:19.742Z" },
+ { url = "https://files.pythonhosted.org/packages/91/5b/47b2f2f08b90d9d3b4e1790ccae0d4e4de40e73f6614c9a52465a04f02a5/wrapt-2.4.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2cedb743dbdfb9b6d4f11acd8cb6329460264429777e81ea2e86b1b72ea503af", size = 220668, upload-time = "2026-09-10T23:11:21.422Z" },
+ { url = "https://files.pythonhosted.org/packages/43/1f/da7844c7a3f7c01f3496e690e15ce9d01c0949278c64d4287ec472c90f72/wrapt-2.4.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:5a54744b1193505f19016194979b773ee3754a199e9ad90db18f2e9a18fffa16", size = 235812, upload-time = "2026-09-10T23:11:23.211Z" },
+ { url = "https://files.pythonhosted.org/packages/69/af/ac4aa9f795721a54a21bac329201f7df1b199b71ef064187a266d4d29836/wrapt-2.4.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:b0d38d9cc23e9781e6584f303e5c5a9f0d45b85de92ad45678c4dde8d49d9535", size = 218195, upload-time = "2026-09-10T23:11:24.983Z" },
+ { url = "https://files.pythonhosted.org/packages/78/aa/cff7670ec1cfa75b951171cfb41d45c7bdb94e928620a1599ec2b00cd2dd/wrapt-2.4.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:a524ca32f0bcdde2b728d9f81f9527d4dd24b13f15d180f05d08cdc01d1cebe0", size = 225713, upload-time = "2026-09-10T23:11:26.576Z" },
+ { url = "https://files.pythonhosted.org/packages/77/c6/64f138aef50b5ea1dfacca2a023b32ba3e41ef087bbd92e8997a95f4a0b8/wrapt-2.4.1-cp315-cp315-win32.whl", hash = "sha256:47c267617551e906de72f6e7265aa3bce84c63d44513d2d2e735e943422aa0a2", size = 93880, upload-time = "2026-09-10T23:11:28.253Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/aa/afe7484a0f7232e87f2ebb65286c1025d43cbe1de4e4051b127b024a92f7/wrapt-2.4.1-cp315-cp315-win_amd64.whl", hash = "sha256:ee437bd7fd050823ef731aad20e968ca8fe670b95e1841f5d201bfdbad4a4e96", size = 98919, upload-time = "2026-09-10T23:11:29.832Z" },
+ { url = "https://files.pythonhosted.org/packages/83/21/6865f976c6a1082ca61e2792bc6a2d6a0ed03cd750a46f837753127191f8/wrapt-2.4.1-cp315-cp315-win_arm64.whl", hash = "sha256:ebf3b703752b53366fd02b7fbd8c447428e0349c9af3fc17c7a05076dbdd749a", size = 96021, upload-time = "2026-09-10T23:11:31.448Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/48/baf784cc9f1fe554f96daf15af06c7c466d76469d5540e357cf564755606/wrapt-2.4.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:0f5990f5db090f069fcd577cc61cc8d463db73cde132abba9033b0a264fc06d0", size = 102028, upload-time = "2026-09-10T23:11:33.102Z" },
+ { url = "https://files.pythonhosted.org/packages/82/35/fb809c95bf5512196aeda4c640aabf4e92f607340b8b2556555690a52b7a/wrapt-2.4.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:ef19a2590b195ac294deff8ee350a027a479afdd2ef2170ce3900af92406e110", size = 102640, upload-time = "2026-09-10T23:11:35.145Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/3f/bd462010ccbbe298479f320bf2bb02996706003e9c20a15790b65a186f8b/wrapt-2.4.1-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:432f402f9b6014403cacf9fd18a6bf089c77964330eae951a155131ab0414f5d", size = 275999, upload-time = "2026-09-10T23:11:36.863Z" },
+ { url = "https://files.pythonhosted.org/packages/56/1e/bd043b2bad2943336e090583ff6cea2f3e8776bde02f073ccf760b16eee1/wrapt-2.4.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb7c0f8bdd21e954bad89d554cfb7431c2f8179842853f199841ab90cbebe914", size = 287576, upload-time = "2026-09-10T23:11:38.79Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/d9/9937bbd61ca4e7f58a7e8a38f5ff3562334f741de51b87f0e031df441254/wrapt-2.4.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8e82a1669d63b79a2b53041bbb6ea096b5763cab3ca698ed7ac244b3acb7cd51", size = 256763, upload-time = "2026-09-10T23:11:40.668Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/a8/0f78cc7e7fc6313cdba32df06f4b29a45a4a2aed3499040d6c1628d3f339/wrapt-2.4.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:b19e71c914c435d2c5652caea386c9bf2807979e957183f5bb06d5ed5fa8b55e", size = 282244, upload-time = "2026-09-10T23:11:42.483Z" },
+ { url = "https://files.pythonhosted.org/packages/be/0d/30317d738b9898a7fbedc193657f151a468b0fa7235f4abd58a646a99cd8/wrapt-2.4.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:a1e4870d3368c6c918f38e308d5dcea970ea5b908ce889c21412f3a517ebf0c3", size = 254153, upload-time = "2026-09-10T23:11:44.357Z" },
+ { url = "https://files.pythonhosted.org/packages/12/53/fe1f251a89f471ca7c5e17f2edbd8efd48fea6f1c08430dcf60986ea4183/wrapt-2.4.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:2286e8e4a937966706463d1bcea30dfefee529e6e73e097a18e9e066a07ae6c2", size = 271234, upload-time = "2026-09-10T23:11:46.132Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/7c/d63758cd7fa0d18c415a87312a07cdd9f0102eb824aaab5c7450b3ec08e5/wrapt-2.4.1-cp315-cp315t-win32.whl", hash = "sha256:80afa3b7010e82899044a2a189c468a0cd8c89980398a59ba3b96b451a6dc5e9", size = 96236, upload-time = "2026-09-10T23:11:47.942Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/2e/1785e6d2696db08b07c053b1f4ccb2b5e8f9d12e9bf2c7497693be6b4504/wrapt-2.4.1-cp315-cp315t-win_amd64.whl", hash = "sha256:3593b43fabab6b59fe77e38f7e40974aae120c30cea3fd1ceaea6621ee96be00", size = 102662, upload-time = "2026-09-10T23:11:49.831Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/fd/3f4ac5c4754948355e050f952ae7a64cdca94891e49fe9927c3f90a73334/wrapt-2.4.1-cp315-cp315t-win_arm64.whl", hash = "sha256:ac1939ccf3e1c33f463706fbf52db5075f5eefb6042bcc1f9cf48c2c20ef478c", size = 98500, upload-time = "2026-09-10T23:11:51.501Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/a2/edcfc8d9a30375791b775715f8501364588f65b494ec4f6930568a19e765/wrapt-2.4.1-py3-none-any.whl", hash = "sha256:1e84ec5d89a0a07a0ef6bcd343f5c8ecdc95601d71de3058cdc63274e86c193c", size = 75317, upload-time = "2026-09-10T23:12:14.82Z" },
+]
+
+[[package]]
+name = "yarl"
+version = "1.25.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "multidict" },
+ { name = "propcache" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/75/16/e8be8e2fb175bbf41a0680381a319f1199fae256588241a2ac8677eafb49/yarl-1.25.1.tar.gz", hash = "sha256:03dd38de09bc213e9a8b29761eec33ee1d5318dac0e49d8af36e4d27830e23a7", size = 246245, upload-time = "2026-09-15T19:35:02.264Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/85/92/55fa9ee84cb8ec9930a910b5753936a926f918d8cc8965bdac571479c095/yarl-1.25.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:142c06c4d6a35ee3ec5da08499805e879cb3ca7c1fbfbecb0140fe72403818d6", size = 144695, upload-time = "2026-09-15T19:29:53.114Z" },
+ { url = "https://files.pythonhosted.org/packages/16/b4/9edc8e605b16b2eb5bd0c2ccc73e2b15aab583862460767fb43f91f11839/yarl-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24ce942011a61953e7d313438038f4d32ff21387b775f58a957f7a07dd55ef95", size = 104332, upload-time = "2026-09-15T19:29:55.443Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/de/4204e6646e278b1cd4a9cf73ebe8b7cfcf16693f1249b324eb273d67602a/yarl-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e23c82b63cd7652fc24d33ed6cc17099d607aa3b4fc4ddc75e95062f3d82df4", size = 104449, upload-time = "2026-09-15T19:29:57.239Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/fc/21d74789198ad68a23a209ab0d73fe5a52d39ebbd9945041e72827acdd77/yarl-1.25.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee202350cf57abf0e9502a41601841019c25d3db7ff52d980aaf31446254059", size = 116828, upload-time = "2026-09-15T19:29:59.031Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/31/90891ddb61848c067ebd1fb505ab5902a6e7d4707c2f3823f67ff37883d3/yarl-1.25.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5df89f769cc8ff94c3d7e7603386fba309d25ce5240132d26c15baa8d0e96c4c", size = 107150, upload-time = "2026-09-15T19:30:00.868Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/15/f3d18743d3688b5f01aa83034b6c00665692ab20e1d0c89a29000d4979ea/yarl-1.25.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:83e9f4a25085bd4b7214701a0794ff1f50fc633ffb8bdfebf07abdd81c2db126", size = 124704, upload-time = "2026-09-15T19:30:03.128Z" },
+ { url = "https://files.pythonhosted.org/packages/99/37/718789d8004775d6a2db86b2afc72b1d156e0590b88a1b8634ddd4bdb8ee/yarl-1.25.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e636b64d24fd9c38053c5e389a1174c66361fa49dcfd220f4dd35b4abde7cb89", size = 129246, upload-time = "2026-09-15T19:30:05.014Z" },
+ { url = "https://files.pythonhosted.org/packages/28/b9/7818ac6dec7fbcd16be2d19495807c01e2c38834e57d41c63356a75e786b/yarl-1.25.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e5637ca8d0bd7fb72648a6c7934af4baaccb697657f7438c9d264fc2abb8b0b1", size = 118071, upload-time = "2026-09-15T19:30:06.977Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/e3/8d098cafb30a64df7283b5a5dd0d32d22a71b18a1b9ec071d0776ffe5c2a/yarl-1.25.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:683e362b8ba453080f7489c66f4ea794e751c35b72e7eab3575ef784c2fbc7fb", size = 116180, upload-time = "2026-09-15T19:30:08.836Z" },
+ { url = "https://files.pythonhosted.org/packages/20/9c/fbe9432478d87e00eef80242e15179639df162cb3d5d8d978fc56dcb6c51/yarl-1.25.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:df23df54b5114a17c2d0ef192433e2e5a9f0c5178c32375e90b7cfc965f349d0", size = 116578, upload-time = "2026-09-15T19:30:10.782Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/8e/b3dfd03732236b86b0bcf06a72a37de412ff6f82e719a947c3c651d4dece/yarl-1.25.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f53dcd26694f148f738edc052b5a69234833e739f10f4c3287bdfd8ec0f7b326", size = 108886, upload-time = "2026-09-15T19:30:12.951Z" },
+ { url = "https://files.pythonhosted.org/packages/83/e1/94dacb650d4963d5f844bc3df7ba70288cb7b68ed5a4d070da71acb19b14/yarl-1.25.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b8075fe90bc08e40b8b8a1874fab42ee4c7b56af05c5886e9cc841397f916908", size = 124098, upload-time = "2026-09-15T19:30:14.963Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/3f/c93f76a218258c7bfc60dd27fd56e9102bdbc625517f4a6ee673295fe4e4/yarl-1.25.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a8c2b841478068440d8b733005d13a5ef535b9928cbc05f17182d410f32ba449", size = 115768, upload-time = "2026-09-15T19:30:16.736Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/79/4d93f13c3b05cda3c962805dec28cbc255c50239b3457808abc5633a00c2/yarl-1.25.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ca32926d7d77bcc8838425c4c95e040a3ace1cb7dfdae599013458dcda2607ca", size = 122461, upload-time = "2026-09-15T19:30:18.901Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/8e/e2ba83b3a9bfc1d3b882ad35fa8abc04a7af4d9356f2e329a23d0c8d889d/yarl-1.25.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:192a866877a49993949ef1975864ad8728bea28ee810f6abe1a0729c2b500426", size = 118295, upload-time = "2026-09-15T19:30:21.07Z" },
+ { url = "https://files.pythonhosted.org/packages/42/67/cb5ea1baa0c0ac60bda44ce59f601133154af2a2e67722d3517f8793855d/yarl-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:3f4d48a6112712973e676bd792121fee470e432d749177162d9949d5c9460a1b", size = 102929, upload-time = "2026-09-15T19:30:23.122Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/85/9a1e98de10fc0e738d517efd2a9984c3e7db6cf35fa72b2b373988a9e9b7/yarl-1.25.1-cp310-cp310-win_arm64.whl", hash = "sha256:48796ea00a303961507dc6c8437c4b325a6fc3f95f7c36c71b91ea9a8150963c", size = 98854, upload-time = "2026-09-15T19:30:25.102Z" },
+ { url = "https://files.pythonhosted.org/packages/83/b3/2cea721d495ca57f8f414aa4867ee263f486b274e07463158cf52f02ba7f/yarl-1.25.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d693bf4bf534e9ba3ae2780cfd577f5135629f7b5ac653490859d0b77864865", size = 143794, upload-time = "2026-09-15T19:30:26.946Z" },
+ { url = "https://files.pythonhosted.org/packages/55/e6/cd145cff8e5cf60b8b3c41fbecfa2a45028a8dec3fbc52bec03595ff3d3b/yarl-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ab2054c5531af2a9ba7b69b8ec91e4f884420e83a8c5e579b013084cb57e5e5d", size = 103993, upload-time = "2026-09-15T19:30:28.661Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/7c/fbb40fe2d53747c40aa36a9e2bd2178a202f942bda0b670f3306d4aefbce/yarl-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:564fdc7085d2245ab84f88882fdb1d6ac0723124bff6ded35bfb1c00f812630d", size = 104010, upload-time = "2026-09-15T19:30:31.069Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/0b/5a516f70641092283f57cf3670bdb75e7327bcc0dcb5038697e4dfbfd569/yarl-1.25.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acae6b45d1ace09b6ba3876da43b88366ef368f73b988c7f57e14231753d4420", size = 116444, upload-time = "2026-09-15T19:30:32.894Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/8a/d1a627f827b0a404ae0f5647cab0534959081cde13b0756a783469fb3b5e/yarl-1.25.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1fb2a01ba8cd9c5d2c5dc1ec35e0fc951d04b4f037541d4ac090c993ce58b3d7", size = 107565, upload-time = "2026-09-15T19:30:35.188Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/cf/c8e0aaec886840a6c4480fe44eaec7cd4319f79a563b79321473be79c56f/yarl-1.25.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e92b6bcc741b86d67606c40d3cb9c7cc8e6c737f81e31f4a94efc204456c92e3", size = 125006, upload-time = "2026-09-15T19:30:37.1Z" },
+ { url = "https://files.pythonhosted.org/packages/50/26/0cce366d54a93cdc8342965dc7663385e4db161625cc1e8b18e786753d24/yarl-1.25.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72c34ac7ad4314c19362d5ce27626dcc8429bd30bbf8c179f4234078851f9492", size = 128717, upload-time = "2026-09-15T19:30:38.904Z" },
+ { url = "https://files.pythonhosted.org/packages/95/0c/a71501bbc1a674ff72c4d6c2b75f4d9a5af819f5244c3a7558080a8802c5/yarl-1.25.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5add7b4ca7afeea91d52e4d4e4db3b1fe9885b71f07054560d8c4296b7441a2", size = 117728, upload-time = "2026-09-15T19:30:40.809Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/6f/c3267ca01defeed9ed9c4ff9b17bd54915432c405945233265b707475d1c/yarl-1.25.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:def538065f9e4d4cf1ae164bd59aba00dfa84f03923e0de4c3788f252d6bcd17", size = 116224, upload-time = "2026-09-15T19:30:42.818Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/69/fad57ee52d648431718ee0f1f68966a99c1352c3924688ffbdcc9d3fe51a/yarl-1.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a191bfdb30a79b98e5d175d75285f9fcb78bf0e46ba5efda042e1c72071a0de", size = 116299, upload-time = "2026-09-15T19:30:44.966Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/d4/6a8c1e29f33338687ca278cba0a8fbf6525a322c2c02a9a500ccbe041152/yarl-1.25.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:71f42c5b9a948c113bbdebfa544598321431d064ff959d32e99b1feb61d68345", size = 108625, upload-time = "2026-09-15T19:30:46.874Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/d2/3a35ae791c9cb6522c106923ff25c3230d999091e5e65511bca23bbd9914/yarl-1.25.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:72849d892954be4d09e569b8b831ac39ce58417fedc767d4308a0fe542018a40", size = 124515, upload-time = "2026-09-15T19:30:49.082Z" },
+ { url = "https://files.pythonhosted.org/packages/be/fd/2b022109a6b4af0f7dc371cf7500af380b0d4f034010243e1b0ce218dc93/yarl-1.25.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:efb01a106f971cb3752856bca2318bbdf7f01bd8823779c461586cbe5ffd5258", size = 115711, upload-time = "2026-09-15T19:30:51.208Z" },
+ { url = "https://files.pythonhosted.org/packages/18/59/f7586271136c3ddb0126bbfe661844699369b76b555fe38c4efe86870b2e/yarl-1.25.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a1daf47cd95a7c3a63456336bc5aaa8c86dd3a47d07ed3d0e76132ae4666a5a1", size = 122751, upload-time = "2026-09-15T19:30:53.535Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/0b/07f7a2d881f7e16c385b47fc1753382600847cad305dcc7fa0c25828acf8/yarl-1.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9489e6abf47ba37f332075a91444c7cfedb03e6ce99fbb2f116bfe1ce810da3b", size = 117983, upload-time = "2026-09-15T19:30:55.277Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/9d/8cdceec66a9b940700cb45931741403f045b162afd79bcb93c41cadd0972/yarl-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7306dee25b8a0e737363f347362b875094b4dc4e367311470656ae420fdbf8e", size = 102894, upload-time = "2026-09-15T19:30:57.606Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f1/7ec357db1d3ad2863542d71e8fe64a126bbec17b134cd7d30951196809a5/yarl-1.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:abb1384477f5901d436b5d2e5465954de46ea6098f59163d243660b5c4461d35", size = 98609, upload-time = "2026-09-15T19:30:59.705Z" },
+ { url = "https://files.pythonhosted.org/packages/75/b3/cd32ac66ae622b854c2df0ac52106dda220d361b65a64fde7d5b3684aa3f/yarl-1.25.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d7aa6debf92a1dd14cb5280b083a764169a13cfb23a452111160274ed989f4", size = 144798, upload-time = "2026-09-15T19:31:01.821Z" },
+ { url = "https://files.pythonhosted.org/packages/61/fb/a2c52a8007c2051ba74662afb112ecf3d00346af4c25e33df9d80fd14fb8/yarl-1.25.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83d4a37e4b95da4d8bda930d6d35b75b4cdadbacbb4980cae290ea3100b5d51d", size = 104583, upload-time = "2026-09-15T19:31:04.05Z" },
+ { url = "https://files.pythonhosted.org/packages/be/dd/ee38aec8e09fdf957e50d4085453fbe202f56c6c3b4cf07b81cdb4f09ee9/yarl-1.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e029648f9c951db30e98a7d7ec90835db88ec4b32820efe2a9bdc2287e032eb6", size = 104325, upload-time = "2026-09-15T19:31:06.338Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/b3/058dbfb1857b484c9cf9cc135659f50b85ce66e03c99e44dc2f7b6161f55/yarl-1.25.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d781294bb815ecb5ea57ff6bbf8038e0a31a95fdf3e1788f66e0dc100d64b58", size = 115358, upload-time = "2026-09-15T19:31:08.593Z" },
+ { url = "https://files.pythonhosted.org/packages/db/39/29693446cf0cf6b15a0e2f75a5d40f93c56819b05b0622196f45e95b5cc0/yarl-1.25.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e12c538e00e7c1b286a07061046b90e8124e6a9793efae2c70db6a4aad07faad", size = 107658, upload-time = "2026-09-15T19:31:10.802Z" },
+ { url = "https://files.pythonhosted.org/packages/86/b3/3c4dd7e1af43b931fba95e0a722737f2ea94a6d199c802585282831d7abd/yarl-1.25.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e4de3ac4adbad3d0bc7c6f4360a7dbff5de2f15e3b723be3198074e17fd9c40", size = 122660, upload-time = "2026-09-15T19:31:12.84Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/b5/1b60dbc3cfc9c5712b15148c206748f2bc93953ffdbe25ea75b63dfc89c9/yarl-1.25.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:419f392a1da624877975709e3864dfe833af6cc7671b39318086d456e288380c", size = 126506, upload-time = "2026-09-15T19:31:15.088Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/7b/ca212cbe170ac8b96e45317ecbcf9c3c3ecf0cdec98d5b088a9c4088929b/yarl-1.25.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6f117789d22dce188e5754e8bc65b7e6ebf8cb73963b9fa761f672a5883769d", size = 117050, upload-time = "2026-09-15T19:31:17.241Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/c3/72b4938cdbe619ad71ac156182faef4908846b84dc3ca4dbb4c4e6f84014/yarl-1.25.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80e47012e730da131c9f059c80936783f9659aae22dc31c03c0595590d11ed54", size = 114174, upload-time = "2026-09-15T19:31:19.294Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/43/268717870f9ba0cc9701a95181587f6dc8c5f387aab4aeecc83158f38a79/yarl-1.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e80f557716fd765439577131e526b8942ffc2c07bdbc5e39fa62f660ba1e963f", size = 114944, upload-time = "2026-09-15T19:31:21.414Z" },
+ { url = "https://files.pythonhosted.org/packages/da/84/baa5bf504d51fe062c4bcaf62936da97fffb43285978d0b39984824231fd/yarl-1.25.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f61964f235a43738bfac50da46fc4254943a7eea3051aeb0b6fc7c992c29fadc", size = 108263, upload-time = "2026-09-15T19:31:23.388Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/28/779a2ed9e0152a601a27039bed9aead3f0b79797a67e2c44bfa444622dd8/yarl-1.25.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e546fe1d4a93ebc2910f0d768baff19faa09843ab3f2036a67ed6e69fae4419d", size = 122184, upload-time = "2026-09-15T19:31:25.343Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/1f/118e9e5b8f07694d63fd3222e801d7782270003f1a222aa798df3f8d5933/yarl-1.25.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cce0727fd5ac04d372fa9bbfde9febc2bcf209aadfcf0468e45dec72719895d1", size = 114001, upload-time = "2026-09-15T19:31:27.465Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/ae/a4cf1cf372313734b17996d4007f9f73596e7a178b9485802e5494ecf484/yarl-1.25.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af4ea5b37403ef4e30f3927eaed540db942bde01d8d3ff083527c0704d1c9c68", size = 120565, upload-time = "2026-09-15T19:31:29.47Z" },
+ { url = "https://files.pythonhosted.org/packages/05/79/ad94f93ca731bc9e44d321833ab96b82a4f9f5f63cf773f81a4aeea5ecc1/yarl-1.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:68782fdb4027b8d1eee25ec35e9a6db05e863b899eb0310b3a33b6c3fef55707", size = 117060, upload-time = "2026-09-15T19:31:31.367Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/cc/51a7b4abf4ac593b8e7eb3794b28e5a35ae26eed8bc04787628d215af82f/yarl-1.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:7d575b54cb3863ef9bc290ea4b009999d55dc237326131e4853cf33e888fee03", size = 102593, upload-time = "2026-09-15T19:31:33.329Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/21/0941a6b93a58b59a1ec75e5333bf06929b671309c43c0cd201c172d9c39f/yarl-1.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:bc3ac7bf569f6b64dad04dd7808c7872dae8a97df657856eac05e9b7e3614a85", size = 97697, upload-time = "2026-09-15T19:31:35.855Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/ed/2f3129bbcc9a5c8ba12cc2b29d8060a3bab9c8043c456cfd4b5ca3188890/yarl-1.25.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:25868beca8b6765f8f7d0e11fe6dd7c66dd4b0793b9500286d20cc92352126a5", size = 143623, upload-time = "2026-09-15T19:31:37.966Z" },
+ { url = "https://files.pythonhosted.org/packages/17/e1/f1bc3390fdca352826676b531d0712736f156919090206700421d46b2c37/yarl-1.25.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:10b2fd95332f0d716d5eee3c9fb2ce8eada19082de7fee83d32e37992fd75c26", size = 104011, upload-time = "2026-09-15T19:31:40.25Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/aa/50acc5c3e5da04172ae3c281c75405af4d2ca911e16120ab0563f4dffb66/yarl-1.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f12afda4eea8c8994a76d4df1875c765194f5fbe8a9d197929ea303caee29ec", size = 103677, upload-time = "2026-09-15T19:31:42.46Z" },
+ { url = "https://files.pythonhosted.org/packages/30/d2/7d1e0ab9f8390e1fbcede5a6dbf70d23c96ad09b8c5567f3a514d1ddb0e2/yarl-1.25.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14b79a30a93a3ce2e8832603fd0ab780ada281b0ba5110b519a634f2d7d7d1fc", size = 115392, upload-time = "2026-09-15T19:31:44.371Z" },
+ { url = "https://files.pythonhosted.org/packages/71/e1/5ba1e3a2a22139213655e760919038e8ed7e2d4a99826d0bbddb3beb96e5/yarl-1.25.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bd6340d20ae2c7ca719b87b426e808e90743b676d05d4c26c4fb5ca71f41184", size = 107493, upload-time = "2026-09-15T19:31:46.273Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/53/780653d5e0f73831f467cf13548912e5eec97f21dc49fc8daf21da027df4/yarl-1.25.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:126a2533570c554719ca40a1288fdee1700b6bc82e7131aa69fa85252d92e651", size = 122537, upload-time = "2026-09-15T19:31:48.654Z" },
+ { url = "https://files.pythonhosted.org/packages/03/92/d54fa70236c6036271c9c9c09fd978df5cbe3ef49ef6c46e9b833476d215/yarl-1.25.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3faadac7d812ddac258feb57b9846b60c1b437c4f4b9ad42595c6f6fe4390df", size = 126170, upload-time = "2026-09-15T19:31:50.872Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/b7/a82a49bf88340b837ef6972b508a1604ae377b9e6904b46b10cf5f1cf925/yarl-1.25.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be80550d9bfe83d9b62398a37081a90434e6df2d978ec345c3d2820de6beddab", size = 117012, upload-time = "2026-09-15T19:31:53.189Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/78/5d684b411e3f3602464ee9b538db48205038f8605872985f61efb809ced0/yarl-1.25.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e07595c7d6f4db270ceede356a1bd1c07a34f1c26f958d1ed0cd7b48e0d2bba3", size = 114950, upload-time = "2026-09-15T19:31:55.694Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/11/51d82b852c64f7fad0fc7a7ff3031517204887e874c722bbca839c0b23ac/yarl-1.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb96ed1ae6c7d072d60840c0434aef07a2df611812810807fbc54263a6053e9a", size = 115428, upload-time = "2026-09-15T19:31:57.966Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/49/9d1978049bf646b9ea918313926453c6901b71c92f097467777d47d36a88/yarl-1.25.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3feb99222553a8cbedfa52c2f59dd84c3f50d5b582c728d522caf8d72769a54b", size = 108428, upload-time = "2026-09-15T19:32:00.048Z" },
+ { url = "https://files.pythonhosted.org/packages/43/35/7b8f1ebb45d7ec3dda7d1909bf44f458de41ef91e2937f107733582a5166/yarl-1.25.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a2ed0ba415ccdf08f14bf544cb78346d0f76086707ffee24921a2c84dbf1305a", size = 121961, upload-time = "2026-09-15T19:32:02.436Z" },
+ { url = "https://files.pythonhosted.org/packages/63/d6/d8b689ab7ca26edeb85f6ff28812aac7a25376eefc1780e303a7bfbaceff/yarl-1.25.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2b49375d22299b0a834c2bca72f39aaecc270d96fb24c30424899676f487b22a", size = 114961, upload-time = "2026-09-15T19:32:04.456Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/d5/1a1798ea4dc6b7ee3260010a27907ebc697c95dae99817d817ed446d24aa/yarl-1.25.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ef74070ac553c59eb4f04258722066d6c6135b7baa03b2e9f2da65c096e96d98", size = 120036, upload-time = "2026-09-15T19:32:06.5Z" },
+ { url = "https://files.pythonhosted.org/packages/91/8d/b1b35ed7903da6669b1d367cb2c09436acd4ff508029b4f39a0c0c2058fc/yarl-1.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0a66db89ea473abeac4b70523cafd94db3772380e565f9d28af7a179b7af71fa", size = 117276, upload-time = "2026-09-15T19:32:09.401Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/8f/4db01cef62caff0d7a4593ed694fb8a41a27a11158cab80d290221f13e57/yarl-1.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:1f51020b2eb8a003c84925638ec63c21a750a4bddd3a22ec8eac6a742dadf1b9", size = 101945, upload-time = "2026-09-15T19:32:11.545Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/5e/3ce00497c5c0babb74d4130c10c3828ccd215b4819d12020c42429f991ac/yarl-1.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:b10dd0557ba422715b5206b3743192135a6022acca8baec51aa127d0a75db8fe", size = 97270, upload-time = "2026-09-15T19:32:14.127Z" },
+ { url = "https://files.pythonhosted.org/packages/80/cf/54023edfab7aa773b860503db0c56e962ccab0922803ee97988c176ea090/yarl-1.25.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a9ca696eb02e5c02a8afd872ada510eba9b7fe6e68b9572c2e9a9b1941e31e2e", size = 143975, upload-time = "2026-09-15T19:32:16.416Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/a8/e6c1be0e6761d0f2d10bbf33a3e1e02b99dc83874d92945d7b461a72481e/yarl-1.25.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a5877f2255aab518ebe528289037699201d5dc5f045f2396cb30aa02db22f57f", size = 104018, upload-time = "2026-09-15T19:32:18.364Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/bb/dda344765ffd3430afe1a1c66c866a57fae67786537d4f14607df6505ac1/yarl-1.25.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7a5c3115595995779ee21f2567035793911c3802a43c74f3fbb0314929ec67ac", size = 104156, upload-time = "2026-09-15T19:32:20.459Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/5f/ed1538bcd06009fe990d6d283dd7667f639e62a81e35c6d8c6ef6c08fb3c/yarl-1.25.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77e5099b99b37f3cf79c246998ca9f7313a78054cd1809ec46bc1afad47e1c4c", size = 116025, upload-time = "2026-09-15T19:32:22.766Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/af/2185daf56b99830d3356ecfada46faaa49945de6626e842b7728088d4980/yarl-1.25.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6efaf45df6a849cef613a03a94c845647456662f85438c886bb67a9c027c8c2c", size = 106985, upload-time = "2026-09-15T19:32:24.749Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/65/bc1ae564fb4b04a30b6a8f250e787772581c57e4c3d5cf07ac3359de3103/yarl-1.25.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5f90e44653c4e0f78501ed9bb7d3fce835a8d62b7c6ed0cb16557534087e743", size = 123030, upload-time = "2026-09-15T19:32:27.084Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/3e/e2afcde10d74e53b3fa889960991efb3019beda2b1682a01de720a302056/yarl-1.25.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:632da579b2d879f6bad20f2cfa35ded1efe2f4f77f8abb26a6234a5b236acd2f", size = 126765, upload-time = "2026-09-15T19:32:29.332Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/be/415b00c0fe5a0615b062a456b26623d7ec91c2bee20faea1a14045aa0469/yarl-1.25.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:30eec96e8a91bd588ce897c9543f6d5d8d34b28fbcba28a4dedf20ebeae9fe57", size = 117199, upload-time = "2026-09-15T19:32:31.49Z" },
+ { url = "https://files.pythonhosted.org/packages/97/27/3d8c63ddd3e8bcfd033748ab93876678ce59bacd66e4cb1ed851c9c5b37e/yarl-1.25.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:12b6bc4906e11f5e1a1cdcb12296e7afbd366c783cc8073403cd2fb74334e453", size = 115187, upload-time = "2026-09-15T19:32:34.137Z" },
+ { url = "https://files.pythonhosted.org/packages/39/b7/7a81d0be1a502a26a0d4326c6f2ecb736c824f570ea1c6529f2b0b227b50/yarl-1.25.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9d6ed3d17bccce4c05343e1ca8da13bc5c02c812a4e7282ddd05e8769322d3fc", size = 116085, upload-time = "2026-09-15T19:32:36.438Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/69/39fff459916aa0fab42215dc47b759586fd80f94aa56dfc4a7c15ba6e0dc/yarl-1.25.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f38a70074041d3b7e138e452799f5174198bae5bd5ab2000917badf403908c5f", size = 107996, upload-time = "2026-09-15T19:32:38.959Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/39/80b9a55a3335590451d9ecf3eb593a8c635351f4c905ef056d7e8a8fd9e7/yarl-1.25.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca89e4e21854ed27ec753297dde84b16c9f8e53b14a4866fb44457d643c19f8", size = 122549, upload-time = "2026-09-15T19:32:41.151Z" },
+ { url = "https://files.pythonhosted.org/packages/42/7d/a179c6757818bb59372a4adafd09f7f26a3b4a0f04c3ae404b544c0b0c82/yarl-1.25.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:1ab7618921a93767387a4b83776f751588f5b5ae9bb5bc96620e2e2e00bca868", size = 115107, upload-time = "2026-09-15T19:32:43.072Z" },
+ { url = "https://files.pythonhosted.org/packages/32/2b/a773ac867e4ab53a98ed98e5cefe3bae31e6f550252ca9d1de266f1a40c5/yarl-1.25.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0ae12ff2b805fa02c4dab838005caef735e39986322698c48588d3beacb65c62", size = 120666, upload-time = "2026-09-15T19:32:45.061Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/41/52be6505e85b0f76b4f85b01b5de7e06a0512201abc2c95e14e099549174/yarl-1.25.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90c30ed53546da833c700115c0064c22120d1b1560f474699fd31f22dd668233", size = 117505, upload-time = "2026-09-15T19:32:47.177Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/01/349c0386caedbbe488d519f252df54efac8a1459282d466c474bdd84a620/yarl-1.25.1-cp314-cp314-win_amd64.whl", hash = "sha256:acfa7e22aa6c6e7a5996a41d275bfa01efa7ea56ab890590280e9063e2cf5c1b", size = 103446, upload-time = "2026-09-15T19:32:49.615Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/f0/8ec63180f77912f0dc4e5a42760cb8c08d20da1d5ace3578a01b84d1f3d8/yarl-1.25.1-cp314-cp314-win_arm64.whl", hash = "sha256:8e7d98cdbb6d71e726f7d525952867096053d1f290dd4e3c50d7d313a136f414", size = 99159, upload-time = "2026-09-15T19:32:51.686Z" },
+ { url = "https://files.pythonhosted.org/packages/47/7d/92d2220d6886b70ab1ed8579533ac2af2dfac716d5d929001daff7986df9/yarl-1.25.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d21f0fa80a02d05299207eeaafef345d812ace96d5306e4ef265e1d419a615fa", size = 150071, upload-time = "2026-09-15T19:32:53.911Z" },
+ { url = "https://files.pythonhosted.org/packages/64/fc/b245e448124bcda9340df38e3553fa222b50260fca027a84095e9bd8642d/yarl-1.25.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17c9877a89fb6e2bca6f9087eb24cd7fb434653946ef5075e470d23d49b52287", size = 106780, upload-time = "2026-09-15T19:32:56.443Z" },
+ { url = "https://files.pythonhosted.org/packages/51/e2/9a6ce2e334ebf218a30335ae76fb1696459430d42f733b8cb0d7d65b84d3/yarl-1.25.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:29273edf1530e397bd07cb784db1fbe0d2590b77569f2e24679a9c0a2d763b94", size = 107361, upload-time = "2026-09-15T19:32:58.827Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/70/66e8c76b569b450d16e190f15071c916c3df70b0e33927e415ac497cf0c2/yarl-1.25.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7abffdf37af1cec6a2ad69b827aa84320db5894791bc8ed932dc93fb274b7e9", size = 114396, upload-time = "2026-09-15T19:33:02.24Z" },
+ { url = "https://files.pythonhosted.org/packages/73/23/0d82838a05c57fdc05bc8b66e8c92dcc0df15e27463a5f163142d521c682/yarl-1.25.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2239a02249d9326655419e0168a28ca9008938eaab31dc29fc875c217927a6c0", size = 104882, upload-time = "2026-09-15T19:33:04.494Z" },
+ { url = "https://files.pythonhosted.org/packages/86/d4/ea08615c4edaa6049a13a2f1128944d068d1893abda7d708d4d7ea01599a/yarl-1.25.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:664ec6a520b74a1df2810666eb67695fcb77fa663e6ea0a25aaf2e529cb24dfa", size = 119485, upload-time = "2026-09-15T19:33:06.583Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/82/0898bdce9b1ae403b308b9c733d0d24af4a3464270c2c081f457b16c3e0d/yarl-1.25.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4f1c91f5a5980a937ff8e238e98e6897e1ad74a4b1e2c0d68c73b5ffbb3f5c0b", size = 122490, upload-time = "2026-09-15T19:33:08.653Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/38/97d79b81c342b78246cfedb74809e68841f3198d21653e10d3232bd9c622/yarl-1.25.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c88edaec8c349ad4c5ad4c486a3defcc4b80ceb2f074436ffa0a87caf5e76a6", size = 115336, upload-time = "2026-09-15T19:33:11.056Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/9d/2577896554cd310dc470adb6da0b7dd0b435cb63e2565204a7ac240e504c/yarl-1.25.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:35dcbea443fafb3eece757ad4e514560ddeb6c34cfae1582c620d7b293d7feee", size = 111825, upload-time = "2026-09-15T19:33:13.204Z" },
+ { url = "https://files.pythonhosted.org/packages/29/6b/7ac49d8ba84a5c4bd73415a4c949d22c749cb3762579b3d50e48019a78aa/yarl-1.25.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:882569ff613758cac762a457a5d72d6e211b28d4bcfea89d1d71ea942b02eac0", size = 114655, upload-time = "2026-09-15T19:33:15.553Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/18/e5942a16723f5b72f9b1297fd5a85a54f6300cd15c0dcb5005b90cd89156/yarl-1.25.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d0f1489233a254bb3643d2f05de7d59019254d81daeca6b9162fe9edef57e0c7", size = 106395, upload-time = "2026-09-15T19:33:17.599Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/2d/549fa46240781513ebc47ae7eb418df428a163a2a3d644cc9cbb3ecb7846/yarl-1.25.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f41753a76f4f63927d03a0d8ba8f5ce0f2083bec29a8cfaccc55371b1564b96b", size = 119277, upload-time = "2026-09-15T19:33:19.973Z" },
+ { url = "https://files.pythonhosted.org/packages/76/16/4763f78dcdc0b3b9fb3842b04afe72b9320857c6a69300c62a0eab03d119/yarl-1.25.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fb0eb4955adf0579001581f2f71a126e8781ba61bcd120f127b0401163c6c2d", size = 112504, upload-time = "2026-09-15T19:33:22.464Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/b4/974e3edfe0d188393ce1cb9de400111c63fe61f4eb3b772a500d84c970d1/yarl-1.25.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a1e32763e641a1566507d90a8d3b19bfc3cc04a9d4e5ae3e32189874ed4b58a3", size = 116243, upload-time = "2026-09-15T19:33:24.788Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/aa/157b940428da80c104ca09666a740e51c94963df65d5b112e06b52e4d7a8/yarl-1.25.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65b5b2066651b7432d389e9799d979c703bcc6ef44266bb8153ef54e91e4aab3", size = 115822, upload-time = "2026-09-15T19:33:26.886Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/af/19fbdce41412e1b96825544cc52cd7029d3724655d0988237972f078bd29/yarl-1.25.1-cp314-cp314t-win_amd64.whl", hash = "sha256:734f6e5400352ac4254456003d462866c684703570929cff7a7bde015d0cb371", size = 107386, upload-time = "2026-09-15T19:33:29.009Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/99/f6431c8968e89be608d74b28ae2d024521b2953f27dd44e0dece5e04f67a/yarl-1.25.1-cp314-cp314t-win_arm64.whl", hash = "sha256:287e99ff5aa4dc1c7630bfc683ded6f106d756c99dec432a2d7f197a784f51c6", size = 102094, upload-time = "2026-09-15T19:33:31.151Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/3b/4f51eab40c2eabea6c3d5b121dff4b8988dc35087732ffede12d2be8b8dd/yarl-1.25.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9b1bdaae98bc016825dd3c9d8ee1832f829b3341f9cc6ebd1a1b0a7fef7367cc", size = 143875, upload-time = "2026-09-15T19:33:33.52Z" },
+ { url = "https://files.pythonhosted.org/packages/41/05/bbd58fc063f5f299a883f810760b265ca26c8167c91cb9a494d0fe2387e1/yarl-1.25.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:e7011b8fb8c4054bf0c12e5edc6cd83778b0028e99ce59b18586ed036f92cfdc", size = 104028, upload-time = "2026-09-15T19:33:36.22Z" },
+ { url = "https://files.pythonhosted.org/packages/12/ee/2fba0aecb52e7020e189f684148783aa0b9cfa3b3bfb0b400646eef70ad4/yarl-1.25.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f074e8d4aa0a5798920ddb6de3d08b228c614ff3724c3e8bd7577f4bafea867b", size = 104041, upload-time = "2026-09-15T19:33:38.86Z" },
+ { url = "https://files.pythonhosted.org/packages/38/35/884beab53ed88c7247d1671972b5ef116f7351fe0c7e6de8c3558372cb16/yarl-1.25.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d42e7e3ca399555578b4d617e3a6ecf13371b3743a115995fa010c7bf341459", size = 116018, upload-time = "2026-09-15T19:33:44.265Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/cc/1a91b685afb55cc18608443ace95280e96e263a97565811732b6788d3269/yarl-1.25.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aa4ed3dd308548f9e707d9caaf005d2d7f8c1e7868f858dfeb47fe76e16b391d", size = 107033, upload-time = "2026-09-15T19:33:46.45Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/c1/58b379fcb1d68d907b7fcf75200c44321896509b2a6a74abbb4b19d864d2/yarl-1.25.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42a66563d8cc056ee32e6191e05097a7b2b3bc302e0bc3133daf8710eb18bd26", size = 123257, upload-time = "2026-09-15T19:33:48.631Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/2d/1fe96cf5c2aeab10095e48f38585cf5a8451fb7253234822398e52aa5336/yarl-1.25.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:98d370568f393215d605304cdb77b3d5539bd192c75b623c7304c42c8d6d8273", size = 126745, upload-time = "2026-09-15T19:33:50.999Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/60/8674394ce43f4dadae573a1d6f451716438e9eab7d7fe8d643c673a32d85/yarl-1.25.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23bf5b403c879a54964e0feac7285688e04bb220074878d737d331522da0a5bf", size = 117255, upload-time = "2026-09-15T19:33:53.456Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/72/0faa30e02605d56127d42bb987dcc97da3863b7bf70b9bfbf5f739c05e30/yarl-1.25.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d45673badd08456d0340e9364eddafe1c53a9d2896424294de4d7dd71ad3ee57", size = 115166, upload-time = "2026-09-15T19:33:55.669Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/90/9a46eac564c437e128285c5c1d7bb385d268394e9209d84f6bf4a14471ef/yarl-1.25.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:0136d640dfa9b0523853e411430a99f8a91eca85774c6420285a33b755bc6de3", size = 116082, upload-time = "2026-09-15T19:33:57.78Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/38/4b1a686a3758878f93d2f1ea943f5a165f3555769cd16e761cfd0efdca17/yarl-1.25.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:59ba3a6e1aa8cfe5adf4bd270fd965db21955401b7ca6f1696010c55ed4daec2", size = 108048, upload-time = "2026-09-15T19:34:00.25Z" },
+ { url = "https://files.pythonhosted.org/packages/da/14/f348eb967f31a58348612a2b93bd8a2ab664548e2b5e879cac7f592f7201/yarl-1.25.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:87796fedc3ba97ec14fab55acb48584276e6c1e4c1e89c422bda62c838e754a9", size = 122775, upload-time = "2026-09-15T19:34:02.455Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/e9/4f7b79700f88cb9e8bb66f8b54f9bce1844c013a2c39fdc47112e9334c95/yarl-1.25.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:bd0912757081f89b107d6c00b2ff8a194401b0b87eadcf4481de2b865a8fd44f", size = 115096, upload-time = "2026-09-15T19:34:05.283Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/37/f9cb020331997d3eb887bd28d5410ecfd3d80bf163c23d7cec490d78dade/yarl-1.25.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:b51c159a9794633f5e0db7ecec7b2b6e3734eca1f5d17dc989ff3552a43ff78b", size = 120655, upload-time = "2026-09-15T19:34:07.382Z" },
+ { url = "https://files.pythonhosted.org/packages/12/83/52fceb22891a41f168db7ec22fd1d81e06b6a0b8d9f70921bd3e785defd0/yarl-1.25.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:319e070a01db9920fb63761843f96a104c8e2b9427266731810dc1e22595b17c", size = 117488, upload-time = "2026-09-15T19:34:09.988Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/5c/ce6c4ff1247fcbe4b33d462c23a097106d909b173fde7042bc52290466e2/yarl-1.25.1-cp315-cp315-win_amd64.whl", hash = "sha256:a2059a2d891bd156bc5184e7ab7a56e78a84dfcfdeac8c501b552533ad1c36ee", size = 103434, upload-time = "2026-09-15T19:34:12.56Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/a1/766a906b0704fb26d52b19dc22bed48a8ba0544203b70dcf44da350e8194/yarl-1.25.1-cp315-cp315-win_arm64.whl", hash = "sha256:a78b50b4f7918a3de71105d5c0b93bbc57bb8339a4d03a9dfd449f9068e76f3d", size = 99155, upload-time = "2026-09-15T19:34:15.132Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/d3/a1d09b32cb6ab14f66b44939f5b4255b8b9e747aef3974af1d5d80ccc2fd/yarl-1.25.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:b5402a340723fa7da00b5cff987ddab61276be6d11251ea71ae02bcac54890d8", size = 149284, upload-time = "2026-09-15T19:34:17.452Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/3b/fe554d879692650bca70bfbc0df124e82e4d2bb7456f698c7756f1279a96/yarl-1.25.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:eda19ea5ee88742f47a2340816e6f2d40b53bed3ab5b69794769f36af9f35bb4", size = 106399, upload-time = "2026-09-15T19:34:21.474Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/4b/e7af56177ac8d40094c82d7728224c0b8472157d50d362e5fb3b014b2bc8/yarl-1.25.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:75baa6cf9b6d1c52f3e111a130e202fd8cf0a5b3a066c3f73d615e885092e4ec", size = 106968, upload-time = "2026-09-15T19:34:23.619Z" },
+ { url = "https://files.pythonhosted.org/packages/da/4f/2df41fd738d46f23ef829ae8b4468d94bb6070038fc6dfab6165ed44fea8/yarl-1.25.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbcef5a9119ef653653132cccaf999b30a0af6f33bb0a4ba80bec30056868487", size = 114717, upload-time = "2026-09-15T19:34:25.879Z" },
+ { url = "https://files.pythonhosted.org/packages/69/ea/002b66df53bbd1aed1c23358ff99c9bdc744fe3f4d2740e1b2fdd7192885/yarl-1.25.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7efc9f082dfed77c316edffa9deb52888e1bc6789171887cc1f68e06d65465c8", size = 105198, upload-time = "2026-09-15T19:34:28.204Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/7c/95c8bc0c8f97d71e59c94525ad60d76f5c57d3f2820f08137ca8b9f0542a/yarl-1.25.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fe01645169a2112aa1d4ebc3e4c5f029c5c8f97adfc32e5d37c993b39a994d75", size = 120271, upload-time = "2026-09-15T19:34:30.5Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/7a/6fe9da56ec77927baa669fd86c39c567ce6205bab53d581082c6744c8ae7/yarl-1.25.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1c557dfd5e3db046053a0bdc72261ade790ebe8e2c7a41b36b0ca1f14cb95f3", size = 123572, upload-time = "2026-09-15T19:34:32.73Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/83/35f222d17fa70a14c7c74fdf112ccf5515e0c2a87082b1f9b99f7693bf57/yarl-1.25.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ce4d6ccafb33d39bd78444612d14938ead674c25702ded2ee9c54a47735d225", size = 115228, upload-time = "2026-09-15T19:34:35.344Z" },
+ { url = "https://files.pythonhosted.org/packages/da/6f/fbaaf619423578a7d898d0f226ae47bc1906c293865c416d83c17b828b0e/yarl-1.25.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80a063f8297fc796296f00f100be520f209b23dc98f93ce8eba6ee7122598209", size = 111618, upload-time = "2026-09-15T19:34:37.656Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/78/7383278f1b3cf8e0496bd95b3281a7b09b89217b6b428db24c6b99b3deca/yarl-1.25.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:7cb414a73e21a7ab58254926073f2930cb22f5b4314ea4260a687e2b3fd4dce3", size = 114839, upload-time = "2026-09-15T19:34:40.099Z" },
+ { url = "https://files.pythonhosted.org/packages/62/49/5506e5b6d29aab91bd845cc9016d88c3d3f81b81bc242b8100bdd5737825/yarl-1.25.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:85a18376073f8a39aa07be34f9fc77e2869aa72c55c441efdd2cf79a0407504d", size = 106212, upload-time = "2026-09-15T19:34:42.768Z" },
+ { url = "https://files.pythonhosted.org/packages/46/8a/19877c193b7c5929f4b07118c18bbe390f3fadd0f59dd98c0cd12b31fa5c/yarl-1.25.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:77716e245c90f058466a05e6a465bb8600f767a8f4b18b4d40f3aff958e5f73c", size = 119985, upload-time = "2026-09-15T19:34:44.976Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/6c/0a46fbbf9ecbcbd0cc20d2193394254b9e19817f22c814aab60f99847400/yarl-1.25.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:1e80dcf1446e1b080b1932b0d103c464a04112f5bc31f0f983ad418172063cde", size = 112081, upload-time = "2026-09-15T19:34:47.45Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/30/93f5d471230c74ccd06255d0842739f86551f937f9e63a5e947853c6244a/yarl-1.25.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:bdc8d8b8c22e9e43ac68316b5e6cf083dec537f4ec213cb4aa967b583bc3fa64", size = 116995, upload-time = "2026-09-15T19:34:49.972Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/80/c386593035ee3f9c6c6af0847b5578f2830c674794a9d7701b744a3ebd42/yarl-1.25.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbf531053a0935f2e871bcd4753f90313688772ff8c017f5ea402e315a78c1f", size = 115570, upload-time = "2026-09-15T19:34:52.628Z" },
+ { url = "https://files.pythonhosted.org/packages/38/02/eef443559563ef8f2e10469387b8b1e97cb5efee95b288a56da60801f7ee/yarl-1.25.1-cp315-cp315t-win_amd64.whl", hash = "sha256:b13b88747769537f3d32e89e3a735da10c0a9e35d7322928c701b5f93d3afffd", size = 106811, upload-time = "2026-09-15T19:34:54.935Z" },
+ { url = "https://files.pythonhosted.org/packages/88/91/41e284ca2cf5211e05dae031d126a3668aea88fa759df56e7e35c6ad25ba/yarl-1.25.1-cp315-cp315t-win_arm64.whl", hash = "sha256:783dd1467083f4d3f7722ad6a313f24c173e7571372738fcb7a6e6d1ba48df25", size = 101804, upload-time = "2026-09-15T19:34:57.231Z" },
+ { url = "https://files.pythonhosted.org/packages/54/22/318c7980066769c6bcd9221ed2248294f5698811da099013098c670565ed/yarl-1.25.1-py3-none-any.whl", hash = "sha256:681c758b0490f9e96b78e5fa8e8dc6e648e9185bb6eaebe73183c33ea0c445f3", size = 63617, upload-time = "2026-09-15T19:34:59.616Z" },
+]
diff --git a/packages/traceloop-sdk/pyproject.toml b/packages/traceloop-sdk/pyproject.toml
index 2e625ea556..f6a943e277 100644
--- a/packages/traceloop-sdk/pyproject.toml
+++ b/packages/traceloop-sdk/pyproject.toml
@@ -26,6 +26,7 @@ dependencies = [
"opentelemetry-instrumentation-mistralai",
"opentelemetry-instrumentation-openai",
"opentelemetry-instrumentation-openai-agents",
+ "opentelemetry-instrumentation-oci-genai",
"opentelemetry-instrumentation-ollama",
"opentelemetry-instrumentation-anthropic",
"opentelemetry-instrumentation-cohere",
@@ -174,6 +175,7 @@ opentelemetry-instrumentation-marqo = { path = "../opentelemetry-instrumentation
opentelemetry-instrumentation-mcp = { path = "../opentelemetry-instrumentation-mcp", editable = true }
opentelemetry-instrumentation-milvus = { path = "../opentelemetry-instrumentation-milvus", editable = true }
opentelemetry-instrumentation-mistralai = { path = "../opentelemetry-instrumentation-mistralai", editable = true }
+opentelemetry-instrumentation-oci-genai = { path = "../opentelemetry-instrumentation-oci-genai", editable = true }
opentelemetry-instrumentation-ollama = { path = "../opentelemetry-instrumentation-ollama", editable = true }
opentelemetry-instrumentation-openai = { path = "../opentelemetry-instrumentation-openai", editable = true }
opentelemetry-instrumentation-openai-agents = { path = "../opentelemetry-instrumentation-openai-agents", editable = true }
diff --git a/packages/traceloop-sdk/traceloop/sdk/instruments.py b/packages/traceloop-sdk/traceloop/sdk/instruments.py
index d4232a3899..9b5cc0955c 100644
--- a/packages/traceloop-sdk/traceloop/sdk/instruments.py
+++ b/packages/traceloop-sdk/traceloop/sdk/instruments.py
@@ -21,6 +21,7 @@ class Instruments(Enum):
MCP = "mcp"
MILVUS = "milvus"
MISTRAL = "mistral"
+ OCI_GENAI = "oci_genai"
OLLAMA = "ollama"
OPENAI = "openai"
OPENAI_AGENTS = "openai_agents"
diff --git a/packages/traceloop-sdk/traceloop/sdk/tracing/tracing.py b/packages/traceloop-sdk/traceloop/sdk/tracing/tracing.py
index 8808f85eab..8e092479e6 100644
--- a/packages/traceloop-sdk/traceloop/sdk/tracing/tracing.py
+++ b/packages/traceloop-sdk/traceloop/sdk/tracing/tracing.py
@@ -57,6 +57,7 @@
posthog.com,
sentry.io,
bedrock-runtime,
+ inference.generativeai,
sagemaker-runtime,
googleapis.com,
githubusercontent.com,
@@ -584,6 +585,9 @@ def init_instrumentations(
elif instrument == Instruments.MISTRAL:
if init_mistralai_instrumentor():
instrument_set = True
+ elif instrument == Instruments.OCI_GENAI:
+ if init_oci_genai_instrumentor(use_attributes):
+ instrument_set = True
elif instrument == Instruments.OLLAMA:
if init_ollama_instrumentor():
instrument_set = True
@@ -846,6 +850,20 @@ def init_litellm_instrumentor(use_attributes: bool = True):
return False
+def init_oci_genai_instrumentor(use_attributes: bool = True):
+ try:
+ if is_package_installed("oci"):
+ from opentelemetry.instrumentation.oci_genai import OCIGenAIInstrumentor
+
+ instrumentor = OCIGenAIInstrumentor(use_attributes=use_attributes)
+ if not instrumentor.is_instrumented_by_opentelemetry:
+ instrumentor.instrument()
+ return True
+ except Exception as e:
+ logging.error(f"Error initializing OCI Generative AI instrumentor: {e}")
+ return False
+
+
def init_ollama_instrumentor():
try:
if is_package_installed("ollama"):
diff --git a/packages/traceloop-sdk/uv.lock b/packages/traceloop-sdk/uv.lock
index 17b06beee2..74d45a263e 100644
--- a/packages/traceloop-sdk/uv.lock
+++ b/packages/traceloop-sdk/uv.lock
@@ -1504,7 +1504,7 @@ wheels = [
[[package]]
name = "opentelemetry-instrumentation-agno"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-agno" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1544,7 +1544,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-alephalpha"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-alephalpha" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1582,7 +1582,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-anthropic"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-anthropic" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1620,7 +1620,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-bedrock"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-bedrock" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1656,7 +1656,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-chromadb"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-chromadb" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1691,7 +1691,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-cohere"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-cohere" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1729,7 +1729,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-crewai"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-crewai" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1765,7 +1765,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-google-generativeai"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-google-generativeai" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1802,7 +1802,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-groq"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-groq" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1840,7 +1840,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-haystack"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-haystack" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1877,7 +1877,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-lancedb"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-lancedb" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1917,7 +1917,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-langchain"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-langchain" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -1971,7 +1971,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-litellm"
-version = "0.1.0"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-litellm" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2009,7 +2009,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-llamaindex"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-llamaindex" }
dependencies = [
{ name = "inflection" },
@@ -2073,7 +2073,7 @@ wheels = [
[[package]]
name = "opentelemetry-instrumentation-marqo"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-marqo" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2111,7 +2111,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-mcp"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-mcp" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2151,7 +2151,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-milvus"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-milvus" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2187,7 +2187,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-mistralai"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-mistralai" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2222,9 +2222,46 @@ test = [
{ name = "vcrpy", specifier = ">=8.0.0,<9" },
]
+[[package]]
+name = "opentelemetry-instrumentation-oci-genai"
+version = "0.62.3"
+source = { editable = "../opentelemetry-instrumentation-oci-genai" }
+dependencies = [
+ { name = "opentelemetry-api" },
+ { name = "opentelemetry-instrumentation" },
+ { name = "opentelemetry-semantic-conventions" },
+ { name = "opentelemetry-semantic-conventions-ai" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "oci", marker = "extra == 'instruments'" },
+ { name = "opentelemetry-api", specifier = ">=1.38.0,<2" },
+ { name = "opentelemetry-instrumentation", specifier = ">=0.59b0" },
+ { name = "opentelemetry-semantic-conventions", specifier = ">=0.63b1" },
+ { name = "opentelemetry-semantic-conventions-ai", specifier = ">=0.5.1,<0.6.0" },
+]
+provides-extras = ["instruments"]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "autopep8", specifier = ">=2.2.0,<3" },
+ { name = "pytest", specifier = ">=8.2.2,<9" },
+ { name = "pytest-sugar", specifier = "==1.0.0" },
+ { name = "ruff", specifier = ">=0.4.0" },
+]
+test = [
+ { name = "oci", specifier = ">=2.121.1,<3" },
+ { name = "opentelemetry-sdk", specifier = ">=1.38.0,<2" },
+ { name = "pytest", specifier = ">=8.2.2,<9" },
+ { name = "pytest-recording", specifier = ">=0.13.1,<0.14.0" },
+ { name = "pytest-sugar", specifier = "==1.0.0" },
+ { name = "vcrpy", specifier = ">=8.0.0,<9" },
+]
+
[[package]]
name = "opentelemetry-instrumentation-ollama"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-ollama" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2262,7 +2299,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-openai"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-openai" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2299,7 +2336,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-openai-agents"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-openai-agents" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2338,7 +2375,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-pinecone"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-pinecone" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2377,7 +2414,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-qdrant"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-qdrant" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2425,7 +2462,7 @@ wheels = [
[[package]]
name = "opentelemetry-instrumentation-replicate"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-replicate" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2477,7 +2514,7 @@ wheels = [
[[package]]
name = "opentelemetry-instrumentation-sagemaker"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-sagemaker" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2542,7 +2579,7 @@ wheels = [
[[package]]
name = "opentelemetry-instrumentation-together"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-together" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2580,7 +2617,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-transformers"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-transformers" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2627,7 +2664,7 @@ wheels = [
[[package]]
name = "opentelemetry-instrumentation-vertexai"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-vertexai" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2665,7 +2702,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-voyageai"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-voyageai" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2703,7 +2740,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-watsonx"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-watsonx" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2741,7 +2778,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-weaviate"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-weaviate" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -2780,7 +2817,7 @@ test = [
[[package]]
name = "opentelemetry-instrumentation-writer"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "../opentelemetry-instrumentation-writer" }
dependencies = [
{ name = "opentelemetry-api" },
@@ -3904,7 +3941,7 @@ wheels = [
[[package]]
name = "traceloop-sdk"
-version = "0.62.1"
+version = "0.62.3"
source = { editable = "." }
dependencies = [
{ name = "aiohttp" },
@@ -3934,6 +3971,7 @@ dependencies = [
{ name = "opentelemetry-instrumentation-mcp" },
{ name = "opentelemetry-instrumentation-milvus" },
{ name = "opentelemetry-instrumentation-mistralai" },
+ { name = "opentelemetry-instrumentation-oci-genai" },
{ name = "opentelemetry-instrumentation-ollama" },
{ name = "opentelemetry-instrumentation-openai" },
{ name = "opentelemetry-instrumentation-openai-agents" },
@@ -4017,6 +4055,7 @@ requires-dist = [
{ name = "opentelemetry-instrumentation-mcp", editable = "../opentelemetry-instrumentation-mcp" },
{ name = "opentelemetry-instrumentation-milvus", editable = "../opentelemetry-instrumentation-milvus" },
{ name = "opentelemetry-instrumentation-mistralai", editable = "../opentelemetry-instrumentation-mistralai" },
+ { name = "opentelemetry-instrumentation-oci-genai", editable = "../opentelemetry-instrumentation-oci-genai" },
{ name = "opentelemetry-instrumentation-ollama", editable = "../opentelemetry-instrumentation-ollama" },
{ name = "opentelemetry-instrumentation-openai", editable = "../opentelemetry-instrumentation-openai" },
{ name = "opentelemetry-instrumentation-openai-agents", editable = "../opentelemetry-instrumentation-openai-agents" },