From f00f75fd5b7bc2da679d5d8aea43dd9f27ecbd64 Mon Sep 17 00:00:00 2001 From: Cosmin Maria Date: Thu, 23 Apr 2026 14:13:40 +0300 Subject: [PATCH 1/8] Fix: drop temperature from UiPathChat payload when thinking is set Anthropic's extended thinking API requires temperature=1 (its default) and rejects any other explicit value alongside a thinking config. _default_params now silently removes temperature when thinking is present so callers don't have to manually avoid the combination. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../clients/normalized/chat_models.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py index 88a7040..821d723 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py @@ -243,10 +243,15 @@ def _default_params(self) -> dict[str, Any]: } set_fields = self.model_fields_set - return { - **{k: v for k, v in candidates.items() if k in set_fields}, - **self.model_kwargs, - } + params = {k: v for k, v in candidates.items() if k in set_fields} + + # Anthropic extended thinking requires temperature=1 (the API default). + # Sending any explicit temperature alongside thinking causes a validation error, + # so we drop it here and let the gateway apply the correct default. + if "thinking" in params: + params.pop("temperature", None) + + return {**params, **self.model_kwargs} def _get_usage_metadata(self, json_data: dict[str, Any]) -> UsageMetadata: return UsageMetadata( From d84e5ff589a4dad16f8e0911d6a652abe379a7bb Mon Sep 17 00:00:00 2001 From: Cosmin Maria Date: Thu, 23 Apr 2026 14:32:18 +0300 Subject: [PATCH 2/8] Fix: strip temperature/top_k/top_p for claude-opus-4+ in UiPathChatAnthropicBedrock Claude Opus 4+ (e.g. anthropic.claude-opus-4-7) are reasoning models that reject temperature, top_k, and top_p with a 400 Bad Request. Override _get_request_payload in UiPathChatAnthropicBedrock to pop those params when the model name matches the claude-opus-4 pattern. Params are untouched for all other models. Also add anthropic.claude-opus-4-7 to the bedrock integration test matrix (UiPathChatAnthropicBedrock, non-thinking configs only, as thinking cassettes are not yet recorded for this model). Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/uipath_langchain_client/CHANGELOG.md | 5 ++ .../uipath_langchain_client/__version__.py | 2 +- .../clients/bedrock/chat_models.py | 27 +++++++++ tests/langchain/clients/bedrock/conftest.py | 10 ++++ tests/langchain/clients/bedrock/test_unit.py | 60 +++++++++++++++++++ 5 files changed, 103 insertions(+), 1 deletion(-) diff --git a/packages/uipath_langchain_client/CHANGELOG.md b/packages/uipath_langchain_client/CHANGELOG.md index 5701366..6822099 100644 --- a/packages/uipath_langchain_client/CHANGELOG.md +++ b/packages/uipath_langchain_client/CHANGELOG.md @@ -2,6 +2,11 @@ All notable changes to `uipath_langchain_client` will be documented in this file. +## [1.9.10] - 2026-04-23 + +### Fixed +- `UiPathChatAnthropicBedrock` now strips `temperature`, `top_k`, and `top_p` from the request payload when the model name matches `claude-opus-4` (e.g. `anthropic.claude-opus-4-7`). These sampling parameters are not supported by Claude Opus 4+ reasoning models and previously caused a `400 Bad Request` from the gateway. Requests for other models (e.g. claude-haiku) are unaffected. + ## [1.9.9] - 2026-04-23 ### Changed diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/__version__.py b/packages/uipath_langchain_client/src/uipath_langchain_client/__version__.py index b612be4..fca0434 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/__version__.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/__version__.py @@ -1,3 +1,3 @@ __title__ = "UiPath LangChain Client" __description__ = "A Python client for interacting with UiPath's LLM services via LangChain." -__version__ = "1.9.9" +__version__ = "1.9.10" diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py index 5df1cf2..9265adb 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py @@ -1,7 +1,10 @@ +import re from functools import cached_property from typing import Any, Self +from langchain_core.language_models import LanguageModelInput from pydantic import Field, model_validator +from typing_extensions import override from uipath_langchain_client.base_client import UiPathBaseChatModel from uipath_langchain_client.settings import ( @@ -48,6 +51,16 @@ def _patched_format_data_content_block(block: dict) -> dict: ) from e +# Sampling parameters that Claude Opus 4+ (reasoning models) do not support. +# The API returns 400 if any of these are present in the request payload. +_CLAUDE_OPUS_4_UNSUPPORTED_PARAMS: frozenset[str] = frozenset({"temperature", "top_k", "top_p"}) + + +def _is_claude_opus_4_or_above(model_name: str) -> bool: + """Return True for Claude Opus 4+ models that reject sampling parameters.""" + return bool(re.search(r"claude-opus-4", model_name, re.IGNORECASE)) + + class UiPathChatBedrockConverse(UiPathBaseChatModel, ChatBedrockConverse): # type: ignore[override] api_config: UiPathAPIConfig = UiPathAPIConfig( api_type=ApiType.COMPLETIONS, @@ -147,3 +160,17 @@ def _async_client(self) -> AsyncAnthropicBedrock: max_retries=0, # handled by the UiPathBaseChatModel http_client=self.uipath_async_client, ) + + @override + def _get_request_payload( + self, + input_: LanguageModelInput, + *, + stop: list[str] | None = None, + **kwargs: Any, + ) -> dict: + payload = super()._get_request_payload(input_, stop=stop, **kwargs) + if _is_claude_opus_4_or_above(self.model): + for param in _CLAUDE_OPUS_4_UNSUPPORTED_PARAMS: + payload.pop(param, None) + return payload diff --git a/tests/langchain/clients/bedrock/conftest.py b/tests/langchain/clients/bedrock/conftest.py index 7091394..e96f657 100644 --- a/tests/langchain/clients/bedrock/conftest.py +++ b/tests/langchain/clients/bedrock/conftest.py @@ -46,8 +46,18 @@ }, ] +CLAUDE_ANTHROPIC_BEDROCK_CONFIGS_NO_THINKING = [ + c + for c in CLAUDE_BEDROCK_CONFIGS + if c["model_class"] is UiPathChatAnthropicBedrock + and "thinking" not in c.get("model_kwargs", {}) +] + COMPLETIONS_MODELS_WITH_CONFIGS = { "anthropic.claude-haiku-4-5-20251001-v1:0": CLAUDE_BEDROCK_CONFIGS, + # claude-opus-4-7 via Bedrock: tested with UiPathChatAnthropicBedrock only (no thinking; + # thinking cassettes not yet recorded for this model). + "anthropic.claude-opus-4-7": CLAUDE_ANTHROPIC_BEDROCK_CONFIGS_NO_THINKING, } diff --git a/tests/langchain/clients/bedrock/test_unit.py b/tests/langchain/clients/bedrock/test_unit.py index f7086fa..c7626c5 100644 --- a/tests/langchain/clients/bedrock/test_unit.py +++ b/tests/langchain/clients/bedrock/test_unit.py @@ -1,15 +1,19 @@ """LangChain unit tests for Bedrock provider clients.""" from typing import Any +from unittest.mock import MagicMock, patch import pytest from langchain_core.embeddings import Embeddings from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.messages import HumanMessage from langchain_tests.unit_tests import ChatModelUnitTests, EmbeddingsUnitTests from uipath_langchain_client.clients.bedrock.chat_models import ( + _CLAUDE_OPUS_4_UNSUPPORTED_PARAMS, UiPathChatAnthropicBedrock, UiPathChatBedrock, UiPathChatBedrockConverse, + _is_claude_opus_4_or_above, ) from uipath_langchain_client.clients.bedrock.embeddings import UiPathBedrockEmbeddings @@ -40,6 +44,62 @@ def chat_model_params(self) -> dict[str, Any]: def test_serdes(self, *args: Any, **kwargs: Any) -> None: ... +class TestClaudeOpus4SamplingParamFiltering: + """UiPathChatAnthropicBedrock must strip temperature/top_k/top_p for claude-opus-4+ models.""" + + @pytest.fixture() + def opus4_client(self, client_settings: UiPathBaseSettings) -> UiPathChatAnthropicBedrock: + return UiPathChatAnthropicBedrock( + model="anthropic.claude-opus-4-7", + settings=client_settings, + temperature=0.7, + top_k=40, + top_p=0.9, + ) + + def test_is_claude_opus_4_or_above(self) -> None: + assert _is_claude_opus_4_or_above("anthropic.claude-opus-4-7") + assert _is_claude_opus_4_or_above("claude-opus-4-5-20250514") + assert not _is_claude_opus_4_or_above("anthropic.claude-3-5-sonnet-20240620-v1:0") + assert not _is_claude_opus_4_or_above("anthropic.claude-haiku-4-5-20251001-v1:0") + + def test_unsupported_params_stripped_from_payload( + self, opus4_client: UiPathChatAnthropicBedrock + ) -> None: + with patch.object(opus4_client, "_client") as mock_client: + mock_client.messages.create.return_value = MagicMock( + content=[MagicMock(type="text", text="hi")], + stop_reason="end_turn", + usage=MagicMock(input_tokens=10, output_tokens=5), + model="anthropic.claude-opus-4-7", + id="msg_123", + ) + opus4_client.invoke([HumanMessage(content="hi")]) + call_kwargs = mock_client.messages.create.call_args.kwargs + for param in _CLAUDE_OPUS_4_UNSUPPORTED_PARAMS: + assert param not in call_kwargs, f"{param} must be stripped for claude-opus-4" + + def test_sampling_params_kept_for_other_models( + self, client_settings: UiPathBaseSettings + ) -> None: + haiku = UiPathChatAnthropicBedrock( + model="anthropic.claude-haiku-4-5-20251001-v1:0", + settings=client_settings, + temperature=0.5, + ) + with patch.object(haiku, "_client") as mock_client: + mock_client.messages.create.return_value = MagicMock( + content=[MagicMock(type="text", text="hi")], + stop_reason="end_turn", + usage=MagicMock(input_tokens=10, output_tokens=5), + model="anthropic.claude-haiku-4-5-20251001-v1:0", + id="msg_123", + ) + haiku.invoke([HumanMessage(content="hi")]) + call_kwargs = mock_client.messages.create.call_args.kwargs + assert call_kwargs.get("temperature") == 0.5, "temperature must be kept for haiku" + + class TestBedrockEmbeddings(EmbeddingsUnitTests): @pytest.fixture(autouse=True, params=BEDROCK_EMBEDDINGS_CLASSES) def setup_models(self, request: pytest.FixtureRequest, client_settings: UiPathBaseSettings): From 3e6aefaa1ee611f31f46469b3da01178e47ba8e4 Mon Sep 17 00:00:00 2001 From: Cosmin Maria Date: Thu, 23 Apr 2026 14:48:22 +0300 Subject: [PATCH 3/8] Feat: strip unsupported sampling params for claude-opus-4+ across all Anthropic clients MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move detection logic and constant to core (model_family.py) so a single definition covers all LangChain clients. - is_claude_opus_4_or_above() — core model_family.py - CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS — core model_family.py - Re-exported from uipath_langchain_client.utils Per-client strip strategy: - UiPathChatAnthropic → _get_request_payload override - UiPathChatAnthropicBedrock → _get_request_payload override (import from core) - UiPathChatBedrockConverse → _converse_params override (strips temperature/topP from inferenceConfig) - UiPathChatBedrock (INVOKE) → model_validator (nulls self.temperature, filters model_kwargs) - UiPathChat (normalized) → _default_params (strips + existing thinking check) Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 4 +- packages/uipath_langchain_client/CHANGELOG.md | 13 +++--- .../uipath_langchain_client/pyproject.toml | 2 +- .../clients/anthropic/chat_models.py | 19 +++++++++ .../clients/bedrock/chat_models.py | 37 ++++++++++++------ .../clients/normalized/chat_models.py | 11 +++++- .../src/uipath_langchain_client/utils.py | 4 ++ src/uipath/llm_client/__version__.py | 2 +- src/uipath/llm_client/utils/model_family.py | 17 ++++++++ tests/cassettes.db | Bin 46080000 -> 46080000 bytes tests/langchain/clients/bedrock/test_unit.py | 16 ++++---- 11 files changed, 92 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 935890f..541365a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,8 @@ All notable changes to `uipath_llm_client` (core package) will be documented in ## [1.9.9] - 2026-04-23 -### Changed -- Bumped dependency floors to the latest installed versions: `uipath-platform>=0.1.35`. +### Added +- `is_claude_opus_4_or_above(model_name)` and `CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS` added to `uipath.llm_client.utils.model_family` — identifies Claude Opus 4+ reasoning models and the sampling parameters (`temperature`, `top_k`, `top_p`) that the Anthropic API rejects for them. ## [1.9.8] - 2026-04-22 diff --git a/packages/uipath_langchain_client/CHANGELOG.md b/packages/uipath_langchain_client/CHANGELOG.md index 6822099..1803157 100644 --- a/packages/uipath_langchain_client/CHANGELOG.md +++ b/packages/uipath_langchain_client/CHANGELOG.md @@ -2,16 +2,12 @@ All notable changes to `uipath_langchain_client` will be documented in this file. -## [1.9.10] - 2026-04-23 - -### Fixed -- `UiPathChatAnthropicBedrock` now strips `temperature`, `top_k`, and `top_p` from the request payload when the model name matches `claude-opus-4` (e.g. `anthropic.claude-opus-4-7`). These sampling parameters are not supported by Claude Opus 4+ reasoning models and previously caused a `400 Bad Request` from the gateway. Requests for other models (e.g. claude-haiku) are unaffected. - ## [1.9.9] - 2026-04-23 -### Changed -- Bumped dependency floors to the latest installed versions: `langchain-openai>=1.2.0`, `langchain-aws>=1.4.5`. -- Minimum `uipath-llm-client` bumped to 1.9.9 to match the core dependency-floor release. +### Fixed +- Claude Opus 4+ reasoning models (e.g. `anthropic.claude-opus-4-7`) reject `temperature`, `top_k`, and `top_p` with `400 Bad Request`. All five UiPath Anthropic clients now strip those params automatically: `UiPathChatAnthropic` and `UiPathChatAnthropicBedrock` via `_get_request_payload`; `UiPathChatBedrockConverse` via `_converse_params` (strips `temperature`/`topP` from `inferenceConfig`); `UiPathChatBedrock` (INVOKE) via model validator; `UiPathChat` (normalized) via `_default_params`. Requests for other models are unaffected. +- `UiPathChat._default_params` drops `temperature` when `thinking` is also set. Anthropic's extended thinking API requires `temperature=1` (its default) and rejects any other explicit value. +- Detection logic (`is_claude_opus_4_or_above`) and the unsupported-param constant (`CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS`) are defined in core `uipath.llm_client.utils.model_family` and re-exported from `uipath_langchain_client.utils`. ## [1.9.8] - 2026-04-22 @@ -442,3 +438,4 @@ All notable changes to `uipath_langchain_client` will be documented in this file - Tool/function calling support - Full compatibility with LangChain's `BaseChatModel` interface - httpx-based HTTP handling for consistent behavior + diff --git a/packages/uipath_langchain_client/pyproject.toml b/packages/uipath_langchain_client/pyproject.toml index bca0acc..afc9945 100644 --- a/packages/uipath_langchain_client/pyproject.toml +++ b/packages/uipath_langchain_client/pyproject.toml @@ -6,7 +6,7 @@ readme = "README.md" requires-python = ">=3.11" dependencies = [ "langchain>=1.2.15,<2.0.0", - "uipath-llm-client>=1.9.9,<2.0.0", + "uipath-llm-client>=1.9.10,<2.0.0", ] [project.optional-dependencies] diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py index 26b87a2..86e254f 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py @@ -1,6 +1,7 @@ from functools import cached_property from typing import Any, Self +from langchain_core.language_models import LanguageModelInput from pydantic import Field, model_validator from typing_extensions import override @@ -12,6 +13,10 @@ UiPathAPIConfig, VendorType, ) +from uipath_langchain_client.utils import ( + CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, + is_claude_opus_4_or_above, +) try: from anthropic import ( @@ -151,6 +156,20 @@ def _async_anthropic_client( case _: raise ValueError("Anthropic models are currently not hosted on any other provider") + @override + def _get_request_payload( + self, + input_: LanguageModelInput, + *, + stop: list[str] | None = None, + **kwargs: Any, + ) -> dict: + payload = super()._get_request_payload(input_, stop=stop, **kwargs) + if is_claude_opus_4_or_above(self.model): + for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: + payload.pop(param, None) + return payload + @override def _create(self, payload: dict[str, Any]) -> Any: if "betas" in payload: diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py index 9265adb..1e76af2 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py @@ -1,4 +1,3 @@ -import re from functools import cached_property from typing import Any, Self @@ -14,6 +13,10 @@ UiPathAPIConfig, VendorType, ) +from uipath_langchain_client.utils import ( + CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, + is_claude_opus_4_or_above, +) try: from anthropic import AnthropicBedrock, AsyncAnthropicBedrock @@ -51,16 +54,6 @@ def _patched_format_data_content_block(block: dict) -> dict: ) from e -# Sampling parameters that Claude Opus 4+ (reasoning models) do not support. -# The API returns 400 if any of these are present in the request payload. -_CLAUDE_OPUS_4_UNSUPPORTED_PARAMS: frozenset[str] = frozenset({"temperature", "top_k", "top_p"}) - - -def _is_claude_opus_4_or_above(model_name: str) -> bool: - """Return True for Claude Opus 4+ models that reject sampling parameters.""" - return bool(re.search(r"claude-opus-4", model_name, re.IGNORECASE)) - - class UiPathChatBedrockConverse(UiPathBaseChatModel, ChatBedrockConverse): # type: ignore[override] api_config: UiPathAPIConfig = UiPathAPIConfig( api_type=ApiType.COMPLETIONS, @@ -89,6 +82,16 @@ def setup_uipath_client(self) -> Self: self.client = WrappedBotoClient(self.uipath_sync_client) return self + @override + def _converse_params(self, **kwargs: Any) -> dict: + params = super()._converse_params(**kwargs) + if is_claude_opus_4_or_above(self.model_id): + inference = params.get("inferenceConfig") + if isinstance(inference, dict): + inference.pop("temperature", None) + inference.pop("topP", None) + return params + class UiPathChatBedrock(UiPathBaseChatModel, ChatBedrock): # type: ignore[override] api_config: UiPathAPIConfig = UiPathAPIConfig( @@ -116,6 +119,14 @@ def setup_model_id(cls, values: Any) -> Any: @model_validator(mode="after") def setup_uipath_client(self) -> Self: self.client = WrappedBotoClient(self.uipath_sync_client) + if is_claude_opus_4_or_above(self.model_id): + self.temperature = None + if self.model_kwargs: + self.model_kwargs = { + k: v + for k, v in self.model_kwargs.items() + if k not in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS + } return self @property @@ -170,7 +181,7 @@ def _get_request_payload( **kwargs: Any, ) -> dict: payload = super()._get_request_payload(input_, stop=stop, **kwargs) - if _is_claude_opus_4_or_above(self.model): - for param in _CLAUDE_OPUS_4_UNSUPPORTED_PARAMS: + if is_claude_opus_4_or_above(self.model): + for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: payload.pop(param, None) return payload diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py index 821d723..7f9f1ba 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py @@ -66,7 +66,11 @@ from uipath_langchain_client.base_client import UiPathBaseChatModel from uipath_langchain_client.settings import ApiType, RoutingMode, UiPathAPIConfig -from uipath_langchain_client.utils import is_anthropic_model_name +from uipath_langchain_client.utils import ( + CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, + is_anthropic_model_name, + is_claude_opus_4_or_above, +) _DictOrPydanticClass = Union[dict[str, Any], type[BaseModel], type] _DictOrPydantic = Union[dict[str, Any], BaseModel] @@ -251,6 +255,11 @@ def _default_params(self) -> dict[str, Any]: if "thinking" in params: params.pop("temperature", None) + # Claude Opus 4+ reasoning models reject temperature, top_k and top_p entirely. + if is_claude_opus_4_or_above(self.model_name): + for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: + params.pop(param, None) + return {**params, **self.model_kwargs} def _get_usage_metadata(self, json_data: dict[str, Any]) -> UsageMetadata: diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/utils.py b/packages/uipath_langchain_client/src/uipath_langchain_client/utils.py index 0607b05..b28bb1a 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/utils.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/utils.py @@ -15,7 +15,9 @@ ) from uipath.llm_client.utils.model_family import ( ANTHROPIC_MODEL_NAME_KEYWORDS, + CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, is_anthropic_model_name, + is_claude_opus_4_or_above, ) from uipath.llm_client.utils.retry import RetryConfig @@ -36,4 +38,6 @@ "UiPathTooManyRequestsError", "ANTHROPIC_MODEL_NAME_KEYWORDS", "is_anthropic_model_name", + "CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS", + "is_claude_opus_4_or_above", ] diff --git a/src/uipath/llm_client/__version__.py b/src/uipath/llm_client/__version__.py index bd9af64..ae9cfbf 100644 --- a/src/uipath/llm_client/__version__.py +++ b/src/uipath/llm_client/__version__.py @@ -1,3 +1,3 @@ __title__ = "UiPath LLM Client" __description__ = "A Python client for interacting with UiPath's LLM services." -__version__ = "1.9.9" +__version__ = "1.9.10" diff --git a/src/uipath/llm_client/utils/model_family.py b/src/uipath/llm_client/utils/model_family.py index a7c7618..69598ba 100644 --- a/src/uipath/llm_client/utils/model_family.py +++ b/src/uipath/llm_client/utils/model_family.py @@ -4,6 +4,8 @@ deployments do not expose it. These helpers provide a name-based fallback. """ +import re + ANTHROPIC_MODEL_NAME_KEYWORDS: tuple[str, ...] = ( "anthropic", "claude", @@ -13,8 +15,23 @@ "mythos", ) +# Sampling parameters that Claude Opus 4+ (and similar reasoning models) do not support. +# The Anthropic API returns 400 Bad Request if any of these appear in the request payload. +CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: frozenset[str] = frozenset( + {"temperature", "top_k", "top_p"} +) + def is_anthropic_model_name(model_name: str) -> bool: """Return True if ``model_name`` looks like an Anthropic Claude-family model.""" lower = model_name.lower() return any(kw in lower for kw in ANTHROPIC_MODEL_NAME_KEYWORDS) + + +def is_claude_opus_4_or_above(model_name: str) -> bool: + """Return True for Claude Opus 4+ reasoning models that reject sampling parameters. + + These models do not accept ``temperature``, ``top_k``, or ``top_p``; sending + any of them causes a ``400 Bad Request`` from the Anthropic API. + """ + return bool(re.search(r"claude-opus-4", model_name, re.IGNORECASE)) diff --git a/tests/cassettes.db b/tests/cassettes.db index bbd58c808f3dacf50241295508a5245eb525f9f6..ec9189532e002adb5cab816ea6eef9f9f115ac39 100644 GIT binary patch delta 131186 zcmdqK2XtFi)-bAjEyetbaq{ucd*6C%J+F0cblbW6?6c4A z`=n#|r`Qf`{fnbmW(H%!R}2PkF@wRlVfR`E$ubYt-Mxa}vz5dvWOO7R*Z(>ChUm!0 zV}w6PF&T_7v#;}tPl>HiCpyM~f1OQ83S)HOWs`^5X@S9`9mz28c*i2R@%QW%#G)>d zS44P4q*oN;6*0XcmRH2~ibB02j#tF>io(32aIYxBD~j}rqP(JLuPDYV;(0}UuSnn( z&GU+4y`uSE(E_h%p;xrXD_ZOoE%Az$dPU2;qUB!E3a?0bOcckQAY%QjnD~|uk{AWz z+nD*j{?R=o6SfKB7eF09KK_Oi0;;XVwhG&7Y-_MxhHWjjb=cNp+kkDO|AZhx^am+X z!w@juWiYEku8y`xohBz4??!$VNk&{5{$$vz+>=~6r$6*T_Veu3tewoWAs%v^_-1$N zJl|V?c$ioW#kUIMq5mLfiBI%(ED=g5VX$H}fnlQr>?v7!UeDskM-xd_48(-O zV*hZ$kt+!}^?viBIiNdqt1!uT@W5$;L!8_*5I;45m4H@z_WbA(WF_8GK@p!F-;%k@G31Ce+OyV|~r4 zj$Rqn9~D9jM(&8XHT?JCAz>PBQ%D>`K`g=-7&K0BGB!UNM88Nq zvkvMue?mj8gOnH5%lzV%M;b`q2$Jbsgg}j(WHB#Ff9J?p_m_lY(I`FPfi#_&o z!g>Pg?&Z(`+d+7`>!;%F=7$f?ssAnR_ zBEE^J4Id8Q7`Bf%K!k-wa=SQpb6BDA>|WNRtYyqwnVb+W`5q|(o{0HZRsb|y7)3!c z3(is~EAe8t0~3@0iB+SU!C6|d5QhD&NH^Nil^`r=eH7~YaG@Z5CI`C>py^Xz(S0=!?H0xrMf9Z<}ZxT=*g6qBGtppti z*Bw~}KOaxH*E^#2j^ueq^1UMk-jPD@NRfA>*gI0<9VzvWlzB(Wy(1OgkxK7Km3O4t zJ5u8vsr8Qh&O362cjQX%$W`8v?cR|(?})}bqV78~L!vm_{yB0hs*{5mt;c<(tCS?p=>?rq zv`8@F^4%3n=C~W6x*>mEW-CfP&5kp;I*ap4VdAGGKKxzX`mc~6V?+vyhnW1Jzrx@I$9My6{Gvha96b|504ID}%FQ?MrnI}AWG49*Jk^zC98p4YaNxCyQ* zZ2cC>e??A$11_c)Ae+3svlVf1=*O{XToeO}JUj84@8InYic4JpcL0}*jup2O!(w(O zBbHdsU@l?(p7}&{ZB%3AUn9PXs3ji{xhcFU>^<&(xL0yIL%$5wvB%gI#0$i7YDVvZ ziT9i52ebqnhL94To1ysUGCoXx6SD>C)}ds$>OVBbjHQr1Z7v+nMx4`zNkBa|_`Wwt0o^Ug6bV;Wb|2wO-+MUg3^o!VaQePPiHK z87COgrBU~yrk4?Md-&(!Sz$izPuwdwPcu$%mWE!#KF!W!J>ye4kuPxT#6I z6Gn&Co1x=(qto+%7+4D(>&E$PRy^v^N8ym2(gAAt5*WFDydK^!8}&2g%q|O@tr^`3 z!%vQ{CCLY1=t)Y3PCc~=I_?xATibhov_I?0Q5zA!$E@!ldyS)?AerA&v_rq05kwb# zTj(E)Vl%&+!4qHPZ=U_g!K+4jB=ZN~sZ;BaY!HCyF6fas_TC>uvf?1M0%g@K0O;E* z{A1B1O9+E!leQvr9ghq4j+}b^6nt;Z)jNHk0+3|B3A;vo=Y5>M9RO|wR$Tk}V(90! z*(jQc0vaabPAGW|CD!z18W!RXAi`kgW#3h!e3G~e4qo{#eYqz96?q@r-D#V;Lc!tp z@Y-TX?{J5AxYIk_K)$W9lp&we7kpeuXh-{!~49$`@O?=c!%%w4&UV+KHwd`+dJ&@4j=Rm zAMy_0;~l=&JAB`<;olR(a>jQIKI2NH7T)UU^r-B}gAw0F#4xU8y+jnT;zF9j*N_i$ z+nEhyIA>9)k$sHS&U`B5V~PORk>m$clYfEXff!VTG2bJ;WmH|r(H5d5!F(iu_jBy5 zeo;s2?*Dkz|2p)q~1Z1&wLy?FA)x1 zeLq?p@~&NM0>Y9Qj|Uz)_xaQSp;4q0PWbSJ%Q};oU7CR6gAZK~6lt<@amxO49!HD2 z0p(L(XCkxf%9&X7cqkOjR-ZN^C}Cg2j&G9whQCk+n`k?;8B&gLHU;F(tN!n9x<4W$ zW*+$%eu!lYe=O{)5EuCvMD*V;j9}l*8e*Pg=7;PipQLEvO81qkiM6-sd1zL*3h&E5nEd3!!%zxTjl?|}!r2Ojhuc*uL;Vef%Icn>^s?7*W$cT$9nF^@=LgufDYDlCKhNVJ(# z&-r(#KQt2cokyA9F>{ENknQAg;?t;;k^hWDJ6FWK{^Bx*<_ZJ5SH#1}*_f3u@Kwyh zS!7AF!oc}9GDdu6HSD-{RVbuICP+L;el!B;;e{S!)lO}c7! z-vLQ<3a;Y#>At7GzloMNu=|&!VR-Cp(x$yT}o-qoTv>-hPnC(d~G~n_s{$czKseJ z>%L9{YC_^Y6;qnfIVhwsvS+|Rk{ckk`rLY(zDJocq2$9zu_tM#!Fj8_mem>0?83Q4 z^O2gFUNHQabk_Gg@(Q$hW=_ELU;}`@J7x9Ggmn5DiY<_=wO-K?uV~4U<<6^7f46#=xCJ z=m8_NeKW569Dj=?;{4+S9c>~06IFx7A?&E@7;MrLeC}_-UxA){zLq^?oWJFY!BCQg z+@y;OyDJ9ofrD>rmfeuHeGuDY*dE9B1h%8tj$!j-dlK6pu|0+DX>8A6dluVs*oLqT zV>^!Rd2BCW`xCYovAu-tWo)ltdllQCvAu@vb!=~7dlTDR*ha9O!1fnxZ)5u_ws-t# z+ut3U%qH(;#4>D*@DzrPogQ`r_f76HP9uxWJ`;L95li@)t3y(wx}t@w0rFVnjS(M( z|AT#k-N=q)J;KUozD$aVmx)rwdyJisGtjX*ps*v)t_-dpYJx*qOFDzj2TE9=sq(zK z0peaqCjkCRqZ#MC*U?B2sAjX@fE_yZ#%%dTGXEK1y>t%&+Fmo$qM$kskoDf^rHpM{ z+S^HP*9F!xLW!==7uD0920&dLu>a$RIyQl*H!a+k^3un|`2;JN(v4;fHK2@t9RT6N z?gO{KnsTsA4XGTQYx1rj8J`E-3KM@)D}$&Dte;nWXMwT}&UKg;(2no>liEW783v1} zJJa~4UJ7Nt+Ua3-n}8mK)7lpczy1-2LpcNdA3oD@ImwBBg29|&%3pwBsv9=*II@F$ z%0n9qZwz%vy>+ABx-oCvxVP@4x9&Y}-TU6U54?3Bdh0&&)=hZpPI>E2AFDgVjFBv0 ze8`9{iTZuycacRA4@QvTwP8oYqPY&vUpTVR4)*J8A*-G7A@c*~`j8g#b@DQzn_AEh z1UZug?ImFh40#0SWBxMO?LxJZ68Y!pGyzt!X1b5_?g!BMR|?Tb;DwUW0j8MQWe6$< zQ{BOcN03Dnoa3%@0TP(VUjvFPt$SPuY~W+>1XY{qega&YI0PS-jTXRwM{tfvAL^7a zyXvRm38J8iC=3`#^taF)nHHEc%!!|-LB8;jfX4pgv_?;xHRtsc(A$5WF|Ju1A%52e zlz7&vX(UtT(R4rbGXd*jWzc#*?_2aUl&M9sRtIc^3&%CX4Ef8&;0c-{1aof~&`yo> zzBI!cc^l3iubfs?r!>WYNpkm$S;Emw-3!_xK}HKL2-gcqD_kjTwPg_%Hb*Nw;1?b0L$@jDU#Z&o}PqZDTM5*4`F8+IpMuXzy*pqpKJ7QbA*H zBOcwoEOkJ*N(^bUK<{-?zQ4^N3R8s9laPn5_I*N@YvnkfXANRdOY6V zYecAC?M0hGaC5H~e-HK6;qhqij_nvuTHkvG9`k#v@zRsMm3U0=t-zzYw+xTPy`>Ds zy6WB%{C#zAF&@pmg?O~|=Ht=Rn}^5NUNs)udUNpD-kXg$z&}AmUnm}9`cQopl=e|q zYJ0E6<5j&^<5An&&S2~iH2i;xfgMMC|Ccbp@9xb)Y}EB;B5o&o5fkgjdQodwf1(%h zvHq3b5Io-N7gc<&4PoPhiM^X)U-jqxNI<-}UJRA+;(ND%tmgBL@%)%(vhZ?X>~lLA&>I37bdeOzzd=ia)1dF#IL)_v)%oAlP5 z_11mmt^3+r_l>vi-`=`!y>wmv#F8CP;eCn-D3B0@_0&3g4%^e%2C<|4*!E!qYYWaV} z-#F}x^+jE$hdle8vf#(ge}Kl}#Q?w$QUFoFoc|pEIbR2kaFlQlRqx{w4}>laL+%vD z*~y4bjcSj4JmOywmxVWmJsZa0W^i`;dBSunXUhD(gSIn>>)_BgF^fTHJa#aYly+`r zcC}EpfWm*UZ17(MXp0A5q7Ki%g!^+2Q2?jP%(THy8!sgB>hy()2X60!lFGs3Oq`#U zaEoYQ6^tAceivqIwHPYYO*NK67<|2REyry#R+cIC3Rt{(Fdl@1d1oL+F|ZIiu4(0l z+tbViVzs-*CNBi%!NY67xqL7Q2G$Cgu%e)xztE&sDGlaaSt|Y&iSUq?Uzy#InFGho zof}}{i^G405kYxeSdB#8SX5o9)|!EMS+JJdrdFk?>cuTB;5&GDJ@f;A6jE;JSQAp1 zQwc<9Pexp>U7DYhZB$WxW|rVF(_I!Oocc>nZ?wVj4FiwttvI#>$DX$mMpoyCLT1IW zl^my|#?nw&D+Y1iF$|Rdp)3ZrkCmZwGT}6rElEmEN^1r6eR)gaim-u0Fyi8I;h?+2 zL`YyLyHmC-*DkJ-x7E7wld01mtfwGo!bffqq{8IYC#5j?N?8v`Lmr6dx~nXO=>^$p zIizkxPyWPH!f0-)$yicY*_f(>*Y_UT3J1rJzC4ZARp!Fls!V5NSw%ycR_rVR3)9uA%34!WK83g<3ih;od#*WO3w3`jI|0I*@{kw=<&h9|+sd z@oqz7vq@*z?lBn}@hfhR#;(^i>f_<;b%M3wMv+b_lZcgCl^&9A?yB@Tw=N?V$2K%= z6iTGRRA-}5B9bVCV(})i0yJCq?kAGrR3a&WnCpmCU(s{(i7xowwkq6T#OYi>K*y&s z5ux_p6joQN4^I8QC3ec7o$2gE?f*s?zBLW=CVoG#2IC5y;n2~1_>EkC@|gU?}TC z4B6y*UA5`Z!3qyH;C)u#}9hLVZE*56Y3Y&H-23^xt_vS_+BB8&0NpmtfyF|ki)s9 zw09e;EA9YveqTO?y;l@g-nyiHqFYoRps^5ks zu}CF1K*=jQ$NV|4v`H-AquII-@`1zksrU<#+edC=cR{N-KEnUOn~JrBpVjg2%SrB? zs@}_4U9nHtfH$8nr~Jv&W)))OqN^+OLfX+QEfSN)-DqsISeoqZPMbng?`gLfWIBt> zq-Zv}WJX7QvrM9CY4Ef*>9qPL1*F~`v*o{8USag|5+!T2O5bxY-9-Ej>X_WvIq9XY zfO{t?3oNd?_xs3H=zsI$?xDYa_#7EWK#Gc21pVph95`a)%me2OF^~MVl_Hn4Hk(_U zG_K|*x80$)%B<~XWHN52(d06DtP-Wt?P{~iEqbfVYPA{kO;Vi;QlE}_3?{Bl+epYD z?j!D9OC_S;G~1$Ntx>6^*Th9;8(jGv`}YhtS3tj==n4@_#6Fk&6XHuk41+moTlS_X z*hB0|9`QqT7{zA^atnjp;zuqkAvt%Z^loK!37&xC@3x|wb!NWErAS~7_F*tnMk&2aY>Sw{f=pQG35p?`lRA6j&SsG={ zZclT&zC~}8%3N)7iPWXEI9oJkqr<4vNG%O+ok?bCvRPVN+{U(gnhLIigL!$O&??E3 zo*R0A9>l+e9;mTv#9CimYBX|)pcYT5wM69y}By4X%m*OMwmRfC=|C%5SdTFv;>vQQIo+603*+ByL04-=~ zTJYU6e1z=szx~`m5<&7-!CB+ZjquBTf^crV$*A!ZW=b=m|Fa{DVDg3|{|xA0DL1r+ zMK?4Qh{X09v%0ocQqW!kU%YX+go}Dpp;cB;pX%Rqu$v(ER(CLAa?Rk{d3lDatm?ul zc};11rMbrDmg~e$I4c!k3?qDCIk!x$YRMFfWF-)J_UI^V-N#=~>$7BG2J9{sNFxeG zdVEGAHx?z;L)hOBFNQqPX&wyh$s4CMu~=B4;&b8k>pQ|(d3u}L1A|Rn8$syd#X!Dr zaB-Np#AGb1tZqrIfh&$-O4ge@yBa}wpFjo!Pvb)mW}Q`S;bsh0&c zHyy+^?OXt&&b;{?9d;(q&Ncc^KG79IPV$`B|8*RH%In8e=sxuzh1#>$fP4Q3e>Z{f%7ZRM|mltXz#aAkb{O0K!U)+(+t zt7W&RJ}?g)YX!MzABe?81(h49?*+S11q_AE4eACR44yjr4W*#RLDAiB8=+lx6$`;Umc=QD{k{Ap)m4)j2TYC@3O_K?yL8GZqD{z$8yw|;T5o*WP zB}P?&4!@c~kF`vuab(CuKzy3_4fWbQC_3B~7Hw6#YbzQ`H5Dpn85&WLI@XQx)c5%U z9vU{4L4dREGAs1o-??S)9>GiSW_#N1;@}qFB@0_dk^o7p65jBY|YbU7v`4O3pG`lNaEGd`Ho=Wq6*aP z^DT~Q8un%iZ)I%?N0u}hQdOsyz{I_W$Eg8Cz`#96mh&jf57$R+rrx2=wC0xEVDRwH zC2=^-`r7;g2ig?DL8KPtVrOajVzart9gh2tZiC?{-n&dBoRb(c7(-Q5ZQWLSyeJVmR&OYExBCcP6o{# zr|Gv^p*WWp0S`ZYGy>9UJH#-uf9FDO@C`WB+qE*SphV{_ zFBGCp)^2TUE~AhTe77`UG1j!STi`@-=Q@~35MbixD`jdBJt$lVH{Qu}vsChOaUo1R zbYvN?HnUJ&Xpy^u9YEB>N7gZIPIV#NlFwfO*WSg8W|bBiEHW5$@>XzLkbpNd$g3*g z(C6K2ri_(jnL#e`ZBM$DsD#Tm9@{XtKvh89*3=!aEpl@%6kWx+-uKxvkCD6f9NZS? z8+-OKQW}sb2RY33f>1jnnjdA490|2^!Xuj_mqxr0VT*_he*oFDd3SRVIpTrYPu z=b)cA5tkBrE|h@L)W=5G2SrXG!ZHtdt$_&4dAI4{HuLk&5GIB`gOvsTWk)+WA@IRa z2L}879qW7_ZvPYmt65KW7zrpXeeGPX;>-`BY{LZe=Yydh`a@-O>KPP1)$!$e$|1vJ z)iI*4VEq#Ma@4a?%Oh`y_?CT$qm9T7zbouNVb!dss?I-e zFv|nUG?-FSa^9U~Q;9I5H`SNNyY}`ZkcsJ*#Kx4x9P! zU={{ktn&aWzv-ki&M;G1foU4rRj_P%JbEmsgyXAURzC%46{EOD=W}DBZuH}6$O71V zJrJWo$n1fL;n*wcD~LUViHk1!)xe8?4rCw901a*3LjNm&R;LnhtLyVcR07U4wy2l3 zGG7ZLni=yLn;GHSuomvSSZ+}o>R`Xi-b$tu15s~8Z4P-jB#w16M*QTAzeaCoY$h?O zhCzo~$v|@B48qvpG-C8e z5z71^5YC5GhxFonMmzB=q?_S@WFxcNiE{y&iB5Gu{^URZf8<{=~1 zB*4M#qg8Z%7pC>m=|1PK*7+wYMvJD(TJU0KaL@rD76RrUZ$=gG{#nV;=L#sWIB4$M zfe~W9%Qz+^B6YUYwG*IwL;ZxW5i@IPlAr!qfVw6Fy$vUSa(=q%OEkOiBY-2sG#5yK z;wL(%Jzg|HFu%O$eVQtmUj&GoM!>AsDe5GdFJ9vI6m`NN=e;EXykZBH8;RXvp|3D_ zjN2HY8;Lmf-taw)+gJ~=xXk4t*OGUTM6@lOh&mJbpUChCGv&N9pDWVXy&^q`ZVCfz z7SVYXv)e~-#U$3%%)A{)%l$Z*bxczzvKlJ?`WA33XxmDW?6#?dqO}xd-2=tnVcyl3 zOWU>t?ol-c#1<;oZ!-wu1Nv5dDvpH z&BwL?+d^!Mur0>61lv;LxyfY&^Ps=v)_)#}gu2sh(SG5;ipxnV5b(LbyYFL{iHLGRB8 z|NMGxB|{0CpE*hX{x3?M1Uz>~zH&!NewjWoucR=qN}p;jDYewrBqx@dl+uiX`f5pP zW?5=tO@pjOX2{KLNf0ZQ3YAPMQY0rPs}xd&LYyE@6eWri#R>t*j|Ap5sH+T_=5%L!TXE}lOQz9gmE@U z&U9NKCOl*F!ns^_GUX<;Urt3IjzYJAM5Iv}wFX79SOTdhR-zV?cr5w|b7DCW!y#ED zBfN`6Qtq2?ncSPM>5D}74K&d%yuE*_oc7=$iFHA-{^XSX?(2V;hs79A=tifVT;g|6 zt3wnjMEKvwSHr*!V{GaL7W^XVTnocbpRz*nC!>+`#IlX?4)mNidCDCYgWVmE9!B6j zH@*rZAE~eL*U=6+l~!v|X?-HeWn{o17dzKD#c-(l$^E1x8Ft^MEQNx?{2oH-D>-y0 zf$I1xXFl+eo)&alQ9j)8&IdGo5$x^_U2m=qI4E&h#s`-gQ8{p%zr(d70{wVGU|qE5jLe^@~{1Kuv~H4N@G=-g=Ja&KnzMWMqJuAXvu2CBkl$)(?dGNxE8 zSN%W48Lf7!bYi(iCZpBvfG=lmw}ma?PDGinBrTeJ*LT;ox0C%)cU!sES9IO&R2{jF2ZOl6W+PvoE7Bn$^WS0du zRU&abn$a`#_VRf|JhAuX(^a(4nzY7|iJ&4gIec=G0&e24ixv zukLZ(C4FPp(nLnDOJ9-wHnN9E_PPG9#HiHd+D-4H)4KDG2h`xa{Y(->eR?YCk|dNz z;#5yFmH(G0$Y9XR#J;%Yf+@%6+>3=CM}UNUON}@V=+(%=hdwksPGT$#S!v`Dd2j{s zOLPPsbR_O&aNZ~Gr6vss&MtW$pVhVP4j9Z$oGZ*m&zz5adNFjcPd|7`9H^OMrA#^l z3#tvB%jr;=?U;JXKG_o@Rw988zw;%Mk@(m9w{Uj}`*^Ib6?b4+CKc|P6#zRoE|%{L?-fK8 zHM&*w&sga19WA}|KtojWImbCWB)ABk2|pc>C=~x+bH$i~RETGA2))dxl1Tms4l&rD za3}nDEm0nzQTXv$bvXR++`&)ar)Sk1-yh8h#8e1y_abUZ2!k!j4dSgzB=9r9m_Vc;F_J|2Lku8 zcApZYC>12MRLF-E?~4{#@$^_ET>jWzEGFn1pEqA-uToc+r!}->$nzWWq{`YX z*nQnt56wnnRdV$I&la;PTyznqSCb-{kGOs-xh|4YqBO}$gUX=MseGyX=9ASI4*^I- zKFzX!ph0B%iC21O{U694{|}{QThVLl8cP7-ijz6Nd3+kf$s8E`di2ZKvVs}zyVSI5 zX=%E?98UZ+z6zY|@lcrfX0#8AZR0sa8$5d3m~cl;mDrkVc9_a+s>a%iQfG~{#FU?| z7HK6acV%^OP3CvQ9J>RygG)7 z5MLb5f|&i|YMA_Xlns}EGaeC(Zn?(fiY86aqlQ^PPd%3+B*+*NoxQ2t@ju4YRF}5r z=A^l6sx9@pY*iziFrA(U#SaK1i!epSU0I&)YQeA4{@%3ew$}P)RSBeuPCo`Oe>J`U zetvx{B1&gUb81a#B29Khy~YlM>eI;U#|FYFhihd{gEYSedq}79DN-w?l`fCL0jEr7 z9)n`eSnS@MaaOoZ@2)LZ>2fid28I*QETMeU<&E`awp@7cy3=Cle`Smb2lt=3nSKR^ zCF4wfetMcNIIvuMnpg{G3s0}0vOhQr(N&zBoL-SmebP87jG?eXtS+NwUsTVA`>R8REylX_Eh|>Zm6*pn2a?|sU;OuYEK5$5dv?SjwU2y zF-Rg`04dL%S&5?^n+GFTo;Jbf{~6`Nz#U^T(behd3auo$UR#ybWGG98vrXfRAnLDW z(NW1JV{MxzKZ|nfW>mmWiKml6$Qi#IV*?G=S~!t4p0)SBvQR3AMOLZL$fg{rg(cJU z3Izv|Oedelq~a7S|8kgoa&!SYv&N;QS_CN%jtL>D{Ir-tLSeNoKa&ET!a-_QO;K@j zVLKFu4J?Jr22L-6TgJzh?%i@m2@@}mEdvqvWEc$Skox<#46cERzScGI(po@cCp z-3=IZ5pEu5!5g=a{}I&U@vMa4)M;}n+iNRTX;syQwt}i!bzzRRr6^O>USqE;DHS=h z%d4_%P{bZvxClv5Wvo)>R?>Z^OM_iN{>x(v;qnFJ8zCj>bX#y;ucBg8;R`cOMuV!U zw25LI8B|CswX)S-Q=1KOuE3I80dMA?=?uI!vI)Wbkvq;6r0I}D*9Sj>E3g`lA380< zr65sjrG^};Ck54CmO-r0DoUU;XZ&5LRg5o(l=sKN_j1baAd>m5OFrQw|MCK=EQ`GS~`cCZ%|(nB3>D>JzfNHg|Tz3Flk1=5=0uF($`9JX2o5 z$NsV3V{S4(bWc{_3e?%|3&?a4yKPnpXgBQGITi|&%CWRndZk9AQ>erV5{SbJ^(a|VGMK}?TXCGMr6D$FLeqL>xB0U@PJ9IisL#!;wQ?=F9 z7s8>ay!+5saC|g}ynAVK@^8tNP{^bhv(xzwS@SQMCxQ-;e?74eo*8K?_wBN?iR=CP z2U;76JqI-c=qN8sfjZr2Xn5{rmszdC0PusnQ~|vCt~y2#906t=dfJ=@%m#$z-*Mt$ zID2Q&#m3_Lj*|kz$_~-R9^k2j>-@r+G7Ax$7ouSxi{o%Mxf5i#ztY)j)!CKsIgx}z3s>X?nb zM>qV4CGbbW&v4f#3a@CAC`6(wnzAxQS;9=a+0iESG#G+&X2)ztp$$Udjey!W!%E;9>8q+E=?V6hUCYw622q*tB9wksp&R>Gb;QC~A zHJPlKUV*5{CTm3^U))EJOcB|fo-c{-(3dO8?NH~B!P4#ev~u74&F>T4q*&y0Ei6VW zJ0*_)0U?Fsr%%65(_738dZVWTI@=PK&mIereKPK1!#KOEEDmB+ifCxaKG}7Vr}pNY zOqq`LhU50W0!G7cwzVMTs82Q5od?sNQz@c|?;c)EYER9+R z@lt}{KJ@fk3(ftIZ*+u%%oz$SycQoSSogtX~n43fU)?#Pqbajv+ z1Z{SBPjzxi=3U&Sr~Ds0mOke*^9epV!?UZ235Xc2M5;%*2_u({%$;wFhUOvjl?0V& zM|pL9MR&hO^!TEo4%lYX##o3NnU-PGW zVm@R)F_+ECzzUZ@=ZJa=CnB*5DpEkksXyc=l7m=G*nfBjok|51R&5s2p^TCPMrClZKh&@;~v!`1Qnv z17M0JDEAL7I@#fSc*$o3kH9S{62{le&#PA&#pZge$zU?L#rbkob4GHLd3q%CRLTqd z3CY0wY zl(SNtB;?wsZWJwt;#ay@@K*m=?cQx8e}$pHj0)hR4da8eW{N4s6h6vbHtj!IHNQE# z5KZ5rc9+?dUfq&g*xZb+gtqBX#;TGrvwXIi6!e-XXN*#e`kh7&u06`R8ON!eNth|D z2p9uzT1tAOdKRbA>X%_oGU+-wP>z#H-yV<62 zNg8!Zd#lrBGqx%f4O(TZRBoxa>6{IX2C1dF-Kx>rZ8Ez=F{O7bed5{}U&6@@a#^&) zDAd@6>(^`Q4R()7=ey?VW5k-+7DuDSXmzx#U!NG1hjj*oK;Au1& znhkYAkHcYw+c|6F+1f^pUDp6f->1yyt;Ls3_Imn@6g=x-^0{^MeZNjxh!}9NUyFjB zue=kJiCU9LEHl_OS}XOm31QNBOwERkLbt(cOwc(RsjuU$AcQWeXu#yK6*DKUC6#9U6X(Zxf9#orS}(R;tX;}Pn7$GSl!`DH_c{q(sMU+JJ-~=etW(@oi2F8qm{JSwB)PlR_HM?&;T?Ij z>wH$26~pWoEtHtUfYRHIwlhgK2Z~yt-xQRY&+np66rfQOrkw>WASq4`|_qkN&ik^M|e) zo6Tj^Hpunu29Md&WNLG0^wwsbt5MM^X|Xvq+6IMQs&P4-HeB6kL8Q1|zkV*m2D+fGM-u=&Ptc56QNsPGf(3Vy{saXwwa^hXtD zd_{oh&yU9Y2Nc3$5{4GGzxdn8u+igkD4NZ3PqW^jX>T&vA;X|_pbVu3gN714u=|tzSTI#&MC`Z-H41}N7<~V~ zrp88;ceFIxND0bm+N64pr%CgFfgUwFol%tRi;LPYrNM+^&Irz@(oZa+=5wNCmB2qR zFXl52MOVpwf=ge$>BeOL$UNbT^i`Fg_&)zvwtwg_Ha2RQ|u)C-$H{Q62U zorNUF(#>;ONI0oVRkB#2G3qa!g>>cKSy@Pl4J{s-zO6D}ygj$LCb?FYpWj$wNi9(p z7nYY9wVu?h3}b3-iOQjJ2eXhQvP6+mCX-8L!7L<0QL(w&T;(j@?r2FYcG_IhqT1YC zU29|0c2#wvTclSR(&UY0xt{jyw(=T-rEq(GN%D4kT25J^yvXHDFIFl`5}i2>>9XX+ zio6zaYlhmDEVH=ts@e?&>7r!0!rWA0cNv@8m3eAcfhV~tRi9%l*6K7$ZCk4%yOhpC zS~OR74rU>VWKeP{`u;i6kSzX@zqIv)QHb5_7eBM|tq}i6u{t4wy0FDB{sVm>W$MCK zzxXctf@tc(<$m!^^aWwy0$K*0oiA3ySNL|<-$v$w^K>+BUtP;D z08y;q7f^BMP0qo~=D<&b&7{@4Jnb!3r_s@(kU5MEa#O3Op+(<-q!C_R#vi7u(c`ZSOH1HB5WK(1KPqcP~u`L($pbDhUgHTku9D@A%KzQNCK zCFK}|pVlzuK!?n&b)kfpI-BJ6PAv9rXg68SEiSv=AoaK%(x&<*3*Kl@H0v?#S)q}& zdzxmTBfmZeD_ix=7LUG0ro?q=$Sch=P~?&XqEC~AkX9FSRS5bHC^Q`SAB&x7_ozHs zB1zUs|K~V9RU@8oazBW5E6bqBj#&8NSuD2sT@)AVo}V4yLauxz?q_y7I@v$5rp+@Q zqnbv@9Ezy4QDd`en&fU{qqW&#Yg5+iC6Z=EtJ2fzF-c`|v%A&kG<#ZH5~HTM$s~8T zJ6+Hj*HbmWTAtdbQtDKB$=c>Nr(Gk@bV$?7=3YBW@&C=*Nk-=$W+RFtM=nJd3c9+P za@NDH!e5Xkwj)i@`EYfLPf$e=h6;WFk*IAOMIK@_S7^2Lg>#xc$H@r)6URwahU+SUCsZr79 zX|~n7CAOAEt=Zu8NKgf)<|9&K_9&APD%{5fx$21<__u-RB<@mi`98iKu6>9f%5>-? zSupZV*NP?1MlD9i6-}uP=~Orm#aB>ufJY47La4Lx_QJrL!6i`l8GkiwJJg*PT3Kr@ zt8z9&$CCUc==hk&q4ErBO?l2N2ZW3c#Q8-=!5SjUnqDKax-0CpCfp`O1clcNg@J&0 zjExt$2!r<($u;T>Dx6J+)^U3XRg1N-gerjh3I>*TXTr8`yOzV}O9wbqrCuZ!u8B0Y zSW6AJS9B!r{k8jg7|HBRfNe#B^02A&4%AFw^0Mwl^nN1wSv4D|$YTN3e_DP;mMuFQ zjz64-V|iI{D=t()RUD>P81ggHWE2?LT0EqdZLrybNT~Nf+=_uLn0!?5m)~CZb*|hi z*v-tkuSG1IyRF;;#k)I}!gY&zVbJ>-KLR8-3+91uF>etZU(8zy>o?}d06f$g6H;87 z1w3!wMm~aC+caI)m0XbvkIuTv1wHSO_O>>R1JJ_vA$& z_NDeJm&gu0BWE?8;w#4(l12uJ1^li#eT2xUTz^ys%ENr&+qa_s{eE|OKNe?bR>6Kx zxp>N6$bc2Potpxac}rGzH%x5oUa-7TlBKSvLg{7H9H!+5;Vu(pRf+tE-sdM0VOo1B z(xM#e6XE8cj$8qgC(D?yMLZr!71GwWT1{moFtj3nIrK+iMK5M~{1j4I(*h^1??NJI z=~@FZn+I9!(&~mPWr2U?AM;28oPZmp+;yaDTZFtyFK);vE3ci}ZDu13RGz*p)>tAn z*Jo2eWlm>v0Qc&yRS>iK*rQY(Z9H82x9&_%UYZlAvEkzVCB^0kn%WrB>s{|3S>i}N`M2%qS?SC9xMo~|zqa+hizgB>X)Y5#+L3$@I6H=B7 z5!mPQ$tuM{0))^b~ zROS{{US>gY4%WS1$=A|4PS%tXh#Apzk^XPga1@xcX*BwXe_JjU6BNV5gl|77S7Fv> z8QgN+zq^O7Uamo>I@CoA?(%mW6U?8M9;piiIq=>yNA~XB+f}i{j2j1470QFtQIL^V zP?=rmq{>irSstK`$UMg>)+Ikh>pwFM$)du>)ji&j#aQ(B%@SRh$kDygm1XBAY4Jy_dr zD$SI&SD6bPg;`Dyqz-p3guF#PF);Qvrc#_*!{0cgqW0`nJRuy~!;f2M!8&ssMy=JE z6C6gRIjy!*(%N1lwWZVFNCjUWa`%X*~t2wrCUVyQ+msN?Up@h^;0wD_QZ`*6PvnVL2(bb`2$oh2BZVe!US~S|449}pUH31NRS8G8r)UZhB8fd zR&F^};lG0V2wk^sXlRmTQUIM-x1J3BZwoRx&Qe<;^6Inz3*A*ez9=@^?Qqgrb_EqQ z&vNQ5XxANjpzJbOwwdpxlz@fs>yyF=_lL*F0W0w1Xc zVwMHxt16?gOmE9QCu>XKUR&4YQ2d(k@2m=W zW{ng|e&R2OD?jH&h1hg$P;yh(s<1+fxT37Op{PO%kN(7;zc~1ML6#Hus&HB<{RKZ# zYJlVa5Ul1>X=TdBoT{4XigCF@D%WV`RJL{?TX4>#2Qk$Btmz2Ui|;C&?C~`l9wvSa z7`3PyAB4BE;T^cPlux^mv;8No;p2bNQho8`xAP)lUIs6j-9!my1DyDjhuNWNyd+B7)g`M+%5>2C#L;E&<};&F z5dG5OQA%mW|1PMB&xE4bo&;)Fy`=-V1py!9eQzxqU~zDETCLg578ok-UV*zX^OsWj z#xGOy66;QzkP%+P>y8Sy;8qJFy-br`Sq|bZ;g;!*J2YkHmf8wQO|(!OaIE8_j_*v@O(!rrT44FU?lqKlk1M#b>zf7TrRR2Nm}b7Z zj4Wy^H!-CAgEx=bZem*6>q}cwVb@=f&ko!p#0-dic~8NX$M{?L0roGhnC5seun8v( z_shUk+Yh?9ai|70XUQZ%8mpvcubj$IOv|r9`GQ3*50u>qB6ruluyIrnF|Dv7B{q~w z8(N_5_d*#Ii*W~z1MK`&9GnhMlT@vPV=Y~{0r)=={}UaZxKyw1vQQg?=9HDR=2&uTr}ztF7izNqt*whPu&UwN{jy(+V}V#f5Uj zTa_lew7LjIZKbrnt*S~aDv%WB{BMi*((Jp|o7vQ6 zQPvos?$skmvn9ta1LyTea^TAsIwNPu_@C#N}>Hd-`Dr``-8OiTI-&B z&pDs*9)2rsFz%DrVf3fXew!~lwTOLs|3dQMTfpjH^^^YD6qY;C$)1Ysn%^LC$s=U( z-o6Sl=HC8$y4;nMjsJln=a%)z^N;C!O3BGXBTH5TdF*m(jr7+xF^gneRqw2q*QO%@ zSJ2GphfRr0nSwloSKujmYswBoQJ=Q=>A~lh@$$y;Jm=|iXB4sh@6<4lKP_cGPa@y1 z{{BBM`c6``a(lWQ9X??+Di-+#kyr$9GqEcq@j`u16zo6~(Hla*?~l17Uav1G?r^pX z$K!laca6~?RiwnCx<*l*$X1tD#4th2a`;k}$;#$bafYa=@c|5v2}^FN;kV7s8&;VtCVN4C%3 z?5-Doy|8{EjWYO+0-=IVAZzB1bu}R+w44Xt=a5V5S^E^g?!`L{S9*wqd97m zZEC8NRIkgvnk?z)-9%0{VDJ3s%%O*wIt5uU#^I2={&qk@sWSGEUQo+q`I)kr(_1UE z5&n~vkCWDyDhtR*dqBcL#4?*S-r6r9{+s&QK<$lf#^6K4Kh9fCxEkVCZ z*8-f9oSf7cHi* zeQ_D(k!v{9i_cYFY52B=?6zpC=@OBI)&Iv3!*5ujz^%gNwuke zKER71YrxguvY3s!Ac8K)v(ealHKn65_t?-_9cUXyw%5qYM>73WZ<~my|H_#-w?eBAFRXL&kdQ$x8B3VZQl~OF8c@p!DLM@G&`}of_*l{! z-E}ls4kxW?RYP_LIRX(QYJvf`DRNttabB@Kt<;!=NKTs99;_sX|5x8EGVDf*b<^5| z#V9)*swCFG_ASeo)mzB(H}_YQy}O!cU{w%`Jfd1!a8}qdxrg8CTc;xS-*RptxBB}b z1=-A*Jz+s8dkkuXWr6;wV!kn;S2}rtZmm)2H`F&JZS^)L9nAhjLdlFq%$2>Es0L+3$JlI4+wFXE_SgF#BtyHo z%GoY~%Zf^d(56I48&o#B8xm%n;itC-LedG6MJ5sAphYM~HR zxt3J6K=1I?B|`$TcL|rxRE^0;-{DRxK3Bsa8(rLH0`2XYROY;#t{Sz`CS^7KX=u+q zz$s&qd;ZKpFf{k@I?D5OHHPF$`ki%l`mcfKiZnI(i9B!HV{|?&AV+!J%gI*u!Qy#p ztZ3^5i3mdrv}Y2isKT>OL=z}RGrfac+Ob_j~eb?_r=4=!MycwH}eW=Epimyn}7duPuPw#KXNR54J&v|8$; z#%Q|)vJumUn8M1k3D5hnX3my@KtE*ozSYAms^J@hP%^K6hO<0>{An()%Km;c3NGiB zD$J0#Gw~zjhG#gd3WP>}J8As|S3-_H#9cm9lv3t4PZilqTIOa+k7AJ&(g~PYhwZ1w# zUS$1U+j$5;xz~}6*P{~g_lpl!P8j+R?(eOsu^Q_|E*{^a3!*R_RHux-2@3_yI2;W! zAL0(HO=$}|0-8o=T48daeesJIxqQ<1$^JEX*o9hELqt2QtLSe4%zZsZ2CLt)X|#Ui z(6)4ku??QVhI%erzn+|3!Yv~YpWv*dF~E`%E96B*-L+8@dF%@G364FfowGmpyB{n+ufu{mV6D@lH&V5K z$mr9QtLIN+FcAAeWpPnZ>Wc<-!ylCnvB1hZ7j6|B%`jYWnOjKD1}-#MZ{-${t=A=~ z$Qwri!aEf1wQh%4ddyCSue1Ot~iBYO&^dz<(gUO#?Y`1vw>Q*XrDdEOo;n4 zkYpXO=YM9f=b2+Yu;!qQ*N=V)wEFd%2PVft0(sVKNbigSA>&^4}!+cWqd&7aRmZtknDJxI! zb6fNhlTqVGvkBcRy~U2^6hc`#e-c*Xgk{>rk3erX5ODZae4`~|*Wl4I`IH^%;Cy}3 z7!>=_rRcPT0$N9#9PKWb!Co)6{u>K=^SFUl8Y*8PcGyUELF#lP4`FM}i5S&VuZmj& zP>OHRbn8PC{6pLU8xL`N6w{-LLMAH8k;v6L_>nfXCFygRY-vklq`^TtcW>vC%T5@$ z)7uldpqU(8#VNl?g%dFtmiQ3lBxr%thAxhSshs--fEDC=ifUy5jgan)*@{J!ggoP6 zF$Wt-A`p&c_f>#&*AD@*g3A8A5OK-$?a-;bZ+qEk7t)=^XcNT( z?c@}@Ki7+3UcI(7WcEUZJBA%lPfm3wYv*G_b*<9_XG_1Qn|=?p{1#%W7{I$==0Y?x zH%#DNFvrewb0crbl)NQ$Zj{3%;IbXHg?-Bo5xdO6OpVV-5i(QbSog+Ka%}Fy<>Y{D z!lcOUAd?jII=k$FXw2W0h=;pGerFminusIrjwfP5aXSEt328X)ONXOT52}0Z32!I{ z(*QUrG_g8J*@AnPkU9S=;ToL2elF|Yh5Rq)ryvx{;L$P28u{sX$?gj_he3PrUDh2C zUHc)6!tRQ<9T~mV&e{aP2!&*Rm5X&oU7>FH1$aYgQHRvoowQ3`Nl(;chX}MF5fzG4 z&TdgS?nwy)A)y_hbAkA4U#tV7%-p&$bu5<9x>mGtMzy}+)jY|VC zkNQ8|9A7L``a`in7r1ZY)_j)3LGPw76fui*|d+U51H+d)E2`HshJ#HhK4k{ zM++g;F7(>8jZ`c>hr4OZ?7dB?-1KZufA>xYI#(~ z1Fr4U%d)3DdbKy^hed$3M>f3W3>W_3y!Sa$8g1G{)$x>^I#gxU`ZKX98GEUBCi$VE ze<_WWL%xVoMDBKM-$E+S4E>PYB;ah~MvrS#ee2ZOuLg!8;j-x4+>IIvANW%0=jTvxS@0YCkA|g%!EOm~X6L|f^Cx`m8xJ3V zV$6K@YHs#xvABy-YtaG%$2wv_8(WUv-sQX@v>j9ILK>Cx&HQ!?`N@mpQ8__WekJYE zuOdB<94IEQJk2rAUtI$?S&o@4E<(X~>vk=4_HH|G_H_Q?M%v7fVx=B@!riRag z1lMW;ffcYR^iAzF@;EQda-wZw0uWKJw23Shu|XY(#EhYU&r(0%p8^aD3bGNavmp|2 z1pH~#u%%ZR;jXUW2rvvfjpYMm{N*D+dsQ;>Y`1rOZ(+aXUyh&t8B55aD zZ;4K?$kCPd;?Wa$yFDFUQG2+{Ed-Dr>0lt-A#f%Gk)T(a_N7vS&(VQVmpM{e`dL2k zlEHWTpJdINF@Y6ac|IGMVGmb!K@ZRC9%lnzlb!wvuz=kl5Ue6@=%qD2VX5&5zo%oKMeu zV zn9&D3by}V>3A!7Me!c}Eg2`+`&(vgY)(2FL=3vs~uym7eKG3^ph9h9hZ9wD(1zSY6 zu-S8f$jyGHr%hr~WuTII02jqwep8UHg9d6ksc2beX=qO9i2YZFV*_vWdx~k<+h|lL zXqT;miW91V>H%=m&^h53e#|p2A9(V>9c1h3gK!Vr-Xo?x%*NVKo1cCt(|)P%RtEU( zFqPR2$ilr(b0{J%_Bk9}_WHgoAZ{E7$LVtWWpxOBY}rpBr*`)=&alI8C3mWIU*#fl z&CVo}AiZ5{vFTflWY6CY)Xc-it?z2Lw$M(3iTTkjs6xi1Xj=-nw~*b}SFRv$Jzd$J zk6T9mlxDBU57aYAxC#dPUMMqJg%Pr+1=y(L-vlTSol)A{5;*OxQa=NKXL=waiBMQ$ zw+|lwo8>|Zd3^9wt{N{EmmPd(8>!gAzKL3-kf}S_;|?hhBrUK{nPR84I!o~p?v8rw z{(s9THcu+te+wD%hghLi2FE??5y z8SaAXRzT#Iq&wR?Q8(^(C)4rnxZf{GfKWGq`=k>hVmGF`Y+-{@FK~J#lCEZl;%f&4 zZqT_UgM4N21p(57Td(>(6ijJUKz8kVXWK1hSB&fVeDZjrWN`3~$5;xo)l*sf`4EBP zsxrN$L{J-Q{py7}bx5C})o^zM;)6z4hoeoww**{>3nEr~qb;CM*C$YmuwN96gLt>h=;n~VL3{Nv}C&E?7QGmazjGnq3FXSW-c4j9b09^|mO zW{b-Ym@Xfymc`BsG=afH``ZRe;NW+)o1Em~Yb#d~-d_$~HSo)RsHz_C?tLbP*-H$iw_( zOM)D2?Puyw1;a;I_OE1d%xL60#WWQ&TfFF(hQ+k20qxdb8HDp7)v9j|_~mqstW)71 zxj`V0q+MwC|E`(oH%=uBUOoWq!gly6_0)j5ap@7mtO_39Crg?v6imQ$ZIM$tLlzX5 zA24hrd-wEv$WIoqXA$iVs8r3olRdHde&dcl>EukR?0lKbO6zmUBpkHnB&PcAV<}P@eSh}o6uc+bjFFZc^ntn*Muzh$g2L8C14E! zpxNL)*VS4EzRfw9@l4t^vq|}>So@?7e-tE49(VRvQXI3jBQDoRhgZZo4Xl}bvyJah z>3s@xzksCXZvr2H4(Bpc00;n=!&%ots|fWP{3AC=Jvk8@6BI=$O>XaRxbGJs0cub( zO|99P)^CK>Qc53Dum+ly?c`Y5wx#sxT*2a?n`JOj_7i4VPzHN6C8>HB=HRadU~;$H z*E^j?HTr)~olL;VY`umtUNheaV% z%85P9SutE$!&%D83kXSN42T`f&|0$f5Bm#>>>V+11IQA1_GOrhGm=7JWSfAZ02jeU z$pi~Hh#x)fX!e#%n!-$>hw$VuR)k`)lmY@4lVck>dl&LWsH-zLgY4_i0SmSU)`udRzl3D1ufL2I0| zXL?)2pMB&A|9YU#(AwWv+B6|*{@eZVa=Bq4w^(inD1E?ZVq@rTb_C33qff6l3pFC# zxZEAp)bqQnLNC}vfJFf@<1zs zGjapvvABY9Tg*hRD5cEVaniu`IpQX)DzTyMYFWCy9Q!VCDw&h=;Ts`dZK%1`(kqR15VKr5fFyvmih(;mXYc9 zq*MCrd&$1Hht|`TrIM6wIs-WP8;4Sq=sAsO-sEm7Z@_ZdXhw$^kV=6y$RHEz7;{*H zm3A?+@ze(VLUP}NgD;Yk-#!2$^?uGKQg&B=K|zN(?Io|hi`5^ygi|JzYop|Y+xCCX z2Nt_TFdu>FIBa4Wx1DU zXx(&cX~VnJF;U63!K>%FSxjm=7@Y5h-V=o} z<#F1{@k?kOLV?;ln7Z?b=}rziTX?7-d;i|d0Az$U4ndH#z6^5S*4Xyb+32;BJXY0T zTwFL z2Tr!IOX)R+o4agIN?MqV{-@*`Lkd5b%L!|c@3VmerD<@HS#JUMh#;m4?-wRhE^i09 z>QFw?0gNT+*Giof$)8l)zbKx(185@kA2f7v^?0)pboR;2M0vt=twh% zew(me>9)#=Zd)(lYHN)@%PxQ!ZdkEN9H$@=7xP0GG%8al3Q1kvZtAR{U;?xHsDo$i zG<=4|#y$`CsKa889s>C9TOvsz;l0bLK(=DkG)oPH-O1TFyn9dod{#MM3&xKX4RV!U zkVqIzUO%!IisKTKmK*w~Q9hg3;V>IW$$R_pDFMz38kKm-!6S<0SwfZUOX=i@Ts022 zSp1Ke6I(a4?_zYhiFRYjwmiOIu=Di|c^|^#UPk?hOi;m39VI6p{?RiRq)yZ@g@Aa2 zQ=KNAANFk~yF1wTe>F@-2vjIv6W=aSHQ5@(K6S_oPPNyp7U;X32z1OmFrfqbTrogx zF++eKm^z*FZo|TWD6d1$*=4OHR{}qze z-y3?lR9VC*1i{%oyxBH~p3BIt})UymGX*NfcZ zi?a(asM_LjG^EMm?*`e$YqJ=Y26YfXX}DYKm64QL>20@SxtXF|KKK4>M9xB6F8FyRsgA<4`vxI4bjW>$5h0<9-<(LwOC&S@sB z%m`9W`RSCxGgE#_D~8XN{JwC9hWZ#CAKbHVE{j2AGotG;0dQB5PbHwcSgiMuP1012U3Yp7gC~_T^dh82|g5y128QV3;p9=LrbeyqY%Vo zl9q-}fih9wB};V0Ba>(XO)bTW(Q)g%9qPh9`5>V3&zR8+djpzzsDp3h+SL_bz5B}D>#bD zda0A390j4cGbND%RM?S}iltH~5Rc+SDrARrTig{-w?|zPaWtBgNTo5UNSwBZV2gN8 zX{@|XP$#lDTb0T-jWVi|n|%%?A2KU{cpD-7Uy7%bA1t7;@|BA9c|2)G%#j*De2JE- zQ!I4B7^?U1Ll?%eOw`slkk-W|{rN)3)ywZ+$NDgjhfNLMU<16`qJrI1igr`)>Teen z-yGP{QrLI#{e$xVeRJMoviBv`3et0v0;Zs!aeZcP)i7?=%aaY}B!Hi|Bkb&g(Mx-$ zFCI;bLcV~b%PaIJB|?8!B-n*V&(&oYd6I&TkjoRYiyR_I2Q#u$^3FuGULln6t?6cy z$mUGA6K#4v*;C5dI^L4zkBeb`DQ^go!{MdBRQcA<+Z6mvo%)^3;J&ynu1Bb>@TR&x|?o6YIt>pLR+HkrONByNt@>cXGpGiEpC ze<)j$5%_@}rPDE3wQGp=jW6~ULlcGH^$v8|sA|dJmOFHL{lov|+dq-aILtf7dGY)b zMX8k8gS&m!7F0XlKCp&FR&a*D;vTF+TRq})2Q|PBDFgO^HDOb_XnCR&MH~tSgzkwZ zm()U?qfyhQ@!G+VhQNsu!Wl6`2!t5Zd_O4CUX?r8l+w2a{Q3rc4E)9@3LpP=F6>ea?)l^$_&7%{d!=;n*lvEFhfE8U4K5VOzSL?DA?F&A=Zm$RFMp*BzKDxT zOhof(asOnth`^am<;o@-1*U>XE4}jiZh5`U4|3Fv>=+s>oH+jb7U?Z~7%KKF`-_X3 zbPA6c*@}d-a(L)nb{fM;xCK+&Bm#i}B~@fV>vN6cr}Iaaj#nyoWoXL{l!N9LG*ah6I+$ zEkXGClaQ-GXvJ$6x1v@6lGTJvuT0x!ZdUV^Aqqdnlota8+|ooU-{nlBl^{b)!f&vW zpAQ@u=X_3|NGhcakEI#$kdyyCRz64Aq!#LF-y~!ARo|U%ZVqTDsrPt}Y*yHfg0u?y z+1!OxwPaQaz<5sMI&UIMS~oEg9t(%jEt$qD<41Efa8(jMkgeCED7K}yc{)1uJaaY{ ztqr-PWZ|dHJi?pDuE^NEcjE6kSsSNGlrjdp@j_b{ zK%W?MeH+N40X=`7N@6v_+EE$6x~o8yJ&`tAcw)Q7{O_#>>s!tBfqxnn^{;PxeqFVw z*>jOTNaS{v2M?ga&g`TyufMyQobsMnbhw>U#j3XG<7NTB*{n2o+LdO&L?cO%2mAo3 znN9vA)Idx*0VuSyN$Zb#S8T|DUClvjkSDf*3Wcga6o!}~W03Z^@40H#ZJpatyr=sG}uLf3hai&+&J(O+z9BqbtbvC%7|919YYts@+0w9pUde%_Wt7?rz#&TtOB;(%YJ8C}w8~ zM9tvy)t)jz%K$*)#FuR-R!r#o1)ZQw1c+`=&jPY|zA;_^8I%O+IoYqEa2PNP+L*C7 zF=HQ1BvOs7!|Z0z-3xg}zFx(kOaToZ9kbK!|=RG2F~p)QABP zMYH>TUwG0ueCv&6cat)ApMktp@b0xN*&yrLTPQTGit`&BR88BL5q_1CEiXF2Lio?( zIb_RUHlo?^JH_(h10(Ez(p_GG&>Ni)l?z)FDrFSmCqjB}o8Q)uXi!I+$FVX?N=w@FWHNFpT?yRm zmrL@XChdU7i+$5w7fMoIdl8%e{bC5>YCkN#7EnDR|Ma0h=8N!ukljUZK2|uj;HfD^ zj}|;dW2GkwO77pdLj^17A3^k%T0!#$ADT{vex}MAFbyMMx{@{EWzV7xi;0_cJDLjn zwD*y!`|aiAzw)dnyqY`9xh3ce_uJ ziUvjYkVM?>b$2F^U;FLtNq2`gno4%Wx}sffak~)i*!Pxg8r=Kz?^uh-(@(QOr)Dt8 z{0t_U8q$A>1X}9E(8>t^S$Rfnc=G2ih@t(j%M3=Mezo}8VaEq!%UGo6cV(qa%KVEd zMZcga^G}d6uiepD*k`zp=>F_y#;Ar2{a95w=|E-b8pHm-6yFOv$qQwVXJ3^INGEwV zJ)Ka!kw^jwe*z{Vj;=&|$}I{y9S(8a>Gj!TUesJ-zI0c+JLU~QG}s$q=$4-wsC*es z;k^65q@=k>DwH{${K36{3ttecMOuG-0x{@i2K}HqR1V7-zHqQ=zl_BlaPr<9eEvTg zS%S>S9otwmTr}ipn_9G^p|DT7mmGiogK{$T!&6I1Sxa(tb}$%L(cbra3rX3_8>bCk z{NwNDEgOF3VfK%{y2bo-Q| z0@m$xR^Pyy_FmhL)}p@J-dC@rTGmi}=B7B=!TjnvOp`o`(y%a|j!UJXNKhz>cS@!H zbVtYmS5VY!x&^{uz$^ATL}Gt9?yx7teyK1#p(IviiUw1ab!*h^3U}O?NKKit zR{gPehqkEi(%yGSRn?CtD{6jCy0RoL4okWnz^Mx&T|u{<7W9Ovh$!j|h2q_*q#)^r zVyq-Bbflf_QD=K3<(;s$i`wdCwKWaxX-T)Wrj_3rvvwpzIll6u&-n(3{~7Ib5jbfM zp=VHc`?vp5Id8M!b`~&0Kd3egUiyP4^1xY!0blFV>bwv0@PAlv&HIdPz$}`|d6?#P zZ#@Tj;CgiSHeAP9SOKx4&x>j}%w}?MCAXaVpo`)y>x4As%*I-z^3&$^!)3qe=dh-? z0tM$YSdvg9QIR)}4>ePHk5aPtZSFi;?>02rBr&ojwtY2;+`9k7K%%d{up8BM;D|?o z_u2Xzr1r;d+dq>gg|23E8iZNZBJk>udbwATp_`j8&o;v{XaEisPd2JBA0t-e6<$cU zP_WL*O1wYnYZ0bs(AY}b027pAJU$=D^FM^Z+R?ZBe#e4tW;i@{6dx5Rz*4CI}}$dlY8eG*L)5(eIc}T_OmDIh<;8!bRzX_AJjz2 z!ZlPG=aQCUqME;L8WFtBUYI|w8M>ZSR`jnSdmrCFyFAn+@(SoBSVZ^-0zqvm7b0_0 z|E;uXJ#Rwe^4K4+$yTmEI8mX7_s!nfMVXd16&YPt0ew+Mez-vuvxICDz}%PJ&{t7H zo7;LczU<_2yqJxaHi+srYxWAs@tp_i$gx?6iz)hjCT*oR$dzhnADzd-67$_IIQb3A zU)QlRo$fDC9zED|PI*+l>w|5BK7Dmwrq^vXROg-Rbvuv9U&tUsZy(2sUUfwNz08^I z<7ciuBELU#COLlQnj`XCGH1NwXL^pv`!i?S#?SPE^pH8zh%+Tjxr#Mq3X3*y{#^2G z_YP%Y--iFn7>bdjHSa9XuGGx7_ch?&Qjymg7kXXNXh;;7i0v_nAmx+7HZLr)OPo@n zr(N0=6{J&e#0sPC-eGsSGs_%RWtc6itMl6VLZLxe?{HzqvN{qig#Bdixgz^N$NLiF zGvIKM)4~3t97p%=$nBXBcGnZ{Y#aQfY87ibS*SH_W87N@|AyldQewHMHltK=;o)Hl zT2clQ7qx}80B3x4QB8q2ZUvPd;;ay(w%PS*e;R90g38b6Ln=R@+hR+QmrJc(_55y= zQ3?456%}0;s{saw$fn)UFkdeL9aZb_i@|IMt<3LFpqyfd7WKco*8D#V{$`J>G}!#u zhpxbXeL!eG%OJFC#%IemAha`QR*#>#7Bebyregfew~xr9nKQ-XXRbRUcV^D~MUm1`w1oXC59ub0cu(nKQSK zpV@`0c!s%(?c--|!c}C>B*)L7p;oEAGrwXowbA=SZmCo(gJ`G2&XYKtJg3Ai;h}svr*XMR zz!zL3kk{2JBo_(bHY1kQTqKZ)c@m!RB8jYCrc^3w$kvC~t-5#SAy#o7imrPeURPNm zk%@#np>QMY(?w$Odb5GI-dxX@N`^aEF6=L%kdHku_tR2KH}-VK;_c=`Y_k zEyL`y8XTX!`4;B*Rye>h$9G9E*Gskxz=fd$o!y4x0cMh|A=%3Fn&3xQl!|Vui%*hW{+o#T_=hk8^my-wnPV7D9%cUS$h`hxi~w`2&m4aTBfuOh zGRKc#1ejw%=J-(z0du@GbNm>FfF8H9bJDKz`=%35)N-(KK73tKOs=*}epTCPW#s8S zik%Az`_y{}J71i`T1fU5aaNJChS6LO%Z$`D+efF8v(nM^B(h_qXt=a-bk=wZn;EHL zn1>(FCAAos<~*K|dLgf1obAbXewLh1-c>lcc3~`KpOEw!n$v2t)9Xmt+S?UM2e?`-ohSrE z)+pwY%F?Q-)mWIPd-Rd z`thI4Fbr0HzYb7@hp(y>vWj73L3=TYf2GsLJg)a2ss8d4EE`73 z^*!?HeFvr!wR=0B1Hu+eHA=NYF;7lBKjkhT-ts_Y32Oo4@neG~of%kI>M5e}>3B_i z7@wHQ>Jh^RQdZ5aT?_(`vfUz~{l!|EZp#fRM~=xvPM!rPYwrM?m&J!~BIfOV%P2)_ zF}1XEDstQ$IU|wMKxI=PDr9Q(!rAab{lw2`t zSW6;LaJjVE(%^D8Q;|yrjo{_=(YE%Ql#4c77PAUvBBNhJPCjyA(IVi5f$Zm-%xy3M zu_QsM;*_#pN8Q(QAnr9b*m zVM+dLQ>L$&dQbjqv=IJ$e(`?Ajw=fLR{VVMRNj5ml;Gydi_QfL!>EH_o(r{@N<3Xt(A;JT%Dj+~F-!0Xc9afcx{$KN44oOk)*7G#7&{*s&Za@=_a6S%j>~bm zuVvbE6R(!wY8mk$7dbmG`LlC_06j3qc7(a^cr#*}_}92@zX-M?uBbDp>NfaPenX=I zs)b%HjynxLn;$Ir807|LuiI&0O*spBtpfo|J!4O(~?8z)r;m zz0R1k5%^Dk1W!tn7&1W+7*P1kg7!2tzctwr1F;MuwJtA^=V9muXo34p+kyXq4_iBW zRN{n-CvJ1s>9yvx3Dqf$9!_tc6%?3BmA~x`xZcA|CxF$!T{&T4`#QF4{|^R>rBrCq z3?>Zh12*4(U=ipikO_4ymTvDvJxQw)TNa^@s9KfrrP!4JAP=-r$^iM;-K)=pdIUidTIN2eyN^gO!qsf(H zl90`9JvEdBIjssCZ(Fj}3Z3WdGlCtM(fT*=`6@9&zR^*jBb1yw>F=#3L(7H)bbs_F zU1|oT>7XxGw5ZxVtzn|OADtLrajwd8?3NJm>cdxDG>M4#XE&cO*mKCXr}~zj+jQg; z9<5k_rwI@$Ipd>6Lrdln4zRW6+HjOnTlBZhk);az0k*o;|5lepES1mx4$ z0byAa`CWAT2D0VG<`GEv4uQ{jcXAqe?Y;x0nM`i5poQsP2Grhm8M(8L!*nlyGw`2> zmd^%|6u3<#TnoL~iARExAxRb3+LorMBtT=jI%>B8i40#ZOwvKflg`MVALF;%w)ZWe zsoQe$mg@A93aD}zzfo~ugq_-pO`#qccuY$nM$XW6!IBIfzdD^aj#Hr`jWttPH8iS(_i+E4Q+Jq)`W9U` zOxUuG0Icj;vVvT5)$*xi%m134g-(&q+WFTGx32!qV^bm7wWPX;Hs3F0w%k4YMg*j6 zV07ld8)KXz?B|Y=M=)gfp4m&blF?~o zeR8ZK-`@m>&Yz6VrhIO@GVZmg$)1`sj1ureq;+frlGHyLU6k*D{^*}#V`AE1ha~LDU zTTfcg4)MtC`$pE0p28Dz#T`m#_E+I6uuJozO(A)QwnOE$BLCAGJ4|-^oz1lCuCSQm zd|N9y{x`UtJh$V_EON!qahvy;p#jkPG>tdT4waGH3jvDV^up*ovZazcl@f91%{Q7L zDPU~Sr5TymS_Um^f(S`hjO?SpzOYzhtS9>dqviQpqmCRqHMS<_T{`}fq`FSW_p}Lg?iz1xZob-UJT9k5 zFj#fNo#UEnlcMl0e`RCe;A`KyEl)N0((8AyD8J!UDfz9YZyW*p?5Ps+Gi{%EHs;z7 z==jp%l`CChZEI^_lE>jCD^%xc_eUVk(U^pF&rX^>%|DLNEV0CZIR)JLS0)&t_2gtZlk> zr@&8V<7RT~A#MTLqT!Ymx_z>)CbHzAu`T4l&eMGpo;f{_JXbt+aS1ed9L?QEshV8> z)W~Nic#+*A4mE*!y7n|k-QW$7NZ|AwDp?ilN*dzi@Rrl?!+9AO)AGMZ9xQLC6Dap+ zHfZ9IfY1JGj+D`YiI>zJ1EN!%URHRoA zp^_&W@dJ;!xR~$19Bn4E*qCjaFrA{y8EK;#;6de%tn$vjn+_*r|ZP@_*@0*I-#0fp@A1q6SzGW{~Gv z&#cIdH!tr5n`I!Ecb}GGNq`nsppFUR&wG6Kyf%s%TU5h}vn1dC1Q7 zXI7KTemUkF*BNQ9u?>H#bu^KyR?v=FK6+%dGX!|4{Df|fsLkqdORd6iyh|vQ)S5*} za|{HYY|E@1IPA~1iNr$EJN@*Ee4Yq$i0GNkV0vaEx7g)&yMga8oCr=j3%6di@ov(4 z<12>2AH9z5(C{yJ9bU>Bc3E7^R5Cksq>p%2*c@Bupo?|U$T}#k=w;$fn9*6`HSyQt}=`+7bA0; zhlbdxw{K+`2WJcpu=?`(d+PYm;pj>SK7FZr~? zZyxJqtmg5MS;m&nk#;n9dJNb}WG$UaMWDVmZ4hZE+|k)Gk@T};QA60jA6t>f=MmO# z*yCg2vh!pT58=Q0PzK&SX^BmMXX!G-9i&0ZHVnRhXI|d6Jb{Sl-d_44OE6%(w~cK1 z=2*w)E`{JyUdMQ>ZTcx^=Zc~}b?+WXQ(ZoC`MKH&ZKA?FZq3*e6W=>5x_PYe{O158 z4?w(mOij^~ezN50(dBa-Uc1~P(R8QzIwjBKl&VD{zX{NUt4A+EEVb6m#8Oq4DlVV& zA$|VFjeX=~5K`xg?QH#E>E8!fKuDsC3`jh~cZO_)ik$2OJ$}oX(*<9rfo*r6Xe5od zo%o=<-cHwn>>6Me)_e6Z|6SXM9Q?U69P-gEqgCezH`B?6{Ug;x#UF!7(a*;!7Ij-K zu85T{3%V>~pQ|AdcLZcH2VdrOLfDz?d0}+%s+ycOxy@hCb6C8PqET2ZkOp$qD;x1f zosK8#CfcIWic&;LGLK#hA^R|?Y#4i+?kUsBF~JxpJiW~YSrj0f47HCI%t0g_5b_yq zq9_v&*)=U~b%cFz|02@!;F<4{-K)7(v`Fu>uk)qo`q*O1T`*!9eHe234zlmg6PJ>c zk}(;mn)oVID~b`}pQ#~s|LCeYdO-cf^v!hwI$%bhI;Cs}2_X*2+jF5u8bJgs9Y@Cm z(+o|Bp3G^C3_0-1*qmAB23gm5JR#B=n`p=}hrD`fY{{zZ&^LwjaaV&fI^m^awNEMY zn1pR@Sd{xW&&j%f*(D;e$Kx6pK5>Bp0G%O=daoIeKFT!n^7`{6vcb*=AIU?yK#t#d zYBNIxcymh8n*e2${j#X!yK{GJE$q{s%0LVT{!}K(&I@4st{>j=US+BTl`45i(j!e}BL6DFPQb`)DX$06*s@wQI* z1}6}|Xd-QKeLLT(hEm1(oog`L%dRO~Lt2fTsdEfLkF8x<>lLZ$1k!{EirF3Qs3Z;X z6IJBcqdjZqkGHv(u3rkVZKwYVtj9|)S}NcPz>oiEJG}k+xP^06{5p70D_h;Qt(_iw z%&i6oPa!A!E>~NW zW50tX<5@Ln904)ayJ_rh3~< zpKe7Pud%BYK^vr!7m#BwkM1L7OHWTNRB0T-CSrejWL}8_&$_lQ2ywEH>c{4iC(j^2 zI(qZzy=1-TbTL~M%fw&$fGed4;kERE<&!0a>;)A_oQ&pbemm_9)k^V?++6LHG(l5$ z6p!n%OU8E5s{Qjf7VYGs>P(1zr*!;!_x^AKVT9R9u(1li_@XoMfRu>`#*re-PW-6= znr}y+J{8EIW+)%#{Jj%c1qu`aoJ0OI&KhR#l)0r2rxTHQmYy)_hQXH&9_(5NoCp@= zTc!HJ>f$}j`pPH!ep&TLEVNK$_*E5C5`&b~4+-nK6BX0!Z5kdkZ$o6L|Fo2b+y<>! z(oJM^yYn2i`@=<+am8rE`SVZV8`>93#xFb%rJFaVw3iPzc<1 z`fAv_jg%C1C=#|d+{&j%$`O_cyh(F+P7jO@|9J`C=X1kliWq z(~Nm*0kx^j+1iJtPWt4?nYB;p)JoJXRK{R7Ie8~gI-dzH@w-Y((@ufe-vmuKWDQ%N z9%(8@&gRj|o8sh#mNSdVtIv!K&%&CGVAd6OX`AJN%u^(zCie?U+L7M-ox*Azk=%!e z_?mB@xN~Y-gV^Y#uPPo}i9zHiW7Pr;d8%#T|7e-aS9ayXGq;{ z$M?!#9$jAnOIxSSn^M!!sO_LbVitEb^J}u(-4gO@%b8wMcHM~*sm+p%I`EY(wWtEqTgOY)peOWX6&fxsPWT$ZTyZ| z+caVPG*b5A&_+`E#^@RjmX)MDkt=}t+YMG*(ZHgi&%y||D~PV!>-O=r2dfj7R(k!5lRw)r&D4%`54Q=>kNEHrIzkfm&9 zOfn0$V$76GVFp5Ag;do`tBqMZ2YxpC3jNBdGgNU$Fd4DI@3^UfnOJa=g(f0xe4FfM zi-+#u%`~l3v^8tPEdts=07&fR(K4CpHM-s>-KG-HD^ZpVA&oy>yZ z>28QQY~)nv%y;QpP|Eh(+?Ys8TxT#4vg5s^(|LLhm8WP`bn+M}Lk-ihZwo{^^hsKJ zL38Bwv1^%cEU<=Df$SZ5r{FzveXIsQ~Y^`gDpJ@>$k440)Rx zQ!c<8pEXN3^&Q!p=4lHE4@iz@{@&T2EVq z^4f`MWXL%-HKS=z7G$&MVWV=?==~x30hx`;q!-(~2~kF2^qxnc@j0~f45Lc9l5F&! z;F8@x-rq!8-#}TR>&g?0m+({)QB7O+%J4agI(lR3rHvh(#!j;54dm=EU3p?TRW7I@ zA1xSLG%NdRwNb}chX}j(48TbbK|gYLeg6zn?Z!fO^`cM9N zmw}+5ed+Z15ZHo`PjSg#UKlx;do@M9O0a*uht+K8y3wM%#&IjNQwnDV#dppkp&yTE znXP*;^2{6-hvsz*u2Udn^7YJxdTQ)7vYLOiUnAo^*xS##Ba^p(@(Olq!qJZ1L{5s9 z*~tsqF#!_z_<1457yoA6Qq*C-)^7&k-Ho~O=7tMUZgu~;;VwibOrgQrI2#;D&NZ%^ zNaf#O#}B^7wfWYP0@C}jLN&N@W;ud!M4zWN{S4eU@!-BsTr3soQJ%Pn?4CDz*?Ctb zY8s_rVNs+YbZ3k4L^$%FE4IaLz{;l&9Nu#*6|8 zUH_CWyTO%85mbj3lJI?_Y;yWG6nu`}H!36F7#N#V&g;PAn?^2@6XSK&l0TJ=&31wu zX))2F@aL1h4w~}l;|@X6jPOBaqeZUFan7;>fADDQH9DtK6*JYD`Ff*2=`z_G>}Fes zuFc$}LEc2x-!?jbF0Vx!33TGu$_3}`_ZLq+v6>8dP&q3rJaHXScZ@E}K=4jhz^a7T zq4XIV=)2CVszd8!A&qvP};=!e9arP|u+ zaXU4%iHk1SgXrs>+tcd?g6w5vaPh$zEJFp_ zx+VeL92&^p7Y)-%YnVMP*9z0rnFP!tl!u1>z0*hMqRRBtV2bfG-bni{%*w~q+ zno{z79=Hs=f}8S6o|wOLE(l{M=4KfC=Q)Hi#g>mwj{NjXJn%>vnt`pxOqS8g+f<@? zdxSTq%N7cBwp!gziNK=`hTV?k?7WFEpE zmQAkWuy++Ii2DxSW*AgozLs?@X`NXz54j+B;4$IOIk>!EH+|vdIZxP0>#33Ri&2wL zYMK@yKe^()v5O{Nqr#v`h2w4Y(uCG-X-(F}H4PE}KYxup_`*1A2Dg6Cc_B%Ly>mC- zJyRk*SC~M;_oL^I?as3n6q98;HzMzQjO_UxXcb$xZJ(E2jn3UjTSeT}HR*QrdlV@twYP_2d=nnaw2j zz(|5be4`~5=vp{q5s8!uo`J%IC6B2~6g1J0es*bhckUCPx1DJuJuwu(n9!ni#85$n%djbIDzAj4UTT2M=r}o4+-- zaAx-9TAxX*CAzxPmy%-(jgXY20mesJ5S(t*`fC!6^H=26wB-aagE0=t`W$1(i%4iWPFjtCHN=kVrAMpcvwIvQEVn9 zit%ei8*3yY0Ttw3sdY075BHvQvxU&duOt69tm+V@y!(G^ye`kjAI`AWN zMfS1poZ1J9wrsnG9DU)?9K!o+@4eZ-<*H+o$PkEPq7J(lpsHZf>5K?NqV@>%i3JW} zcV|51OH1s*4wo<$@};5?XRIUXPTNJ4+p%e|=i_C0vq;Mi6A-BoWu!2~|A4{51YHuW zZgwXY#-d+M-e5oDO z&3&(~$gFuMBiAg=Ubg+et5d^eH|t?H+xm8iV0g<@b%MNE@b3Nnbua!O_P#v4t?Jr0 z@)QplY$=lyCy_Ie(bhbKghaL_*^(t|mL;Yf&9jc?p#^Ly&?K}FhGsK60WP6H8=E!} zg|<#;O9u)ha7zf3k}#H1AoTY3wuK9C?IT%ozzKnt_uY5D_eUu#OFBne`|Q2;TEC%r zr@byOxqe59!L<7(U4=VLy>D;#!uzW*?BGfG-!I3tHPq~Se4eTXbN7Bz*n7?FOBxCq zjcRWl4m>qZZ2o@LNYyxVXant1iZ1r_IH4+rc29(!87HnNhW1W`j*b)GDuzZULdV95 zJBy*i6QO6viSHIeM<+thjT1jEhE7g|{(YQysu(&w5&G>o@iGqmnAuUft>?#ycZ)A- zo(LTuC;qz_D!=N5abo5VsPDs?c-4t?~lOet}hq$@~!uacEWACgeVq#2T?+hhT>I}-;KowmopJ5Ys6eh1_|v%d2UH+h3cNe6 zy_X8uN`d#rwKr1%T`BPXxOO`g=qd$Hk89&pfKv*5Fs^k_fn}w@pU1TZDnKs<{$pI* zLj|fzfxnDvc~s!fbBoXQe~xQcP=QxVfxp7OLIs{J1^x?`0xIx$DeyNKj~`OwQ40JW z#)AsnT?+gI#)AsnSPFay<3R;-rNBop9#kM&3j8;W2NkfD0w2S8Pyt;j@Cl3u73eAk z7_bAzsQ{-Gpuu=hfn}vY6^sWJpqB#Gg?-n|zL;9Y_SF>?va8M0>P}Xhal)*uZv4g* z^}Cwt@}1Z3D6s&xWgx@e`bhoq@*+z!jow_)+`RPaDx8DXJUnMtV{J}ZYTKZ#zXg@L zy>IQ9gzTE0yA++wG|w*_{lSils?n_bhUyF1CwE9HJRjfnS|edw;MnxS2f+dU$OFsSy4jXr)vrXr<& zy{I>sfm~;zQ3D$YqmJseeqpvJB_=EuaM*S+`sC1yn2XD~enmWW_C7LJUKbyU3% z8O8_qITYxqDc4dS@@vksX%;7wgv%8py~!Zy7PvEMKH+uvK;((!gXI7Sx$+{(B*&Xh zq<9&Z02J-w&QjCNV2NFo1Wk5}L7qt_WXAq8$M~P5dx{~40Fpk)j{WHzeR=4L z6Pq(QkDz_jp+}mIyYl15F5^{o(s1?T3;!U+iV+B{IYcfr{CNAhh^FEZ;@#C10S8CLGz6)0HJ$ zkqj>pBIBMYNk-j)kSjxwNq!9WmkBZTd0b(S*CI8kvt4F^TN+U+!g_JS`mg4&t2hiC0- zsLgGesyPgK@ISS_B>V|?I8J)PJjj7#Zm{)?1zlbz)Zn?%I49#wkuG8e6lJXV44PGNIZQlM9ndJ6Ne{^`9EsGaJTkVD@l=nV>r^vh!3xUkUkj@h{pi zmJ2<=y%zQuRCcA)?d(Y3#At;VlC$8B^V?FNfUd}(kbqc1j&shu{KI3pe^?<2I985h-DiayE_XgB9la&X` z@?z z1Z7Rjq4S{XticO^1GVtC>`F5_SU{Og*f{~hEL9}I`Y>&it3kjE}+ldsQ%{} zsVl%<$imiyG|-^{wPjG;8os^E)?uK5lMDvBb9i_i=Ah0;2X8&l2ZGW2mn;PVc~y@T zjCHu_nAAm89fedGF=oj02r1)OsFS{|JPH(mcJ$J+LygGxJLTGX=w&5s4!HpZAIyPi z*W&z3XzMqIR-mV^VKy`nQlJU+0{aaed#mL_#Oh?!&Vfc-xipbg#Et9VDrn=gpcS_5 z$rqqx{TJnS^w@piZ`CijkdaS;iDZ*IkfXhqnEKaU&*~TA<|0l{>si z3|s7qQN5RVrEtv_no?MeY!@X&2Byt5=;~)i=b#664nYTSZJvS1+lFe<$(=)!g}ugh z(%Zg}N*NX>D}OU{0BG4k6ThTVRxMLW(G9P)w9!(i`Ca`AwAr^~kKW%-4(XZ(%Ajf;A3xPZHOBN|s=tQpQG4UYpa-ga@tC z^herDhL_XSXzfS9n}7Gh(HWJJkjgKXYSEo{46UdQ1o#F&8oM<;4~^c|QopCca6tq3 zIyoa@naM(Rl!|!_PYkKj$Vt*&WkwgRKeX;F*$iyh0*WUD+xquT2%$(Rj~zAF>$7sSwqLOO+&o`q&VvHt{S_^d^1e{irQ(-3=pKUjgrTN-dn zIHL#%4fv7KNh^2(^w4|zp*!~>9bUJf#fL^$jV(gVZz`dMxoT`3>KGhahjJh87c79M zIh2&R2Jr`|G2^GJA3P{0Fu@Ds#anjFYBE7sqGv<7x&QwOHV>=LVpgRheuQpp zS&6_v^-84a17qLaALhPZ1GJs9uyvSo%TK@B2qOJlj~e90L5=rM`4!WhQnu8Zm7!w~ z?Es|uH-j2 zCSqp_HG6ijXz1`?4>D_j!Wcytnh(jCcyIHCgciK^QZ92{{XGspulzG3$sfS2a_{2@ zZbalQJKU`R(r}3lDjmKBc?92$o;w(l0*V2!ovoM@_A$EtJIuMdFQm~9jFyDfC-duk zAeH9>{{Z;!@-2W`yXFkaTD%4%2PjpK-ga0;EIcdAg1Zp13XP4rG0H`?NXH|WjivDn zpMf5H?BG!K!~~x^nT}SzAm*j5tN~#IC;G;Z4t7>sRep5pHaw}v4sy^l;@28c$Klb2 zIuGP$9t4#hZP~5#bwt@o|Jr&PWm08_um4n8CPnv=ZI;9TE z5=5^IJbV^{Zvh)rBh7sobCBGU|0rbGZH*hi41HaDnn zM*@y6Y6&>PPP0O4Fo5cX+>-(7ZwOQHZM~iWoHfIdpCP+25Z{CZC5P}_ERHAma{-r z?F-6(OR8*VwU5@{}NdF)Ghlc<7jjv)wyYM5^zcwi+0U_cE* z2x>o8MoVo>mBG(`&EI3eHkz-(Gx5-sMccf z1yLG)1@LQRPc`by#V`~YzC6t=Q-f`|Dr*c`edWub|F5H0q>h760j@=zXiT$^8tEvqLBLoM+QZ^AAk&FJG_?q7msfCHU90nmmXU)sL} zF%9|G@G%SMUJS#$S|iKO2c%qL$9%*ZJGdS#$`8$|v#Y`e5BS+vZQp>79%BA&#W_T{ zDtASxae*fFQgj(>l!-=x3^&&lkeUXl1P^Z{UH!?hgZOv!_;H#`MnI%Ro zs`u|`N6Z)YXRvD60`$;2?3=wVzhKhmwYRmbJ#*_Ue}l=C?v)}Sa+_q7w+sRM1c<_P z>1@GN${aB9&d>{k-4~>x<0O#1t&lweAiu7^10T%>J>mYr$zVS&&*l<={l~0z=fd2u zM_PV7pGMKW73i5+tMfqfZhxW+>X}3Gy?27RF{>nN7%{ZmP+ro`S;}_=!P#Eu5I7RH zXe@2#ha5aGBotstd!LQN57}HKl-zt#uGi;?MQu)B68iVhd8QmP7=0I95U9WnC^7{) z^1Nbk1Jf0bGBe>s2Rb4@Fdv<)WkCOjuygq;okt(cNHiXO*ex?=K~8_)EakmWmpyX4 zx9YAo(RnEiia~7H$#$Hhdksa+cjw%SetZ@h!X-I2s^sKm@~t5IIw$7 zfB-)NlH|GLP8%6Pr~YHeih_#f^&{U~_aUtj9cX&3p|gW|NrEF_u`Wr-q%0Xz8uEoR z%(%x{p3pWYk%)s2YJlk=GVSPw$5Q@kkq~OYKT>=LFpD=3d*?L9;so4J)N#o&L^E}* zF4o>Tc86F%Aok3opHuaJx#Jepf2-YyuAlWnz5s_BE)B6CZT{L6^KuHlkdGg73P?ie z$a-UOkKH45xYG_lhwDfr~%F z+WcymjOd2U21fl9vr^^|MmRo>pC1-V?EbhoL~7JN^W<4MvIw+V&nXI892piNhI%{2 z*_@Kl_wmEaZU>^(zPrK(^fY%l^g-TRO@jmWlryoh{58(`C4%$La{ra-IQ0w8XF4X` z5dnAth6ry|802QME;3{bhXwp>fFI)|-0mnRkPh>Bp=>G@^aWgQ@bM!4mD5oK1@6zA zj%+SRWOpFu?hWT`1tH?8=85Te(eiwuJ<|arkL_=6+*&iEW?Fh$({F0_Rt--BCwf+m zr~aNRcGcA8T7Qlt;Rw=B#@eyQ<-H zo0KicdtsJVX z_ES7nPJfgu3~`8{KOT#@Y^jJR==Y|xJR&BE%0@VFz~Z(WHZVe*|ICv15N5Ulvs;wb+&py->n~DOG#bAYLsdROkPtFgL(Sx z6SEk?&*(dgP~?r{E2~7H6Wwv5NL90OMO?AXIYP7QOJj5vsO`25L${%SJk_Be*|h2p z0DN!0YG`-SPvFDF->(A6h^vOy7WwO^j?dU5c<}=Cis{AWlt^H1*i{_fiemQG!X3RY_E#n*>~{jR zRC#SHk|pjE9*vCljcDOxTf_gbn_!9qm&d zA4Zq;AD=x>C|ZBX8N|R#mTlw$jIaOrYOsict#)Gf0%IDX*u_B~T>N5q>Y*Ol_r!{- zThWJCbQnek0{cK5;Mfug>|D$xzT<@&=8nf3>(~MTOUy>>r@q%(TKG9)I|OKluKlmG z%yHnRGdl~r-_wya^po5Ag;!OX<{h z@d%gNzJV45c6$zKlM{twe zUaQMs7HiBZtHNPU1`R^DUESf4J0sB)%hl_%_A25|j>qE5Mub^=ETGGzd5TbXHwcKZ zO@5Oj(5JXOYU$VTlb5^v+Fp&w67>4GL|QFMN|MoT|3FA<>GKFtb5qZSQ(`%J;*EeD z)t;Jt-z=A%;K1hSvN;7J&7E5^n&*BcMi-fEY&DfRRG~*Fbdj-sle7! zU`|1MHx*!&0&@%68zF$Uy_%U_V2&=m2)}RIw8B{7?Gw{SmOj^8Rf{e;{*4FAPx};k z7Lj(6;e?YDi8vCTD36~O3X(iGSD199oUurX<8=Fh*^u&bgzkvT?n!te-qOa__Jb>$ zM>f3JQ?+<@*aef3xppn#c80)EcjW7j9ipw8n+iw$u0S}oc5O#F*V2!CSC*hHV64Z_ z9~1mb;?5uw-sFtNMriT`ZShs*m!>>kyNBuY!V9DD5=V^b@J5~Xcp$@E?S%_6qs|x! z4qr~D9WD;fgxi~RhSo44+xCW%VZSp5uh|xL#-orOIk%NRHy#cL@KfY+#^LkrVYqlY z-occ(;3k;S8O7HVf%Qype1!IVZ`GWU7d1bj&E2?q8+eJ~KsZdsm|*ANhwm5-C)^%%?6yl8Bd#4`T6<$Wnqd-d!W-(qiDsah z1x#PsrsnTd0W|KcnWhMfc<|skvop^EQH3P`QsymHA~9Ba*Q1eZj^}A09REq~dgwzw zLeRwM=$@ijm!=Nb9)dP%$!8iYy$L+*gc{ zrO2Xj$(~|lTPe~uF1e-{(Uc;K$0f;PWNRt1WL)AZMp&iD(s7BY7-5zo%yEgV7-=p= z+Q%gV9631g!OO-atBNl*23@chEs~QUpH_I@vlO+`M9b&G-$%6mmuw7t0 zAan_wVnX0z34{cT%i#+I9Kja=c22mHOt0o}im3A$)T++scL4aDhpt*Ra8(f{rfD6T zjxSnsoK7m_MU?rb`FF!O_{nuLj%5J1x z?d}>UZEo7`nTP(~xR&~=J>#tVir3MXt|J|1?I}jOOA#3iWHG`mMdXNh{8x*|HTQg< zHacVc=>318bynkR^rDs@{A$fO>)8!77|+uSH&s&?=|gPo?fh}(-QTY|Idhx|X!EzI z-%Wu|b=@u*-x~M}?Qr$@5bZJAhfVlnl;bQx@q({8iUZU?&RSKBJXeaSU=WLupOzwO zV7l?Z#(Ue?HkdGvU5Y2nv}uUuJKB%7-t+VIg>9Z3x01e{^IXC62NK>;I^_iB7)dT^2I!j@eeivO zenj)$BUO1C8@0S*xPD}}?lzijM6zPX1VC`~5!PZvKAe9C{pg3RHgtGJ10AvEGU^LU zugot#&vEj3lkvE~;ZOM8o)qB>+x@<9FwPC7{YgiH!{dfyo*>6blI|$q7LB+)0wOx0 zf@137c?@QULK^WIeOy5}7%>|L(FfOb&P7|B=4j6tERe%GzrmvNSCNAc*_mKu%PsTH zeNscjk6E|Eu6o1GLO^m}2WPYwg&m#L)YPC4PB87|oU1Zfra(?|JYK>Uulc*;$rNrLN6$D;0N#0RCBObGfHW#r_b8^|)ygp@^P&VGe4Y4`d? zY$Kj9oq!|iWTLKZ&6ib+g*-e2cP;|Wu+J~ufDaYV>2i%k-v8FQsBqh6LIH;l3CVH; zdc_SzMM!2p_`n2WTOfY*XOjYrzMoej)=@gJw(tJ=LkJ!q2ht4vyau^eZ+~@)!I|QO z9*u-k(MZPObNHR^Kq|rKyZK>vgqMtS6Fg3u53Vk;j3e&L`UxROw!|_aerbkClu-}Z z*7x))5(bHcWSco6iJrg%)A1QcPazx1R5Q=hHdkclvP4|l$SIZobLI!-efOiI8L0Wa zw=7>cdXoWYKh&UX`(-YH2c@@Y&{UZA`4_r~cU*TookV%pBDu*l9%Gj@n|m&cYuo*umvwW4jub6&)JWY6MH{T6k_ zoESwM*DgnU69A>VYxQG#KinFJ9H+QR+`cVC59VBy4}O_hvWUHEqgQ2);G-;m}>0Qxnr z-mXJit#nY0ygBzN0sk&a&q5ksr%lGAh`lOz?Ny`&Fi76=`9;MFkl3CD+N23R^eG9W zp92c5N`hTg@M6< zf*1s`vVgW!WOd}VVm4Odpg0066W1l6S8 z7l12~d_alHE4OMQEzl9NsDkMz+)|Q&OPWF+ixcbxzzo2uVh4=YUh9C(h;Pv$cgO-p z5c$C72w`)G9Dob=**EqE225r+yBUa!Qu*^tWGR)&o;ku4jQd%NaNhkx&4BdteQtyQ0)_I&0}-a|y^XvfF@W~ zUb-NzHm5DP3#T_)xu6fwJ1}Tf=m3q?eqX*7b^gbJ+9i4@#uJG@qAl%mnx3Q z$x6^S3WSn&S*XD?sUbxk4)!qm7EHF#XABQlfJs3G3BG zQ0b?GkIY+)dNez;gN^RmL7y>$!Wc6ata6s7eY)@Zk|A57`dwr=yK8>X)N! z`33Qt19MMbn_EB0ad%+_cBe9f6a)rDfd?&0SKy0h81r z$JV84Ga10otbwglJJFH18H*c0!Q2ovc&x07n2Lzc6*{;MN@Ju5TbgoV+jd2J4sDrv zp#ok1lVy42KD`SdOG~d^h6X>_r7SOKYMgT$kmTLm1E}o;;IlRT!;A(1j#)AWeE?Jh zZW`jFp?Bytg_F^iS+tpamW36-$QZv~WO?m6ebE5xC9ss#lTQ_P&H_>nq}6A)d=Jixw=LX~rDTRiwup98<48Wb&#) zo;2*mF(RnV0^|;?GZuzZ;N|33`}u?V5DCyURR%D5DL`phzCtA0f;m~!fKIN?>doxR zT_VXw@El<78U~5$5oR4a9obQf$VYQ?k$2Y+3oTx_eby=f9ou^x3ZUO`v1JO3fCXF; zE32u_=T2J!ptML|vH(8Z3@jVSQglFRA;T8Gh3AyZi|9ixqFFd5S-jx1Wfs6NOJ=mMn7Vzl!O zEVh75tieNLGvVdJ1J*Mq5EC!$Y=&F@`H?`Qx_mfjWa3aZelmi%1A_n(-D zU^|ZO*$Tu9)&sfU(G8}UnR3<($YBV~x-1B&?*;Ko@^S`VGT3fGXwZiayvP9B%7u)} z5sO2=b7n|av3sYMvkOu4g=4jIoJzUOiL-znLHYL49c22`3mW>Bld%r3?*_g}6-3Kk zKLD%M%gU$sq;k@kaj;bJ>sZ#Lg&U9|_6g-mj8C>EG~JXoq{d!B?_-db%jW|*iO0cA zz5?Li_DA|kv}IqutG3rcS_5ck#i90AkRdemi9&4Z{wN5wUM#ZO!Qqk3r31_<+LFio zp$pI*E62nb+$9pb1^sxDr6i4{iI9TrN#jMfoPEqdAJ5p{gc56V?$6-5&Nt~O4^)Xk z1L=mJ566=c=K4wVW8dEoZbGk!N1H2B`{o|C-Vu~$06*n(LZ)wE=?DZlhzRSFuEiko zL2JJX3N=px$B2AdIgEfmvu4s~9({7Sch5u28hYgxV6v-?{0KOxw{2fhUCJ)n7L{Ls z(^RXeXv7G>U$v2ozV{J*Ssh$k4Z0#@FXz~Jk2kZ(UPX9PX2E0G#A4P65m;4quFPWd zL}tP2cyc@X=+199qTl`ck)rDVmN%AB4vWyGFe7a*)H;uC{{tMf-12 zg4WGSx(*$ECC>sGs?pU*(*SfV*2#Qt1Bp`yRY(^@2TmSXgjh{2N_ZAn27lC(MH|QH zTcH>?_Bh(QEiY@t34u6%lC&kr_S@0!8~3k3dpqe(tuQq1u$p5o4+oyr{jfx#!yn{&(AN8RM9|4=4oGp1 zenVyZglT2 z^TqV1d2${N_oGJb_a5v*r{}iRp>1Oa=@>yj9e>KryW52Uoh6eQ%YZh6Oci4s;Qyp^9!BD+8tMD7xO@gCB~e(q0JuI_xx+LTg%7w zSs(v4KO%~zXfsAE%Q~yxsN!-*Xm2@a)K;%7?0ziYR}lfA2&e0)JS@qP^x6Lz!YK!g zq)ZOKBiNVG50V}gn@k%F3a$!{*>D>6VRXEO<*4ACfq7>%4hFzPP?3NQ$qycaV6F#w z)L?5D2ljLTR?6b~5Lilmvi zEwT{>W8N0sfDsVu#(;XzW)=Yv*kM-5OeURAJqSOR4v_4G9z6c^W~xxaHk*KT3niKI z(~1@$u!lLY64Hik%Na5>Ue{k+#||n7y7g#l0&uz~oIC!A4u894F6#ITtO#4z!}eFM zZOjKBIFdI&%}_nw{JQ#87O5;o>4)L+!W>#rQG+&rTHOP*`MBEHL~HotRXeY!%WWQh z4n;Jt1G>vXhhxRnCn`Elz{CdDt^W-nRlNMvLvijCK`81cJshE(&v$UL!Kf?d@$wuQ zPR#8~akC*F#~#i)gPB;87Yw>m5r;1xm{i*~n3Gz<N}8o?wgHHUn~Zc)BBJl&Hjs>s#~t4ox5`}MbX|5$Y6UU z!1H?q8FwTR4qb= zsTTQNHg-3hC?~oXi^0?R=V}zbq_Y-Te+@tL$=mDKRf+kC2_^jV!~}~tLcUW#j2!Jg zQabcZ3GiW~Vd0@$u|3we#=tOT;P=1XUiheStYTtRBldr$3GwL#rT>{f{R_*v9TKlRQ}e!$#>MqkhUZLZ0}22ygj zBM5Kwb$N7bQwRs!@Lq|u0?9@v_a9^x4m%i)P=~<2*Cw+E%4lJJ zd4s;NWip#PsZe;cn3)arudxHWaItCu`s5M7*`Iurxe}kx%N*@9cmc#KmBQ6z4g~Wb zfc~DSVKt-iRzrOSmjBNdv#e4JUnTF$fG&ZzJkT~j8{_SxDkIx~Q_ZcDR;=bVhgP87 z7xg#b@>W|l8)WysTfcoN+WPGw0VUiy+r;)*%{~yPHkjhF{yy~aqd74me>I#zqmMxX zSiTB6@D7;3&HDP#!bPS5lhgz&91F%**N0htl~-*EFy>c7kqvELpIgl^VasnQUXqm( zG}^tse`!s`G)SUj(v~%7x0%6c06AlAJm!WczpMr<;y}}5 zK;*X@s;;9nIiYU{a%~q?F)l_lH@ydnphGtx@>RO5+7R@h5BT&AXzz8(nUJ?|*u4o& z4;tA3r`4@BW3N)_+6<%F;Zp(00hV}>mcRGlR;=#64CgQ|tAxy;5e{Q1VqV6WQ2@Z?UNrg;G)T(TF+_IKYZl1h*hu0c zhyXwQpLC^;=tMV^FuovN$z%abhOgunw|Xay8>1_uT` z13IoQ0;I|TI35n#xTHrXB{^m@zj6{+$)!L~^LR{h9nUKBs8w=p#wPc8&GLnw81#9< zm}F@J$37UPDE0?dK}G1RF7Ol|`~TMqJXAKg1|4v}P&+@wiCe`%56qt~E1pHtm=iGJ zB--{XV0|6d9s+TYs}J;|_kTJ(bJ9}yk(<5}+H;WH8Pi6#B@2{KgQ~~GHT%?N10?C@ zfYk%dE!cYamC_H=dg#6A=#2gvG};8fVCFmYCh)0X_4>5y;L4J&Uh3G9s4SH!g&wtB z1M9)zHxE9AkGhwjy{|H)?QpntaLrbdYSB=2l=2kU^PF0_peR@XhNZBlUBGx7onFcS zrH}(TCe+O5U~@VhKkoP13!hw^SJ0~Ex;}L00E2}N?-+t4a5ZDWbhs^X7hx=1ETQ)T z5*W_c&3##*n5%K=8Xrux&}z6N$HgnyI;GwtLAhHFtU#mO(S}CMu%u0MPn!m=@vNFl z8((SI`8C|QehfIulYOSBbd6bffk&mB7)0O6rZ@ubsB1PP~$Z_ncDbJ`=| z$J6mhB;|EQ2=XGp;WY=GCVu}FKk7KuTx8x+Y2v0C5-=gH5) z2EJ$&nl0cGA{&-JI17Fg3><y%~(l(AX z^Hr}&Uv<&BZK|R(>>k^wqFny81N=Stuo;TBQYOl|pCr$_MCmDEJao#NOLLuSd6kbYM%n2p-s2iVRXa z(K-7$Z&Ul{jB>9yYyqX&r6?5ow|e?YE7gP0m@Qcr|FKT|2pTdid|To))VV+I&Gp1z>=dJdg)> zkw=+xyFbU)yu1)XSGD&n{^s9qH?+1B*{%U6AR%B73Ae~eJm}NfDm{%q{*Nv;<4b7pvucj(Jvkx z4%V`vh~q<@KccUwwq_M*+e5>h(@i>=+Q=r+H-AK5UaNu0Eco`=*cNp7B((dmvj)yi zg+@+qqN1`QVms{)oEdlCcupV#EH*RgMVXZm&64j|2bK|w^ac!|n|FPFY2o*p{2Chi#FB4pidp4iXwpMXI)sLQ z3#l?RZCCA48D>)O3btNGIltgzFDwNtaSC(fX>Te2Of|jH90Q|;)`hzzbI|Et20o#% zB7?oW9`y2YrD)G5`K!@U>F|ci16k_?i&(06BSL$>L9eMv#bc2|>k2~^fYDYkYH<5R zG81q-+@chV8cyNCm4?1H8(SzJpwb8pbt@uPrA@r&KSmc6$loy*(&om%Ila#q1oH%z zB5jq~*|wmf2V+L4zCJlX*z(yz36OP-hix%G#~({Y(m`h`6Z2%eWO#BZr^hfTQzk{iexKc= za9f-nwo#-849TYfyI&A<25QMJ*XNmhf;SgC`UZxeV!STW+|`~h-2KL>63FmVbvi0P z;1#pTpkEe8Ezj=1cF&%i@yn$LY(?7Q*Xg0v4979H$Ha+cAi<5P1A&AV)KcJRoHdyF zl|Ftn0rs;pI>_M7GQ6bL3-Rc5s1@bJQa zefhcxPOGp*JE$%CgKOw>&@0FDJqvN814=<87f)fl=vNkd)~kR#Vm-r{#{evijU6B8 z@mCfn^t2A@UZ+oj>ch~yLr;MxCw+5k%wZy-84b7{qoPva(VNp~--H}ok$2!?i!Y>KQ!anaK>wy0o{N~jVASLNjnpT@ zPW<{fHNBGY0INrfTJrRA`*bxL+DTWHJE!G4{^GbTbi?H>t+Ofzr->G7@1zshxOjAH z4b>#Q@})fZmd`%a&<^GO@>RKput$P#)rga(u6{-5K<^+3TAi6~oDHZ|Tke}KItNbc zLX6YW4?5IT9s!CrPAnYnV^B^3sVj$@-^D4Gy(lkd5z8U8 zah!JXhy=jtAmwmY)k4_b7yqoZy&t{L0?z8s{bUEVyQ9a)cU*)UYj)JW5vH^W^oag9 zv~f0I8BT9Vw9XH|Z26}~5#|_c&)m_IhK3&LBc{HJVGGJm^ zLn@O=ZUp=*!Qz_?&`HyRh?5pfq3QF{(+a4ab-tWm*8mxTfz8Rt!f5v&4}b{THxASn zo5*O<325IOjh|S7cYh+J<8)KaOhCTT7t@gc`g{vI=m!9Ln0}%GCn5duV*jPrlP#d-p^4y1%6vmnMm@oG(O=JwRWCl&n`Tseg!_gN3F0T4-6^* zI}-?5Olmatn_&?JE3tD3R}8D}tSo?X;4&J$2vVEWg7)Ebgo%NFV7k|Oh=D;e9HlfJ zrwaIe)I(POLg?d_V^HFJo&IjUCuZ!CaS2FHettlXwz28Wb0M3F+uRYX*4kBh%SD&x zq2~Wf{e3WTfs~`&2#)GUSLeA%^9!c5T-B^c;}_&tQAt*P3=(s%(+GgrH(>yt3FKFz zt=0YYSat|Rki{7Z(hBJFu>I>h`2BNG@6CXwgEe?M8ooKd4vlOY1J%-!o1S@{U#-O* z3@Kjb07~2KP8uqh*Cn(W#Zy8N&4SpQU{g8V)q=4lT!}Cm7vpcEpccoN$ZvK@&IIuB z(fsd1ae1`bAZv$t)7NV?P}tf}IWhMSN|F*8+V?wpH%7qR->&kON62MVu(CZ^tx`@2 zzv;z2P@+Xg8u~j>^PCePwfPO^LNs(mt`QA2-9HNr?98n}vu-;Bg?d!X=QIx1XLVj(9srOzLgn_r41%r-S@*Ep@hkX6yBg#mOlX% z?uXLZ*KPw5!3Ezru(VpElR-I4xdi9V8_`L`sGV!m5tQ4ItT^Z*kAXkPLlQ9{hfm(K zpVIf6jYj>92DJS_eXJTVW@z?DxeMljL|eK?9|DALfaFvzD4B78Ta8H?fCAWz`{$sc zk8+F}fhDU$NA@0+<9X4=(nKYnG6fO>)zQvpk393cn@V_=sd3?;6w{h4tHeH;2VI>q zDEv-Z5fNShl6Mtt5yQ!jnf+F)&E!v;p)R6g>mtTLK(7jz(7GICJil#Y0Q9-^EX{&B z#1Z!E_1OGWLiuY-<5{ILphl8A;7kC$;F)MnPs`=#z(14?4bZBw2USYYXKZ-yAiHq- zWyXBk+)032D|Z3|h8qQI=}_*oxozb^3W-%{^RJkcGSn$Fpkr)er2RII$)F8RQXfXM z*^oFKHRZvXwj|EggqT9mNxbOq^oBjxrt4;M2Vf#Q+}`d0%zAY4!~H7?Af(Ks)k8uQ zfz?KbSB&-8telSBN5efrev~TI7xjS20Vzv_j`)TF2lC$jUzDG4s&6q1?Wx~BAN^E5 z41k-r8614UR>0=4gAR@rcN@DDR52vhB{K3;XFh7YnSjaZ@)E|r6aWfMh?&?i2lpYQ z7&)WmB!akt(j|jiDUS)TLm8X)^tNOW`Cqx=mbe{iST=yqnFCrrBvWJ=9^ZuV?rdeK zrw?CVSCoz=db;=?H}<1Gy62_53#~s6Px{N>Q&N7QF`mVzEL`_2Lr!a;kT8I{is2*V z3apW~7HdNX^+_-)_{pX*3fZ*+&>`StZ62SS6Xy#30>9JY z7G^!%L?S>qiAYG8;Q_JU2)YvQP=g4)&kUyM~gHdIPVz>A+ zEGqsNVNnTP90&C9M%riGT4GU62|>T?WhNF0B7WFu08=?2QQc(RUp(J@Ui+Q`>-=lf z;hg~m98LHsyOEV~^vVdEpU=h`mjDri9vD`KSHulKI4MsVwJe;`g=APZJ_d*=+}Mc& z4F@nf3qeHEZ)d|XX%LW4UcD3qF9u0HY#(1a0QY}Nf2QZ30^m~p8LX;nOt@81d*QvU zEh^eVb3g{@W-HIg0o<< z0&2(jmMO3y2)citU<(=dJGPzay4MJN+g-9UTyeLWb&)W1+ahlr6%Hm-(A$?^k+{?VET?f#XAzE^2V zHw3zYJ2t2`n9yDKg7Msh{bwB#y-A+|Ge$q4)ks+A@}_<B0d~0 z$)HKpgAQ;QH>1NJ0(5Nlqs;k}&Z^;^X(pQY0H7zJf<2?6d_sh}*w6#!**~YIeU4Ig z$`a&v0|=vX_6Mjt1xJNHs0pJu@|ij}GOPtH^jot-v(WanV+?@fALOC+yM|{|MeThL z9}pt)ZsiQb{FQPc8hv`Sai-U0%?$K8uyv!1K#h+bT!BTQcjCOPebU!F_E>HKI=v3Q z=IN&U>9b4~8UR$a5o>*Z1ucXwT%TJpr~Di14OUPa4+ww^h^`MXme-1n+Ck7!kwVJY zX?S%Ft{|^7@vLAx=&D~y!9Rsgu|QuV+1NX?b)z-(IeA~2f< z`d1+91uwEoVmw}uZe$41CwJxq&;?DFE4#~@U|Y6%Np=9Xd9?Kbh|!JZsmS*N7{8GHwA2J9Lb@!?lV1Aw@{AO~}vOmh)fx6hdms@wi7 zJBHuggH=`~`cx>q&RaM#mg}U=nABq@FzTTl*9x@Uq%D%d45kt;tCp_^_8vO&Bx4yi zr?PXhTa?hFMK8*V*=UX;$fLZbEyj z`+r(a#a5s;X1=ijT16D)$&ZF-AA%Fcn=Li93PmOkRPcY(m&)GtCSX?>9We*`;1|Qo zaVNPESHE<@AQ4EFc~l?H##veU7A?ji4*KNPX;6plpw}?gY0Yt*RP|KACVND5W?|I9 zXr(oSXpSzRw@HFDLZcEk^?%9 z7P1c=VKdA6bUrI#k}l*YaBG$@>wr+|@c`2Z77g|Q9Gt#Nvzq@&d?4b>^MOGgk0f07_(^&d)bNF)C^T=(nB&*zc^#M{vZGw!-J0V2IGy zZiEsBZqcHX2ahkp+mviwHl{^0Zd6`SJb9s`Z?&w!$g_-y=K!PNN1oN6M5kpfZd{g{ zJ?TF74KUWDtxqfK=OwxlE*7p@6rFkd2bA4`v=*Obo-8(JYEMq9Jy~ek-TZuQ{mpGV zQ?6o-@p?K_!~qlCu@TX zu$nwRPr$VcT?oWFUFY{o?VnFwfcD-}KL?Fia;GOQh$@)mDI_I0o|M-kB;1KWDk8K+ z(@~Bi#!UrBroDFBg4j@iD-HBKxkq9UFNtf3_3L}D8*6C01pjVdl zlbnbkmsCJyu??)84C*C*?4FbQnHBI9H27uem79a9*;< zKw)MRF5w7^zU|x)=Npc{b}I;#9Q!&G5YDrH1A39qY%J`c_=xPL?+^d1)=);+JY%0mO=b{QJ|nr$W`FMX2{!A-d%gx@X@I=K!`!p2Rz$hbEs$i%WK!XFK|99dh08w;o0S@3tBgcxVbUCOvD zF3BVnLYddARP$v%3qaie(Q?@c`L_qF)}y9C^IdHm@p(-=yU=N8ffmYyVc?WU?;}q! zb0a4=udG^x{(EtQ4h>w?el_~&3S(noNh`?QV1PLNoWntFdz@k^Mj5uiFYU>TFv;UkQV?BCic;XyG6fp{F16p^l#d6^`74i7VHE^uy`9cg#da1%tyf z`JE<(KyOeGI++x>GbXiD=C63X5Lp>0d3Ldk9KPRZR#pJ^WEUyI3yivKN@DmPWE#Mx=mJ7}RAQd-7xO*i|+q?QDmiRga zEw1da|D%WFY2Fv)8S1m#q*cl!4-kj)V_Cjoy!de?`S1U zwUO)J8wKpqhpNYEO=xlF*lXAZm2F~z_vcN+VYKxLTN8S#Irl($5kBYE9!fehe(;rJ}T?no-*AmbUkFda|x0zq$tQ`*`g!x5$3E?-(7)meJu zY^OD?^y?|v^J=k}5?eb@@hqXu#)@BZLc#N3cEj%cpKWAMQDIWPv- ze)P!e0O*MP_al@^F15nKk?BXn1+=&DdLJSSJFY-m|JJdj@Vf=M+Vk9d1c7LV6Uk(u z#*_{@{Tv5}h&%i#K`0za022%3%I!{Pgu{XHf?}}CO9H1~J_BEYV%hA%N26vTMj80{lcee4)FYmE~fTWX$e*g83vm;?=cHfHb<%3;8 znBSfsp@$!;x_-|b#9q0uK5XQ)cW*{5^XPoE`xmwq zXz`L|<#*%!>Eh}sCgc>GzEjAt`3S-jBGOQ6kH)>3WH1E^@)^<@jb;*1nCG}6!K^)# z3MKqx#uxHA@xX5y+56aAw8iML$67=s@)ww{UDE<$xY9XH)8<4aXAhu`!dCIp5VPu>RKH55S&$%2ML?gtv z-li1?XJp{YhpV=uM-BUD6kfh4y_~k^Xh&V4uDO$#Ubiz+n_IcJm}QSXerg$N?oY2S z4**P+OVO6rmo^k`_`~q~Qw_`%2b8ei<>z>K!lW?i4>(*Ievlt=?iJ`S-j@xV=yMwezbu<( z%_V}v5woD330^EkPl2hk#cwflXg7a*XryDcftD}KxZ!6dM}a+C1$8z5Ic?g1V#NPD z4L`nWCs~_Y^!HeCA{`dJv10OY6`#ujEO@gk#OunUKgBcVB9pdo#+LPi6Ef+`fGBsE zACG0y?hx0_0a|9vD{uik23) z0b9$a(wK3J&mZr+^frZJj*zfX7U@$C7CXSa9o@r+rGJ}EPs@)aoe$EA%iAi~gEVD1 zwFW%)8RJkaBo)&PSIX9dw3nawX9`IyMFeoN0JT%#%-3)8TQgQOTc}4xHGzOdj{^r2M4Cq%+&tWFP3U_y{a41MgI;%rYai`2%{n2dJ6Y{Y~*z^N!Tc zpyPi)4&Bxbdq)DFX~<*|e?S6~CX6k}25b~gybB|1fQuQZfFQ7RnJxs~8 zY4p~V$uXPJ(&O|QlX74} z!C1xC4S)vNAYhn0ra@1_YEBcNw3h%00l$f>Vp}-mfR-ihE2o+|Gx}brg@ZC4XzhP( zT)7G(BG$1j-P{!V(F1U?qYo|vY6)jgGKTR6fQWuf34(?sJ&1O{ zNUx~}yE_v|85C8%@H?6?n%c_ou)F#wH1$?Q=7)|@jTq4H;a5tQ(02i$LWf$F?ZRj$ zXwy7D+JY&4a!IGl0plX+FH-vCf`lNA3GNi7FI&#h0jgzqwH3eWR>qPs$)^Y)* zG%OU0#E=cL-jyiP?pIF;&z5+A|I7sWzzO7oaxHy3+Iu;%0&!w`Hf2Y%N3*MLyl!Y2 zZ6&S#$9+4)wYkNAFP3Ibf8)L-<&6W--zBg3iK@h>m(Fu;A@)#$^zunT))pn~K-te` zk{Lc>clqLg`sPK$4#JyugfnSh#ukdixbakkoV0~>^@I~DzgBAT_xQawMM%b%ySw;b zehVocr9^C=gCjbJrx!j&Z7(LtBfIa=(emT(@@}COnft|K!xX#63;}+2q)DAt4(B;| z2wwS;)fY<&B*>I@4iHg;0Gl_9GL`_~rUU*gA!qw_GU#pjJr#DYGpLRjK|WN)GNvsC zMa&k|2~0tty0XC*6r-SQ9CaMHu2#Yi6A#ub5FpKdwbd6WFMP#2$J(jbVVF-dFj$nI zv`S&qNKu8bg}aywCq&AYi2u1A1d&1d3aC+VDk^1y5QjoGQMf{B%$M?;tcBs9GJyjE zTpKnUn8f|%Rl>run$@PhtW9Rs+x&`%(Qg_s`q^e?T*jc&is;yF`(QHxuKc_vyv;dOAwA?XxQ)sy z0LHw9hEDtf6ycWL!&rd37uHkI*KbvtwGRORn~rr_?`QIzKdPqw_PUsfB83k)ozxnZacUAeGj z;iSvHbU!d@f4;C~HKTl4hgr>sUim-~K)DhB?yhc^kX3#Ge4j28l{6-KeF6bRRKE`e z9yqXR&qKpCi2ltX7O>A?>%iFe)g)jAtbkiSaUozWxU>>nh;;+Ci(aeZwKX%SEhO5#6}#QrMZM?z zlgt1G^!7g2r+I;NmVf#F@B7XwD^I{+kG}Ptt}9pPZ7+;vtMj9Ko1cQk;qCIOeWM4L zGa%jY%KR!(;jACbn)L&WCY~#Pv1L~n)`Y(UiE|Sb?{6U5r-t&>o?|($2;*yem~b4P4eu~xFgZi=k@aw_JoZS5Aj^C7%v`8vcNeg z!VYsG5Q~$x0~LCrHCD~3)k*d2zK~vNbGw)lh12MYMFwov|LeNIXWJdEP)P^Nrc1^a zU%hQP6@h?-+k)&k+de_kq15IjH+^{dna4p*i`;3L^^g-t$LC{tul%Q8uK{ z#V!*kW%7&FDi-wbgqR7HL@%}YMPP?4WTNzReppGwaa~vr0?%e1L>FSv+y$8sJ#Z=) zB^W@4QvkU#W|IiK_K+iqv^qyH^8ei^{Qtfbd^vT>Wy1f}#1D%{3Kx%m2_dKjfSl7F zUsY$pZM?}4li=pplBJ_4W3n(By)Pl4JaR`)+p2)wM-YOvO zU!ZaTYJLnEQ`v!AbYYgS8OyVS$nuY#UOBG)_E0NW+TAilb#5wwx~d_cj|{FH`9SeA zP?8jv0~1qjwXvS#EJsD9QJIIFL>+A!qKd z`emWbB<6J!=JDZb2oRufnU!=!E3a4UIIP_4X>Y@fSWrmQMv0ya>{(u!Si zy+E>k1+`wN*||?3I_=;hTsm0i-NUX$#%svISB?m9tu(O>Tt7Buh}i%@RWP*o2>WtW zg*>^wp1c#-=`5r+OIeT_Rq-Vy-yEK`!`ez$!kloYrR|E_>buo;j;0<(jh8dkdZx)H|!vHj=mWpjO~ne@{NOU zva^vwg{Y`t(=7TX%mg#(#rFw!g}~MPX;OK!h!QmeXKD6_OLHLuq~?_4|Is^C_a(D( zePLFgFTjejQ=E{EI}rAv5m++jj7K188}@VUZZ12@NUZxpF zRexv#OT~c5iIJ%S(p1kfn8nqY1kMR4oV2Kj$WLa??mL*|q>U3TJK*t)DT> z{GuFMHUMI^@@)Lp(VJR@(|O0sjE<<=4{gp>u#}^J*Em)_nCvI;iq9fm%+f^0zfs zy+4}?B^*kWA1zL)gyg5QW_^lVh(DEl8rc;r8op}iZ`qmw$lo=Rb5BgHy) z-Z2rHnI6dff4F|mQTSNwTjCy4YP7Js8+~ z!N6YM3q1?@90_PfN`bXy)3cK7?oKbPlTnj_O1>@9v5X<6#RUS<&JMZX&>4kJ1#hnk zqOM_j>nAYMBRuD2`@_v{cB zAjht%TCh z;4DgIXDhk?P}K{$<&si%K0obt+eaWgTQLk0syF_pVF~7+wvgy8LqHdCrwbe80*geO zUqo;@7HV)=5-GznztWDy=1s`O94D*VhgKFCL$U#K_GjCdHAZ~7%i=Z%<3KQmcXedv zZ8nFK8X(6$ewsz1B^g+^r`x@|rNR7W4SM;>C+zA)m<>#*WJ0Hh@Jo!#$iDK*Vyq&+2dnbn zimH5`$N_EKuz>lPrUtECAQy~}1QRrX9UN%K#N(^S@OB~9*Ck8@2ZXtn zQ_xy``02OKzaoAWQ+)T>F|b{q)(5GXpSut-OKSp1zb&msa6JfBR$PMBKxrD5E`+GO zGorLx@%Zi894kZXjFOi^uys56BSnZfepM|X;YSP?sG9qBGOr}Rk~4jL0$Y$G=Ai9OUUG{J zT{i?7gZB+{3QQ1~ATwe`rGR4$>eadPb4jp!dt<2qu4B@nO(tQxLzJ~hk;o=UnM}9M zMaB+_ELUvb-nKt_QFJET^-~%oGlDx3yOJk^Z*DA>$+tjA*sA!uy(xdp@tG# zsbB0v`Dvg7lVevK7m%@{$|Bq;8o5qm3)1^LaWDuC$rg`6?#LxZGB^U)R)o9(Xm;XZ zqp}@zo{XetkD`T~yJI`{xiL9hqe%7i?K>db1dm}OIm#KETLc2fA*Mbn7TuzO&gj;^ zRn1@IhmJ%C*Y2U{(x9_|U&#z|V}do$TcyP+PDe1 z@A*cPturqL5q}dCU)qj?LS&3tu_sZe#g-CLKIzqJ^{fLumY1Os`Q(Sg4~|#|i%G?e z$(0Kg*ss#X0wHfds&hLdpx7%lhKcUF>bfe&d6P%Cw5Pu}LVoaoVijpPr1&{C`xb;j zP@KH|%gV*r--}m+6^}-AA{5%cND^fu*~b}MOh%6EoL>}W!=(R)`c&)D$wz)3On&smm|^F>vlSM9&%#25(xCh?NcP$cx-iHFm4DX$$&R#i}w?4;ylV_8woJyNiY#f~$qxK>eGTq32C zE9}TU-cZV#CbB(3wsDMW3RO0X6Y6&HVc<;foI=SPMr*%AuDXQe&3X5C4z58-O3ge)vXl@t#$?0)@lX_m1}bu$Hz2_KkyAlZKb%`Gg*Z zZQ0HE$yc5RmC^Gz<5#TlfS^t+r*yRUy{Xx<*IN{7iA5;v>XdPna z6MFe;aEW-1<*{*s&_5W6@W46I74r2boY6$@Kw_ZB=L&?Jes+Xwi~D>$TOY>}>$f}D zu^#ft+95aj%|xQSKpyXl5!?TheFnePTsxXc|3wyhcZXYLMM@p3z&UbZ{X&rd`G(U1$MiLPYG5l{B^`~7{MXo}~uxqYEn zq@UdrPDDAu7;6CRO=m85HM!w25CZ+pd#C4;lkZhP1btuedL*HYF8YGeN9{9s&@Ae( zk+$#oqn93c{5x%1?g3W(saMO4qv|(b00!dU%3QR$qmSJ+L@OcZuHN|m=qI`k=xw56 zX3VaHX3;~KU2#BmW&SR2;qdII$k}fv7LbEqQ3!IEWagTw$(5eaON`EV((QC}?4AJ2 z(;xQxlRe-*=V03cef)l3JQi`e!W=%2(;IWy`a?WcFW>I~(avM6p>I*i1=|1S+2pxx zT&Ejqv^i4KWiArwQ4U`8aB3cZfj&&<0U7PH!@tKrhu(NtmYtIJwYL|OHqY3+%gsxd zIBO>_$&R}{zCK=GANalYdR(3!XC%P)q|=M^t;3@1XNp*>i?J zK|6c%2#$&HEP5EngcHU@`7Tf4Fl~BF02!|J5@X^EFVQ6!UiRL;FgpvzUu$w1sinJ8=?{dZR`o}0sR+j*p6-*jWr zl}`EK3O@v2uy(<2nbtOX@^30&|Ly-l0*X$ccLE+hL*u$9etWcRe0iH(MfrK(Jg$3? z`UPY97vC7y-2uNK+a^=<#~a3$Uqe6Mu=9tdMNA%70F6$}Hy*E_kG<(UyPYj?+ZkLA zmk2-j?Vm39%-S~WY8l`62Yr-AUc6VyzsV5cN8=)avqz>kSY7=cmI#C2WfAIq-Rf?R znimB2n@Z;CG=NL#1}2}6KJ*M8znLxIF*tnA24*v(nc2+T(CSDE^)6vR6c%u$twFzD z7>q`GjeadpBav`4&W^sAHp=0J`r=HEw$B;hZ{^0+zVLul8SYo{IR>3h(VXm0!owbP zcdNFVn)}!sv)0!g37LUH)x$Ar6CH7T+{7?&x)y#@9En*bTyHZv%_L;x#at8##RVAJLtif4JQ3u(80u+6^q)Rxn}~zP-XQeIs_B zzZPN$x$ELPv-{#ZbL+p{nXG{b-8`#kf^NnKUrwJp^ssZ6y=Xgg_{~+*oaukIEXh6l zwohA9;}v)4ftjNHu!J?<_G|}>j!f%sKCyI{t#J7Ivmir@OzXCv_OBxcf4MWqv?jVA zRNgw?_N#_eVeZqexZv_bpv9CPM&dCjEyEpy zeE!Ef*AXokj@DXvz43mZxvSO52BqwPs#nWOx;x0BO`@e_^VrUH*eSJ#%75v$RcH#B zEJoJ&eJP8}{8H0AB+*?=5R!CU&JYQ7?!Eizt+1SVUla$CJ!LV2V!YK{9Nd{?U+oF^{09do9yFcEI6 z*ov2C#^(J?br13c>{geZLEe6XcbP5(K5FQ}=5o5Qu=mDF8hD)ZM|C%jg4-|F73h4h zg?4|RQVf_sUeK`fWt_BlOeQx!X$b`IFuFjq&&jyLq$NN(-U}wJNEe&o<8`DuS=?ql z)5r_^oZS+?t+!QTbn|0UR?rwx3Cu2_r1i~ATFh2%GlR?G@|mrdA>w})m+WcS2#qqJj{;7k5RNP@9I>XS$hErkQ@N?s<~l7Mf8+QR8#rJ; znW!Oea=?P1!UG*-FKVai$yY`)i)cckU}hTg*;l*8gt?(umj!&nnSzkh!u2~P!G60B z^G5o9J1c2+u*~xAb{TK_-%R+o+diQ0Hdw@dr^(z4$Bk3lxHEmc6Y09d(3p$gX(6bHyDJdodc%%1PL!^x{`6T(#A2SQd zhQCcL0d4PeU6UR1G2B+JTMIAF9jH)7Q3xzjX{rNMI{yje`xkdjtwT$eHoS5R$Ok={ z%2f_L`H*Wb=Uz{Ae_w@4f%JV1hJ>5VK@~Q-cd&B9P zkzZ7m(F|m0Zn|k%!rz)Nj3ueuC6#^AbOdEBefT*w=1RVP2R4u)ui<~-} zXEjja}bS-(H zWwN4pM&|*ah^ue9W^lpmOr)@xVnIDC+U*FK`;Au6L{3qU5!WH1 z9y5lWCFsk2sFiIV=!U$m+sX_S_(WZ5qP#l|!o(Bl3Q`uC`UW|7I#WSTy_qS&XJjr( zIVP{osUVfE&V7!$!vtR>7qmy6f^NJzDyn1Gs*U>OYRW5)FxE{TB-=>3b{;(Jd~3Tr z3R!#sd8rXx(?0)gbwiPoVP(4$msBdCs&VGg36O7+Rsuo)*3)aqjf%{g1xlMkn8dWC4pY@4O)A+erAuF@D)9MJFR&s`X&RiA(#lbsaj^E4OcyORn!n?r2B%CwS4AFEtQu3ML8)y92li^t98cvS*< zI415kYFPtHHM#x9^bV+bPn1EQoq#NS=PaMj2Nl2@tFO*J>1>|E#)ebB+IeZmO$b41 zll$rHR@`73M%ACK0Wso#eEQ1V@t>&=G|`G5H}0-09A5Vxxt$bK49?En0tIKZog5WI z0_;mZ@Nj1G*{v+tOyQ~R)u-nW^@kITT9e7e8{jFGUYkK^_Cf1*Yj2XR&7WEg>;>01 z!3I4Vj~OEYSGccfBZmyVe|9y!6%6ci=gI;?ii1gn-}7JQTt{tioA-m>=b>YF0~2TX zF4_*r?7k!s88O}>PyIkUr{wnayB8G>>kcl=?qAODq$JcC-?TG5XZ##Ly?XkVWf$>r zSj6AH;3moofaOA+>nbvKOS*_W@_KR+`Gv><{I&Pac2PHN0W?Qmd}ffvu6!}Gl8&61 z=FA$3Yh(lA6-O(>2K(X7jajbIr3W&hU6tHF+W68-G~?*!rym5S(dSQ9?;|HyKWrzP zyPhc~&ptgffGbQz1)f>6Js2fkKf8GUg5B#1ha1PTy^`l@Q~8u3oc7h^W5?;cE*QE` zIVQfF8w%gq__Mc2FE@B&$Ouw2mpU%{guKh66 zm+zk(CHD&_OG*P^lqyN~%Rr>*rF3Q$I4iLY;*b#Qp~3`C9AZbl#HwiDY)RgV>&%s3#|%IJ&L`)ZiWMEl$wks1Z%B8F>h1-(~lvca!L@ z(2=RQt*$7aX(DM4|f=%z!cFg8MqD-g$ukX@%*-Y7V_s_m(iVEzr3hX$9tOX@x(eCvygub(a z3@uBka$_Sqe9lbRh}L4Tua4F9#`swp&cI(j-&U@E>avw<`eXTCw&m{TR?5_6wj((09Udi$Lz zIiU?ruAm$))O`a|vaV%{Pn3V1xQ(1RK3TG~3na^AodJ&x-sET(aqVnV-eZH@zU%Z7 zvTs6hE!Mc5OoxA6CwZf5>KOUBC^HY8x*YK+kMAI7HcmAXaIv0CPIOPj$O(av!)?QSM% zQB@6HGM&d_kh5n-Z<^jCZdv^+m~p&!^Rp(7#4-Z8XiPJnppOY?v!jItx6LZJ4M)rN zf|8NQ?hS>*D;}E;6u0fzS%1-x`NA1zE~RK9mf1T^E|jkU&exwNzBczf$`JW^L3(lF zfJbKxkY_tGpl`Tl5@eATllPKsk4%)1uXs+El#67!OEEKpzy^N}%JPK+`aIi;DI~A2 zoP<)(Yw0=^J{FUT{TVhjRElSY3b}a~1Pb+k7+W>+tI9&u`Cu6Yeu_OUqk+}njv-5XYwo21mg>C0#ASh~uygdRDsUySZWvNM-{a2= zDQ)l&Y)JN>JusJassHQS7-^sZcvb~+FP*WG2CxZXGr|^xYY?tQXhRSph!ENlIuJS$ z#0U}uDS`|^j-WtLBB&752pR+}f(}8CU_dY;m=Mee76dCo7eY6}R}ij4xE|rF2wM@h zA=nV?2o3}%f(yZo;6d;r_z?UE0fZnz2qBCRL5L#sAoL>iA;b{k2>l2Ngd{==VF2L< zgs&ld9pOfVn-B&Oh7g7kwj=C7xEbLa2)7{YMA(I}8{t-jZz9}=um@o;!ajuC5$-^^ z6X7m|yAehZ2*N!G`w{L%xDVlega;4~AdDg$L^y=-Ai}p09zysw!eN9X2oEDXg77E; zwDZ#$-$D2;!s7@>5ylXXAv}TbB*Ie&Pa_;h7)N*p;d=1;Z20M5KbYyjqslc?;!jH;im}iB1|Bp z5i$s;5#B?1AK?RppCSAl;S9oAgh_-cgbxuuLih#3FA;u)@N0zMAp92LcL={n_yfYn z2!ZrwE@Rd``QS&Y;6zXb5zK*$4#) zg$P9ma}bIVN)SpB<|52PC_^Ymn2%6_P>E25P>oQ7umGVJVIe{tLOsGFgvAI;5SAh= zLs*W`fY6B0gs=i(CBiC%)d*K1T#c{>VJ*Tsg!Kp;5SkHM5UBHI;@?;ZYy=Jh7lDVs zM`%S5AZ$d~gs>T53&J%B*CMnb2oXdG?FbzRod{wC34#2E8{sPm*CAYw@KuDZ2-^^B2zCSqf)l}o;70HucoBREeuMx* z5FvyRMu;Fp5qc1M5&95f2yujdgakqoA%!r2a09~E5WbFZBf?Dxg9t+i!wB0Eb|Bo0 z@C}4p5OyN$LfDOPE5bJsZbR6Euoqz;!tDrmAlykm0n;D-v*icQe3w>Gjma4lD|Hz} zppzF1IzSXn_ikn#k_EfgX~Y&Csr~E3TJkY(@*d3oRFTCGq$}uAJNZOCxg7nbit1t4 zX*Rg~4M+#{%yeuOn}Vr#NK!en?Dx za&HC{iOvBj`<_D+>&Rf?>AG@n-k)6tzNMeUGg}C{8s4B2j(4+?K`k@kgKs7cMok;v;HkYT(qwLZ7Ol9$2e zU!3qcq$cPCh6woih9xCHnRWP6tqBI%YXTlWZ0`@$gCbzWE(ylF&51niQ{xjs6WO7u zC9tDgPY!-qT?10%R!OU-H$dLIags^)y_zn@xbVRmNSpS{B+R^Dq&*C!^UpH%WZR0Y znWL7g42sF%)ssueb)}FL+uJocf+tu&K7TK>Yz};Xx5dmLZI7fW`>$eh@N>lmj0h#F zP^$nhQkV*FY;vhm3B;+_jxHgFo2R~45`h4sOJ{P+FjyET)_+Wt)fzROekpYy@jXIg zEM;&)&66@%84ILWkcMQ{#j!zQQf2Jql5Mfc#WV+%Mw_iMn#iFgnT6FJ*39NVw>=}T zZ=PB^PdK1vGX*-gyBEBaX4uf#?2&^hK#m-9=>yp~@iIw=ZDpyM}L$tVep!u>l@oS92bu^=7NHlzTRn8L~xCBW!* zYl1?7kTe9KULk3&DkIw4Als`gPFIqXhtricE_i^TX2Wn=MGlxQJdpmiVlHJF4{ zep<*0JKI4tAf8!@B8ytBfSp&7#IL2^CU%M?{hVGh^mn+vXP%wxz{m!VKC^LlNbMzu zI^mq5|7IZu$##XjQ^+A=SN2&10p|Tv;5AyDUO-N=G6fZmlqet5*d?9W35aq3)VzEv zyxY(Zq+TI8_WZ__+su_QTJ; z@N*yh+z&qwz|R5r8HJyN@N)<$HDHN#?8%B~Zv5s+5|^M8^@q7JPcmrZyP}CyPc#|n zNyZX^USEXIi32&-lVW=YT!}y;&~FQbeSO>>J|*J2nMA);Q&ugz>Z)LVzNVNBpp!3O zTGHT-^fsg-@n%SO9$iSz6joQ&>VO5~<@M>6-MullIP6kOeF0N|QdOk!M_-zd(hn?Y z{c_cMHmB9y>K++CeffIn2NjfgwvlN5P_bits@T2-SfFry?>uOO=3JwpjcjvF%$ZA_ zK|}V)k5vk*$(!%WE2?vc4}6UnaDRcSL6-e@F|;sBc4{tnA|O-^-8TF|#^qj6DQH+T z-q2+Tt5;B4TNPadsUz)AGGdwTnO?IGZ5gn_66OOGuP;;>U(&}9rq zJx+cg-~hcwkJBCrKyAZk4}tFgp9Z^0NM5mi^zn87pp}xNbEirK%?;PZSv&^gy12NL zA#M;hfX<-X<;b_NIBlthSfs)3YJhBagDvcAu-V~njpX*{5`o#ReDJY)Uj7I~zqi{C z)|B?e;1#xB=XFhlW)@`={$No8Z3PZ6NNc#lt!Tc7+_xFptx8}0wVb^7QN?!h^rs(9 zYc6{}`zYJ8dq-Qryn$&j`U6_)x4iRSMI^&6uCanGU+b}_si_yj6s#T%R6sYK{RgBIA z{Mqg>alsx>t+9t%6VRBHH`P!B(On-(dZ7(73eWKPL(6u31qvEJY>bg74dc~Bdq+bP z*>|vbaqe*8Ebg2cl*>qwx#1bY*kzE;gLjuav|(2_zI*hg6%3>#U+T>*<8TT1pwp-n z){)V_$?Hh;m5MDusam^c4|`V^ydB69L+?ylbKeL=s&A6EQhzBq(be!$?$`Nw;u7qg zK#$++?~e`G{e0elGs5cih53P0&~J~kQ+{8Ro#cnY&;=aj^my5vgqIf$_n$|HnCbQX zBC32jMeJiaTOCfGivtc)zbg)2G7-oGI?fBAR+*z367|n2c0fpjoYX(ypTJ3N8)u%W z`F-(mL4!O0#O2TO60>0{kZ{HwZdM;BoZtn#o+yZWq(DxvC(7orqb@$j*Eg9mHwqjMpH@#?Rk(fQ4XpkAK-R%jl1v})ob8gI1m@S}7p9lDaf zcHKDhRLxuSp@z}10al2$>&KZVsekXz{(HkXbBy};K=$9wMEBN;WjD#KDVCYdaq~Q) z{;qH{pBLnL*v;)RS+J9n91sf=G7sCX>@nyajv3YwgTrWU<+0cdCNIZ2@|xmZ>Ik2! zV>K(gw=%Z+HD*VmLnjHcJ2d)WN3WR|=PNorisrt4f3vB_r|DqCnAbh?#xTaD=Jr7~l+aggJhpI1*;r`=p%`wOZqe>f~Ux5Y@#K zZf~EZIeG=w5q~2j058Kj3XDf5=kF^cr#}8|&5P$Aq|dIPwTw4vI0^TDTI>l6G?b@m0&ro&AurYv9L6ejE=?@k=7mIu47daq5Y%13#GQ4cJMZ67}^SZubK z;e!M`TdNg6NRdt0+qukyKSw88Oy1pDrNtd>A$fp3*@y{yP-=Nl0n_}UOxY5niK~VB zWqUZGqx41k@RP)yafM@mTK1sV>rtpsK6_(QNmPM!3AxW*#T+?uq>gO*$HdwNPMzPB zprSsiW?+o=r8;1P_mH6mt3tP6fTv=Up+_caB@xW|1AR*z?l#DHu9Q4#2Un`x@NtUu z{Wg|4?nuda8e`XGNmFFAPAZ&!?d|E)Xe!os3I%_{oSIEWbk8bpjs zb}uU&794`=2vP^3^bW+8y&_T1d8xh66#I=EW2V}wh%v?$p8gxb4EZ0 z7D7C=^%jUN25wE))_Tk;E6=3XwL28Lc9oXpRY;jB5cQkkRMZGi3gklKK`ZI`Xkry; zfVbHy)@Gw*p1^5y*++XmzU@lA8hANW>HV+}oc-`FD9@LjAhcof-&>kMwOHM}ibjK& zqvG^~xz(R4siRx65Y+lOc6l;aQeQ#qqDtzuETK);9fwzBokzvau)=MEhnou(Pv8tf z4&}iHMy{*`6>~5*BXVZu8gA}(W5Nl_M*ScKI?!zvgjAh!Nw-BF1q*n#J`j}{%t51# z0cw_sMSuMc{c-1qPcf6=%?qEV1h>$ zbVi_ySDaacRHoh}!=XJX*YFloPMm5$$PT z2gJmGNm!MX`b7RNtA0Qxg^2gB6L8>9D;k%zbAxi~lIITZ;+XgKIk4TtBwjAGu0~I4 zOI#t9cM^IWZqC@VQ+HDrX+)YStf6v!qI^XghzSgw);Of$+>x5R`<==$Ah6+)YbZ*B zwLKOPw&rFyAZi^--&G-xbQ?rHK>Q3twYLQ{nIbMn)tqxg>7yCo6tYx}HZZ9>QywsB}=K0hL`M+>Q0_m~>nJ?iZk;fo)^7@<%=+KHf42~$? zKQZP9JNde}M-F`V_h6~}(Q}jA3yqyAX!ZtbX*U^5RThD#$Mynp)8?thRRM-N1^x?c zbDmdu5y6zB27A4EX+~{lLN%ZkxE=gF9oQ&6uciwIwQLvY-L-so=g=idB-@s@3{SHI zlzSh5QtmqkczemI%v2M3Wt5jCME^_j@2QV6(tOV>MH^#6`@pteWmITu8z9S{ORuce z*d)AESk@v?U8J(ae)w)?gkdv_`Xj^sP_n&`HK*0`Ck09dgqf4=c%; zo-|NSE>3A)a8~0my|1B_i9~qw#BP(y2<}v;K0C66G;D%g8O+}IVn%-ft(}}IOs~%8 zx@3VUEbAun_+KWL$(cb_S18JHnZY$KEb6xe#9}AIE4KN~60={3`vZo{D#|B>a7~UENaN2W zx=4kD=P6f9i_2u%MS4)JmojB4?D;~cVyc8M57_i=jF9(%fpyd?k<#<{nTfKoQwZe^WM z6DfpDV%hK{NCeF}eWcI_Z%rX(eG@8Gm@Iu_I~;m$_7ZCFL_}7jHOQ0YW>cs+%vLVV zwq?;Coi+P@+M~#SIY28Ner4@0YtitUn|F*JYkCrr31hb}Z_lm%J?)EbCfchX`MexP zBlqr+xw|Z2ko)K(*kR5CezZO(%Rde;{qx*X$W9!Em#U-gi!Ekn!*eig-1ViTy*S7X zcM3);6{oM~VBB z<)HAw1_d&UQylFA+5dbEOz-z3yMn~FyK32&6S{2N`0v{;5?hgya-4GXM${^NB#g-6 z7b)#R2|xF+fGEYZHi`SPj#Es1K+n|o*`;2yy%VgH84ji^z|9jep=rftX6udJmZ(8( zQS(6T>Ds;3O{9fXRgj~rhKtE>)*l1s`y-i}V%UEfI(noL@^k{6T%*4Q1F9LzHFNZmg)!$_bwUZAf6s;t>s%jqDwyBzpD}sg`dLVf#*~_ZhTpmY3%iOt;`v0gF zEP*1es#DNwhI19_Fn~KxyoNCD2X&J(?^k_HmfepEA!m**B8<6})mYkPY5GjTs~RVfLbjNldu0`duIXq z%96?-9F^6wf=ZnSdvHWjJgUzAo-Pg7imS}qWbDV=S>)7Lw{r@ky08;85Px311UE^1 z)Uwi9yUpAH`Fu>VVEh*Sb{4ISDN&n(GF`aas|r%OUaeTFGRZleCI@NRKDdUQ863Kk zoV;Q9))KB9tX{2ZiIdF#d393_?8s#zd5U%ZTuHWluVMZ8$?L$Ay3}s*_JNvCLS-Ss z%n=!IcdM!(M&4dd)xG<5+IAgTazwF=49-?UO>t#)9oZHKcL4OarCG@#Zgn-vpLGTX zIC1EQx?`|;oMGHvMIx$L*R!T4NfjDX$7&Q-ady&M~)|kSK%0#N8a2y+)JXq zswTL@kf!hB^5BLy8LPp1|1^IP>|OTBpKsp9;&LK zRYTlmGl!jMJkbuW3Vo(46eWpZ;P_MCq`)7t6*ncUs;S_JD*k-H-)@jko1Y5!#6qi zqoGygOrUBm6!q9{yMUw34Q?DbNrcXLS6mnDA`>p^#QfhpfK^ z_c3-nOp!9kbQsCdBowznz&4fh)m}k<_TNu0&ADkWKtZzH_ZY&_fPNsz230|js6yWj z5lRlhb@?JevIPrr9|F3CV45x0=s@O>DApcp%iC33f?ZsfIcn91V&r!1U;{a^_Sj;| zHk+Z^t|x;(gt-+4UCBbYS?<=Zh!M|3NA0X*F&(#sysaHtlbaDHL6JKY)uSSJ9of3M zdco}OfxK12`~opdRODNmt6OFVO)1j2wz?i2l_l;_uSIxaiJi-6tH^)Y})&nuUodlUQsp zL5qJzBj;gK46S~Jf;LM=0QUjD{PlH_qYRESR=uC8qq z=9f0Nv(MMbLI!mQl~goyQXI1Z)qJ4^_{AxzZk{b9mr#9AumJ^)DD@Nv4uRdv?#${m zvZ+nDE5w6zBF&E3iPtlW$iXhyB1V6xxEeDkz=u7ZnMXFdGqpt_QO}Ots_(@TWXF9$L$kw+r^Gn5X$O`y@OdiA%c=JLau~@nltz5hc9iiOG zlCf)mg#)}4(2Y93$8AYAV-SSIqwtaR@|=QY#WJzJBiIWQOYS3ta;j&{;^<1UZ0IQn z(We$n}AA<8rrIolr() z=Y5T^gGzoFgZy?*3wfzTNo6T7&s{IitCP*-F;_z}3;VtDH(O%_8p`IWh4gH0l95+3 zf_&tF3b-o1eolm!%SUFDaCRog2I}?K-cvhGF1}pQWqQ*Xl^+#>(kdEqD!vpmZjKoH1vHM;}}K8(Iz7XUVLrwWjO_uCT|+ z0X>M*B=Vn6C8UcrYaR}Nrtx9;`{3dJQy*iph*}y zP|uS!?Xs#t8DGtSlsf~WLPk;{(vU}jz=Aq8JXu#}f(DG-$RllqNPap4^sm?XQ;W#C z*P(Cs@w*@?v5}XlpvB3=UFr2}R7{ZllO$D!0GFYHW)5{I*lv(?cji7uZv+7kL$=>| zabe8cBJq&O?&6_0_9L|TS)w!91m8HnoeK0@onUt0=fTksNs6jNc zmpl0~K8_S8r)qBdOr}uO2mOCj4H&xD5oN=%%5tdt&YDf<&zk#k@ndv8#(rz)B|moV zUWv>Tl5ML4QDfMQ-JGe*1xHlROl0J61v&Q>XasA!E^|T4_!a3Vz{&yLk(J&Gcg@ z5IA|PFO&P;!dnT~VvY2Nb9S#N8kP+0BD$*Gl&aUI&VBiK`myZQm`>}%DEZI0>_J!=?!D(In7H2yIou28Qhu>`dIcp1pP#Bl7uMxC z%FJO7%hxy4fCl8Ip={!}shnD8rTXb?EhZ^fkTa{RE2>~Vc80q1oTmXD+3@4^MO`O~ z*^u7FObnITEXTAr!vSHCki2^z^aG9k6x!_JcfG2xMCBm|u+1KtO{k{fQnEgoSvY@& zRB4Vw{S%Fy8xrK!XQ8@P`b$OCg><*3dG^$KMLQs!fpTEo_C=J!!8zU+kXRDa6DoG?Dc?#PT3abtslVi6i8`1tvtd)2a@_+{fy1C#d8* zC70aE6DndH-gMFxbOEx7@Q)W~%9iKeErV)+6Wpx3*g-Yc;#5XiGTZad%kCadHIEgO zo_|8iGgs}`^~pj4rc)|nV*M`nA-O_cw&8z61x(OMRfj1789Ygn&xS;=yLeT$GG}8l zK@!UakN?gVBc)<{>80?4+*0_R%p&@BdMoq*e|8u*m5um!;A>n%Uuz_dO*@)LAB8n< zL3YjKnG7~ZM~70yvLqr2hRY=}82x?uxufP1Y1izU2X#2^c|EOyR=(TDgURFV&Git- zZ7V2QaG5$HW%fC}?y2U}aNPs%Es9tIe}cf9{4y!m3!i(cqUNKvn{r2=k!i?P)XL@o zaWr?aNd+Ubs7B=0O0f*yX~SV-W_Nn^KnPnqTusL2q!*Kw4p>YW_f)r&6E{Q8{F(a{ zn`j;sA6QkA|DdxYnX9_GG$tq46jUWl1Kp}FR?KT>M7u3UX9w7;aB%QBrNR8;j-Qqzh|6lOuQ7GAhq&PUMoL%dl#scFIi*ym%T)Wy9JU2zTnTo5Y+R0V$cAsmRM) zP_;KIWqKV(20d=0PA??i^<>^FWI*lSi$@GibSh(gF-%rL(7I)ky?@E@N%XqOZ{`FJ z7)SwyN%}g{^8&mao87-eYCpR?IRtiFtBYt_9hbJ_IY)1~eSlL~ zQ~{=;%Ovh`n4%pCoX&DxzTaX72O)Umi z{MF>G$*~f$e0}wN5^b0&EJ||2(0@$cJODKs2=OX#Mt-C!pSy#?7xa+onYrPyybdY} zhIM*tRuwusMETZee-uLkDi8xLb)e|an<)Tb!8UjES7HBczfae}ClwjE`Ots+P@x>i z9Xc#T@G$FdjmU&le8;1*{%)-+~)EkVQJs2nn71?OkIuPMeSMBj_-==FvPE{7uQn}PUcsutFLoGT8kGGPaspt1~ zSpy!21QJPB#sxCW!Dvvx!|SWY>W3(=L%}imJWSH~!W0zcj~%^+XyZ_1S^l?)`a+5V zL>O;DkatQyIF}550)!mxTh+x7m@=h-Ad{-iQXeXI$$Z@o^44cZmg3IinTila916-L zQ6^-$`@j_EEeHqmAJg`+fofqFX*v~D?nXli+gR27Kr}Z-beB6%*tfo$DJL8EOm>mT z$o4r)9lho*DpKcBQG+{Q3N$$MS&!TETJc5LFY#cejF!mpem0VABirXgS3g6b>yT0R zF?Sd#>N6b!K20neiCkiDRhsSTn5i7qkd|A9R@cFx>DGx{6itT8GmET#rPnOap4Z8d zbOD)Pbozw~IS7WddhC|z=$pz`tZV}2xy@?x2{3igp05w#O`IuS!R!hwkCyZ33sTef3ypbNbrV_~=t| z+d@;fhr@_PvdtWOPs4KZ!J`m0fYZWS(i}KlP0szYva*6wn^ETvj_kc5vt&UBBPFun zaq6gSn?}&m+pox~sl0mY>01gr6PgY+Vcs#Rgi0Pp)&faJ z?@G=TYQ#1_&GC)v z-VfEK^L9F;HxFG+PHB&Kl9MkF%`4TwIxn+$Vr(JGoG%*(?VvTZ*#RI?(vDTF#3wkv zOVB43)G&IB|bLX zlS>s}MM^gs>+`8%@FqJdt6Z?*f14YwFR-zrTC&W)y^fgI9@|3Nx{u3f7Gk>!DgbTK zB%4s0@?M=S-)rx{8Oe;BEs;`S)Pm3Hp@$6*l80{{h5$`b*+7baSII0;o50rolL7eW z^}nkupB?N>5#2Y3SI$ufxI7yOa)9|nJ$d4Hl{JMaqXoQN!LnvE`CKwYg=%uQEuu694Nk-+;jEFwA{iiYeuH!ph28yZ_%k| a=m6hCcoyL~gy#`npr0r@^&H%p5DV?5!}hJ;V05-s<<T&dXtj&^-sl z(w{;Jd)ppLgqOTcM&b5wK#lJoEi^r>uuR6qh*MeQMAm5mI-N@ zFD(<%GCx}8Ps;*mSs*P7qGiFfEQFSY(y}mGCZ=WKv`j+FB52ttS~i-NjiF^@Y1ueh zHlCJEpk)(j*(6#vnU+nVWs$T@dPo)}971CmUvYH34-#Pcmhv%V;PxrV7cYs39*a$q z=;&KcMsP9}WE#kHkQpE|L1ux>2AKmg7i1oDGGe}LPZH%4L<7D><|9Q$Ib9y?Z@sX#B{lYPyLaNoZcE+f)WQD{6~bt3hCArvtgceKWj@rkqB zuxZi73Ait}&)R)Kf+nL5-2U^z9fW#cf?_;H4O`AkrKoLq;8OsS|zQXt_byiqF-Y*W%d1 zL;fUIw1W!AL#qB;C@KmM-PW6k`>2)$c;G|nG~D%K>IZo6SnA!hdp_-6aLBz7Nf*NN zM+u%4_^lN^DR`F3^4Tex>}wA*hHeY_XYg0Sxj}`2&k8pL&IpL1zVpvO{da}?ZWFeY z!$Y0(_MOJV|41E$PT=-i%i(2LN~Ypr<%K2Kqp6+PkYB>XQP}uXwgeAZ_-$z25ur&ocXYA7w_mBj^8^D|RQFB@}!i|-#>Dt)_EQz%S@}F1eb{Gu1W+=-4SW`-nE;3 z>>~-uDtR!?_4lez|!u zg&u8_waMEQZOS%Po4QTYrft);>Dyx37PVd1wz%#3wk2(`ZHBhEw)nQCZ3%6OZAop( zZ7GkZ3I}9k1ZMG@ByE%ef%gp zY80G-cGyjJxE_TUac7+|;O3k&Nxq&g0z*K9O*v<>`QGDcqF1o_hlPuOI!&9LYjLfpMMGFm6c~|5zg9hJ_gK;WmMcCVn_d9*v9cCVz}1+@DH+P#W)ucqB=X!ly$ zZKB;~+HIlTR@!Z&-FDhtNV|(@_d42LOuI{HcPZ^Iquu4SyMlIC(ryRscGB)D+Feb% zYiM^Z?XElIu1AiA0iy(AKBa@29Fi>JlS`1ivwzy zdB6Wi4Lx>dI^J@`e}cC%?wW{1q(5YAKm&3xEu#f53c`v)Zw%QQd?`3R$P!o|a5_Nk zpXFC6IxSl4d#CUnq1va7I!(<)b%GZ`L!G$01#F4wspfJlerf(#EM?vdWrm+=7E}1< z&At6tx~yRl>wv-jjvr@3ddQ_R3F={kK9``k5O1z`($Yp++C)olq^0X==}olsW?H)8 zkhB@KCxuNCNCmeFU?RCa_`RTygBAy71Uwp$>HnR7w|}zVzr!B)>+{o#PKv5TA-;Qk zmkIwN%<}obrv^sd-IN^t17!)`7Tg+k15P%cnU0NW;Y5rqw~c3{IsN@U_+(DM0uNQ8 zK)m6U@A&OQ3#F_pS%TL1kayR9h@#liWfD|~@HXdX{Pa4S8qnI5=}9=M$zxPu;*K@Z$T4|LK4m>$?k58O=;?4k$mp$G1z2fFBiZhC;w z11@@?haR|(9@tF}+<$1`0W_fWnIjNWsZdYf*s%D}q!3r|_f%?dSdc8RE#OjspMQ>D zzvv}j?0ZT0jL*+Lb5Mi81#MqJ`Ow&zt&72~PNrqMZ00x|e0T3Dii*ZCY@jRd^N0TW z-25V;?{>5uo0l_>VaM*w5BZB86M(M#gZVb%HAG1Lb}C9FgsvGh zrgL)igzW>f@23P4IUSCLYlVBUA^Xe)_!Lq{%!x{RGe*r`8?6p(=5yB);sHhi@YVVbf3i>fJyZ&U zr%eqfQC9A0%`Nc~vQH?d#&+Mcfl6Rr-_hGa2}9Ql7UA~QIxRzR?P~hzCCqzc>`@QFZ&9tueCclkXbdQGJE z-6`BJ9P6W?Fq-N42}*!}BNRl79WTw#@C*^25xFTWXu&;$sX9)r20Z*ys_<9Ba@Exy zR&_F@7d0!nv8Ki1xHGGn%ik<4rg(nQJUD+bX)lzZ1ZLXN`HT;a3~!9Vrla$(?>;R- zbD34I%)f;q6f`&RL+F{_Ir27W#{#vdMB^R3vDo#?!nJtC^Yib;6{Dih)3SZEtnZMl zA4&ZJS;2ULS%9Y)`zMX@lZdi???CT|-YhT+&j_P^>|sl(hoMPlGG=3c3&Q8JflRsY z=~a+l_J*VN7)_2I58Zbc7Rxn$*p}U&iX*?dwTgY}k#JOw@cY>%U}Z)wui^7GwZq5ad~q=RlqZc>&}o$Ui_{ z1bGSMWsqYauYeo}c@^XYh#TZ2$ZH_4gS-K9iiux)`pB>vYCl$B5eO_n38DK#ehf(p z-bPjVyz4VtxGmtbz?}g)6y$%0-&=_FTOhi{cPMOS(5Joz(DXbErkkI8)?-tDb2x?W z-F|5nKYJ?3z^rM&N4dGy_mLL4a3kp;@1rps3sn%Y>Qf};zY{&oQzYzc>m|7PK=at` zI~I5@!tPCP72z5Cn;DK4#k0!|fOyY)-~*=lMv?&$#K_1k#7w>d*J%s5&rK1O3gh*w}b}GKISE<-rx6 zx8N$l4~a0&kcCmG8)qIf^RIj-Hbm`%PJBuNGd~dc$z&*J9txqTU6?)0xiavg-0d;A z`5tK`e>;=(cr)}g?mp~(x_KEl)t{3UE1^>Z5pCY=V;UWhfL>%;&FlgC4w+hXl2Mt!RLbGgVqE-A21Y<=wHHw zo1&Ndb5!cAkB2Psz5wu>L@!5jPHEhVge{doSE5#)(PH@OalCtU;{&(&G@l2#0CExJ z1CS3vJ_7j|3;I&4zdm@sizV3;uU=g{v%zYP5>^n=i$(6ga$ zguWX3V(7D>Plp}~?F)S*^#0K9(4C>%LhlHrLz_dJLTf@RLf3^_4(u1Z5TnWbY#q8z z*!lPW2VMHehPhvC1|M(krOor<=iQsAnKM|o%=*#W<|g-SpRl8GRbKqeDaM>uMtBDRt~_)t0-?v%U&avbDUkP{$o zkdp#I#C)RL7LKNDkYoao1(FS71_84tv4X4tnF0bWB$0wdfpFD@DoIv@Ky@TsRiWJ_ z1t2$oz$-|UAg_VE4)O-bDUj13XF%Qrc?;w$$lD_ZAXyK8+yrtn z$Oe#RkQR`QARQpvK(>SI0J#gK6Qmnt69^4*3&^b?n?c$^+Ms9pf%wDcu^=#AOKu0b z1LRJSEg)M#Fvx>~Y=Pt<`0y~uBOs50^a=#Cli~L+kb6Mx1?d9W33vkhz8fSC+CK?| zyRHZ1K9JoY_k%n@nsGQfgY0bn&T#aQpAh=RBsQvMG};uzx}KhaOg^l*F$s<3I9m8* zHcGw&y%);5eh8o@^UxG_@XZivi60*N7Cpf_w0n`zpSv`Y?Ra1usthEiOAkt{RXVv|qm#?Eam)7wb@f%i}WalC(+n#n5^o6|KredKC6LElYB+1R)|pw&mN(&3)hqdw<8 z5W`w2x}FN3#%A_?fcAxT*BMYc*T~aZgLn+ZhT(y?&|(gl!CvmUfWksq)6$n9Ji#|B z`UdK(W~EhOHf!yqhpeL35^3TXq(VBH8M?=GU7$-tR$D2x57 z{s=V=P0H36mej|`CskMJ8*6RGqB4uDxG62IF*kL26G0zOK?y>cLaW3bz7HN^XEYt5 z_E4T@spLA9oP@{BL=F-Q&l*ME8*eY}SZa5r990 zaiEO!gp5YBS(E!iVBGW#I0=Or9#>yRA(1|e8UTi?~IplNJ(4LRjFyiRW_O!z# zR^HBCgQahHF8PA(`K}GE^(UrRPoQ(Gd$G-Mx-OIR!kp=$zk@PZ0_`B zeFq}ZkCpI5i7)Q>0Nu(;6-sI-gl+E3p?07nu~I~dDT$xw@vN&)imYK^l>XrHTp0nZ z`T8}8ATm_uM}5air4y;b5Koo-bb7PhA_GV4oijNkcGViRm`u6^wIc3kC8(9OzgK{& z_EGIpWTGVDq<_^$w1brn7^rn&d!l&5D2ZTOPOU{70@)$q0_rB;Bhn~D$tZzv9X1r|5GkmpT#@=?>-clCpIbc?rd8v-iOo&x1*5!4XQtgvN9oz3Sg94|YWogXWOro1(a(Hoq$eDKJuh0MAz8DDw-KxZmNH7ZjexbBTQY{1pO!MG(W$ z?-~B=rNKx<`viP6jh-QD$!I-+ou-n}#B^>pithaRO%W02AD~i>)Q&?3x!{3Be8d6z zlTwn2Z1_$a`oa$zBd8fHH{w3zCPB$0HvAzDC*mouqC433J{xM`znF|sgU>Qzy0se( zu;O!V=*v(_GLBqcQHLh6(&0Arei$W*WW%c_QD20xeRDIx&EN`@J|nNCU}W`qMwTRs zjXHQMdM}Wb{xFuB%uS7wXpG)KtJywjJY|FlA>S{9L#MJG%0j9#m~|XO)SX=IVahYF z9u46|R(g{eeU1F&dabIk&_>SPu^w&bb$A)Kzj|RK3EMn`Hh9{LtT}Up8p}HB_fvU% zt1T@{x5VdVCmWNU*%{7dNo9??0*hQ%~j3>`UREUB^ES#dnVsky7<15`SWva%&D7o3y}!<5P=T?b9k3eP|KUK^ej=!>ehX7 zGB~~fsY&dU6!?*1A2}7l5C2cN;V+qTBsLoPh|x?oye|=b5r&%weL}b|X0aV>+^7<< zrjIHpmmlkD8IL{}ao@~lGc(^p`$CCy&nI9!W%o+ZG<2kyFJ?B|-~3OM5!S78p$7KoBd95RpXH*)u54&8& zvqSL(xyFoxe<%<1<=DtPY*ZHOrk2>PrZqUorrGb6^LWX(rvmZr8FdoroH^CC6%~zh=17Yx;E!x`g*36s zTwyJ)wpPxQ#v5>CUD+f&pno+C%l=hyDr8l3amCtldwFG53y4@7fkasUqj?NZS&dhE*;IVrrtS&X(BR^;B_g>^r%}l)Hf^EVDpvx{9cgi` zUSZ+Lt^!89R>8V0 z3w_L5XwhhaBOPzVVo6=%xW?kNOqDTNRg{o#ljZA@%%yTeL1X1|+>uxoMPfJYLBY8F z;;Dh(wXpM*va$H^Bd)LjdtqT^Rn4mC81f1rrfnx?9{`i&qvHP|X@m(7nQ<#Ad zPr3LOosPHfgE*HX5r#o*+VOFC?W4!8$4Q@@ipCD#H=yaq%>!z#P)wFm4EXnBbW%03Woc^wO6Fxrfy&(L_PZ1ZnPXYMNpCjUb z-*{6vw@<;@bKLQf{}enF@W!Ys?fHAF@u$l9?^ff_Zu?)f8ZxuhqEzeEGP9!4s@DG6 zhjccb&B|MiLWSIHx2r8WJ4_!oCEtg9IS)zK`SGz`-rl4iF&ckToL&V^8CRUyUZ~cn z4oc9ft{4plj0S`W|KAz_y#Ba5-Ae_>U&yqZh#19KWeI;;L!3 zJc#RX5Dt>4|A6jtbDqXSyxG2?NR%B0jFBhaBg_{%{eKc~?l%3OG2hk@kyQoGn~I=< zY-$^&QegAq1v`l;x1Gwv3y%Z!-MaQ?R82`1vFDtpQDo?mp1Y`bI0sO29UIk7(0efd z22qnaU@^&rm4|HBH1Iy>A~^z{=lmMU^=wohcOBsz0sg`z>|oKYXo)}TdhOR85;>xp>m z5h{i>Up!0&;|(RzzWDRP@VVrjfCJPtA|3Mt6~OkL@26%^6M+qC_4xxeT=ZAQ=vcLD}P!af+pN>ryQFiXvltX^yUZ zg|jI=F+L8reD>;e(i|FtmJ(^}BPaqlGi71e%|r=td$L=|h~Mn`!9&cfI+*2ODZ5V&8|TtyucYDKmcV#B&NFgBM!$yBC^5CcoH6smZ%v z@2BPwSx^iLAhFX9PyuA<+tsL+xE@^qxNC!)@+0mq`r-30fQ%#iW*nd*h->`E$d71- z`lwGhT`bcjm88fORoUh7`FcZvxolZVRZ^ltkIjdA6%t+(`gzgil{R}>G;aq7U+LY{ z`E1whadLfPrLsOhC#7&@&dM5DiL4^8rnW(mi4D(o_5Y7W`|?HOj-uWwEY-W@_`~PA zt_w-Dq~z;tjZRD9(xpx!J-wTnKH-0;<9`$sdA}BXg%`TCftsuoZK~65tubN)a!tSX zI*}K&zPRsbmo`MEEVni`rj|M~$}2MdX2n8Y?1~91P1cq-#V5#%%IythCC0y5ROL%h zlqJicEX`P6omQnNXsTFutwlL8dAVzGh^%;JeR4)soY|VN4#IN%UDu+g)yy-;y2c@q zaaloqW(q#Jw|f-%qHH%6Ba*>P0RB$qrz@#txH)*Cns-LH^Bb^f&T-cp}~_lF2Bt`q~+)h^n$-?YBx4#(ep(u zrLDgZ=g~0`Iut+hC|ZbPU#pW~*{<9Ob~x@~>P7^M2a|2V;H+P&$NFL88vj-j zc0LuNq<_`;aiM_p!o1|l?GpP`l(!! zesdjaW1dbr6OI1wnmg|8mm88x8q?C#Y?;ZGnq;Fo*IJ<{&=%#D;PB)H({XcAZ!mB4 zl=43|dKy_`V#2!2q)J6WXfbD8|)?P z8f)UyDiS>7c;a8G>u-v>V)&8@>$A0qWy$G#Oux%%%_jWd3smDN?M@^yJxSp~H#GM(7qy7qcK z(&gYyU}&SPO6$x_YRafH=2qqX4gIs`Py09{VK+9d%viQG8k^R~qy})&7@MxJP>E%G z$zs;Z>Syb8NT zQ52VGl&P2L4K*3qaIrVR7s$C>$wol{DFBVrR3{sjT9VS0wQ89>Gp|HtjVoK`FeLo7 zK~7@7v>>5KEibgnwZzmWr&`F`@*R+RZe6VD^bYcSwNmhMhiY{j|U*i_Hq#b=|C=|Os zMB$uq%^>Dyt!M??ZrqI=z~ff?X*k%32lf70SMl0F4ozdDrngfNAauN0i97+qEU@yc zD4@i{ZV%JVX2Ty`jK1(^#5;UK`0!*7>7Th6MY6H(Rn$OO=c7IxBZh$C$=;<%;rlrfPek0_*xPg`b(}Yg=u)~rBYJM;Wt?~p;WzA&|aw2>X!zXh$K{N#mp zg}%^2qI@GE0b4;b>0WA>Z1}#H+DI7*U*ow`=)kSLtw@0VR@Ag zQkz+1Zs($)?X6=xQBVsz*la~h!n*qWsAo7`TiG7VD6}?&joow|>f-N$!1GOGQR;ta zcsH+MHq&x1Vktjh8w#^sPt0XAcu$bX4=hDrkge}d05{7Us0QVhkn3*w7)@kfxwxOw z`Ah&suc$DtEK12JDz7P(7d6%7$@7glE9wi#@WK65g2$gy>Un>PfyK*{#1%!-Uv8(` z@!8bw*~E9z5o&^uLZ)V;jt8Tx06kSB@_Ep1-h0l7s#bG(!*oD+HkU2~<$a@nxIU+ydX-wYdL+W&)O4ZVTt~T}egmhiEJx z)4oFlNhFe$+@&h-rGq`-nYW+WP6@AUPVrvLwbKHSBDSMmK~=(f+rt;pc((l>8?1<3 zS(|v5*Y`TM|3EmE5zNY-+lFL_jlF9zx{3d$nC%fhi`E9QrgbqW4lxdY>IQzjql7iY zj)tW^?EV+O(kCfp`_J=bm~MRl?e(rI^r)Ui41$&_8Kjr9`EiJB%D`?Ud zHD#NXDqF3&##Wb+`ajK27@Th@^XxIGehU>YITau$+L=s&2QZ z#6r7XrX%u1e=hXMEtuiw7QfJpho8_+>i%*+l||CKe+1`8y!H8Z+&(qWjGx{5yz+Ov zcN}poo{1*#(TgeU!_Zn^@asXA5~HzPUR7GSv~+1%Vy1GXAxr1fW$SXU%yT>;RH?D^ zkuE15NW2){S?eFfyX&gVx{Uhed8w80@o6iTYqPD{iA!ZQrHveO)nLc!<3TvI<@q2y ze!MHiUuUT+Y)DH=`;`k_%cD73TiMvXC^RumZ#U#?;^M&?WL@F4*HYF9M+=cx6t2tE z)hw0On(bDMKK4+@zg`sKC|U!4>&EV%{HltbDtn2CrSYw%u&Z@uEe>b&saJeeFz@E$ z3%p#-+iaGGGh4U2mPFyq#xqLZ;O{VqgeL^PCz$Xd{}+6NTD}gZm7;kUxLaxyIs#Z#rJTC%wO+88d#^4M@$7yiod22 zuGz_57Al$6Zn5Jf7mGb9 zH+met?AE(UZ2KcrK5l>P;zm*l*%=%5aWf}kgGL{qdMR%H1mdWRFV8Ag6{Ih1C|4)u zre?_1=adt@&WJ)GagH$+SrrJFF+=Vub@F7Xn<&IMNrGTMKl=e`qroH zo(Yu<_{yn8yp0xyak{MqxrsezFd?v}SJ)j-y>4dB$H#K3vhADCBZr8z-$hU@>-s(c zHSmj-8%Y1yHE0#j^X`L1;%2s`Z5P@QMA~b|A{A>Iw4oH9;k1yR1uDwT8YTCkz7S^k z4$*p^$!ug>?&oe`jrnWPcAr3nTA|gcZFaRDRt}@ge6jpuiP6=ZvOT#HHK_Gy`P%MPM&@Mrg<(Zw$50mG-PMVD+~?!)tb2M+IU0y zy6jx=YI$D)+*O#HJ-)(noiaXKk!^6q%Tlr`;_5P0W=(x&f#a%1h7jWc*cNd9?(R!G zr&6eucAHL#2QqKJ68H?i)3(#o)Rat*Geb*S@xLcW1+wpk9-(F+MmnYBVbnSFs%XI+ zL1?G|GEcAm*Yb8Ytr4{}wjNyM*~6Sgz zWITL>ej4jKcN-NG!bN>q69Vrf%E1Zm}h%7i=^fhK6Z3zg9&)s+=%tF7zo<>u&l z(%<|UBfT-Y!dz~Tj*&*ER+iei@5$hS@3;+h2Uqyx*#6s|C%Yf|2uaX9VrcvXMUH_h zs%xr>tu@gx-UrlF)!K39nW!cb3o~gc1W1c>R}@t%SHv|rD-z`8>5UFqTGhJp6&2+2 z#r~0iwi?znAh5&WeQ$Rc;5#Oh`S=)dsflSq3<|?PO(xa&y@GBjK6{i*rSy6xs?+tj zXO@KUjZF={>N2;7i{YrIMR!v=NSy0Em*p9#%*h3tr+LCR#@}gY3YnjMgqj_ERpoCY zEide+Mv<`Z4pURvdpgZPkw_mzr#~R#z5A&NWZ2$Eo#jj-&B)(?X$!ckZzbXHY)1uNH%+AE)=@UI@@*1yBIL-8AEEg?18XOl%qQqHJ3K&;IE+YR zbkrE`?%UaL%OHY`5NXvIZ$`)+tW#M=Z4G9{U+qWbJWab3U;Y-kSjUA2sP-Vp9mqw~ zS=rPj=t2J5Ev&iSiU_2Jd@JJDGq$n@nxfbM*8N=|wU{$9;OPz0@hH;A50ccBu;Pa0 z&lpmP7*Ziqc+Gn3GRdeIjee6J@;kkHd)=bH(d(9Sy$SjiD}Cr=$QvCqZ={TojwbzG z7Xz|Z5|^p2smYYZl_h2+r>8hpDC|Xb6^W&ZUb3bpnVb8l!(8tg7gAZVs#XE1C^b^6 zxd!+Dav=iWaPGL0d?CDxnvP>rdv{S9H9l9+J-J(Q1lBFmQ}>}DawB9oit$?$96{_H za0K?CK$$|LQtE69Sfz7@JXk&wLNPDS-icR7OwHj<$AW;3Z1F`Iq?PcbjFPmm^8H+s zv+na#U<0Y2Lao<=Q6=orJ2;mSmXS1>T!U|8J2E3sWhi$0QR_(TK?x9Pqx%N*75C+K za_*C<)bp&YxtP*%`G1lfq~)u3pwmgEAyhYy+{F$~(@}HKk<3{1S}1o-Cu@jSQ!G4s z1tgGh-HmJRzFp`vcvl*$T5pxZlGa|TT_}%Hf%6Lau9tB7tNv}|1Urk8ckj+aLNahL zgG%~;U}-eiZNFWI+Yhb?!44)m3jcDJiNM07sf&MOg2s`GNp=(>zRD2&LH{VvRM#gP z?d#&oidQaQu5#!a;`8%rQ?>P8Ut6uYVt%g2(kER}c=%zL5D)Kgh2wT<#WeiHWU>UT z(Gyf11xcUKIi^rbEk1c)**JW}Y?ln6*ZOH#5RgsJb+M9=|wd^m$dS}J0z9QhBbhsdi0)u_c0T- ziVx5YazlM?AVHcA>V9l|7Xoze!35$B)&KEO{{L$NnV6omtSnQfTbgCo6y{}V?8Zd3 zwN_Q8w=OH^TQ5P#MGLPCaDMu@@CVbyNGK3;vn@6(4{@iGfl)iC#dvA>#ZH(p$jO`a zD4V#Yzaa3cWcc!3QJ3I1$=r26mF7u;`<-h3#_TaMdwE8(CarK~enz3gkZVYf&q=Cl ztTwOIrwnw)e2kd4$@DSea`cW#dQkz2w}7?Ue1RDP|UT zWf$py#Cj7y#oWsqft|oL$HB5V+pbi>y0|#Rca4Ce$^}$;fKPxARSvysH5JtQfQr6O zw9$utv6_TGw}VQ;rduHjawWm8h=NU?l0Ct7J`XG+YhQ?_7LnNK9hBbN-3;T=J5)5c znZR#!jA)}@>+Lu2%m*^is;liaH7!T8=<7u-d3+Xvj{H2K0LfTS>OsH&>^{A1v1p?& z|K%b)^temzeX{2Y^u&>&*<2zm7loX#0|mg`q?2pSW<4KUw0IODY$(K zfdHR}>v%h_1`-b}DtzLO+ydf;&O0Al)3Y(&b*?*`d{L(d-~Ic^X~CpGr$ZOGK5V%8 zZH0H@xsUBvj^m;};uXg{5gW;Fw#T&ttqmi66LV1)*Msh7&kekWBEz~D+(W&?0S~Y( zqRG^T0CwQ1)hJeYqu1D zEuL82xd&E42q^t$m`kq8DgE7W`roCh|9cb2g!H84#$~oNZJo1Jot_Y9El6LduPJHL zR~B@`Mu0@#0P!0Euxv6}#myR@jLZ_AM)VR^Pb2zj>dnlL<)4Q-POw1JcW$Yj1~kCJw2er=j<gmmery(Tz~a%(e`tXJKlYfvOfkWWaTb*uiZYe5ymfh{#ZGH{LvC)~iW*f0 zLE~d!wM@e=O!EwL>s4gIGYxSA8Sg5E)X%53x>Wx`5_A@Yz0gitG}K7$4Sud1!g51< zT@&!TMprgBk~5e0wc)G_(Vvqe-%X{K{h>O%^HIpv-poAG1^(aE$^X^m!!4Sr5riY$ z6Nxxw3~bMBo_{zB$HYg#Nhr2`kO~GAEJ)-jmmvE-lt#8nH4wS|FYF69&+5wb_)J{9 zrYcRFr_VQ57|N3ya&zo5MY+5*F-x5<$L0o?jt>oLf zngay?zuz1PYu3qK?A)|?c@ zHI@NyupP&)b;bH?YLZG)Gn6Z@u>g6sYbSot6El^Ro5Mc=flVpWCBTw{(2gdTp7L;*RR{67wetF*ZV|I%uh*ty0vEucE5 zCRJ*ISDqSQX-iL+{hboNEOW()@)b2o*pGD0 z-C+w(tAN|fHE~6S*J=>14C$rCWwwOB^Kf4$3~5>AvWjI{ORxQYjEkyValR`XbDh^Z zm|-lwDJr*Q6hPw6-%y&g7R-Rv8dq1An40o;3TUi@7q?~A*XPnYyIEp_FFaaJJXrlVz;E z_NTAI58mjCq%r{J;dpMDAp+~xyL$Y~oe2#}CrtZ8 z>s?9wf`ndfGi%J`i(6vQ@0NjX%Jwb;d1yj>E0B?nHBz*Xpt`qF^8b}s4M!EOV}llJ zAVcSWh`m&&D6=cA4J*sbYx7H;7K5r@t1MlSo|ol~y=c6lUj~A6OVJ<$4(h?83^<=h>Dq?vBI7|FHa&T+wP+_;mCyk06Zx&rwu!9dftMkB=q~^W05&? z__fSG2?GBw&?X{NX{gzxdCVx-=4s6Ar>@5XQBz0Z`@g(xEFQYVtR!22HA(+iW544| zH5CnchNePW%1U*EBXLfNuf6J5QzdJy zO;h5$#xkx@rTB`p#G>TnD}3$0zJ!v?>^K}F*J}A>e%K9ug)=$qO}cBX2k7EAoT)~c zDX+N3cY!j_3e)0bHP?Qhmorr*qz$1q^)dfz{8cU`PVpR(JYuB~myb zY${%k{jUS|FgJuXyw-(aDQxIbn>V2O1e^JymD=aW%FgLgx_|dTJLSvlzmw>>l^nBG zsa5NAGTie`b0z8PGNaMhviczG*_30$XKzA;Mnz6?3kR@*m-*8xmwc3P_Cd?>hrEX! z{4UTrpE%r4Q%Zksk)2!a#AfZ(2<-kgdJK6L)|-Qg^yyAmcszUZ5$a9Y&_5V>fI^UC zwcKb<%S}#6Ni5Q4t<+goDC!!l*{O-8x}{|!DCN0e3#&#ovYi=n&t?jhF-l0T;PzU4 zpFW6kd~|v^tD*h2R_3)MWssIg_02^;^Q#y~*dFmT3WA)mw<#z-PW>d?Bju4{#c0$O z91`FI%NpYazFVpBu%r<}!N$j2Iu;HM;Lj6*b&9)kL&%xY1+X6OSyd3d(sDGLUIN?r zF&wTv5Y-e!PQ%wTMwTUx!a-d>{pp%T%h6)`zpYvLJ^?fQ;Gb-geD=4SB%k~3Cdudj zY?I^*f3`_-V~C%^BC}XDu)h*gQoUJJe1e$&$W}??lmOT&8McVqD*2B;sMitGJpQbb zmwsEBm;bCX$Np<&6mpBsLf#v<(7R>x_?3Dr;OY_C$kpTcAJl_m_OJd{KPP@$CHJ3I z>EwT{l2UG0nSae4hTOT4Dv_-fGa!L@V8%zN(7RIdI(zc_a5UGC7$;|YeQxJ(5xzzMGFg) zX^p?vB#C|EF$#A7!U06T2o(s@qBR#$BV+oq_!M8pTZ}XQ$*sYRB*& z1=r0~!r5eMjnb+wv|403ncQM2G;`;Y6i`@&n&`RU2d3vdf5GUn9^gl&=PMqV?gjqM^!O;bGSyz-C#ENY z2NJx%&rHu$9?10qzc4*Y94;=IYzD&<{9(chEh?t(;JaEbj_<=fj;G!4s2X*kkH(nqB)WHM30Tfh^r7PQ;RQlKA3TuY1wug|Jdo=J!ayH9VD|!I&<79HdVz4zhw2`G zw)y)*R1lxp-B4Gh&eqnO<1DqthNgOr)w0|kU+Gw0JrcpulFNG!Q?HVi*2UC#v3K=J zDs@y%w^J=%F43Y(keUT58CVOzux7&uE<_t zuQJ!z*P1J;>+MzZr1ix$>!fD5zP_p$U}r7-XELB5a_7Fo)HrN-A!NdYU(2vp*orHP zq~;pw+O_a`?OGD`Twge;QUZBC9~8IYN6tPGM9zLYmAXJFWccLtk~F^SFXCo{hzNZ0;37Ta zzA#1>#K;VjwsRIaVifLZm|T?4 zI=s&sk1reMs2Oo*#&7`BK3jQ)f7S%t@#YLG6YIYJZjM$(OoU@YW-P(3=N^U=84o-~ znV?|HNWqZBbTHTfHQnT`Dg4Jp{AVgz*T(B8QwZY-d7zjZ=MhtI$GDkLsQ3X-p^$f`O*>7n2v^-3lJl|zi2p!9nc>_{PvcJ={SlG zn$I?8KTS2m!=h(+RW$>5%$W<#GHM*xEKcvkX5y$PCnhk`I^z(iDnR8?)hyg`c;-At zoL@T(Pn3swo;VwKyf`zLk#!o~oLart&LQDlizsND-B0svvwynxfpbB>GvgWQ&;w8K z`i3);uHOQ!a@5GR%1YH9>dGLq$ct@x)zvmzQf5Y#Q=Y3#PI1c9>e8Iv6g4$b=JaG#6dFuTEepe5&%s(Dv^DX9TyY1J(F*4$$<_eqCQCVGGY$>z<$GDP~ zRaQD?<9p@nri^6AN~JKC_>nZbyYDbH4Lb_Dr`=`jEhN-a&rlPEa-9~2)a_k~%tX}d z@Qf%c9NJ>F;uGsTuVh!7e=_fcq1fNlnhkk#m;Y&L^-(DmR_flL5W6MKzV&t1zDi^nU0`0=Fwvg)$j2_*+Jn;DJ9o-_q`+^g4X< z#Sm^+SC4akD+Rk(&Rus5w$-We$;HPOcMcsA`3DR98hmLg7(9=k5qKUe>3C6#orI@o zsO#|1GHD38xg{E{XH9d#JEDRkHg^t*={QkK@!li&+~s4V$-t+xk;-$?p zg3e13v;jPry=U|ILk|~0+HST#X%BpYx{+;PYDG`^aXSj&c-x4Df4E&VLiUH-MI&I# z;D2rxjZpl@cF_o!^8d>Q-w4pr;TFe_aEn|3&N9K$m zI>zuikHm~1dd6^`M^Z4wj}(j`ix`8?8m{D$5#&0?5Wyo&BgkULFqKDc8$qsT z3`!o^HG(W*4Dmej$Osb47_xcf$q~fB7_2<<@(2>g7^->X>y#))!6h}V6ZB?UM~k< zPa%U74ed&urO<9xs}yi5oz{-SPmM|T@L3yucd9 z`796Imm_;okV7_bMBxfCs+u z0(MXV5BNrUR8R;i;DOOzpa@jJ1Jk|0I#2-*sJ%cjsDK9&yg&)4fCqBDKq;tz2kc&; z3{=1awO*hcQ~&_m9PtF@sYnGG920{kvw^TB^g#sMh%5$2nZenhDAAiME0-yYOUsIq zE8+zFkX9F$J75C!Bv{oHTjy8TG{WDuVslZIxm;SkuCksZqt!ritAO^FnJxA*yG?2- ztF)F@|2ivMD=RACFd*)WMya`~s;IKQdLA5DXe)+Y3Ot#WR@c}a^DT`~zTGiGuBC-# zmG#oXs>*V>)=^s{tyx!9SzEO3*K&(1YV1|zcBoAa)Un1~WUq#q5axa46u?Je0$6iAtRGddWPq@4rcIE9x!+TCo}jX4`h0Q zDrPWfEO(393sf_M6M4Yt1!|bVxjfL~1!|eWMLf{q1?rf=G#=>j0`<(`4Ls2A1sa&a zQXUxe0*%bzjXZGD3p6ocn=R;_5$mf!AE%jP4>LpP0Zj^JP_^$Ze|9L z@j#Rp*Z}(A0l61w27T~=!3(s2K6oJ03v2{^jN|p;1zJHLJmB;KZJ-YxXz>D@Kp#BN z;RR^W2M_dkfm=WyJkak2ZUuetz@P^Z2tXe^aB^}nVrN6(`UKC%;wy5@Wd(8d@tMn2 z5I3lUjaa$K1xb}<{V5vlN=+RKfmN%LkEmqXW^{cE=zaqsxFxKEeP&15*s#s_)$58K(sHvyYO&YU+wB$bz;Z`rg}tJt`mW3EWBENr{0NisJBsj< z?`nha+55`G5H)9|$J(hwaIAn*u2t&``2+{A^Qpv{uiv{1|FAd>crxk9-%ho{0Z1ro z7y1HzUxwdGE@BD)k%im-IFuT3`$#BNx`;cE?~ajBs%#N=67`*b5=xDLjbi_K67|!I z5FE#+u*)q9Z6|Zq8)hbxuGgc>IHvHkjbwQBnvoc4MEf7q=*X}R3I9)PcOKnDoxlOS z^GlPSlmfCGUPVRM)Iyr3IS`~tuh7yqy$?W|G(Bla)4QAn%B9i*MSdWp)7nxHrIad% zq8(Tj4^#@Sx+u716>(J*&|P;CWWT>j3cR=a-llK=`1~GXnK#Kyrjz;2e7`1d;^9CQ zhKJ+n5z-CFIybJ0mMtrE1rM_NCb0)`6m9CS8F||y2xWe#&=|Fuon1$P5t0#lz84wFz9fPD#n#u7$Kk(uh3^1Gx>+W+KS$e?it=t{>m$=oP^EGpUQm?QuMK}^p z#Rr93TyI9wB;V!yx}S`L&mcIXlle=Z93ofQHyNW+Tc$HdDUHhX{L1w75?h8rTTve# zi-(ZJPmU{S`}VwRHsci*7OKw2lS;`816*HHLa6oZ+Rb9zHGj`5KjS{^P^=0bmf?_} zk3Vr2toYu-!T>OtqT?jxQrWj2vTyf~m~c)eU3R&ARSYT&rf{Xgz=aNSmp3)lB0}4= zID%tQUZb`*DW-5u*j1VoQ(+oB2Gbz|^k9HUh=OQ{fmkrY42Xkxm3v7jFU>j@)2ebkYZO{(SLI-rh4(NiNunV4p-S9lT0DGVt_CgQrgI;(MUV{B_ z01m<-co|-S!|*D+27MsF5jYBeg4f{_e%WwsL zgrDFa@K5*|{ssSrtMCh4gX{1s+~A&2kR}BO1SH@IQjmccc!Ll4f*<(9FbII*5C|h+ zB#eSPU^M&z#=uw@2jk&RxC`!vd*EIOf(dXR+z$`HM0gM$fL)84w5YFcT6W5t6_J$&do6 zkOt|H0hy2m*^mRXU^dKw$6+qyf*CB32Uf_30w{zcD25W42c=L3^T7t?V228*ges_p z8mNUjsD}lx5Ej8=SOQC-0hYmXSOJZ&5>~-#SOaU}33w8of_2aY&9ELez(!~x-HJ^l zs4wUa)aZDviI6S#TXDb{6krP6OLA^K(Yat4j>;o$b)yfzoeVNfPN)$$yxK~RhZ%n2BTfv zUz#%+@GFPbzo@{ToF1*wq$v|pT}d(SFHTHF)kT-Z7bF{E>(axD455)jT^MiM+DjfC zmQ+_ATdlEMVq>Cn(2pTz#kjX(gRwIKsgZH1QI;@ssi7!pX2}rN%M}eMD^VoO(9EOl z!ELUDRBx3MVcf{vrYHRGbKYLV_sp40#!$=Iz$MOvK$?&^b0t01cN{^fb5rl9uM5Yg z(S{!kjmSy8v{_LiYnC-UO)zX`17!okVPq^1@uyP8sEs`Q!@Ns&HJrW?{oD6p3Ei zf|l103c8}bO$k-e=K4(M$KfIO7Ix4xC!;8Vjxe+#6Ejig)`~3RujY0TjgP{(Ajgs& zJwJ`VdZL2_ySD=9$LjAOk)9bvS@Ev@+}+inJukNU^5uCQL@QI;l=Ch4)`8e%H{Xdx ze4Dj{M0go$Q>(2-)l|Qa2P-TQ8-qVv(VSnM)fR&`n~JPtXM&c$E>st;(W>*2 zSEOhOowJzlx!z93v{NN48E?t%!_3>ySb&q__lQh zZt>o>Q+iH3a3QUzqnp!kLeH@t&g8=@CV$AiDdg6U;d$GrX0=rS@2p-oq zs>lh_Wa=P&rcQ$A;N?bP!o|_tX9!*l&gH)I6b7QsbK&gPB>4>CviuuvxRjbgWJa-# zXoq-Yi{tgdJIM+J{@J*G|NlBX_KNEpFWCLYam}92ufsw_&_~>T>{6Y4Ca(|hC;M+- zq1ECmNf7MYHjrjd+W#>(U07c`0Xd_-x^QzrL7oO}cQka}a%Wo=ng`}|k`;VE@-Xcb zUj>#ACQG3TN-KQuRu8eV8yxjvF;V%66{!kiO>9DPc4@p(otI&&P{rdjH<*CT--{2k z6w`e-Q{-+PFukIyBIlPHO;m3e_hfgM7wPQjk;ptGGR)>(Bi>tU)`p@;rI&K2YDfR( z)d}!b+p+Dzz>jlb6QWRFD5_esOn#0W45f$p21s7^Ou!=?sbC@na z&uXeSo&6RFK)G3Pp>`Eq{O;l`O0&2)OSsaaLveyNPpws1LXlU3 zTEBy+^$S3gUwpg|9sl0(>;J!&i*0oJFCS;nv%ydL()jJRxpdJFHw!Hmm71NcCx{x; zX!*G}&agZ+bO5qGixzVkD*!~c-FZU_?RzV*kuF+oYo-HoMJ|10jZM6~HH^rU=PGYB$9qVSL|tT{Cqss~MzTW9SoXTS!}1K4bfvA5x+2{38-Eh#MJs7TZ>v_S$;rrzA3Uvb zdxLvc7MJEz#YD|`wh!W$h4Xusd+)UP$r87Bx;d}7dZ^obp(LfaoNnmmHPWg?OFsVi z=Fr|}QeH}rZgFU(X@y2@{*aD4Y^zI(Y^66p2-10agSO87{l~Sb0<$K`XjHpH<*BL- zO?H1VRNR~2Z*@#1DPdHP9u#+vT-ZqEbngOQD=EoKbaw^#T;#6S)6<6?SA8oC71hyk z2;{jLy{Zexods5_hCf$c=z7M4?1*3TFj0d-JPR75CWq|H5DP`nLzqg+^nx#E_?83u+TUxqzeN!uZ64V20>Q9{ z4c%|;YO8(w6?OKjNBh68LkNQ8kcn6iF|1V44q9$4KxoDN(LC~N9JM4I|v RhF9P)yb7<8?*2Yv`VZVqxk&&3 diff --git a/tests/langchain/clients/bedrock/test_unit.py b/tests/langchain/clients/bedrock/test_unit.py index c7626c5..57b2c42 100644 --- a/tests/langchain/clients/bedrock/test_unit.py +++ b/tests/langchain/clients/bedrock/test_unit.py @@ -9,15 +9,17 @@ from langchain_core.messages import HumanMessage from langchain_tests.unit_tests import ChatModelUnitTests, EmbeddingsUnitTests from uipath_langchain_client.clients.bedrock.chat_models import ( - _CLAUDE_OPUS_4_UNSUPPORTED_PARAMS, UiPathChatAnthropicBedrock, UiPathChatBedrock, UiPathChatBedrockConverse, - _is_claude_opus_4_or_above, ) from uipath_langchain_client.clients.bedrock.embeddings import UiPathBedrockEmbeddings from uipath.llm_client.settings import UiPathBaseSettings +from uipath.llm_client.utils.model_family import ( + CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, + is_claude_opus_4_or_above, +) BEDROCK_CHAT_CLASSES = [UiPathChatAnthropicBedrock, UiPathChatBedrock, UiPathChatBedrockConverse] BEDROCK_EMBEDDINGS_CLASSES = [UiPathBedrockEmbeddings] @@ -58,10 +60,10 @@ def opus4_client(self, client_settings: UiPathBaseSettings) -> UiPathChatAnthrop ) def test_is_claude_opus_4_or_above(self) -> None: - assert _is_claude_opus_4_or_above("anthropic.claude-opus-4-7") - assert _is_claude_opus_4_or_above("claude-opus-4-5-20250514") - assert not _is_claude_opus_4_or_above("anthropic.claude-3-5-sonnet-20240620-v1:0") - assert not _is_claude_opus_4_or_above("anthropic.claude-haiku-4-5-20251001-v1:0") + assert is_claude_opus_4_or_above("anthropic.claude-opus-4-7") + assert is_claude_opus_4_or_above("claude-opus-4-5-20250514") + assert not is_claude_opus_4_or_above("anthropic.claude-3-5-sonnet-20240620-v1:0") + assert not is_claude_opus_4_or_above("anthropic.claude-haiku-4-5-20251001-v1:0") def test_unsupported_params_stripped_from_payload( self, opus4_client: UiPathChatAnthropicBedrock @@ -76,7 +78,7 @@ def test_unsupported_params_stripped_from_payload( ) opus4_client.invoke([HumanMessage(content="hi")]) call_kwargs = mock_client.messages.create.call_args.kwargs - for param in _CLAUDE_OPUS_4_UNSUPPORTED_PARAMS: + for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: assert param not in call_kwargs, f"{param} must be stripped for claude-opus-4" def test_sampling_params_kept_for_other_models( From d7119c4c65d13702b584a53d940a224d689c0b62 Mon Sep 17 00:00:00 2001 From: Cosmin Maria Date: Thu, 23 Apr 2026 15:12:26 +0300 Subject: [PATCH 4/8] Test: add claude-opus-4-5 and claude-opus-4-6 to bedrock integration matrix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both models match is_claude_opus_4_or_above — sampling params are stripped before the API call. Integration tests (live, 78 passed) confirm the fix works correctly for all three Opus 4 variants. Unit test extended to assert the pattern also matches the new model IDs. Co-Authored-By: Claude Opus 4.7 (1M context) --- tests/cassettes.db | Bin 46080000 -> 46952448 bytes tests/langchain/clients/bedrock/conftest.py | 6 ++++-- tests/langchain/clients/bedrock/test_unit.py | 4 ++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/cassettes.db b/tests/cassettes.db index ec9189532e002adb5cab816ea6eef9f9f115ac39..7d8e4e7411059f92e7ff26b8be94f6b9d3b5e27d 100644 GIT binary patch delta 86797 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%0A|=JFEwaJysoCvz$SvpOLU32JwX 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 Ljone3Q!oF2WGS0& delta 22450 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 B&n5r> diff --git a/tests/langchain/clients/bedrock/conftest.py b/tests/langchain/clients/bedrock/conftest.py index e96f657..4bda9f7 100644 --- a/tests/langchain/clients/bedrock/conftest.py +++ b/tests/langchain/clients/bedrock/conftest.py @@ -55,9 +55,11 @@ COMPLETIONS_MODELS_WITH_CONFIGS = { "anthropic.claude-haiku-4-5-20251001-v1:0": CLAUDE_BEDROCK_CONFIGS, - # claude-opus-4-7 via Bedrock: tested with UiPathChatAnthropicBedrock only (no thinking; - # thinking cassettes not yet recorded for this model). + # claude-opus-4+ models via Bedrock: UiPathChatAnthropicBedrock only, no thinking + # (thinking cassettes not yet recorded; sampling params stripped by the fix). "anthropic.claude-opus-4-7": CLAUDE_ANTHROPIC_BEDROCK_CONFIGS_NO_THINKING, + "anthropic.claude-opus-4-5-20251101-v1:0": CLAUDE_ANTHROPIC_BEDROCK_CONFIGS_NO_THINKING, + "anthropic.claude-opus-4-6-v1": CLAUDE_ANTHROPIC_BEDROCK_CONFIGS_NO_THINKING, } diff --git a/tests/langchain/clients/bedrock/test_unit.py b/tests/langchain/clients/bedrock/test_unit.py index 57b2c42..197ba24 100644 --- a/tests/langchain/clients/bedrock/test_unit.py +++ b/tests/langchain/clients/bedrock/test_unit.py @@ -60,8 +60,12 @@ def opus4_client(self, client_settings: UiPathBaseSettings) -> UiPathChatAnthrop ) def test_is_claude_opus_4_or_above(self) -> None: + # Matched — sampling params stripped assert is_claude_opus_4_or_above("anthropic.claude-opus-4-7") assert is_claude_opus_4_or_above("claude-opus-4-5-20250514") + assert is_claude_opus_4_or_above("anthropic.claude-opus-4-5-20251101-v1:0") + assert is_claude_opus_4_or_above("anthropic.claude-opus-4-6-v1") + # Not matched — sampling params pass through unchanged assert not is_claude_opus_4_or_above("anthropic.claude-3-5-sonnet-20240620-v1:0") assert not is_claude_opus_4_or_above("anthropic.claude-haiku-4-5-20251001-v1:0") From f756473e655ceb755005d62cbbe5f9670a51be5d Mon Sep 17 00:00:00 2001 From: Cosmin Maria Date: Thu, 23 Apr 2026 15:17:58 +0300 Subject: [PATCH 5/8] Fix: narrow sampling-param restriction to claude-opus-4-7 only Live testing confirmed only anthropic.claude-opus-4-7 rejects temperature/top_k/top_p. claude-opus-4-5 and claude-opus-4-6 accept sampling parameters normally. Narrow is_claude_opus_4_or_above regex from claude-opus-4 to claude-opus-4-7 and update docstring, unit test assertions, and conftest comments accordingly. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/uipath/llm_client/utils/model_family.py | 11 +++++++---- tests/langchain/clients/bedrock/conftest.py | 6 ++++-- tests/langchain/clients/bedrock/test_unit.py | 9 +++++---- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/uipath/llm_client/utils/model_family.py b/src/uipath/llm_client/utils/model_family.py index 69598ba..df1f115 100644 --- a/src/uipath/llm_client/utils/model_family.py +++ b/src/uipath/llm_client/utils/model_family.py @@ -29,9 +29,12 @@ def is_anthropic_model_name(model_name: str) -> bool: def is_claude_opus_4_or_above(model_name: str) -> bool: - """Return True for Claude Opus 4+ reasoning models that reject sampling parameters. + """Return True for Claude models confirmed to reject sampling parameters. - These models do not accept ``temperature``, ``top_k``, or ``top_p``; sending - any of them causes a ``400 Bad Request`` from the Anthropic API. + Tested against the Anthropic API: only ``claude-opus-4-7`` rejects + ``temperature``, ``top_k``, and ``top_p`` with ``400 Bad Request``. + ``claude-opus-4-5`` and ``claude-opus-4-6`` accept sampling parameters. + + Extend the pattern here as additional models are confirmed to restrict them. """ - return bool(re.search(r"claude-opus-4", model_name, re.IGNORECASE)) + return bool(re.search(r"claude-opus-4-7", model_name, re.IGNORECASE)) diff --git a/tests/langchain/clients/bedrock/conftest.py b/tests/langchain/clients/bedrock/conftest.py index 4bda9f7..20a0272 100644 --- a/tests/langchain/clients/bedrock/conftest.py +++ b/tests/langchain/clients/bedrock/conftest.py @@ -55,9 +55,11 @@ COMPLETIONS_MODELS_WITH_CONFIGS = { "anthropic.claude-haiku-4-5-20251001-v1:0": CLAUDE_BEDROCK_CONFIGS, - # claude-opus-4+ models via Bedrock: UiPathChatAnthropicBedrock only, no thinking - # (thinking cassettes not yet recorded; sampling params stripped by the fix). + # claude-opus-4-7: sampling params not supported — stripped by the fix. + # UiPathChatAnthropicBedrock only; thinking cassettes not yet recorded. "anthropic.claude-opus-4-7": CLAUDE_ANTHROPIC_BEDROCK_CONFIGS_NO_THINKING, + # claude-opus-4-5 and claude-opus-4-6: sampling params accepted by the API. + # UiPathChatAnthropicBedrock only; thinking cassettes not yet recorded. "anthropic.claude-opus-4-5-20251101-v1:0": CLAUDE_ANTHROPIC_BEDROCK_CONFIGS_NO_THINKING, "anthropic.claude-opus-4-6-v1": CLAUDE_ANTHROPIC_BEDROCK_CONFIGS_NO_THINKING, } diff --git a/tests/langchain/clients/bedrock/test_unit.py b/tests/langchain/clients/bedrock/test_unit.py index 197ba24..44e53a8 100644 --- a/tests/langchain/clients/bedrock/test_unit.py +++ b/tests/langchain/clients/bedrock/test_unit.py @@ -60,12 +60,13 @@ def opus4_client(self, client_settings: UiPathBaseSettings) -> UiPathChatAnthrop ) def test_is_claude_opus_4_or_above(self) -> None: - # Matched — sampling params stripped + # Matched — sampling params stripped (confirmed to reject them via live testing) assert is_claude_opus_4_or_above("anthropic.claude-opus-4-7") - assert is_claude_opus_4_or_above("claude-opus-4-5-20250514") - assert is_claude_opus_4_or_above("anthropic.claude-opus-4-5-20251101-v1:0") - assert is_claude_opus_4_or_above("anthropic.claude-opus-4-6-v1") + assert is_claude_opus_4_or_above("claude-opus-4-7-20250514") # Not matched — sampling params pass through unchanged + # (claude-opus-4-5 and claude-opus-4-6 accept temperature/top_k/top_p) + assert not is_claude_opus_4_or_above("anthropic.claude-opus-4-5-20251101-v1:0") + assert not is_claude_opus_4_or_above("anthropic.claude-opus-4-6-v1") assert not is_claude_opus_4_or_above("anthropic.claude-3-5-sonnet-20240620-v1:0") assert not is_claude_opus_4_or_above("anthropic.claude-haiku-4-5-20251001-v1:0") From 15dc7c9f7cf2f3d41043ce31948933df4fcd313d Mon Sep 17 00:00:00 2001 From: Cosmin Maria Date: Thu, 23 Apr 2026 15:35:09 +0300 Subject: [PATCH 6/8] Feat: use modelDetails.shouldSkipTemperature from discovery to gate sampling params Add _should_skip_sampling_params cached_property to UiPathBaseLLMClient. It reads shouldSkipTemperature from get_model_info() (authoritative) and falls back to the is_claude_opus_4_or_above() name heuristic when the model is not found in discovery. All five Anthropic clients now use self._should_skip_sampling_params instead of calling is_claude_opus_4_or_above directly, so the logic automatically adapts when the backend sets shouldSkipTemperature on new models without requiring a code change. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/uipath_langchain_client/base_client.py | 14 ++++++++++++++ .../clients/anthropic/chat_models.py | 3 +-- .../clients/bedrock/chat_models.py | 7 +++---- .../clients/normalized/chat_models.py | 3 +-- tests/langchain/clients/bedrock/test_unit.py | 4 ++++ 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/base_client.py b/packages/uipath_langchain_client/src/uipath_langchain_client/base_client.py index 91274bd..e3fae6e 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/base_client.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/base_client.py @@ -49,6 +49,7 @@ get_captured_response_headers, set_captured_response_headers, ) +from uipath.llm_client.utils.model_family import is_claude_opus_4_or_above from uipath_langchain_client.settings import ( UiPathAPIConfig, UiPathBaseSettings, @@ -190,6 +191,19 @@ def uipath_async_client(self) -> UiPathHttpxAsyncClient: logger=self.logger, ) + @cached_property + def _should_skip_sampling_params(self) -> bool: + """True if the model's discovery metadata marks temperature/top_k/top_p as unsupported. + + Reads ``modelDetails.shouldSkipTemperature`` from the model discovery API. + Falls back to a name-based heuristic when the model is not found in discovery. + """ + try: + info = self.client_settings.get_model_info(model_name=self.model_name) + return bool(info.get("modelDetails", {}).get("shouldSkipTemperature", False)) + except Exception: + return is_claude_opus_4_or_above(self.model_name) + def uipath_request( self, method: Literal["POST", "GET"] = "POST", diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py index 86e254f..6791e47 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py @@ -15,7 +15,6 @@ ) from uipath_langchain_client.utils import ( CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, - is_claude_opus_4_or_above, ) try: @@ -165,7 +164,7 @@ def _get_request_payload( **kwargs: Any, ) -> dict: payload = super()._get_request_payload(input_, stop=stop, **kwargs) - if is_claude_opus_4_or_above(self.model): + if self._should_skip_sampling_params: for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: payload.pop(param, None) return payload diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py index 1e76af2..4781b66 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py @@ -15,7 +15,6 @@ ) from uipath_langchain_client.utils import ( CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, - is_claude_opus_4_or_above, ) try: @@ -85,7 +84,7 @@ def setup_uipath_client(self) -> Self: @override def _converse_params(self, **kwargs: Any) -> dict: params = super()._converse_params(**kwargs) - if is_claude_opus_4_or_above(self.model_id): + if self._should_skip_sampling_params: inference = params.get("inferenceConfig") if isinstance(inference, dict): inference.pop("temperature", None) @@ -119,7 +118,7 @@ def setup_model_id(cls, values: Any) -> Any: @model_validator(mode="after") def setup_uipath_client(self) -> Self: self.client = WrappedBotoClient(self.uipath_sync_client) - if is_claude_opus_4_or_above(self.model_id): + if self._should_skip_sampling_params: self.temperature = None if self.model_kwargs: self.model_kwargs = { @@ -181,7 +180,7 @@ def _get_request_payload( **kwargs: Any, ) -> dict: payload = super()._get_request_payload(input_, stop=stop, **kwargs) - if is_claude_opus_4_or_above(self.model): + if self._should_skip_sampling_params: for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: payload.pop(param, None) return payload diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py index 7f9f1ba..b0bb6fe 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py @@ -69,7 +69,6 @@ from uipath_langchain_client.utils import ( CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, is_anthropic_model_name, - is_claude_opus_4_or_above, ) _DictOrPydanticClass = Union[dict[str, Any], type[BaseModel], type] @@ -256,7 +255,7 @@ def _default_params(self) -> dict[str, Any]: params.pop("temperature", None) # Claude Opus 4+ reasoning models reject temperature, top_k and top_p entirely. - if is_claude_opus_4_or_above(self.model_name): + if self._should_skip_sampling_params: for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: params.pop(param, None) diff --git a/tests/langchain/clients/bedrock/test_unit.py b/tests/langchain/clients/bedrock/test_unit.py index 44e53a8..de31cad 100644 --- a/tests/langchain/clients/bedrock/test_unit.py +++ b/tests/langchain/clients/bedrock/test_unit.py @@ -73,6 +73,8 @@ def test_is_claude_opus_4_or_above(self) -> None: def test_unsupported_params_stripped_from_payload( self, opus4_client: UiPathChatAnthropicBedrock ) -> None: + # Force _should_skip_sampling_params without a real discovery call. + opus4_client.__dict__["_should_skip_sampling_params"] = True with patch.object(opus4_client, "_client") as mock_client: mock_client.messages.create.return_value = MagicMock( content=[MagicMock(type="text", text="hi")], @@ -94,6 +96,8 @@ def test_sampling_params_kept_for_other_models( settings=client_settings, temperature=0.5, ) + # Discovery returns False for haiku; ensure params are not stripped. + haiku.__dict__["_should_skip_sampling_params"] = False with patch.object(haiku, "_client") as mock_client: mock_client.messages.create.return_value = MagicMock( content=[MagicMock(type="text", text="hi")], From 3f964457dde4feeb8408e3366ab8125911d02423 Mon Sep 17 00:00:00 2001 From: Cosmin Maria Date: Thu, 23 Apr 2026 15:53:31 +0300 Subject: [PATCH 7/8] Refactor: centralize sampling-param stripping in UiPathBaseChatModel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the five per-client overrides with a single mechanism in UiPathBaseLLMClient / UiPathBaseChatModel: - model_details: dict | None — ctor field; if None, resolved lazily from get_model_info(). Lets callers skip the discovery call. - resolved_model_details / _should_skip_sampling_params — cached properties; the latter reads modelDetails.shouldSkipTemperature with a name-based fallback (is_claude_opus_4_or_above). Stripping happens at both sites: 1. model_validator(mode="after") — nulls self.temperature/top_k/top_p AND discards them from __pydantic_fields_set__ so payload builders that filter on model_fields_set (UiPathChat) treat them as unset. Handles UiPathChat(model=..., temperature=0.6). 2. _generate/_agenerate/_stream/_astream — pop the same keys from invocation kwargs. Handles llm.invoke("msg", temperature=0.7) and llm.bind(temperature=0.7). Per-client overrides removed: - UiPathChatAnthropic._get_request_payload - UiPathChatAnthropicBedrock._get_request_payload - UiPathChatBedrock setup_uipath_client sampling-param logic - UiPathChat._default_params sampling-param logic (thinking rule kept) UiPathChatBedrockConverse._converse_params kept but simplified to always filter None temperature/topP from inferenceConfig defensively (so boto3 doesn't serialize self.temperature=None as explicit null to the wire). Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/uipath_langchain_client/CHANGELOG.md | 10 ++- .../uipath_langchain_client/base_client.py | 65 +++++++++++++++++-- .../clients/anthropic/chat_models.py | 18 ----- .../clients/bedrock/chat_models.py | 43 ++++-------- .../clients/normalized/chat_models.py | 10 +-- tests/langchain/clients/bedrock/test_unit.py | 57 ++++++++-------- 6 files changed, 107 insertions(+), 96 deletions(-) diff --git a/packages/uipath_langchain_client/CHANGELOG.md b/packages/uipath_langchain_client/CHANGELOG.md index 1803157..8644590 100644 --- a/packages/uipath_langchain_client/CHANGELOG.md +++ b/packages/uipath_langchain_client/CHANGELOG.md @@ -4,10 +4,14 @@ All notable changes to `uipath_langchain_client` will be documented in this file ## [1.9.9] - 2026-04-23 +### Added +- `UiPathBaseLLMClient.model_details` — optional constructor field carrying the discovery `modelDetails` dict (`shouldSkipTemperature`, `maxOutputTokens`, etc.). If omitted, resolved lazily via `get_model_info()`. Pass explicitly to skip the discovery call at first use. +- `UiPathBaseLLMClient.resolved_model_details` / `_should_skip_sampling_params` cached properties — read `modelDetails.shouldSkipTemperature` with a name-based fallback (`is_claude_opus_4_or_above`) for models not found in discovery. + ### Fixed -- Claude Opus 4+ reasoning models (e.g. `anthropic.claude-opus-4-7`) reject `temperature`, `top_k`, and `top_p` with `400 Bad Request`. All five UiPath Anthropic clients now strip those params automatically: `UiPathChatAnthropic` and `UiPathChatAnthropicBedrock` via `_get_request_payload`; `UiPathChatBedrockConverse` via `_converse_params` (strips `temperature`/`topP` from `inferenceConfig`); `UiPathChatBedrock` (INVOKE) via model validator; `UiPathChat` (normalized) via `_default_params`. Requests for other models are unaffected. -- `UiPathChat._default_params` drops `temperature` when `thinking` is also set. Anthropic's extended thinking API requires `temperature=1` (its default) and rejects any other explicit value. -- Detection logic (`is_claude_opus_4_or_above`) and the unsupported-param constant (`CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS`) are defined in core `uipath.llm_client.utils.model_family` and re-exported from `uipath_langchain_client.utils`. +- Sampling params (`temperature`, `top_k`, `top_p`) are now stripped centrally in `UiPathBaseChatModel` for models whose discovery marks `shouldSkipTemperature: True` (e.g. `anthropic.claude-opus-4-7`). Stripping happens at both sites: (1) a `model_validator` nulls the instance fields and discards them from `__pydantic_fields_set__` at construction time — so `UiPathChat(model="...", temperature=0.6)` no longer forwards the value; and (2) the `_generate` / `_agenerate` / `_stream` / `_astream` wrappers pop the same keys from invocation kwargs — so `llm.invoke("msg", temperature=0.7)` and `.bind(temperature=0.7)` are also handled. Previously each client had its own ad-hoc stripping path. +- `UiPathChatBedrockConverse._converse_params` defensively drops `None` `temperature` / `topP` from `inferenceConfig` so boto3 doesn't serialize them as explicit nulls to the wire. +- `UiPathChat._default_params` still drops `temperature` when `thinking` is set (Anthropic's extended thinking API requires `temperature=1`). ## [1.9.8] - 2026-04-22 diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/base_client.py b/packages/uipath_langchain_client/src/uipath_langchain_client/base_client.py index e3fae6e..1a18649 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/base_client.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/base_client.py @@ -38,7 +38,8 @@ from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.messages import BaseMessage from langchain_core.outputs import ChatGeneration, ChatGenerationChunk, ChatResult -from pydantic import AliasChoices, BaseModel, ConfigDict, Field +from pydantic import AliasChoices, BaseModel, ConfigDict, Field, model_validator +from typing_extensions import Self from uipath.llm_client.httpx_client import ( UiPathHttpxAsyncClient, @@ -49,7 +50,10 @@ get_captured_response_headers, set_captured_response_headers, ) -from uipath.llm_client.utils.model_family import is_claude_opus_4_or_above +from uipath.llm_client.utils.model_family import ( + CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, + is_claude_opus_4_or_above, +) from uipath_langchain_client.settings import ( UiPathAPIConfig, UiPathBaseSettings, @@ -99,6 +103,13 @@ class UiPathBaseLLMClient(BaseModel, ABC): "Use this when you have enrolled your own model deployment and received a connection ID.", ) + model_details: dict[str, Any] | None = Field( + default=None, + description="Optional modelDetails from discovery (e.g. `shouldSkipTemperature`, " + "`maxOutputTokens`). If omitted, resolved lazily via `client_settings.get_model_info()`. " + "Pass explicitly to avoid a discovery call at first use.", + ) + api_config: UiPathAPIConfig = Field( ..., description="Settings for the UiPath API", @@ -191,6 +202,18 @@ def uipath_async_client(self) -> UiPathHttpxAsyncClient: logger=self.logger, ) + @cached_property + def resolved_model_details(self) -> dict[str, Any]: + """Resolved modelDetails: the ``model_details`` field if provided, otherwise + fetched via ``client_settings.get_model_info()``; empty dict on failure.""" + if self.model_details is not None: + return self.model_details + try: + info = self.client_settings.get_model_info(model_name=self.model_name) + return info.get("modelDetails", {}) or {} + except Exception: + return {} + @cached_property def _should_skip_sampling_params(self) -> bool: """True if the model's discovery metadata marks temperature/top_k/top_p as unsupported. @@ -198,11 +221,10 @@ def _should_skip_sampling_params(self) -> bool: Reads ``modelDetails.shouldSkipTemperature`` from the model discovery API. Falls back to a name-based heuristic when the model is not found in discovery. """ - try: - info = self.client_settings.get_model_info(model_name=self.model_name) - return bool(info.get("modelDetails", {}).get("shouldSkipTemperature", False)) - except Exception: - return is_claude_opus_4_or_above(self.model_name) + flag = self.resolved_model_details.get("shouldSkipTemperature") + if flag is not None: + return bool(flag) + return is_claude_opus_4_or_above(self.model_name) def uipath_request( self, @@ -371,6 +393,31 @@ class UiPathBaseChatModel(UiPathBaseLLMClient, BaseChatModel): so that headers are captured transparently. """ + @model_validator(mode="after") + def _strip_unsupported_sampling_params_at_init(self) -> Self: + """If the model rejects sampling params, null those instance fields and + remove them from ``__pydantic_fields_set__`` so downstream payload builders + (including ``_default_params`` filters on ``model_fields_set``) treat them + as unset.""" + if not self._should_skip_sampling_params: + return self + for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: + if param not in type(self).model_fields: + continue + try: + setattr(self, param, None) + except Exception: + continue + self.__pydantic_fields_set__.discard(param) + return self + + def _strip_sampling_from_kwargs(self, kwargs: dict[str, Any]) -> None: + """Pop temperature/top_k/top_p from invocation-time kwargs for unsupported models.""" + if not self._should_skip_sampling_params: + return + for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: + kwargs.pop(param, None) + def _generate( self, messages: list[BaseMessage], @@ -378,6 +425,7 @@ def _generate( run_manager: CallbackManagerForLLMRun | None = None, **kwargs: Any, ) -> ChatResult: + self._strip_sampling_from_kwargs(kwargs) set_captured_response_headers({}) try: result = self._uipath_generate(messages, stop=stop, run_manager=run_manager, **kwargs) @@ -403,6 +451,7 @@ async def _agenerate( run_manager: AsyncCallbackManagerForLLMRun | None = None, **kwargs: Any, ) -> ChatResult: + self._strip_sampling_from_kwargs(kwargs) set_captured_response_headers({}) try: result = await self._uipath_agenerate( @@ -430,6 +479,7 @@ def _stream( run_manager: CallbackManagerForLLMRun | None = None, **kwargs: Any, ) -> Generator[ChatGenerationChunk, None, None]: + self._strip_sampling_from_kwargs(kwargs) set_captured_response_headers({}) try: first = True @@ -460,6 +510,7 @@ async def _astream( run_manager: AsyncCallbackManagerForLLMRun | None = None, **kwargs: Any, ) -> AsyncGenerator[ChatGenerationChunk, None]: + self._strip_sampling_from_kwargs(kwargs) set_captured_response_headers({}) try: first = True diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py index 6791e47..26b87a2 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/anthropic/chat_models.py @@ -1,7 +1,6 @@ from functools import cached_property from typing import Any, Self -from langchain_core.language_models import LanguageModelInput from pydantic import Field, model_validator from typing_extensions import override @@ -13,9 +12,6 @@ UiPathAPIConfig, VendorType, ) -from uipath_langchain_client.utils import ( - CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, -) try: from anthropic import ( @@ -155,20 +151,6 @@ def _async_anthropic_client( case _: raise ValueError("Anthropic models are currently not hosted on any other provider") - @override - def _get_request_payload( - self, - input_: LanguageModelInput, - *, - stop: list[str] | None = None, - **kwargs: Any, - ) -> dict: - payload = super()._get_request_payload(input_, stop=stop, **kwargs) - if self._should_skip_sampling_params: - for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: - payload.pop(param, None) - return payload - @override def _create(self, payload: dict[str, Any]) -> Any: if "betas" in payload: diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py index 4781b66..b68d7da 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/bedrock/chat_models.py @@ -1,7 +1,6 @@ from functools import cached_property from typing import Any, Self -from langchain_core.language_models import LanguageModelInput from pydantic import Field, model_validator from typing_extensions import override @@ -13,9 +12,6 @@ UiPathAPIConfig, VendorType, ) -from uipath_langchain_client.utils import ( - CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, -) try: from anthropic import AnthropicBedrock, AsyncAnthropicBedrock @@ -83,12 +79,19 @@ def setup_uipath_client(self) -> Self: @override def _converse_params(self, **kwargs: Any) -> dict: + """Defensively strip None sampling values from inferenceConfig. + + The parent populates ``inferenceConfig["temperature"]`` / ``["topP"]`` from + ``self.temperature`` / ``self.top_p`` unconditionally; if those are None + (e.g. because ``UiPathBaseChatModel`` nulled them for a model that rejects + sampling params) boto3 would still serialize ``null`` to the wire. + """ params = super()._converse_params(**kwargs) - if self._should_skip_sampling_params: - inference = params.get("inferenceConfig") - if isinstance(inference, dict): - inference.pop("temperature", None) - inference.pop("topP", None) + inference = params.get("inferenceConfig") + if isinstance(inference, dict): + for key in ("temperature", "topP"): + if inference.get(key) is None: + inference.pop(key, None) return params @@ -118,14 +121,6 @@ def setup_model_id(cls, values: Any) -> Any: @model_validator(mode="after") def setup_uipath_client(self) -> Self: self.client = WrappedBotoClient(self.uipath_sync_client) - if self._should_skip_sampling_params: - self.temperature = None - if self.model_kwargs: - self.model_kwargs = { - k: v - for k, v in self.model_kwargs.items() - if k not in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS - } return self @property @@ -170,17 +165,3 @@ def _async_client(self) -> AsyncAnthropicBedrock: max_retries=0, # handled by the UiPathBaseChatModel http_client=self.uipath_async_client, ) - - @override - def _get_request_payload( - self, - input_: LanguageModelInput, - *, - stop: list[str] | None = None, - **kwargs: Any, - ) -> dict: - payload = super()._get_request_payload(input_, stop=stop, **kwargs) - if self._should_skip_sampling_params: - for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: - payload.pop(param, None) - return payload diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py index b0bb6fe..821d723 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/clients/normalized/chat_models.py @@ -66,10 +66,7 @@ from uipath_langchain_client.base_client import UiPathBaseChatModel from uipath_langchain_client.settings import ApiType, RoutingMode, UiPathAPIConfig -from uipath_langchain_client.utils import ( - CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS, - is_anthropic_model_name, -) +from uipath_langchain_client.utils import is_anthropic_model_name _DictOrPydanticClass = Union[dict[str, Any], type[BaseModel], type] _DictOrPydantic = Union[dict[str, Any], BaseModel] @@ -254,11 +251,6 @@ def _default_params(self) -> dict[str, Any]: if "thinking" in params: params.pop("temperature", None) - # Claude Opus 4+ reasoning models reject temperature, top_k and top_p entirely. - if self._should_skip_sampling_params: - for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: - params.pop(param, None) - return {**params, **self.model_kwargs} def _get_usage_metadata(self, json_data: dict[str, Any]) -> UsageMetadata: diff --git a/tests/langchain/clients/bedrock/test_unit.py b/tests/langchain/clients/bedrock/test_unit.py index de31cad..159e279 100644 --- a/tests/langchain/clients/bedrock/test_unit.py +++ b/tests/langchain/clients/bedrock/test_unit.py @@ -46,35 +46,43 @@ def chat_model_params(self) -> dict[str, Any]: def test_serdes(self, *args: Any, **kwargs: Any) -> None: ... -class TestClaudeOpus4SamplingParamFiltering: - """UiPathChatAnthropicBedrock must strip temperature/top_k/top_p for claude-opus-4+ models.""" +class TestSamplingParamStripping: + """UiPathBaseChatModel must strip sampling params for models whose modelDetails + declare ``shouldSkipTemperature: True`` — both at instantiation (ctor kwargs) and + at invocation time (``invoke(..., temperature=...)``).""" @pytest.fixture() def opus4_client(self, client_settings: UiPathBaseSettings) -> UiPathChatAnthropicBedrock: + # model_details bypasses the discovery network call at init. return UiPathChatAnthropicBedrock( model="anthropic.claude-opus-4-7", settings=client_settings, + model_details={"shouldSkipTemperature": True}, temperature=0.7, top_k=40, top_p=0.9, ) def test_is_claude_opus_4_or_above(self) -> None: - # Matched — sampling params stripped (confirmed to reject them via live testing) + # Name-based fallback for models not found in discovery. assert is_claude_opus_4_or_above("anthropic.claude-opus-4-7") assert is_claude_opus_4_or_above("claude-opus-4-7-20250514") - # Not matched — sampling params pass through unchanged - # (claude-opus-4-5 and claude-opus-4-6 accept temperature/top_k/top_p) assert not is_claude_opus_4_or_above("anthropic.claude-opus-4-5-20251101-v1:0") assert not is_claude_opus_4_or_above("anthropic.claude-opus-4-6-v1") assert not is_claude_opus_4_or_above("anthropic.claude-3-5-sonnet-20240620-v1:0") assert not is_claude_opus_4_or_above("anthropic.claude-haiku-4-5-20251001-v1:0") - def test_unsupported_params_stripped_from_payload( - self, opus4_client: UiPathChatAnthropicBedrock - ) -> None: - # Force _should_skip_sampling_params without a real discovery call. - opus4_client.__dict__["_should_skip_sampling_params"] = True + def test_instance_fields_nulled_at_init(self, opus4_client: UiPathChatAnthropicBedrock) -> None: + # Model validator on UiPathBaseChatModel nulled the sampling fields and + # discarded them from __pydantic_fields_set__ so downstream payload builders + # treat them as unset. + for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: + if param in type(opus4_client).model_fields: + assert getattr(opus4_client, param) is None + assert param not in opus4_client.model_fields_set + + def test_invocation_kwargs_stripped(self, opus4_client: UiPathChatAnthropicBedrock) -> None: + # llm.invoke("...", temperature=0.5) — the kwargs must not reach the SDK call. with patch.object(opus4_client, "_client") as mock_client: mock_client.messages.create.return_value = MagicMock( content=[MagicMock(type="text", text="hi")], @@ -83,32 +91,25 @@ def test_unsupported_params_stripped_from_payload( model="anthropic.claude-opus-4-7", id="msg_123", ) - opus4_client.invoke([HumanMessage(content="hi")]) + opus4_client.invoke( + [HumanMessage(content="hi")], + temperature=0.5, + top_k=10, + top_p=0.5, + ) call_kwargs = mock_client.messages.create.call_args.kwargs for param in CLAUDE_OPUS_4_UNSUPPORTED_SAMPLING_PARAMS: - assert param not in call_kwargs, f"{param} must be stripped for claude-opus-4" + assert param not in call_kwargs, f"{param} must be stripped" - def test_sampling_params_kept_for_other_models( - self, client_settings: UiPathBaseSettings - ) -> None: + def test_supported_model_keeps_params(self, client_settings: UiPathBaseSettings) -> None: haiku = UiPathChatAnthropicBedrock( model="anthropic.claude-haiku-4-5-20251001-v1:0", settings=client_settings, + model_details={"shouldSkipTemperature": False}, temperature=0.5, ) - # Discovery returns False for haiku; ensure params are not stripped. - haiku.__dict__["_should_skip_sampling_params"] = False - with patch.object(haiku, "_client") as mock_client: - mock_client.messages.create.return_value = MagicMock( - content=[MagicMock(type="text", text="hi")], - stop_reason="end_turn", - usage=MagicMock(input_tokens=10, output_tokens=5), - model="anthropic.claude-haiku-4-5-20251001-v1:0", - id="msg_123", - ) - haiku.invoke([HumanMessage(content="hi")]) - call_kwargs = mock_client.messages.create.call_args.kwargs - assert call_kwargs.get("temperature") == 0.5, "temperature must be kept for haiku" + assert haiku.temperature == 0.5 + assert "temperature" in haiku.model_fields_set class TestBedrockEmbeddings(EmbeddingsUnitTests): From f3b721f311c3af55321eb3ae0b156953936de613 Mon Sep 17 00:00:00 2001 From: Cosmin Maria Date: Thu, 23 Apr 2026 16:30:26 +0300 Subject: [PATCH 8/8] Feat: factory forwards modelDetails from discovery into client ctor get_chat_model and get_embedding_model now extract modelDetails from the model_info they already fetch and pipe it into the constructed client's model_details kwarg (via setdefault so caller overrides still win). This means UiPathBaseLLMClient.resolved_model_details no longer has to lazy-fetch discovery on first access for factory-built clients, and the shouldSkipTemperature flag is immediately available to the model_validator that strips sampling params at init. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/uipath_langchain_client/CHANGELOG.md | 1 + .../src/uipath_langchain_client/factory.py | 8 +++++ .../features/test_factory_function.py | 34 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/packages/uipath_langchain_client/CHANGELOG.md b/packages/uipath_langchain_client/CHANGELOG.md index 8644590..09fcfe8 100644 --- a/packages/uipath_langchain_client/CHANGELOG.md +++ b/packages/uipath_langchain_client/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to `uipath_langchain_client` will be documented in this file ### Added - `UiPathBaseLLMClient.model_details` — optional constructor field carrying the discovery `modelDetails` dict (`shouldSkipTemperature`, `maxOutputTokens`, etc.). If omitted, resolved lazily via `get_model_info()`. Pass explicitly to skip the discovery call at first use. - `UiPathBaseLLMClient.resolved_model_details` / `_should_skip_sampling_params` cached properties — read `modelDetails.shouldSkipTemperature` with a name-based fallback (`is_claude_opus_4_or_above`) for models not found in discovery. +- `get_chat_model` / `get_embedding_model` now forward `modelDetails` from the discovery lookup into the constructed client's `model_details` kwarg (via `setdefault`, so an explicit user-provided override still wins). Eliminates a redundant discovery fetch inside `resolved_model_details`. ### Fixed - Sampling params (`temperature`, `top_k`, `top_p`) are now stripped centrally in `UiPathBaseChatModel` for models whose discovery marks `shouldSkipTemperature: True` (e.g. `anthropic.claude-opus-4-7`). Stripping happens at both sites: (1) a `model_validator` nulls the instance fields and discards them from `__pydantic_fields_set__` at construction time — so `UiPathChat(model="...", temperature=0.6)` no longer forwards the value; and (2) the `_generate` / `_agenerate` / `_stream` / `_astream` wrappers pop the same keys from invocation kwargs — so `llm.invoke("msg", temperature=0.7)` and `.bind(temperature=0.7)` are also handled. Previously each client had its own ad-hoc stripping path. diff --git a/packages/uipath_langchain_client/src/uipath_langchain_client/factory.py b/packages/uipath_langchain_client/src/uipath_langchain_client/factory.py index 8ef3b99..68a82d1 100644 --- a/packages/uipath_langchain_client/src/uipath_langchain_client/factory.py +++ b/packages/uipath_langchain_client/src/uipath_langchain_client/factory.py @@ -86,6 +86,10 @@ def get_chat_model( ) model_family = model_info.get("modelFamily", None) + model_details = model_info.get("modelDetails") + if model_details is not None: + model_kwargs.setdefault("model_details", model_details) + if custom_class is not None: return custom_class( model=model_name, @@ -266,6 +270,10 @@ def get_embedding_model( ) model_family = model_info.get("modelFamily", None) + model_details = model_info.get("modelDetails") + if model_details is not None: + model_kwargs.setdefault("model_details", model_details) + if custom_class is not None: return custom_class( model=model_name, diff --git a/tests/langchain/features/test_factory_function.py b/tests/langchain/features/test_factory_function.py index 3677157..ac2318d 100644 --- a/tests/langchain/features/test_factory_function.py +++ b/tests/langchain/features/test_factory_function.py @@ -128,3 +128,37 @@ def test_openai_chat_respects_discovered_byom_chat_completions( }, ) assert captured["api_flavor"] == ApiFlavor.CHAT_COMPLETIONS + + def test_factory_forwards_model_details_from_discovery(self, monkeypatch: pytest.MonkeyPatch): + """modelDetails from discovery should be piped into the client ctor as model_details, + so resolved_model_details does not need to re-fetch.""" + captured = self._captured_kwargs( + monkeypatch, + { + "modelName": "gpt-4o", + "vendor": "OpenAi", + "apiFlavor": None, + "modelFamily": "OpenAi", + "modelDetails": {"shouldSkipTemperature": True, "maxOutputTokens": 4096}, + }, + ) + assert captured["model_details"] == { + "shouldSkipTemperature": True, + "maxOutputTokens": 4096, + } + + def test_factory_user_model_details_wins_over_discovery(self, monkeypatch: pytest.MonkeyPatch): + """Explicit model_details from the caller should not be overwritten by discovery.""" + user_details = {"shouldSkipTemperature": False} + captured = self._captured_kwargs( + monkeypatch, + { + "modelName": "gpt-4o", + "vendor": "OpenAi", + "apiFlavor": None, + "modelFamily": "OpenAi", + "modelDetails": {"shouldSkipTemperature": True}, + }, + model_details=user_details, + ) + assert captured["model_details"] is user_details